DirectX SDK, июнь 2010 г.: XAudio2 аварийно завершает работу при каждом выходе из приложения.

Я разрабатываю игровой движок 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; }
}

person Dave    schedule 11.05.2019    source источник
comment
Исключение выглядит так, будто что-то пытается получить доступ к несуществующей памяти. Есть множество причин, которые могут привести к этому. Невозможно сказать, что может вызывать эту проблему в вашем коде, не видя хотя бы часть вашего кода, в идеале MCVE. Кроме того, с какой стати вам использовать DirectX SDK почти 10-летней давности? То, что осталось от DirectX, практически навсегда перенесено в Windows SDK. Если вы ориентируетесь на Windows 10, используйте компоненты, поставляемые с последней версией Windows 10 SDK…   -  person Michael Kenzel    schedule 11.05.2019
comment
Я использую устаревшее программное обеспечение, потому что хочу работать с устаревшими платформами, такими как Windows Vista.   -  person Dave    schedule 11.05.2019
comment
Что ж, если вы работаете в Windows 10, я бы все же посоветовал использовать правильные заголовки и библиотеки для Windows 10, по крайней мере, на данный момент, чтобы вы могли исключить некоторые несовместимости библиотек как причину. После того, как вам удалось заставить ваш код правильно работать на вашем компьютере, вы можете начать беспокоиться о поддержке старых, неподдерживаемых платформ…   -  person Michael Kenzel    schedule 11.05.2019
comment
Вы уверены, что не можете настроить таргетинг на Vista с помощью последнего SDK? Пока вы используете DX9, вы должны без проблем ориентироваться на Vista. Так что постарайтесь разобраться в этом.   -  person Nikos C.    schedule 11.05.2019


Ответы (2)


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

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

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

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

ОБНОВЛЕНИЕ Теперь есть способ использовать последнюю версию XAudio 2.9 в Windows 7. См. Microsoft Docs.

person Chuck Walbourn    schedule 11.05.2019

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

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

person Dave    schedule 21.05.2019