diff --git a/src/audio/abstract.cpp b/src/audio/abstract.cpp index 5687b76d9..b3a315358 100644 --- a/src/audio/abstract.cpp +++ b/src/audio/abstract.cpp @@ -45,6 +45,10 @@ void TAAudio::acceptDeviceStatus() { deviceStatus=TA_AUDIO_DEVICE_OK; } +int TAAudio::specialCommand(TAAudioCommand which) { + return -1; +} + bool TAAudio::quit() { return true; } diff --git a/src/audio/asio.cpp b/src/audio/asio.cpp index 81b11c783..e522affe8 100644 --- a/src/audio/asio.cpp +++ b/src/audio/asio.cpp @@ -319,6 +319,16 @@ void* TAAudioASIO::getContext() { return (void*)&driverInfo; } +int TAAudioASIO::specialCommand(TAAudioCommand which) { + switch (which) { + case TA_AUDIO_CMD_SETUP: + if (ASIOControlPanel()==ASE_NotPresent) return 0; + return 1; + break; + } + return -1; +} + bool TAAudioASIO::quit() { if (!initialized) return false; diff --git a/src/audio/asio.h b/src/audio/asio.h index 4118a370b..ba718cce0 100644 --- a/src/audio/asio.h +++ b/src/audio/asio.h @@ -47,6 +47,7 @@ class TAAudioASIO: public TAAudio { String getFormatName(ASIOSampleType which); void* getContext(); + int specialCommand(TAAudioCommand which); bool quit(); bool setRun(bool run); bool init(TAAudioDesc& request, TAAudioDesc& response); diff --git a/src/audio/taAudio.h b/src/audio/taAudio.h index 47dfa9e50..576ba81da 100644 --- a/src/audio/taAudio.h +++ b/src/audio/taAudio.h @@ -45,6 +45,11 @@ enum TAAudioDeviceStatus { TA_AUDIO_DEVICE_REMOVED }; +enum TAAudioCommand { + // open control panel for audio device + TA_AUDIO_CMD_SETUP=0 +}; + enum TAAudioFormat { TA_AUDIO_FORMAT_F32=0, TA_AUDIO_FORMAT_F64, @@ -184,6 +189,7 @@ class TAAudio { void setCallback(void (*callback)(void*,float**,float**,int,int,unsigned int), void* user); virtual void* getContext(); + virtual int specialCommand(TAAudioCommand which); virtual bool quit(); virtual bool setRun(bool run); virtual std::vector listAudioDevices(); diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index eb72ad152..9503106f1 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -3808,6 +3808,11 @@ void DivEngine::acceptAudioDeviceStatus() { output->acceptDeviceStatus(); } +int DivEngine::audioBackendCommand(TAAudioCommand which) { + if (output==NULL) return -1; + return output->specialCommand(which); +} + std::vector& DivEngine::getAudioDevices() { return audioDevs; } diff --git a/src/engine/engine.h b/src/engine/engine.h index b1174b2b3..69ecf3a68 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -1409,6 +1409,9 @@ class DivEngine { // acknowledge an audio device status change void acceptAudioDeviceStatus(); + // send command to audio backend + int audioBackendCommand(TAAudioCommand which); + // init dispatch void initDispatch(bool isRender=false); diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 72a5717cd..d13d2e3f1 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -1347,6 +1347,15 @@ void FurnaceGUI::drawSettings() { } } + if (settings.audioEngine==DIV_AUDIO_ASIO) { + ImGui::SameLine(); + if (ImGui::Button(_("Control panel"))) { + if (e->audioBackendCommand(TA_AUDIO_CMD_SETUP)!=2) { + showError(_("this driver doesn't have a control panel.")); + } + } + } + ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::AlignTextToFramePadding();