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:
- 0:004cb0595aa8
- Child:
- 1:ec4e2020522c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wolfson_3_wav.cpp Mon Oct 01 18:58:35 2018 +0000
@@ -0,0 +1,772 @@
+
+// 24/03/2018 update - I appear to be able to address the device and write something, as I am getting an ACK returned from the i2c write() function.
+//however if i use the write function with 4 arguments (as opposed to just 1 argument) then it doesnt work
+//only works with the 1 argument version!!!
+
+
+//THIS VERSION WORKED, CHANGED SOME THINGS, THEN CHANGED THEM BACK. NOW IT NO LONGER WORKS!!!!
+#include "mbed.h"
+#include "sinelookup.h"
+#include "I2S.h"
+#define sample_freq 48000
+DigitalOut myled(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+Ticker sampletick;
+Timer t;
+#include "SDFileSystem.h"
+#include "WOLFSON_config.h"
+Serial pc(USBTX, USBRX); // tx, rx //FOR DEBUGGING PROGRAM USING GNU SCREEN
+DigitalOut cs(p8);
+I2S i2s(I2S_TRANSMIT,p5,p6,p7);
+I2C i2c(p9, p10);
+
+SDFileSystem sd(p11, p12, p13, p8, "sd"); // the new pinout that i am using
+
+typedef struct uFMT_STRUCT{
+ short comp_code;
+ short num_channels;
+ unsigned sample_rate;
+ unsigned avg_Bps;
+ short block_align;
+ short sig_bps;
+} FMT_STRUCT;
+
+typedef struct uDATA_STRUCT {
+ unsigned subchunk2_ID;
+ unsigned subchunk2_size;
+ char * data_buf;
+}DATA_STRUCT;
+short hello;
+int i = 0;
+int h = 0;
+int bufflen = 1;
+int buffer[1];
+int AudioFormat, NumChannels, SampleRate, BitsPerSample ;
+char *slice_buf;
+int *data_sptr;
+int newvar;
+//long long slice_value;
+int slice_value;
+FILE *my_wav;
+FMT_STRUCT wav_format;
+DATA_STRUCT wav_data;
+
+Ticker flipper;
+//test
+void flip() {
+ led2 = !led2;
+}
+
+
+void isr()
+{
+
+ //buffer[0] = (int*)data_sptr;
+ //buffer[0] = newvar;
+ //buffer[0] = sine16lookup[i];//>>1;//sine16lookup[i];//scale down volume a bit on amp//how would this scale down the volume a bit??
+ //buffer[0] = *fp;
+ //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;
+ addr = addr|((cmd >> 8 ))& 0x01;//mess around with order of operations
+ cmd = cmd&0xFF;
+ i2c.start();
+ i2c.write( chip_addr );
+ i2c.write( addr );
+ i2c.write( cmd );
+ i2c.stop();
+ }
+
+
+void wm8731_config(void){
+ wm8731_setup( WM8731_ADDRESS, WM8731_REG_RESET, _WM8731_RESET );//1
+ wm8731_setup( WM8731_ADDRESS, WM8731_REG_LLINE_IN, _WM8731_LEFT_LINEIN );//2
+ wm8731_setup( WM8731_ADDRESS, WM8731_REG_RLINE_IN, _WM8731_RIGHT_LINEIN );//3
+ wm8731_setup( WM8731_ADDRESS, WM8731_REG_LHPHONE_OUT, _WM8731_LEFT_HP );//4
+ wm8731_setup( WM8731_ADDRESS, WM8731_REG_RHPHONE_OUT, _WM8731_RIGHT_HP );//5
+ wm8731_setup( WM8731_ADDRESS, WM8731_REG_ANALOG_PATH, _WM8731_ANALOGAUDIO );//6
+ wm8731_setup( WM8731_ADDRESS, WM8731_REG_DIGITAL_PATH, _WM8731_DIGITALAUDIO );//7
+ wm8731_setup( WM8731_ADDRESS, WM8731_REG_PDOWN_CTRL, _WM8731_POWER );//8
+ wm8731_setup( WM8731_ADDRESS, WM8731_REG_DIGITAL_IF, _WM8731_DAIF );//9
+ wm8731_setup( WM8731_ADDRESS, WM8731_REG_SAMPLING_CTRL, _WM8731_SAMPLING );//10
+ }
+
+void wm8731_configTEST(void){
+ 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();
+
+
+
+ }
+
+int main() {
+ FMT_STRUCT wav_format;
+ char data[2];
+ pc.printf("Beginning of program\n");
+ data[0] = 0x0F;
+ data[1] = 0x00;
+ FILE *my_wav;
+ //my_wav = fopen("/sd/mydir/gp40.wav", "rb");//i think that it is "w" for write, "r" for read.
+ my_wav = fopen("/sd/mydir/gp40_48K.wav", "rb");//i think that it is "w" for write, "r" for read.
+ fseek(my_wav, 20, SEEK_SET); // set pointer to byte 20
+ fread(&AudioFormat, 2, 1, my_wav); // check file is PCM
+ if (AudioFormat==0x01) {
+ printf("Wav file is PCM data\n\r");
+ }
+ else {
+ printf("Wav file is not PCM data\n\r");
+ }
+
+ fseek (my_wav,20,SEEK_SET);
+ fread(&wav_format,sizeof(wav_format),1,my_wav);
+ printf("%d block align\n",wav_format.block_align);
+ printf(" %d channels\n",wav_format.num_channels);
+
+
+ fseek(my_wav, 36, SEEK_SET);
+ fread(&wav_data.subchunk2_ID,4,1,my_wav);
+ fseek(my_wav, 40, SEEK_SET);
+ fread(&wav_data.subchunk2_size,4,1,my_wav);
+ printf("DATA chunck\n");
+ printf(" %d subchunk 2 ID\n",wav_data.subchunk2_ID);
+ 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??
+ i2s.stereomono(I2S_STEREO);
+ i2s.masterslave(I2S_MASTER);//MASTER definitely works!
+ i2s.frequency(sample_freq);
+ int yes = i2s.setup_ok();
+ pc.printf("Setup went ok?: %d\n", yes);//0 = ack, 1 = Nack*/
+ printf("can we get to this point? 1\n\r");
+ led3 = 1;
+ //myled = 1;
+ 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);
+ fseek(my_wav,36,SEEK_SET);
+ fread(&wav_data,sizeof(wav_data),1,my_wav);
+ num_slices = wav_data.subchunk2_size/wav_format.block_align;
+ printf("wav_data.subchunk2_size: %d\n\r",wav_data.subchunk2_size);
+ printf("wav_format.block_align: %d\n\r",wav_format.block_align);
+ printf("num_slices: %d\n\r",num_slices);
+ printf("num_slices*wav_format.block_align %d\n\r",num_slices*wav_format.block_align);
+ printf("wav_format.num_channels*wav_format.sig_bps/8: %d\n\r",wav_format.num_channels*wav_format.sig_bps/8);
+ printf("chunk_size - sizeof(wav_format) %d\n\r",wav_data.subchunk2_size-sizeof(wav_format));
+ printf("sizeof(wav_format): %d\n\r",sizeof(wav_format));
+ //sampletick.attach(&isr,1/96000);
+ //while(!feof(my_wav)){
+ //while(1){
+ //if (wav_data.subchunk2_size > sizeof(wav_format)){
+ //fseek(my_wav,wav_data.subchunk2_size-sizeof(wav_format),SEEK_CUR);
+ /*if(wav_data.subchunk2_size > (num_slices*wav_format.block_align)){
+ fseek(my_wav,wav_data.subchunk2_size - (num_slices*wav_format.block_align),SEEK_CUR);
+ printf("chunk_size - sizeof(wav_format) %d\n\r",wav_data.subchunk2_size-sizeof(wav_format));
+ printf("sizeof(wav_format): %d\n\r",sizeof(wav_format));
+ }
+ else {
+
+ break;
+ }*/
+
+ 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);
+ //}
+ slice_value = 0;
+
+ //for (int channel=0;channel<wav_format.num_channels;channel++)
+ // {
+ int channel = 0;
+ //printf("channel: %d\n\r",channel);
+ //printf("wav_format.num_channels: %d\n\r",wav_format.num_channels);
+ int var = 1;//data_sptr[channel];
+ printf("var: %d\n\r", var);
+ //slice_value+=data_sptr[channel];
+ //printf("slice_value %d\n\r",slice_value);
+ //printf("data_sptr[channel] %d\n\r",data_sptr[channel] );
+ //slice_value = 21;//
+ //malloc(sizeof(data_sptr[channel]));
+ //printf("SIZEOF DATASPTR %d:\n\r",sizeof(data_sptr[channel]));
+ //newvar = data_sptr[channel];
+ //printf("newvar %d\n\r",newvar);
+ channel = channel + 1;
+ newvar = data_sptr[channel];
+ //printf("newvar %d\n\r",newvar);
+ //printf("channel: %d\n\r",channel);
+ //slice_value+=data_sptr[channel];
+
+ //printf("did it get to this point\n\r");
+
+
+ //printf("channel: %d data %d\n\r",channel,data_sptr[channel]);
+ //printf("slice_value: %d\n\r",slice_value);
+ //}
+
+ }
+
+
+
+ //a = a + wav_format.block_align;
+ //}
+//}
+ //}
+ sampletick.detach();
+ i2s.stop();
+
+ fclose(my_wav);
+ 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