]> icculus.org git repositories - btb/d2x.git/blob - arch/sdl/midi.c
use the orientation parameter of g3_draw_bitmap
[btb/d2x.git] / arch / sdl / midi.c
1 /*
2  *
3  * SDL midi support
4  *
5  *
6  */
7
8 #ifdef HAVE_CONFIG_H
9 #include <conf.h>
10 #endif
11
12 #include "SDL.h"
13 #include "SDL_mixer.h"
14
15 #include "mono.h"
16 #include "inferno.h"
17 #include "u_mem.h"
18 #include "physfsrwops.h"
19 #include "hmp.h"
20
21
22 extern int Digi_initialized;
23
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] = "";
28
29 // handle for the initialized MIDI song
30 Mix_Music *SongHandle = NULL;
31 ubyte *SongData = NULL;
32 unsigned int SongSize;
33
34
35 void digi_set_midi_volume( int mvolume )
36 {
37         int old_volume = midi_volume;
38
39         if ( mvolume > 127 )
40                 midi_volume = 127;
41         else if ( mvolume < 0 )
42                 midi_volume = 0;
43         else
44                 midi_volume = mvolume;
45
46         if (!Redbook_playing && (old_volume < 1) && ( midi_volume > 1 ) ) {
47                 if (!SongHandle)
48                         digi_play_midi_song( digi_last_midi_song, digi_last_melodic_bank, digi_last_drum_bank, 1 );
49         }
50         Mix_VolumeMusic(midi_volume);
51 }
52
53
54 void digi_play_midi_song( char *filename, char *melodic_bank, char *drum_bank, int loop )
55 {
56         SDL_RWops *rw = NULL;
57
58         if (!Digi_initialized) return;
59
60         digi_stop_current_song();
61
62         if ( filename == NULL ) return;
63
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 );
68         }
69
70         if ( midi_volume < 1 )
71                 return; // Don't play song if volume == 0;
72
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);
79         }
80
81         if (!SongHandle) {
82                 char fname[128];
83                 CFILE *fp;
84                 int sl;
85
86                 // load .mid version, if available
87                 sl = (int)strlen( filename );
88                 strcpy( fname, filename );
89                 fname[sl-3] = 'm';
90                 fname[sl-2] = 'i';
91                 fname[sl-1] = 'd';
92
93                 if (cfexist(fname)) {
94                         mprintf((0, "Loading %s\n", fname));
95                         fp = cfopen( fname, "rb" );
96
97                         SongSize = cfilelength( fp );
98                         SongData = d_calloc(SongSize, 1);
99                         if (SongData == NULL) {
100                                 cfclose(fp);
101                                 mprintf( (1, "Error allocating %d bytes for '%s'", SongSize, filename ));
102                                 return;
103                         }
104
105                         if ( cfread ( SongData, SongSize, 1, fp ) != 1 ) {
106                                 mprintf( (1, "Error reading midi file, '%s'", filename ));
107                                 cfclose(fp);
108                                 d_free(SongData);
109                                 return;
110                         }
111
112                         cfclose(fp);
113
114                         rw = SDL_RWFromConstMem(SongData, SongSize);
115                         SongHandle = Mix_LoadMUS_RW(rw);
116                 }
117         }
118
119         if (!SongHandle) {
120                 mprintf( (1, "MIDI Error : %s\n", Mix_GetError()));
121                 if (SongData)
122                         d_free(SongData);
123                 return;
124         }
125
126         // start the song playing
127         Mix_PlayMusic(SongHandle, (loop ? -1 : 1));
128         Mix_HookMusicFinished(digi_stop_current_song);
129
130         return;
131 }
132
133
134 void digi_stop_current_song()
135 {
136         if (!Digi_initialized) return;
137
138         // Stop last song...
139         if (SongHandle) {
140                 // stop the last MIDI song from playing
141                 Mix_HaltMusic();
142                 // uninitialize the last MIDI song
143                 Mix_FreeMusic( SongHandle );
144                 SongHandle = NULL;
145         }
146         if (SongData) {
147                 d_free(SongData);
148                 SongData = NULL;
149         }
150 }
151
152
153 void digi_pause_midi()
154 {
155         if (!Digi_initialized) return;
156         
157         Mix_PauseMusic();
158 }
159
160
161 void digi_resume_midi()
162 {
163         if (!Digi_initialized) return;
164         
165         Mix_ResumeMusic();
166 }