LMMS
Loading...
Searching...
No Matches
juce::BufferingAudioSource Class Reference

#include <juce_BufferingAudioSource.h>

Inheritance diagram for juce::BufferingAudioSource:
juce::PositionableAudioSource juce::TimeSliceClient juce::AudioSource

Public Member Functions

 BufferingAudioSource (PositionableAudioSource *source, TimeSliceThread &backgroundThread, bool deleteSourceWhenDeleted, int numberOfSamplesToBuffer, int numberOfChannels=2, bool prefillBufferOnPrepareToPlay=true)
 ~BufferingAudioSource () override
void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override
void releaseResources () override
void getNextAudioBlock (const AudioSourceChannelInfo &) override
void setNextReadPosition (int64 newPosition) override
int64 getNextReadPosition () const override
int64 getTotalLength () const override
bool isLooping () const override
bool waitForNextAudioBlockReady (const AudioSourceChannelInfo &info, const uint32 timeout)
Public Member Functions inherited from juce::PositionableAudioSource
 ~PositionableAudioSource () override=default
virtual void setLooping (bool shouldLoop)
Public Member Functions inherited from juce::AudioSource
virtual ~AudioSource ()=default

Private Member Functions

Range< intgetValidBufferRange (int numSamples) const
bool readNextBufferChunk ()
void readBufferSection (int64 start, int length, int bufferOffset)
int useTimeSlice () override
Private Member Functions inherited from juce::TimeSliceClient
virtual ~TimeSliceClient ()=default

Private Attributes

OptionalScopedPointer< PositionableAudioSourcesource
TimeSliceThreadbackgroundThread
int numberOfSamplesToBuffer
int numberOfChannels
AudioBuffer< float > buffer
CriticalSection callbackLock
CriticalSection bufferRangeLock
WaitableEvent bufferReadyEvent
int64 bufferValidStart = 0
int64 bufferValidEnd = 0
std::atomic< int64nextPlayPos { 0 }
double sampleRate = 0
bool wasSourceLooping = false
bool isPrepared = false
const bool prefillBuffer

Additional Inherited Members

Protected Member Functions inherited from juce::PositionableAudioSource
 PositionableAudioSource ()=default
Protected Member Functions inherited from juce::AudioSource
 AudioSource ()=default

Detailed Description

An AudioSource which takes another source as input, and buffers it using a thread.

Create this as a wrapper around another thread, and it will read-ahead with a background thread to smooth out playback. You can either create one of these directly, or use it indirectly using an AudioTransportSource.

See also
PositionableAudioSource, AudioTransportSource

@tags{Audio}

Constructor & Destructor Documentation

◆ BufferingAudioSource()

juce::BufferingAudioSource::BufferingAudioSource ( PositionableAudioSource * source,
TimeSliceThread & backgroundThread,
bool deleteSourceWhenDeleted,
int numberOfSamplesToBuffer,
int numberOfChannels = 2,
bool prefillBufferOnPrepareToPlay = true )

Creates a BufferingAudioSource.

Parameters
sourcethe input source to read from
backgroundThreada background thread that will be used for the background read-ahead. This object must not be deleted until after any BufferingAudioSources that are using it have been deleted!
deleteSourceWhenDeletedif true, then the input source object will be deleted when this object is deleted
numberOfSamplesToBufferthe size of buffer to use for reading ahead
numberOfChannelsthe number of channels that will be played
prefillBufferOnPrepareToPlayif true, then calling prepareToPlay on this object will block until the buffer has been filled

◆ ~BufferingAudioSource()

juce::BufferingAudioSource::~BufferingAudioSource ( )
override

Destructor.

The input source may be deleted depending on whether the deleteSourceWhenDeleted flag was set in the constructor.

Member Function Documentation

◆ getNextAudioBlock()

void juce::BufferingAudioSource::getNextAudioBlock ( const AudioSourceChannelInfo & info)
overridevirtual

Implementation of the AudioSource method.

Implements juce::AudioSource.

◆ getNextReadPosition()

int64 juce::BufferingAudioSource::getNextReadPosition ( ) const
overridevirtual

Implements the PositionableAudioSource method.

Implements juce::PositionableAudioSource.

◆ getTotalLength()

int64 juce::BufferingAudioSource::getTotalLength ( ) const
inlineoverridevirtual

Implements the PositionableAudioSource method.

Implements juce::PositionableAudioSource.

◆ getValidBufferRange()

Range< int > juce::BufferingAudioSource::getValidBufferRange ( int numSamples) const
private

◆ isLooping()

bool juce::BufferingAudioSource::isLooping ( ) const
inlineoverridevirtual

Implements the PositionableAudioSource method.

Implements juce::PositionableAudioSource.

◆ prepareToPlay()

void juce::BufferingAudioSource::prepareToPlay ( int samplesPerBlockExpected,
double sampleRate )
overridevirtual

Implementation of the AudioSource method.

Implements juce::AudioSource.

◆ readBufferSection()

void juce::BufferingAudioSource::readBufferSection ( int64 start,
int length,
int bufferOffset )
private

◆ readNextBufferChunk()

bool juce::BufferingAudioSource::readNextBufferChunk ( )
private

◆ releaseResources()

void juce::BufferingAudioSource::releaseResources ( )
overridevirtual

Implementation of the AudioSource method.

Implements juce::AudioSource.

◆ setNextReadPosition()

void juce::BufferingAudioSource::setNextReadPosition ( int64 newPosition)
overridevirtual

Implements the PositionableAudioSource method.

Implements juce::PositionableAudioSource.

◆ useTimeSlice()

int juce::BufferingAudioSource::useTimeSlice ( )
overrideprivatevirtual

Called back by a TimeSliceThread.

When you register this class with it, a TimeSliceThread will repeatedly call this method.

The implementation of this method should use its time-slice to do something that's quick - never block for longer than absolutely necessary.

Returns
Your method should return the number of milliseconds which it would like to wait before being called again. Returning 0 will make the thread call again as soon as possible (after possibly servicing other busy clients). If you return a value below zero, your client will be removed from the list of clients, and won't be called again. The value you specify isn't a guarantee, and is only used as a hint by the thread - the actual time before the next callback may be more or less than specified. You can force the TimeSliceThread to wake up and poll again immediately by calling its notify() method.

Implements juce::TimeSliceClient.

◆ waitForNextAudioBlockReady()

bool juce::BufferingAudioSource::waitForNextAudioBlockReady ( const AudioSourceChannelInfo & info,
const uint32 timeout )

A useful function to block until the next the buffer info can be filled.

This is useful for offline rendering.

Member Data Documentation

◆ backgroundThread

TimeSliceThread& juce::BufferingAudioSource::backgroundThread
private

◆ buffer

AudioBuffer<float> juce::BufferingAudioSource::buffer
private

◆ bufferRangeLock

CriticalSection juce::BufferingAudioSource::bufferRangeLock
private

◆ bufferReadyEvent

WaitableEvent juce::BufferingAudioSource::bufferReadyEvent
private

◆ bufferValidEnd

int64 juce::BufferingAudioSource::bufferValidEnd = 0
private

◆ bufferValidStart

int64 juce::BufferingAudioSource::bufferValidStart = 0
private

◆ callbackLock

CriticalSection juce::BufferingAudioSource::callbackLock
private

◆ isPrepared

bool juce::BufferingAudioSource::isPrepared = false
private

◆ nextPlayPos

std::atomic<int64> juce::BufferingAudioSource::nextPlayPos { 0 }
private

◆ numberOfChannels

int juce::BufferingAudioSource::numberOfChannels
private

◆ numberOfSamplesToBuffer

int juce::BufferingAudioSource::numberOfSamplesToBuffer
private

◆ prefillBuffer

const bool juce::BufferingAudioSource::prefillBuffer
private

◆ sampleRate

double juce::BufferingAudioSource::sampleRate = 0
private

◆ source

OptionalScopedPointer<PositionableAudioSource> juce::BufferingAudioSource::source
private

◆ wasSourceLooping

bool juce::BufferingAudioSource::wasSourceLooping = false
private

The documentation for this class was generated from the following files: