First Publish. Works fine.

Dependents:   unzen_sample_lpcxpresso_4337_callbacks

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