extractResourceFiles can export .wav files. closes #166

This commit is contained in:
Robert Beckebans 2024-05-02 19:48:14 +02:00
parent 6966fda776
commit 33b74a7b25
5 changed files with 34 additions and 23 deletions

View file

@ -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

View file

@ -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

View file

@ -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 );

View file

@ -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 );

View file

@ -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;
}