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@5
|
29 size_t written = nframes;
|
cannam@0
|
30 if (samples[c]) {
|
cannam@5
|
31 written = m_buffers[c]->write(samples[c], nframes);
|
cannam@0
|
32 } else {
|
cannam@5
|
33 written = m_buffers[c]->zero(nframes);
|
cannam@5
|
34 }
|
cannam@5
|
35 if (written < nframes) {
|
cannam@5
|
36 std::cerr << "WARNING: BufferingAudioCallbackRecordTarget::putSamples: Buffer overflow: wrote " << written << " of " << nframes << " samples on channel " << c << std::endl;
|
cannam@0
|
37 }
|
cannam@0
|
38 }
|
cannam@0
|
39 }
|
cannam@0
|
40
|
cannam@0
|
41 size_t
|
cannam@2
|
42 BufferingAudioCallbackRecordTarget::samplesReady(int reader) const
|
cannam@0
|
43 {
|
cannam@0
|
44 size_t ready = 0;
|
cannam@0
|
45 for (size_t c = 0; c < getChannelCount(); ++c) {
|
cannam@2
|
46 size_t readyHere = m_buffers[c]->getReadSpace(reader);
|
cannam@0
|
47 if (c == 0 || readyHere < ready) ready = readyHere;
|
cannam@0
|
48 }
|
cannam@0
|
49 return ready;
|
cannam@0
|
50 }
|
cannam@0
|
51
|
cannam@0
|
52 size_t
|
cannam@0
|
53 BufferingAudioCallbackRecordTarget::getSamples(size_t channel, size_t nframes,
|
cannam@2
|
54 float *samples, int reader)
|
cannam@0
|
55 {
|
cannam@2
|
56 return m_buffers[channel]->read(samples, nframes, reader);
|
cannam@0
|
57 }
|
cannam@0
|
58
|
cannam@2
|
59 size_t
|
cannam@2
|
60 BufferingAudioCallbackRecordTarget::peekSamples(size_t channel, size_t nframes,
|
cannam@2
|
61 float *samples, int reader)
|
cannam@2
|
62 {
|
cannam@2
|
63 return m_buffers[channel]->peek(samples, nframes, reader);
|
cannam@2
|
64 }
|
cannam@0
|
65
|
cannam@2
|
66 size_t
|
cannam@2
|
67 BufferingAudioCallbackRecordTarget::skipSamples(size_t channel, size_t nframes,
|
cannam@2
|
68 int reader)
|
cannam@2
|
69 {
|
cannam@2
|
70 return m_buffers[channel]->skip(nframes, reader);
|
cannam@2
|
71 }
|
cannam@2
|
72
|
cannam@5
|
73 size_t
|
cannam@5
|
74 BufferingAudioCallbackRecordTarget::skipAllSamples(size_t channel,
|
cannam@5
|
75 int reader)
|
cannam@5
|
76 {
|
cannam@5
|
77 return m_buffers[channel]->skip(m_buffers[channel]->getReadSpace(reader),
|
cannam@5
|
78 reader);
|
cannam@5
|
79 }
|
cannam@5
|
80
|