Streams USB audio with sound effects applied. Sound effect selected by joystick and intensity altered by tilting the mbed. Output to the mbed-application-board phono jack.
Dependencies: C12832_lcd MMA7660 USBDevice mbed
/* Uses the mbed LPC1768 and mbed-application-board to create a USB audio device * that streams audio from a host computer to headphones or powered speakers. * A couple different sound effects can be applied to the stream in real-time, * and tilting the mbed alters intensity of the effect. * * ECHO * The joystick selects ) | * one of three effect ) STRAIGHT - o - STRAIGHT * modes. ) | * REVERB * * * * \\ || * Tilting the mbed ) ====== \\ || * determines intensity ) \\ || * of the effect. ) * 0% 50% 100% * * The LCD display shows the current effect mode, intesity and buffer level. */
Diff: buffer.cpp
- Revision:
- 0:bbf6cf0eab95
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/buffer.cpp Thu Mar 27 21:27:04 2014 +0000 @@ -0,0 +1,89 @@ +/******************************************************************************* + * Implements FIFO buffer for glitch-free audio playback. + * Bryan Wade + * 27 MAR 2014 + ******************************************************************************/ +#include "buffer.h" +#include "string.h" + +struct buffer_t { // Implementation of opaque type. + int16_t *base; + int16_t *head; + int16_t *tail; + size_t len; +}; + +/* + * Create a buffer object given a ptr and size of available RAM. + * @return Ptr to the new buffer. + */ +buffer_t *Buffer_Create(void *ram, size_t size) +{ + buffer_t *buffer = (buffer_t *)malloc(sizeof(buffer_t)); + if (buffer) { + buffer->base = (int16_t *)ram; + buffer->len = size / sizeof(int16_t); + memset(ram, 0, size); + buffer->head = buffer->tail = buffer->base; + } + return buffer; +} + +/* + * Read a single sample from the buffer. + * @return True if successful (no underflow). + */ +bool Buffer_Read(buffer_t *buffer, int16_t *pDataOut) +{ + if (buffer->head == buffer->tail) + return false; + + *pDataOut = *buffer->tail; + + if (++buffer->tail >= buffer->base + buffer->len) { + buffer->tail = buffer->base; + } + + return true; +} + +/* + * Write a single sample to the buffer. + */ +void Buffer_Write(buffer_t *buffer, int16_t dataIn) +{ + if (Buffer_GetLevel(buffer) >= buffer->len - 1) + return; + + *buffer->head = dataIn; + + if (++buffer->head >= buffer->base + buffer->len) + buffer->head = buffer->base; +} + +/* + * Write a block of data to the buffer. + */ +void Buffer_WriteBlock(buffer_t *buffer, const int16_t *pDataIn, uint32_t length) +{ + int i; + for (i = 0; i < length; i++) { + Buffer_Write(buffer, pDataIn[i]); + } +} + +/* + * Get buffer level + */ +int32_t Buffer_GetLevel(buffer_t *buffer) +{ + __disable_irq(); /* Begin critical section */ + + int32_t level = (buffer->head >= buffer->tail) ? + buffer->head - buffer->tail : + buffer->len + buffer->head - buffer->tail; + + __enable_irq(); /* End critical section */ + + return level; +} \ No newline at end of file