From: <man...@us...> - 2014-02-13 18:09:17
|
Revision: 3710 http://sourceforge.net/p/modplug/code/3710 Author: manxorist Date: 2014-02-13 18:09:09 +0000 (Thu, 13 Feb 2014) Log Message: ----------- [Ref] ASIO: Display ASIO features queried by the driver in the settings' statistics field. If the driver uses features which OpenMPT does not support, display a warning there. Modified Paths: -------------- trunk/OpenMPT/mptrack/Mpdlgs.cpp trunk/OpenMPT/sounddev/SoundDevice.h trunk/OpenMPT/sounddev/SoundDeviceASIO.cpp trunk/OpenMPT/sounddev/SoundDeviceASIO.h Modified: trunk/OpenMPT/mptrack/Mpdlgs.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mpdlgs.cpp 2014-02-13 16:49:51 UTC (rev 3709) +++ trunk/OpenMPT/mptrack/Mpdlgs.cpp 2014-02-13 18:09:09 UTC (rev 3710) @@ -691,7 +691,8 @@ s += mpt::String::Print("Buffer: %1%%\r\n", (bufferAttributes.Latency > 0.0) ? Util::Round<int64>(currentLatency / bufferAttributes.Latency * 100.0) : 0); } s += mpt::String::Print("Latency: %1 ms (current: %2 ms, %3 frames)\r\n", mpt::Format("%4.1f").ToString(bufferAttributes.Latency * 1000.0), mpt::Format("%4.1f").ToString(currentLatency * 1000.0), Util::Round<int64>(currentLatency * samplerate)); - s += mpt::String::Print("Update Interval: %1 ms (current: %2 ms, %3 frames)\r\n", mpt::Format("%4.1f").ToString(bufferAttributes.UpdateInterval * 1000.0), mpt::Format("%4.1f").ToString(currentUpdateInterval * 1000.0), Util::Round<int64>(currentUpdateInterval * samplerate)); + s += mpt::String::Print("Period: %1 ms (current: %2 ms, %3 frames)\r\n", mpt::Format("%4.1f").ToString(bufferAttributes.UpdateInterval * 1000.0), mpt::Format("%4.1f").ToString(currentUpdateInterval * 1000.0), Util::Round<int64>(currentUpdateInterval * samplerate)); + s += pMainFrm->gpSoundDevice->GetStatistics(); m_EditStatistics.SetWindowText(s.c_str()); } else { Modified: trunk/OpenMPT/sounddev/SoundDevice.h =================================================================== --- trunk/OpenMPT/sounddev/SoundDevice.h 2014-02-13 16:49:51 UTC (rev 3709) +++ trunk/OpenMPT/sounddev/SoundDevice.h 2014-02-13 18:09:09 UTC (rev 3710) @@ -448,7 +448,10 @@ int64 GetStreamPositionFrames() const; + virtual std::string GetStatistics() const { return std::string(); } + virtual bool OpenDriverSettings() { return false; }; + }; Modified: trunk/OpenMPT/sounddev/SoundDeviceASIO.cpp =================================================================== --- trunk/OpenMPT/sounddev/SoundDeviceASIO.cpp 2014-02-13 16:49:51 UTC (rev 3709) +++ trunk/OpenMPT/sounddev/SoundDeviceASIO.cpp 2014-02-13 18:09:09 UTC (rev 3710) @@ -201,6 +201,9 @@ m_BufferIndex = 0; InterlockedExchange(&m_RenderSilence, 0); InterlockedExchange(&m_RenderingSilence, 0); + + m_QueriedFeatures.reset(); + m_UsedFeatures.reset(); } @@ -1020,7 +1023,10 @@ //----------------------------------------------------------------------------------------------------------- { ASSERT(directProcess); // !directProcess is not handled correctly in OpenMPT, would require a separate thread and potentially additional buffering - MPT_UNREFERENCED_PARAMETER(directProcess); + if(!directProcess) + { + m_UsedFeatures.set(AsioFeatureNoDirectProcess); + } if(m_Settings.UseHardwareTiming) { if(params) @@ -1087,6 +1093,35 @@ } +static std::string AsioFeaturesToString(FlagSet<AsioFeatures> features) +//--------------------------------------------------------------------- +{ + std::string result; + bool first = true; + if(features[AsioFeatureResetRequest]) { if(!first) { result += ","; } first = false; result += "reset"; } + if(features[AsioFeatureResyncRequest]) { if(!first) { result += ","; } first = false; result += "resync"; } + if(features[AsioFeatureLatenciesChanged]) { if(!first) { result += ","; } first = false; result += "latency"; } + if(features[AsioFeatureBufferSizeChange]) { if(!first) { result += ","; } first = false; result += "buffer"; } + if(features[AsioFeatureOverload]) { if(!first) { result += ","; } first = false; result += "load"; } + if(features[AsioFeatureNoDirectProcess]) { if(!first) { result += ","; } first = false; result += "nodirect"; } + return result; +} + + +std::string CASIODevice::GetStatistics() const +//-------------------------------------------- +{ + if(m_UsedFeatures.any()) + { + return mpt::String::Print("WARNING: unsupported features used: %1", AsioFeaturesToString(m_UsedFeatures)); + } else if(m_QueriedFeatures.any()) + { + return mpt::String::Print("features queried: %1", AsioFeaturesToString(m_QueriedFeatures)); + } + return std::string(); +} + + long CASIODevice::AsioMessage(long selector, long value, void* message, double* opt) //---------------------------------------------------------------------------------- { @@ -1104,10 +1139,30 @@ result = m_Settings.UseHardwareTiming ? 1 : 0; break; case kAsioResetRequest: + m_QueriedFeatures.set(AsioFeatureResetRequest); + // unsupported + result = 0; + break; case kAsioBufferSizeChange: + m_QueriedFeatures.set(AsioFeatureBufferSizeChange); + // unsupported + result = 0; + break; case kAsioResyncRequest: + m_QueriedFeatures.set(AsioFeatureResyncRequest); + // unsupported + result = 0; + break; case kAsioLatenciesChanged: + m_QueriedFeatures.set(AsioFeatureLatenciesChanged); + // unsupported + result = 0; + break; case kAsioOverload: + m_QueriedFeatures.set(AsioFeatureOverload); + // unsupported + result = 0; + break; default: // unsupported result = 0; @@ -1121,10 +1176,30 @@ result = m_Settings.UseHardwareTiming ? 1 : 0; break; case kAsioResetRequest: + m_UsedFeatures.set(AsioFeatureResetRequest); + // unsupported + result = 0; + break; case kAsioBufferSizeChange: + m_UsedFeatures.set(AsioFeatureBufferSizeChange); + // unsupported + result = 0; + break; case kAsioResyncRequest: + m_UsedFeatures.set(AsioFeatureResyncRequest); + // unsupported + result = 0; + break; case kAsioLatenciesChanged: + m_UsedFeatures.set(AsioFeatureLatenciesChanged); + // unsupported + result = 0; + break; case kAsioOverload: + m_UsedFeatures.set(AsioFeatureOverload); + // unsupported + result = 0; + break; default: // unsupported result = 0; Modified: trunk/OpenMPT/sounddev/SoundDeviceASIO.h =================================================================== --- trunk/OpenMPT/sounddev/SoundDeviceASIO.h 2014-02-13 16:49:51 UTC (rev 3709) +++ trunk/OpenMPT/sounddev/SoundDeviceASIO.h 2014-02-13 18:09:09 UTC (rev 3710) @@ -13,6 +13,8 @@ #include "SoundDevices.h" +#include "../common/FlagSet.h" + #ifndef NO_ASIO #include <iasiodrv.h> #endif @@ -24,6 +26,18 @@ #ifndef NO_ASIO +enum AsioFeatures +{ + AsioFeatureResetRequest = 1<<0, + AsioFeatureResyncRequest = 1<<1, + AsioFeatureLatenciesChanged = 1<<2, + AsioFeatureBufferSizeChange = 1<<3, + AsioFeatureOverload = 1<<4, + AsioFeatureNoDirectProcess = 1<<5, + AsioFeatureNone = 0 +}; +DECLARE_FLAGSET(AsioFeatures) + //==================================== class CASIODevice: public ISoundDevice //==================================== @@ -54,6 +68,9 @@ int64 m_StreamPositionOffset; + FlagSet<AsioFeatures> m_QueriedFeatures; + FlagSet<AsioFeatures> m_UsedFeatures; + private: void UpdateTimeInfo(AsioTimeInfo asioTimeInfo); @@ -83,6 +100,8 @@ SoundDeviceCaps GetDeviceCaps(const std::vector<uint32> &baseSampleRates); bool OpenDriverSettings(); + std::string GetStatistics() const; + public: static std::vector<SoundDeviceInfo> EnumerateDevices(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |