1 #include <string.h>
2 #include <stdlib.h>
3 #include "u_mem.h"
4 #include "mono.h"
5 #include "allg_snd.h"
6 #include "digi.h"
7 #include "timer.h"
8
9 int midi_volume = 128/2; // Max volume
10 char digi_last_midi_song[16] = "";
11 char digi_last_melodic_bank[16] = "";
12 char digi_last_drum_bank[16] = "";
13 int digi_midi_type = 0; // Midi driver type
14 int digi_midi_port = 0; // Midi driver port
15
16 // handle for the initialized MIDI song
17 MIDI *SongHandle = NULL;
18
digi_set_midi_volume(int mvolume)19 void digi_set_midi_volume( int mvolume )
20 {
21 int old_volume = midi_volume;
22
23 if ( mvolume > 127 )
24 midi_volume = 127;
25 else if ( mvolume < 0 )
26 midi_volume = 0;
27 else
28 midi_volume = mvolume;
29
30 if ( (digi_midi_type > 0) ) {
31 if ( (old_volume < 1) && ( midi_volume > 1 ) ) {
32 if (SongHandle == NULL )
33 digi_play_midi_song( digi_last_midi_song, digi_last_melodic_bank, digi_last_drum_bank, 1 );
34 }
35 set_volume(-1, midi_volume * 2 + (midi_volume & 1));
36 }
37 }
38
digi_stop_current_song()39 void digi_stop_current_song()
40 {
41 if (SongHandle) {
42 destroy_midi(SongHandle);
43 SongHandle = NULL;
44 }
45 }
46
digi_play_midi_song(char * filename,char * melodic_bank,char * drum_bank,int loop)47 void digi_play_midi_song( char * filename, char * melodic_bank, char * drum_bank, int loop )
48 {
49 //char fname[128];
50
51 if ( digi_midi_type <= 0 ) return;
52
53 digi_stop_current_song();
54
55 if ( filename == NULL ) return;
56
57 strcpy( digi_last_midi_song, filename );
58 strcpy( digi_last_melodic_bank, melodic_bank );
59 strcpy( digi_last_drum_bank, drum_bank );
60
61 if ( midi_volume < 1 )
62 return;
63
64 SongHandle = NULL;
65
66 #if 0 /* needs bank loading to sound right */
67 if (midi_card <= 4) { /* FM cards */
68 int sl;
69 sl = strlen( filename );
70 strcpy( fname, filename );
71 fname[sl-1] = 'q';
72 SongHandle = load_hmp(fname);
73 }
74 #endif
75
76 if ( !SongHandle )
77 SongHandle = load_hmp(filename);
78
79 if (SongHandle) {
80 if (play_midi(SongHandle, loop)) {
81 destroy_midi(SongHandle);
82 SongHandle = NULL;
83 }
84 }
85 if (!SongHandle) {
86 mprintf( (1, "\nAllegro Error : %s", allegro_error ));
87 }
88 }
89
digi_midi_pause()90 void digi_midi_pause() {
91 if (digi_midi_type > 0 && SongHandle)
92 midi_pause();
93 }
94
digi_midi_resume()95 void digi_midi_resume() {
96 if (digi_midi_type > 0 && SongHandle)
97 midi_resume();
98 }
99
digi_midi_stop()100 void digi_midi_stop() {
101 if ( digi_midi_type > 0 ) {
102 if (SongHandle) {
103 destroy_midi(SongHandle);
104 SongHandle = NULL;
105 }
106 }
107
108 }
109
110 #ifndef ALLEGRO
111 extern int sb_hw_dsp_ver;
112
113 static int midi_timer_system_initialized = 0;
114 static int digi_midi_initialized = 0;
115
digi_midi_init()116 int digi_midi_init() {
117 if (!midi_timer_system_initialized)
118 {
119 allg_snd_init();
120 midi_timer_system_initialized = 1;
121 }
122 sb_hw_dsp_ver = 1; /* set SB as already detected, functionless */
123 if (!digi_midi_initialized) {
124 // amount of voices we need
125 // 16 for normal sounds and 16 for SoundObjects (fan, boss)
126 // for DIGMID we sacrify some sounds (32 is the max).
127 // reserve_voices(allegro_using_digmid() ? 16 : 32, -1);
128 if (install_sound(DIGI_NONE, MIDI_AUTODETECT, NULL))
129 return 1;
130 //set_volume(255, -1);
131 digi_midi_type = midi_card; // only for 0, !=0
132 }
133 digi_midi_initialized = 1;
134 digi_set_midi_volume( midi_volume );
135 return 0;
136 }
137
digi_midi_close()138 void digi_midi_close() {
139 remove_sound();
140 digi_midi_initialized = 0;
141
142 if ( midi_timer_system_initialized ) {
143 // Remove timer...
144 timer_set_function( NULL );
145 midi_timer_system_initialized = 0;
146 }
147 }
148 #endif
149