Пример #1
0
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;
}