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

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