/* ============================================================================== This file is part of the JUCE library - "Jules' Utility Class Extensions" Copyright 2004-10 by Raw Material Software Ltd. ------------------------------------------------------------------------------ JUCE can be redistributed and/or modified under the terms of the GNU General Public License (Version 2), as published by the Free Software Foundation. A copy of the license is included in the JUCE distribution, or can be found online at www.gnu.org/licenses. JUCE is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ------------------------------------------------------------------------------ To release a closed-source product which uses JUCE, commercial licenses are available: visit www.rawmaterialsoftware.com/juce for more information. ============================================================================== */ #ifndef __JUCE_AUDIOFORMATREADERSOURCE_JUCEHEADER__ #define __JUCE_AUDIOFORMATREADERSOURCE_JUCEHEADER__ #include "juce_PositionableAudioSource.h" #include "../../threads/juce_Thread.h" #include "../audio_file_formats/juce_AudioFormatReader.h" #include "../dsp/juce_AudioSampleBuffer.h" //============================================================================== /** A type of AudioSource that will read from an AudioFormatReader. @see PositionableAudioSource, AudioTransportSource, BufferingAudioSource */ class JUCE_API AudioFormatReaderSource : public PositionableAudioSource { public: //============================================================================== /** Creates an AudioFormatReaderSource for a given reader. @param sourceReader the reader to use as the data source @param deleteReaderWhenThisIsDeleted if true, the reader passed-in will be deleted when this object is deleted; if false it will be left up to the caller to manage its lifetime */ AudioFormatReaderSource (AudioFormatReader* const sourceReader, const bool deleteReaderWhenThisIsDeleted); /** Destructor. */ ~AudioFormatReaderSource(); //============================================================================== /** Toggles loop-mode. If set to true, it will continuously loop the input source. If false, it will just emit silence after the source has finished. @see isLooping */ void setLooping (bool shouldLoop); /** Returns whether loop-mode is turned on or not. */ bool isLooping() const { return looping; } /** Returns the reader that's being used. */ AudioFormatReader* getAudioFormatReader() const throw() { return reader; } //============================================================================== /** Implementation of the AudioSource method. */ void prepareToPlay (int samplesPerBlockExpected, double sampleRate); /** Implementation of the AudioSource method. */ void releaseResources(); /** Implementation of the AudioSource method. */ void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill); //============================================================================== /** Implements the PositionableAudioSource method. */ void setNextReadPosition (int newPosition); /** Implements the PositionableAudioSource method. */ int getNextReadPosition() const; /** Implements the PositionableAudioSource method. */ int getTotalLength() const; //============================================================================== juce_UseDebuggingNewOperator private: AudioFormatReader* reader; bool deleteReader; int volatile nextPlayPos; bool volatile looping; void readBufferSection (int start, int length, AudioSampleBuffer& buffer, int startSample); AudioFormatReaderSource (const AudioFormatReaderSource&); AudioFormatReaderSource& operator= (const AudioFormatReaderSource&); }; #endif // __JUCE_AUDIOFORMATREADERSOURCE_JUCEHEADER__