summaryrefslogtreecommitdiff
path: root/plugins/gme/Game_Music_Emu-0.5.2/demo/cpp_basics.cpp
blob: 53fab4186aa2209fd93b253f4569b93b1f304ad0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// C++ example that opens a game music file and records 10 seconds to "out.wav"

static char filename [] = "test.nsf"; /* opens this file (can be any music type) */

#include "gme/Music_Emu.h"

#include "Wave_Writer.h"
#include <stdlib.h>
#include <stdio.h>

void handle_error( const char* str );

int main()
{
	long sample_rate = 44100; // number of samples per second
	int track = 0; // index of track to play (0 = first)
	
	// Determine file type
	gme_type_t file_type;
	handle_error( gme_identify_file( filename, &file_type ) );
	if ( !file_type )
		handle_error( "Unsupported music type" );
	
	// Create emulator and set sample rate
	Music_Emu* emu = file_type->new_emu();
	if ( !emu )
		handle_error( "Out of memory" );
	handle_error( emu->set_sample_rate( sample_rate ) );
	
	// Load music file into emulator
	handle_error( emu->load_file( filename ) );
	
	// Start track
	handle_error( emu->start_track( track ) );
	
	// Begin writing to wave file
	Wave_Writer wave( sample_rate, "out.wav" );
	wave.enable_stereo();
	
	// Record 10 seconds of track
	while ( emu->tell() < 10 * 1000L )
	{
		// Sample buffer
		const long size = 1024; // can be any multiple of 2
		short buf [size];
		
		// Fill buffer
		handle_error( emu->play( size, buf ) );
		
		// Write samples to wave file
		wave.write( buf, size );
	}
	
	// Cleanup
	delete emu;
	
	return 0;
}

void handle_error( const char* str )
{
	if ( str )
	{
		printf( "Error: %s\n", str ); getchar();
		exit( EXIT_FAILURE );
	}
}