From 846c00c885cc308642ecd3fba747c67415a7f928 Mon Sep 17 00:00:00 2001 From: Stephen Saunders Date: Sat, 5 Feb 2022 20:39:53 -0500 Subject: [PATCH] Fix XAudio2 cinematic audio and restore Windows build (cherry picked from commit f09a3083e220f1a715816e097e0e5342ca48456d) --- neo/CMakeLists.txt | 4 ++-- neo/renderer/Cinematic.cpp | 5 ++++- neo/sound/OpenAL/AL_CinematicAudio.h | 7 ++++--- neo/sound/XAudio2/XA2_CinematicAudio.cpp | 13 ++++++++++++- neo/sound/XAudio2/XA2_CinematicAudio.h | 5 +---- neo/sound/XAudio2/XA2_SoundHardware.cpp | 2 +- 6 files changed, 24 insertions(+), 12 deletions(-) diff --git a/neo/CMakeLists.txt b/neo/CMakeLists.txt index ac465cf5..33cd0bd2 100644 --- a/neo/CMakeLists.txt +++ b/neo/CMakeLists.txt @@ -1537,7 +1537,7 @@ if(MSVC) include_directories(libs/ffmpeg-win64/include) include_directories(libs/ffmpeg-win64/include/libswscale) include_directories(libs/ffmpeg-win64/include/libavformat) - include_directories(libs/ffmpeg-win64/include/libavutil) + include_directories(libs/ffmpeg-win64/include/libavdevice) include_directories(libs/ffmpeg-win64/include/libavcodec) include_directories(libs/ffmpeg-win64/include/libswresample) @@ -1546,7 +1546,7 @@ if(MSVC) include_directories(libs/ffmpeg-win32/include) include_directories(libs/ffmpeg-win32/include/libswscale) include_directories(libs/ffmpeg-win32/include/libavformat) - include_directories(libs/ffmpeg-win32/include/libavutil) + include_directories(libs/ffmpeg-win32/include/libavdevice) include_directories(libs/ffmpeg-win32/include/libavcodec) include_directories(libs/ffmpeg-win32/include/libswresample) diff --git a/neo/renderer/Cinematic.cpp b/neo/renderer/Cinematic.cpp index 63b722aa..d82b5268 100644 --- a/neo/renderer/Cinematic.cpp +++ b/neo/renderer/Cinematic.cpp @@ -71,6 +71,9 @@ extern "C" #include #include } +// SRS - For handling cinematic audio packets +#include +#define NUM_PACKETS 4 bool hasplanar = true; #endif @@ -127,7 +130,7 @@ private: cinData_t ImageForTimeFFMPEG( int milliseconds ); bool InitFromFFMPEGFile( const char* qpath, bool looping ); void FFMPEGReset(); - std::queue packets[NUM_BUFFERS]; + std::queue packets[NUM_PACKETS]; #endif #ifdef USE_BINKDEC BinkHandle binkHandle; diff --git a/neo/sound/OpenAL/AL_CinematicAudio.h b/neo/sound/OpenAL/AL_CinematicAudio.h index 7b6d7784..a9ed7200 100644 --- a/neo/sound/OpenAL/AL_CinematicAudio.h +++ b/neo/sound/OpenAL/AL_CinematicAudio.h @@ -29,9 +29,10 @@ #else #include #endif -#include #ifndef __CINEMATIC_AUDIO_AL_H__ #define __CINEMATIC_AUDIO_AL_H__ + +#include #define NUM_BUFFERS 4 class CinematicAudio_OpenAL: public CinematicAudio @@ -50,10 +51,10 @@ private: bool trigger; //GK: Unlike XAudio2 which can accept buffer until the end of this world. - // OpenAL can accept buffers as long as there are freely available buffers. + // OpenAL can accept buffers only as long as there are freely available buffers. // So, what happens if there are no freely available buffers but we still geting audio frames ? Loss of data. // That why now I am using two queues in order to store the frames (and their sizes) and when we have available buffers, - // then start poping those frames instead of the current, so we don't lose any audio frames and the sound doesn't crack anymore. + // then start popping those frames instead of the current, so we don't lose any audio frames and the sound doesn't crack anymore. std::queue tBuffer[NUM_BUFFERS]; std::queue sizes[NUM_BUFFERS]; }; diff --git a/neo/sound/XAudio2/XA2_CinematicAudio.cpp b/neo/sound/XAudio2/XA2_CinematicAudio.cpp index 89ed06c7..32c49a28 100644 --- a/neo/sound/XAudio2/XA2_CinematicAudio.cpp +++ b/neo/sound/XAudio2/XA2_CinematicAudio.cpp @@ -33,6 +33,11 @@ extern "C" } #endif +CinematicAudio_XAudio2::CinematicAudio_XAudio2(): + pMusicSourceVoice1(NULL) +{ +} + void CinematicAudio_XAudio2::InitAudio( void* audioContext ) { //SRS - This InitAudio() implementation is FFMPEG-only until we have a BinkDec solution as well @@ -55,6 +60,12 @@ void CinematicAudio_XAudio2::InitAudio( void* audioContext ) format_byte = 2; break; } + case AV_SAMPLE_FMT_S32: + case AV_SAMPLE_FMT_S32P: + { + format_byte = 4; + break; + } case AV_SAMPLE_FMT_FLT: case AV_SAMPLE_FMT_FLTP: { @@ -103,7 +114,7 @@ void CinematicAudio_XAudio2::InitAudio( void* audioContext ) exvoice.Samples.wValidBitsPerSample = voiceFormatcine.wBitsPerSample; exvoice.Samples.wSamplesPerBlock = voiceFormatcine.wBitsPerSample; exvoice.SubFormat = use_ext ? KSDATAFORMAT_SUBTYPE_IEEE_FLOAT : KSDATAFORMAT_SUBTYPE_PCM; - ( ( IXAudio2* )soundSystemLocal.GetInternal() )->CreateSourceVoice( &pMusicSourceVoice1, ( WAVEFORMATEX* )&exvoice, XAUDIO2_VOICE_USEFILTER ); //Use the XAudio2 that the game has initialized instead of making your own + ( ( IXAudio2* )soundSystemLocal.GetIXAudio2() )->CreateSourceVoice( &pMusicSourceVoice1, ( WAVEFORMATEX* )&exvoice, XAUDIO2_VOICE_USEFILTER ); // Use the XAudio2 that the game has initialized instead of making our own #endif } diff --git a/neo/sound/XAudio2/XA2_CinematicAudio.h b/neo/sound/XAudio2/XA2_CinematicAudio.h index bc845a15..5c64a972 100644 --- a/neo/sound/XAudio2/XA2_CinematicAudio.h +++ b/neo/sound/XAudio2/XA2_CinematicAudio.h @@ -30,10 +30,7 @@ class CinematicAudio_XAudio2: public CinematicAudio { public: - CinematicAudio_XAudio2(): - pMusicSourceVoice1( NULL ) - { - } + CinematicAudio_XAudio2(); void InitAudio( void* audioContext ); void PlayAudio( uint8_t* data, int size ); void ShutdownAudio(); diff --git a/neo/sound/XAudio2/XA2_SoundHardware.cpp b/neo/sound/XAudio2/XA2_SoundHardware.cpp index cdd7dfaa..4474cab5 100644 --- a/neo/sound/XAudio2/XA2_SoundHardware.cpp +++ b/neo/sound/XAudio2/XA2_SoundHardware.cpp @@ -434,7 +434,7 @@ void idSoundHardware_XAudio2::Init() pMasterVoice->GetChannelMask( &win8_channelMask ); channelMask = ( unsigned int )win8_channelMask; - idLib::Printf( "Using device %S\n", selectedDevice.name ); + idLib::Printf( "Using device: %S\n", selectedDevice.name.c_str() ); } else {