]> icculus.org git repositories - btb/d2x.git/blob - arch/dos/midiallg.c
comments/formatting
[btb/d2x.git] / arch / dos / midiallg.c
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
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
39 void digi_stop_current_song()
40 {
41         if (SongHandle) {
42                 destroy_midi(SongHandle);
43                 SongHandle = NULL;
44         }
45 }
46
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
90 void digi_midi_pause() {
91        if (digi_midi_type > 0 && SongHandle)
92                midi_pause();
93 }
94
95 void digi_midi_resume() {
96        if (digi_midi_type > 0 && SongHandle)
97                midi_resume();
98 }
99
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
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
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