view 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
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>(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) {
        if (samples[c]) {
            m_buffers[c]->write(samples[c], nframes);
        } else {
            m_buffers[c]->zero(nframes);
        }
    }
}

size_t
BufferingAudioCallbackRecordTarget::samplesReady() const
{
    size_t ready = 0;
    for (size_t c = 0; c < getChannelCount(); ++c) {
        size_t readyHere = m_buffers[c]->getReadSpace();
        if (c == 0 || readyHere < ready) ready = readyHere;
    }
    return ready;
}

size_t
BufferingAudioCallbackRecordTarget::getSamples(size_t channel, size_t nframes,
                                               float *samples)
{
    return m_buffers[channel]->read(samples, nframes);
}