XAudio2 — исходный голос зависает при удалении активного аудио устройства

У меня есть проблема, которую я не могу решить. Мое приложение должно иметь возможность переключать аудиоустройство по умолчанию во время выполнения. Для достижения этого я использую XAudio2 из DirectXTK.

Я внедрил IMMNotificationClient в свой аудио класс, чтобы иметь возможность реагировать на изменения устройства по умолчанию.

Например, когда меняется устройство по умолчанию, я останавливаю свой текущий исходный голос, сбрасываю аудио движок и снова запускаю исходный голос. Все работает как положено.

Однако, когда моим устройством по умолчанию является звуковая карта USB, и я отключаю ее во время воспроизведения исходного голоса, приложение зависает.

Причина этого заключается в том, что исходный голос зависает при остановке голоса. Иногда также при очистке исходного буфера. Похоже, что исходный голос больше не может быть остановлен, когда аудиоустройство было удалено исходным голосом.

У кого-то была такая же проблема и удалось ее решить?

Вот функция, которую я использую для сброса аудио движка.

HRESULT DX::XAudioEngine::ResetAudioDevice()
{
HRESULT hr = S_OK;

this->m_retryAudio = TRUE;

if (SUCCEEDED(hr) && m_pSourceVoice)
{
hr = m_pSourceVoice->Stop();
}

if (SUCCEEDED(hr))
{
hr = m_pSourceVoice->FlushSourceBuffers();
}

if (m_audEngine && m_pSourceVoice)
{
// Get the source voice back from the smart pointer
IXAudio2SourceVoice* ptmpSrcVoice = nullptr;
ptmpSrcVoice = m_pSourceVoice.release();

// Destroy the voice
ptmpSrcVoice->DestroyVoice();
}

m_audEngine->Reset(&m_waveFormat, NULL);

// Create source voice
IXAudio2SourceVoice* ptmpSrcVoice = nullptr;

m_audEngine->AllocateVoice(
(WAVEFORMATEX*)&m_waveFormat,
SoundEffectInstance_Default,
false,
&ptmpSrcVoice
);

// Add source voice to smart pointer
m_pSourceVoice.reset(ptmpSrcVoice);

// Set the input volume
if (this->m_inputVolume != 1.0f) {
hr = m_pSourceVoice->SetVolume(this->m_inputVolume);
}

hr = m_pSourceVoice->Start(0);

this->m_retryAudio = FALSE;

return hr;
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector