does not work yet. Sound starts but then stops after a few seconds, whole thing hangs. Published so as I can import through mbed CLI.
Dependencies: mbed sinelookup SDFileSystem_Copy_of_mbed_version I2S
Diff: wolfson_3_wav.cpp
- Revision:
- 1:ec4e2020522c
- Parent:
- 0:004cb0595aa8
- Child:
- 2:05b426733282
--- a/wolfson_3_wav.cpp Mon Oct 01 18:58:35 2018 +0000 +++ b/wolfson_3_wav.cpp Mon Oct 01 19:04:12 2018 +0000 @@ -69,24 +69,9 @@ //printf("value: %d",data_sptr); //i2s.write(buffer, 2);//Send next PWM value to amp } - //i++; - //int hi =i2s.read(buffer[0], bufflen); - //i2s.stop(); - //pc.printf("%d", buffer[0]); + - //pc.printf("Playing Sound!!\n");//0 = ack, 1 = Nack - //if (i>= SINE16LENGTH) {//SINE16LENGTH) { - /*if (i>= wav_format.block_align){ - i = 0; - i2s.stop(); - sampletick.detach(); - - //pc.printf("Sound ended!!"); - myled = 0; - CE - } - -}*/ + void wm8731_setup(int chip_addr, int addr, int cmd){ addr = addr << 1; @@ -288,186 +273,13 @@ printf(" %d subchunk 2 size\n",wav_data.subchunk2_size); - fseek(my_wav,36,SEEK_SET); - fread(&wav_format.sig_bps,2,1,my_wav); - printf("%d bits per sample\n",wav_format.sig_bps);//check how many bits per sample we have - - - i2c.frequency(100000); long j = 0; - /*while(j<1000){ - j=j+1; - wm8731_configTEST(); - }*/ - /*while(j<1000){ - j=j+1; - int addr = WM8731_REG_RESET; - int cmd = _WM8731_RESET; - addr = addr << 1; - addr = addr|((cmd >> 8 ))& 0x01;//mess around with order of operations - cmd = cmd&0xFF; - i2c.start(); - i2c.write( WM8731_ADDRESS ); - i2c.write( addr ); - i2c.write( cmd ); - //wait(1); - i2c.stop(); - //}//am receiving ack = 0 i.e. an anknowledgment!!! when I loop round this section. 14/06/18 - //} - //i2c.stop(); - //while(1){} - //wait(3); - ///try not using the int ack stuff - - //pc.printf("Decimals1: %d", ack1);//0 = ack, 1 = Nack - //int ack12 = - //pc.printf("Decimals12: %d", ack12);//0 = ack, 1 = Nack - //int ack13 = i2c.write( cmd ); - //pc.printf("Decimals13: %d", ack13);//0 = ack, 1 = Nack - //i2c.stop(); - - //2 - - //while(1){ - // } - - - //while(1){ - addr = WM8731_REG_LLINE_IN; - cmd = _WM8731_LEFT_LINEIN; - addr = addr << 1; - addr = addr|((cmd >> 8 )) & 0x01; - cmd = cmd&0xFF; - i2c.start(); - i2c.write( WM8731_ADDRESS );//take Fergus' suggestion and declare these to known values EARLIER in program - i2c.write( addr ); - i2c.write( cmd ); - i2c.stop(); - - - addr = WM8731_REG_RLINE_IN; - cmd = _WM8731_RIGHT_LINEIN; - addr = addr << 1; - addr = addr|((cmd >> 8 )) & 0x01; - cmd = cmd&0xFF; - i2c.start(); - i2c.write( WM8731_ADDRESS );//take Fergus' suggestion and declare these to known values EARLIER in program - i2c.write( addr ); - i2c.write( cmd ); - i2c.stop(); - - - //4 - addr = WM8731_REG_LHPHONE_OUT; - cmd = _WM8731_LEFT_HP; - addr = addr << 1; - addr = addr|((cmd >> 8 )) & 0x01; - cmd = cmd&0xFF; - i2c.start(); - i2c.write( WM8731_ADDRESS ); - i2c.write( addr );//WM8731_REG_LHPHONE_OUT, _WM8731_LEFT_HP - i2c.write(cmd); - i2c.stop(); - - //5 - addr = WM8731_REG_RHPHONE_OUT; - cmd = _WM8731_RIGHT_HP; - addr = addr << 1; - addr = addr|((cmd >> 8 )) & 0x01; - cmd = cmd&0xFF; - i2c.start(); - i2c.write( WM8731_ADDRESS );//WM8731_REG_RHPHONE_OUT, _WM8731_RIGHT_HP - i2c.write( addr ); - i2c.write( cmd ); - i2c.stop(); - - - //6 - addr = WM8731_REG_ANALOG_PATH; - cmd = _WM8731_ANALOGAUDIO; - addr = addr << 1; - addr = addr|((cmd >> 8 )) & 0x01; - cmd = cmd&0xFF; - i2c.start(); - i2c.write( WM8731_ADDRESS );//WM8731_REG_ANALOG_PATH, _WM8731_ANALOGAUDIO - i2c.write( addr ); - i2c.write( cmd ); - i2c.stop(); - - //7 - addr = WM8731_REG_DIGITAL_PATH; - cmd = _WM8731_DIGITALAUDIO; - addr = addr << 1; - addr = addr|((cmd >> 8 )) & 0x01; - cmd = cmd&0xFF; - i2c.start(); - i2c.write( WM8731_ADDRESS );//WM8731_REG_DIGITAL_PATH, _WM8731_DIGITALAUDIO - i2c.write( addr ); - i2c.write( cmd ); - i2c.stop(); - - //8 - addr = WM8731_REG_PDOWN_CTRL; - cmd = _WM8731_POWER; - addr = addr << 1; - addr = addr|((cmd >> 8 )) & 0x01; - cmd = cmd&0xFF; - i2c.start(); - i2c.write( WM8731_ADDRESS );//WM8731_REG_PDOWN_CTRL, _WM8731_POWER) - i2c.write( addr ); - i2c.write( cmd ); - i2c.stop(); - - - //9 - addr = WM8731_REG_DIGITAL_IF; - cmd = _WM8731_DAIF; - addr = addr << 1; - addr = addr|((cmd >> 8 )) & 0x01; - cmd = cmd&0xFF; - i2c.start(); - i2c.write( WM8731_ADDRESS ); - i2c.write( addr );//WM8731_REG_DIGITAL_IF, _WM8731_DAIF - i2c.write( cmd ); - i2c.stop(); - - - //10 - addr = WM8731_REG_SAMPLING_CTRL; - cmd = _WM8731_SAMPLING; - addr = addr << 1; - addr = addr|((cmd >> 8 )) & 0x01; - cmd = cmd&0xFF; - i2c.start(); - i2c.write( WM8731_ADDRESS );//WM8731_REG_SAMPLING_CTRL, _WM8731_SAMPLING - i2c.write( addr ); - i2c.write( cmd ); - i2c.stop(); - - - - - //11 - addr = WM8731_REG_ACTIVE_CTRL; - cmd = _WM8731_ACTIVATE; - addr = addr << 1; - addr = addr|((cmd >> 8 )) & 0x01; - cmd = cmd&0xFF; - i2c.start(); - i2c.write( WM8731_ADDRESS );//WM8731_REG_SAMPLING_CTRL, _WM8731_SAMPLING - i2c.write( addr ); - i2c.write( cmd );//there is also a deactive version!! - /*(from data sheet) - To prevent any comms problems from arising across te DAI the audio interface (AI) is disabled - (tristate with weak 100k pulldown). ONce the audio interface and the sampling scontrol has been programmed its - activated by setting the ACTIVE bit under software control.*/ - //i2c.stop(); - //} printf("set up the codec\n\r"); wm8731_configTEST(); //i2s audio data transfer code?? @@ -482,28 +294,12 @@ led2 = 1; printf("can we get to this point? 2\n\r"); - /*fseek(my_wav, 40, SEEK_SET); - fread(&wav_data.subchunk2_size,4,1,my_wav); - printf("subchunk2 size: %d",wav_data.subchunk2_size);*/ - int num_slices = wav_data.subchunk2_size/wav_format.block_align; - printf("block align is:%d\n\r",wav_format.block_align); - int a = 44; - //sampletick.attach(&isr,1.0/sample_freq); - myled = 1; i2s.start(); //while (1) { fread(&wav_format,sizeof(wav_format),1,my_wav); printf("wav_format %d\n\r",wav_format); - //sampletick.attach(&isr,1/96000); - /*if (wav_data.subchunk2_size > sizeof(wav_format)){ - fseek(my_wav,wav_data.subchunk2_size-sizeof(wav_format),SEEK_CUR); - printf("chunk_size - sizeof(wav_format) %d",wav_data.subchunk2_size-sizeof(wav_format)); - } - else { - - break; - }*/ + fseek(my_wav,20,SEEK_SET); fread(&wav_format,sizeof(wav_format),1,my_wav); @@ -535,12 +331,7 @@ slice_buf=(char *)malloc(wav_format.block_align); for(int slice = 0; slice<num_slices; slice+=1) { - //printf("slice: %d\n\r",slice); fread(&slice_buf,wav_format.block_align,1,my_wav); - //int filePositionIndicator=ftell(my_wav); - //printf("filePositionIndicator: %d\n\r",filePositionIndicator); - //printf("slice: %d\n\r",slice); - //printf("num_slices: %d\n\r",num_slices); data_sptr=(int *)slice_buf; //printf("data_sptr:%d\n\r",data_sptr); //printf("wav_format.num_channels: %d\n\r",wav_format.num_channels); @@ -577,12 +368,7 @@ } - - - //a = a + wav_format.block_align; - //} -//} - //} + sampletick.detach(); i2s.stop(); @@ -590,183 +376,4 @@ printf("File is now closed."); return 0; } - /*while(1){ - sampletick.attach(&isr,1.0/sample_freq); - led3 = !led3; - wait(1.0); - - //COMMENTS BELOW ARE OUT OF DATE - //The code above is IDENTICAL!!! to code run in TickerHello World. - //However, the 2nd led doesn't even light up and start "flipping" until led 1 has flipped.... - //Looks as if it cannot attach. - //sampletick.attach_us(&isr, 20.833);//try using attach_us instead. - //Not sure why the osther guy just didn't use this in the first place - //sampletick.attach(&isr,1/sample_freq); - //if myled is assigned AFTER the tick is attached, it never switches on if sound does not come on. - } - //sampletick.attach(&isr, 2.0); - } - */ - - - - - - - - - - - - - - - - - - - - - - - - - //old LEGACY code!!! - /*int addr = WM8731_REG_RESET; - int cmd = _WM8731_RESET; - addr = addr << 1; - addr = addr|((cmd >> 8 ))& 0x01;//mess around with order of operations - cmd = cmd&0xFF; - i2c.start(); - i2c.write( WM8731_ADDRESS ); - i2c.write( addr ); - i2c.write( cmd ); - i2c.stop(); - - addr = WM8731_REG_LLINE_IN; - cmd = _WM8731_LEFT_LINEIN; - addr = addr << 1; - addr = addr|((cmd >> 8 )) & 0x01; - cmd = cmd&0xFF; - i2c.start(); - i2c.write( WM8731_ADDRESS );//take Fergus' suggestion and declare these to known values EARLIER in program - i2c.write( addr ); - i2c.write( cmd ); - i2c.stop(); - - - addr = WM8731_REG_RLINE_IN; - cmd = _WM8731_RIGHT_LINEIN; - addr = addr << 1; - addr = addr|((cmd >> 8 )) & 0x01; - cmd = cmd&0xFF; - i2c.start(); - i2c.write( WM8731_ADDRESS );//take Fergus' suggestion and declare these to known values EARLIER in program - i2c.write( addr ); - i2c.write( cmd ); - i2c.stop(); - - - //4 - addr = WM8731_REG_LHPHONE_OUT; - cmd = _WM8731_LEFT_HP; - addr = addr << 1; - addr = addr|((cmd >> 8 )) & 0x01; - cmd = cmd&0xFF; - i2c.start(); - i2c.write( WM8731_ADDRESS ); - i2c.write( addr );//WM8731_REG_LHPHONE_OUT, _WM8731_LEFT_HP - i2c.write(cmd); - i2c.stop(); - - //5 - addr = WM8731_REG_RHPHONE_OUT; - cmd = _WM8731_RIGHT_HP; - addr = addr << 1; - addr = addr|((cmd >> 8 )) & 0x01; - cmd = cmd&0xFF; - i2c.start(); - i2c.write( WM8731_ADDRESS );//WM8731_REG_RHPHONE_OUT, _WM8731_RIGHT_HP - i2c.write( addr ); - i2c.write( cmd ); - i2c.stop(); - - - //6 - addr = WM8731_REG_ANALOG_PATH; - cmd = _WM8731_ANALOGAUDIO; - addr = addr << 1; - addr = addr|((cmd >> 8 )) & 0x01; - cmd = cmd&0xFF; - i2c.start(); - i2c.write( WM8731_ADDRESS );//WM8731_REG_ANALOG_PATH, _WM8731_ANALOGAUDIO - i2c.write( addr ); - i2c.write( cmd ); - i2c.stop(); - - //7 - addr = WM8731_REG_DIGITAL_PATH; - cmd = _WM8731_DIGITALAUDIO; - addr = addr << 1; - addr = addr|((cmd >> 8 )) & 0x01; - cmd = cmd&0xFF; - i2c.start(); - i2c.write( WM8731_ADDRESS );//WM8731_REG_DIGITAL_PATH, _WM8731_DIGITALAUDIO - i2c.write( addr ); - i2c.write( cmd ); - i2c.stop(); - - //8 - addr = WM8731_REG_PDOWN_CTRL; - cmd = _WM8731_POWER; - addr = addr << 1; - addr = addr|((cmd >> 8 )) & 0x01; - cmd = cmd&0xFF; - i2c.start(); - i2c.write( WM8731_ADDRESS );//WM8731_REG_PDOWN_CTRL, _WM8731_POWER) - i2c.write( addr ); - i2c.write( cmd ); - i2c.stop(); - - - //9 - addr = WM8731_REG_DIGITAL_IF; - cmd = _WM8731_DAIF; - addr = addr << 1; - addr = addr|((cmd >> 8 )) & 0x01; - cmd = cmd&0xFF; - i2c.start(); - i2c.write( WM8731_ADDRESS ); - i2c.write( addr );//WM8731_REG_DIGITAL_IF, _WM8731_DAIF - i2c.write( cmd ); - i2c.stop(); - - - //10 - addr = WM8731_REG_SAMPLING_CTRL; - cmd = _WM8731_SAMPLING; - addr = addr << 1; - addr = addr|((cmd >> 8 )) & 0x01; - cmd = cmd&0xFF; - i2c.start(); - i2c.write( WM8731_ADDRESS );//WM8731_REG_SAMPLING_CTRL, _WM8731_SAMPLING - i2c.write( addr ); - i2c.write( cmd ); - i2c.stop(); - - - - - //11 - addr = WM8731_REG_ACTIVE_CTRL; - cmd = _WM8731_ACTIVATE; - addr = addr << 1; - addr = addr|((cmd >> 8 )) & 0x01; - cmd = cmd&0xFF; - i2c.start(); - i2c.write( WM8731_ADDRESS );//WM8731_REG_SAMPLING_CTRL, _WM8731_SAMPLING - i2c.write( addr ); - i2c.write( cmd );//there is also a deactive version!! - i2c.stop();*/ - \ No newline at end of file