First Publish. Works fine.
Dependents: unzen_sample_LPC4088_quickstart
Diff: unzen.h
- Revision:
- 0:5ac19c994288
- Child:
- 1:9710fb328a08
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/unzen.h Sun Apr 10 12:37:10 2016 +0000 @@ -0,0 +1,198 @@ +/** +* \brief header file for the unzen audio frame work +* \arthur SeiichiHorie +* \date 6/Apr/2016 +*/ + +#ifndef _unzen_h_ +#define _unzen_h_ + +#include "mbed.h" +/** + \brief audio framework name space. +*/ +namespace unzen +{ + /** + \brief error status type. + */ + enum error_type { + no_error, + memory_allocation_error + }; + + /** + \brief singleton style audio frame work. Create a object and execute the \ref framework::start() method. + */ + class framework + { + private: + /** + \constructor + \details + initialize the internal variables and set up all interrrupt / I2S related peripheral. + If needed, power up the peripheral, assign the clock and pins. + At the end of this constructor, the audio framework is ready to run, but still paused. + To start the real processing, call the \ref start method. + + Note that this constructor set the block size ( interval count which audio processing + call back is called ) + as 1. If it is needed to use other value, call \ref set_brock_size() method. + */ + framework(void); + public: + /** + \brief getting the singleton object for processing. + \returns a framework type object. + \details + TO call the object method, use this method to retrieve the singleton object. + */ + static framework get() { static framework singleton; return singleton ; } + + /** + \brief set the interval interrupt count for each time call back is called. + \param block_size An integer parameter > 1. If set to n, for each n interrupts, the audio call back is called. + \returns show the error status + \details + This method re-allocate the internal buffer. Then, the memory allocation error could occur. To detect the + memory allocation error, use \ref get_error() method. + */ + error_type set_block_size( unsigned int new_block_size ); + + /** + \brief the real audio signal transfer. Trigger the I2S interrupt and call the call back. + */ + void start(void); + + /** + \brief Set the user call back for audio processing. + \param cb The call back function + \details + Set the call back function. This function is called for each time the rx buffer is filled. The call back has 5 parameters. + \li left_rx Received data from I2S rx port. Left data only. + \li right_rx Received data from I2S rx port. Right data only. + \li left_tx Buffer to fill the transmission data. This buffer mus be filled by call back. Left data only + \li right_tx Buffer to fill the transmission data. This buffer mus be filled by call back. Right data only + \li length length of above buffers. + + 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() + function. This n is also passed to call back as above length parameter. + + Note that the call back is called at interrupt context. Not the thread level context. + That mean, it is better to avoid to call mbed API except the mbed-RTOS API for interrupt handler. + */ + void set_process_callback( void (* cb ) (float[], float[], float[], float[], unsigned int)); + + /** + \brief Debug hook for interrupt handler. + \param cb A call back which is called at the beggining of I2S interrupt. + \details + Parameter cb is call at the beggining of the I2S interrupt. This call back can be + used to mesure the timing of interrupt by toggling the GPIO pin. + + Passing 0 to cb parameter let the framwork ignore the callback. + */ + void set_pre_interrupt_callback( void (* cb ) (void)); + + /** + \brief Debug hook for interrupt handler. + \param cb A call back which is called at the end of I2S interrupt. + \details + Parameter cb is call at the end of the I2S interrupt. This call back can be + used to mesure the timing of interrupt by toggling the GPIO pin. + + Passing 0 to cb parameter let the framwork ignore the callback. + */ + void set_post_interrupt_callback( void (* cb ) (void)); + + /** + \brief Debug hook for processing handler. + \param cb A call back which is called at the beggining of processing. + \details + Parameter cb is call at the beggining of the signal processing. This call back can be + used to mesure the load of CPU by toggling the GPIO pin. + + Passing 0 to cb parameter let the framwork ignore the callback. + */ + void set_pre_process_callback( void (* cb ) (void)); + + /** + \brief Debug hook for processing handler. + \param cb A call back which is called at the end of processing. + \details + Parameter cb is call at the end of the signal processing. This call back can be + used to mesure the load of CPU by toggling the GPIO pin. + + Passing 0 to cb parameter let the framwork ignore the callback. + */ + void set_post_process_callback( void (* cb ) (void)); + + /** + \brief optional priority control for I2S IRQ. + \param pri Priority of IRQ. + \details + This is optional control. Usually, user doesn't need to call this method. + In case the framework has serious irq priority contention with other software, + this API help programmer to change the priority of the Unzen framework. + + Value must be acceptable to CMSIS NVIC_SetPriority(). For LPC4337, it is range of 0..7. The 0 is highest priority. + + + By default, the framework set this priority as +2 higher than the lowest. + + The priority set by this API must be higher than priority set by \ref set_process_irq_priority + */ + void set_i2s_irq_priority( unsigned int pri ); + + /** + \brief optional priority control for Signal Processing IRQ. + \param pri Priority of IRQ. + \details + This is optional control. Usually, user doesn't need to call this method. + In case the framework has serious irq priority contention with other software, + this API help programmer to change the priority of the Unzen framework + + Value must be acceptable to CMSIS NVIC_SetPriority(). For LPC4337, it is range of 0..7. The 0 is highest priority. + + By default, the framework set this priority as +2 higher than the lowest. + + */ + void set_process_irq_priority( unsigned int pri ); + + private: + void (* pre_interrupt_callback )(void); + void (* post_interrupt_callback )(void); + void (* pre_process_callback )(void); + void (* post_process_callback )(void); + + void (* process_callback )( float left_in[], float right_in[], float left_out[], float right_out[], unsigned int length ); + + // Size of the blocks ( interval of interrupt to call process_callback ) + int block_size; + + // Index for indentifying the buffer. 0 or 1. + int buffer_index, process_index; + + // Index of the position data in the buffer. + int tx_sample_index, rx_sample_index; + + // buffer for interrupt handler. + // data format is LRLR... + int *tx_int_buffer[2]; + int *rx_int_buffer[2]; + + // buffers for passing + float * tx_left_buffer, * tx_right_buffer; + float * rx_left_buffer, * rx_right_buffer; + + // real processing method. + void do_i2s_irq(void); + void do_process_irq(void); + + // handler for NIVC + static void i2s_irq_handler(); + static void process_irq_handler(); + }; +} + +#endif