From 4abfc3230c456053eaf03bd47897612be9066e8e Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Tue, 5 Sep 2017 17:53:43 +0000 Subject: wasapi: added feature to change device git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@7450 90c681e8-e032-0410-971d-27865f9a5e38 --- src/plugins/Output/wasapi/outputwasapi.cpp | 43 +++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 12 deletions(-) (limited to 'src/plugins/Output/wasapi/outputwasapi.cpp') diff --git a/src/plugins/Output/wasapi/outputwasapi.cpp b/src/plugins/Output/wasapi/outputwasapi.cpp index cc8f9b0ee..5faeb0c04 100644 --- a/src/plugins/Output/wasapi/outputwasapi.cpp +++ b/src/plugins/Output/wasapi/outputwasapi.cpp @@ -23,17 +23,16 @@ #include #include #include -#include +#include +#include +#include +#include +#include +#include #include +#include #include "outputwasapi.h" -const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEnumerator); -const IID IID_IMMDeviceEnumerator = __uuidof(IMMDeviceEnumerator); -const IID IID_IAudioClient = __uuidof(IAudioClient); -const IID IID_IAudioRenderClient = __uuidof(IAudioRenderClient); -const IID IID_IChannelAudioVolume = __uuidof(IChannelAudioVolume); -const IID IID_ISimpleAudioVolume = __uuidof(ISimpleAudioVolume); - #define WASAPI_BUFSIZE 10000000LL //1s #ifndef AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM @@ -63,6 +62,8 @@ OutputWASAPI::OutputWASAPI() : Output() m_pRenderClient = 0; m_pSimpleAudioVolume = 0; instance = this; + QSettings settings(Qmmp::configFile(), QSettings::IniFormat); + m_id = settings.value("WASAPI/device", "default").toString(); } OutputWASAPI::~OutputWASAPI() @@ -81,11 +82,29 @@ bool OutputWASAPI::initialize(quint32 freq, ChannelMap map, Qmmp::AudioFormat fo return false; } - if((result = m_pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &m_pDevice)) != S_OK) + if(m_id != "default" && !m_id.isEmpty()) { - qWarning("OutputWASAPI: IMMDeviceEnumerator::GetDefaultAudioEndpoint failed, error code = 0x%lx", result); - m_pDevice = 0; - return false; + WCHAR id[m_id.length() + 1]; + m_id.toWCharArray(id); + id[m_id.length()] = 0; + + if((result = m_pEnumerator->GetDevice(id, &m_pDevice)) != S_OK) + { + qWarning("OutputWASAPI: IMMDeviceEnumerator::GetDevice failed, error code = 0x%lx", result); + m_pDevice = 0; + } + else + qDebug("OutputWASAPI: using device id: %s", qPrintable(m_id)); + } + + if(!m_pDevice) + { + if((result = m_pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &m_pDevice)) != S_OK) + { + qWarning("OutputWASAPI: IMMDeviceEnumerator::GetDefaultAudioEndpoint failed, error code = 0x%lx", result); + m_pDevice = 0; + return false; + } } if((result = m_pDevice->Activate(IID_IAudioClient, CLSCTX_ALL, NULL, (void**)&m_pAudioClient)) != S_OK) -- cgit v1.2.3-13-gbd6f