diff options
Diffstat (limited to 'OpenAL32')
-rw-r--r-- | OpenAL32/Include/alMidi.h | 1 | ||||
-rw-r--r-- | OpenAL32/alMidi.c | 118 |
2 files changed, 1 insertions, 118 deletions
diff --git a/OpenAL32/Include/alMidi.h b/OpenAL32/Include/alMidi.h index 2461265d..bba24baa 100644 --- a/OpenAL32/Include/alMidi.h +++ b/OpenAL32/Include/alMidi.h @@ -102,6 +102,7 @@ static const struct MidiSynthVtable T##_MidiSynth_vtable = { \ MidiSynth *FSynth_create(ALCdevice *device); +MidiSynth *DSynth_create(ALCdevice *device); MidiSynth *SynthCreate(ALCdevice *device); diff --git a/OpenAL32/alMidi.c b/OpenAL32/alMidi.c index dda4c655..845b0faf 100644 --- a/OpenAL32/alMidi.c +++ b/OpenAL32/alMidi.c @@ -151,124 +151,6 @@ ALenum MidiSynth_insertSysExEvent(MidiSynth *self, ALuint64 time, const ALbyte * } -typedef struct DSynth { - DERIVE_FROM_TYPE(MidiSynth); -} DSynth; - -static void DSynth_Construct(DSynth *self, ALCdevice *device); -static DECLARE_FORWARD(DSynth, MidiSynth, void, Destruct) -static ALboolean DSynth_isSoundfont(DSynth *self, const char *filename); -static ALenum DSynth_loadSoundfont(DSynth *self, const char *filename); -static DECLARE_FORWARD1(DSynth, MidiSynth, void, setGain, ALfloat) -static DECLARE_FORWARD1(DSynth, MidiSynth, void, setState, ALenum) -static DECLARE_FORWARD(DSynth, MidiSynth, void, stop) -static DECLARE_FORWARD(DSynth, MidiSynth, void, reset) -static DECLARE_FORWARD1(DSynth, MidiSynth, void, update, ALCdevice*) -static void DSynth_process(DSynth *self, ALuint SamplesToDo, ALfloat (*restrict DryBuffer)[BUFFERSIZE]); -static void DSynth_Delete(DSynth *self); -DEFINE_MIDISYNTH_VTABLE(DSynth); - - -static void DSynth_Construct(DSynth *self, ALCdevice *device) -{ - MidiSynth_Construct(STATIC_CAST(MidiSynth, self), device); - SET_VTABLE2(DSynth, MidiSynth, self); -} - - -static ALboolean DSynth_isSoundfont(DSynth *self, const char *filename) -{ - char buf[12]; - FILE *f; - - filename = MidiSynth_getFontName(STATIC_CAST(MidiSynth, self), filename); - if(!filename[0]) - return AL_FALSE; - - f = fopen(filename, "rb"); - if(!f) return AL_FALSE; - - if(fread(buf, 1, sizeof(buf), f) != sizeof(buf)) - { - fclose(f); - return AL_FALSE; - } - - if(memcmp(buf, "RIFF", 4) != 0 || memcmp(buf+8, "sfbk", 4) != 0) - { - fclose(f); - return AL_FALSE; - } - - fclose(f); - return AL_TRUE; -} - -static ALenum DSynth_loadSoundfont(DSynth *self, const char *filename) -{ - if(!DSynth_isSoundfont(self, filename)) - return AL_INVALID_VALUE; - return AL_NO_ERROR; -} - - -static void DSynth_processQueue(DSynth *self, ALuint64 time) -{ - EvtQueue *queue = &STATIC_CAST(MidiSynth, self)->EventQueue; - - while(queue->pos < queue->size && queue->events[queue->pos].time <= time) - queue->pos++; -} - -static void DSynth_process(DSynth *self, ALuint SamplesToDo, ALfloatBUFFERSIZE*restrict UNUSED(DryBuffer)) -{ - MidiSynth *synth = STATIC_CAST(MidiSynth, self); - - if(synth->State != AL_PLAYING) - return; - - synth->SamplesSinceLast += SamplesToDo; - synth->SamplesToNext -= SamplesToDo; - while(synth->SamplesToNext < 1.0f) - { - ALuint64 time = synth->NextEvtTime; - if(time == UINT64_MAX) - { - synth->SamplesToNext = 0.0; - break; - } - - synth->SamplesSinceLast -= (time - synth->LastEvtTime) * synth->SamplesPerTick; - synth->SamplesSinceLast = maxd(synth->SamplesSinceLast, 0.0); - synth->LastEvtTime = time; - DSynth_processQueue(self, time); - - synth->NextEvtTime = MidiSynth_getNextEvtTime(synth); - if(synth->NextEvtTime != UINT64_MAX) - synth->SamplesToNext += (synth->NextEvtTime - synth->LastEvtTime) * synth->SamplesPerTick; - } -} - - -static void DSynth_Delete(DSynth *self) -{ - free(self); -} - - -MidiSynth *DSynth_create(ALCdevice *device) -{ - DSynth *synth = calloc(1, sizeof(*synth)); - if(!synth) - { - ERR("Failed to allocate DSynth\n"); - return NULL; - } - DSynth_Construct(synth, device); - return STATIC_CAST(MidiSynth, synth); -} - - MidiSynth *SynthCreate(ALCdevice *device) { MidiSynth *synth = FSynth_create(device); |