cannam@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ cannam@0: cannam@0: #include "BufferingAudioCallbackRecordTarget.h" cannam@0: cannam@0: #define RING_BUFFER_SIZE 4194303 // 2^22-1 frames, or about 87s at 48KHz cannam@0: cannam@0: BufferingAudioCallbackRecordTarget::BufferingAudioCallbackRecordTarget() : cannam@0: m_sourceBlockSize(0), cannam@0: m_sourceSampleRate(0), cannam@0: m_sourceRecordLatency(0) cannam@0: { cannam@0: for (size_t c = 0; c < getChannelCount(); ++c) { cannam@2: m_buffers.push_back(new RingBuffer cannam@2: (RING_BUFFER_SIZE)); cannam@0: } cannam@0: } cannam@0: cannam@0: BufferingAudioCallbackRecordTarget::~BufferingAudioCallbackRecordTarget() cannam@0: { cannam@0: for (size_t c = 0; c < getChannelCount(); ++c) { cannam@0: delete m_buffers[c]; cannam@0: } cannam@0: } cannam@0: cannam@0: void cannam@0: BufferingAudioCallbackRecordTarget::putSamples(size_t nframes, float **samples) cannam@0: { cannam@0: for (size_t c = 0; c < getChannelCount(); ++c) { cannam@5: size_t written = nframes; cannam@0: if (samples[c]) { cannam@5: written = m_buffers[c]->write(samples[c], nframes); cannam@0: } else { cannam@5: written = m_buffers[c]->zero(nframes); cannam@5: } cannam@5: if (written < nframes) { cannam@5: std::cerr << "WARNING: BufferingAudioCallbackRecordTarget::putSamples: Buffer overflow: wrote " << written << " of " << nframes << " samples on channel " << c << std::endl; cannam@0: } cannam@0: } cannam@0: } cannam@0: cannam@0: size_t cannam@2: BufferingAudioCallbackRecordTarget::samplesReady(int reader) const cannam@0: { cannam@0: size_t ready = 0; cannam@0: for (size_t c = 0; c < getChannelCount(); ++c) { cannam@2: size_t readyHere = m_buffers[c]->getReadSpace(reader); cannam@0: if (c == 0 || readyHere < ready) ready = readyHere; cannam@0: } cannam@0: return ready; cannam@0: } cannam@0: cannam@0: size_t cannam@0: BufferingAudioCallbackRecordTarget::getSamples(size_t channel, size_t nframes, cannam@2: float *samples, int reader) cannam@0: { cannam@2: return m_buffers[channel]->read(samples, nframes, reader); cannam@0: } cannam@0: cannam@2: size_t cannam@2: BufferingAudioCallbackRecordTarget::peekSamples(size_t channel, size_t nframes, cannam@2: float *samples, int reader) cannam@2: { cannam@2: return m_buffers[channel]->peek(samples, nframes, reader); cannam@2: } cannam@0: cannam@2: size_t cannam@2: BufferingAudioCallbackRecordTarget::skipSamples(size_t channel, size_t nframes, cannam@2: int reader) cannam@2: { cannam@2: return m_buffers[channel]->skip(nframes, reader); cannam@2: } cannam@2: cannam@5: size_t cannam@5: BufferingAudioCallbackRecordTarget::skipAllSamples(size_t channel, cannam@5: int reader) cannam@5: { cannam@5: return m_buffers[channel]->skip(m_buffers[channel]->getReadSpace(reader), cannam@5: reader); cannam@5: } cannam@5: