aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Alc/ALc.c96
-rw-r--r--Alc/ALu.c3
-rw-r--r--Alc/evtqueue.h31
-rw-r--r--Alc/midi/base.c244
-rw-r--r--Alc/midi/base.h133
-rw-r--r--Alc/midi/dummy.c76
-rw-r--r--Alc/midi/fluidsynth.c934
-rw-r--r--Alc/midi/sf2load.c1373
-rw-r--r--Alc/midi/soft.c139
-rw-r--r--CMakeLists.txt39
-rw-r--r--OpenAL32/Include/alMain.h214
-rw-r--r--OpenAL32/Include/alMidi.h173
-rw-r--r--OpenAL32/alFontsound.c1014
-rw-r--r--OpenAL32/alMidi.c217
-rw-r--r--OpenAL32/alPreset.c339
-rw-r--r--OpenAL32/alSoundfont.c455
-rw-r--r--OpenAL32/alState.c96
-rw-r--r--alsoftrc.sample23
-rw-r--r--cmake/FindFluidSynth.cmake19
-rw-r--r--config.h.in3
20 files changed, 1 insertions, 5620 deletions
diff --git a/Alc/ALc.c b/Alc/ALc.c
index d49ac2d1..86e29c3a 100644
--- a/Alc/ALc.c
+++ b/Alc/ALc.c
@@ -35,7 +35,6 @@
#include "alBuffer.h"
#include "alAuxEffectSlot.h"
#include "alError.h"
-#include "alMidi.h"
#include "bs2b.h"
#include "alu.h"
@@ -44,7 +43,6 @@
#include "alstring.h"
#include "backends/base.h"
-#include "midi/base.h"
/************************************************
@@ -296,40 +294,6 @@ static const ALCfunction alcFunctions[] = {
DECL(alGetSource3i64SOFT),
DECL(alGetSourcei64vSOFT),
- DECL(alGenSoundfontsSOFT),
- DECL(alDeleteSoundfontsSOFT),
- DECL(alIsSoundfontSOFT),
- DECL(alGetSoundfontivSOFT),
- DECL(alSoundfontPresetsSOFT),
- DECL(alGenPresetsSOFT),
- DECL(alDeletePresetsSOFT),
- DECL(alIsPresetSOFT),
- DECL(alPresetiSOFT),
- DECL(alPresetivSOFT),
- DECL(alGetPresetivSOFT),
- DECL(alPresetFontsoundsSOFT),
- DECL(alGenFontsoundsSOFT),
- DECL(alDeleteFontsoundsSOFT),
- DECL(alIsFontsoundSOFT),
- DECL(alFontsoundiSOFT),
- DECL(alFontsound2iSOFT),
- DECL(alFontsoundivSOFT),
- DECL(alGetFontsoundivSOFT),
- DECL(alFontsoundModulatoriSOFT),
- DECL(alGetFontsoundModulatorivSOFT),
- DECL(alMidiSoundfontSOFT),
- DECL(alMidiSoundfontvSOFT),
- DECL(alMidiEventSOFT),
- DECL(alMidiSysExSOFT),
- DECL(alMidiPlaySOFT),
- DECL(alMidiPauseSOFT),
- DECL(alMidiStopSOFT),
- DECL(alMidiResetSOFT),
- DECL(alMidiGainSOFT),
- DECL(alGetInteger64SOFT),
- DECL(alGetInteger64vSOFT),
- DECL(alLoadSoundfontSOFT),
-
{ NULL, NULL }
};
#undef DECL
@@ -792,7 +756,7 @@ static const ALCchar alcExtensionList[] =
"ALC_ENUMERATE_ALL_EXT ALC_ENUMERATION_EXT ALC_EXT_CAPTURE "
"ALC_EXT_DEDICATED ALC_EXT_disconnect ALC_EXT_EFX "
"ALC_EXT_thread_local_context ALC_SOFTX_device_clock ALC_SOFTX_HRTF "
- "ALC_SOFT_loopback ALC_SOFTX_midi_interface ALC_SOFT_pause_device";
+ "ALC_SOFT_loopback ALC_SOFT_pause_device";
static const ALCint alcMajorVersion = 1;
static const ALCint alcMinorVersion = 1;
@@ -2156,8 +2120,6 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
return ALC_INVALID_DEVICE;
}
- V(device->Synth,update)(device);
-
SetMixerFPUMode(&oldMode);
V0(device->Backend,lock)();
context = ATOMIC_LOAD(&device->ContextList);
@@ -2262,9 +2224,6 @@ static ALCvoid FreeDevice(ALCdevice *device)
DELETE_OBJ(device->Backend);
device->Backend = NULL;
- DELETE_OBJ(device->Synth);
- device->Synth = NULL;
-
if(device->DefaultSlot)
{
ALeffectState *state = device->DefaultSlot->EffectState;
@@ -2272,10 +2231,6 @@ static ALCvoid FreeDevice(ALCdevice *device)
DELETE_OBJ(state);
}
- if(device->DefaultSfont)
- ALsoundfont_deleteSoundfont(device->DefaultSfont, device);
- device->DefaultSfont = NULL;
-
if(device->BufferMap.size > 0)
{
WARN("(%p) Deleting %d Buffer(s)\n", device, device->BufferMap.size);
@@ -2297,27 +2252,6 @@ static ALCvoid FreeDevice(ALCdevice *device)
}
ResetUIntMap(&device->FilterMap);
- if(device->SfontMap.size > 0)
- {
- WARN("(%p) Deleting %d Soundfont(s)\n", device, device->SfontMap.size);
- ReleaseALSoundfonts(device);
- }
- ResetUIntMap(&device->SfontMap);
-
- if(device->PresetMap.size > 0)
- {
- WARN("(%p) Deleting %d Preset(s)\n", device, device->PresetMap.size);
- ReleaseALPresets(device);
- }
- ResetUIntMap(&device->PresetMap);
-
- if(device->FontsoundMap.size > 0)
- {
- WARN("(%p) Deleting %d Fontsound(s)\n", device, device->FontsoundMap.size);
- ReleaseALFontsounds(device);
- }
- ResetUIntMap(&device->FontsoundMap);
-
AL_STRING_DEINIT(device->Hrtf_Name);
FreeHrtfList(&device->Hrtf_List);
@@ -3440,9 +3374,6 @@ ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *deviceName)
InitUIntMap(&device->BufferMap, ~0);
InitUIntMap(&device->EffectMap, ~0);
InitUIntMap(&device->FilterMap, ~0);
- InitUIntMap(&device->SfontMap, ~0);
- InitUIntMap(&device->PresetMap, ~0);
- InitUIntMap(&device->FontsoundMap, ~0);
//Set output format
device->FmtChans = DevFmtChannelsDefault;
@@ -3553,19 +3484,9 @@ ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *deviceName)
device->NumStereoSources = 1;
device->NumMonoSources = device->MaxNoOfSources - device->NumStereoSources;
- device->Synth = SynthCreate(device);
- if(!device->Synth)
- {
- DELETE_OBJ(device->Backend);
- al_free(device);
- alcSetError(NULL, ALC_OUT_OF_MEMORY);
- return NULL;
- }
-
// Find a playback device to open
if((err=V(device->Backend,open)(deviceName)) != ALC_NO_ERROR)
{
- DELETE_OBJ(device->Synth);
DELETE_OBJ(device->Backend);
al_free(device);
alcSetError(NULL, err);
@@ -3697,9 +3618,6 @@ ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *deviceName,
InitUIntMap(&device->BufferMap, ~0);
InitUIntMap(&device->EffectMap, ~0);
InitUIntMap(&device->FilterMap, ~0);
- InitUIntMap(&device->SfontMap, ~0);
- InitUIntMap(&device->PresetMap, ~0);
- InitUIntMap(&device->FontsoundMap, ~0);
if(!CaptureBackend.getFactory)
device->Backend = create_backend_wrapper(device, &CaptureBackend.Funcs,
@@ -3898,9 +3816,6 @@ ALC_API ALCdevice* ALC_APIENTRY alcLoopbackOpenDeviceSOFT(const ALCchar *deviceN
InitUIntMap(&device->BufferMap, ~0);
InitUIntMap(&device->EffectMap, ~0);
InitUIntMap(&device->FilterMap, ~0);
- InitUIntMap(&device->SfontMap, ~0);
- InitUIntMap(&device->PresetMap, ~0);
- InitUIntMap(&device->FontsoundMap, ~0);
factory = ALCloopbackFactory_getFactory();
device->Backend = V(factory,createBackend)(device, ALCbackend_Loopback);
@@ -3932,15 +3847,6 @@ ALC_API ALCdevice* ALC_APIENTRY alcLoopbackOpenDeviceSOFT(const ALCchar *deviceN
device->NumStereoSources = 1;
device->NumMonoSources = device->MaxNoOfSources - device->NumStereoSources;
- device->Synth = SynthCreate(device);
- if(!device->Synth)
- {
- DELETE_OBJ(device->Backend);
- al_free(device);
- alcSetError(NULL, ALC_OUT_OF_MEMORY);
- return NULL;
- }
-
// Open the "backend"
V(device->Backend,open)("Loopback");
diff --git a/Alc/ALu.c b/Alc/ALu.c
index ddc0cc53..c9a1a08c 100644
--- a/Alc/ALu.c
+++ b/Alc/ALu.c
@@ -39,7 +39,6 @@
#include "mixer_defs.h"
#include "backends/base.h"
-#include "midi/base.h"
struct ChanMap {
@@ -1315,8 +1314,6 @@ ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size)
ctx = ctx->next;
}
- V(device->Synth,process)(SamplesToDo, OutBuffer, OutChannels);
-
if((slot=device->DefaultSlot) != NULL)
V(slot->EffectState,process)(
SamplesToDo, slot->WetBuffer[0], device->DryBuffer, device->NumChannels
diff --git a/Alc/evtqueue.h b/Alc/evtqueue.h
deleted file mode 100644
index 95702d79..00000000
--- a/Alc/evtqueue.h
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef AL_EVTQUEUE_H
-#define AL_EVTQUEUE_H
-
-#include "AL/al.h"
-
-#include "alMain.h"
-
-typedef struct MidiEvent {
- ALuint64 time;
- ALuint event;
- union {
- ALuint val[2];
- struct {
- ALvoid *data;
- ALsizei size;
- } sysex;
- } param;
-} MidiEvent;
-
-typedef struct EvtQueue {
- MidiEvent *events;
- ALsizei pos;
- ALsizei size;
- ALsizei maxsize;
-} EvtQueue;
-
-void InitEvtQueue(EvtQueue *queue);
-void ResetEvtQueue(EvtQueue *queue);
-ALenum InsertEvtQueue(EvtQueue *queue, const MidiEvent *evt);
-
-#endif /* AL_EVTQUEUE_H */
diff --git a/Alc/midi/base.c b/Alc/midi/base.c
deleted file mode 100644
index cab85c1a..00000000
--- a/Alc/midi/base.c
+++ /dev/null
@@ -1,244 +0,0 @@
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-
-#include "midi/base.h"
-
-#include "alMidi.h"
-#include "alMain.h"
-#include "alError.h"
-#include "alThunk.h"
-#include "evtqueue.h"
-#include "rwlock.h"
-#include "alu.h"
-
-
-extern inline ALboolean IsValidCtrlInput(int cc);
-
-extern inline size_t Reader_read(Reader *self, void *buf, size_t len);
-
-
-/* MIDI events */
-#define SYSEX_EVENT (0xF0)
-
-
-void InitEvtQueue(EvtQueue *queue)
-{
- queue->events = NULL;
- queue->maxsize = 0;
- queue->size = 0;
- queue->pos = 0;
-}
-
-void ResetEvtQueue(EvtQueue *queue)
-{
- ALsizei i;
- for(i = 0;i < queue->size;i++)
- {
- if(queue->events[i].event == SYSEX_EVENT)
- {
- free(queue->events[i].param.sysex.data);
- queue->events[i].param.sysex.data = NULL;
- }
- }
-
- free(queue->events);
- queue->events = NULL;
- queue->maxsize = 0;
- queue->size = 0;
- queue->pos = 0;
-}
-
-ALenum InsertEvtQueue(EvtQueue *queue, const MidiEvent *evt)
-{
- ALsizei pos;
-
- if(queue->maxsize == queue->size)
- {
- if(queue->pos > 0)
- {
- /* Queue has some stale entries, remove them to make space for more
- * events. */
- for(pos = 0;pos < queue->pos;pos++)
- {
- if(queue->events[pos].event == SYSEX_EVENT)
- {
- free(queue->events[pos].param.sysex.data);
- queue->events[pos].param.sysex.data = NULL;
- }
- }
- memmove(&queue->events[0], &queue->events[queue->pos],
- (queue->size-queue->pos)*sizeof(queue->events[0]));
- queue->size -= queue->pos;
- queue->pos = 0;
- }
- else
- {
- /* Queue is full, double the allocated space. */
- void *temp = NULL;
- ALsizei newsize;
-
- newsize = (queue->maxsize ? (queue->maxsize<<1) : 16);
- if(newsize > queue->maxsize)
- temp = realloc(queue->events, newsize * sizeof(queue->events[0]));
- if(!temp)
- return AL_OUT_OF_MEMORY;
-
- queue->events = temp;
- queue->maxsize = newsize;
- }
- }
-
- pos = queue->pos;
- if(queue->size > 0)
- {
- ALsizei high = queue->size - 1;
- while(pos < high)
- {
- ALsizei mid = pos + (high-pos)/2;
- if(queue->events[mid].time < evt->time)
- pos = mid + 1;
- else
- high = mid;
- }
- while(pos < queue->size && queue->events[pos].time <= evt->time)
- pos++;
-
- if(pos < queue->size)
- memmove(&queue->events[pos+1], &queue->events[pos],
- (queue->size-pos)*sizeof(queue->events[0]));
- }
-
- queue->events[pos] = *evt;
- queue->size++;
-
- return AL_NO_ERROR;
-}
-
-
-void MidiSynth_Construct(MidiSynth *self, ALCdevice *device)
-{
- InitEvtQueue(&self->EventQueue);
-
- RWLockInit(&self->Lock);
-
- self->Soundfonts = NULL;
- self->NumSoundfonts = 0;
-
- self->Gain = 1.0f;
- self->State = AL_INITIAL;
-
- self->ClockBase = 0;
- self->SamplesDone = 0;
- self->SampleRate = device->Frequency;
-}
-
-void MidiSynth_Destruct(MidiSynth *self)
-{
- ALsizei i;
-
- for(i = 0;i < self->NumSoundfonts;i++)
- DecrementRef(&self->Soundfonts[i]->ref);
- free(self->Soundfonts);
- self->Soundfonts = NULL;
- self->NumSoundfonts = 0;
-
- ResetEvtQueue(&self->EventQueue);
-}
-
-
-ALenum MidiSynth_selectSoundfonts(MidiSynth *self, ALCcontext *context, ALsizei count, const ALuint *ids)
-{
- ALCdevice *device = context->Device;
- ALsoundfont **sfonts;
- ALsizei i;
-
- if(self->State != AL_INITIAL && self->State != AL_STOPPED)
- return AL_INVALID_OPERATION;
-
- sfonts = calloc(1, count * sizeof(sfonts[0]));
- if(!sfonts) return AL_OUT_OF_MEMORY;
-
- for(i = 0;i < count;i++)
- {
- if(ids[i] == 0)
- sfonts[i] = ALsoundfont_getDefSoundfont(context);
- else if(!(sfonts[i]=LookupSfont(device, ids[i])))
- {
- free(sfonts);
- return AL_INVALID_VALUE;
- }
- }
-
- for(i = 0;i < count;i++)
- IncrementRef(&sfonts[i]->ref);
- sfonts = ExchangePtr((XchgPtr*)&self->Soundfonts, sfonts);
- count = ExchangeInt(&self->NumSoundfonts, count);
-
- for(i = 0;i < count;i++)
- DecrementRef(&sfonts[i]->ref);
- free(sfonts);
-
- return AL_NO_ERROR;
-}
-
-extern inline void MidiSynth_setGain(MidiSynth *self, ALfloat gain);
-extern inline ALfloat MidiSynth_getGain(const MidiSynth *self);
-extern inline void MidiSynth_setState(MidiSynth *self, ALenum state);
-extern inline ALenum MidiSynth_getState(const MidiSynth *self);
-
-void MidiSynth_stop(MidiSynth *self)
-{
- ResetEvtQueue(&self->EventQueue);
-
- self->ClockBase = 0;
- self->SamplesDone = 0;
-}
-
-extern inline void MidiSynth_reset(MidiSynth *self);
-extern inline ALuint64 MidiSynth_getTime(const MidiSynth *self);
-extern inline ALuint64 MidiSynth_getNextEvtTime(const MidiSynth *self);
-
-void MidiSynth_setSampleRate(MidiSynth *self, ALuint srate)
-{
- if(self->SampleRate != srate)
- {
- self->ClockBase += self->SamplesDone * MIDI_CLOCK_RES / self->SampleRate;
- self->SamplesDone = 0;
- self->SampleRate = srate;
- }
-}
-
-extern inline void MidiSynth_update(MidiSynth *self, ALCdevice *device);
-
-ALenum MidiSynth_insertEvent(MidiSynth *self, ALuint64 time, ALuint event, ALsizei param1, ALsizei param2)
-{
- MidiEvent entry;
- entry.time = time;
- entry.event = event;
- entry.param.val[0] = param1;
- entry.param.val[1] = param2;
- return InsertEvtQueue(&self->EventQueue, &entry);
-}
-
-ALenum MidiSynth_insertSysExEvent(MidiSynth *self, ALuint64 time, const ALbyte *data, ALsizei size)
-{
- MidiEvent entry;
- ALenum err;
-
- entry.time = time;
- entry.event = SYSEX_EVENT;
- entry.param.sysex.size = size;
- entry.param.sysex.data = malloc(size);
- if(!entry.param.sysex.data)
- return AL_OUT_OF_MEMORY;
- memcpy(entry.param.sysex.data, data, size);
-
- err = InsertEvtQueue(&self->EventQueue, &entry);
- if(err != AL_NO_ERROR)
- free(entry.param.sysex.data);
- return err;
-}
diff --git a/Alc/midi/base.h b/Alc/midi/base.h
deleted file mode 100644
index 823e3802..00000000
--- a/Alc/midi/base.h
+++ /dev/null
@@ -1,133 +0,0 @@
-#ifndef AL_MIDI_BASE_H
-#define AL_MIDI_BASE_H
-
-#include "alMain.h"
-#include "atomic.h"
-#include "evtqueue.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct ALsoundfont;
-
-typedef size_t (*ReaderCb)(void *ptr, size_t size, void *stream);
-typedef struct Reader {
- ReaderCb cb;
- void *ptr;
- int error;
-} Reader;
-inline size_t Reader_read(Reader *self, void *buf, size_t len)
-{
- size_t got = (!self->error) ? self->cb(buf, len, self->ptr) : 0;
- if(got < len) self->error = 1;
- return got;
-}
-#define READERR(x_) ((x_)->error)
-
-ALboolean loadSf2(Reader *stream, struct ALsoundfont *sfont, ALCcontext *context);
-
-
-#define MIDI_CLOCK_RES U64(1000000000)
-
-
-struct MidiSynthVtable;
-
-typedef struct MidiSynth {
- EvtQueue EventQueue;
-
- ALuint64 ClockBase;
- ALuint SamplesDone;
- ALuint SampleRate;
-
- /* NOTE: This rwlock is for the state and soundfont. The EventQueue and
- * related must instead use the device lock as they're used in the mixer
- * thread.
- */
- RWLock Lock;
-
- struct ALsoundfont **Soundfonts;
- ALsizei NumSoundfonts;
-
- volatile ALfloat Gain;
- volatile ALenum State;
-
- const struct MidiSynthVtable *vtbl;
-} MidiSynth;
-
-void MidiSynth_Construct(MidiSynth *self, ALCdevice *device);
-void MidiSynth_Destruct(MidiSynth *self);
-ALenum MidiSynth_selectSoundfonts(MidiSynth *self, ALCcontext *context, ALsizei count, const ALuint *ids);
-inline void MidiSynth_setGain(MidiSynth *self, ALfloat gain) { self->Gain = gain; }
-inline ALfloat MidiSynth_getGain(const MidiSynth *self) { return self->Gain; }
-inline void MidiSynth_setState(MidiSynth *self, ALenum state) { self->State = state; }
-inline ALenum MidiSynth_getState(const MidiSynth *self) { return self->State; }
-void MidiSynth_stop(MidiSynth *self);
-inline void MidiSynth_reset(MidiSynth *self) { MidiSynth_stop(self); }
-inline ALuint64 MidiSynth_getTime(const MidiSynth *self)
-{ return self->ClockBase + (self->SamplesDone*MIDI_CLOCK_RES/self->SampleRate); }
-inline ALuint64 MidiSynth_getNextEvtTime(const MidiSynth *self)
-{
- if(self->EventQueue.pos == self->EventQueue.size)
- return UINT64_MAX;
- return self->EventQueue.events[self->EventQueue.pos].time;
-}
-void MidiSynth_setSampleRate(MidiSynth *self, ALuint srate);
-inline void MidiSynth_update(MidiSynth *self, ALCdevice *device)
-{ MidiSynth_setSampleRate(self, device->Frequency); }
-ALenum MidiSynth_insertEvent(MidiSynth *self, ALuint64 time, ALuint event, ALsizei param1, ALsizei param2);
-ALenum MidiSynth_insertSysExEvent(MidiSynth *self, ALuint64 time, const ALbyte *data, ALsizei size);
-
-
-struct MidiSynthVtable {
- void (*const Destruct)(MidiSynth *self);
-
- ALenum (*const selectSoundfonts)(MidiSynth *self, ALCcontext *context, ALsizei count, const ALuint *ids);
-
- void (*const setGain)(MidiSynth *self, ALfloat gain);
-
- void (*const stop)(MidiSynth *self);
- void (*const reset)(MidiSynth *self);
-
- void (*const update)(MidiSynth *self, ALCdevice *device);
- void (*const process)(MidiSynth *self, ALuint samples, ALfloat (*restrict DryBuffer)[BUFFERSIZE], ALuint NumChannels);
-
- void (*const Delete)(void *ptr);
-};
-
-#define DEFINE_MIDISYNTH_VTABLE(T) \
-DECLARE_THUNK(T, MidiSynth, void, Destruct) \
-DECLARE_THUNK3(T, MidiSynth, ALenum, selectSoundfonts, ALCcontext*, ALsizei, const ALuint*) \
-DECLARE_THUNK1(T, MidiSynth, void, setGain, ALfloat) \
-DECLARE_THUNK(T, MidiSynth, void, stop) \
-DECLARE_THUNK(T, MidiSynth, void, reset) \
-DECLARE_THUNK1(T, MidiSynth, void, update, ALCdevice*) \
-DECLARE_THUNK3(T, MidiSynth, void, process, ALuint, ALfloatBUFFERSIZE*restrict, ALuint) \
-static void T##_MidiSynth_Delete(void *ptr) \
-{ T##_Delete(STATIC_UPCAST(T, MidiSynth, (MidiSynth*)ptr)); } \
- \
-static const struct MidiSynthVtable T##_MidiSynth_vtable = { \
- T##_MidiSynth_Destruct, \
- \
- T##_MidiSynth_selectSoundfonts, \
- T##_MidiSynth_setGain, \
- T##_MidiSynth_stop, \
- T##_MidiSynth_reset, \
- T##_MidiSynth_update, \
- T##_MidiSynth_process, \
- \
- T##_MidiSynth_Delete, \
-}
-
-
-MidiSynth *SSynth_create(ALCdevice *device);
-MidiSynth *FSynth_create(ALCdevice *device);
-MidiSynth *DSynth_create(ALCdevice *device);
-
-MidiSynth *SynthCreate(ALCdevice *device);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* AL_MIDI_BASE_H */
diff --git a/Alc/midi/dummy.c b/Alc/midi/dummy.c
deleted file mode 100644
index 23c0d2cb..00000000
--- a/Alc/midi/dummy.c
+++ /dev/null
@@ -1,76 +0,0 @@
-
-#include "config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-
-#include "alMain.h"
-#include "alError.h"
-#include "evtqueue.h"
-#include "rwlock.h"
-#include "alu.h"
-
-#include "midi/base.h"
-
-typedef struct DSynth {
- DERIVE_FROM_TYPE(MidiSynth);
-} DSynth;
-
-static void DSynth_Construct(DSynth *self, ALCdevice *device);
-static DECLARE_FORWARD(DSynth, MidiSynth, void, Destruct)
-static DECLARE_FORWARD3(DSynth, MidiSynth, ALenum, selectSoundfonts, ALCcontext*, ALsizei, const ALuint*)
-static DECLARE_FORWARD1(DSynth, MidiSynth, void, setGain, ALfloat)
-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], ALuint NumChannels);
-DECLARE_DEFAULT_ALLOCATORS(DSynth)
-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 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), ALuint UNUSED(NumChannels))
-{
- MidiSynth *synth = STATIC_CAST(MidiSynth, self);
- ALuint64 curtime;
-
- if(synth->State != AL_PLAYING)
- return;
-
- synth->SamplesDone += SamplesToDo;
- synth->ClockBase += (synth->SamplesDone/synth->SampleRate) * MIDI_CLOCK_RES;
- synth->SamplesDone %= synth->SampleRate;
-
- curtime = MidiSynth_getTime(synth);
- DSynth_processQueue(self, maxi64(curtime-1, 0));
-}
-
-
-MidiSynth *DSynth_create(ALCdevice *device)
-{
- DSynth *synth;
-
- NEW_OBJ(synth, DSynth)(device);
- if(!synth)
- {
- ERR("Failed to allocate DSynth\n");
- return NULL;
- }
- return STATIC_CAST(MidiSynth, synth);
-}
diff --git a/Alc/midi/fluidsynth.c b/Alc/midi/fluidsynth.c
deleted file mode 100644
index 2236c812..00000000
--- a/Alc/midi/fluidsynth.c
+++ /dev/null
@@ -1,934 +0,0 @@
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-
-#include "midi/base.h"
-
-#include "alMain.h"
-#include "alError.h"
-#include "alMidi.h"
-#include "alu.h"
-#include "compat.h"
-#include "evtqueue.h"
-#include "rwlock.h"
-
-#ifdef HAVE_FLUIDSYNTH
-
-#include <fluidsynth.h>
-
-
-#ifdef HAVE_DYNLOAD
-#define FLUID_FUNCS(MAGIC) \
- MAGIC(new_fluid_synth); \
- MAGIC(delete_fluid_synth); \
- MAGIC(new_fluid_settings); \
- MAGIC(delete_fluid_settings); \
- MAGIC(fluid_settings_setint); \
- MAGIC(fluid_settings_setnum); \
- MAGIC(fluid_synth_noteon); \
- MAGIC(fluid_synth_noteoff); \
- MAGIC(fluid_synth_program_change); \
- MAGIC(fluid_synth_pitch_bend); \
- MAGIC(fluid_synth_channel_pressure); \
- MAGIC(fluid_synth_cc); \
- MAGIC(fluid_synth_sysex); \
- MAGIC(fluid_synth_bank_select); \
- MAGIC(fluid_synth_set_channel_type); \
- MAGIC(fluid_synth_all_sounds_off); \
- MAGIC(fluid_synth_system_reset); \
- MAGIC(fluid_synth_set_gain); \
- MAGIC(fluid_synth_set_sample_rate); \
- MAGIC(fluid_synth_write_float); \
- MAGIC(fluid_synth_add_sfloader); \
- MAGIC(fluid_synth_sfload); \
- MAGIC(fluid_synth_sfunload); \
- MAGIC(fluid_synth_alloc_voice); \
- MAGIC(fluid_synth_start_voice); \
- MAGIC(fluid_voice_gen_set); \
- MAGIC(fluid_voice_add_mod); \
- MAGIC(fluid_mod_set_source1); \
- MAGIC(fluid_mod_set_source2); \
- MAGIC(fluid_mod_set_amount); \
- MAGIC(fluid_mod_set_dest);
-
-void *fsynth_handle = NULL;
-#define DECL_FUNC(x) __typeof(x) *p##x
-FLUID_FUNCS(DECL_FUNC)
-#undef DECL_FUNC
-
-#define new_fluid_synth pnew_fluid_synth
-#define delete_fluid_synth pdelete_fluid_synth
-#define new_fluid_settings pnew_fluid_settings
-#define delete_fluid_settings pdelete_fluid_settings
-#define fluid_settings_setint pfluid_settings_setint
-#define fluid_settings_setnum pfluid_settings_setnum
-#define fluid_synth_noteon pfluid_synth_noteon
-#define fluid_synth_noteoff pfluid_synth_noteoff
-#define fluid_synth_program_change pfluid_synth_program_change
-#define fluid_synth_pitch_bend pfluid_synth_pitch_bend
-#define fluid_synth_channel_pressure pfluid_synth_channel_pressure
-#define fluid_synth_cc pfluid_synth_cc
-#define fluid_synth_sysex pfluid_synth_sysex
-#define fluid_synth_bank_select pfluid_synth_bank_select
-#define fluid_synth_set_channel_type pfluid_synth_set_channel_type
-#define fluid_synth_all_sounds_off pfluid_synth_all_sounds_off
-#define fluid_synth_system_reset pfluid_synth_system_reset
-#define fluid_synth_set_gain pfluid_synth_set_gain
-#define fluid_synth_set_sample_rate pfluid_synth_set_sample_rate
-#define fluid_synth_write_float pfluid_synth_write_float
-#define fluid_synth_add_sfloader pfluid_synth_add_sfloader
-#define fluid_synth_sfload pfluid_synth_sfload
-#define fluid_synth_sfunload pfluid_synth_sfunload
-#define fluid_synth_alloc_voice pfluid_synth_alloc_voice
-#define fluid_synth_start_voice pfluid_synth_start_voice
-#define fluid_voice_gen_set pfluid_voice_gen_set
-#define fluid_voice_add_mod pfluid_voice_add_mod
-#define fluid_mod_set_source1 pfluid_mod_set_source1
-#define fluid_mod_set_source2 pfluid_mod_set_source2
-#define fluid_mod_set_amount pfluid_mod_set_amount
-#define fluid_mod_set_dest pfluid_mod_set_dest
-
-static ALboolean LoadFSynth(void)
-{
- ALboolean ret = AL_TRUE;
- if(!fsynth_handle)
- {
- fsynth_handle = LoadLib("libfluidsynth.so.1");
- if(!fsynth_handle) return AL_FALSE;
-
-#define LOAD_FUNC(x) do { \
- p##x = GetSymbol(fsynth_handle, #x); \
- if(!p##x) ret = AL_FALSE; \
-} while(0)
- FLUID_FUNCS(LOAD_FUNC)
-#undef LOAD_FUNC
-
- if(ret == AL_FALSE)
- {
- CloseLib(fsynth_handle);
- fsynth_handle = NULL;
- }
- }
- return ret;
-}
-#else
-static inline ALboolean LoadFSynth(void) { return AL_TRUE; }
-#endif
-
-
-/* MIDI events */
-#define SYSEX_EVENT (0xF0)
-
-/* MIDI controllers */
-#define CTRL_BANKSELECT_MSB (0)
-#define CTRL_BANKSELECT_LSB (32)
-#define CTRL_ALLNOTESOFF (123)
-
-
-static int getModInput(ALenum input)
-{
- switch(input)
- {
- case AL_ONE_SOFT: return FLUID_MOD_NONE;
- case AL_NOTEON_VELOCITY_SOFT: return FLUID_MOD_VELOCITY;
- case AL_NOTEON_KEY_SOFT: return FLUID_MOD_KEY;
- case AL_KEYPRESSURE_SOFT: return FLUID_MOD_KEYPRESSURE;
- case AL_CHANNELPRESSURE_SOFT: return FLUID_MOD_CHANNELPRESSURE;
- case AL_PITCHBEND_SOFT: return FLUID_MOD_PITCHWHEEL;
- case AL_PITCHBEND_SENSITIVITY_SOFT: return FLUID_MOD_PITCHWHEELSENS;
- }
- return input&0x7F;
-}
-
-static int getModFlags(ALenum input, ALenum type, ALenum form)
-{
- int ret = 0;
-
- switch(type)
- {
- case AL_UNORM_SOFT: ret |= FLUID_MOD_UNIPOLAR | FLUID_MOD_POSITIVE; break;
- case AL_UNORM_REV_SOFT: ret |= FLUID_MOD_UNIPOLAR | FLUID_MOD_NEGATIVE; break;
- case AL_SNORM_SOFT: ret |= FLUID_MOD_BIPOLAR | FLUID_MOD_POSITIVE; break;
- case AL_SNORM_REV_SOFT: ret |= FLUID_MOD_BIPOLAR | FLUID_MOD_NEGATIVE; break;
- }
- switch(form)
- {
- case AL_LINEAR_SOFT: ret |= FLUID_MOD_LINEAR; break;
- case AL_CONCAVE_SOFT: ret |= FLUID_MOD_CONCAVE; break;
- case AL_CONVEX_SOFT: ret |= FLUID_MOD_CONVEX; break;
- case AL_SWITCH_SOFT: ret |= FLUID_MOD_SWITCH; break;
- }
- /* Source input values less than 128 correspond to a MIDI continuous
- * controller. Otherwise, it's a general controller. */
- if(input < 128) ret |= FLUID_MOD_CC;
- else ret |= FLUID_MOD_GC;
-
- return ret;
-}
-
-static enum fluid_gen_type getModDest(ALenum gen)
-{
- switch(gen)
- {
- case AL_MOD_LFO_TO_PITCH_SOFT: return GEN_MODLFOTOPITCH;
- case AL_VIBRATO_LFO_TO_PITCH_SOFT: return GEN_VIBLFOTOPITCH;
- case AL_MOD_ENV_TO_PITCH_SOFT: return GEN_MODENVTOPITCH;
- case AL_FILTER_CUTOFF_SOFT: return GEN_FILTERFC;
- case AL_FILTER_RESONANCE_SOFT: return GEN_FILTERQ;
- case AL_MOD_LFO_TO_FILTER_CUTOFF_SOFT: return GEN_MODLFOTOFILTERFC;
- case AL_MOD_ENV_TO_FILTER_CUTOFF_SOFT: return GEN_MODENVTOFILTERFC;
- case AL_MOD_LFO_TO_VOLUME_SOFT: return GEN_MODLFOTOVOL;
- case AL_CHORUS_SEND_SOFT: return GEN_CHORUSSEND;
- case AL_REVERB_SEND_SOFT: return GEN_REVERBSEND;
- case AL_PAN_SOFT: return GEN_PAN;
- case AL_MOD_LFO_DELAY_SOFT: return GEN_MODLFODELAY;
- case AL_MOD_LFO_FREQUENCY_SOFT: return GEN_MODLFOFREQ;
- case AL_VIBRATO_LFO_DELAY_SOFT: return GEN_VIBLFODELAY;
- case AL_VIBRATO_LFO_FREQUENCY_SOFT: return GEN_VIBLFOFREQ;
- case AL_MOD_ENV_DELAYTIME_SOFT: return GEN_MODENVDELAY;
- case AL_MOD_ENV_ATTACKTIME_SOFT: return GEN_MODENVATTACK;
- case AL_MOD_ENV_HOLDTIME_SOFT: return GEN_MODENVHOLD;
- case AL_MOD_ENV_DECAYTIME_SOFT: return GEN_MODENVDECAY;
- case AL_MOD_ENV_SUSTAINVOLUME_SOFT: return GEN_MODENVSUSTAIN;
- case AL_MOD_ENV_RELEASETIME_SOFT: return GEN_MODENVRELEASE;
- case AL_MOD_ENV_KEY_TO_HOLDTIME_SOFT: return GEN_KEYTOMODENVHOLD;
- case AL_MOD_ENV_KEY_TO_DECAYTIME_SOFT: return GEN_KEYTOMODENVDECAY;
- case AL_VOLUME_ENV_DELAYTIME_SOFT: return GEN_VOLENVDELAY;
- case AL_VOLUME_ENV_ATTACKTIME_SOFT: return GEN_VOLENVATTACK;
- case AL_VOLUME_ENV_HOLDTIME_SOFT: return GEN_VOLENVHOLD;
- case AL_VOLUME_ENV_DECAYTIME_SOFT: return GEN_VOLENVDECAY;
- case AL_VOLUME_ENV_SUSTAINVOLUME_SOFT: return GEN_VOLENVSUSTAIN;
- case AL_VOLUME_ENV_RELEASETIME_SOFT: return GEN_VOLENVRELEASE;
- case AL_VOLUME_ENV_KEY_TO_HOLDTIME_SOFT: return GEN_KEYTOVOLENVHOLD;
- case AL_VOLUME_ENV_KEY_TO_DECAYTIME_SOFT: return GEN_KEYTOVOLENVDECAY;
- case AL_ATTENUATION_SOFT: return GEN_ATTENUATION;
- case AL_TUNING_COARSE_SOFT: return GEN_COARSETUNE;
- case AL_TUNING_FINE_SOFT: return GEN_FINETUNE;
- case AL_TUNING_SCALE_SOFT: return GEN_SCALETUNE;
- }
- ERR("Unhandled generator: 0x%04x\n", gen);
- return 0;
-}
-
-static int getSf2LoopMode(ALenum mode)
-{
- switch(mode)
- {
- case AL_NONE: return 0;
- case AL_LOOP_CONTINUOUS_SOFT: return 1;
- case AL_LOOP_UNTIL_RELEASE_SOFT: return 3;
- }
- return 0;
-}
-
-static int getSampleType(ALenum type)
-{
- switch(type)
- {
- case AL_MONO_SOFT: return FLUID_SAMPLETYPE_MONO;
- case AL_RIGHT_SOFT: return FLUID_SAMPLETYPE_RIGHT;
- case AL_LEFT_SOFT: return FLUID_SAMPLETYPE_LEFT;
- }
- return FLUID_SAMPLETYPE_MONO;
-}
-
-typedef struct FSample {
- DERIVE_FROM_TYPE(fluid_sample_t);
-
- ALfontsound *Sound;
-
- fluid_mod_t *Mods;
- ALsizei NumMods;
-} FSample;
-
-static void FSample_Construct(FSample *self, ALfontsound *sound)
-{
- fluid_sample_t *sample = STATIC_CAST(fluid_sample_t, self);
- ALbuffer *buffer = ATOMIC_LOAD(&sound->Buffer);
-
- memset(sample->name, 0, sizeof(sample->name));
- sample->start = sound->Start;
- sample->end = sound->End;
- sample->loopstart = sound->LoopStart;
- sample->loopend = sound->LoopEnd;
- sample->samplerate = sound->SampleRate;
- sample->origpitch = sound->PitchKey;
- sample->pitchadj = sound->PitchCorrection;
- sample->sampletype = getSampleType(sound->SampleType);
- sample->valid = !!buffer;
- sample->data = buffer ? buffer->data : NULL;
-
- sample->amplitude_that_reaches_noise_floor_is_valid = 0;
- sample->amplitude_that_reaches_noise_floor = 0.0;
-
- sample->refcount = 0;
-
- sample->notify = NULL;
-
- sample->userdata = self;
-
- self->Sound = sound;
-
- self->NumMods = 0;
- self->Mods = calloc(sound->ModulatorMap.size*4, sizeof(fluid_mod_t[4]));
- if(self->Mods)
- {
- ALsizei i, j, k;
-
- for(i = j = 0;i < sound->ModulatorMap.size;i++)
- {
- ALsfmodulator *mod = sound->ModulatorMap.array[i].value;
- for(k = 0;k < 4;k++,mod++)
- {
- if(mod->Dest == AL_NONE)
- continue;
- fluid_mod_set_source1(&self->Mods[j], getModInput(mod->Source[0].Input),
- getModFlags(mod->Source[0].Input, mod->Source[0].Type,
- mod->Source[0].Form));
- fluid_mod_set_source2(&self->Mods[j], getModInput(mod->Source[1].Input),
- getModFlags(mod->Source[1].Input, mod->Source[1].Type,
- mod->Source[1].Form));
- fluid_mod_set_amount(&self->Mods[j], mod->Amount);
- fluid_mod_set_dest(&self->Mods[j], getModDest(mod->Dest));
- self->Mods[j++].next = NULL;
- }
- }
- self->NumMods = j;
- }
-}
-
-static void FSample_Destruct(FSample *self)
-{
- free(self->Mods);
- self->Mods = NULL;
- self->NumMods = 0;
-}
-
-
-typedef struct FPreset {
- DERIVE_FROM_TYPE(fluid_preset_t);
-
- char Name[16];
-
- int Preset;
- int Bank;
-
- FSample *Samples;
- ALsizei NumSamples;
-} FPreset;
-
-static char* FPreset_getName(fluid_preset_t *preset);
-static int FPreset_getPreset(fluid_preset_t *preset);
-static int FPreset_getBank(fluid_preset_t *preset);
-static int FPreset_noteOn(fluid_preset_t *preset, fluid_synth_t *synth, int channel, int key, int velocity);
-
-static void FPreset_Construct(FPreset *self, ALsfpreset *preset, fluid_sfont_t *parent)
-{
- STATIC_CAST(fluid_preset_t, self)->data = self;
- STATIC_CAST(fluid_preset_t, self)->sfont = parent;
- STATIC_CAST(fluid_preset_t, self)->free = NULL;
- STATIC_CAST(fluid_preset_t, self)->get_name = FPreset_getName;
- STATIC_CAST(fluid_preset_t, self)->get_banknum = FPreset_getBank;
- STATIC_CAST(fluid_preset_t, self)->get_num = FPreset_getPreset;
- STATIC_CAST(fluid_preset_t, self)->noteon = FPreset_noteOn;
- STATIC_CAST(fluid_preset_t, self)->notify = NULL;
-
- memset(self->Name, 0, sizeof(self->Name));
- self->Preset = preset->Preset;
- self->Bank = preset->Bank;
-
- self->NumSamples = 0;
- self->Samples = calloc(1, preset->NumSounds * sizeof(self->Samples[0]));
- if(self->Samples)
- {
- ALsizei i;
- self->NumSamples = preset->NumSounds;
- for(i = 0;i < self->NumSamples;i++)
- FSample_Construct(&self->Samples[i], preset->Sounds[i]);
- }
-}
-
-static void FPreset_Destruct(FPreset *self)
-{
- ALsizei i;
-
- for(i = 0;i < self->NumSamples;i++)
- FSample_Destruct(&self->Samples[i]);
- free(self->Samples);
- self->Samples = NULL;
- self->NumSamples = 0;
-}
-
-static ALboolean FPreset_canDelete(FPreset *self)
-{
- ALsizei i;
- for(i = 0;i < self->NumSamples;i++)
- {
- if(fluid_sample_refcount(STATIC_CAST(fluid_sample_t, &self->Samples[i])) != 0)
- return AL_FALSE;
- }
- return AL_TRUE;
-}
-
-static char* FPreset_getName(fluid_preset_t *preset)
-{
- return ((FPreset*)preset->data)->Name;
-}
-
-static int FPreset_getPreset(fluid_preset_t *preset)
-{
- return ((FPreset*)preset->data)->Preset;
-}
-
-static int FPreset_getBank(fluid_preset_t *preset)
-{
- return ((FPreset*)preset->data)->Bank;
-}
-
-static int FPreset_noteOn(fluid_preset_t *preset, fluid_synth_t *synth, int channel, int key, int vel)
-{
- FPreset *self = ((FPreset*)preset->data);
- ALsizei i;
-
- for(i = 0;i < self->NumSamples;i++)
- {
- FSample *sample = &self->Samples[i];
- ALfontsound *sound = sample->Sound;
- fluid_voice_t *voice;
- ALsizei m;
-
- if(!(key >= sound->MinKey && key <= sound->MaxKey && vel >= sound->MinVelocity && vel <= sound->MaxVelocity))
- continue;
-
- voice = fluid_synth_alloc_voice(synth, STATIC_CAST(fluid_sample_t, sample), channel, key, vel);
- if(voice == NULL) return FLUID_FAILED;
-
- fluid_voice_gen_set(voice, GEN_MODLFOTOPITCH, sound->ModLfoToPitch);
- fluid_voice_gen_set(voice, GEN_VIBLFOTOPITCH, sound->VibratoLfoToPitch);
- fluid_voice_gen_set(voice, GEN_MODENVTOPITCH, sound->ModEnvToPitch);
- fluid_voice_gen_set(voice, GEN_FILTERFC, sound->FilterCutoff);
- fluid_voice_gen_set(voice, GEN_FILTERQ, sound->FilterQ);
- fluid_voice_gen_set(voice, GEN_MODLFOTOFILTERFC, sound->ModLfoToFilterCutoff);
- fluid_voice_gen_set(voice, GEN_MODENVTOFILTERFC, sound->ModEnvToFilterCutoff);
- fluid_voice_gen_set(voice, GEN_MODLFOTOVOL, sound->ModLfoToVolume);
- fluid_voice_gen_set(voice, GEN_CHORUSSEND, sound->ChorusSend);
- fluid_voice_gen_set(voice, GEN_REVERBSEND, sound->ReverbSend);
- fluid_voice_gen_set(voice, GEN_PAN, sound->Pan);
- fluid_voice_gen_set(voice, GEN_MODLFODELAY, sound->ModLfo.Delay);
- fluid_voice_gen_set(voice, GEN_MODLFOFREQ, sound->ModLfo.Frequency);
- fluid_voice_gen_set(voice, GEN_VIBLFODELAY, sound->VibratoLfo.Delay);
- fluid_voice_gen_set(voice, GEN_VIBLFOFREQ, sound->VibratoLfo.Frequency);
- fluid_voice_gen_set(voice, GEN_MODENVDELAY, sound->ModEnv.DelayTime);
- fluid_voice_gen_set(voice, GEN_MODENVATTACK, sound->ModEnv.AttackTime);
- fluid_voice_gen_set(voice, GEN_MODENVHOLD, sound->ModEnv.HoldTime);
- fluid_voice_gen_set(voice, GEN_MODENVDECAY, sound->ModEnv.DecayTime);
- fluid_voice_gen_set(voice, GEN_MODENVSUSTAIN, sound->ModEnv.SustainAttn);
- fluid_voice_gen_set(voice, GEN_MODENVRELEASE, sound->ModEnv.ReleaseTime);
- fluid_voice_gen_set(voice, GEN_KEYTOMODENVHOLD, sound->ModEnv.KeyToHoldTime);
- fluid_voice_gen_set(voice, GEN_KEYTOMODENVDECAY, sound->ModEnv.KeyToDecayTime);
- fluid_voice_gen_set(voice, GEN_VOLENVDELAY, sound->VolEnv.DelayTime);
- fluid_voice_gen_set(voice, GEN_VOLENVATTACK, sound->VolEnv.AttackTime);
- fluid_voice_gen_set(voice, GEN_VOLENVHOLD, sound->VolEnv.HoldTime);
- fluid_voice_gen_set(voice, GEN_VOLENVDECAY, sound->VolEnv.DecayTime);
- fluid_voice_gen_set(voice, GEN_VOLENVSUSTAIN, sound->VolEnv.SustainAttn);
- fluid_voice_gen_set(voice, GEN_VOLENVRELEASE, sound->VolEnv.ReleaseTime);
- fluid_voice_gen_set(voice, GEN_KEYTOVOLENVHOLD, sound->VolEnv.KeyToHoldTime);
- fluid_voice_gen_set(voice, GEN_KEYTOVOLENVDECAY, sound->VolEnv.KeyToDecayTime);
- fluid_voice_gen_set(voice, GEN_ATTENUATION, sound->Attenuation);
- fluid_voice_gen_set(voice, GEN_COARSETUNE, sound->CoarseTuning);
- fluid_voice_gen_set(voice, GEN_FINETUNE, sound->FineTuning);
- fluid_voice_gen_set(voice, GEN_SAMPLEMODE, getSf2LoopMode(sound->LoopMode));
- fluid_voice_gen_set(voice, GEN_SCALETUNE, sound->TuningScale);
- fluid_voice_gen_set(voice, GEN_EXCLUSIVECLASS, sound->ExclusiveClass);
- for(m = 0;m < sample->NumMods;m++)
- fluid_voice_add_mod(voice, &sample->Mods[m], FLUID_VOICE_OVERWRITE);
-
- fluid_synth_start_voice(synth, voice);
- }
-
- return FLUID_OK;
-}
-
-
-typedef struct FSfont {
- DERIVE_FROM_TYPE(fluid_sfont_t);
-
- char Name[16];
-
- FPreset *Presets;
- ALsizei NumPresets;
-
- ALsizei CurrentPos;
-} FSfont;
-
-static int FSfont_free(fluid_sfont_t *sfont);
-static char* FSfont_getName(fluid_sfont_t *sfont);
-static fluid_preset_t* FSfont_getPreset(fluid_sfont_t *sfont, unsigned int bank, unsigned int prenum);
-static void FSfont_iterStart(fluid_sfont_t *sfont);
-static int FSfont_iterNext(fluid_sfont_t *sfont, fluid_preset_t *preset);
-
-static void FSfont_Construct(FSfont *self, ALsoundfont *sfont)
-{
- STATIC_CAST(fluid_sfont_t, self)->data = self;
- STATIC_CAST(fluid_sfont_t, self)->id = FLUID_FAILED;
- STATIC_CAST(fluid_sfont_t, self)->free = FSfont_free;
- STATIC_CAST(fluid_sfont_t, self)->get_name = FSfont_getName;
- STATIC_CAST(fluid_sfont_t, self)->get_preset = FSfont_getPreset;
- STATIC_CAST(fluid_sfont_t, self)->iteration_start = FSfont_iterStart;
- STATIC_CAST(fluid_sfont_t, self)->iteration_next = FSfont_iterNext;
-
- memset(self->Name, 0, sizeof(self->Name));
- self->CurrentPos = 0;
- self->NumPresets = 0;
- self->Presets = calloc(1, sfont->NumPresets * sizeof(self->Presets[0]));
- if(self->Presets)
- {
- ALsizei i;
- self->NumPresets = sfont->NumPresets;
- for(i = 0;i < self->NumPresets;i++)
- FPreset_Construct(&self->Presets[i], sfont->Presets[i], STATIC_CAST(fluid_sfont_t, self));
- }
-}
-
-static void FSfont_Destruct(FSfont *self)
-{
- ALsizei i;
-
- for(i = 0;i < self->NumPresets;i++)
- FPreset_Destruct(&self->Presets[i]);
- free(self->Presets);
- self->Presets = NULL;
- self->NumPresets = 0;
- self->CurrentPos = 0;
-}
-
-static int FSfont_free(fluid_sfont_t *sfont)
-{
- FSfont *self = STATIC_UPCAST(FSfont, fluid_sfont_t, sfont);
- ALsizei i;
-
- for(i = 0;i < self->NumPresets;i++)
- {
- if(!FPreset_canDelete(&self->Presets[i]))
- return 1;
- }
-
- FSfont_Destruct(self);
- free(self);
- return 0;
-}
-
-static char* FSfont_getName(fluid_sfont_t *sfont)
-{
- return STATIC_UPCAST(FSfont, fluid_sfont_t, sfont)->Name;
-}
-
-static fluid_preset_t *FSfont_getPreset(fluid_sfont_t *sfont, unsigned int bank, unsigned int prenum)
-{
- FSfont *self = STATIC_UPCAST(FSfont, fluid_sfont_t, sfont);
- ALsizei i;
-
- for(i = 0;i < self->NumPresets;i++)
- {
- FPreset *preset = &self->Presets[i];
- if(preset->Bank == (int)bank && preset->Preset == (int)prenum)
- return STATIC_CAST(fluid_preset_t, preset);
- }
-
- return NULL;
-}
-
-static void FSfont_iterStart(fluid_sfont_t *sfont)
-{
- STATIC_UPCAST(FSfont, fluid_sfont_t, sfont)->CurrentPos = 0;
-}
-
-static int FSfont_iterNext(fluid_sfont_t *sfont, fluid_preset_t *preset)
-{
- FSfont *self = STATIC_UPCAST(FSfont, fluid_sfont_t, sfont);
- if(self->CurrentPos >= self->NumPresets)
- return 0;
- *preset = *STATIC_CAST(fluid_preset_t, &self->Presets[self->CurrentPos++]);
- preset->free = NULL;
- return 1;
-}
-
-
-typedef struct FSynth {
- DERIVE_FROM_TYPE(MidiSynth);
- DERIVE_FROM_TYPE(fluid_sfloader_t);
-
- fluid_settings_t *Settings;
- fluid_synth_t *Synth;
- int *FontIDs;
- ALsizei NumFontIDs;
-
- ALboolean ForceGM2BankSelect;
- ALfloat GainScale;
-} FSynth;
-
-static void FSynth_Construct(FSynth *self, ALCdevice *device);
-static void FSynth_Destruct(FSynth *self);
-static ALboolean FSynth_init(FSynth *self, ALCdevice *device);
-static ALenum FSynth_selectSoundfonts(FSynth *self, ALCcontext *context, ALsizei count, const ALuint *ids);
-static void FSynth_setGain(FSynth *self, ALfloat gain);
-static void FSynth_stop(FSynth *self);
-static void FSynth_reset(FSynth *self);
-static void FSynth_update(FSynth *self, ALCdevice *device);
-static void FSynth_processQueue(FSynth *self, ALuint64 time);
-static void FSynth_process(FSynth *self, ALuint SamplesToDo, ALfloat (*restrict DryBuffer)[BUFFERSIZE], ALuint NumChannels);
-DECLARE_DEFAULT_ALLOCATORS(FSynth)
-DEFINE_MIDISYNTH_VTABLE(FSynth);
-
-static fluid_sfont_t *FSynth_loadSfont(fluid_sfloader_t *loader, const char *filename);
-
-
-static void FSynth_Construct(FSynth *self, ALCdevice *device)
-{
- MidiSynth_Construct(STATIC_CAST(MidiSynth, self), device);
- SET_VTABLE2(FSynth, MidiSynth, self);
-
- STATIC_CAST(fluid_sfloader_t, self)->data = self;
- STATIC_CAST(fluid_sfloader_t, self)->free = NULL;
- STATIC_CAST(fluid_sfloader_t, self)->load = FSynth_loadSfont;
-
- self->Settings = NULL;
- self->Synth = NULL;
- self->FontIDs = NULL;
- self->NumFontIDs = 0;
- self->ForceGM2BankSelect = AL_FALSE;
- self->GainScale = 0.2f;
-}
-
-static void FSynth_Destruct(FSynth *self)
-{
- ALsizei i;
-
- for(i = 0;i < self->NumFontIDs;i++)
- fluid_synth_sfunload(self->Synth, self->FontIDs[i], 0);
- free(self->FontIDs);
- self->FontIDs = NULL;
- self->NumFontIDs = 0;
-
- if(self->Synth != NULL)
- delete_fluid_synth(self->Synth);
- self->Synth = NULL;
-
- if(self->Settings != NULL)
- delete_fluid_settings(self->Settings);
- self->Settings = NULL;
-
- MidiSynth_Destruct(STATIC_CAST(MidiSynth, self));
-}
-
-static ALboolean FSynth_init(FSynth *self, ALCdevice *device)
-{
- ALfloat vol;
-
- if(ConfigValueFloat(NULL, "midi", "volume", &vol))
- {
- if(!(vol <= 0.0f))
- {
- ERR("MIDI volume %f clamped to 0\n", vol);
- vol = 0.0f;
- }
- self->GainScale = powf(10.0f, vol / 20.0f);
- }
-
- self->Settings = new_fluid_settings();
- if(!self->Settings)
- {
- ERR("Failed to create FluidSettings\n");
- return AL_FALSE;
- }
-
- fluid_settings_setint(self->Settings, "synth.polyphony", 256);
- fluid_settings_setnum(self->Settings, "synth.gain", self->GainScale);
- fluid_settings_setnum(self->Settings, "synth.sample-rate", device->Frequency);
-
- self->Synth = new_fluid_synth(self->Settings);
- if(!self->Synth)
- {
- ERR("Failed to create FluidSynth\n");
- return AL_FALSE;
- }
-
- fluid_synth_add_sfloader(self->Synth, STATIC_CAST(fluid_sfloader_t, self));
-
- return AL_TRUE;
-}
-
-
-static fluid_sfont_t *FSynth_loadSfont(fluid_sfloader_t *loader, const char *filename)
-{
- FSynth *self = STATIC_UPCAST(FSynth, fluid_sfloader_t, loader);
- FSfont *sfont;
- int idx;
-
- if(!filename || sscanf(filename, "_al_internal %d", &idx) != 1)
- return NULL;
- if(idx < 0 || idx >= STATIC_CAST(MidiSynth, self)->NumSoundfonts)
- {
- ERR("Received invalid soundfont index %d (max: %d)\n", idx, STATIC_CAST(MidiSynth, self)->NumSoundfonts);
- return NULL;
- }
-
- sfont = calloc(1, sizeof(sfont[0]));
- if(!sfont) return NULL;
-
- FSfont_Construct(sfont, STATIC_CAST(MidiSynth, self)->Soundfonts[idx]);
- return STATIC_CAST(fluid_sfont_t, sfont);
-}
-
-static ALenum FSynth_selectSoundfonts(FSynth *self, ALCcontext *context, ALsizei count, const ALuint *ids)
-{
- int *fontid;
- ALenum ret;
- ALsizei i;
-
- ret = MidiSynth_selectSoundfonts(STATIC_CAST(MidiSynth, self), context, count, ids);
- if(ret != AL_NO_ERROR) return ret;
-
- ALCdevice_Lock(context->Device);
- for(i = 0;i < 16;i++)
- fluid_synth_all_sounds_off(self->Synth, i);
- ALCdevice_Unlock(context->Device);
-
- fontid = malloc(count * sizeof(fontid[0]));
- if(fontid)
- {
- for(i = 0;i < STATIC_CAST(MidiSynth, self)->NumSoundfonts;i++)
- {
- char name[16];
- snprintf(name, sizeof(name), "_al_internal %d", i);
-
- fontid[i] = fluid_synth_sfload(self->Synth, name, 0);
- if(fontid[i] == FLUID_FAILED)
- ERR("Failed to load selected soundfont %d\n", i);
- }
-
- fontid = ExchangePtr((XchgPtr*)&self->FontIDs, fontid);
- count = ExchangeInt(&self->NumFontIDs, count);
- }
- else
- {
- ERR("Failed to allocate space for %d font IDs!\n", count);
- fontid = self->FontIDs;
- count = self->NumFontIDs;
- self->FontIDs = NULL;
- self->NumFontIDs = 0;
- }
-
- for(i = 0;i < count;i++)
- fluid_synth_sfunload(self->Synth, fontid[i], 0);
- free(fontid);
-
- return ret;
-}
-
-
-static void FSynth_setGain(FSynth *self, ALfloat gain)
-{
- fluid_settings_setnum(self->Settings, "synth.gain", self->GainScale * gain);
- fluid_synth_set_gain(self->Synth, self->GainScale * gain);
- MidiSynth_setGain(STATIC_CAST(MidiSynth, self), gain);
-}
-
-
-static void FSynth_stop(FSynth *self)
-{
- MidiSynth *synth = STATIC_CAST(MidiSynth, self);
- ALuint64 curtime;
- ALsizei chan;
-
- /* Make sure all pending events are processed. */
- curtime = MidiSynth_getTime(synth);
- FSynth_processQueue(self, curtime);
-
- /* All notes off */
- for(chan = 0;chan < 16;chan++)
- fluid_synth_cc(self->Synth, chan, CTRL_ALLNOTESOFF, 0);
-
- MidiSynth_stop(STATIC_CAST(MidiSynth, self));
-}
-
-static void FSynth_reset(FSynth *self)
-{
- /* Reset to power-up status. */
- fluid_synth_system_reset(self->Synth);
-
- MidiSynth_reset(STATIC_CAST(MidiSynth, self));
-}
-
-
-static void FSynth_update(FSynth *self, ALCdevice *device)
-{
- fluid_settings_setnum(self->Settings, "synth.sample-rate", device->Frequency);
- fluid_synth_set_sample_rate(self->Synth, device->Frequency);
- MidiSynth_update(STATIC_CAST(MidiSynth, self), device);
-}
-
-
-static void FSynth_processQueue(FSynth *self, ALuint64 time)
-{
- EvtQueue *queue = &STATIC_CAST(MidiSynth, self)->EventQueue;
-
- while(queue->pos < queue->size && queue->events[queue->pos].time <= time)
- {
- const MidiEvent *evt = &queue->events[queue->pos];
-
- if(evt->event == SYSEX_EVENT)
- {
- static const ALbyte gm2_on[] = { 0x7E, 0x7F, 0x09, 0x03 };
- static const ALbyte gm2_off[] = { 0x7E, 0x7F, 0x09, 0x02 };
- int handled = 0;
-
- fluid_synth_sysex(self->Synth, evt->param.sysex.data, evt->param.sysex.size, NULL, NULL, &handled, 0);
- if(!handled && evt->param.sysex.size >= (ALsizei)sizeof(gm2_on))
- {
- if(memcmp(evt->param.sysex.data, gm2_on, sizeof(gm2_on)) == 0)
- self->ForceGM2BankSelect = AL_TRUE;
- else if(memcmp(evt->param.sysex.data, gm2_off, sizeof(gm2_off)) == 0)
- self->ForceGM2BankSelect = AL_FALSE;
- }
- }
- else switch((evt->event&0xF0))
- {
- case AL_NOTEOFF_SOFT:
- fluid_synth_noteoff(self->Synth, (evt->event&0x0F), evt->param.val[0]);
- break;
- case AL_NOTEON_SOFT:
- fluid_synth_noteon(self->Synth, (evt->event&0x0F), evt->param.val[0], evt->param.val[1]);
- break;
- case AL_KEYPRESSURE_SOFT:
- break;
-
- case AL_CONTROLLERCHANGE_SOFT:
- if(self->ForceGM2BankSelect)
- {
- int chan = (evt->event&0x0F);
- if(evt->param.val[0] == CTRL_BANKSELECT_MSB)
- {
- if(evt->param.val[1] == 120 && (chan == 9 || chan == 10))
- fluid_synth_set_channel_type(self->Synth, chan, CHANNEL_TYPE_DRUM);
- else if(evt->param.val[1] == 121)
- fluid_synth_set_channel_type(self->Synth, chan, CHANNEL_TYPE_MELODIC);
- break;
- }
- if(evt->param.val[0] == CTRL_BANKSELECT_LSB)
- {
- fluid_synth_bank_select(self->Synth, chan, evt->param.val[1]);
- break;
- }
- }
- fluid_synth_cc(self->Synth, (evt->event&0x0F), evt->param.val[0], evt->param.val[1]);
- break;
- case AL_PROGRAMCHANGE_SOFT:
- fluid_synth_program_change(self->Synth, (evt->event&0x0F), evt->param.val[0]);
- break;
-
- case AL_CHANNELPRESSURE_SOFT:
- fluid_synth_channel_pressure(self->Synth, (evt->event&0x0F), evt->param.val[0]);
- break;
-
- case AL_PITCHBEND_SOFT:
- fluid_synth_pitch_bend(self->Synth, (evt->event&0x0F), (evt->param.val[0]&0x7F) |
- ((evt->param.val[1]&0x7F)<<7));
- break;
- }
-
- queue->pos++;
- }
-}
-
-static void FSynth_process(FSynth *self, ALuint SamplesToDo, ALfloat (*restrict DryBuffer)[BUFFERSIZE], ALuint NumChannels)
-{
- MidiSynth *synth = STATIC_CAST(MidiSynth, self);
- ALfloat *LeftBuffer = DryBuffer[0];
- ALfloat *RightBuffer = DryBuffer[(NumChannels > 1) ? 1 : 0];
- ALenum state = synth->State;
- ALuint64 curtime;
- ALuint total = 0;
-
- if(state == AL_INITIAL)
- return;
- if(state != AL_PLAYING)
- {
- fluid_synth_write_float(self->Synth, SamplesToDo, LeftBuffer, 0, 1,
- RightBuffer, 0, 1);
- return;
- }
-
- curtime = MidiSynth_getTime(synth);
- while(total < SamplesToDo)
- {
- ALuint64 time, diff;
- ALint tonext;
-
- time = MidiSynth_getNextEvtTime(synth);
- diff = maxu64(time, curtime) - curtime;
- if(diff >= MIDI_CLOCK_RES || time == UINT64_MAX)
- {
- /* If there's no pending event, or if it's more than 1 second
- * away, do as many samples as we can. */
- tonext = INT_MAX;
- }
- else
- {
- /* Figure out how many samples until the next event. */
- tonext = (ALint)((diff*synth->SampleRate + (MIDI_CLOCK_RES-1)) / MIDI_CLOCK_RES);
- tonext -= total;
- }
-
- if(tonext > 0)
- {
- ALuint todo = minu(tonext, SamplesToDo-total);
- fluid_synth_write_float(self->Synth, todo, LeftBuffer, total, 1,
- RightBuffer, total, 1);
- total += todo;
- tonext -= todo;
- }
- if(total < SamplesToDo && tonext <= 0)
- FSynth_processQueue(self, time);
- }
-
- synth->SamplesDone += SamplesToDo;
- synth->ClockBase += (synth->SamplesDone/synth->SampleRate) * MIDI_CLOCK_RES;
- synth->SamplesDone %= synth->SampleRate;
-}
-
-
-MidiSynth *FSynth_create(ALCdevice *device)
-{
- FSynth *synth;
-
- if(!LoadFSynth())
- return NULL;
-
- NEW_OBJ(synth, FSynth)(device);
- if(!synth)
- {
- ERR("Failed to allocate FSynth\n");
- return NULL;
- }
-
- if(FSynth_init(synth, device) == AL_FALSE)
- {
- DELETE_OBJ(STATIC_CAST(MidiSynth, synth));
- return NULL;
- }
-
- return STATIC_CAST(MidiSynth, synth);
-}
-
-#else
-
-MidiSynth *FSynth_create(ALCdevice* UNUSED(device))
-{
- return NULL;
-}
-
-#endif
diff --git a/Alc/midi/sf2load.c b/Alc/midi/sf2load.c
deleted file mode 100644
index 31f6ee02..00000000
--- a/Alc/midi/sf2load.c
+++ /dev/null
@@ -1,1373 +0,0 @@
-
-#include "config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "alMain.h"
-#include "alMidi.h"
-#include "alError.h"
-#include "alu.h"
-
-#include "midi/base.h"
-
-
-static ALuint read_le32(Reader *stream)
-{
- ALubyte buf[4];
- if(Reader_read(stream, buf, 4) != 4)
- return 0;
- return (buf[3]<<24) | (buf[2]<<16) | (buf[1]<<8) | buf[0];
-}
-static ALushort read_le16(Reader *stream)
-{
- ALubyte buf[2];
- if(Reader_read(stream, buf, 2) != 2)
- return 0;
- return (buf[1]<<8) | buf[0];
-}
-static ALubyte read_8(Reader *stream)
-{
- ALubyte buf[1];
- if(Reader_read(stream, buf, 1) != 1)
- return 0;
- return buf[0];
-}
-static void skip(Reader *stream, ALuint amt)
-{
- while(amt > 0 && !READERR(stream))
- {
- char buf[4096];
- amt -= Reader_read(stream, buf, minu(sizeof(buf), amt));
- }
-}
-
-typedef struct Generator {
- ALushort mGenerator;
- ALushort mAmount;
-} Generator;
-static void Generator_read(Generator *self, Reader *stream)
-{
- self->mGenerator = read_le16(stream);
- self->mAmount = read_le16(stream);
-}
-
-static const ALint DefaultGenValue[60] = {
- 0, /* 0 - startAddrOffset */
- 0, /* 1 - endAddrOffset */
- 0, /* 2 - startloopAddrOffset */
- 0, /* 3 - endloopAddrOffset */
- 0, /* 4 - startAddrCoarseOffset */
- 0, /* 5 - modLfoToPitch */
- 0, /* 6 - vibLfoToPitch */
- 0, /* 7 - modEnvToPitch */
- 13500, /* 8 - initialFilterFc */
- 0, /* 9 - initialFilterQ */
- 0, /* 10 - modLfoToFilterFc */
- 0, /* 11 - modEnvToFilterFc */
- 0, /* 12 - endAddrCoarseOffset */
- 0, /* 13 - modLfoToVolume */
- 0, /* 14 - */
- 0, /* 15 - chorusEffectsSend */
- 0, /* 16 - reverbEffectsSend */
- 0, /* 17 - pan */
- 0, /* 18 - */
- 0, /* 19 - */
- 0, /* 20 - */
- -12000, /* 21 - delayModLFO */
- 0, /* 22 - freqModLFO */
- -12000, /* 23 - delayVibLFO */
- 0, /* 24 - freqVibLFO */
- -12000, /* 25 - delayModEnv */
- -12000, /* 26 - attackModEnv */
- -12000, /* 27 - holdModEnv */
- -12000, /* 28 - decayModEnv */
- 0, /* 29 - sustainModEnv */
- -12000, /* 30 - releaseModEnv */
- 0, /* 31 - keynumToModEnvHold */
- 0, /* 32 - keynumToModEnvDecay */
- -12000, /* 33 - delayVolEnv */
- -12000, /* 34 - attackVolEnv */
- -12000, /* 35 - holdVolEnv */
- -12000, /* 36 - decayVolEnv */
- 0, /* 37 - sustainVolEnv */
- -12000, /* 38 - releaseVolEnv */
- 0, /* 39 - keynumToVolEnvHold */
- 0, /* 40 - keynumToVolEnvDecay */
- 0, /* 41 - */
- 0, /* 42 - */
- 0, /* 43 - keyRange */
- 0, /* 44 - velRange */
- 0, /* 45 - startloopAddrCoarseOffset */
- 0, /* 46 - keynum */
- 0, /* 47 - velocity */
- 0, /* 48 - initialAttenuation */
- 0, /* 49 - */
- 0, /* 50 - endloopAddrCoarseOffset */
- 0, /* 51 - corseTune */
- 0, /* 52 - fineTune */
- 0, /* 53 - */
- 0, /* 54 - sampleModes */
- 0, /* 55 - */
- 100, /* 56 - scaleTuning */
- 0, /* 57 - exclusiveClass */
- 0, /* 58 - overridingRootKey */
- 0, /* 59 - */
-};
-
-typedef struct Modulator {
- ALushort mSrcOp;
- ALushort mDstOp;
- ALshort mAmount;
- ALushort mAmtSrcOp;
- ALushort mTransOp;
-} Modulator;
-static void Modulator_read(Modulator *self, Reader *stream)
-{
- self->mSrcOp = read_le16(stream);
- self->mDstOp = read_le16(stream);
- self->mAmount = read_le16(stream);
- self->mAmtSrcOp = read_le16(stream);
- self->mTransOp = read_le16(stream);
-}
-
-typedef struct Zone {
- ALushort mGenIdx;
- ALushort mModIdx;
-} Zone;
-static void Zone_read(Zone *self, Reader *stream)
-{
- self->mGenIdx = read_le16(stream);
- self->mModIdx = read_le16(stream);
-}
-
-typedef struct PresetHeader {
- ALchar mName[20];
- ALushort mPreset; /* MIDI program number */
- ALushort mBank;
- ALushort mZoneIdx;
- ALuint mLibrary;
- ALuint mGenre;
- ALuint mMorphology;
-} PresetHeader;
-static void PresetHeader_read(PresetHeader *self, Reader *stream)
-{
- Reader_read(stream, self->mName, sizeof(self->mName));
- self->mPreset = read_le16(stream);
- self->mBank = read_le16(stream);
- self->mZoneIdx = read_le16(stream);
- self->mLibrary = read_le32(stream);
- self->mGenre = read_le32(stream);
- self->mMorphology = read_le32(stream);
-}
-
-typedef struct InstrumentHeader {
- ALchar mName[20];
- ALushort mZoneIdx;
-} InstrumentHeader;
-static void InstrumentHeader_read(InstrumentHeader *self, Reader *stream)
-{
- Reader_read(stream, self->mName, sizeof(self->mName));
- self->mZoneIdx = read_le16(stream);
-}
-
-typedef struct SampleHeader {
- ALchar mName[20];
- ALuint mStart;
- ALuint mEnd;
- ALuint mStartloop;
- ALuint mEndloop;
- ALuint mSampleRate;
- ALubyte mOriginalKey;
- ALbyte mCorrection;
- ALushort mSampleLink;
- ALushort mSampleType;
-} SampleHeader;
-static void SampleHeader_read(SampleHeader *self, Reader *stream)
-{
- Reader_read(stream, self->mName, sizeof(self->mName));
- self->mStart = read_le32(stream);
- self->mEnd = read_le32(stream);
- self->mStartloop = read_le32(stream);
- self->mEndloop = read_le32(stream);
- self->mSampleRate = read_le32(stream);
- self->mOriginalKey = read_8(stream);
- self->mCorrection = read_8(stream);
- self->mSampleLink = read_le16(stream);
- self->mSampleType = read_le16(stream);
-}
-
-
-typedef struct Soundfont {
- ALuint ifil;
- ALchar *irom;
-
- PresetHeader *phdr;
- ALsizei phdr_size;
-
- Zone *pbag;
- ALsizei pbag_size;
- Modulator *pmod;
- ALsizei pmod_size;
- Generator *pgen;
- ALsizei pgen_size;
-
- InstrumentHeader *inst;
- ALsizei inst_size;
-
- Zone *ibag;
- ALsizei ibag_size;
- Modulator *imod;
- ALsizei imod_size;
- Generator *igen;
- ALsizei igen_size;
-
- SampleHeader *shdr;
- ALsizei shdr_size;
-} Soundfont;
-
-static void Soundfont_Construct(Soundfont *self)
-{
- self->ifil = 0;
- self->irom = NULL;
-
- self->phdr = NULL;
- self->phdr_size = 0;
-
- self->pbag = NULL;
- self->pbag_size = 0;
- self->pmod = NULL;
- self->pmod_size = 0;
- self->pgen = NULL;
- self->pgen_size = 0;
-
- self->inst = NULL;
- self->inst_size = 0;
-
- self->ibag = NULL;
- self->ibag_size = 0;
- self->imod = NULL;
- self->imod_size = 0;
- self->igen = NULL;
- self->igen_size = 0;
-
- self->shdr = NULL;
- self->shdr_size = 0;
-}
-
-static void Soundfont_Destruct(Soundfont *self)
-{
- free(self->irom);
- self->irom = NULL;
-
- free(self->phdr);
- self->phdr = NULL;
- self->phdr_size = 0;
-
- free(self->pbag);
- self->pbag = NULL;
- self->pbag_size = 0;
- free(self->pmod);
- self->pmod = NULL;
- self->pmod_size = 0;
- free(self->pgen);
- self->pgen = NULL;
- self->pgen_size = 0;
-
- free(self->inst);
- self->inst = NULL;
- self->inst_size = 0;
-
- free(self->ibag);
- self->ibag = NULL;
- self->ibag_size = 0;
- free(self->imod);
- self->imod = NULL;
- self->imod_size = 0;
- free(self->igen);
- self->igen = NULL;
- self->igen_size = 0;
-
- free(self->shdr);
- self->shdr = NULL;
- self->shdr_size = 0;
-}
-
-
-#define FOURCC(a,b,c,d) ((a) | ((b)<<8) | ((c)<<16) | ((d)<<24))
-#define FOURCCFMT "%c%c%c%c"
-#define FOURCCARGS(x) (char)((x)&0xff), (char)(((x)>>8)&0xff), (char)(((x)>>16)&0xff), (char)(((x)>>24)&0xff)
-typedef struct RiffHdr {
- ALuint mCode;
- ALuint mSize;
-} RiffHdr;
-static void RiffHdr_read(RiffHdr *self, Reader *stream)
-{
- self->mCode = read_le32(stream);
- self->mSize = read_le32(stream);
-}
-
-
-typedef struct GenModList {
- VECTOR(Generator) gens;
- VECTOR(Modulator) mods;
-} GenModList;
-
-static void GenModList_Construct(GenModList *self)
-{
- VECTOR_INIT(self->gens);
- VECTOR_INIT(self->mods);
-}
-
-static void GenModList_Destruct(GenModList *self)
-{
- VECTOR_DEINIT(self->mods);
- VECTOR_DEINIT(self->gens);
-}
-
-static GenModList GenModList_clone(const GenModList *self)
-{
- GenModList ret;
-
- GenModList_Construct(&ret);
-
- VECTOR_INSERT(ret.gens, VECTOR_ITER_END(ret.gens),
- VECTOR_ITER_BEGIN(self->gens), VECTOR_ITER_END(self->gens)
- );
- VECTOR_INSERT(ret.mods, VECTOR_ITER_END(ret.mods),
- VECTOR_ITER_BEGIN(self->mods), VECTOR_ITER_END(self->mods)
- );
-
- return ret;
-}
-
-static void GenModList_insertGen(GenModList *self, const Generator *gen, ALboolean ispreset)
-{
- Generator *i;
-#define MATCH_GENERATOR(i) ((i)->mGenerator == gen->mGenerator)
- VECTOR_FIND_IF(i, Generator, self->gens, MATCH_GENERATOR);
- if(i != VECTOR_ITER_END(self->gens))
- {
- i->mAmount = gen->mAmount;
- return;
- }
-#undef MATCH_GENERATOR
-
- if(ispreset &&
- (gen->mGenerator == 0 || gen->mGenerator == 1 || gen->mGenerator == 2 ||
- gen->mGenerator == 3 || gen->mGenerator == 4 || gen->mGenerator == 12 ||
- gen->mGenerator == 45 || gen->mGenerator == 46 || gen->mGenerator == 47 ||
- gen->mGenerator == 50 || gen->mGenerator == 54 || gen->mGenerator == 57 ||
- gen->mGenerator == 58))
- return;
-
- if(VECTOR_PUSH_BACK(self->gens, *gen) == AL_FALSE)
- {
- ERR("Failed to insert generator (from "SZFMT" elements)\n", VECTOR_SIZE(self->gens));
- return;
- }
-}
-static void GenModList_accumGen(GenModList *self, const Generator *gen)
-{
- Generator *i;
-#define MATCH_GENERATOR(i) ((i)->mGenerator == gen->mGenerator)
- VECTOR_FIND_IF(i, Generator, self->gens, MATCH_GENERATOR);
- if(i != VECTOR_ITER_END(self->gens))
- {
- if(gen->mGenerator == 43 || gen->mGenerator == 44)
- {
- /* Range generators accumulate by taking the intersection of the
- * two ranges.
- */
- ALushort low = maxu(i->mAmount&0x00ff, gen->mAmount&0x00ff);
- ALushort high = minu(i->mAmount&0xff00, gen->mAmount&0xff00);
- i->mAmount = low | high;
- }
- else
- i->mAmount += gen->mAmount;
- return;
- }
-#undef MATCH_GENERATOR
-
- if(VECTOR_PUSH_BACK(self->gens, *gen) == AL_FALSE)
- {
- ERR("Failed to insert generator (from "SZFMT" elements)\n", VECTOR_SIZE(self->gens));
- return;
- }
- if(gen->mGenerator < 60)
- VECTOR_BACK(self->gens).mAmount += DefaultGenValue[gen->mGenerator];
-}
-
-static void GenModList_insertMod(GenModList *self, const Modulator *mod)
-{
- Modulator *i;
-#define MATCH_MODULATOR(i) ((i)->mDstOp == mod->mDstOp && (i)->mSrcOp == mod->mSrcOp && \
- (i)->mAmtSrcOp == mod->mAmtSrcOp && (i)->mTransOp == mod->mTransOp)
- VECTOR_FIND_IF(i, Modulator, self->mods, MATCH_MODULATOR);
- if(i != VECTOR_ITER_END(self->mods))
- {
- i->mAmount = mod->mAmount;
- return;
- }
-#undef MATCH_MODULATOR
-
- if(VECTOR_PUSH_BACK(self->mods, *mod) == AL_FALSE)
- {
- ERR("Failed to insert modulator (from "SZFMT" elements)\n", VECTOR_SIZE(self->mods));
- return;
- }
-}
-static void GenModList_accumMod(GenModList *self, const Modulator *mod)
-{
- Modulator *i;
-#define MATCH_MODULATOR(i) ((i)->mDstOp == mod->mDstOp && (i)->mSrcOp == mod->mSrcOp && \
- (i)->mAmtSrcOp == mod->mAmtSrcOp && (i)->mTransOp == mod->mTransOp)
- VECTOR_FIND_IF(i, Modulator, self->mods, MATCH_MODULATOR);
- if(i != VECTOR_ITER_END(self->mods))
- {
- i->mAmount += mod->mAmount;
- return;
- }
-#undef MATCH_MODULATOR
-
- if(VECTOR_PUSH_BACK(self->mods, *mod) == AL_FALSE)
- {
- ERR("Failed to insert modulator (from "SZFMT" elements)\n", VECTOR_SIZE(self->mods));
- return;
- }
-
- if(mod->mSrcOp == 0x0502 && mod->mDstOp == 48 && mod->mAmtSrcOp == 0 && mod->mTransOp == 0)
- VECTOR_BACK(self->mods).mAmount += 960;
- else if(mod->mSrcOp == 0x0102 && mod->mDstOp == 8 && mod->mAmtSrcOp == 0 && mod->mTransOp == 0)
- VECTOR_BACK(self->mods).mAmount += -2400;
- else if(mod->mSrcOp == 0x000D && mod->mDstOp == 6 && mod->mAmtSrcOp == 0 && mod->mTransOp == 0)
- VECTOR_BACK(self->mods).mAmount += 50;
- else if(mod->mSrcOp == 0x0081 && mod->mDstOp == 6 && mod->mAmtSrcOp == 0 && mod->mTransOp == 0)
- VECTOR_BACK(self->mods).mAmount += 50;
- else if(mod->mSrcOp == 0x0582 && mod->mDstOp == 48 && mod->mAmtSrcOp == 0 && mod->mTransOp == 0)
- VECTOR_BACK(self->mods).mAmount += 960;
- else if(mod->mSrcOp == 0x028A && mod->mDstOp == 17 && mod->mAmtSrcOp == 0 && mod->mTransOp == 0)
- VECTOR_BACK(self->mods).mAmount += 1000;
- else if(mod->mSrcOp == 0x058B && mod->mDstOp == 48 && mod->mAmtSrcOp == 0 && mod->mTransOp == 0)
- VECTOR_BACK(self->mods).mAmount += 960;
- else if(mod->mSrcOp == 0x00DB && mod->mDstOp == 16 && mod->mAmtSrcOp == 0 && mod->mTransOp == 0)
- VECTOR_BACK(self->mods).mAmount += 200;
- else if(mod->mSrcOp == 0x00DD && mod->mDstOp == 15 && mod->mAmtSrcOp == 0 && mod->mTransOp == 0)
- VECTOR_BACK(self->mods).mAmount += 200;
- /*else if(mod->mSrcOp == 0x020E && mod->mDstOp == ?initialpitch? && mod->mAmtSrcOp == 0x0010 && mod->mTransOp == 0)
- VECTOR_BACK(self->mods).mAmount += 12700;*/
-}
-
-
-#define ERROR_GOTO(lbl_, ...) do { \
- ERR(__VA_ARGS__); \
- goto lbl_; \
-} while(0)
-
-static ALboolean ensureFontSanity(const Soundfont *sfont)
-{
- ALsizei i;
-
- for(i = 0;i < sfont->phdr_size;i++)
- {
- if(sfont->phdr[i].mZoneIdx >= sfont->pbag_size)
- {
- WARN("Preset %d has invalid zone index %d (max: %d)\n", i,
- sfont->phdr[i].mZoneIdx, sfont->pbag_size);
- return AL_FALSE;
- }
- if(i+1 < sfont->phdr_size && sfont->phdr[i+1].mZoneIdx < sfont->phdr[i].mZoneIdx)
- {
- WARN("Preset %d has invalid zone index (%d does not follow %d)\n", i+1,
- sfont->phdr[i+1].mZoneIdx, sfont->phdr[i].mZoneIdx);
- return AL_FALSE;
- }
- }
-
- for(i = 0;i < sfont->pbag_size;i++)
- {
- if(sfont->pbag[i].mGenIdx >= sfont->pgen_size)
- {
- WARN("Preset zone %d has invalid generator index %d (max: %d)\n", i,
- sfont->pbag[i].mGenIdx, sfont->pgen_size);
- return AL_FALSE;
- }
- if(i+1 < sfont->pbag_size && sfont->pbag[i+1].mGenIdx < sfont->pbag[i].mGenIdx)
- {
- WARN("Preset zone %d has invalid generator index (%d does not follow %d)\n", i+1,
- sfont->pbag[i+1].mGenIdx, sfont->pbag[i].mGenIdx);
- return AL_FALSE;
- }
- if(sfont->pbag[i].mModIdx >= sfont->pmod_size)
- {
- WARN("Preset zone %d has invalid modulator index %d (max: %d)\n", i,
- sfont->pbag[i].mModIdx, sfont->pmod_size);
- return AL_FALSE;
- }
- if(i+1 < sfont->pbag_size && sfont->pbag[i+1].mModIdx < sfont->pbag[i].mModIdx)
- {
- WARN("Preset zone %d has invalid modulator index (%d does not follow %d)\n", i+1,
- sfont->pbag[i+1].mModIdx, sfont->pbag[i].mModIdx);
- return AL_FALSE;
- }
- }
-
-
- for(i = 0;i < sfont->inst_size;i++)
- {
- if(sfont->inst[i].mZoneIdx >= sfont->ibag_size)
- {
- WARN("Instrument %d has invalid zone index %d (max: %d)\n", i,
- sfont->inst[i].mZoneIdx, sfont->ibag_size);
- return AL_FALSE;
- }
- if(i+1 < sfont->inst_size && sfont->inst[i+1].mZoneIdx < sfont->inst[i].mZoneIdx)
- {
- WARN("Instrument %d has invalid zone index (%d does not follow %d)\n", i+1,
- sfont->inst[i+1].mZoneIdx, sfont->inst[i].mZoneIdx);
- return AL_FALSE;
- }
- }
-
- for(i = 0;i < sfont->ibag_size;i++)
- {
- if(sfont->ibag[i].mGenIdx >= sfont->igen_size)
- {
- WARN("Instrument zone %d has invalid generator index %d (max: %d)\n", i,
- sfont->ibag[i].mGenIdx, sfont->igen_size);
- return AL_FALSE;
- }
- if(i+1 < sfont->ibag_size && sfont->ibag[i+1].mGenIdx < sfont->ibag[i].mGenIdx)
- {
- WARN("Instrument zone %d has invalid generator index (%d does not follow %d)\n", i+1,
- sfont->ibag[i+1].mGenIdx, sfont->ibag[i].mGenIdx);
- return AL_FALSE;
- }
- if(sfont->ibag[i].mModIdx >= sfont->imod_size)
- {
- WARN("Instrument zone %d has invalid modulator index %d (max: %d)\n", i,
- sfont->ibag[i].mModIdx, sfont->imod_size);
- return AL_FALSE;
- }
- if(i+1 < sfont->ibag_size && sfont->ibag[i+1].mModIdx < sfont->ibag[i].mModIdx)
- {
- WARN("Instrument zone %d has invalid modulator index (%d does not follow %d)\n", i+1,
- sfont->ibag[i+1].mModIdx, sfont->ibag[i].mModIdx);
- return AL_FALSE;
- }
- }
-
-
- for(i = 0;i < sfont->shdr_size-1;i++)
- {
- if((sfont->shdr[i].mSampleType&0x8000) && sfont->irom == NULL)
- {
- WARN("Sample header %d has ROM sample type without an irom sub-chunk\n", i);
- return AL_FALSE;
- }
- }
-
-
- return AL_TRUE;
-}
-
-static ALboolean checkZone(const GenModList *zone, const PresetHeader *preset, const InstrumentHeader *inst, const SampleHeader *samp)
-{
- Generator *gen = VECTOR_ITER_BEGIN(zone->gens);
- Generator *gen_end = VECTOR_ITER_END(zone->gens);
- for(;gen != gen_end;gen++)
- {
- if(gen->mGenerator == 43 || gen->mGenerator == 44)
- {
- int high = gen->mAmount>>8;
- int low = gen->mAmount&0xff;
-
- if(!(low >= 0 && high <= 127 && high >= low))
- {
- TRACE("Preset \"%s\", inst \"%s\", sample \"%s\": invalid %s range %d...%d\n",
- preset->mName, inst->mName, samp->mName,
- (gen->mGenerator == 43) ? "key" :
- (gen->mGenerator == 44) ? "velocity" : "(unknown)",
- low, high);
- return AL_FALSE;
- }
- }
- }
-
- return AL_TRUE;
-}
-
-static ALenum getModSrcInput(int input)
-{
- if(input == 0) return AL_ONE_SOFT;
- if(input == 2) return AL_NOTEON_VELOCITY_SOFT;
- if(input == 3) return AL_NOTEON_KEY_SOFT;
- if(input == 10) return AL_KEYPRESSURE_SOFT;
- if(input == 13) return AL_CHANNELPRESSURE_SOFT;
- if(input == 14) return AL_PITCHBEND_SOFT;
- if(input == 16) return AL_PITCHBEND_SENSITIVITY_SOFT;
- if((input&0x80))
- {
- if(IsValidCtrlInput(input^0x80))
- return input^0x80;
- }
- ERR("Unhandled modulator source input: 0x%02x\n", input);
- return AL_INVALID;
-}
-
-static ALenum getModSrcType(int type)
-{
- if(type == 0x0000) return AL_UNORM_SOFT;
- if(type == 0x0100) return AL_UNORM_REV_SOFT;
- if(type == 0x0200) return AL_SNORM_SOFT;
- if(type == 0x0300) return AL_SNORM_REV_SOFT;
- ERR("Unhandled modulator source type: 0x%04x\n", type);
- return AL_INVALID;
-}
-
-static ALenum getModSrcForm(int form)
-{
- if(form == 0x0000) return AL_LINEAR_SOFT;
- if(form == 0x0400) return AL_CONCAVE_SOFT;
- if(form == 0x0800) return AL_CONVEX_SOFT;
- if(form == 0x0C00) return AL_SWITCH_SOFT;
- ERR("Unhandled modulator source form: 0x%04x\n", form);
- return AL_INVALID;
-}
-
-static ALenum getModTransOp(int op)
-{
- if(op == 0) return AL_LINEAR_SOFT;
- if(op == 2) return AL_ABSOLUTE_SOFT;
- ERR("Unhandled modulator transform op: 0x%04x\n", op);
- return AL_INVALID;
-}
-
-static ALenum getLoopMode(int mode)
-{
- if(mode == 0) return AL_NONE;
- if(mode == 1) return AL_LOOP_CONTINUOUS_SOFT;
- if(mode == 3) return AL_LOOP_UNTIL_RELEASE_SOFT;
- ERR("Unhandled loop mode: %d\n", mode);
- return AL_NONE;
-}
-
-static ALenum getSampleType(int type)
-{
- if(type == 1) return AL_MONO_SOFT;
- if(type == 2) return AL_RIGHT_SOFT;
- if(type == 4) return AL_LEFT_SOFT;
- if(type == 8)
- {
- WARN("Sample type \"linked\" ignored; pretending mono\n");
- return AL_MONO_SOFT;
- }
- ERR("Unhandled sample type: 0x%04x\n", type);
- return AL_MONO_SOFT;
-}
-
-static void fillZone(ALfontsound *sound, ALCcontext *context, const GenModList *zone)
-{
- static const ALenum Gen2Param[60] = {
- 0, /* 0 - startAddrOffset */
- 0, /* 1 - endAddrOffset */
- 0, /* 2 - startloopAddrOffset */
- 0, /* 3 - endloopAddrOffset */
- 0, /* 4 - startAddrCoarseOffset */
- AL_MOD_LFO_TO_PITCH_SOFT, /* 5 - modLfoToPitch */
- AL_VIBRATO_LFO_TO_PITCH_SOFT, /* 6 - vibLfoToPitch */
- AL_MOD_ENV_TO_PITCH_SOFT, /* 7 - modEnvToPitch */
- AL_FILTER_CUTOFF_SOFT, /* 8 - initialFilterFc */
- AL_FILTER_RESONANCE_SOFT, /* 9 - initialFilterQ */
- AL_MOD_LFO_TO_FILTER_CUTOFF_SOFT, /* 10 - modLfoToFilterFc */
- AL_MOD_ENV_TO_FILTER_CUTOFF_SOFT, /* 11 - modEnvToFilterFc */
- 0, /* 12 - endAddrCoarseOffset */
- AL_MOD_LFO_TO_VOLUME_SOFT, /* 13 - modLfoToVolume */
- 0, /* 14 - */
- AL_CHORUS_SEND_SOFT, /* 15 - chorusEffectsSend */
- AL_REVERB_SEND_SOFT, /* 16 - reverbEffectsSend */
- AL_PAN_SOFT, /* 17 - pan */
- 0, /* 18 - */
- 0, /* 19 - */
- 0, /* 20 - */
- AL_MOD_LFO_DELAY_SOFT, /* 21 - delayModLFO */
- AL_MOD_LFO_FREQUENCY_SOFT, /* 22 - freqModLFO */
- AL_VIBRATO_LFO_DELAY_SOFT, /* 23 - delayVibLFO */
- AL_VIBRATO_LFO_FREQUENCY_SOFT, /* 24 - freqVibLFO */
- AL_MOD_ENV_DELAYTIME_SOFT, /* 25 - delayModEnv */
- AL_MOD_ENV_ATTACKTIME_SOFT, /* 26 - attackModEnv */
- AL_MOD_ENV_HOLDTIME_SOFT, /* 27 - holdModEnv */
- AL_MOD_ENV_DECAYTIME_SOFT, /* 28 - decayModEnv */
- AL_MOD_ENV_SUSTAINVOLUME_SOFT, /* 29 - sustainModEnv */
- AL_MOD_ENV_RELEASETIME_SOFT, /* 30 - releaseModEnv */
- AL_MOD_ENV_KEY_TO_HOLDTIME_SOFT, /* 31 - keynumToModEnvHold */
- AL_MOD_ENV_KEY_TO_DECAYTIME_SOFT, /* 32 - keynumToModEnvDecay */
- AL_VOLUME_ENV_DELAYTIME_SOFT, /* 33 - delayVolEnv */
- AL_VOLUME_ENV_ATTACKTIME_SOFT, /* 34 - attackVolEnv */
- AL_VOLUME_ENV_HOLDTIME_SOFT, /* 35 - holdVolEnv */
- AL_VOLUME_ENV_DECAYTIME_SOFT, /* 36 - decayVolEnv */
- AL_VOLUME_ENV_SUSTAINVOLUME_SOFT, /* 37 - sustainVolEnv */
- AL_VOLUME_ENV_RELEASETIME_SOFT, /* 38 - releaseVolEnv */
- AL_VOLUME_ENV_KEY_TO_HOLDTIME_SOFT, /* 39 - keynumToVolEnvHold */
- AL_VOLUME_ENV_KEY_TO_DECAYTIME_SOFT, /* 40 - keynumToVolEnvDecay */
- 0, /* 41 - */
- 0, /* 42 - */
- AL_KEY_RANGE_SOFT, /* 43 - keyRange */
- AL_VELOCITY_RANGE_SOFT, /* 44 - velRange */
- 0, /* 45 - startloopAddrCoarseOffset */
- 0, /* 46 - keynum */
- 0, /* 47 - velocity */
- AL_ATTENUATION_SOFT, /* 48 - initialAttenuation */
- 0, /* 49 - */
- 0, /* 50 - endloopAddrCoarseOffset */
- AL_TUNING_COARSE_SOFT, /* 51 - corseTune */
- AL_TUNING_FINE_SOFT, /* 52 - fineTune */
- 0, /* 53 - */
- AL_LOOP_MODE_SOFT, /* 54 - sampleModes */
- 0, /* 55 - */
- AL_TUNING_SCALE_SOFT, /* 56 - scaleTuning */
- AL_EXCLUSIVE_CLASS_SOFT, /* 57 - exclusiveClass */
- AL_BASE_KEY_SOFT, /* 58 - overridingRootKey */
- 0, /* 59 - */
- };
- const Generator *gen, *gen_end;
- const Modulator *mod, *mod_end;
-
- mod = VECTOR_ITER_BEGIN(zone->mods);
- mod_end = VECTOR_ITER_END(zone->mods);
- for(;mod != mod_end;mod++)
- {
- ALenum src0in = getModSrcInput(mod->mSrcOp&0xFF);
- ALenum src0type = getModSrcType(mod->mSrcOp&0x0300);
- ALenum src0form = getModSrcForm(mod->mSrcOp&0xFC00);
- ALenum src1in = getModSrcInput(mod->mAmtSrcOp&0xFF);
- ALenum src1type = getModSrcType(mod->mAmtSrcOp&0x0300);
- ALenum src1form = getModSrcForm(mod->mAmtSrcOp&0xFC00);
- ALenum trans = getModTransOp(mod->mTransOp);
- ALenum dst = (mod->mDstOp < 60) ? Gen2Param[mod->mDstOp] : 0;
- if(!dst || dst == AL_KEY_RANGE_SOFT || dst == AL_VELOCITY_RANGE_SOFT ||
- dst == AL_LOOP_MODE_SOFT || dst == AL_EXCLUSIVE_CLASS_SOFT ||
- dst == AL_BASE_KEY_SOFT)
- ERR("Unhandled modulator destination: %d\n", mod->mDstOp);
- else if(src0in != AL_INVALID && src0form != AL_INVALID && src0type != AL_INVALID &&
- src1in != AL_INVALID && src1form != AL_INVALID && src1type != AL_INVALID &&
- trans != AL_INVALID)
- {
- ALsizei idx = (ALsizei)(mod - VECTOR_ITER_BEGIN(zone->mods));
- ALfontsound_setModStagei(sound, context, idx, AL_SOURCE0_INPUT_SOFT, src0in);
- ALfontsound_setModStagei(sound, context, idx, AL_SOURCE0_TYPE_SOFT, src0type);
- ALfontsound_setModStagei(sound, context, idx, AL_SOURCE0_FORM_SOFT, src0form);
- ALfontsound_setModStagei(sound, context, idx, AL_SOURCE1_INPUT_SOFT, src1in);
- ALfontsound_setModStagei(sound, context, idx, AL_SOURCE1_TYPE_SOFT, src1type);
- ALfontsound_setModStagei(sound, context, idx, AL_SOURCE1_FORM_SOFT, src1form);
- ALfontsound_setModStagei(sound, context, idx, AL_AMOUNT_SOFT, mod->mAmount);
- ALfontsound_setModStagei(sound, context, idx, AL_TRANSFORM_OP_SOFT, trans);
- ALfontsound_setModStagei(sound, context, idx, AL_DESTINATION_SOFT, dst);
- }
- }
-
- gen = VECTOR_ITER_BEGIN(zone->gens);
- gen_end = VECTOR_ITER_END(zone->gens);
- for(;gen != gen_end;gen++)
- {
- ALint value = (ALshort)gen->mAmount;
- if(gen->mGenerator == 0)
- sound->Start += value;
- else if(gen->mGenerator == 1)
- sound->End += value;
- else if(gen->mGenerator == 2)
- sound->LoopStart += value;
- else if(gen->mGenerator == 3)
- sound->LoopEnd += value;
- else if(gen->mGenerator == 4)
- sound->Start += value<<15;
- else if(gen->mGenerator == 12)
- sound->End += value<<15;
- else if(gen->mGenerator == 45)
- sound->LoopStart += value<<15;
- else if(gen->mGenerator == 50)
- sound->LoopEnd += value<<15;
- else if(gen->mGenerator == 43)
- {
- sound->MinKey = mini((value&0xff), 127);
- sound->MaxKey = mini(((value>>8)&0xff), 127);
- }
- else if(gen->mGenerator == 44)
- {
- sound->MinVelocity = mini((value&0xff), 127);
- sound->MaxVelocity = mini(((value>>8)&0xff), 127);
- }
- else
- {
- ALenum param = 0;
- if(gen->mGenerator < 60)
- param = Gen2Param[gen->mGenerator];
- if(param)
- {
- if(param == AL_BASE_KEY_SOFT)
- {
- if(!(value >= 0 && value <= 127))
- {
- if(value != -1)
- WARN("Invalid overridingRootKey generator value %d\n", value);
- continue;
- }
- }
- if(param == AL_FILTER_RESONANCE_SOFT || param == AL_ATTENUATION_SOFT)
- value = maxi(0, value);
- else if(param == AL_CHORUS_SEND_SOFT || param == AL_REVERB_SEND_SOFT)
- value = clampi(value, 0, 1000);
- else if(param == AL_LOOP_MODE_SOFT)
- value = getLoopMode(value);
- ALfontsound_setPropi(sound, context, param, value);
- }
- else
- {
- static ALuint warned[65536/32];
- if(!(warned[gen->mGenerator/32]&(1<<(gen->mGenerator&31))))
- {
- warned[gen->mGenerator/32] |= 1<<(gen->mGenerator&31);
- ERR("Unhandled generator %d\n", gen->mGenerator);
- }
- }
- }
- }
-}
-
-static void processInstrument(ALfontsound ***sounds, ALsizei *sounds_size, ALCcontext *context, ALbuffer *buffer, InstrumentHeader *inst, const PresetHeader *preset, const Soundfont *sfont, const GenModList *pzone)
-{
- const Generator *gen, *gen_end;
- const Modulator *mod, *mod_end;
- const Zone *zone, *zone_end;
- GenModList gzone;
- ALvoid *temp;
-
- if((inst+1)->mZoneIdx == inst->mZoneIdx)
- ERR("Instrument with no zones!");
-
- GenModList_Construct(&gzone);
- zone = sfont->ibag + inst->mZoneIdx;
- zone_end = sfont->ibag + (inst+1)->mZoneIdx;
- if(zone_end-zone > 1)
- {
- gen = sfont->igen + zone->mGenIdx;
- gen_end = sfont->igen + (zone+1)->mGenIdx;
-
- // If no generators, or last generator is not a sample, this is a global zone
- for(;gen != gen_end;gen++)
- {
- if(gen->mGenerator == 53)
- break;
- }
-
- if(gen == gen_end)
- {
- gen = sfont->igen + zone->mGenIdx;
- gen_end = sfont->igen + (zone+1)->mGenIdx;
- for(;gen != gen_end;gen++)
- GenModList_insertGen(&gzone, gen, AL_FALSE);
-
- mod = sfont->imod + zone->mModIdx;
- mod_end = sfont->imod + (zone+1)->mModIdx;
- for(;mod != mod_end;mod++)
- GenModList_insertMod(&gzone, mod);
-
- zone++;
- }
- }
-
- temp = realloc(*sounds, (zone_end-zone + *sounds_size)*sizeof((*sounds)[0]));
- if(!temp)
- {
- ERR("Failed reallocating fontsound storage to %d elements (from %d)\n",
- (ALsizei)(zone_end-zone) + *sounds_size, *sounds_size);
- return;
- }
- *sounds = temp;
- for(;zone != zone_end;zone++)
- {
- GenModList lzone = GenModList_clone(&gzone);
- mod = sfont->imod + zone->mModIdx;
- mod_end = sfont->imod + (zone+1)->mModIdx;
- for(;mod != mod_end;mod++)
- GenModList_insertMod(&lzone, mod);
-
- gen = sfont->igen + zone->mGenIdx;
- gen_end = sfont->igen + (zone+1)->mGenIdx;
- for(;gen != gen_end;gen++)
- {
- if(gen->mGenerator == 53)
- {
- const SampleHeader *samp;
- ALfontsound *sound;
-
- if(gen->mAmount >= sfont->shdr_size-1)
- {
- ERR("Generator %ld has invalid sample ID (%d of %d)\n",
- (long)(gen-sfont->igen), gen->mAmount, sfont->shdr_size-1);
- break;
- }
- samp = &sfont->shdr[gen->mAmount];
-
- gen = VECTOR_ITER_BEGIN(pzone->gens);
- gen_end = VECTOR_ITER_END(pzone->gens);
- for(;gen != gen_end;gen++)
- GenModList_accumGen(&lzone, gen);
-
- mod = VECTOR_ITER_BEGIN(pzone->mods);
- mod_end = VECTOR_ITER_END(pzone->mods);
- for(;mod != mod_end;mod++)
- GenModList_accumMod(&lzone, mod);
-
- if(!checkZone(&lzone, preset, inst, samp))
- break;
- /* Ignore ROM samples for now. */
- if((samp->mSampleType&0x8000))
- break;
-
- sound = NewFontsound(context);
- (*sounds)[(*sounds_size)++] = sound;
- ALfontsound_setPropi(sound, context, AL_BUFFER, buffer->id);
- ALfontsound_setPropi(sound, context, AL_SAMPLE_START_SOFT, samp->mStart);
- ALfontsound_setPropi(sound, context, AL_SAMPLE_END_SOFT, samp->mEnd);
- ALfontsound_setPropi(sound, context, AL_SAMPLE_LOOP_START_SOFT, samp->mStartloop);
- ALfontsound_setPropi(sound, context, AL_SAMPLE_LOOP_END_SOFT, samp->mEndloop);
- ALfontsound_setPropi(sound, context, AL_SAMPLE_RATE_SOFT, samp->mSampleRate);
- ALfontsound_setPropi(sound, context, AL_BASE_KEY_SOFT, (samp->mOriginalKey <= 127) ? samp->mOriginalKey : 60);
- ALfontsound_setPropi(sound, context, AL_KEY_CORRECTION_SOFT, samp->mCorrection);
- ALfontsound_setPropi(sound, context, AL_SAMPLE_TYPE_SOFT, getSampleType(samp->mSampleType&0x7fff));
- fillZone(sound, context, &lzone);
-
- break;
- }
- GenModList_insertGen(&lzone, gen, AL_FALSE);
- }
-
- GenModList_Destruct(&lzone);
- }
-
- GenModList_Destruct(&gzone);
-}
-
-static ALuint printStringChunk(Reader *stream, const RiffHdr *chnk, const char *title)
-{
- ALuint len = 0;
- if(chnk->mSize == 0 || (chnk->mSize&1))
- ERR("Invalid "FOURCCFMT" size: %d\n", FOURCCARGS(chnk->mCode), chnk->mSize);
- else
- {
- char *str = calloc(1, chnk->mSize+1);
- len = (ALuint)Reader_read(stream, str, chnk->mSize);
-
- TRACE("%s: %s\n", title, str);
- free(str);
- }
- return len;
-}
-
-ALboolean loadSf2(Reader *stream, ALsoundfont *soundfont, ALCcontext *context)
-{
- ALsfpreset **presets = NULL;
- ALsizei presets_size = 0;
- ALbuffer *buffer = NULL;
- ALuint ltype;
- Soundfont sfont;
- RiffHdr riff;
- RiffHdr list;
- ALsizei i;
-
- Soundfont_Construct(&sfont);
-
- RiffHdr_read(&riff, stream);
- if(riff.mCode != FOURCC('R','I','F','F'))
- ERROR_GOTO(error, "Invalid Format, expected RIFF got '"FOURCCFMT"'\n", FOURCCARGS(riff.mCode));
- if((ltype=read_le32(stream)) != FOURCC('s','f','b','k'))
- ERROR_GOTO(error, "Invalid Format, expected sfbk got '"FOURCCFMT"'\n", FOURCCARGS(ltype));
-
- if(READERR(stream) != 0)
- ERROR_GOTO(error, "Error reading file header\n");
-
- RiffHdr_read(&list, stream);
- if(list.mCode != FOURCC('L','I','S','T'))
- ERROR_GOTO(error, "Invalid Format, expected LIST (INFO) got '"FOURCCFMT"'\n", FOURCCARGS(list.mCode));
- if((ltype=read_le32(stream)) != FOURCC('I','N','F','O'))
- ERROR_GOTO(error, "Invalid Format, expected INFO got '"FOURCCFMT"'\n", FOURCCARGS(ltype));
- list.mSize -= 4;
- while(list.mSize > 0 && !READERR(stream))
- {
- RiffHdr chnk;
-
- if(list.mSize < 8)
- {
- WARN("Unexpected end of INFO list (%u extra bytes)\n", list.mSize);
- skip(stream, list.mSize);
- list.mSize = 0;
- break;
- }
-
- RiffHdr_read(&chnk, stream);
- list.mSize -= 8;
- if(list.mSize < chnk.mSize)
- {
- WARN("INFO sub-chunk '"FOURCCFMT"' has %u bytes, but only %u bytes remain\n",
- FOURCCARGS(chnk.mCode), chnk.mSize, list.mSize);
- skip(stream, list.mSize);
- list.mSize = 0;
- break;
- }
- list.mSize -= chnk.mSize;
-
- if(chnk.mCode == FOURCC('i','f','i','l'))
- {
- if(chnk.mSize != 4)
- ERR("Invalid ifil chunk size: %d\n", chnk.mSize);
- else
- {
- ALushort major = read_le16(stream);
- ALushort minor = read_le16(stream);
- chnk.mSize -= 4;
-
- if(major != 2)
- ERROR_GOTO(error, "Unsupported SF2 format version: %d.%02d\n", major, minor);
- TRACE("SF2 format version: %d.%02d\n", major, minor);
-
- sfont.ifil = (major<<16) | minor;
- }
- }
- else if(chnk.mCode == FOURCC('i','r','o','m'))
- {
- if(chnk.mSize == 0 || (chnk.mSize&1))
- ERR("Invalid irom size: %d\n", chnk.mSize);
- else
- {
- free(sfont.irom);
- sfont.irom = calloc(1, chnk.mSize+1);
- chnk.mSize -= Reader_read(stream, sfont.irom, chnk.mSize);
-
- TRACE("SF2 ROM ID: %s\n", sfont.irom);
- }
- }
- else
- {
- static const struct {
- ALuint code;
- char title[16];
- } listinfos[] = {
- { FOURCC('i','s','n','g'), "Engine ID" },
- { FOURCC('I','N','A','M'), "Name" },
- { FOURCC('I','C','R','D'), "Creation Date" },
- { FOURCC('I','E','N','G'), "Creator" },
- { FOURCC('I','P','R','D'), "Product ID" },
- { FOURCC('I','C','O','P'), "Copyright" },
- { FOURCC('I','C','M','T'), "Comment" },
- { FOURCC('I','S','F','T'), "Created With" },
- { 0, "" },
- };
-
- for(i = 0;listinfos[i].code;i++)
- {
- if(listinfos[i].code == chnk.mCode)
- {
- chnk.mSize -= printStringChunk(stream, &chnk, listinfos[i].title);
- break;
- }
- }
- if(!listinfos[i].code)
- TRACE("Skipping INFO sub-chunk '"FOURCCFMT"' (%u bytes)\n", FOURCCARGS(chnk.mCode), chnk.mSize);
- }
- skip(stream, chnk.mSize);
- }
-
- if(READERR(stream) != 0)
- ERROR_GOTO(error, "Error reading INFO chunk\n");
- if(sfont.ifil == 0)
- ERROR_GOTO(error, "Missing ifil sub-chunk\n");
-
- RiffHdr_read(&list, stream);
- if(list.mCode != FOURCC('L','I','S','T'))
- ERROR_GOTO(error, "Invalid Format, expected LIST (sdta) got '"FOURCCFMT"'\n", FOURCCARGS(list.mCode));
- if((ltype=read_le32(stream)) != FOURCC('s','d','t','a'))
- ERROR_GOTO(error, "Invalid Format, expected sdta got '"FOURCCFMT"'\n", FOURCCARGS(ltype));
- list.mSize -= 4;
- {
- ALbyte *ptr;
- RiffHdr smpl;
- ALenum err;
-
- RiffHdr_read(&smpl, stream);
- if(smpl.mCode != FOURCC('s','m','p','l'))
- ERROR_GOTO(error, "Invalid Format, expected smpl got '"FOURCCFMT"'\n", FOURCCARGS(smpl.mCode));
- list.mSize -= 8;
-
- if(smpl.mSize > list.mSize)
- ERROR_GOTO(error, "Invalid Format, sample chunk size mismatch\n");
- list.mSize -= smpl.mSize;
-
- buffer = NewBuffer(context);
- if(!buffer)
- SET_ERROR_AND_GOTO(context, AL_OUT_OF_MEMORY, error);
- /* Sample rate is unimportant, the individual fontsounds will specify it. */
- if((err=LoadData(buffer, 22050, AL_MONO16_SOFT, smpl.mSize/2, UserFmtMono, UserFmtShort, NULL, 1, AL_FALSE)) != AL_NO_ERROR)
- SET_ERROR_AND_GOTO(context, err, error);
-
- ptr = buffer->data;
- if(IS_LITTLE_ENDIAN)
- smpl.mSize -= (ALuint)Reader_read(stream, ptr, smpl.mSize);
- else
- {
- ALuint total = 0;
- while(total < smpl.mSize && !READERR(stream))
- {
- ALbyte buf[4096];
- ALuint todo = minu(smpl.mSize-total, sizeof(buf));
- ALuint i;
-
- smpl.mSize -= (ALuint)Reader_read(stream, buf, todo);
- for(i = 0;i < todo;i++)
- ptr[total+i] = buf[i^1];
-
- total += todo;
- }
- }
-
- skip(stream, list.mSize);
- }
-
- if(READERR(stream) != 0)
- ERROR_GOTO(error, "Error reading sdta chunk\n");
-
- RiffHdr_read(&list, stream);
- if(list.mCode != FOURCC('L','I','S','T'))
- ERROR_GOTO(error, "Invalid Format, expected LIST (pdta) got '"FOURCCFMT"'\n", FOURCCARGS(list.mCode));
- if((ltype=read_le32(stream)) != FOURCC('p','d','t','a'))
- ERROR_GOTO(error, "Invalid Format, expected pdta got '"FOURCCFMT"'\n", FOURCCARGS(ltype));
-
- //
- RiffHdr_read(&list, stream);
- if(list.mCode != FOURCC('p','h','d','r'))
- ERROR_GOTO(error, "Invalid Format, expected phdr got '"FOURCCFMT"'\n", FOURCCARGS(list.mCode));
- if((list.mSize%38) != 0 || list.mSize == 0)
- ERROR_GOTO(error, "Invalid Format, bad phdr size: %u\n", list.mSize);
- sfont.phdr_size = list.mSize/38;
- sfont.phdr = calloc(sfont.phdr_size, sizeof(sfont.phdr[0]));
- for(i = 0;i < sfont.phdr_size;i++)
- PresetHeader_read(&sfont.phdr[i], stream);
-
- RiffHdr_read(&list, stream);
- if(list.mCode != FOURCC('p','b','a','g'))
- ERROR_GOTO(error, "Invalid Format, expected pbag got '"FOURCCFMT"'\n", FOURCCARGS(list.mCode));
- if((list.mSize%4) != 0 || list.mSize == 0)
- ERROR_GOTO(error, "Invalid Format, bad pbag size: %u\n", list.mSize);
- sfont.pbag_size = list.mSize/4;
- sfont.pbag = calloc(sfont.pbag_size, sizeof(sfont.pbag[0]));
- for(i = 0;i < sfont.pbag_size;i++)
- Zone_read(&sfont.pbag[i], stream);
-
- RiffHdr_read(&list, stream);
- if(list.mCode != FOURCC('p','m','o','d'))
- ERROR_GOTO(error, "Invalid Format, expected pmod got '"FOURCCFMT"'\n", FOURCCARGS(list.mCode));
- if((list.mSize%10) != 0 || list.mSize == 0)
- ERROR_GOTO(error, "Invalid Format, bad pmod size: %u\n", list.mSize);
- sfont.pmod_size = list.mSize/10;
- sfont.pmod = calloc(sfont.pmod_size, sizeof(sfont.pmod[0]));
- for(i = 0;i < sfont.pmod_size;i++)
- Modulator_read(&sfont.pmod[i], stream);
-
- RiffHdr_read(&list, stream);
- if(list.mCode != FOURCC('p','g','e','n'))
- ERROR_GOTO(error, "Invalid Format, expected pgen got '"FOURCCFMT"'\n", FOURCCARGS(list.mCode));
- if((list.mSize%4) != 0 || list.mSize == 0)
- ERROR_GOTO(error, "Invalid Format, bad pgen size: %u\n", list.mSize);
- sfont.pgen_size = list.mSize/4;
- sfont.pgen = calloc(sfont.pgen_size, sizeof(sfont.pgen[0]));
- for(i = 0;i < sfont.pgen_size;i++)
- Generator_read(&sfont.pgen[i], stream);
-
- //
- RiffHdr_read(&list, stream);
- if(list.mCode != FOURCC('i','n','s','t'))
- ERROR_GOTO(error, "Invalid Format, expected inst got '"FOURCCFMT"'\n", FOURCCARGS(list.mCode));
- if((list.mSize%22) != 0 || list.mSize == 0)
- ERROR_GOTO(error, "Invalid Format, bad inst size: %u\n", list.mSize);
- sfont.inst_size = list.mSize/22;
- sfont.inst = calloc(sfont.inst_size, sizeof(sfont.inst[0]));
- for(i = 0;i < sfont.inst_size;i++)
- InstrumentHeader_read(&sfont.inst[i], stream);
-
- RiffHdr_read(&list, stream);
- if(list.mCode != FOURCC('i','b','a','g'))
- ERROR_GOTO(error, "Invalid Format, expected ibag got '"FOURCCFMT"'\n", FOURCCARGS(list.mCode));
- if((list.mSize%4) != 0 || list.mSize == 0)
- ERROR_GOTO(error, "Invalid Format, bad ibag size: %u\n", list.mSize);
- sfont.ibag_size = list.mSize/4;
- sfont.ibag = calloc(sfont.ibag_size, sizeof(sfont.ibag[0]));
- for(i = 0;i < sfont.ibag_size;i++)
- Zone_read(&sfont.ibag[i], stream);
-
- RiffHdr_read(&list, stream);
- if(list.mCode != FOURCC('i','m','o','d'))
- ERROR_GOTO(error, "Invalid Format, expected imod got '"FOURCCFMT"'\n", FOURCCARGS(list.mCode));
- if((list.mSize%10) != 0 || list.mSize == 0)
- ERROR_GOTO(error, "Invalid Format, bad imod size: %u\n", list.mSize);
- sfont.imod_size = list.mSize/10;
- sfont.imod = calloc(sfont.imod_size, sizeof(sfont.imod[0]));
- for(i = 0;i < sfont.imod_size;i++)
- Modulator_read(&sfont.imod[i], stream);
-
- RiffHdr_read(&list, stream);
- if(list.mCode != FOURCC('i','g','e','n'))
- ERROR_GOTO(error, "Invalid Format, expected igen got '"FOURCCFMT"'\n", FOURCCARGS(list.mCode));
- if((list.mSize%4) != 0 || list.mSize == 0)
- ERROR_GOTO(error, "Invalid Format, bad igen size: %u\n", list.mSize);
- sfont.igen_size = list.mSize/4;
- sfont.igen = calloc(sfont.igen_size, sizeof(sfont.igen[0]));
- for(i = 0;i < sfont.igen_size;i++)
- Generator_read(&sfont.igen[i], stream);
-
- //
- RiffHdr_read(&list, stream);
- if(list.mCode != FOURCC('s','h','d','r'))
- ERROR_GOTO(error, "Invalid Format, expected shdr got '"FOURCCFMT"'\n", FOURCCARGS(list.mCode));
- if((list.mSize%46) != 0 || list.mSize == 0)
- ERROR_GOTO(error, "Invalid Format, bad shdr size: %u\n", list.mSize);
- sfont.shdr_size = list.mSize/46;
- sfont.shdr = calloc(sfont.shdr_size, sizeof(sfont.shdr[0]));
- for(i = 0;i < sfont.shdr_size;i++)
- SampleHeader_read(&sfont.shdr[i], stream);
-
- if(READERR(stream) != 0)
- ERROR_GOTO(error, "Error reading pdta chunk\n");
-
- if(!ensureFontSanity(&sfont))
- goto error;
-
- presets = calloc(1, (soundfont->NumPresets+sfont.phdr_size-1)*sizeof(presets[0]));
- if(!presets)
- ERROR_GOTO(error, "Error allocating presets\n");
- memcpy(presets, soundfont->Presets, soundfont->NumPresets*sizeof(presets[0]));
- presets_size = soundfont->NumPresets;
-
- for(i = 0;i < sfont.phdr_size-1;i++)
- {
- const Generator *gen, *gen_end;
- const Modulator *mod, *mod_end;
- const Zone *zone, *zone_end;
- ALfontsound **sounds = NULL;
- ALsizei sounds_size = 0;
- GenModList gzone;
-
- if(sfont.phdr[i+1].mZoneIdx == sfont.phdr[i].mZoneIdx)
- continue;
-
- GenModList_Construct(&gzone);
- zone = sfont.pbag + sfont.phdr[i].mZoneIdx;
- zone_end = sfont.pbag + sfont.phdr[i+1].mZoneIdx;
- if(zone_end-zone > 1)
- {
- gen = sfont.pgen + zone->mGenIdx;
- gen_end = sfont.pgen + (zone+1)->mGenIdx;
-
- // If no generators, or last generator is not an instrument, this is a global zone
- for(;gen != gen_end;gen++)
- {
- if(gen->mGenerator == 41)
- break;
- }
-
- if(gen == gen_end)
- {
- gen = sfont.pgen + zone->mGenIdx;
- gen_end = sfont.pgen + (zone+1)->mGenIdx;
- for(;gen != gen_end;gen++)
- GenModList_insertGen(&gzone, gen, AL_TRUE);
-
- mod = sfont.pmod + zone->mModIdx;
- mod_end = sfont.pmod + (zone+1)->mModIdx;
- for(;mod != mod_end;mod++)
- GenModList_insertMod(&gzone, mod);
-
- zone++;
- }
- }
-
- for(;zone != zone_end;zone++)
- {
- GenModList lzone = GenModList_clone(&gzone);
-
- mod = sfont.pmod + zone->mModIdx;
- mod_end = sfont.pmod + (zone+1)->mModIdx;
- for(;mod != mod_end;mod++)
- GenModList_insertMod(&lzone, mod);
-
- gen = sfont.pgen + zone->mGenIdx;
- gen_end = sfont.pgen + (zone+1)->mGenIdx;
- for(;gen != gen_end;gen++)
- {
- if(gen->mGenerator == 41)
- {
- if(gen->mAmount >= sfont.inst_size-1)
- ERR("Generator %ld has invalid instrument ID (%d of %d)\n",
- (long)(gen-sfont.pgen), gen->mAmount, sfont.inst_size-1);
- else
- processInstrument(
- &sounds, &sounds_size, context, buffer, &sfont.inst[gen->mAmount],
- &sfont.phdr[i], &sfont, &lzone
- );
- break;
- }
- GenModList_insertGen(&lzone, gen, AL_TRUE);
- }
- GenModList_Destruct(&lzone);
- }
-
- if(sounds_size > 0)
- {
- ALsizei j;
-
- presets[presets_size] = NewPreset(context);
- presets[presets_size]->Preset = sfont.phdr[i].mPreset;
- presets[presets_size]->Bank = sfont.phdr[i].mBank;
-
- for(j = 0;j < sounds_size;j++)
- IncrementRef(&sounds[j]->ref);
- sounds = ExchangePtr((XchgPtr*)&presets[presets_size]->Sounds, sounds);
- presets[presets_size]->NumSounds = sounds_size;
- presets_size++;
- }
- free(sounds);
-
- GenModList_Destruct(&gzone);
- }
-
- for(i = soundfont->NumPresets;i < presets_size;i++)
- IncrementRef(&presets[i]->ref);
- presets = ExchangePtr((XchgPtr*)&soundfont->Presets, presets);
- soundfont->NumPresets = presets_size;
-
- free(presets);
-
- Soundfont_Destruct(&sfont);
- /* If the buffer ends up unused, delete it. */
- if(ReadRef(&buffer->ref) == 0)
- {
- TRACE("Deleting unused buffer...\n");
- DeleteBuffer(context->Device, buffer);
- }
-
- return AL_TRUE;
-
-error:
- if(presets)
- {
- ALCdevice *device = context->Device;
- for(i = soundfont->NumPresets;i < presets_size;i++)
- DeletePreset(device, presets[i]);
- free(presets);
- }
-
- Soundfont_Destruct(&sfont);
- if(buffer)
- DeleteBuffer(context->Device, buffer);
-
- return AL_FALSE;
-}
diff --git a/Alc/midi/soft.c b/Alc/midi/soft.c
deleted file mode 100644
index a000266b..00000000
--- a/Alc/midi/soft.c
+++ /dev/null
@@ -1,139 +0,0 @@
-
-#include "config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-
-#include "alMain.h"
-#include "alError.h"
-#include "evtqueue.h"
-#include "alu.h"
-
-#include "midi/base.h"
-
-
-typedef struct SSynth {
- DERIVE_FROM_TYPE(MidiSynth);
-} SSynth;
-
-static void SSynth_mixSamples(SSynth *self, ALuint SamplesToDo, ALfloat (*restrict DryBuffer)[BUFFERSIZE], ALuint NumChannels);
-
-static void SSynth_Construct(SSynth *self, ALCdevice *device);
-static void SSynth_Destruct(SSynth *self);
-static DECLARE_FORWARD3(SSynth, MidiSynth, ALenum, selectSoundfonts, ALCcontext*, ALsizei, const ALuint*)
-static DECLARE_FORWARD1(SSynth, MidiSynth, void, setGain, ALfloat)
-static DECLARE_FORWARD(SSynth, MidiSynth, void, stop)
-static DECLARE_FORWARD(SSynth, MidiSynth, void, reset)
-static void SSynth_update(SSynth *self, ALCdevice *device);
-static void SSynth_process(SSynth *self, ALuint SamplesToDo, ALfloat (*restrict DryBuffer)[BUFFERSIZE], ALuint NumChannels);
-DECLARE_DEFAULT_ALLOCATORS(SSynth)
-DEFINE_MIDISYNTH_VTABLE(SSynth);
-
-
-static void SSynth_Construct(SSynth *self, ALCdevice *device)
-{
- MidiSynth_Construct(STATIC_CAST(MidiSynth, self), device);
- SET_VTABLE2(SSynth, MidiSynth, self);
-}
-
-static void SSynth_Destruct(SSynth* UNUSED(self))
-{
-}
-
-
-static void SSynth_update(SSynth* UNUSED(self), ALCdevice* UNUSED(device))
-{
-}
-
-
-static void SSynth_mixSamples(SSynth* UNUSED(self), ALuint UNUSED(SamplesToDo), ALfloatBUFFERSIZE *restrict UNUSED(DryBuffer), ALuint UNUSED(NumChannels))
-{
-}
-
-
-static void SSynth_processQueue(SSynth *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 SSynth_process(SSynth *self, ALuint SamplesToDo, ALfloat (*restrict DryBuffer)[BUFFERSIZE], ALuint NumChannels)
-{
- MidiSynth *synth = STATIC_CAST(MidiSynth, self);
- ALenum state = synth->State;
- ALuint64 curtime;
- ALuint total = 0;
-
- if(state == AL_INITIAL)
- return;
- if(state != AL_PLAYING)
- {
- SSynth_mixSamples(self, SamplesToDo, DryBuffer, NumChannels);
- return;
- }
-
- curtime = MidiSynth_getTime(synth);
- while(total < SamplesToDo)
- {
- ALuint64 time, diff;
- ALint tonext;
-
- time = MidiSynth_getNextEvtTime(synth);
- diff = maxu64(time, curtime) - curtime;
- if(diff >= MIDI_CLOCK_RES || time == UINT64_MAX)
- {
- /* If there's no pending event, or if it's more than 1 second
- * away, do as many samples as we can. */
- tonext = INT_MAX;
- }
- else
- {
- /* Figure out how many samples until the next event. */
- tonext = (ALint)((diff*synth->SampleRate + (MIDI_CLOCK_RES-1)) / MIDI_CLOCK_RES);
- tonext -= total;
- /* For efficiency reasons, try to mix a multiple of 64 samples
- * (~1ms @ 44.1khz) before processing the next event. */
- tonext = (tonext+63) & ~63;
- }
-
- if(tonext > 0)
- {
- ALuint todo = mini(tonext, SamplesToDo-total);
- SSynth_mixSamples(self, todo, DryBuffer, NumChannels);
- total += todo;
- tonext -= todo;
- }
- if(total < SamplesToDo && tonext <= 0)
- SSynth_processQueue(self, time);
- }
-
- synth->SamplesDone += SamplesToDo;
- synth->ClockBase += (synth->SamplesDone/synth->SampleRate) * MIDI_CLOCK_RES;
- synth->SamplesDone %= synth->SampleRate;
-}
-
-
-MidiSynth *SSynth_create(ALCdevice *device)
-{
- SSynth *synth;
-
- /* This option is temporary. Once this synth is in a more usable state, a
- * more generic selector should be used. */
- if(!GetConfigValueBool(NULL, "midi", "internal-synth", 0))
- {
- TRACE("Not using internal MIDI synth\n");
- return NULL;
- }
-
- NEW_OBJ(synth, SSynth)(device);
- if(!synth)
- {
- ERR("Failed to allocate SSynth\n");
- return NULL;
- }
- return STATIC_CAST(MidiSynth, synth);
-}
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 822649ef..db918de0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -560,11 +560,7 @@ SET(OPENAL_OBJS OpenAL32/alAuxEffectSlot.c
OpenAL32/alError.c
OpenAL32/alExtension.c
OpenAL32/alFilter.c
- OpenAL32/alFontsound.c
OpenAL32/alListener.c
- OpenAL32/alMidi.c
- OpenAL32/alPreset.c
- OpenAL32/alSoundfont.c
OpenAL32/alSource.c
OpenAL32/alState.c
OpenAL32/alThunk.c
@@ -601,8 +597,6 @@ SET(HAVE_SSE3 0)
SET(HAVE_SSE4_1 0)
SET(HAVE_NEON 0)
-SET(HAVE_FLUIDSYNTH 0)
-
SET(HAVE_ALSA 0)
SET(HAVE_OSS 0)
SET(HAVE_SOLARIS 0)
@@ -725,32 +719,6 @@ ELSE()
ENDMACRO()
ENDIF()
-SET(ALC_OBJS ${ALC_OBJS}
- Alc/midi/base.c
- Alc/midi/sf2load.c
- Alc/midi/dummy.c
- Alc/midi/fluidsynth.c
- Alc/midi/soft.c
-)
-
-# Check for FluidSynth support
-OPTION(ALSOFT_REQUIRE_FLUIDSYNTH "Require FluidSynth MIDI" OFF)
-FIND_PACKAGE(FluidSynth)
-IF(FLUIDSYNTH_FOUND)
- OPTION(ALSOFT_MIDI_FLUIDSYNTH "Enable FluidSynth MIDI" ON)
- IF(ALSOFT_MIDI_FLUIDSYNTH)
- SET(HAVE_FLUIDSYNTH 1)
- ADD_BACKEND_LIBS(${FLUIDSYNTH_LIBRARIES})
- IF(CMAKE_VERSION VERSION_LESS "2.8.8")
- INCLUDE_DIRECTORIES(${FLUIDSYNTH_INCLUDE_DIR})
- ENDIF()
- ENDIF()
-ENDIF()
-IF(ALSOFT_REQUIRE_FLUIDSYNTH AND NOT HAVE_FLUIDSYNTH)
- MESSAGE(FATAL_ERROR "Failed to enabled required FluidSynth support")
-ENDIF()
-
-
SET(BACKENDS "")
SET(ALC_OBJS ${ALC_OBJS}
Alc/backends/base.c
@@ -1084,9 +1052,6 @@ IF(WIN32 AND ALSOFT_NO_UID_DEFS)
SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY COMPILE_DEFINITIONS AL_NO_UID_DEFS)
ENDIF()
SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES "${OpenAL_SOURCE_DIR}/OpenAL32/Include" "${OpenAL_SOURCE_DIR}/Alc")
-IF(FLUIDSYNTH_FOUND)
- SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES ${FLUIDSYNTH_INCLUDE_DIR})
-ENDIF()
IF(HAVE_ALSA)
SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES ${ALSA_INCLUDE_DIRS})
ENDIF()
@@ -1171,10 +1136,6 @@ MESSAGE(STATUS "")
MESSAGE(STATUS "Building with support for CPU extensions:")
MESSAGE(STATUS " ${CPU_EXTS}")
MESSAGE(STATUS "")
-IF(HAVE_FLUIDSYNTH)
- MESSAGE(STATUS "FluidSynth support for ALC_SOFT_midi_interface enabled")
- MESSAGE(STATUS "")
-ENDIF()
IF(WIN32)
IF(NOT HAVE_DSOUND)
diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h
index e7ca5ac7..214047ee 100644
--- a/OpenAL32/Include/alMain.h
+++ b/OpenAL32/Include/alMain.h
@@ -61,205 +61,6 @@ ALC_API ALCboolean ALC_APIENTRY alcResetDeviceSOFT(ALCdevice *device, const ALCi
#endif
#endif
-#ifndef ALC_SOFT_midi_interface
-#define ALC_SOFT_midi_interface 1
-/* Global properties */
-#define AL_MIDI_CLOCK_SOFT 0x9999
-#define AL_MIDI_STATE_SOFT 0x9986
-#define AL_MIDI_GAIN_SOFT 0x9998
-#define AL_SOUNDFONTS_SIZE_SOFT 0x9995
-#define AL_SOUNDFONTS_SOFT 0x9994
-
-/* Soundfont properties */
-#define AL_PRESETS_SIZE_SOFT 0x9993
-#define AL_PRESETS_SOFT 0x9992
-
-/* Preset properties */
-#define AL_MIDI_PRESET_SOFT 0x9997
-#define AL_MIDI_BANK_SOFT 0x9996
-#define AL_FONTSOUNDS_SIZE_SOFT 0x9991
-#define AL_FONTSOUNDS_SOFT 0x9990
-
-/* Fontsound properties */
-/* AL_BUFFER */
-#define AL_SAMPLE_START_SOFT 0x2000
-#define AL_SAMPLE_END_SOFT 0x2001
-#define AL_SAMPLE_LOOP_START_SOFT 0x2002
-#define AL_SAMPLE_LOOP_END_SOFT 0x2003
-#define AL_SAMPLE_RATE_SOFT 0x2004
-#define AL_BASE_KEY_SOFT 0x2005
-#define AL_KEY_CORRECTION_SOFT 0x2006
-#define AL_SAMPLE_TYPE_SOFT 0x2007
-#define AL_FONTSOUND_LINK_SOFT 0x2008
-#define AL_MOD_LFO_TO_PITCH_SOFT 0x0005
-#define AL_VIBRATO_LFO_TO_PITCH_SOFT 0x0006
-#define AL_MOD_ENV_TO_PITCH_SOFT 0x0007
-#define AL_FILTER_CUTOFF_SOFT 0x0008
-#define AL_FILTER_RESONANCE_SOFT 0x0009
-#define AL_MOD_LFO_TO_FILTER_CUTOFF_SOFT 0x000A
-#define AL_MOD_ENV_TO_FILTER_CUTOFF_SOFT 0x000B
-#define AL_MOD_LFO_TO_VOLUME_SOFT 0x000D
-#define AL_CHORUS_SEND_SOFT 0x000F
-#define AL_REVERB_SEND_SOFT 0x0010
-#define AL_PAN_SOFT 0x0011
-#define AL_MOD_LFO_DELAY_SOFT 0x0015
-#define AL_MOD_LFO_FREQUENCY_SOFT 0x0016
-#define AL_VIBRATO_LFO_DELAY_SOFT 0x0017
-#define AL_VIBRATO_LFO_FREQUENCY_SOFT 0x0018
-#define AL_MOD_ENV_DELAYTIME_SOFT 0x0019
-#define AL_MOD_ENV_ATTACKTIME_SOFT 0x001A
-#define AL_MOD_ENV_HOLDTIME_SOFT 0x001B
-#define AL_MOD_ENV_DECAYTIME_SOFT 0x001C
-#define AL_MOD_ENV_SUSTAINVOLUME_SOFT 0x001D
-#define AL_MOD_ENV_RELEASETIME_SOFT 0x002E
-#define AL_MOD_ENV_KEY_TO_HOLDTIME_SOFT 0x001F
-#define AL_MOD_ENV_KEY_TO_DECAYTIME_SOFT 0x0020
-#define AL_VOLUME_ENV_DELAYTIME_SOFT 0x0021
-#define AL_VOLUME_ENV_ATTACKTIME_SOFT 0x0022
-#define AL_VOLUME_ENV_HOLDTIME_SOFT 0x0023
-#define AL_VOLUME_ENV_DECAYTIME_SOFT 0x0024
-#define AL_VOLUME_ENV_SUSTAINVOLUME_SOFT 0x0025
-#define AL_VOLUME_ENV_RELEASETIME_SOFT 0x0026
-#define AL_VOLUME_ENV_KEY_TO_HOLDTIME_SOFT 0x0027
-#define AL_VOLUME_ENV_KEY_TO_DECAYTIME_SOFT 0x0028
-#define AL_KEY_RANGE_SOFT 0x002B
-#define AL_VELOCITY_RANGE_SOFT 0x002C
-#define AL_ATTENUATION_SOFT 0x0030
-#define AL_TUNING_COARSE_SOFT 0x0033
-#define AL_TUNING_FINE_SOFT 0x0034
-#define AL_LOOP_MODE_SOFT 0x0036
-#define AL_TUNING_SCALE_SOFT 0x0038
-#define AL_EXCLUSIVE_CLASS_SOFT 0x0039
-
-/* Sample Types */
-/* AL_MONO_SOFT */
-#define AL_RIGHT_SOFT 0x0002
-#define AL_LEFT_SOFT 0x0004
-
-/* Loop Modes */
-/* AL_NONE */
-#define AL_LOOP_CONTINUOUS_SOFT 0x0001
-#define AL_LOOP_UNTIL_RELEASE_SOFT 0x0003
-
-/* Fontsound modulator stage properties */
-#define AL_SOURCE0_INPUT_SOFT 0x998F
-#define AL_SOURCE0_TYPE_SOFT 0x998E
-#define AL_SOURCE0_FORM_SOFT 0x998D
-#define AL_SOURCE1_INPUT_SOFT 0x998C
-#define AL_SOURCE1_TYPE_SOFT 0x998B
-#define AL_SOURCE1_FORM_SOFT 0x998A
-#define AL_AMOUNT_SOFT 0x9989
-#define AL_TRANSFORM_OP_SOFT 0x9988
-#define AL_DESTINATION_SOFT 0x9987
-
-/* Sounce Inputs */
-#define AL_ONE_SOFT 0x0080
-#define AL_NOTEON_VELOCITY_SOFT 0x0082
-#define AL_NOTEON_KEY_SOFT 0x0083
-/* AL_KEYPRESSURE_SOFT */
-/* AL_CHANNELPRESSURE_SOFT */
-/* AL_PITCHBEND_SOFT */
-#define AL_PITCHBEND_SENSITIVITY_SOFT 0x0090
-/* CC 0...127 */
-
-/* Source Types */
-#define AL_UNORM_SOFT 0x0000
-#define AL_UNORM_REV_SOFT 0x0100
-#define AL_SNORM_SOFT 0x0200
-#define AL_SNORM_REV_SOFT 0x0300
-
-/* Source Forms */
-#define AL_LINEAR_SOFT 0x0000
-#define AL_CONCAVE_SOFT 0x0400
-#define AL_CONVEX_SOFT 0x0800
-#define AL_SWITCH_SOFT 0x0C00
-
-/* Transform Ops */
-/* AL_LINEAR_SOFT */
-#define AL_ABSOLUTE_SOFT 0x0002
-
-/* Events */
-#define AL_NOTEOFF_SOFT 0x0080
-#define AL_NOTEON_SOFT 0x0090
-#define AL_KEYPRESSURE_SOFT 0x00A0
-#define AL_CONTROLLERCHANGE_SOFT 0x00B0
-#define AL_PROGRAMCHANGE_SOFT 0x00C0
-#define AL_CHANNELPRESSURE_SOFT 0x00D0
-#define AL_PITCHBEND_SOFT 0x00E0
-
-typedef void (AL_APIENTRY*LPALGENSOUNDFONTSSOFT)(ALsizei n, ALuint *ids);
-typedef void (AL_APIENTRY*LPALDELETESOUNDFONTSSOFT)(ALsizei n, const ALuint *ids);
-typedef ALboolean (AL_APIENTRY*LPALISSOUNDFONTSOFT)(ALuint id);
-typedef void (AL_APIENTRY*LPALGETSOUNDFONTIVSOFT)(ALuint id, ALenum param, ALint *values);
-typedef void (AL_APIENTRY*LPALSOUNDFONTPRESETSSOFT)(ALuint id, ALsizei count, const ALuint *pids);
-typedef void (AL_APIENTRY*LPALGENPRESETSSOFT)(ALsizei n, ALuint *ids);
-typedef void (AL_APIENTRY*LPALDELETEPRESETSSOFT)(ALsizei n, const ALuint *ids);
-typedef ALboolean (AL_APIENTRY*LPALISPRESETSOFT)(ALuint id);
-typedef void (AL_APIENTRY*LPALPRESETISOFT)(ALuint id, ALenum param, ALint value);
-typedef void (AL_APIENTRY*LPALPRESETIVSOFT)(ALuint id, ALenum param, const ALint *values);
-typedef void (AL_APIENTRY*LPALPRESETFONTSOUNDSSOFT)(ALuint id, ALsizei count, const ALuint *fsids);
-typedef void (AL_APIENTRY*LPALGETPRESETIVSOFT)(ALuint id, ALenum param, ALint *values);
-typedef void (AL_APIENTRY*LPALGENFONTSOUNDSSOFT)(ALsizei n, ALuint *ids);
-typedef void (AL_APIENTRY*LPALDELETEFONTSOUNDSSOFT)(ALsizei n, const ALuint *ids);
-typedef ALboolean (AL_APIENTRY*LPALISFONTSOUNDSOFT)(ALuint id);
-typedef void (AL_APIENTRY*LPALFONTSOUNDISOFT)(ALuint id, ALenum param, ALint value);
-typedef void (AL_APIENTRY*LPALFONTSOUND2ISOFT)(ALuint id, ALenum param, ALint value1, ALint value2);
-typedef void (AL_APIENTRY*LPALFONTSOUNDIVSOFT)(ALuint id, ALenum param, const ALint *values);
-typedef void (AL_APIENTRY*LPALGETFONTSOUNDIVSOFT)(ALuint id, ALenum param, ALint *values);
-typedef void (AL_APIENTRY*LPALFONTSOUNDMOFULATORISOFT)(ALuint id, ALsizei stage, ALenum param, ALint value);
-typedef void (AL_APIENTRY*LPALGETFONTSOUNDMODULATORIVSOFT)(ALuint id, ALsizei stage, ALenum param, ALint *values);
-typedef void (AL_APIENTRY*LPALMIDISOUNDFONTSOFT)(ALuint id);
-typedef void (AL_APIENTRY*LPALMIDISOUNDFONTVSOFT)(ALsizei count, const ALuint *ids);
-typedef void (AL_APIENTRY*LPALMIDIEVENTSOFT)(ALuint64SOFT time, ALenum event, ALsizei channel, ALsizei param1, ALsizei param2);
-typedef void (AL_APIENTRY*LPALMIDISYSEXSOFT)(ALuint64SOFT time, const ALbyte *data, ALsizei size);
-typedef void (AL_APIENTRY*LPALMIDIPLAYSOFT)(void);
-typedef void (AL_APIENTRY*LPALMIDIPAUSESOFT)(void);
-typedef void (AL_APIENTRY*LPALMIDISTOPSOFT)(void);
-typedef void (AL_APIENTRY*LPALMIDIRESETSOFT)(void);
-typedef void (AL_APIENTRY*LPALMIDIGAINSOFT)(ALfloat value);
-typedef ALint64SOFT (AL_APIENTRY*LPALGETINTEGER64SOFT)(ALenum pname);
-typedef void (AL_APIENTRY*LPALGETINTEGER64VSOFT)(ALenum pname, ALint64SOFT *values);
-typedef void (AL_APIENTRY*LPALLOADSOUNDFONTSOFT)(ALuint id, size_t(*cb)(ALvoid*,size_t,ALvoid*), ALvoid *user);
-#ifdef AL_ALEXT_PROTOTYPES
-AL_API void AL_APIENTRY alGenSoundfontsSOFT(ALsizei n, ALuint *ids);
-AL_API void AL_APIENTRY alDeleteSoundfontsSOFT(ALsizei n, const ALuint *ids);
-AL_API ALboolean AL_APIENTRY alIsSoundfontSOFT(ALuint id);
-AL_API void AL_APIENTRY alGetSoundfontivSOFT(ALuint id, ALenum param, ALint *values);
-AL_API void AL_APIENTRY alSoundfontPresetsSOFT(ALuint id, ALsizei count, const ALuint *pids);
-
-AL_API void AL_APIENTRY alGenPresetsSOFT(ALsizei n, ALuint *ids);
-AL_API void AL_APIENTRY alDeletePresetsSOFT(ALsizei n, const ALuint *ids);
-AL_API ALboolean AL_APIENTRY alIsPresetSOFT(ALuint id);
-AL_API void AL_APIENTRY alPresetiSOFT(ALuint id, ALenum param, ALint value);
-AL_API void AL_APIENTRY alPresetivSOFT(ALuint id, ALenum param, const ALint *values);
-AL_API void AL_APIENTRY alGetPresetivSOFT(ALuint id, ALenum param, ALint *values);
-AL_API void AL_APIENTRY alPresetFontsoundsSOFT(ALuint id, ALsizei count, const ALuint *fsids);
-
-AL_API void AL_APIENTRY alGenFontsoundsSOFT(ALsizei n, ALuint *ids);
-AL_API void AL_APIENTRY alDeleteFontsoundsSOFT(ALsizei n, const ALuint *ids);
-AL_API ALboolean AL_APIENTRY alIsFontsoundSOFT(ALuint id);
-AL_API void AL_APIENTRY alFontsoundiSOFT(ALuint id, ALenum param, ALint value);
-AL_API void AL_APIENTRY alFontsound2iSOFT(ALuint id, ALenum param, ALint value1, ALint value2);
-AL_API void AL_APIENTRY alFontsoundivSOFT(ALuint id, ALenum param, const ALint *values);
-AL_API void AL_APIENTRY alGetFontsoundivSOFT(ALuint id, ALenum param, ALint *values);
-AL_API void AL_APIENTRY alFontsoundModulatoriSOFT(ALuint id, ALsizei stage, ALenum param, ALint value);
-AL_API void AL_APIENTRY alGetFontsoundModulatorivSOFT(ALuint id, ALsizei stage, ALenum param, ALint *values);
-
-AL_API void AL_APIENTRY alMidiSoundfontSOFT(ALuint id);
-AL_API void AL_APIENTRY alMidiSoundfontvSOFT(ALsizei count, const ALuint *ids);
-AL_API void AL_APIENTRY alMidiEventSOFT(ALuint64SOFT time, ALenum event, ALsizei channel, ALsizei param1, ALsizei param2);
-AL_API void AL_APIENTRY alMidiSysExSOFT(ALuint64SOFT time, const ALbyte *data, ALsizei size);
-AL_API void AL_APIENTRY alMidiPlaySOFT(void);
-AL_API void AL_APIENTRY alMidiPauseSOFT(void);
-AL_API void AL_APIENTRY alMidiStopSOFT(void);
-AL_API void AL_APIENTRY alMidiResetSOFT(void);
-AL_API void AL_APIENTRY alMidiGainSOFT(ALfloat value);
-AL_API ALint64SOFT AL_APIENTRY alGetInteger64SOFT(ALenum pname);
-AL_API void AL_APIENTRY alGetInteger64vSOFT(ALenum pname, ALint64SOFT *values);
-AL_API void AL_APIENTRY alLoadSoundfontSOFT(ALuint id, size_t(*cb)(ALvoid*,size_t,ALvoid*), ALvoid *user);
-#endif
-#endif
-
#ifndef ALC_SOFT_device_clock
#define ALC_SOFT_device_clock 1
typedef int64_t ALCint64SOFT;
@@ -677,21 +478,6 @@ struct ALCdevice_struct
// Map of Filters for this device
UIntMap FilterMap;
- // Map of Soundfonts for this device
- UIntMap SfontMap;
-
- // Map of Presets for this device
- UIntMap PresetMap;
-
- // Map of Fontsounds for this device
- UIntMap FontsoundMap;
-
- /* Default soundfont (accessible as ID 0) */
- struct ALsoundfont *DefaultSfont;
-
- /* MIDI synth engine */
- struct MidiSynth *Synth;
-
/* HRTF filter tables */
vector_HrtfEntry Hrtf_List;
al_string Hrtf_Name;
diff --git a/OpenAL32/Include/alMidi.h b/OpenAL32/Include/alMidi.h
deleted file mode 100644
index b1c08e40..00000000
--- a/OpenAL32/Include/alMidi.h
+++ /dev/null
@@ -1,173 +0,0 @@
-#ifndef ALMIDI_H
-#define ALMIDI_H
-
-#include "alMain.h"
-#include "atomic.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct ALsfmodulator {
- struct {
- ALenum Input;
- ALenum Type;
- ALenum Form;
- } Source[2];
- ALint Amount;
- ALenum TransformOp;
- ALenum Dest;
-} ALsfmodulator;
-
-typedef struct ALenvelope {
- ALint DelayTime;
- ALint AttackTime;
- ALint HoldTime;
- ALint DecayTime;
- ALint SustainAttn;
- ALint ReleaseTime;
- ALint KeyToHoldTime;
- ALint KeyToDecayTime;
-} ALenvelope;
-
-
-typedef struct ALfontsound {
- RefCount ref;
-
- ATOMIC(struct ALbuffer*) Buffer;
-
- ALint MinKey, MaxKey;
- ALint MinVelocity, MaxVelocity;
-
- ALint ModLfoToPitch;
- ALint VibratoLfoToPitch;
- ALint ModEnvToPitch;
-
- ALint FilterCutoff;
- ALint FilterQ;
- ALint ModLfoToFilterCutoff;
- ALint ModEnvToFilterCutoff;
- ALint ModLfoToVolume;
-
- ALint ChorusSend;
- ALint ReverbSend;
-
- ALint Pan;
-
- struct {
- ALint Delay;
- ALint Frequency;
- } ModLfo;
- struct {
- ALint Delay;
- ALint Frequency;
- } VibratoLfo;
-
- ALenvelope ModEnv;
- ALenvelope VolEnv;
-
- ALint Attenuation;
-
- ALint CoarseTuning;
- ALint FineTuning;
-
- ALenum LoopMode;
-
- ALint TuningScale;
-
- ALint ExclusiveClass;
-
- ALuint Start;
- ALuint End;
- ALuint LoopStart;
- ALuint LoopEnd;
- ALuint SampleRate;
- ALubyte PitchKey;
- ALbyte PitchCorrection;
- ALenum SampleType;
-
- ATOMIC(struct ALfontsound*) Link;
-
- /* NOTE: Each map entry contains *four* (4) ALsfmodulator objects. */
- UIntMap ModulatorMap;
-
- ALuint id;
-} ALfontsound;
-
-void ALfontsound_setPropi(ALfontsound *self, ALCcontext *context, ALenum param, ALint value);
-void ALfontsound_setModStagei(ALfontsound *self, ALCcontext *context, ALsizei stage, ALenum param, ALint value);
-
-ALfontsound *NewFontsound(ALCcontext *context);
-void DeleteFontsound(ALCdevice *device, ALfontsound *sound);
-
-inline struct ALfontsound *LookupFontsound(ALCdevice *device, ALuint id)
-{ return (struct ALfontsound*)LookupUIntMapKey(&device->FontsoundMap, id); }
-inline struct ALfontsound *RemoveFontsound(ALCdevice *device, ALuint id)
-{ return (struct ALfontsound*)RemoveUIntMapKey(&device->FontsoundMap, id); }
-
-void ReleaseALFontsounds(ALCdevice *device);
-
-
-typedef struct ALsfpreset {
- RefCount ref;
-
- ALint Preset; /* a.k.a. MIDI program number */
- ALint Bank; /* MIDI bank 0...127, or percussion (bank 128) */
-
- ALfontsound **Sounds;
- ALsizei NumSounds;
-
- ALuint id;
-} ALsfpreset;
-
-ALsfpreset *NewPreset(ALCcontext *context);
-void DeletePreset(ALCdevice *device, ALsfpreset *preset);
-
-inline struct ALsfpreset *LookupPreset(ALCdevice *device, ALuint id)
-{ return (struct ALsfpreset*)LookupUIntMapKey(&device->PresetMap, id); }
-inline struct ALsfpreset *RemovePreset(ALCdevice *device, ALuint id)
-{ return (struct ALsfpreset*)RemoveUIntMapKey(&device->PresetMap, id); }
-
-void ReleaseALPresets(ALCdevice *device);
-
-
-typedef struct ALsoundfont {
- RefCount ref;
-
- ALsfpreset **Presets;
- ALsizei NumPresets;
-
- RWLock Lock;
-
- ALuint id;
-} ALsoundfont;
-
-ALsoundfont *ALsoundfont_getDefSoundfont(ALCcontext *context);
-void ALsoundfont_deleteSoundfont(ALsoundfont *self, ALCdevice *device);
-
-inline struct ALsoundfont *LookupSfont(ALCdevice *device, ALuint id)
-{ return (struct ALsoundfont*)LookupUIntMapKey(&device->SfontMap, id); }
-inline struct ALsoundfont *RemoveSfont(ALCdevice *device, ALuint id)
-{ return (struct ALsoundfont*)RemoveUIntMapKey(&device->SfontMap, id); }
-
-void ReleaseALSoundfonts(ALCdevice *device);
-
-
-inline ALboolean IsValidCtrlInput(int cc)
-{
- /* These correspond to MIDI functions, not real controller values. */
- if(cc == 0 || cc == 6 || cc == 32 || cc == 38 || (cc >= 98 && cc <= 101) || cc >= 120)
- return AL_FALSE;
- /* These are the LSB components of CC0...CC31, which are automatically used when
- * reading the MSB controller value. */
- if(cc >= 32 && cc <= 63)
- return AL_FALSE;
- /* All the rest are okay! */
- return AL_TRUE;
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* ALMIDI_H */
diff --git a/OpenAL32/alFontsound.c b/OpenAL32/alFontsound.c
deleted file mode 100644
index 069fedd3..00000000
--- a/OpenAL32/alFontsound.c
+++ /dev/null
@@ -1,1014 +0,0 @@
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "alMain.h"
-#include "alMidi.h"
-#include "alError.h"
-#include "alThunk.h"
-#include "alBuffer.h"
-
-#include "midi/base.h"
-
-
-extern inline struct ALfontsound *LookupFontsound(ALCdevice *device, ALuint id);
-extern inline struct ALfontsound *RemoveFontsound(ALCdevice *device, ALuint id);
-
-
-static void ALfontsound_Construct(ALfontsound *self);
-static void ALfontsound_Destruct(ALfontsound *self);
-void ALfontsound_setPropi(ALfontsound *self, ALCcontext *context, ALenum param, ALint value);
-static ALsfmodulator *ALfontsound_getModStage(ALfontsound *self, ALsizei stage);
-void ALfontsound_setModStagei(ALfontsound *self, ALCcontext *context, ALsizei stage, ALenum param, ALint value);
-static void ALfontsound_getModStagei(ALfontsound *self, ALCcontext *context, ALsizei stage, ALenum param, ALint *values);
-
-static inline struct ALsfmodulator *LookupModulator(ALfontsound *sound, ALuint id)
-{
- ALsfmodulator *mod = LookupUIntMapKey(&sound->ModulatorMap, id>>2);
- if(mod) mod += id&3;
- return mod;
-}
-
-
-AL_API void AL_APIENTRY alGenFontsoundsSOFT(ALsizei n, ALuint *ids)
-{
- ALCcontext *context;
- ALsizei cur = 0;
-
- context = GetContextRef();
- if(!context) return;
-
- if(!(n >= 0))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
-
- for(cur = 0;cur < n;cur++)
- {
- ALfontsound *sound = NewFontsound(context);
- if(!sound)
- {
- alDeleteFontsoundsSOFT(cur, ids);
- break;
- }
-
- ids[cur] = sound->id;
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API ALvoid AL_APIENTRY alDeleteFontsoundsSOFT(ALsizei n, const ALuint *ids)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALfontsound *inst;
- ALsizei i;
-
- context = GetContextRef();
- if(!context) return;
-
- if(!(n >= 0))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
-
- device = context->Device;
- for(i = 0;i < n;i++)
- {
- /* Check for valid ID */
- if((inst=LookupFontsound(device, ids[i])) == NULL)
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- if(ReadRef(&inst->ref) != 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- }
-
- for(i = 0;i < n;i++)
- {
- if((inst=LookupFontsound(device, ids[i])) != NULL)
- DeleteFontsound(device, inst);
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API ALboolean AL_APIENTRY alIsFontsoundSOFT(ALuint id)
-{
- ALCcontext *context;
- ALboolean ret;
-
- context = GetContextRef();
- if(!context) return AL_FALSE;
-
- ret = LookupFontsound(context->Device, id) ? AL_TRUE : AL_FALSE;
-
- ALCcontext_DecRef(context);
-
- return ret;
-}
-
-AL_API void AL_APIENTRY alFontsoundiSOFT(ALuint id, ALenum param, ALint value)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALfontsound *sound;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if(!(sound=LookupFontsound(device, id)))
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- if(ReadRef(&sound->ref) != 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
-
- ALfontsound_setPropi(sound, context, param, value);
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alFontsound2iSOFT(ALuint id, ALenum param, ALint value1, ALint value2)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALfontsound *sound;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if(!(sound=LookupFontsound(device, id)))
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- if(ReadRef(&sound->ref) != 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- switch(param)
- {
- case AL_KEY_RANGE_SOFT:
- if(!(value1 >= 0 && value1 <= 127 && value2 >= 0 && value2 <= 127 && value2 >= value1))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
- sound->MinKey = value1;
- sound->MaxKey = value2;
- break;
-
- case AL_VELOCITY_RANGE_SOFT:
- if(!(value1 >= 0 && value1 <= 127 && value2 >= 0 && value2 <= 127 && value2 >= value1))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
- sound->MinVelocity = value1;
- sound->MaxVelocity = value2;
- break;
-
- default:
- SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alFontsoundivSOFT(ALuint id, ALenum param, const ALint *values)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALfontsound *sound;
-
- switch(param)
- {
- case AL_KEY_RANGE_SOFT:
- case AL_VELOCITY_RANGE_SOFT:
- alFontsound2iSOFT(id, param, values[0], values[1]);
- return;
-
- case AL_MOD_LFO_TO_PITCH_SOFT:
- case AL_VIBRATO_LFO_TO_PITCH_SOFT:
- case AL_MOD_ENV_TO_PITCH_SOFT:
- case AL_FILTER_CUTOFF_SOFT:
- case AL_FILTER_RESONANCE_SOFT:
- case AL_MOD_LFO_TO_FILTER_CUTOFF_SOFT:
- case AL_MOD_ENV_TO_FILTER_CUTOFF_SOFT:
- case AL_MOD_LFO_TO_VOLUME_SOFT:
- case AL_CHORUS_SEND_SOFT:
- case AL_REVERB_SEND_SOFT:
- case AL_PAN_SOFT:
- case AL_MOD_LFO_DELAY_SOFT:
- case AL_MOD_LFO_FREQUENCY_SOFT:
- case AL_VIBRATO_LFO_DELAY_SOFT:
- case AL_VIBRATO_LFO_FREQUENCY_SOFT:
- case AL_MOD_ENV_DELAYTIME_SOFT:
- case AL_MOD_ENV_ATTACKTIME_SOFT:
- case AL_MOD_ENV_HOLDTIME_SOFT:
- case AL_MOD_ENV_DECAYTIME_SOFT:
- case AL_MOD_ENV_SUSTAINVOLUME_SOFT:
- case AL_MOD_ENV_RELEASETIME_SOFT:
- case AL_MOD_ENV_KEY_TO_HOLDTIME_SOFT:
- case AL_MOD_ENV_KEY_TO_DECAYTIME_SOFT:
- case AL_VOLUME_ENV_DELAYTIME_SOFT:
- case AL_VOLUME_ENV_ATTACKTIME_SOFT:
- case AL_VOLUME_ENV_HOLDTIME_SOFT:
- case AL_VOLUME_ENV_DECAYTIME_SOFT:
- case AL_VOLUME_ENV_SUSTAINVOLUME_SOFT:
- case AL_VOLUME_ENV_RELEASETIME_SOFT:
- case AL_VOLUME_ENV_KEY_TO_HOLDTIME_SOFT:
- case AL_VOLUME_ENV_KEY_TO_DECAYTIME_SOFT:
- case AL_ATTENUATION_SOFT:
- case AL_TUNING_COARSE_SOFT:
- case AL_TUNING_FINE_SOFT:
- case AL_LOOP_MODE_SOFT:
- case AL_TUNING_SCALE_SOFT:
- case AL_EXCLUSIVE_CLASS_SOFT:
- case AL_SAMPLE_START_SOFT:
- case AL_SAMPLE_END_SOFT:
- case AL_SAMPLE_LOOP_START_SOFT:
- case AL_SAMPLE_LOOP_END_SOFT:
- case AL_SAMPLE_RATE_SOFT:
- case AL_BASE_KEY_SOFT:
- case AL_KEY_CORRECTION_SOFT:
- case AL_SAMPLE_TYPE_SOFT:
- case AL_FONTSOUND_LINK_SOFT:
- alFontsoundiSOFT(id, param, values[0]);
- return;
- }
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if(!(sound=LookupFontsound(device, id)))
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- if(ReadRef(&sound->ref) != 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- switch(param)
- {
- default:
- SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alGetFontsoundivSOFT(ALuint id, ALenum param, ALint *values)
-{
- ALCdevice *device;
- ALCcontext *context;
- const ALfontsound *sound;
- ALfontsound *link;
- ALbuffer *buffer;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if(!(sound=LookupFontsound(device, id)))
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- switch(param)
- {
- case AL_BUFFER:
- buffer = ATOMIC_LOAD(&sound->Buffer);
- values[0] = (buffer ? buffer->id : 0);
- break;
-
- case AL_MOD_LFO_TO_PITCH_SOFT:
- values[0] = sound->ModLfoToPitch;
- break;
-
- case AL_VIBRATO_LFO_TO_PITCH_SOFT:
- values[0] = sound->VibratoLfoToPitch;
- break;
-
- case AL_MOD_ENV_TO_PITCH_SOFT:
- values[0] = sound->ModEnvToPitch;
- break;
-
- case AL_FILTER_CUTOFF_SOFT:
- values[0] = sound->FilterCutoff;
- break;
-
- case AL_FILTER_RESONANCE_SOFT:
- values[0] = sound->FilterQ;
- break;
-
- case AL_MOD_LFO_TO_FILTER_CUTOFF_SOFT:
- values[0] = sound->ModLfoToFilterCutoff;
- break;
-
- case AL_MOD_ENV_TO_FILTER_CUTOFF_SOFT:
- values[0] = sound->ModEnvToFilterCutoff;
- break;
-
- case AL_MOD_LFO_TO_VOLUME_SOFT:
- values[0] = sound->ModLfoToVolume;
- break;
-
- case AL_CHORUS_SEND_SOFT:
- values[0] = sound->ChorusSend;
- break;
-
- case AL_REVERB_SEND_SOFT:
- values[0] = sound->ReverbSend;
- break;
-
- case AL_PAN_SOFT:
- values[0] = sound->Pan;
- break;
-
- case AL_MOD_LFO_DELAY_SOFT:
- values[0] = sound->ModLfo.Delay;
- break;
- case AL_MOD_LFO_FREQUENCY_SOFT:
- values[0] = sound->ModLfo.Frequency;
- break;
-
- case AL_VIBRATO_LFO_DELAY_SOFT:
- values[0] = sound->VibratoLfo.Delay;
- break;
- case AL_VIBRATO_LFO_FREQUENCY_SOFT:
- values[0] = sound->VibratoLfo.Frequency;
- break;
-
- case AL_MOD_ENV_DELAYTIME_SOFT:
- values[0] = sound->ModEnv.DelayTime;
- break;
- case AL_MOD_ENV_ATTACKTIME_SOFT:
- values[0] = sound->ModEnv.AttackTime;
- break;
- case AL_MOD_ENV_HOLDTIME_SOFT:
- values[0] = sound->ModEnv.HoldTime;
- break;
- case AL_MOD_ENV_DECAYTIME_SOFT:
- values[0] = sound->ModEnv.DecayTime;
- break;
- case AL_MOD_ENV_SUSTAINVOLUME_SOFT:
- values[0] = sound->ModEnv.SustainAttn;
- break;
- case AL_MOD_ENV_RELEASETIME_SOFT:
- values[0] = sound->ModEnv.ReleaseTime;
- break;
- case AL_MOD_ENV_KEY_TO_HOLDTIME_SOFT:
- values[0] = sound->ModEnv.KeyToHoldTime;
- break;
- case AL_MOD_ENV_KEY_TO_DECAYTIME_SOFT:
- values[0] = sound->ModEnv.KeyToDecayTime;
- break;
-
- case AL_VOLUME_ENV_DELAYTIME_SOFT:
- values[0] = sound->VolEnv.DelayTime;
- break;
- case AL_VOLUME_ENV_ATTACKTIME_SOFT:
- values[0] = sound->VolEnv.AttackTime;
- break;
- case AL_VOLUME_ENV_HOLDTIME_SOFT:
- values[0] = sound->VolEnv.HoldTime;
- break;
- case AL_VOLUME_ENV_DECAYTIME_SOFT:
- values[0] = sound->VolEnv.DecayTime;
- break;
- case AL_VOLUME_ENV_SUSTAINVOLUME_SOFT:
- values[0] = sound->VolEnv.SustainAttn;
- break;
- case AL_VOLUME_ENV_RELEASETIME_SOFT:
- values[0] = sound->VolEnv.ReleaseTime;
- break;
- case AL_VOLUME_ENV_KEY_TO_HOLDTIME_SOFT:
- values[0] = sound->VolEnv.KeyToHoldTime;
- break;
- case AL_VOLUME_ENV_KEY_TO_DECAYTIME_SOFT:
- values[0] = sound->VolEnv.KeyToDecayTime;
- break;
-
- case AL_KEY_RANGE_SOFT:
- values[0] = sound->MinKey;
- values[1] = sound->MaxKey;
- break;
-
- case AL_VELOCITY_RANGE_SOFT:
- values[0] = sound->MinVelocity;
- values[1] = sound->MaxVelocity;
- break;
-
- case AL_ATTENUATION_SOFT:
- values[0] = sound->Attenuation;
- break;
-
- case AL_TUNING_COARSE_SOFT:
- values[0] = sound->CoarseTuning;
- break;
- case AL_TUNING_FINE_SOFT:
- values[0] = sound->FineTuning;
- break;
-
- case AL_LOOP_MODE_SOFT:
- values[0] = sound->LoopMode;
- break;
-
- case AL_TUNING_SCALE_SOFT:
- values[0] = sound->TuningScale;
- break;
-
- case AL_EXCLUSIVE_CLASS_SOFT:
- values[0] = sound->ExclusiveClass;
- break;
-
- case AL_SAMPLE_START_SOFT:
- values[0] = sound->Start;
- break;
-
- case AL_SAMPLE_END_SOFT:
- values[0] = sound->End;
- break;
-
- case AL_SAMPLE_LOOP_START_SOFT:
- values[0] = sound->LoopStart;
- break;
-
- case AL_SAMPLE_LOOP_END_SOFT:
- values[0] = sound->LoopEnd;
- break;
-
- case AL_SAMPLE_RATE_SOFT:
- values[0] = sound->SampleRate;
- break;
-
- case AL_BASE_KEY_SOFT:
- values[0] = sound->PitchKey;
- break;
-
- case AL_KEY_CORRECTION_SOFT:
- values[0] = sound->PitchCorrection;
- break;
-
- case AL_SAMPLE_TYPE_SOFT:
- values[0] = sound->SampleType;
- break;
-
- case AL_FONTSOUND_LINK_SOFT:
- link = ATOMIC_LOAD(&sound->Link);
- values[0] = (link ? link->id : 0);
- break;
-
- default:
- SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alFontsoundModulatoriSOFT(ALuint id, ALsizei stage, ALenum param, ALint value)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALfontsound *sound;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if(!(sound=LookupFontsound(device, id)))
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- ALfontsound_setModStagei(sound, context, stage, param, value);
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alGetFontsoundModulatorivSOFT(ALuint id, ALsizei stage, ALenum param, ALint *values)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALfontsound *sound;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if(!(sound=LookupFontsound(device, id)))
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- ALfontsound_getModStagei(sound, context, stage, param, values);
-
-done:
- ALCcontext_DecRef(context);
-}
-
-
-ALfontsound *NewFontsound(ALCcontext *context)
-{
- ALCdevice *device = context->Device;
- ALfontsound *sound;
- ALenum err;
-
- sound = calloc(1, sizeof(*sound));
- if(!sound)
- SET_ERROR_AND_RETURN_VALUE(context, AL_OUT_OF_MEMORY, NULL);
- ALfontsound_Construct(sound);
-
- err = NewThunkEntry(&sound->id);
- if(err == AL_NO_ERROR)
- err = InsertUIntMapEntry(&device->FontsoundMap, sound->id, sound);
- if(err != AL_NO_ERROR)
- {
- ALfontsound_Destruct(sound);
- memset(sound, 0, sizeof(*sound));
- free(sound);
-
- SET_ERROR_AND_RETURN_VALUE(context, err, NULL);
- }
-
- return sound;
-}
-
-void DeleteFontsound(ALCdevice *device, ALfontsound *sound)
-{
- RemoveFontsound(device, sound->id);
-
- ALfontsound_Destruct(sound);
-
- memset(sound, 0, sizeof(*sound));
- free(sound);
-}
-
-
-static void ALfontsound_Construct(ALfontsound *self)
-{
- InitRef(&self->ref, 0);
-
- ATOMIC_INIT(&self->Buffer, NULL);
-
- self->MinKey = 0;
- self->MaxKey = 127;
- self->MinVelocity = 0;
- self->MaxVelocity = 127;
-
- self->ModLfoToPitch = 0;
- self->VibratoLfoToPitch = 0;
- self->ModEnvToPitch = 0;
-
- self->FilterCutoff = 13500;
- self->FilterQ = 0;
- self->ModLfoToFilterCutoff = 0;
- self->ModEnvToFilterCutoff = 0;
- self->ModLfoToVolume = 0;
-
- self->ChorusSend = 0;
- self->ReverbSend = 0;
-
- self->Pan = 0;
-
- self->ModLfo.Delay = 0;
- self->ModLfo.Frequency = 0;
-
- self->VibratoLfo.Delay = 0;
- self->VibratoLfo.Frequency = 0;
-
- self->ModEnv.DelayTime = -12000;
- self->ModEnv.AttackTime = -12000;
- self->ModEnv.HoldTime = -12000;
- self->ModEnv.DecayTime = -12000;
- self->ModEnv.SustainAttn = 0;
- self->ModEnv.ReleaseTime = -12000;
- self->ModEnv.KeyToHoldTime = 0;
- self->ModEnv.KeyToDecayTime = 0;
-
- self->VolEnv.DelayTime = -12000;
- self->VolEnv.AttackTime = -12000;
- self->VolEnv.HoldTime = -12000;
- self->VolEnv.DecayTime = -12000;
- self->VolEnv.SustainAttn = 0;
- self->VolEnv.ReleaseTime = -12000;
- self->VolEnv.KeyToHoldTime = 0;
- self->VolEnv.KeyToDecayTime = 0;
-
- self->Attenuation = 0;
-
- self->CoarseTuning = 0;
- self->FineTuning = 0;
-
- self->LoopMode = AL_NONE;
-
- self->TuningScale = 100;
-
- self->ExclusiveClass = 0;
-
- self->Start = 0;
- self->End = 0;
- self->LoopStart = 0;
- self->LoopEnd = 0;
- self->SampleRate = 0;
- self->PitchKey = 0;
- self->PitchCorrection = 0;
- self->SampleType = AL_MONO_SOFT;
-
- ATOMIC_INIT(&self->Link, NULL);
-
- InitUIntMap(&self->ModulatorMap, ~0);
-
- self->id = 0;
-}
-
-static void ALfontsound_Destruct(ALfontsound *self)
-{
- ALfontsound *link;
- ALbuffer *buffer;
- ALsizei i;
-
- FreeThunkEntry(self->id);
- self->id = 0;
-
- if((buffer=ATOMIC_EXCHANGE(ALbuffer*, &self->Buffer, NULL)) != NULL)
- DecrementRef(&buffer->ref);
-
- if((link=ATOMIC_EXCHANGE(ALfontsound*, &self->Link, NULL)) != NULL)
- DecrementRef(&link->ref);
-
- for(i = 0;i < self->ModulatorMap.size;i++)
- {
- free(self->ModulatorMap.array[i].value);
- self->ModulatorMap.array[i].value = NULL;
- }
- ResetUIntMap(&self->ModulatorMap);
-}
-
-void ALfontsound_setPropi(ALfontsound *self, ALCcontext *context, ALenum param, ALint value)
-{
- ALfontsound *link;
- ALbuffer *buffer;
-
- switch(param)
- {
- case AL_BUFFER:
- buffer = value ? LookupBuffer(context->Device, value) : NULL;
- if(value && !buffer)
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- else if(buffer)
- {
- /* Buffer must have a non-0 length, and must be mono. */
- if(buffer->SampleLen <= 0 || buffer->FmtChannels != FmtMono)
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- }
-
- if(buffer) IncrementRef(&buffer->ref);
- if((buffer=ATOMIC_EXCHANGE(ALbuffer*, &self->Buffer, buffer)) != NULL)
- DecrementRef(&buffer->ref);
- break;
-
- case AL_MOD_LFO_TO_PITCH_SOFT:
- self->ModLfoToPitch = value;
- break;
-
- case AL_VIBRATO_LFO_TO_PITCH_SOFT:
- self->VibratoLfoToPitch = value;
- break;
-
- case AL_MOD_ENV_TO_PITCH_SOFT:
- self->ModEnvToPitch = value;
- break;
-
- case AL_FILTER_CUTOFF_SOFT:
- self->FilterCutoff = value;
- break;
-
- case AL_FILTER_RESONANCE_SOFT:
- if(!(value >= 0))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- self->FilterQ = value;
- break;
-
- case AL_MOD_LFO_TO_FILTER_CUTOFF_SOFT:
- self->ModLfoToFilterCutoff = value;
- break;
-
- case AL_MOD_ENV_TO_FILTER_CUTOFF_SOFT:
- self->ModEnvToFilterCutoff = value;
- break;
-
- case AL_MOD_LFO_TO_VOLUME_SOFT:
- self->ModLfoToVolume = value;
- break;
-
- case AL_CHORUS_SEND_SOFT:
- if(!(value >= 0 && value <= 1000))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- self->ChorusSend = value;
- break;
- case AL_REVERB_SEND_SOFT:
- if(!(value >= 0 && value <= 1000))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- self->ReverbSend = value;
- break;
-
- case AL_PAN_SOFT:
- self->Pan = value;
- break;
-
- case AL_MOD_LFO_DELAY_SOFT:
- self->ModLfo.Delay = value;
- break;
- case AL_MOD_LFO_FREQUENCY_SOFT:
- self->ModLfo.Frequency = value;
- break;
-
- case AL_VIBRATO_LFO_DELAY_SOFT:
- self->VibratoLfo.Delay = value;
- break;
- case AL_VIBRATO_LFO_FREQUENCY_SOFT:
- self->VibratoLfo.Frequency = value;
- break;
-
- case AL_MOD_ENV_DELAYTIME_SOFT:
- self->ModEnv.DelayTime = value;
- break;
- case AL_MOD_ENV_ATTACKTIME_SOFT:
- self->ModEnv.AttackTime = value;
- break;
- case AL_MOD_ENV_HOLDTIME_SOFT:
- self->ModEnv.HoldTime = value;
- break;
- case AL_MOD_ENV_DECAYTIME_SOFT:
- self->ModEnv.DecayTime = value;
- break;
- case AL_MOD_ENV_SUSTAINVOLUME_SOFT:
- self->ModEnv.SustainAttn = value;
- break;
- case AL_MOD_ENV_RELEASETIME_SOFT:
- self->ModEnv.ReleaseTime = value;
- break;
- case AL_MOD_ENV_KEY_TO_HOLDTIME_SOFT:
- self->ModEnv.KeyToHoldTime = value;
- break;
- case AL_MOD_ENV_KEY_TO_DECAYTIME_SOFT:
- self->ModEnv.KeyToDecayTime = value;
- break;
-
- case AL_VOLUME_ENV_DELAYTIME_SOFT:
- self->VolEnv.DelayTime = value;
- break;
- case AL_VOLUME_ENV_ATTACKTIME_SOFT:
- self->VolEnv.AttackTime = value;
- break;
- case AL_VOLUME_ENV_HOLDTIME_SOFT:
- self->VolEnv.HoldTime = value;
- break;
- case AL_VOLUME_ENV_DECAYTIME_SOFT:
- self->VolEnv.DecayTime = value;
- break;
- case AL_VOLUME_ENV_SUSTAINVOLUME_SOFT:
- self->VolEnv.SustainAttn = value;
- break;
- case AL_VOLUME_ENV_RELEASETIME_SOFT:
- self->VolEnv.ReleaseTime = value;
- break;
- case AL_VOLUME_ENV_KEY_TO_HOLDTIME_SOFT:
- self->VolEnv.KeyToHoldTime = value;
- break;
- case AL_VOLUME_ENV_KEY_TO_DECAYTIME_SOFT:
- self->VolEnv.KeyToDecayTime = value;
- break;
-
- case AL_ATTENUATION_SOFT:
- if(!(value >= 0))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- self->Attenuation = value;
- break;
-
- case AL_TUNING_COARSE_SOFT:
- self->CoarseTuning = value;
- break;
- case AL_TUNING_FINE_SOFT:
- self->FineTuning = value;
- break;
-
- case AL_LOOP_MODE_SOFT:
- if(!(value == AL_NONE || value == AL_LOOP_CONTINUOUS_SOFT ||
- value == AL_LOOP_UNTIL_RELEASE_SOFT))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- self->LoopMode = value;
- break;
-
- case AL_TUNING_SCALE_SOFT:
- self->TuningScale = value;
- break;
-
- case AL_EXCLUSIVE_CLASS_SOFT:
- self->ExclusiveClass = value;
- break;
-
- case AL_SAMPLE_START_SOFT:
- self->Start = value;
- break;
-
- case AL_SAMPLE_END_SOFT:
- self->End = value;
- break;
-
- case AL_SAMPLE_LOOP_START_SOFT:
- self->LoopStart = value;
- break;
-
- case AL_SAMPLE_LOOP_END_SOFT:
- self->LoopEnd = value;
- break;
-
- case AL_SAMPLE_RATE_SOFT:
- if(!(value > 0))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- self->SampleRate = value;
- break;
-
- case AL_BASE_KEY_SOFT:
- if(!((value >= 0 && value <= 127) || value == 255))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- self->PitchKey = value;
- break;
-
- case AL_KEY_CORRECTION_SOFT:
- if(!(value >= -99 && value <= 99))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- self->PitchCorrection = value;
- break;
-
- case AL_SAMPLE_TYPE_SOFT:
- if(!(value == AL_MONO_SOFT || value == AL_RIGHT_SOFT || value == AL_LEFT_SOFT))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- self->SampleType = value;
- break;
-
- case AL_FONTSOUND_LINK_SOFT:
- link = value ? LookupFontsound(context->Device, value) : NULL;
- if(value && !link)
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
-
- if(link) IncrementRef(&link->ref);
- if((link=ATOMIC_EXCHANGE(ALfontsound*, &self->Link, link)) != NULL)
- DecrementRef(&link->ref);
- break;
-
- default:
- SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
- }
-}
-
-static ALsfmodulator *ALfontsound_getModStage(ALfontsound *self, ALsizei stage)
-{
- ALsfmodulator *ret = LookupModulator(self, stage);
- if(!ret)
- {
- static const ALsfmodulator moddef = {
- { { AL_ONE_SOFT, AL_UNORM_SOFT, AL_LINEAR_SOFT },
- { AL_ONE_SOFT, AL_UNORM_SOFT, AL_LINEAR_SOFT } },
- 0,
- AL_LINEAR_SOFT,
- AL_NONE
- };
- ret = malloc(sizeof(ALsfmodulator[4]));
- ret[0] = moddef;
- ret[1] = moddef;
- ret[2] = moddef;
- ret[3] = moddef;
- InsertUIntMapEntry(&self->ModulatorMap, stage>>2, ret);
- ret += stage&3;
- }
- return ret;
-}
-
-void ALfontsound_setModStagei(ALfontsound *self, ALCcontext *context, ALsizei stage, ALenum param, ALint value)
-{
- ALint srcidx = 0;
-
- if(ReadRef(&self->ref) != 0)
- SET_ERROR_AND_RETURN(context, AL_INVALID_OPERATION);
- switch(param)
- {
- case AL_SOURCE1_INPUT_SOFT:
- srcidx++;
- /* fall-through */
- case AL_SOURCE0_INPUT_SOFT:
- if(!(value == AL_ONE_SOFT || value == AL_NOTEON_VELOCITY_SOFT ||
- value == AL_NOTEON_KEY_SOFT || value == AL_KEYPRESSURE_SOFT ||
- value == AL_CHANNELPRESSURE_SOFT || value == AL_PITCHBEND_SOFT ||
- value == AL_PITCHBEND_SENSITIVITY_SOFT ||
- IsValidCtrlInput(value)))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- ALfontsound_getModStage(self, stage)->Source[srcidx].Input = value;
- break;
-
- case AL_SOURCE1_TYPE_SOFT:
- srcidx++;
- /* fall-through */
- case AL_SOURCE0_TYPE_SOFT:
- if(!(value == AL_UNORM_SOFT || value == AL_UNORM_REV_SOFT ||
- value == AL_SNORM_SOFT || value == AL_SNORM_REV_SOFT))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- ALfontsound_getModStage(self, stage)->Source[srcidx].Type = value;
- break;
-
- case AL_SOURCE1_FORM_SOFT:
- srcidx++;
- /* fall-through */
- case AL_SOURCE0_FORM_SOFT:
- if(!(value == AL_LINEAR_SOFT || value == AL_CONCAVE_SOFT ||
- value == AL_CONVEX_SOFT || value == AL_SWITCH_SOFT))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- ALfontsound_getModStage(self, stage)->Source[srcidx].Form = value;
- break;
-
- case AL_AMOUNT_SOFT:
- ALfontsound_getModStage(self, stage)->Amount = value;
- break;
-
- case AL_TRANSFORM_OP_SOFT:
- if(!(value == AL_LINEAR_SOFT || value == AL_ABSOLUTE_SOFT))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- ALfontsound_getModStage(self, stage)->TransformOp = value;
- break;
-
- case AL_DESTINATION_SOFT:
- if(!(value == AL_MOD_LFO_TO_PITCH_SOFT || value == AL_VIBRATO_LFO_TO_PITCH_SOFT ||
- value == AL_MOD_ENV_TO_PITCH_SOFT || value == AL_FILTER_CUTOFF_SOFT ||
- value == AL_FILTER_RESONANCE_SOFT || value == AL_MOD_LFO_TO_FILTER_CUTOFF_SOFT ||
- value == AL_MOD_ENV_TO_FILTER_CUTOFF_SOFT || value == AL_MOD_LFO_TO_VOLUME_SOFT ||
- value == AL_CHORUS_SEND_SOFT || value == AL_REVERB_SEND_SOFT || value == AL_PAN_SOFT ||
- value == AL_MOD_LFO_DELAY_SOFT || value == AL_MOD_LFO_FREQUENCY_SOFT ||
- value == AL_VIBRATO_LFO_DELAY_SOFT || value == AL_VIBRATO_LFO_FREQUENCY_SOFT ||
- value == AL_MOD_ENV_DELAYTIME_SOFT || value == AL_MOD_ENV_ATTACKTIME_SOFT ||
- value == AL_MOD_ENV_HOLDTIME_SOFT || value == AL_MOD_ENV_DECAYTIME_SOFT ||
- value == AL_MOD_ENV_SUSTAINVOLUME_SOFT || value == AL_MOD_ENV_RELEASETIME_SOFT ||
- value == AL_MOD_ENV_KEY_TO_HOLDTIME_SOFT || value == AL_MOD_ENV_KEY_TO_DECAYTIME_SOFT ||
- value == AL_VOLUME_ENV_DELAYTIME_SOFT || value == AL_VOLUME_ENV_ATTACKTIME_SOFT ||
- value == AL_VOLUME_ENV_HOLDTIME_SOFT || value == AL_VOLUME_ENV_DECAYTIME_SOFT ||
- value == AL_VOLUME_ENV_SUSTAINVOLUME_SOFT || value == AL_VOLUME_ENV_RELEASETIME_SOFT ||
- value == AL_VOLUME_ENV_KEY_TO_HOLDTIME_SOFT || value == AL_VOLUME_ENV_KEY_TO_DECAYTIME_SOFT ||
- value == AL_ATTENUATION_SOFT || value == AL_TUNING_COARSE_SOFT ||
- value == AL_TUNING_FINE_SOFT || value == AL_TUNING_SCALE_SOFT))
- SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
- ALfontsound_getModStage(self, stage)->Dest = value;
- break;
-
- default:
- SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
- }
-}
-
-static void ALfontsound_getModStagei(ALfontsound *self, ALCcontext *context, ALsizei stage, ALenum param, ALint *values)
-{
- ALsfmodulator *mod = LookupModulator(self, stage);
- ALint srcidx = 0;
-
- switch(param)
- {
- case AL_SOURCE1_INPUT_SOFT:
- srcidx++;
- /* fall-through */
- case AL_SOURCE0_INPUT_SOFT:
- values[0] = mod ? mod->Source[srcidx].Input : AL_ONE_SOFT;
- break;
-
- case AL_SOURCE1_TYPE_SOFT:
- srcidx++;
- /* fall-through */
- case AL_SOURCE0_TYPE_SOFT:
- values[0] = mod ? mod->Source[srcidx].Type : AL_UNORM_SOFT;
- break;
-
- case AL_SOURCE1_FORM_SOFT:
- srcidx++;
- /* fall-through */
- case AL_SOURCE0_FORM_SOFT:
- values[0] = mod ? mod->Source[srcidx].Form : AL_LINEAR_SOFT;
- break;
-
- case AL_AMOUNT_SOFT:
- values[0] = mod ? mod->Amount : 0;
- break;
-
- case AL_TRANSFORM_OP_SOFT:
- values[0] = mod ? mod->TransformOp : AL_LINEAR_SOFT;
- break;
-
- case AL_DESTINATION_SOFT:
- values[0] = mod ? mod->Dest : AL_NONE;
- break;
-
- default:
- SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
- }
-}
-
-
-/* ReleaseALFontsounds
- *
- * Called to destroy any fontsounds that still exist on the device
- */
-void ReleaseALFontsounds(ALCdevice *device)
-{
- ALsizei i;
- for(i = 0;i < device->FontsoundMap.size;i++)
- {
- ALfontsound *temp = device->FontsoundMap.array[i].value;
- device->FontsoundMap.array[i].value = NULL;
-
- ALfontsound_Destruct(temp);
-
- memset(temp, 0, sizeof(*temp));
- free(temp);
- }
-}
diff --git a/OpenAL32/alMidi.c b/OpenAL32/alMidi.c
deleted file mode 100644
index 015b1915..00000000
--- a/OpenAL32/alMidi.c
+++ /dev/null
@@ -1,217 +0,0 @@
-
-#include "config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-
-#include "alMain.h"
-#include "alMidi.h"
-#include "alError.h"
-#include "alThunk.h"
-#include "evtqueue.h"
-#include "rwlock.h"
-#include "alu.h"
-
-#include "midi/base.h"
-
-
-MidiSynth *SynthCreate(ALCdevice *device)
-{
- MidiSynth *synth = NULL;
- if(!synth) synth = SSynth_create(device);
- if(!synth) synth = FSynth_create(device);
- if(!synth) synth = DSynth_create(device);
- return synth;
-}
-
-
-AL_API void AL_APIENTRY alMidiSoundfontSOFT(ALuint id)
-{
- alMidiSoundfontvSOFT(1, &id);
-}
-
-AL_API void AL_APIENTRY alMidiSoundfontvSOFT(ALsizei count, const ALuint *ids)
-{
- ALCdevice *device;
- ALCcontext *context;
- MidiSynth *synth;
- ALenum err;
-
- context = GetContextRef();
- if(!context) return;
-
- if(count < 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
-
- device = context->Device;
- synth = device->Synth;
-
- WriteLock(&synth->Lock);
- if(synth->State == AL_PLAYING || synth->State == AL_PAUSED)
- alSetError(context, AL_INVALID_OPERATION);
- else
- {
- err = V(synth,selectSoundfonts)(context, count, ids);
- if(err != AL_NO_ERROR)
- alSetError(context, err);
- }
- WriteUnlock(&synth->Lock);
-
-done:
- ALCcontext_DecRef(context);
-}
-
-
-AL_API void AL_APIENTRY alMidiEventSOFT(ALuint64SOFT time, ALenum event, ALsizei channel, ALsizei param1, ALsizei param2)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALenum err;
-
- context = GetContextRef();
- if(!context) return;
-
- if(!(event == AL_NOTEOFF_SOFT || event == AL_NOTEON_SOFT ||
- event == AL_KEYPRESSURE_SOFT || event == AL_CONTROLLERCHANGE_SOFT ||
- event == AL_PROGRAMCHANGE_SOFT || event == AL_CHANNELPRESSURE_SOFT ||
- event == AL_PITCHBEND_SOFT))
- SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
- if(!(channel >= 0 && channel <= 15))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
- if(!(param1 >= 0 && param1 <= 127))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
- if(!(param2 >= 0 && param2 <= 127))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
-
- device = context->Device;
- ALCdevice_Lock(device);
- err = MidiSynth_insertEvent(device->Synth, time, event|channel, param1, param2);
- ALCdevice_Unlock(device);
- if(err != AL_NO_ERROR)
- alSetError(context, err);
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alMidiSysExSOFT(ALuint64SOFT time, const ALbyte *data, ALsizei size)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALenum err;
-
- context = GetContextRef();
- if(!context) return;
-
- if(!data || size < 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
-
- device = context->Device;
- ALCdevice_Lock(device);
- err = MidiSynth_insertSysExEvent(device->Synth, time, data, size);
- ALCdevice_Unlock(device);
- if(err != AL_NO_ERROR)
- alSetError(context, err);
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alMidiPlaySOFT(void)
-{
- ALCcontext *context;
- MidiSynth *synth;
-
- context = GetContextRef();
- if(!context) return;
-
- synth = context->Device->Synth;
- WriteLock(&synth->Lock);
- MidiSynth_setState(synth, AL_PLAYING);
- WriteUnlock(&synth->Lock);
-
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alMidiPauseSOFT(void)
-{
- ALCcontext *context;
- MidiSynth *synth;
-
- context = GetContextRef();
- if(!context) return;
-
- synth = context->Device->Synth;
- WriteLock(&synth->Lock);
- MidiSynth_setState(synth, AL_PAUSED);
- WriteUnlock(&synth->Lock);
-
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alMidiStopSOFT(void)
-{
- ALCdevice *device;
- ALCcontext *context;
- MidiSynth *synth;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- synth = device->Synth;
-
- WriteLock(&synth->Lock);
- MidiSynth_setState(synth, AL_STOPPED);
-
- ALCdevice_Lock(device);
- V0(synth,stop)();
- ALCdevice_Unlock(device);
- WriteUnlock(&synth->Lock);
-
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alMidiResetSOFT(void)
-{
- ALCdevice *device;
- ALCcontext *context;
- MidiSynth *synth;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- synth = device->Synth;
-
- WriteLock(&synth->Lock);
- MidiSynth_setState(synth, AL_INITIAL);
-
- ALCdevice_Lock(device);
- V0(synth,reset)();
- ALCdevice_Unlock(device);
- WriteUnlock(&synth->Lock);
-
- ALCcontext_DecRef(context);
-}
-
-
-AL_API void AL_APIENTRY alMidiGainSOFT(ALfloat value)
-{
- ALCdevice *device;
- ALCcontext *context;
-
- context = GetContextRef();
- if(!context) return;
-
- if(!(value >= 0.0f && isfinite(value)))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
-
- device = context->Device;
- V(device->Synth,setGain)(value);
-
-done:
- ALCcontext_DecRef(context);
-}
diff --git a/OpenAL32/alPreset.c b/OpenAL32/alPreset.c
deleted file mode 100644
index 1934ba05..00000000
--- a/OpenAL32/alPreset.c
+++ /dev/null
@@ -1,339 +0,0 @@
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "alMain.h"
-#include "alMidi.h"
-#include "alError.h"
-#include "alThunk.h"
-
-#include "midi/base.h"
-
-
-extern inline struct ALsfpreset *LookupPreset(ALCdevice *device, ALuint id);
-extern inline struct ALsfpreset *RemovePreset(ALCdevice *device, ALuint id);
-
-static void ALsfpreset_Construct(ALsfpreset *self);
-static void ALsfpreset_Destruct(ALsfpreset *self);
-
-
-AL_API void AL_APIENTRY alGenPresetsSOFT(ALsizei n, ALuint *ids)
-{
- ALCcontext *context;
- ALsizei cur = 0;
-
- context = GetContextRef();
- if(!context) return;
-
- if(!(n >= 0))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
-
- for(cur = 0;cur < n;cur++)
- {
- ALsfpreset *preset = NewPreset(context);
- if(!preset)
- {
- alDeletePresetsSOFT(cur, ids);
- break;
- }
-
- ids[cur] = preset->id;
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API ALvoid AL_APIENTRY alDeletePresetsSOFT(ALsizei n, const ALuint *ids)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALsfpreset *preset;
- ALsizei i;
-
- context = GetContextRef();
- if(!context) return;
-
- if(!(n >= 0))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
-
- device = context->Device;
- for(i = 0;i < n;i++)
- {
- /* Check for valid ID */
- if((preset=LookupPreset(device, ids[i])) == NULL)
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- if(ReadRef(&preset->ref) != 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- }
-
- for(i = 0;i < n;i++)
- {
- if((preset=LookupPreset(device, ids[i])) != NULL)
- DeletePreset(device, preset);
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API ALboolean AL_APIENTRY alIsPresetSOFT(ALuint id)
-{
- ALCcontext *context;
- ALboolean ret;
-
- context = GetContextRef();
- if(!context) return AL_FALSE;
-
- ret = LookupPreset(context->Device, id) ? AL_TRUE : AL_FALSE;
-
- ALCcontext_DecRef(context);
-
- return ret;
-}
-
-AL_API void AL_APIENTRY alPresetiSOFT(ALuint id, ALenum param, ALint value)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALsfpreset *preset;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if((preset=LookupPreset(device, id)) == NULL)
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- if(ReadRef(&preset->ref) != 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- switch(param)
- {
- case AL_MIDI_PRESET_SOFT:
- if(!(value >= 0 && value <= 127))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
- preset->Preset = value;
- break;
-
- case AL_MIDI_BANK_SOFT:
- if(!(value >= 0 && value <= 128))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
- preset->Bank = value;
- break;
-
- default:
- SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alPresetivSOFT(ALuint id, ALenum param, const ALint *values)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALsfpreset *preset;
-
- switch(param)
- {
- case AL_MIDI_PRESET_SOFT:
- case AL_MIDI_BANK_SOFT:
- alPresetiSOFT(id, param, values[0]);
- return;
- }
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if((preset=LookupPreset(device, id)) == NULL)
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- if(ReadRef(&preset->ref) != 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- switch(param)
- {
- default:
- SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alGetPresetivSOFT(ALuint id, ALenum param, ALint *values)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALsfpreset *preset;
- ALsizei i;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if((preset=LookupPreset(device, id)) == NULL)
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- switch(param)
- {
- case AL_MIDI_PRESET_SOFT:
- values[0] = preset->Preset;
- break;
-
- case AL_MIDI_BANK_SOFT:
- values[0] = preset->Bank;
- break;
-
- case AL_FONTSOUNDS_SIZE_SOFT:
- values[0] = preset->NumSounds;
- break;
-
- case AL_FONTSOUNDS_SOFT:
- for(i = 0;i < preset->NumSounds;i++)
- values[i] = preset->Sounds[i]->id;
- break;
-
- default:
- SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alPresetFontsoundsSOFT(ALuint id, ALsizei count, const ALuint *fsids)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALsfpreset *preset;
- ALfontsound **sounds;
- ALsizei i;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if(!(preset=LookupPreset(device, id)))
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- if(count < 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
-
- if(ReadRef(&preset->ref) != 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
-
- if(count == 0)
- sounds = NULL;
- else
- {
- sounds = calloc(count, sizeof(sounds[0]));
- if(!sounds)
- SET_ERROR_AND_GOTO(context, AL_OUT_OF_MEMORY, done);
-
- for(i = 0;i < count;i++)
- {
- if(!(sounds[i]=LookupFontsound(device, fsids[i])))
- {
- free(sounds);
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
- }
- }
- }
-
- for(i = 0;i < count;i++)
- IncrementRef(&sounds[i]->ref);
-
- sounds = ExchangePtr((XchgPtr*)&preset->Sounds, sounds);
- count = ExchangeInt(&preset->NumSounds, count);
-
- for(i = 0;i < count;i++)
- DecrementRef(&sounds[i]->ref);
- free(sounds);
-
-done:
- ALCcontext_DecRef(context);
-}
-
-
-ALsfpreset *NewPreset(ALCcontext *context)
-{
- ALCdevice *device = context->Device;
- ALsfpreset *preset;
- ALenum err;
-
- preset = calloc(1, sizeof(*preset));
- if(!preset)
- SET_ERROR_AND_RETURN_VALUE(context, AL_OUT_OF_MEMORY, NULL);
- ALsfpreset_Construct(preset);
-
- err = NewThunkEntry(&preset->id);
- if(err == AL_NO_ERROR)
- err = InsertUIntMapEntry(&device->PresetMap, preset->id, preset);
- if(err != AL_NO_ERROR)
- {
- ALsfpreset_Destruct(preset);
- memset(preset, 0, sizeof(*preset));
- free(preset);
-
- SET_ERROR_AND_RETURN_VALUE(context, err, NULL);
- }
-
- return preset;
-}
-
-void DeletePreset(ALCdevice *device, ALsfpreset *preset)
-{
- RemovePreset(device, preset->id);
-
- ALsfpreset_Destruct(preset);
- memset(preset, 0, sizeof(*preset));
- free(preset);
-}
-
-
-static void ALsfpreset_Construct(ALsfpreset *self)
-{
- InitRef(&self->ref, 0);
-
- self->Preset = 0;
- self->Bank = 0;
-
- self->Sounds = NULL;
- self->NumSounds = 0;
-
- self->id = 0;
-}
-
-static void ALsfpreset_Destruct(ALsfpreset *self)
-{
- ALsizei i;
-
- FreeThunkEntry(self->id);
- self->id = 0;
-
- for(i = 0;i < self->NumSounds;i++)
- DecrementRef(&self->Sounds[i]->ref);
- free(self->Sounds);
- self->Sounds = NULL;
- self->NumSounds = 0;
-}
-
-
-/* ReleaseALPresets
- *
- * Called to destroy any presets that still exist on the device
- */
-void ReleaseALPresets(ALCdevice *device)
-{
- ALsizei i;
- for(i = 0;i < device->PresetMap.size;i++)
- {
- ALsfpreset *temp = device->PresetMap.array[i].value;
- device->PresetMap.array[i].value = NULL;
-
- ALsfpreset_Destruct(temp);
-
- memset(temp, 0, sizeof(*temp));
- free(temp);
- }
-}
diff --git a/OpenAL32/alSoundfont.c b/OpenAL32/alSoundfont.c
deleted file mode 100644
index 96feed46..00000000
--- a/OpenAL32/alSoundfont.c
+++ /dev/null
@@ -1,455 +0,0 @@
-
-#include "config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-
-#include "alMain.h"
-#include "alMidi.h"
-#include "alThunk.h"
-#include "alError.h"
-#include <alBuffer.h>
-
-#include "midi/base.h"
-
-
-extern inline struct ALsoundfont *LookupSfont(ALCdevice *device, ALuint id);
-extern inline struct ALsoundfont *RemoveSfont(ALCdevice *device, ALuint id);
-
-static void ALsoundfont_Construct(ALsoundfont *self);
-static void ALsoundfont_Destruct(ALsoundfont *self);
-void ALsoundfont_deleteSoundfont(ALsoundfont *self, ALCdevice *device);
-ALsoundfont *ALsoundfont_getDefSoundfont(ALCcontext *context);
-static size_t ALsoundfont_read(ALvoid *buf, size_t bytes, ALvoid *ptr);
-
-
-AL_API void AL_APIENTRY alGenSoundfontsSOFT(ALsizei n, ALuint *ids)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALsizei cur = 0;
- ALenum err;
-
- context = GetContextRef();
- if(!context) return;
-
- if(!(n >= 0))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
-
- device = context->Device;
- for(cur = 0;cur < n;cur++)
- {
- ALsoundfont *sfont = calloc(1, sizeof(ALsoundfont));
- if(!sfont)
- {
- alDeleteSoundfontsSOFT(cur, ids);
- SET_ERROR_AND_GOTO(context, AL_OUT_OF_MEMORY, done);
- }
- ALsoundfont_Construct(sfont);
-
- err = NewThunkEntry(&sfont->id);
- if(err == AL_NO_ERROR)
- err = InsertUIntMapEntry(&device->SfontMap, sfont->id, sfont);
- if(err != AL_NO_ERROR)
- {
- ALsoundfont_Destruct(sfont);
- memset(sfont, 0, sizeof(ALsoundfont));
- free(sfont);
-
- alDeleteSoundfontsSOFT(cur, ids);
- SET_ERROR_AND_GOTO(context, err, done);
- }
-
- ids[cur] = sfont->id;
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API ALvoid AL_APIENTRY alDeleteSoundfontsSOFT(ALsizei n, const ALuint *ids)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALsoundfont *sfont;
- ALsizei i;
-
- context = GetContextRef();
- if(!context) return;
-
- if(!(n >= 0))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
-
- device = context->Device;
- for(i = 0;i < n;i++)
- {
- /* Check for valid soundfont ID */
- if(ids[i] == 0)
- {
- if(!(sfont=device->DefaultSfont))
- continue;
- }
- else if((sfont=LookupSfont(device, ids[i])) == NULL)
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- if(ReadRef(&sfont->ref) != 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- }
-
- for(i = 0;i < n;i++)
- {
- if(ids[i] == 0)
- {
- MidiSynth *synth = device->Synth;
- WriteLock(&synth->Lock);
- if(device->DefaultSfont != NULL)
- ALsoundfont_deleteSoundfont(device->DefaultSfont, device);
- device->DefaultSfont = NULL;
- WriteUnlock(&synth->Lock);
- continue;
- }
- else if((sfont=RemoveSfont(device, ids[i])) == NULL)
- continue;
-
- ALsoundfont_Destruct(sfont);
-
- memset(sfont, 0, sizeof(*sfont));
- free(sfont);
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API ALboolean AL_APIENTRY alIsSoundfontSOFT(ALuint id)
-{
- ALCcontext *context;
- ALboolean ret;
-
- context = GetContextRef();
- if(!context) return AL_FALSE;
-
- ret = ((!id || LookupSfont(context->Device, id)) ?
- AL_TRUE : AL_FALSE);
-
- ALCcontext_DecRef(context);
-
- return ret;
-}
-
-AL_API void AL_APIENTRY alGetSoundfontivSOFT(ALuint id, ALenum param, ALint *values)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALsoundfont *sfont;
- ALsizei i;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if(id == 0)
- sfont = ALsoundfont_getDefSoundfont(context);
- else if(!(sfont=LookupSfont(device, id)))
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- switch(param)
- {
- case AL_PRESETS_SIZE_SOFT:
- values[0] = sfont->NumPresets;
- break;
-
- case AL_PRESETS_SOFT:
- for(i = 0;i < sfont->NumPresets;i++)
- values[i] = sfont->Presets[i]->id;
- break;
-
- default:
- SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
- }
-
-done:
- ALCcontext_DecRef(context);
-}
-
-AL_API void AL_APIENTRY alSoundfontPresetsSOFT(ALuint id, ALsizei count, const ALuint *pids)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALsoundfont *sfont;
- ALsfpreset **presets;
- ALsizei i;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if(id == 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- if(!(sfont=LookupSfont(device, id)))
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
- if(count < 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
-
- WriteLock(&sfont->Lock);
- if(ReadRef(&sfont->ref) != 0)
- {
- WriteUnlock(&sfont->Lock);
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- }
-
- if(count == 0)
- presets = NULL;
- else
- {
- presets = calloc(count, sizeof(presets[0]));
- if(!presets)
- {
- WriteUnlock(&sfont->Lock);
- SET_ERROR_AND_GOTO(context, AL_OUT_OF_MEMORY, done);
- }
-
- for(i = 0;i < count;i++)
- {
- if(!(presets[i]=LookupPreset(device, pids[i])))
- {
- free(presets);
- WriteUnlock(&sfont->Lock);
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
- }
- }
- }
-
- for(i = 0;i < count;i++)
- IncrementRef(&presets[i]->ref);
-
- presets = ExchangePtr((XchgPtr*)&sfont->Presets, presets);
- count = ExchangeInt(&sfont->NumPresets, count);
- WriteUnlock(&sfont->Lock);
-
- for(i = 0;i < count;i++)
- DecrementRef(&presets[i]->ref);
- free(presets);
-
-done:
- ALCcontext_DecRef(context);
-}
-
-
-AL_API void AL_APIENTRY alLoadSoundfontSOFT(ALuint id, size_t(*cb)(ALvoid*,size_t,ALvoid*), ALvoid *user)
-{
- ALCdevice *device;
- ALCcontext *context;
- ALsoundfont *sfont;
- Reader reader;
-
- context = GetContextRef();
- if(!context) return;
-
- device = context->Device;
- if(id == 0)
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- if(!(sfont=LookupSfont(device, id)))
- SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
-
- WriteLock(&sfont->Lock);
- if(ReadRef(&sfont->ref) != 0)
- {
- WriteUnlock(&sfont->Lock);
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- }
- if(sfont->NumPresets > 0)
- {
- WriteUnlock(&sfont->Lock);
- SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done);
- }
-
- reader.cb = cb;
- reader.ptr = user;
- reader.error = 0;
- loadSf2(&reader, sfont, context);
- WriteUnlock(&sfont->Lock);
-
-done:
- ALCcontext_DecRef(context);
-}
-
-
-static void ALsoundfont_Construct(ALsoundfont *self)
-{
- InitRef(&self->ref, 0);
-
- self->Presets = NULL;
- self->NumPresets = 0;
-
- RWLockInit(&self->Lock);
-
- self->id = 0;
-}
-
-static void ALsoundfont_Destruct(ALsoundfont *self)
-{
- ALsizei i;
-
- FreeThunkEntry(self->id);
- self->id = 0;
-
- for(i = 0;i < self->NumPresets;i++)
- {
- DecrementRef(&self->Presets[i]->ref);
- self->Presets[i] = NULL;
- }
- free(self->Presets);
- self->Presets = NULL;
- self->NumPresets = 0;
-}
-
-ALsoundfont *ALsoundfont_getDefSoundfont(ALCcontext *context)
-{
- ALCdevice *device = context->Device;
- al_string fname = AL_STRING_INIT_STATIC();
- const char *namelist;
-
- if(device->DefaultSfont)
- return device->DefaultSfont;
-
- device->DefaultSfont = calloc(1, sizeof(device->DefaultSfont[0]));
- ALsoundfont_Construct(device->DefaultSfont);
-
- namelist = getenv("ALSOFT_SOUNDFONT");
- if(!namelist || !namelist[0])
- ConfigValueStr(al_string_get_cstr(device->DeviceName), "midi", "soundfont", &namelist);
- while(namelist && namelist[0])
- {
- const char *next, *end;
- FILE *f;
-
- while(*namelist && (isspace(*namelist) || *namelist == ','))
- namelist++;
- if(!*namelist)
- break;
- next = strchr(namelist, ',');
- end = next ? next++ : (namelist+strlen(namelist));
- while(--end != namelist && isspace(*end)) {
- }
- if(end == namelist)
- continue;
- al_string_append_range(&fname, namelist, end+1);
- namelist = next;
-
- f = OpenDataFile(al_string_get_cstr(fname), "openal/soundfonts");
- if(f == NULL)
- ERR("Failed to open %s\n", al_string_get_cstr(fname));
- else
- {
- Reader reader;
- reader.cb = ALsoundfont_read;
- reader.ptr = f;
- reader.error = 0;
- TRACE("Loading %s\n", al_string_get_cstr(fname));
- loadSf2(&reader, device->DefaultSfont, context);
- fclose(f);
- }
-
- al_string_clear(&fname);
- }
- AL_STRING_DEINIT(fname);
-
- return device->DefaultSfont;
-}
-
-void ALsoundfont_deleteSoundfont(ALsoundfont *self, ALCdevice *device)
-{
- ALsfpreset **presets = self->Presets;
- ALsizei num_presets = self->NumPresets;
- VECTOR(ALbuffer*) buffers;
- ALsizei i;
-
- VECTOR_INIT(buffers);
-
- self->Presets = NULL;
- self->NumPresets = 0;
-
- for(i = 0;i < num_presets;i++)
- {
- ALsfpreset *preset = presets[i];
- ALfontsound **sounds = preset->Sounds;
- ALsizei num_sounds = preset->NumSounds;
- ALboolean deleting;
- ALsizei j;
-
- preset->Sounds = NULL;
- preset->NumSounds = 0;
- DeletePreset(device, preset);
- preset = NULL;
-
- for(j = 0;j < num_sounds;j++)
- DecrementRef(&sounds[j]->ref);
- /* Some fontsounds may not be immediately deletable because they're
- * linked to another fontsound. When those fontsounds are deleted
- * they should become deletable, so use a loop until all fontsounds
- * are deleted. */
- do {
- deleting = AL_FALSE;
- for(j = 0;j < num_sounds;j++)
- {
- if(sounds[j] && ReadRef(&sounds[j]->ref) == 0)
- {
- ALbuffer *buffer;
-
- deleting = AL_TRUE;
- if((buffer=ATOMIC_LOAD(&sounds[j]->Buffer)) != NULL)
- {
- ALbuffer **iter;
-
-#define MATCH_BUFFER(_i) (buffer == *(_i))
- VECTOR_FIND_IF(iter, ALbuffer*, buffers, MATCH_BUFFER);
- if(iter == VECTOR_ITER_END(buffers))
- VECTOR_PUSH_BACK(buffers, buffer);
-#undef MATCH_BUFFER
- }
- DeleteFontsound(device, sounds[j]);
- sounds[j] = NULL;
- }
- }
- } while(deleting);
- free(sounds);
- }
-
- ALsoundfont_Destruct(self);
- free(self);
-
-#define DELETE_BUFFER(iter) do { \
- assert(ReadRef(&(*(iter))->ref) == 0); \
- DeleteBuffer(device, *(iter)); \
-} while(0)
- VECTOR_FOR_EACH(ALbuffer*, buffers, DELETE_BUFFER);
-#undef DELETE_BUFFER
- VECTOR_DEINIT(buffers);
-}
-
-
-static size_t ALsoundfont_read(ALvoid *buf, size_t bytes, ALvoid *ptr)
-{
- return fread(buf, 1, bytes, (FILE*)ptr);
-}
-
-
-/* ReleaseALSoundfonts
- *
- * Called to destroy any soundfonts that still exist on the device
- */
-void ReleaseALSoundfonts(ALCdevice *device)
-{
- ALsizei i;
- for(i = 0;i < device->SfontMap.size;i++)
- {
- ALsoundfont *temp = device->SfontMap.array[i].value;
- device->SfontMap.array[i].value = NULL;
-
- ALsoundfont_Destruct(temp);
-
- memset(temp, 0, sizeof(*temp));
- free(temp);
- }
-}
diff --git a/OpenAL32/alState.c b/OpenAL32/alState.c
index f2f25f97..dca41363 100644
--- a/OpenAL32/alState.c
+++ b/OpenAL32/alState.c
@@ -28,10 +28,8 @@
#include "alError.h"
#include "alSource.h"
#include "alAuxEffectSlot.h"
-#include "alMidi.h"
#include "backends/base.h"
-#include "midi/base.h"
static const ALchar alVendor[] = "OpenAL Community";
@@ -160,7 +158,6 @@ done:
AL_API ALdouble AL_APIENTRY alGetDouble(ALenum pname)
{
- ALCdevice *device;
ALCcontext *context;
ALdouble value = 0.0;
@@ -189,16 +186,6 @@ AL_API ALdouble AL_APIENTRY alGetDouble(ALenum pname)
value = (ALdouble)context->DeferUpdates;
break;
- case AL_MIDI_GAIN_SOFT:
- device = context->Device;
- value = (ALdouble)MidiSynth_getGain(device->Synth);
- break;
-
- case AL_MIDI_STATE_SOFT:
- device = context->Device;
- value = (ALdouble)MidiSynth_getState(device->Synth);
- break;
-
default:
SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
}
@@ -211,7 +198,6 @@ done:
AL_API ALfloat AL_APIENTRY alGetFloat(ALenum pname)
{
- ALCdevice *device;
ALCcontext *context;
ALfloat value = 0.0f;
@@ -240,16 +226,6 @@ AL_API ALfloat AL_APIENTRY alGetFloat(ALenum pname)
value = (ALfloat)context->DeferUpdates;
break;
- case AL_MIDI_GAIN_SOFT:
- device = context->Device;
- value = MidiSynth_getGain(device->Synth);
- break;
-
- case AL_MIDI_STATE_SOFT:
- device = context->Device;
- value = (ALfloat)MidiSynth_getState(device->Synth);
- break;
-
default:
SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
}
@@ -263,8 +239,6 @@ done:
AL_API ALint AL_APIENTRY alGetInteger(ALenum pname)
{
ALCcontext *context;
- ALCdevice *device;
- MidiSynth *synth;
ALint value = 0;
context = GetContextRef();
@@ -292,17 +266,6 @@ AL_API ALint AL_APIENTRY alGetInteger(ALenum pname)
value = (ALint)context->DeferUpdates;
break;
- case AL_SOUNDFONTS_SIZE_SOFT:
- device = context->Device;
- synth = device->Synth;
- value = synth->NumSoundfonts;
- break;
-
- case AL_MIDI_STATE_SOFT:
- device = context->Device;
- value = MidiSynth_getState(device->Synth);
- break;
-
default:
SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
}
@@ -316,8 +279,6 @@ done:
AL_API ALint64SOFT AL_APIENTRY alGetInteger64SOFT(ALenum pname)
{
ALCcontext *context;
- ALCdevice *device;
- MidiSynth *synth;
ALint64SOFT value = 0;
context = GetContextRef();
@@ -345,24 +306,6 @@ AL_API ALint64SOFT AL_APIENTRY alGetInteger64SOFT(ALenum pname)
value = (ALint64SOFT)context->DeferUpdates;
break;
- case AL_MIDI_CLOCK_SOFT:
- device = context->Device;
- V0(device->Backend,lock)();
- value = MidiSynth_getTime(device->Synth);
- V0(device->Backend,unlock)();
- break;
-
- case AL_SOUNDFONTS_SIZE_SOFT:
- device = context->Device;
- synth = device->Synth;
- value = (ALint64SOFT)synth->NumSoundfonts;
- break;
-
- case AL_MIDI_STATE_SOFT:
- device = context->Device;
- value = (ALint64SOFT)MidiSynth_getState(device->Synth);
- break;
-
default:
SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
}
@@ -419,8 +362,6 @@ AL_API ALvoid AL_APIENTRY alGetDoublev(ALenum pname, ALdouble *values)
case AL_DISTANCE_MODEL:
case AL_SPEED_OF_SOUND:
case AL_DEFERRED_UPDATES_SOFT:
- case AL_MIDI_GAIN_SOFT:
- case AL_MIDI_STATE_SOFT:
values[0] = alGetDouble(pname);
return;
}
@@ -454,8 +395,6 @@ AL_API ALvoid AL_APIENTRY alGetFloatv(ALenum pname, ALfloat *values)
case AL_DISTANCE_MODEL:
case AL_SPEED_OF_SOUND:
case AL_DEFERRED_UPDATES_SOFT:
- case AL_MIDI_GAIN_SOFT:
- case AL_MIDI_STATE_SOFT:
values[0] = alGetFloat(pname);
return;
}
@@ -479,9 +418,6 @@ done:
AL_API ALvoid AL_APIENTRY alGetIntegerv(ALenum pname, ALint *values)
{
ALCcontext *context;
- ALCdevice *device;
- MidiSynth *synth;
- ALsizei i;
if(values)
{
@@ -492,8 +428,6 @@ AL_API ALvoid AL_APIENTRY alGetIntegerv(ALenum pname, ALint *values)
case AL_DISTANCE_MODEL:
case AL_SPEED_OF_SOUND:
case AL_DEFERRED_UPDATES_SOFT:
- case AL_SOUNDFONTS_SIZE_SOFT:
- case AL_MIDI_STATE_SOFT:
values[0] = alGetInteger(pname);
return;
}
@@ -504,18 +438,6 @@ AL_API ALvoid AL_APIENTRY alGetIntegerv(ALenum pname, ALint *values)
switch(pname)
{
- case AL_SOUNDFONTS_SOFT:
- device = context->Device;
- synth = device->Synth;
- if(synth->NumSoundfonts > 0)
- {
- if(!(values))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
- for(i = 0;i < synth->NumSoundfonts;i++)
- values[i] = synth->Soundfonts[i]->id;
- }
- break;
-
default:
SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
}
@@ -527,9 +449,6 @@ done:
AL_API void AL_APIENTRY alGetInteger64vSOFT(ALenum pname, ALint64SOFT *values)
{
ALCcontext *context;
- ALCdevice *device;
- MidiSynth *synth;
- ALsizei i;
if(values)
{
@@ -540,9 +459,6 @@ AL_API void AL_APIENTRY alGetInteger64vSOFT(ALenum pname, ALint64SOFT *values)
case AL_DISTANCE_MODEL:
case AL_SPEED_OF_SOUND:
case AL_DEFERRED_UPDATES_SOFT:
- case AL_MIDI_CLOCK_SOFT:
- case AL_SOUNDFONTS_SIZE_SOFT:
- case AL_MIDI_STATE_SOFT:
values[0] = alGetInteger64SOFT(pname);
return;
}
@@ -553,18 +469,6 @@ AL_API void AL_APIENTRY alGetInteger64vSOFT(ALenum pname, ALint64SOFT *values)
switch(pname)
{
- case AL_SOUNDFONTS_SOFT:
- device = context->Device;
- synth = device->Synth;
- if(synth->NumSoundfonts > 0)
- {
- if(!(values))
- SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
- for(i = 0;i < synth->NumSoundfonts;i++)
- values[i] = (ALint64SOFT)synth->Soundfonts[i]->id;
- }
- break;
-
default:
SET_ERROR_AND_GOTO(context, AL_INVALID_ENUM, done);
}
diff --git a/alsoftrc.sample b/alsoftrc.sample
index faac3d8e..84e57f4c 100644
--- a/alsoftrc.sample
+++ b/alsoftrc.sample
@@ -190,29 +190,6 @@
#trap-al-error = false
##
-## MIDI stuff (EXPERIMENTAL)
-##
-[midi]
-
-## soundfont: (global)
-# A default soundfont (sf2 format). Used when an app requests the system
-# default. The listed file is relative to system-dependant data directories.
-# On Windows this is:
-# $AppData\openal\soundfonts
-# And on other systems, it's (in order):
-# $XDG_DATA_HOME/openal/soundfonts
-# $XDG_DATA_DIRS/openal/soundfonts
-# An absolute path may also be specified, if the given file is elsewhere.
-#soundfont =
-
-## volume: (global)
-# Additional attenuation applied to MIDI output, expressed in decibels. This
-# is used to help keep the mix from clipping, and so must be 0 or less. The
-# value is logarithmic, so -6 will be about half amplitude, and -12 about
-# 1/4th. The default is roughly -13.9794 (0.2, or 1/5th).
-#volume =
-
-##
## Reverb effect stuff (includes EAX reverb)
##
[reverb]
diff --git a/cmake/FindFluidSynth.cmake b/cmake/FindFluidSynth.cmake
deleted file mode 100644
index fe96b225..00000000
--- a/cmake/FindFluidSynth.cmake
+++ /dev/null
@@ -1,19 +0,0 @@
-# - Find fluidsynth
-# Find the native fluidsynth includes and library
-#
-# FLUIDSYNTH_INCLUDE_DIR - where to find fluidsynth.h
-# FLUIDSYNTH_LIBRARIES - List of libraries when using fluidsynth.
-# FLUIDSYNTH_FOUND - True if fluidsynth found.
-
-
-FIND_PATH(FLUIDSYNTH_INCLUDE_DIR fluidsynth.h)
-
-FIND_LIBRARY(FLUIDSYNTH_LIBRARIES NAMES fluidsynth )
-MARK_AS_ADVANCED( FLUIDSYNTH_LIBRARIES FLUIDSYNTH_INCLUDE_DIR )
-
-# handle the QUIETLY and REQUIRED arguments and set FLUIDSYNTH_FOUND to TRUE if
-# all listed variables are TRUE
-INCLUDE(FindPackageHandleStandardArgs)
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(FluidSynth
- REQUIRED_VARS FLUIDSYNTH_LIBRARIES FLUIDSYNTH_INCLUDE_DIR)
-
diff --git a/config.h.in b/config.h.in
index a7f7ccab..e654fc27 100644
--- a/config.h.in
+++ b/config.h.in
@@ -32,9 +32,6 @@
/* Define if we have ARM Neon CPU extensions */
#cmakedefine HAVE_NEON
-/* Define if we have FluidSynth support */
-#cmakedefine HAVE_FLUIDSYNTH
-
/* Define if we have the ALSA backend */
#cmakedefine HAVE_ALSA