DirectX SDK, июнь 2010 г.: сбой XAudio2 при каждом выходе из приложения - PullRequest
0 голосов
/ 11 мая 2019

Я разрабатываю игровой движок C ++ на основе Direct3D 9 и XAudio 2.7. И у меня возникает одна и та же проблема каждый раз, когда я выхожу из тестовой игры: XAudio вылетает. Я уверен, что именно этот компонент вызывает проблему, потому что, когда я удаляю вызов инициализации, игра завершается без проблем.

Поле исключения

Я не знаю почему, я настроил весь базовый код (инициализация, мастеринг голоса, аудио компоненты, очистка всех буферов и завершение работы с -> Release ();), пробовал с XAudio 3D и без него .. .

Если вы уже это испытали, вы можете помочь. Спасибо.

Я использую 64-разрядную версию Windows 10 Pro

Код:

AudioEngineXA2::AudioEngineXA2()
{
    m_xaudio2 = 0;
    m_xa2MasteringVoice = 0;

    m_x3d = 0;
}

void AudioEngineXA2::initialize()
{
    if ( XAudio2Create( &m_xaudio2, 0 ) < 0 || m_xaudio2->CreateMasteringVoice( &m_xa2MasteringVoice ) < 0 )
    {
        cout << "XAudio2 initialization failed!" << endl;
        return;
    }

    //X3DAudioInitialize( SPEAKER_STEREO, X3DAUDIO_SPEED_OF_SOUND, (unsigned char*) m_x3d );

    // Uncommenting this part doesn't help either
    /*XAUDIO2_DEVICE_DETAILS* devdet = 0;
    m_xaudio2->GetDeviceDetails(0, devdet);

    float* matrix = new float[devdet->OutputFormat.Format.nChannels];
    DSPSettings.SrcChannelCount = 1;
    DSPSettings.DstChannelCount = devdet->OutputFormat.Format.nChannels;
    DSPSettings.pMatrixCoefficients = matrix;*/
}

void AudioEngineXA2::cleanup()
{
    m_xa2MasteringVoice->DestroyVoice();

    m_xaudio2->StopEngine();
    m_xaudio2->Release();
    //if ( m_x3d ) { delete[] m_x3d; m_x3d = 0; }
}

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Итак, в конце концов я взглянул на образцы DirectX SDK и обнаружил, что для инициализации XAudio2 (и deinit) потребовались две другие строки, которые были в буквальном смысле упомянуты в основном ни в одном из всех руководств по XAudio2 по всему Интернету..

Вам нужно вызвать "CoInitializeEx (0, COINIT_MULTITHREADED);"перед "XAudio2Create ();"и "CoUninitialize ();"после выпуска XAudio2.

0 голосов
/ 12 мая 2019

Ключевым моментом, который следует помнить о XAudio2, является то, что большая часть функций является асинхронной, и вы, разработчик приложения, несете ответственность за сохранение исходной аудиопамяти «живой», пока XAudio2 не завершит работу с ней. Таким образом, вы должны быть очень осторожны с продолжительностью жизни и отключением.

Возможно, вы захотите взглянуть на DirectX Tool Kit для аудио , в котором есть базовый менеджер звука и система воспроизведения для XAudio2.

Проблема, которую вы описываете, очень похожа на эту проблему с XAudio 2.7 : подробности и обходные пути см. в этом блоге .

Поддержка Windows Vista не так важна, но для Windows 7 с пакетом обновления 1 (SP1) все еще требуется использовать XAudio 2.7 и устаревший DirectX SDK и устаревший DirectSetup REDIST . Если ваш минимум - Windows 8.x или Windows 10, то вы можете рассчитывать на то, что XAudio 2.8 или 2.9 будут доступны как часть ОС. Подробнее см. в этом блоге .

...