First Publish. Works fine.
Dependents: unzen_sample_nucleo_f746 unzen_delay_sample_nucleo_f746 skeleton_unzen_nucleo_f746 ifmag_noise_canceller ... more
Nucleo F746ZG用のオーディオ・フレームワークです。フレームワーク地震の詳細は『雲仙』オーディオ・フレームワークを参照してください。
参考リンク
- skeleton_unzen_nucleo_f746 Nucleo F746ZGおよびUI基板を使う場合のスケルトンプログラム。F746を使う方はここから読み始めると良いでしょう。
Diff: unzen.cpp
- 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 } }