1 #pragma once 2 3 #include "sources/audiosource.h" 4 5 namespace mixxx { 6 7 class AudioSourceProxy : public AudioSource { 8 public: AudioSourceProxy(AudioSourcePointer && pAudioSource)9 explicit AudioSourceProxy( 10 AudioSourcePointer&& pAudioSource) 11 : AudioSourceProxy( 12 std::move(pAudioSource), 13 pAudioSource->getSignalInfo()) { 14 } AudioSourceProxy(AudioSourcePointer && pAudioSource,const audio::SignalInfo & signalInfo)15 AudioSourceProxy( 16 AudioSourcePointer&& pAudioSource, 17 const audio::SignalInfo& signalInfo) 18 : AudioSource(*pAudioSource, signalInfo), 19 m_pAudioSource(std::move(pAudioSource)) { 20 } 21 close()22 void close() override { 23 m_pAudioSource->close(); 24 } 25 26 protected: tryOpen(OpenMode mode,const OpenParams & params)27 OpenResult tryOpen( 28 OpenMode mode, 29 const OpenParams& params) override { 30 return tryOpenOn(*m_pAudioSource, mode, params); 31 } 32 readSampleFramesClamped(const WritableSampleFrames & sampleFrames)33 ReadableSampleFrames readSampleFramesClamped( 34 const WritableSampleFrames& sampleFrames) override { 35 DEBUG_ASSERT(getSignalInfo() == m_pAudioSource->getSignalInfo()); 36 DEBUG_ASSERT(getBitrate() == m_pAudioSource->getBitrate()); 37 DEBUG_ASSERT(frameIndexRange() == m_pAudioSource->frameIndexRange()); 38 return readSampleFramesClampedOn(*m_pAudioSource, sampleFrames); 39 } 40 adjustFrameIndexRange(IndexRange frameIndexRange)41 void adjustFrameIndexRange( 42 IndexRange frameIndexRange) final { 43 // Ugly hack to keep both sources (inherited base + inner delegate) in sync! 44 AudioSource::adjustFrameIndexRange(frameIndexRange); 45 adjustFrameIndexRangeOn(*m_pAudioSource, frameIndexRange); 46 } 47 48 const AudioSourcePointer m_pAudioSource; 49 }; 50 51 } // namespace mixxx 52