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.
75 lines
1.5 KiB
75 lines
1.5 KiB
8 years ago
|
/*
|
||
|
* 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;
|
||
|
}
|
||
|
|
||
|
float32_t * AudioPlayQueue_F32::getBuffer(void)
|
||
|
{
|
||
|
if (userblock) return userblock->data;
|
||
|
while (1) {
|
||
|
userblock = allocate_f32();
|
||
|
if (userblock) return userblock->data;
|
||
|
yield();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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) {
|
||
|
if (++t >= 32) t = 0;
|
||
|
block = queue[t];
|
||
|
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;
|
||
|
|
||
|
}
|