summaryrefslogtreecommitdiff
path: root/plugins/gme/Game_Music_Emu-0.5.2/demo/features.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/gme/Game_Music_Emu-0.5.2/demo/features.c')
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/demo/features.c149
1 files changed, 149 insertions, 0 deletions
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/demo/features.c b/plugins/gme/Game_Music_Emu-0.5.2/demo/features.c
new file mode 100644
index 00000000..96a9a8a9
--- /dev/null
+++ b/plugins/gme/Game_Music_Emu-0.5.2/demo/features.c
@@ -0,0 +1,149 @@
+/* C example that opens any music file type, opens an m3u playlist if present,
+prints its info and voice names, customizes the sound, and fades a track out.
+Records to "out.wav". */
+
+static char filename [] = "test.nsf"; /* opens this file (can be any music type) */
+static char playlist [] = "test.m3u"; /* uses this playlist, if present*/
+
+#include "gme/gme.h"
+
+#include "Wave_Writer.h" /* wave_ functions for writing sound file */
+#include <stdlib.h>
+#include <stdio.h>
+
+void handle_error( const char* );
+
+/* Example of loading from memory, which would be useful if using a zip file or
+other custom format. In this example it's silly because we could just use
+gme_load( &emu, sample_rate, path, 0 ). */
+Music_Emu* load_file( const char* path, long sample_rate )
+{
+ Music_Emu* emu;
+ char* data;
+ long size;
+
+ /* Read file data into memory. You might read the data from a zip file or
+ other compressed format. */
+ FILE* in = fopen( path, "rb" );
+ if ( !in )
+ handle_error( "Couldn't open file" );
+ fseek( in, 0, SEEK_END );
+ size = ftell( in );
+ rewind( in );
+
+ data = malloc( size );
+ if ( !data )
+ handle_error( "Out of memory" );
+ if ( fread( data, size, 1, in ) <= 0 )
+ handle_error( "Read error" );
+ fclose( in );
+
+ handle_error( gme_open_data( data, size, &emu, sample_rate ) );
+ free( data ); /* a copy is made of the data */
+ return emu;
+}
+
+/* Print any warning for most recent emulator action (load, start_track, play) */
+void print_warning( Music_Emu* emu )
+{
+ const char* warning = gme_warning( emu );
+ if ( warning )
+ printf( "**** Warning: %s\n\n", warning );
+}
+
+static char my_data [] = "Our cleanup function was called";
+
+/* Example cleanup function automatically called when emulator is deleted. */
+static void my_cleanup( void* my_data )
+{
+ printf( "\n%s\n", (char*) my_data );
+}
+
+int main()
+{
+ long sample_rate = 44100;
+ int track = 0; /* index of track to play (0 = first) */
+ int i;
+
+ /* Load file into emulator */
+ Music_Emu* emu = load_file( filename, sample_rate );
+ print_warning( emu );
+
+ /* Register cleanup function and confirmation string as data */
+ gme_set_user_data( emu, my_data );
+ gme_set_user_cleanup( emu, my_cleanup );
+
+ /* Load .m3u playlist file. All tracks are assumed to use current file.
+ We ignore error here in case there is no m3u file present. */
+ gme_load_m3u( emu, playlist );
+ print_warning( emu );
+
+ /* Get and print main info for track */
+ {
+ track_info_t info;
+ handle_error( gme_track_info( emu, &info, track ) );
+ printf( "System : %s\n", info.system );
+ printf( "Game : %s\n", info.game );
+ printf( "Author : %s\n", info.author );
+ printf( "Copyright: %s\n", info.copyright );
+ printf( "Comment : %s\n", info.comment );
+ printf( "Dumper : %s\n", info.dumper );
+ printf( "Tracks : %d\n", (int) info.track_count );
+ printf( "\n" );
+ printf( "Track : %d\n", (int) track + 1 );
+ printf( "Name : %s\n", info.song );
+ printf( "Length : %ld:%02ld",
+ (long) info.length / 1000 / 60, (long) info.length / 1000 % 60 );
+ if ( info.loop_length != 0 )
+ printf( " (endless)" );
+ printf( "\n\n" );
+ }
+
+ /* Print voice names */
+ for ( i = 0; i < gme_voice_count( emu ); i++ )
+ printf( "Voice %d: %s\n", i, gme_voice_names( emu ) [i] );
+
+ /* Add some stereo enhancement */
+ gme_set_stereo_depth( emu, 0.20 );
+
+ /* Adjust equalizer for crisp, bassy sound */
+ {
+ gme_equalizer_t eq;
+ eq.treble = 0.0;
+ eq.bass = 20;
+ gme_set_equalizer( emu, &eq );
+ }
+
+ /* Start track and begin fade at 10 seconds */
+ handle_error( gme_start_track( emu, track ) );
+ print_warning( emu );
+ gme_set_fade( emu, 10 * 1000L );
+
+ /* Record track until it ends */
+ wave_open( sample_rate, "out.wav" );
+ wave_enable_stereo();
+ while ( !gme_track_ended( emu ) )
+ {
+ #define buf_size 1024
+ short buf [buf_size];
+ handle_error( gme_play( emu, buf_size, buf ) );
+ print_warning( emu );
+ wave_write( buf, buf_size );
+ }
+
+ /* Cleanup */
+ gme_delete( emu );
+ wave_close();
+
+ getchar();
+ return 0;
+}
+
+void handle_error( const char* str )
+{
+ if ( str )
+ {
+ printf( "Error: %s\n", str ); getchar();
+ exit( EXIT_FAILURE );
+ }
+}