Mercurial > hg > vamp-live-host
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 |