cannam@0
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
cannam@0
|
2
|
cannam@0
|
3 #include "BufferingAudioCallbackRecordTarget.h"
|
cannam@0
|
4
|
cannam@0
|
5 #define RING_BUFFER_SIZE 4194303 // 2^22-1 frames, or about 87s at 48KHz
|
cannam@0
|
6
|
cannam@0
|
7 BufferingAudioCallbackRecordTarget::BufferingAudioCallbackRecordTarget() :
|
cannam@0
|
8 m_sourceBlockSize(0),
|
cannam@0
|
9 m_sourceSampleRate(0),
|
cannam@0
|
10 m_sourceRecordLatency(0)
|
cannam@0
|
11 {
|
cannam@0
|
12 for (size_t c = 0; c < getChannelCount(); ++c) {
|
cannam@2
|
13 m_buffers.push_back(new RingBuffer<float, MAX_DISTINCT_STEP_SIZES>
|
cannam@2
|
14 (RING_BUFFER_SIZE));
|
cannam@0
|
15 }
|
cannam@0
|
16 }
|
cannam@0
|
17
|
cannam@0
|
18 BufferingAudioCallbackRecordTarget::~BufferingAudioCallbackRecordTarget()
|
cannam@0
|
19 {
|
cannam@0
|
20 for (size_t c = 0; c < getChannelCount(); ++c) {
|
cannam@0
|
21 delete m_buffers[c];
|
cannam@0
|
22 }
|
cannam@0
|
23 }
|
cannam@0
|
24
|
cannam@0
|
25 void
|
cannam@0
|
26 BufferingAudioCallbackRecordTarget::putSamples(size_t nframes, float **samples)
|
cannam@0
|
27 {
|
cannam@0
|
28 for (size_t c = 0; c < getChannelCount(); ++c) {
|
cannam@0
|
29 if (samples[c]) {
|
cannam@0
|
30 m_buffers[c]->write(samples[c], nframes);
|
cannam@0
|
31 } else {
|
cannam@0
|
32 m_buffers[c]->zero(nframes);
|
cannam@0
|
33 }
|
cannam@0
|
34 }
|
cannam@0
|
35 }
|
cannam@0
|
36
|
cannam@0
|
37 size_t
|
cannam@2
|
38 BufferingAudioCallbackRecordTarget::samplesReady(int reader) const
|
cannam@0
|
39 {
|
cannam@0
|
40 size_t ready = 0;
|
cannam@0
|
41 for (size_t c = 0; c < getChannelCount(); ++c) {
|
cannam@2
|
42 size_t readyHere = m_buffers[c]->getReadSpace(reader);
|
cannam@0
|
43 if (c == 0 || readyHere < ready) ready = readyHere;
|
cannam@0
|
44 }
|
cannam@0
|
45 return ready;
|
cannam@0
|
46 }
|
cannam@0
|
47
|
cannam@0
|
48 size_t
|
cannam@0
|
49 BufferingAudioCallbackRecordTarget::getSamples(size_t channel, size_t nframes,
|
cannam@2
|
50 float *samples, int reader)
|
cannam@0
|
51 {
|
cannam@2
|
52 return m_buffers[channel]->read(samples, nframes, reader);
|
cannam@0
|
53 }
|
cannam@0
|
54
|
cannam@2
|
55 size_t
|
cannam@2
|
56 BufferingAudioCallbackRecordTarget::peekSamples(size_t channel, size_t nframes,
|
cannam@2
|
57 float *samples, int reader)
|
cannam@2
|
58 {
|
cannam@2
|
59 return m_buffers[channel]->peek(samples, nframes, reader);
|
cannam@2
|
60 }
|
cannam@0
|
61
|
cannam@2
|
62 size_t
|
cannam@2
|
63 BufferingAudioCallbackRecordTarget::skipSamples(size_t channel, size_t nframes,
|
cannam@2
|
64 int reader)
|
cannam@2
|
65 {
|
cannam@2
|
66 return m_buffers[channel]->skip(nframes, reader);
|
cannam@2
|
67 }
|
cannam@2
|
68
|