Почему XAudio2 воспроизводит файлы .wav только тогда, когда система приостановлена? - PullRequest
0 голосов
/ 03 июня 2018

Я следовал учебному пособию на веб-сайте Microsoft и создал собственную структуру классов SoundEngine и Sound, чтобы абстрагировать код в основном, однако всякий раз, когда я выполняю вызов, такой как batmanWav->play(), он будет воспроизводить звук только в том случае, еслиЯ пишу std::cin.get() или system("PAUSE")

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

РЕДАКТИРОВАТЬ: меня попросили показать код, которыйимеет проблемы

int main() 
{
CoInitializeEx(nullptr, COINIT_MULTITHREADED);

Sound batman("batman.wav");
Sound alien("alien.wav");

alien.play();

batman.play();
system("PAUSE");
CoUninitialize();

}

Sound.cpp

HRESULT Sound::play()
{
HRESULT hr = S_OK;
if (FAILED(hr = pSourceVoice->Start(0)))
    return hr;

return hr;
}

Для каждого объекта Sound я инициализировал исходный голос, и каждый ссылается на один и тот же мастер-голос и объект IXAudio2 *pXAudio2.Код, который я использовал для загрузки данных волнового файла, был взят прямо из документов MSDN.

1 Ответ

0 голосов
/ 05 июня 2018

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

Другими словами, когда вы вызываете IXAudio2SourceVoice::Start, ничего не происходит, кромеон регистрирует, что вы хотите запустить аудио.Другой поток, который был создан как часть вашего IXAudio2 объекта, затем видит запрос и начинает обрабатывать запрос воспроизведения.К этому моменту ваше приложение закрылось, и процесс прекратился, если вы не сделали «паузу».

Попробуйте что-то вроде следующего из XAudio2BasicSound:

hr = pSourceVoice->Start( 0 );

// Let the sound play
BOOL isRunning = TRUE;
while( SUCCEEDED( hr ) && isRunning )
{
    XAUDIO2_VOICE_STATE state;
    pSourceVoice->GetState( &state );
    isRunning = ( state.BuffersQueued > 0 ) != 0;

    Sleep( 10 );
}

Вы должны посмотреть наэти сэмплы и набор инструментов DirectX для аудио .

...