dxx-rebirth/arch/dos/midiallg.c
Bradley Bell 9bd1ba7c47 This commit was generated by cvs2svn to compensate for changes in r2,
which included commits to RCS files with non-trunk default branches.
2001-01-19 03:30:16 +00:00

149 lines
4.1 KiB
C

#include <string.h>
#include <stdlib.h>
#include "u_mem.h"
#include "mono.h"
#include "allg_snd.h"
#include "digi.h"
#include "timer.h"
int midi_volume = 128/2; // Max volume
char digi_last_midi_song[16] = "";
char digi_last_melodic_bank[16] = "";
char digi_last_drum_bank[16] = "";
int digi_midi_type = 0; // Midi driver type
int digi_midi_port = 0; // Midi driver port
// handle for the initialized MIDI song
MIDI *SongHandle = NULL;
void digi_set_midi_volume( int mvolume )
{
int old_volume = midi_volume;
if ( mvolume > 127 )
midi_volume = 127;
else if ( mvolume < 0 )
midi_volume = 0;
else
midi_volume = mvolume;
if ( (digi_midi_type > 0) ) {
if ( (old_volume < 1) && ( midi_volume > 1 ) ) {
if (SongHandle == NULL )
digi_play_midi_song( digi_last_midi_song, digi_last_melodic_bank, digi_last_drum_bank, 1 );
}
set_volume(-1, midi_volume * 2 + (midi_volume & 1));
}
}
void digi_stop_current_song()
{
if (SongHandle) {
destroy_midi(SongHandle);
SongHandle = NULL;
}
}
void digi_play_midi_song( char * filename, char * melodic_bank, char * drum_bank, int loop )
{
//char fname[128];
if ( digi_midi_type <= 0 ) return;
digi_stop_current_song();
if ( filename == NULL ) return;
strcpy( digi_last_midi_song, filename );
strcpy( digi_last_melodic_bank, melodic_bank );
strcpy( digi_last_drum_bank, drum_bank );
if ( midi_volume < 1 )
return;
SongHandle = NULL;
#if 0 /* needs bank loading to sound right */
if (midi_card <= 4) { /* FM cards */
int sl;
sl = strlen( filename );
strcpy( fname, filename );
fname[sl-1] = 'q';
SongHandle = load_hmp(fname);
}
#endif
if ( !SongHandle )
SongHandle = load_hmp(filename);
if (SongHandle) {
if (play_midi(SongHandle, loop)) {
destroy_midi(SongHandle);
SongHandle = NULL;
}
}
if (!SongHandle) {
mprintf( (1, "\nAllegro Error : %s", allegro_error ));
}
}
void digi_midi_pause() {
if (digi_midi_type > 0 && SongHandle)
midi_pause();
}
void digi_midi_resume() {
if (digi_midi_type > 0 && SongHandle)
midi_resume();
}
void digi_midi_stop() {
if ( digi_midi_type > 0 ) {
if (SongHandle) {
destroy_midi(SongHandle);
SongHandle = NULL;
}
}
}
#ifndef ALLEGRO
extern int sb_hw_dsp_ver;
static int midi_timer_system_initialized = 0;
static int digi_midi_initialized = 0;
int digi_midi_init() {
if (!midi_timer_system_initialized)
{
allg_snd_init();
midi_timer_system_initialized = 1;
}
sb_hw_dsp_ver = 1; /* set SB as already detected, functionless */
if (!digi_midi_initialized) {
// amount of voices we need
// 16 for normal sounds and 16 for SoundObjects (fan, boss)
// for DIGMID we sacrify some sounds (32 is the max).
// reserve_voices(allegro_using_digmid() ? 16 : 32, -1);
if (install_sound(DIGI_NONE, MIDI_AUTODETECT, NULL))
return 1;
//set_volume(255, -1);
digi_midi_type = midi_card; // only for 0, !=0
}
digi_midi_initialized = 1;
digi_set_midi_volume( midi_volume );
return 0;
}
void digi_midi_close() {
remove_sound();
digi_midi_initialized = 0;
if ( midi_timer_system_initialized ) {
// Remove timer...
timer_set_function( NULL );
midi_timer_system_initialized = 0;
}
}
#endif