X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fdrv%2Fi2s.h;h=1729b927e35c645f596d0a4b7529fd15368109ad;hb=3d7a421e78696c3e35e16a14723597a0625a776c;hp=c3cfef50c06e6987412c27ed691f506662c6c7d2;hpb=f296d81300aac2c5e0afb30aa3e14659853a4eda;p=bertos.git diff --git a/bertos/drv/i2s.h b/bertos/drv/i2s.h index c3cfef50..1729b927 100644 --- a/bertos/drv/i2s.h +++ b/bertos/drv/i2s.h @@ -1,22 +1,117 @@ +/** + * \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 + * + * \version $Id$ + * \author Luca Ottaviano + * + * $WIZ$ module_name = "i2s" + * $WIZ$ module_configuration = "bertos/cfg/cfg_i2s.h" + * $WIZ$ module_supports = "not atmega103 and not atmega168 and not at91" + */ + #ifndef I2S_H #define I2S_H +#include "cfg/cfg_i2s.h" + #include +#include +#include -#define CONFIG_PLAY_BUF_LEN 64 -#define I2S_FIRST_BUF 1 -#define I2S_SECOND_BUF 2 +/** + * 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); -/* Low level call that returns one of the two buffers or NULL if none is available */ +/** + * 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. Blocking call */ +/** + * 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. */ +/** + * 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 /* I2S_H */