view audioio/BufferingAudioCallbackRecordTarget.cpp @ 2:b8f6bbf172e7

...
author cannam
date Fri, 20 Oct 2006 15:32:33 +0000
parents a6020bf991cd
children 7fc28f7a935a
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) {
        if (samples[c]) {
            m_buffers[c]->write(samples[c], nframes);
        } else {
            m_buffers[c]->zero(nframes);
        }
    }
}

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);
}