浏览代码

Finish AudioRecordQueue and Record example

dds
PaulStoffregen 10 年前
父节点
当前提交
aea5f90081
共有 4 个文件被更改,包括 47 次插入6 次删除
  1. +12
    -1
      gui/list.html
  2. +2
    -0
      keywords.txt
  3. +21
    -1
      record_queue.cpp
  4. +12
    -4
      record_queue.h

+ 12
- 1
gui/list.html 查看文件

@@ -667,6 +667,11 @@
<tr class=odd><td align=center>In 0</td><td>Sound To Access</td></tr>
</table>
<h3>Functions</h3>
<p class=func><span class=keyword>begin</span>();</p>
<p class=desc>Begin capturing incoming audio to the queue. After calling
begin, readBuffer() and freeBuffer(), or clear() must be used frequently
to prevent the queue from filling up.
</p>
<p class=func><span class=keyword>available</span>();</p>
<p class=desc>Returns the number of audio packets available to read.
</p>
@@ -681,8 +686,14 @@
each packet must be freed with this function, to return the memory to
the audio library.
</p>
<p class=func><span class=keyword>clear</span>();</p>
<p class=desc>Discard all audio held in the queue.
</p>
<p class=func><span class=keyword>end</span>();</p>
<p class=desc>Stop capturing incoming audio into the queue. Data already
captured remains in the queue and may be read with readBuffer().
</p>
<h3>Notes</h3>
<p>TODO: many caveats....</p>
<p>
Up to 52 packets may be queued by this object, which allows approximately
150 ms of audio to be held in the queue, to allow time for the Arduino

+ 2
- 0
keywords.txt 查看文件

@@ -26,6 +26,8 @@ AudioOutputAnalog KEYWORD2
AudioPlayMemory KEYWORD2
AudioPlaySdRaw KEYWORD2
AudioPlaySdWav KEYWORD2
AudioPlayQueue KEYWORD2
AudioRecordQueue KEYWORD2
AudioSynthToneSweep KEYWORD2
AudioSynthWaveform KEYWORD2
AudioSynthWaveformSine KEYWORD2

+ 21
- 1
record_queue.cpp 查看文件

@@ -34,10 +34,26 @@ int AudioRecordQueue::available(void)

h = head;
t = tail;
if (h > t) return h - t;
if (h >= t) return h - t;
return 53 + h - t;
}

void AudioRecordQueue::clear(void)
{
audio_block_t *block;
uint32_t t;

if (userblock) {
release(userblock);
userblock = NULL;
}
t = tail;
while (t != head) {
if (++t >= 53) t = 0;
release(queue[t]);
}
tail = t;
}

int16_t * AudioRecordQueue::readBuffer(void)
{
@@ -67,6 +83,10 @@ void AudioRecordQueue::update(void)

block = receiveReadOnly();
if (!block) return;
if (!enabled) {
release(block);
return;
}
h = head + 1;
if (h >= 53) h = 0;
if (h == tail) {

+ 12
- 4
record_queue.h 查看文件

@@ -32,17 +32,25 @@
class AudioRecordQueue : public AudioStream
{
public:
AudioRecordQueue(void) : AudioStream(0, NULL),
userblock(NULL), head(0), tail(0) { }
AudioRecordQueue(void) : AudioStream(1, inputQueueArray),
userblock(NULL), head(0), tail(0), enabled(0) { }
void begin(void) {
clear();
enabled = 1;
}
int available(void);
void clear(void);
int16_t * readBuffer(void);
void freeBuffer(void);
void end(void) {
enabled = 0;
}
virtual void update(void);
private:
audio_block_t *inputQueueArray[1];
audio_block_t *queue[53];
audio_block_t * volatile queue[53];
audio_block_t *userblock;
volatile uint8_t head, tail;
volatile uint8_t head, tail, enabled;
};

#endif

正在加载...
取消
保存