You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.3 KiB
86 lines
2.3 KiB
/*
|
|
* AudioRecordQueue_F32
|
|
*
|
|
* Created: Chip Audette (OpenAudio), Feb 2017
|
|
* Extended from on Teensy Audio Library
|
|
*
|
|
* License: MIT License. Use at your own risk.
|
|
*/
|
|
|
|
#include "play_queue_f32.h"
|
|
#include "utility/dspinst.h"
|
|
|
|
bool AudioPlayQueue_F32::available(void)
|
|
{
|
|
if (userblock) return true;
|
|
userblock = allocate_f32();
|
|
if (userblock) return true;
|
|
return false;
|
|
}
|
|
|
|
/* getBuffer() returns a pointer to the data area of an AudioBlock_32
|
|
* that can be loaded in the .INO. There is only one of these at a
|
|
* time, and they hold 128 float32_t. allocate_f32 will hold up
|
|
* a return from getBuffer() if Audio memory is not available. This will
|
|
* be freed up by update().
|
|
*/
|
|
float32_t * AudioPlayQueue_F32::getBuffer(void)
|
|
{
|
|
if (userblock) return userblock->data;
|
|
while (1) {
|
|
userblock = allocate_f32();
|
|
if (userblock) return userblock->data;
|
|
yield();
|
|
}
|
|
}
|
|
|
|
/* playBuffer() can be called anytime after data is
|
|
* loaded to the data block pointed to by getBuffer).
|
|
* This function then enters the pointer to the queue,
|
|
* waiting to be sent in turn. If the queue is full,
|
|
* this function waits until a spot in the queue is opened
|
|
* up by update() (called by interrupts).
|
|
*/
|
|
void AudioPlayQueue_F32::playBuffer(void)
|
|
{
|
|
uint32_t h;
|
|
|
|
if (!userblock) return;
|
|
h = head + 1;
|
|
if (h >= 32) h = 0;
|
|
while (tail == h) ; // wait until space in the queue
|
|
queue[h] = userblock;
|
|
head = h;
|
|
userblock = NULL;
|
|
}
|
|
|
|
void AudioPlayQueue_F32::update(void)
|
|
{
|
|
audio_block_f32_t *block;
|
|
uint32_t t;
|
|
|
|
t = tail;
|
|
if (t != head) { // a data block is available to transmit out
|
|
if (++t >= 32) t = 0; // tail is advanced by one, circularly
|
|
block = queue[t]; // pointer to next block
|
|
tail = t;
|
|
transmit(block);
|
|
release(block);
|
|
}
|
|
}
|
|
|
|
//assume user already has an audio_block that was NOT allocated by this
|
|
//playBuffer. Here, you hand it your buffer. This object takes ownership
|
|
//of it and puts it into the queue
|
|
void AudioPlayQueue_F32::playAudioBlock(audio_block_f32_t *audio_block) {
|
|
uint32_t h;
|
|
|
|
if (!audio_block) return;
|
|
h = head + 1;
|
|
if (h >= 32) h = 0;
|
|
while (tail == h) ; // wait until space in the queue
|
|
queue[h] = audio_block;
|
|
audio_block->ref_count++; //take ownership of this block
|
|
head = h;
|
|
//userblock = NULL;
|
|
}
|
|
|