/** * \file * * * \brief I2S driver functions. * * This driver uses a double buffering technique to keep i2s bus busy. First fill in the two buffers * using i2s_getBuffer(), then start audio playing with i2s_start(). Then call i2s_getFreeBuffer() * until you have finished your samples. The reproduction will automatically stop if you don't * call i2s_getFreeBuffer() frequently enough. * * Example: * \code * // fill in the buffers before start * buf = i2s_getBuffer(I2S_FIRST_BUF); * // ... * buf = i2s_getBuffer(I2S_SECOND_BUF); * // ... * // here the driver will play only the first two buffers... * i2s_start(); * // ...call getFreeBuffer() to continue playing. * while (!(buf = i2s_getFreeBuffer())) * ; * // now fill the buffer again * \endcode * * \author Luca Ottaviano * * $WIZ$ module_name = "i2s" * $WIZ$ module_configuration = "bertos/cfg/cfg_i2s.h" * $WIZ$ module_supports = "at91" */ #ifndef DRV_I2S_AT91_H #define DRV_I2S_AT91_H #include #include #include /** * First buffer. */ #define I2S_FIRST_BUF 0 /** * Second buffer. */ #define I2S_SECOND_BUF 1 /** * Initializes the module and sets current buffer to I2S_FIRST_BUF. */ void i2s_init(void); /** * Returns one of the two buffers or NULL if none is available. * * You can't call this function if you have already started the player. * \param buf_num The number of the buffer, ie I2S_FIRST_BUF or I2S_SECOND_BUF. * \return A pointer to the buffer if the buffer is available (not full), 0 on errors */ uint8_t *i2s_getBuffer(unsigned buf_num); /** * Returns a buffer that will be played after the current one. * * You should fill it faster than your reproduction time. You can't call this function * if the player is not running * \return The next buffer to be played, 0 if both are busy. */ uint8_t *i2s_getFreeBuffer(void); /** * Starts playing from I2S_FIRST_BUFFER. * * You must have filled both buffers before calling this function. Does nothing if already playing. * \return false on errors, true otherwise. */ bool i2s_start(void); INLINE bool i2s_isPlaying(void) { return !(SSC_SR & BV(SSC_TXEMPTY)); } #endif /* DRV_I2S_AT91_H */