From: <man...@us...> - 2015-02-20 12:07:27
|
Revision: 4775 http://sourceforge.net/p/modplug/code/4775 Author: manxorist Date: 2015-02-20 12:07:13 +0000 (Fri, 20 Feb 2015) Log Message: ----------- [Ref] sounddev: Move the multimedia reference clock out of the individual devices. Modified Paths: -------------- trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/sounddev/SoundDevice.cpp trunk/OpenMPT/sounddev/SoundDevice.h trunk/OpenMPT/sounddev/SoundDeviceASIO.cpp Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2015-02-20 11:33:14 UTC (rev 4774) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2015-02-20 12:07:13 UTC (rev 4775) @@ -638,6 +638,30 @@ } +void CMainFrame::SoundSourcePreStartCallback() +//-------------------------------------------- +{ + MPT_TRACE(); + m_SoundDeviceClock.SetResolution(1); +} + + +void CMainFrame::SoundSourcePostStopCallback() +//-------------------------------------------- +{ + MPT_TRACE(); + m_SoundDeviceClock.SetResolution(0); +} + + +uint64 CMainFrame::SoundSourceGetReferenceClockNowNanoseconds() const +//------------------------------------------------------------------- +{ + MPT_TRACE(); + return m_SoundDeviceClock.NowNanoseconds(); +} + + void CMainFrame::FillAudioBufferLocked(SoundDevice::IFillAudioBuffer &callback) //----------------------------------------------------------------------------- { Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2015-02-20 11:33:14 UTC (rev 4774) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2015-02-20 12:07:13 UTC (rev 4775) @@ -342,6 +342,7 @@ public: // Low-Level Audio + Util::MultimediaClock m_SoundDeviceClock; SoundDevice::IBase *gpSoundDevice; UINT_PTR m_NotifyTimer; Dither m_Dither; @@ -396,6 +397,9 @@ static void UpdateAudioParameters(CSoundFile &sndFile, bool reset=false); // from SoundDevice::ISource + uint64 SoundSourceGetReferenceClockNowNanoseconds() const; + void SoundSourcePreStartCallback(); + void SoundSourcePostStopCallback(); void FillAudioBufferLocked(SoundDevice::IFillAudioBuffer &callback); void AudioRead(const SoundDevice::Settings &settings, const SoundDevice::Flags &flags, const SoundDevice::BufferAttributes &bufferAttributes, SoundDevice::TimeInfo timeInfo, std::size_t numFrames, void *buffer); void AudioDone(const SoundDevice::Settings &settings, const SoundDevice::Flags &flags, const SoundDevice::BufferAttributes &bufferAttributes, SoundDevice::TimeInfo timeInfo, std::size_t numFrames, int64 streamPosition); Modified: trunk/OpenMPT/sounddev/SoundDevice.cpp =================================================================== --- trunk/OpenMPT/sounddev/SoundDevice.cpp 2015-02-20 11:33:14 UTC (rev 4774) +++ trunk/OpenMPT/sounddev/SoundDevice.cpp 2015-02-20 12:07:13 UTC (rev 4775) @@ -245,6 +245,40 @@ } +uint64 Base::SourceGetReferenceClockNowNanoseconds() const +//-------------------------------------------------------- +{ + MPT_TRACE(); + if(!m_Source) + { + return 0; + } + return m_Source->SoundSourceGetReferenceClockNowNanoseconds(); +} + + +void Base::SourceNotifyPreStart() +//------------------------------- +{ + MPT_TRACE(); + if(m_Source) + { + m_Source->SoundSourcePreStartCallback(); + } +} + + +void Base::SourceNotifyPostStop() +//------------------------------- +{ + MPT_TRACE(); + if(m_Source) + { + m_Source->SoundSourcePostStopCallback(); + } +} + + void Base::SourceFillAudioBufferLocked() //-------------------------------------- { @@ -266,7 +300,7 @@ { SoundDevice::TimeInfo timeInfo; timeInfo.StreamFrames = InternalHasGetStreamPosition(); - timeInfo.SystemTimestamp = Clock().NowNanoseconds(); + timeInfo.SystemTimestamp = SourceGetReferenceClockNowNanoseconds(); timeInfo.Speed = 1.0; UpdateTimeInfo(timeInfo); } else @@ -276,7 +310,7 @@ Util::lock_guard<Util::mutex> lock(m_StreamPositionMutex); timeInfo.StreamFrames = m_StreamPositionRenderFrames + numFrames; } - timeInfo.SystemTimestamp = Clock().NowNanoseconds() + Util::Round<int64>(GetEffectiveBufferAttributes().Latency * 1000000000.0); + timeInfo.SystemTimestamp = SourceGetReferenceClockNowNanoseconds() + Util::Round<int64>(GetEffectiveBufferAttributes().Latency * 1000000000.0); timeInfo.Speed = 1.0; UpdateTimeInfo(timeInfo); } @@ -340,11 +374,11 @@ m_StreamPositionRenderFrames = 0; m_StreamPositionOutputFrames = 0; } - m_Clock.SetResolution(1); + SourceNotifyPreStart(); m_RequestFlags.fetch_and((~RequestFlagRestart).as_bits()); if(!InternalStart()) { - m_Clock.SetResolution(0); + SourceNotifyPostStop(); return false; } m_IsPlaying = true; @@ -368,7 +402,7 @@ InternalStop(); } m_RequestFlags.fetch_and((~RequestFlagRestart).as_bits()); - m_Clock.SetResolution(0); + SourceNotifyPostStop(); m_IsPlaying = false; { Util::lock_guard<Util::mutex> lock(m_StreamPositionMutex); Modified: trunk/OpenMPT/sounddev/SoundDevice.h =================================================================== --- trunk/OpenMPT/sounddev/SoundDevice.h 2015-02-20 11:33:14 UTC (rev 4774) +++ trunk/OpenMPT/sounddev/SoundDevice.h 2015-02-20 12:07:13 UTC (rev 4775) @@ -71,6 +71,9 @@ //=========== { public: + virtual uint64 SoundSourceGetReferenceClockNowNanoseconds() const = 0; // timeGetTime()*1000000 on Windows + virtual void SoundSourcePreStartCallback() = 0; + virtual void SoundSourcePostStopCallback() = 0; virtual void FillAudioBufferLocked(SoundDevice::IFillAudioBuffer &callback) = 0; // take any locks needed while rendering audio and then call FillAudioBuffer virtual void AudioRead(const SoundDevice::Settings &settings, const SoundDevice::Flags &flags, const SoundDevice::BufferAttributes &bufferAttributes, SoundDevice::TimeInfo timeInfo, std::size_t numFrames, void *buffer) = 0; virtual void AudioDone(const SoundDevice::Settings &settings, const SoundDevice::Flags &flags, const SoundDevice::BufferAttributes &bufferAttributes, SoundDevice::TimeInfo timeInfo, std::size_t numFrames, int64 streamPosition) = 0; // in sample frames @@ -566,7 +569,6 @@ bool m_IsPlaying; - Util::MultimediaClock m_Clock; SoundDevice::TimeInfo m_TimeInfo; mutable Util::mutex m_StreamPositionMutex; @@ -588,6 +590,9 @@ void FillAudioBuffer(); + uint64 SourceGetReferenceClockNowNanoseconds() const; + void SourceNotifyPreStart(); + void SourceNotifyPostStop(); void SourceFillAudioBufferLocked(); void SourceAudioPreRead(std::size_t numFrames); void SourceAudioRead(void *buffer, std::size_t numFrames); @@ -601,8 +606,6 @@ protected: - const Util::MultimediaClock & Clock() const { return m_Clock; } - void UpdateTimeInfo(SoundDevice::TimeInfo timeInfo); virtual bool InternalHasTimeInfo() const { return false; } Modified: trunk/OpenMPT/sounddev/SoundDeviceASIO.cpp =================================================================== --- trunk/OpenMPT/sounddev/SoundDeviceASIO.cpp 2015-02-20 11:33:14 UTC (rev 4774) +++ trunk/OpenMPT/sounddev/SoundDeviceASIO.cpp 2015-02-20 12:07:13 UTC (rev 4775) @@ -1027,7 +1027,7 @@ MPT_TRACE(); if(m_Settings.UseHardwareTiming) { - const uint64 asioNow = Clock().NowNanoseconds(); + const uint64 asioNow = SourceGetReferenceClockNowNanoseconds(); SoundDevice::TimeInfo timeInfo = GetTimeInfo(); int64 currentStreamPositionFrames = Util::Round<int64>( @@ -1076,7 +1076,7 @@ SoundDevice::Base::UpdateTimeInfo(timeInfo); } else { // spec violation or nothing provided at all, better to estimate this stuff ourselves - const uint64 asioNow = Clock().NowNanoseconds(); + const uint64 asioNow = SourceGetReferenceClockNowNanoseconds(); SoundDevice::TimeInfo timeInfo; timeInfo.StreamFrames = m_TotalFramesWritten + m_nAsioBufferLen - m_StreamPositionOffset; timeInfo.SystemTimestamp = asioNow + Util::Round<int64>(m_BufferLatency * 1000.0 * 1000.0 * 1000.0); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |