From 106e47e1860c9cc7999d112eb801654603ef0f5e Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 19 Feb 2018 13:47:20 +0100 Subject: [PATCH] The OpenAL MIDI source is now only initializes if the source device is MT-32 CM-32L, or FluidSynth. --- src/sound/openal.c | 68 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 21 deletions(-) diff --git a/src/sound/openal.c b/src/sound/openal.c index dead49c3a..9483d1648 100644 --- a/src/sound/openal.c +++ b/src/sound/openal.c @@ -8,7 +8,7 @@ * * Interface to the OpenAL sound processing library. * - * Version: @(#)openal.c 1.0.4 2018/02/11 + * Version: @(#)openal.c 1.0.5 2018/02/19 * * Authors: Sarah Walker, * Miran Grca, @@ -33,6 +33,7 @@ #endif #include "../86box.h" #include "sound.h" +#include "midi.h" #define FREQ 48000 @@ -131,28 +132,43 @@ initalmain(int argc, char *argv[]) void inital(void) { - if (initialized) return; - -#ifdef USE_OPENAL float *buf = NULL, *cd_buf = NULL, *midi_buf = NULL; int16_t *buf_int16 = NULL, *cd_buf_int16 = NULL, *midi_buf_int16 = NULL; int c; + char *mdn; + int init_midi = 0; + + if (initialized) return; + + mdn = midi_device_get_internal_name(midi_device_current); + if (strcmp(mdn, "none") && strcmp(mdn, SYSTEM_MIDI_INTERNAL_NAME)) + init_midi = 1; /* If the device is neither none, nor system MIDI, initialize the + MIDI buffer and source, otherwise, do not. */ + +#ifdef USE_OPENAL + if (sound_is_float) { buf = (float *) malloc((BUFLEN << 1) * sizeof(float)); cd_buf = (float *) malloc((CD_BUFLEN << 1) * sizeof(float)); - midi_buf = (float *) malloc(midi_buf_size * sizeof(float)); + if (init_midi) + midi_buf = (float *) malloc(midi_buf_size * sizeof(float)); } else { buf_int16 = (int16_t *) malloc((BUFLEN << 1) * sizeof(int16_t)); cd_buf_int16 = (int16_t *) malloc((CD_BUFLEN << 1) * sizeof(int16_t)); - midi_buf_int16 = (int16_t *) malloc(midi_buf_size * sizeof(int16_t)); + if (init_midi) + midi_buf_int16 = (int16_t *) malloc(midi_buf_size * sizeof(int16_t)); } alGenBuffers(4, buffers); alGenBuffers(4, buffers_cd); - alGenBuffers(4, buffers_midi); + if (init_midi) + alGenBuffers(4, buffers_midi); - alGenSources(3, source); + if (init_midi) + alGenSources(3, source); + else + alGenSources(2, source); alSource3f(source[0], AL_POSITION, 0.0, 0.0, 0.0); alSource3f(source[0], AL_VELOCITY, 0.0, 0.0, 0.0); @@ -164,47 +180,57 @@ inital(void) alSource3f(source[1], AL_DIRECTION, 0.0, 0.0, 0.0); alSourcef (source[1], AL_ROLLOFF_FACTOR, 0.0 ); alSourcei (source[1], AL_SOURCE_RELATIVE, AL_TRUE ); - alSource3f(source[2], AL_POSITION, 0.0, 0.0, 0.0); - alSource3f(source[2], AL_VELOCITY, 0.0, 0.0, 0.0); - alSource3f(source[2], AL_DIRECTION, 0.0, 0.0, 0.0); - alSourcef (source[2], AL_ROLLOFF_FACTOR, 0.0 ); - alSourcei (source[2], AL_SOURCE_RELATIVE, AL_TRUE ); + if (init_midi) { + alSource3f(source[2], AL_POSITION, 0.0, 0.0, 0.0); + alSource3f(source[2], AL_VELOCITY, 0.0, 0.0, 0.0); + alSource3f(source[2], AL_DIRECTION, 0.0, 0.0, 0.0); + alSourcef (source[2], AL_ROLLOFF_FACTOR, 0.0 ); + alSourcei (source[2], AL_SOURCE_RELATIVE, AL_TRUE ); + } if (sound_is_float) { memset(buf,0,BUFLEN*2*sizeof(float)); memset(cd_buf,0,BUFLEN*2*sizeof(float)); - memset(midi_buf,0,midi_buf_size*sizeof(float)); + if (init_midi) + memset(midi_buf,0,midi_buf_size*sizeof(float)); } else { memset(buf_int16,0,BUFLEN*2*sizeof(int16_t)); memset(cd_buf_int16,0,BUFLEN*2*sizeof(int16_t)); - memset(midi_buf_int16,0,midi_buf_size*sizeof(int16_t)); + if (init_midi) + memset(midi_buf_int16,0,midi_buf_size*sizeof(int16_t)); } for (c=0; c<4; c++) { if (sound_is_float) { alBufferData(buffers[c], AL_FORMAT_STEREO_FLOAT32, buf, BUFLEN*2*sizeof(float), FREQ); alBufferData(buffers_cd[c], AL_FORMAT_STEREO_FLOAT32, cd_buf, CD_BUFLEN*2*sizeof(float), CD_FREQ); - alBufferData(buffers_midi[c], AL_FORMAT_STEREO_FLOAT32, midi_buf, midi_buf_size*sizeof(float), midi_freq); + if (init_midi) + alBufferData(buffers_midi[c], AL_FORMAT_STEREO_FLOAT32, midi_buf, midi_buf_size*sizeof(float), midi_freq); } else { alBufferData(buffers[c], AL_FORMAT_STEREO16, buf_int16, BUFLEN*2*sizeof(int16_t), FREQ); alBufferData(buffers_cd[c], AL_FORMAT_STEREO16, cd_buf_int16, CD_BUFLEN*2*sizeof(int16_t), CD_FREQ); - alBufferData(buffers_midi[c], AL_FORMAT_STEREO16, midi_buf_int16, midi_buf_size*sizeof(int16_t), midi_freq); + if (init_midi) + alBufferData(buffers_midi[c], AL_FORMAT_STEREO16, midi_buf_int16, midi_buf_size*sizeof(int16_t), midi_freq); } } alSourceQueueBuffers(source[0], 4, buffers); alSourceQueueBuffers(source[1], 4, buffers_cd); - alSourceQueueBuffers(source[2], 4, buffers_midi); + if (init_midi) + alSourceQueueBuffers(source[2], 4, buffers_midi); alSourcePlay(source[0]); alSourcePlay(source[1]); - alSourcePlay(source[2]); + if (init_midi) + alSourcePlay(source[2]); if (sound_is_float) { - free(midi_buf); + if (init_midi) + free(midi_buf); free(cd_buf); free(buf); } else { - free(midi_buf_int16); + if (init_midi) + free(midi_buf_int16); free(cd_buf_int16); free(buf_int16); }