annotate audioio/BufferingAudioCallbackRecordTarget.cpp @ 0:a6020bf991cd

* Initial import of what may or may not become a simple live visual-response host for causal Vamp plugins
author cannam
date Thu, 19 Oct 2006 16:53:48 +0000
parents
children b8f6bbf172e7
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@0 13 m_buffers.push_back(new RingBuffer<float>(RING_BUFFER_SIZE));
cannam@0 14 }
cannam@0 15 }
cannam@0 16
cannam@0 17 BufferingAudioCallbackRecordTarget::~BufferingAudioCallbackRecordTarget()
cannam@0 18 {
cannam@0 19 for (size_t c = 0; c < getChannelCount(); ++c) {
cannam@0 20 delete m_buffers[c];
cannam@0 21 }
cannam@0 22 }
cannam@0 23
cannam@0 24 void
cannam@0 25 BufferingAudioCallbackRecordTarget::putSamples(size_t nframes, float **samples)
cannam@0 26 {
cannam@0 27 for (size_t c = 0; c < getChannelCount(); ++c) {
cannam@0 28 if (samples[c]) {
cannam@0 29 m_buffers[c]->write(samples[c], nframes);
cannam@0 30 } else {
cannam@0 31 m_buffers[c]->zero(nframes);
cannam@0 32 }
cannam@0 33 }
cannam@0 34 }
cannam@0 35
cannam@0 36 size_t
cannam@0 37 BufferingAudioCallbackRecordTarget::samplesReady() const
cannam@0 38 {
cannam@0 39 size_t ready = 0;
cannam@0 40 for (size_t c = 0; c < getChannelCount(); ++c) {
cannam@0 41 size_t readyHere = m_buffers[c]->getReadSpace();
cannam@0 42 if (c == 0 || readyHere < ready) ready = readyHere;
cannam@0 43 }
cannam@0 44 return ready;
cannam@0 45 }
cannam@0 46
cannam@0 47 size_t
cannam@0 48 BufferingAudioCallbackRecordTarget::getSamples(size_t channel, size_t nframes,
cannam@0 49 float *samples)
cannam@0 50 {
cannam@0 51 return m_buffers[channel]->read(samples, nframes);
cannam@0 52 }
cannam@0 53
cannam@0 54