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