13 #include "SDL_mixer.h"
18 #include "physfsrwops.h"
22 extern int Digi_initialized;
24 static int midi_volume = 128 / 2; // Max volume
25 char digi_last_midi_song[16] = "";
26 char digi_last_melodic_bank[16] = "";
27 char digi_last_drum_bank[16] = "";
29 // handle for the initialized MIDI song
30 Mix_Music *SongHandle = NULL;
31 ubyte *SongData = NULL;
32 unsigned int SongSize;
35 void digi_set_midi_volume( int mvolume )
37 int old_volume = midi_volume;
41 else if ( mvolume < 0 )
44 midi_volume = mvolume;
46 if (!Redbook_playing && (old_volume < 1) && ( midi_volume > 1 ) ) {
48 digi_play_midi_song( digi_last_midi_song, digi_last_melodic_bank, digi_last_drum_bank, 1 );
50 Mix_VolumeMusic(midi_volume);
54 void digi_play_midi_song( char *filename, char *melodic_bank, char *drum_bank, int loop )
58 if (!Digi_initialized) return;
60 digi_stop_current_song();
62 if ( filename == NULL ) return;
64 strcpy( digi_last_midi_song, filename );
65 strcpy( digi_last_melodic_bank, melodic_bank );
66 strcpy( digi_last_drum_bank, drum_bank );
68 if ( midi_volume < 1 )
69 return; // Don't play song if volume == 0;
71 // initialize the song
72 mprintf((0, "Loading %s\n", filename));
73 hmp2mid(filename, &SongData, &SongSize);
74 rw = SDL_RWFromConstMem(SongData, SongSize);
75 SongHandle = Mix_LoadMUS_RW(rw);
82 // load .mid version, if available
83 sl = (int)strlen( filename );
84 strcpy( fname, filename );
89 mprintf((0, "Loading %s\n", fname));
90 fp = cfopen( fname, "rb" );
92 SongSize = cfilelength( fp );
93 SongData = d_calloc(SongSize, 1);
94 if (SongData == NULL) {
96 mprintf( (1, "Error allocating %d bytes for '%s'", SongSize, filename ));
100 if ( cfread ( SongData, SongSize, 1, fp ) != 1 ) {
101 mprintf( (1, "Error reading midi file, '%s'", filename ));
109 rw = SDL_RWFromConstMem(SongData, SongSize);
110 SongHandle = Mix_LoadMUS_RW(rw);
114 mprintf( (1, "MIDI Error : %s\n", Mix_GetError()));
120 // start the song playing
121 Mix_PlayMusic(SongHandle, (loop ? -1 : 1));
122 Mix_HookMusicFinished(digi_stop_current_song);
128 void digi_stop_current_song()
130 if (!Digi_initialized) return;
134 // stop the last MIDI song from playing
136 // uninitialize the last MIDI song
137 Mix_FreeMusic( SongHandle );
147 void digi_pause_midi()
149 if (!Digi_initialized) return;
155 void digi_resume_midi()
157 if (!Digi_initialized) return;