annotate audioio/BufferingAudioCallbackRecordTarget.cpp @ 2:b8f6bbf172e7

...
author cannam
date Fri, 20 Oct 2006 15:32:33 +0000
parents a6020bf991cd
children 7fc28f7a935a
rev   line source
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