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

wolfson_3_wav.cpp

Committer:
roryhand
Date:
2018-10-01
Revision:
0:004cb0595aa8
Child:
1:ec4e2020522c

File content as of revision 0:004cb0595aa8:


//  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();*/