Mercurial > hg > vamp-live-host
view audioio/BufferingAudioCallbackRecordTarget.cpp @ 5:7fc28f7a935a
...
author | cannam |
---|---|
date | Mon, 06 Nov 2006 20:12:38 +0000 |
parents | b8f6bbf172e7 |
children |
line wrap: on
line source
/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ #include "BufferingAudioCallbackRecordTarget.h" #define RING_BUFFER_SIZE 4194303 // 2^22-1 frames, or about 87s at 48KHz BufferingAudioCallbackRecordTarget::BufferingAudioCallbackRecordTarget() : m_sourceBlockSize(0), m_sourceSampleRate(0), m_sourceRecordLatency(0) { for (size_t c = 0; c < getChannelCount(); ++c) { m_buffers.push_back(new RingBuffer<float, MAX_DISTINCT_STEP_SIZES> (RING_BUFFER_SIZE)); } } BufferingAudioCallbackRecordTarget::~BufferingAudioCallbackRecordTarget() { for (size_t c = 0; c < getChannelCount(); ++c) { delete m_buffers[c]; } } void BufferingAudioCallbackRecordTarget::putSamples(size_t nframes, float **samples) { for (size_t c = 0; c < getChannelCount(); ++c) { size_t written = nframes; if (samples[c]) { written = m_buffers[c]->write(samples[c], nframes); } else { written = m_buffers[c]->zero(nframes); } if (written < nframes) { std::cerr << "WARNING: BufferingAudioCallbackRecordTarget::putSamples: Buffer overflow: wrote " << written << " of " << nframes << " samples on channel " << c << std::endl; } } } size_t BufferingAudioCallbackRecordTarget::samplesReady(int reader) const { size_t ready = 0; for (size_t c = 0; c < getChannelCount(); ++c) { size_t readyHere = m_buffers[c]->getReadSpace(reader); if (c == 0 || readyHere < ready) ready = readyHere; } return ready; } size_t BufferingAudioCallbackRecordTarget::getSamples(size_t channel, size_t nframes, float *samples, int reader) { return m_buffers[channel]->read(samples, nframes, reader); } size_t BufferingAudioCallbackRecordTarget::peekSamples(size_t channel, size_t nframes, float *samples, int reader) { return m_buffers[channel]->peek(samples, nframes, reader); } size_t BufferingAudioCallbackRecordTarget::skipSamples(size_t channel, size_t nframes, int reader) { return m_buffers[channel]->skip(nframes, reader); } size_t BufferingAudioCallbackRecordTarget::skipAllSamples(size_t channel, int reader) { return m_buffers[channel]->skip(m_buffers[channel]->getReadSpace(reader), reader); }