Mercurial > hg > svapp
diff audioio/AudioCallbackPlaySource.h @ 100:22bf057ea151 1.2-stable
* merge from trunk (1.2 ended up being tracked from trunk, but we may want
this branch for fixes later)
author | Chris Cannam |
---|---|
date | Wed, 27 Feb 2008 10:32:45 +0000 |
parents | ae2627ac7db2 |
children |
line wrap: on
line diff
--- a/audioio/AudioCallbackPlaySource.h Fri Nov 30 17:36:14 2007 +0000 +++ b/audioio/AudioCallbackPlaySource.h Wed Feb 27 10:32:45 2008 +0000 @@ -26,23 +26,23 @@ #include <QWaitCondition> #include "base/Thread.h" +#include "base/RealTime.h" #include <samplerate.h> #include <set> #include <map> -#ifdef HAVE_RUBBERBAND -#include <rubberband/RubberBandStretcher.h> -#else -class PhaseVocoderTimeStretcher; -#endif +namespace RubberBand { + class RubberBandStretcher; +} class Model; class ViewManager; class AudioGenerator; class PlayParameters; class RealTimePluginInstance; +class AudioCallbackPlayTarget; /** * AudioCallbackPlaySource manages audio data supply to callback-based @@ -100,6 +100,12 @@ * out of the speakers. (i.e. compensating for playback latency.) */ virtual size_t getCurrentPlayingFrame(); + + /** + * Return the last frame that would come out of the speakers if we + * stopped playback right now. + */ + virtual size_t getCurrentBufferedFrame(); /** * Return the frame at which playback is expected to end (if not looping). @@ -107,13 +113,16 @@ virtual size_t getPlayEndFrame() { return m_lastModelEndFrame; } /** - * Set the block size of the target audio device. This should - * be called by the target class. + * Set the target and the block size of the target audio device. + * This should be called by the target class. */ - void setTargetBlockSize(size_t); + void setTarget(AudioCallbackPlayTarget *, size_t blockSize); /** - * Get the block size of the target audio device. + * Get the block size of the target audio device. This may be an + * estimate or upper bound, if the target has a variable block + * size; the source should behave itself even if this value turns + * out to be inaccurate. */ size_t getTargetBlockSize() const; @@ -190,12 +199,9 @@ size_t getSourceSamples(size_t count, float **buffer); /** - * Set the time stretcher factor (i.e. playback speed). Also - * specify whether the time stretcher will be variable rate - * (sharpening transients), and whether time stretching will be - * carried out on data mixed down to mono for speed. + * Set the time stretcher factor (i.e. playback speed). */ - void setTimeStretch(float factor, bool sharpen, bool mono); + void setTimeStretch(float factor); /** * Set the resampler quality, 0 - 2 where 0 is fastest and 2 is @@ -279,6 +285,9 @@ size_t m_sourceSampleRate; size_t m_targetSampleRate; size_t m_playLatency; + AudioCallbackPlayTarget *m_target; + double m_lastRetrievalTimestamp; + size_t m_lastRetrievedBlockSize; bool m_playing; bool m_exiting; size_t m_lastModelEndFrame; @@ -288,6 +297,9 @@ RealTimePluginInstance *m_auditioningPlugin; bool m_auditioningPluginBypassed; Scavenger<RealTimePluginInstance> m_pluginScavenger; + size_t m_playStartFrame; + bool m_playStartFramePassed; + RealTime m_playStartedAt; RingBuffer<float> *getWriteRingBuffer(size_t c) { if (m_writeBuffers && c < m_writeBuffers->size()) { @@ -309,13 +321,12 @@ void clearRingBuffers(bool haveLock = false, size_t count = 0); void unifyRingBuffers(); -#ifdef HAVE_RUBBERBAND RubberBand::RubberBandStretcher *m_timeStretcher; - QMutex m_timeStretchRatioMutex; -#else - PhaseVocoderTimeStretcher *m_timeStretcher; - Scavenger<PhaseVocoderTimeStretcher> m_timeStretcherScavenger; -#endif + float m_stretchRatio; + + size_t m_stretcherInputCount; + float **m_stretcherInputs; + size_t *m_stretcherInputSizes; // Called from fill thread, m_playing true, mutex held // Return true if work done @@ -330,6 +341,13 @@ // Called from getSourceSamples. void applyAuditioningEffect(size_t count, float **buffers); + // Ranges of current selections, if play selection is active + std::vector<RealTime> m_rangeStarts; + std::vector<RealTime> m_rangeDurations; + void rebuildRangeLists(); + + size_t getCurrentFrame(RealTime outputLatency); + class FillThread : public Thread { public: