PRIVATE void CA_SaveMusicChunk( W32 chunk, const char *filename ) { W8 *data, *BuffWav; W32 pos, length, uncompr_length; W32 len; pos = audiostarts[ chunk ]; length = audiostarts[ chunk+1 ] - pos; data = MM_MALLOC( length ); if( data == NULL ) { return; } if( fseek( audiohandle, pos, SEEK_SET ) != 0 ) { printf( "[CA_SaveMusicChunk]: Could not seek!\n" ); MM_FREE( data ); return; } if( fread( data, 1, length, audiohandle ) != length ) { printf( "[CA_SaveMusicChunk]: Read error!\n" ); MM_FREE( data ); return; } uncompr_length = ADLIB_getLength( data ); if( uncompr_length == 1 ) { MM_FREE( data ); return; } ADLIB_LoadMusic( data ); BuffWav = MM_MALLOC( uncompr_length * 64 * 2 ); if( BuffWav == NULL ) { MM_FREE( data ); return; } len = ADLIB_UpdateMusic( uncompr_length, BuffWav ); #if 1 vorbis_encode( filename, BuffWav, len, 1, 16, 44100, 0, 0, 0 ); #else write_wav( filename, BuffWav, len, 1, 44100, 2 ); #endif MM_FREE( BuffWav ); MM_FREE( data ); }
/** * \brief Decode music chunks * \param[in] start Start of music chunks. * \param[in] end End of music chunks. * \param[in] songNames Song titles. * \return On success true, otherwise false. */ PUBLIC wtBoolean AudioFile_ReduxDecodeMusic( const W32 start, const W32 end, const char *path, char *songNames[] ) { SW8 *buffChunk; void *buffWav; W32 i; W32 length; char filename[ 1024 ]; W32 uncompr_length; printf( "Decoding Music (This could take a while)..." ); if( ! ADLIB_Init( 44100 ) ) { return false; } for( i = start ; i < end ; ++i ) { buffChunk = (PSW8) AudioFile_CacheAudioChunk( i ); if( buffChunk == NULL ) { continue; } uncompr_length = ADLIB_getLength( buffChunk ); if( uncompr_length <= 1 ) { MM_FREE( buffChunk ); continue; } ADLIB_LoadMusic( buffChunk ); buffWav = MM_MALLOC( uncompr_length * 64 * 2 ); if( buffWav == NULL ) { MM_FREE( buffChunk ); continue; } length = ADLIB_UpdateMusic( uncompr_length, buffWav ); #ifdef BIG_ENDIAN_SYSTEM AudioFile_dataByteSwap( buffWav, length ); #endif // Save audio buffer if( _saveMusicAsWav ) { if( songNames ) { wt_snprintf( filename, sizeof( filename ), "%s%c%s.wav", path, PATH_SEP, songNames[ i - start ] ); } else { wt_snprintf( filename, sizeof( filename ), "%s%c%d.wav", path, PATH_SEP, i - start ); } wav_write( filename, buffWav, length, 1, 44100, 2 ); } else { if( songNames ) { wt_snprintf( filename, sizeof( filename ), "%s%c%s.ogg", path, PATH_SEP, songNames[ i - start ] ); } else { wt_snprintf( filename, sizeof( filename ), "%s%c%d.ogg", path, PATH_SEP, i - start ); } vorbis_encode( filename, buffWav, length, 1, 16, 44100, 0, 0, 0 ); } MM_FREE( buffWav ); MM_FREE( buffChunk ); } ADLIB_Shutdown(); printf( "Done\n" ); return true; }