From 33b74a7b25542b2a66d69e1c63e69ec9a1986ae8 Mon Sep 17 00:00:00 2001 From: Robert Beckebans Date: Thu, 2 May 2024 19:48:14 +0200 Subject: [PATCH] extractResourceFiles can export .wav files. closes #166 --- base/extract_resources.cfg | 1 + neo/cmake-vs2019-openal.bat | 2 +- neo/framework/File_Resource.cpp | 36 ++++++++++++++--------------- neo/sound/OpenAL/AL_SoundSample.cpp | 2 +- neo/sound/WaveFile.cpp | 16 ++++++++++--- 5 files changed, 34 insertions(+), 23 deletions(-) diff --git a/base/extract_resources.cfg b/base/extract_resources.cfg index dd057838..d5073439 100644 --- a/base/extract_resources.cfg +++ b/base/extract_resources.cfg @@ -2,6 +2,7 @@ extractResourceFile _common.resources baseref extractResourceFile _ordered.resources baseref extractResourceFile _sound_pc.resources baseref copysound extractResourceFile _sound_pc_en.resources baseref copysound +extractResourceFile _sound_pc_gr.resources baseref copysound extractResourceFile maps/admin.resources baseref extractResourceFile maps/alphalabs1.resources baseref diff --git a/neo/cmake-vs2019-openal.bat b/neo/cmake-vs2019-openal.bat index 5af677a0..21919186 100644 --- a/neo/cmake-vs2019-openal.bat +++ b/neo/cmake-vs2019-openal.bat @@ -2,5 +2,5 @@ cd .. del /s /q build mkdir build cd build -cmake -G "Visual Studio 16" -A x64 -DUSE_OPENAL=ON ../neo +cmake -G "Visual Studio 16" -A x64 -DOPENAL=ON ../neo pause \ No newline at end of file diff --git a/neo/framework/File_Resource.cpp b/neo/framework/File_Resource.cpp index 48fbe0d7..d0e68339 100644 --- a/neo/framework/File_Resource.cpp +++ b/neo/framework/File_Resource.cpp @@ -3,6 +3,7 @@ Doom 3 BFG Edition GPL Source Code Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. +Copyright (C) 2024 Robert Beckebans This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). @@ -29,6 +30,9 @@ If you have questions concerning this license or the applicable additional terms #include "precompiled.h" #pragma hdrstop +#include "../sound/WaveFile.h" +#include "../renderer/CmdlineProgressbar.h" + /* ================================================================================================ @@ -330,8 +334,6 @@ void idResourceContainer::SetContainerIndex( const int& _idx ) idResourceContainer::ExtractResourceFile ======================== */ -#include "../sound/WaveFile.h" - void idResourceContainer::ExtractResourceFile( const char* _fileName, const char* _outPath, bool _copyWavs, bool _all ) { idFile* inFile = fileSystem->OpenFileRead( _fileName ); @@ -350,6 +352,8 @@ void idResourceContainer::ExtractResourceFile( const char* _fileName, const char return; } + common->Printf( "extracting resource file %s\n", _fileName ); + int _tableOffset; int _tableLength; inFile->ReadBig( _tableOffset ); @@ -363,6 +367,12 @@ void idResourceContainer::ExtractResourceFile( const char* _fileName, const char int _numFileResources; memFile.ReadBig( _numFileResources ); + CommandlineProgressBar progressBar( _numFileResources, renderSystem->GetWidth(), renderSystem->GetHeight() ); + if( _copyWavs ) + { + progressBar.Start(); + } + for( int i = 0; i < _numFileResources; i++ ) { idResourceCacheEntry rt; @@ -373,14 +383,6 @@ void idResourceContainer::ExtractResourceFile( const char* _fileName, const char if( _copyWavs && ( rt.filename.Find( ".idwav" ) >= 0 || rt.filename.Find( ".idxma" ) >= 0 || rt.filename.Find( ".idmsf" ) >= 0 ) ) { - // TODO make this work #166 - - //rt.filename.SetFileExtension( "wav" ); - //rt.filename.Replace( "generated/", "" ); - int len = fileSystem->GetFileLength( rt.filename ); - //fbuf = ( byte* )Mem_Alloc( len, TAG_RESOURCE ); - //fileSystem->ReadFile( rt.filename, ( void** )&fbuf, NULL ); - idFileLocal fileIn( fileSystem->OpenFileReadMemory( rt.filename ) ); if( fileIn != NULL ) { @@ -439,9 +441,9 @@ void idResourceContainer::ExtractResourceFile( const char* _fileName, const char idFileLocal fileOut( fileSystem->OpenExplicitFileWrite( outName ) ); if( fileOut != NULL ) { - common->Printf( "writing %s\n", outName.c_str() ); + //common->Printf( "writing %s\n", outName.c_str() ); - uint32 fileSize = 12 + 24 + format.extraSize + 4 + totalBufferSize; + uint32 fileSize = 12 + 24 + 2 + format.extraSize + 8 + totalBufferSize; fileSize -= 8; idWaveFile::WriteHeaderDirect( fileSize, fileOut ); @@ -454,11 +456,6 @@ void idResourceContainer::ExtractResourceFile( const char* _fileName, const char { Mem_Free( buffers[ i ].buffer ); } - - // just export the first file for testing - delete inFile; - Mem_Free( buf ); - return; } } else @@ -496,7 +493,10 @@ void idResourceContainer::ExtractResourceFile( const char* _fileName, const char Mem_Free( fbuf ); } - + if( _copyWavs ) + { + progressBar.Increment( true ); + } } delete inFile; Mem_Free( buf ); diff --git a/neo/sound/OpenAL/AL_SoundSample.cpp b/neo/sound/OpenAL/AL_SoundSample.cpp index 369cbf08..b4bbee22 100644 --- a/neo/sound/OpenAL/AL_SoundSample.cpp +++ b/neo/sound/OpenAL/AL_SoundSample.cpp @@ -107,7 +107,7 @@ void idSoundSample_OpenAL::WriteGeneratedSample( idFile* fileOut ) fileOut->WriteBig( loaded ); fileOut->WriteBig( playBegin ); fileOut->WriteBig( playLength ); - idWaveFile::WriteWaveFormatDirect( format, fileOut ); + idWaveFile::WriteWaveFormatDirect( format, fileOut, false ); fileOut->WriteBig( ( int )amplitude.Num() ); fileOut->Write( amplitude.Ptr(), amplitude.Num() ); fileOut->WriteBig( totalBufferSize ); diff --git a/neo/sound/WaveFile.cpp b/neo/sound/WaveFile.cpp index bd1402c2..1e15cc38 100644 --- a/neo/sound/WaveFile.cpp +++ b/neo/sound/WaveFile.cpp @@ -427,11 +427,19 @@ bool idWaveFile::WriteWaveFormatDirect( waveFmt_t& format, idFile* file, bool wa //swap.Little( format.basic.blockSize ); //swap.Little( format.basic.bitsPerSample ); - // RB begin + // RB: this is also called by .idwav saving code and it was missing if( wavFile ) { file->WriteBig( format.id ); - file->WriteUnsignedInt( sizeof( format.basic ) ); + + if( format.basic.formatTag != FORMAT_PCM ) + { + file->WriteUnsignedInt( sizeof( format.basic ) + 2 + format.extraSize ); + } + else + { + file->WriteUnsignedInt( sizeof( format.basic ) ); + } } // RB end @@ -462,6 +470,7 @@ bool idWaveFile::WriteWaveFormatDirect( waveFmt_t& format, idFile* file, bool wa { return false; } + return true; } @@ -518,7 +527,8 @@ bool idWaveFile::WriteDataDirect( char* _data, uint32 size, idFile* file ) static const uint32 data = 'data'; file->WriteBig( data ); file->Write( &size, sizeof( uint32 ) ); - file->WriteBigArray( _data, size ); + //file->WriteBigArray( _data, size ); // RB: this is super slow + file->Write( _data, size ); return true; }