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);
}