First Publish. Works fine.

Dependents:   unzen_sample_lpcxpresso_4337_callbacks

Revision:
3:707608830793
Parent:
2:6613e62da521
Child:
4:d89a1e2b4b03
--- a/unzen.cpp	Tue May 03 01:10:32 2016 +0000
+++ b/unzen.cpp	Tue May 03 07:44:49 2016 +0000
@@ -176,7 +176,6 @@
         post_process_callback = cb;
     }
 
-
     void framework::do_i2s_irq(void)
     {
             // if needed, call pre-interrupt call back
@@ -205,7 +204,7 @@
             
                 // Implementation of the double buffer algorithm.
                 // if buffer transfer is complete, swap the buffer
-            if (sample_index > block_size * 2)
+            if (sample_index >= block_size * 2)
             {
                     // index for the signal processing
                 process_index = buffer_index;
@@ -227,6 +226,7 @@
             // if needed, call post-interrupt call back
         if ( post_interrupt_callback )
             post_interrupt_callback();
+            
     }
 
     void framework::do_process_irq(void)
@@ -266,8 +266,10 @@
             j = 0;
             for ( int i=0; i<block_size; i++ )
             {
-                tx_int_buffer[process_index][j++] = tx_left_buffer[i] * -(float)INT_MIN ;
-                tx_int_buffer[process_index][j++] = tx_right_buffer[i] * -(float)INT_MIN ;
+//                tx_int_buffer[process_index][j++] = tx_left_buffer[i] * -(float)INT_MIN ;
+//                tx_int_buffer[process_index][j++] = tx_right_buffer[i] * -(float)INT_MIN ;
+                tx_int_buffer[process_index][j++] = i << 26;
+                tx_int_buffer[process_index][j++] = i << 26 ;
             }
     
         }
@@ -365,11 +367,21 @@
         // **** Configuration for UMB-ADAU1361 ****
 
         // Additional clock setting for 96kHz
+        if ( fs == Fs_48 )
+        {
+            data[ADDL] = 0x17; data[DATA] = 0x00; 
+            i2c->write( addr, data, 3 );   // R17:Converter control, CONVSR = 0
+        }
         if ( fs == Fs_96 )
         {
             data[ADDL] = 0x17; data[DATA] = 0x06; 
             i2c->write( addr, data, 3 );   // R17:Converter control, CONVSR = 6
         }
+        if ( fs == Fs_32 )
+        {
+            data[ADDL] = 0x17; data[DATA] = 0x05; 
+            i2c->write( addr, data, 3 );   // R17:Converter control, CONVSR = 5
+        }
 
 
         // set Master ( set clock and WS as output )
@@ -397,10 +409,12 @@
 
             // Right out mixer
             // R out MIX6G4 and enable
-        data[ADDL] = 0x21; data[DATA] = 0x8; i2c->write( addr, data, 3 );    // R27:MIXER 6
+        data[ADDL] = 0x21; data[DATA] = 0x9; i2c->write( addr, data, 3 );    // R27:MIXER 6
 
             // set input gain
-        set_line_input_gain( 0, 0 );
+        set_line_input_gain( 0, 0 );        // unmute
+        set_line_output_gain( 0, 0, true ); // unmute
+        set_hp_output_gain( 0, 0, true );   // unmute
     }
     
 #define SET_INPUT_GAIN( x ) ((x<<1)|1)
@@ -424,38 +438,26 @@
             int level;
             
                 // set left gain
-            level = -15;
-            data[DATA] = SET_INPUT_GAIN( 7 );
-            for ( int i =0; i <= 7; i++ )
-            {
-                if ( level >= left_gain )
-                {
-                    data[DATA] = SET_INPUT_GAIN( i );
-                    break;
-                }
-                level += 3;
-            }
+            level = (left_gain+15)/3 ;   // See table 31 LINNG
+            level = max( level, 0 );
+            level = min( level, 7 );
+            data[DATA] = SET_INPUT_GAIN( level );
+            
             data[ADDL] = 0x0a; i2c->write( addr, data, 3 );    // R4: mixer 1 enable
 
                 // set right gain
-            level = -15;
-            data[DATA] = SET_INPUT_GAIN( 7 );
-            for ( int i =0; i <= 7; i++ )
-            {
-                if ( level >= right_gain )
-                {
-                    data[DATA] = SET_INPUT_GAIN( i );
-                    break;
-                }
-                level += 3;
-            }
+            level = (right_gain+15)/3 ;   // See table 31 LINNG
+            level = max( level, 0 );
+            level = min( level, 7 );
+            data[DATA] = SET_INPUT_GAIN( level );
+            
             data[ADDL] = 0x0c; i2c->write( addr, data, 3 );    // R4: mixer 1 enable
             
         }
     }
 
         
-#define SET_HP_GAIN( x ) ((x<<2)|3)
+#define SET_LO_GAIN( x ) ((x<<2)|2)
 
     void umb_adau1361::set_line_output_gain(float left_gain, float right_gain, bool mute)
     {
@@ -464,8 +466,8 @@
         
         if ( mute )
         {
-            data[ADDL] = 0x25; data[DATA] = 0x01; i2c->write( addr, data, 1 );    // R31: LOUTVOL
-            data[ADDL] = 0x26; data[DATA] = 0x01; i2c->write( addr, data, 1 );    // R32: LOUTVOL 
+            data[ADDL] = 0x25; data[DATA] = 0x01; i2c->write( addr, data, 3 );    // R31: LOUTVOL
+            data[ADDL] = 0x26; data[DATA] = 0x01; i2c->write( addr, data, 3 );    // R32: LOUTVOL 
         }
         else 
         {
@@ -477,12 +479,14 @@
             right = max( right, 0 );
             right = min( right, 63 );
             
-            data[ADDL] = 0x25; data[DATA] = SET_HP_GAIN(left ); i2c->write( addr, data, 1 );    // R31: LOUTVOL
-            data[ADDL] = 0x26; data[DATA] = SET_HP_GAIN(right); i2c->write( addr, data, 1 );    // R32: LOUTVOL 
+            data[ADDL] = 0x25; data[DATA] = SET_LO_GAIN(left ); i2c->write( addr, data, 3 );    // R31: LOUTVOL
+            data[ADDL] = 0x26; data[DATA] = SET_LO_GAIN(right); i2c->write( addr, data, 3 );    // R32: LOUTVOL 
 
         }
     }
 
+#define SET_HP_GAIN( x ) ((x<<2)|3)
+
     void umb_adau1361::set_hp_output_gain(float left_gain, float right_gain, bool mute)
     {
         char data[3];        
@@ -490,8 +494,8 @@
         
         if ( mute )
         {
-            data[ADDL] = 0x23; data[DATA] = 0x01; i2c->write( addr, data, 1 );    // R29: LHPVOL
-            data[ADDL] = 0x24; data[DATA] = 0x01; i2c->write( addr, data, 1 );    // R30: LHPVOL 
+            data[ADDL] = 0x23; data[DATA] = 0x01; i2c->write( addr, data, 3 );    // R29: LHPVOL
+            data[ADDL] = 0x24; data[DATA] = 0x01; i2c->write( addr, data, 3 );    // R30: LHPVOL 
         }
         else 
         {
@@ -503,8 +507,8 @@
             right = max( right, 0 );
             right = min( right, 63 );
             
-            data[ADDL] = 0x23; data[DATA] = SET_HP_GAIN(left ); i2c->write( addr, data, 1 );    // R29: LHPVOL
-            data[ADDL] = 0x24; data[DATA] = SET_HP_GAIN(right); i2c->write( addr, data, 1 );    // R30: LHPVOL 
+            data[ADDL] = 0x23; data[DATA] = SET_HP_GAIN(left );   i2c->write( addr, data, 3 );    // R29: LHPVOL
+            data[ADDL] = 0x24; data[DATA] = SET_HP_GAIN(right); i2c->write( addr, data, 3 );    // R30: LHPVOL & HP MODE
 
         }
     }