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を使う方はここから読み始めると良いでしょう。
unzen.h@3:707608830793, 2016-05-03 (annotated)
- Committer:
- shorie
- Date:
- Tue May 03 07:44:49 2016 +0000
- Revision:
- 3:707608830793
- Parent:
- 2:6613e62da521
- Child:
- 8:63e098b779e9
just before working
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
shorie | 0:5ac19c994288 | 1 | /** |
shorie | 0:5ac19c994288 | 2 | * \brief header file for the unzen audio frame work |
shorie | 0:5ac19c994288 | 3 | * \arthur SeiichiHorie |
shorie | 0:5ac19c994288 | 4 | * \date 6/Apr/2016 |
shorie | 0:5ac19c994288 | 5 | */ |
shorie | 0:5ac19c994288 | 6 | |
shorie | 0:5ac19c994288 | 7 | #ifndef _unzen_h_ |
shorie | 0:5ac19c994288 | 8 | #define _unzen_h_ |
shorie | 0:5ac19c994288 | 9 | |
shorie | 0:5ac19c994288 | 10 | #include "mbed.h" |
shorie | 0:5ac19c994288 | 11 | /** |
shorie | 0:5ac19c994288 | 12 | \brief audio framework name space. |
shorie | 0:5ac19c994288 | 13 | */ |
shorie | 0:5ac19c994288 | 14 | namespace unzen |
shorie | 0:5ac19c994288 | 15 | { |
shorie | 0:5ac19c994288 | 16 | /** |
shorie | 0:5ac19c994288 | 17 | \brief error status type. |
shorie | 0:5ac19c994288 | 18 | */ |
shorie | 0:5ac19c994288 | 19 | enum error_type { |
shorie | 0:5ac19c994288 | 20 | no_error, |
shorie | 0:5ac19c994288 | 21 | memory_allocation_error |
shorie | 0:5ac19c994288 | 22 | }; |
shorie | 0:5ac19c994288 | 23 | |
shorie | 0:5ac19c994288 | 24 | /** |
shorie | 0:5ac19c994288 | 25 | \brief singleton style audio frame work. Create a object and execute the \ref framework::start() method. |
shorie | 0:5ac19c994288 | 26 | */ |
shorie | 0:5ac19c994288 | 27 | class framework |
shorie | 0:5ac19c994288 | 28 | { |
shorie | 0:5ac19c994288 | 29 | private: |
shorie | 0:5ac19c994288 | 30 | /** |
shorie | 0:5ac19c994288 | 31 | \constructor |
shorie | 0:5ac19c994288 | 32 | \details |
shorie | 0:5ac19c994288 | 33 | initialize the internal variables and set up all interrrupt / I2S related peripheral. |
shorie | 0:5ac19c994288 | 34 | If needed, power up the peripheral, assign the clock and pins. |
shorie | 0:5ac19c994288 | 35 | At the end of this constructor, the audio framework is ready to run, but still paused. |
shorie | 0:5ac19c994288 | 36 | To start the real processing, call the \ref start method. |
shorie | 0:5ac19c994288 | 37 | |
shorie | 0:5ac19c994288 | 38 | Note that this constructor set the block size ( interval count which audio processing |
shorie | 0:5ac19c994288 | 39 | call back is called ) |
shorie | 0:5ac19c994288 | 40 | as 1. If it is needed to use other value, call \ref set_brock_size() method. |
shorie | 0:5ac19c994288 | 41 | */ |
shorie | 0:5ac19c994288 | 42 | framework(void); |
shorie | 0:5ac19c994288 | 43 | public: |
shorie | 0:5ac19c994288 | 44 | /** |
shorie | 0:5ac19c994288 | 45 | \brief getting the singleton object for processing. |
shorie | 0:5ac19c994288 | 46 | \returns a framework type object. |
shorie | 0:5ac19c994288 | 47 | \details |
shorie | 0:5ac19c994288 | 48 | TO call the object method, use this method to retrieve the singleton object. |
shorie | 0:5ac19c994288 | 49 | */ |
shorie | 1:9710fb328a08 | 50 | static framework * get() { static framework singleton; return &singleton ; } |
shorie | 0:5ac19c994288 | 51 | |
shorie | 0:5ac19c994288 | 52 | /** |
shorie | 0:5ac19c994288 | 53 | \brief set the interval interrupt count for each time call back is called. |
shorie | 0:5ac19c994288 | 54 | \param block_size An integer parameter > 1. If set to n, for each n interrupts, the audio call back is called. |
shorie | 0:5ac19c994288 | 55 | \returns show the error status |
shorie | 0:5ac19c994288 | 56 | \details |
shorie | 0:5ac19c994288 | 57 | This method re-allocate the internal buffer. Then, the memory allocation error could occur. To detect the |
shorie | 0:5ac19c994288 | 58 | memory allocation error, use \ref get_error() method. |
shorie | 0:5ac19c994288 | 59 | */ |
shorie | 0:5ac19c994288 | 60 | error_type set_block_size( unsigned int new_block_size ); |
shorie | 0:5ac19c994288 | 61 | |
shorie | 0:5ac19c994288 | 62 | /** |
shorie | 0:5ac19c994288 | 63 | \brief the real audio signal transfer. Trigger the I2S interrupt and call the call back. |
shorie | 0:5ac19c994288 | 64 | */ |
shorie | 0:5ac19c994288 | 65 | void start(void); |
shorie | 0:5ac19c994288 | 66 | |
shorie | 0:5ac19c994288 | 67 | /** |
shorie | 0:5ac19c994288 | 68 | \brief Set the user call back for audio processing. |
shorie | 0:5ac19c994288 | 69 | \param cb The call back function |
shorie | 0:5ac19c994288 | 70 | \details |
shorie | 0:5ac19c994288 | 71 | Set the call back function. This function is called for each time the rx buffer is filled. The call back has 5 parameters. |
shorie | 0:5ac19c994288 | 72 | \li left_rx Received data from I2S rx port. Left data only. |
shorie | 0:5ac19c994288 | 73 | \li right_rx Received data from I2S rx port. Right data only. |
shorie | 0:5ac19c994288 | 74 | \li left_tx Buffer to fill the transmission data. This buffer mus be filled by call back. Left data only |
shorie | 0:5ac19c994288 | 75 | \li right_tx Buffer to fill the transmission data. This buffer mus be filled by call back. Right data only |
shorie | 0:5ac19c994288 | 76 | \li length length of above buffers. |
shorie | 0:5ac19c994288 | 77 | |
shorie | 0:5ac19c994288 | 78 | The call back is called for each time interrupt comes n times. Where n is the value which is specified by \ref set_block_size() |
shorie | 2:6613e62da521 | 79 | function. This n is also passed to call back as above length parameter. By default, n is 1. |
shorie | 0:5ac19c994288 | 80 | |
shorie | 0:5ac19c994288 | 81 | Note that the call back is called at interrupt context. Not the thread level context. |
shorie | 2:6613e62da521 | 82 | That mean, it is better to avoid to call mbed API except the mbed-RTOS API for interrupt handler. |
shorie | 2:6613e62da521 | 83 | |
shorie | 0:5ac19c994288 | 84 | */ |
shorie | 0:5ac19c994288 | 85 | void set_process_callback( void (* cb ) (float[], float[], float[], float[], unsigned int)); |
shorie | 0:5ac19c994288 | 86 | |
shorie | 0:5ac19c994288 | 87 | /** |
shorie | 0:5ac19c994288 | 88 | \brief Debug hook for interrupt handler. |
shorie | 0:5ac19c994288 | 89 | \param cb A call back which is called at the beggining of I2S interrupt. |
shorie | 0:5ac19c994288 | 90 | \details |
shorie | 0:5ac19c994288 | 91 | Parameter cb is call at the beggining of the I2S interrupt. This call back can be |
shorie | 0:5ac19c994288 | 92 | used to mesure the timing of interrupt by toggling the GPIO pin. |
shorie | 0:5ac19c994288 | 93 | |
shorie | 0:5ac19c994288 | 94 | Passing 0 to cb parameter let the framwork ignore the callback. |
shorie | 0:5ac19c994288 | 95 | */ |
shorie | 0:5ac19c994288 | 96 | void set_pre_interrupt_callback( void (* cb ) (void)); |
shorie | 0:5ac19c994288 | 97 | |
shorie | 0:5ac19c994288 | 98 | /** |
shorie | 0:5ac19c994288 | 99 | \brief Debug hook for interrupt handler. |
shorie | 0:5ac19c994288 | 100 | \param cb A call back which is called at the end of I2S interrupt. |
shorie | 0:5ac19c994288 | 101 | \details |
shorie | 0:5ac19c994288 | 102 | Parameter cb is call at the end of the I2S interrupt. This call back can be |
shorie | 0:5ac19c994288 | 103 | used to mesure the timing of interrupt by toggling the GPIO pin. |
shorie | 0:5ac19c994288 | 104 | |
shorie | 0:5ac19c994288 | 105 | Passing 0 to cb parameter let the framwork ignore the callback. |
shorie | 0:5ac19c994288 | 106 | */ |
shorie | 0:5ac19c994288 | 107 | void set_post_interrupt_callback( void (* cb ) (void)); |
shorie | 0:5ac19c994288 | 108 | |
shorie | 0:5ac19c994288 | 109 | /** |
shorie | 0:5ac19c994288 | 110 | \brief Debug hook for processing handler. |
shorie | 0:5ac19c994288 | 111 | \param cb A call back which is called at the beggining of processing. |
shorie | 0:5ac19c994288 | 112 | \details |
shorie | 0:5ac19c994288 | 113 | Parameter cb is call at the beggining of the signal processing. This call back can be |
shorie | 0:5ac19c994288 | 114 | used to mesure the load of CPU by toggling the GPIO pin. |
shorie | 0:5ac19c994288 | 115 | |
shorie | 0:5ac19c994288 | 116 | Passing 0 to cb parameter let the framwork ignore the callback. |
shorie | 0:5ac19c994288 | 117 | */ |
shorie | 0:5ac19c994288 | 118 | void set_pre_process_callback( void (* cb ) (void)); |
shorie | 0:5ac19c994288 | 119 | |
shorie | 0:5ac19c994288 | 120 | /** |
shorie | 0:5ac19c994288 | 121 | \brief Debug hook for processing handler. |
shorie | 0:5ac19c994288 | 122 | \param cb A call back which is called at the end of processing. |
shorie | 0:5ac19c994288 | 123 | \details |
shorie | 0:5ac19c994288 | 124 | Parameter cb is call at the end of the signal processing. This call back can be |
shorie | 0:5ac19c994288 | 125 | used to mesure the load of CPU by toggling the GPIO pin. |
shorie | 0:5ac19c994288 | 126 | |
shorie | 0:5ac19c994288 | 127 | Passing 0 to cb parameter let the framwork ignore the callback. |
shorie | 0:5ac19c994288 | 128 | */ |
shorie | 0:5ac19c994288 | 129 | void set_post_process_callback( void (* cb ) (void)); |
shorie | 0:5ac19c994288 | 130 | |
shorie | 0:5ac19c994288 | 131 | /** |
shorie | 0:5ac19c994288 | 132 | \brief optional priority control for I2S IRQ. |
shorie | 0:5ac19c994288 | 133 | \param pri Priority of IRQ. |
shorie | 0:5ac19c994288 | 134 | \details |
shorie | 0:5ac19c994288 | 135 | This is optional control. Usually, user doesn't need to call this method. |
shorie | 0:5ac19c994288 | 136 | In case the framework has serious irq priority contention with other software, |
shorie | 0:5ac19c994288 | 137 | this API help programmer to change the priority of the Unzen framework. |
shorie | 0:5ac19c994288 | 138 | |
shorie | 0:5ac19c994288 | 139 | Value must be acceptable to CMSIS NVIC_SetPriority(). For LPC4337, it is range of 0..7. The 0 is highest priority. |
shorie | 0:5ac19c994288 | 140 | |
shorie | 0:5ac19c994288 | 141 | |
shorie | 0:5ac19c994288 | 142 | By default, the framework set this priority as +2 higher than the lowest. |
shorie | 0:5ac19c994288 | 143 | |
shorie | 0:5ac19c994288 | 144 | The priority set by this API must be higher than priority set by \ref set_process_irq_priority |
shorie | 0:5ac19c994288 | 145 | */ |
shorie | 0:5ac19c994288 | 146 | void set_i2s_irq_priority( unsigned int pri ); |
shorie | 0:5ac19c994288 | 147 | |
shorie | 0:5ac19c994288 | 148 | /** |
shorie | 0:5ac19c994288 | 149 | \brief optional priority control for Signal Processing IRQ. |
shorie | 0:5ac19c994288 | 150 | \param pri Priority of IRQ. |
shorie | 0:5ac19c994288 | 151 | \details |
shorie | 0:5ac19c994288 | 152 | This is optional control. Usually, user doesn't need to call this method. |
shorie | 0:5ac19c994288 | 153 | In case the framework has serious irq priority contention with other software, |
shorie | 0:5ac19c994288 | 154 | this API help programmer to change the priority of the Unzen framework |
shorie | 0:5ac19c994288 | 155 | |
shorie | 0:5ac19c994288 | 156 | Value must be acceptable to CMSIS NVIC_SetPriority(). For LPC4337, it is range of 0..7. The 0 is highest priority. |
shorie | 0:5ac19c994288 | 157 | |
shorie | 0:5ac19c994288 | 158 | By default, the framework set this priority as +2 higher than the lowest. |
shorie | 0:5ac19c994288 | 159 | |
shorie | 0:5ac19c994288 | 160 | */ |
shorie | 0:5ac19c994288 | 161 | void set_process_irq_priority( unsigned int pri ); |
shorie | 0:5ac19c994288 | 162 | |
shorie | 0:5ac19c994288 | 163 | private: |
shorie | 0:5ac19c994288 | 164 | void (* pre_interrupt_callback )(void); |
shorie | 0:5ac19c994288 | 165 | void (* post_interrupt_callback )(void); |
shorie | 0:5ac19c994288 | 166 | void (* pre_process_callback )(void); |
shorie | 0:5ac19c994288 | 167 | void (* post_process_callback )(void); |
shorie | 0:5ac19c994288 | 168 | |
shorie | 0:5ac19c994288 | 169 | void (* process_callback )( float left_in[], float right_in[], float left_out[], float right_out[], unsigned int length ); |
shorie | 0:5ac19c994288 | 170 | |
shorie | 2:6613e62da521 | 171 | // Size of the blocks ( interval of interrupt to call process_callback. 1 means every interrupt. 2 means every 2 interrupt ) |
shorie | 0:5ac19c994288 | 172 | int block_size; |
shorie | 0:5ac19c994288 | 173 | |
shorie | 2:6613e62da521 | 174 | // Index for indentifying the buffer for interrupt. 0 or 1. |
shorie | 2:6613e62da521 | 175 | int buffer_index; |
shorie | 0:5ac19c994288 | 176 | |
shorie | 2:6613e62da521 | 177 | // Index for indentifying the buffer for processing. 0 or 1. |
shorie | 2:6613e62da521 | 178 | int process_index; |
shorie | 2:6613e62da521 | 179 | |
shorie | 2:6613e62da521 | 180 | // next transfer position in buffer |
shorie | 2:6613e62da521 | 181 | int sample_index; |
shorie | 0:5ac19c994288 | 182 | |
shorie | 0:5ac19c994288 | 183 | // buffer for interrupt handler. |
shorie | 0:5ac19c994288 | 184 | // data format is LRLR... |
shorie | 0:5ac19c994288 | 185 | int *tx_int_buffer[2]; |
shorie | 0:5ac19c994288 | 186 | int *rx_int_buffer[2]; |
shorie | 0:5ac19c994288 | 187 | |
shorie | 0:5ac19c994288 | 188 | // buffers for passing |
shorie | 0:5ac19c994288 | 189 | float * tx_left_buffer, * tx_right_buffer; |
shorie | 0:5ac19c994288 | 190 | float * rx_left_buffer, * rx_right_buffer; |
shorie | 0:5ac19c994288 | 191 | |
shorie | 0:5ac19c994288 | 192 | // real processing method. |
shorie | 0:5ac19c994288 | 193 | void do_i2s_irq(void); |
shorie | 0:5ac19c994288 | 194 | void do_process_irq(void); |
shorie | 0:5ac19c994288 | 195 | |
shorie | 0:5ac19c994288 | 196 | // handler for NIVC |
shorie | 0:5ac19c994288 | 197 | static void i2s_irq_handler(); |
shorie | 0:5ac19c994288 | 198 | static void process_irq_handler(); |
shorie | 0:5ac19c994288 | 199 | }; |
shorie | 1:9710fb328a08 | 200 | |
shorie | 2:6613e62da521 | 201 | // Sampling Frequency of the umb_adau1361 |
shorie | 2:6613e62da521 | 202 | enum Fs_Type |
shorie | 2:6613e62da521 | 203 | { |
shorie | 3:707608830793 | 204 | Fs_32, Fs_441, Fs_48, Fs_96 |
shorie | 2:6613e62da521 | 205 | } ; |
shorie | 2:6613e62da521 | 206 | |
shorie | 2:6613e62da521 | 207 | // mbed I2C class needs the address as "left justified" value. Then, the ADAU1361's address 0x38 is |
shorie | 2:6613e62da521 | 208 | // shifted right by 1 bit |
shorie | 2:6613e62da521 | 209 | enum Addr_Type |
shorie | 2:6613e62da521 | 210 | { |
shorie | 2:6613e62da521 | 211 | addr_h70 = 0x70, |
shorie | 2:6613e62da521 | 212 | addr_h71, |
shorie | 2:6613e62da521 | 213 | addr_h72, |
shorie | 2:6613e62da521 | 214 | addr_h73 |
shorie | 2:6613e62da521 | 215 | } ; |
shorie | 2:6613e62da521 | 216 | |
shorie | 3:707608830793 | 217 | /** |
shorie | 3:707608830793 | 218 | * \brief UMB-ADAU1361-A controller. |
shorie | 3:707608830793 | 219 | * \details |
shorie | 3:707608830793 | 220 | * This class send a set of command to control the UMB-ADAU1361-A board. |
shorie | 3:707608830793 | 221 | * See http://dsps.shop-pro.jp/?pid=82798273 for detatails. This board |
shorie | 3:707608830793 | 222 | * uses 12MHz clock. This controler set the codec as master mode. |
shorie | 3:707608830793 | 223 | */ |
shorie | 1:9710fb328a08 | 224 | class umb_adau1361 |
shorie | 1:9710fb328a08 | 225 | { |
shorie | 1:9710fb328a08 | 226 | public: |
shorie | 2:6613e62da521 | 227 | /** |
shorie | 2:6613e62da521 | 228 | * \brief constructor. |
shorie | 2:6613e62da521 | 229 | * \param controler Pass the I2C controler object. |
shorie | 2:6613e62da521 | 230 | * \param Fs Sampling frequency. |
shorie | 2:6613e62da521 | 231 | * \param Addr I2C device address. |
shorie | 2:6613e62da521 | 232 | * \details |
shorie | 2:6613e62da521 | 233 | * initialize the internal variables. |
shorie | 2:6613e62da521 | 234 | */ |
shorie | 2:6613e62da521 | 235 | umb_adau1361( I2C * controler, Fs_Type Fs= unzen::Fs_48, Addr_Type Addr = unzen::addr_h70 ); |
shorie | 2:6613e62da521 | 236 | |
shorie | 2:6613e62da521 | 237 | /** |
shorie | 2:6613e62da521 | 238 | * \brief Actual initializer. |
shorie | 2:6613e62da521 | 239 | * \details |
shorie | 2:6613e62da521 | 240 | * Initialize the ADUC1603 as reset state, and then, configure for the UMB-ADAU1361. |
shorie | 2:6613e62da521 | 241 | * http://dsps.shop-pro.jp/?pid=82798273 |
shorie | 2:6613e62da521 | 242 | * and configure for given parameter. |
shorie | 2:6613e62da521 | 243 | * |
shorie | 2:6613e62da521 | 244 | * Finally, set the input gain to 0dB. |
shorie | 2:6613e62da521 | 245 | */ |
shorie | 1:9710fb328a08 | 246 | void start(void); |
shorie | 2:6613e62da521 | 247 | |
shorie | 2:6613e62da521 | 248 | /** |
shorie | 2:6613e62da521 | 249 | * \brief Set the input gain and enable the relevant mixer. |
shorie | 2:6613e62da521 | 250 | * \param left_gain |
shorie | 2:6613e62da521 | 251 | * \param right_gain |
shorie | 2:6613e62da521 | 252 | * \param mute |
shorie | 2:6613e62da521 | 253 | */ |
shorie | 2:6613e62da521 | 254 | void set_line_input_gain(float left_gain, float right_gain, bool mute=false); |
shorie | 3:707608830793 | 255 | /** |
shorie | 3:707608830793 | 256 | * \brief Set the line output gain and enable the relevant mixer. |
shorie | 3:707608830793 | 257 | * \param left_gain |
shorie | 3:707608830793 | 258 | * \param right_gain |
shorie | 3:707608830793 | 259 | * \param mute |
shorie | 3:707608830793 | 260 | */ |
shorie | 2:6613e62da521 | 261 | void set_line_output_gain(float left_gain, float right_gain, bool mute=false); |
shorie | 3:707608830793 | 262 | /** |
shorie | 3:707608830793 | 263 | * \brief Set the headphone output gain and enable the relevant mixer. |
shorie | 3:707608830793 | 264 | * \param left_gain |
shorie | 3:707608830793 | 265 | * \param right_gain |
shorie | 3:707608830793 | 266 | * \param mute |
shorie | 3:707608830793 | 267 | */ |
shorie | 2:6613e62da521 | 268 | void set_hp_output_gain(float left_gain, float right_gain, bool mute=false); |
shorie | 1:9710fb328a08 | 269 | private: |
shorie | 1:9710fb328a08 | 270 | I2C *i2c; |
shorie | 2:6613e62da521 | 271 | Addr_Type addr; |
shorie | 2:6613e62da521 | 272 | Fs_Type fs; |
shorie | 1:9710fb328a08 | 273 | }; |
shorie | 1:9710fb328a08 | 274 | |
shorie | 0:5ac19c994288 | 275 | } |
shorie | 0:5ac19c994288 | 276 | |
shorie | 0:5ac19c994288 | 277 | #endif |