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 if (digi_last_midi_song != filename) {
65 strcpy( digi_last_midi_song, filename );
66 strcpy( digi_last_melodic_bank, melodic_bank );
67 strcpy( digi_last_drum_bank, drum_bank );
70 if ( midi_volume < 1 )
71 return; // Don't play song if volume == 0;
73 // initialize the song
74 if (cfexist(filename)) {
75 mprintf((0, "Loading %s\n", filename));
76 hmp2mid(filename, &SongData, &SongSize);
77 rw = SDL_RWFromConstMem(SongData, SongSize);
78 SongHandle = Mix_LoadMUS_RW(rw);
86 // load .mid version, if available
87 sl = (int)strlen( filename );
88 strcpy( fname, filename );
94 mprintf((0, "Loading %s\n", fname));
95 fp = cfopen( fname, "rb" );
97 SongSize = cfilelength( fp );
98 SongData = d_calloc(SongSize, 1);
99 if (SongData == NULL) {
101 mprintf( (1, "Error allocating %d bytes for '%s'", SongSize, filename ));
105 if ( cfread ( SongData, SongSize, 1, fp ) != 1 ) {
106 mprintf( (1, "Error reading midi file, '%s'", filename ));
114 rw = SDL_RWFromConstMem(SongData, SongSize);
115 SongHandle = Mix_LoadMUS_RW(rw);
120 mprintf( (1, "MIDI Error : %s\n", Mix_GetError()));
126 // start the song playing
127 Mix_PlayMusic(SongHandle, (loop ? -1 : 1));
128 Mix_HookMusicFinished(digi_stop_current_song);
134 void digi_stop_current_song()
136 if (!Digi_initialized) return;
140 // stop the last MIDI song from playing
142 // uninitialize the last MIDI song
143 Mix_FreeMusic( SongHandle );
153 void digi_pause_midi()
155 if (!Digi_initialized) return;
161 void digi_resume_midi()
163 if (!Digi_initialized) return;