diff options
author | Chris Robinson <[email protected]> | 2013-12-19 04:19:03 -0800 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2013-12-19 04:19:03 -0800 |
commit | 1bd828603e266db7b08a3ca5670e7cd2575357a4 (patch) | |
tree | ff2a51d273860211f513bb1a79a4b836d52e4316 | |
parent | 03a6bf22a52a4b1216f33dd2d9bddaa9f79e6a01 (diff) |
Add functions to set a soundfont's sample data
-rw-r--r-- | Alc/ALc.c | 3 | ||||
-rw-r--r-- | Alc/midi/base.c | 2 | ||||
-rw-r--r-- | OpenAL32/Include/alMain.h | 7 | ||||
-rw-r--r-- | OpenAL32/Include/alMidi.h | 2 | ||||
-rw-r--r-- | OpenAL32/alSoundfont.c | 81 |
5 files changed, 94 insertions, 1 deletions
@@ -284,6 +284,9 @@ static const ALCfunction alcFunctions[] = { DECL(alGenSoundfontsSOFT), DECL(alDeleteSoundfontsSOFT), DECL(alIsSoundfontSOFT), + DECL(alSoundfontSamplesSOFT), + DECL(alSoundfontMapSamplesSOFT), + DECL(alSoundfontUnmapSamplesSOFT), DECL(alGenPresetsSOFT), DECL(alDeletePresetsSOFT), DECL(alIsPresetSOFT), diff --git a/Alc/midi/base.c b/Alc/midi/base.c index 46d4bd76..f39aaba3 100644 --- a/Alc/midi/base.c +++ b/Alc/midi/base.c @@ -429,6 +429,8 @@ void ALsoundfont_Construct(ALsoundfont *self) self->Samples = NULL; self->NumSamples = 0; + self->Mapped = AL_FALSE; + self->id = 0; } diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h index ce229c73..039807de 100644 --- a/OpenAL32/Include/alMain.h +++ b/OpenAL32/Include/alMain.h @@ -41,6 +41,9 @@ 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*LPALSOUNDFONTSAMPLESSOFT)(ALuint sfid, ALenum type, ALsizei count, const ALvoid *samples); +typedef ALvoid* (AL_APIENTRY*LPALSOUNDFONTMAPSAMPLESSOFT)(ALuint sfid, ALsizei offset, ALsizei length); +typedef void (AL_APIENTRY*LPALSOUNDFONTUNMAPSAMPLESSOFT)(ALuint sfid); 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); @@ -61,6 +64,10 @@ typedef void (AL_APIENTRY*LPALGETINTEGER64VSOFT)(ALenum pname, ALint64SOFT *valu 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 ALvoid AL_APIENTRY alSoundfontSamplesSOFT(ALuint sfid, ALenum type, ALsizei count, const ALvoid *samples); +AL_API ALvoid* AL_APIENTRY alSoundfontMapSamplesSOFT(ALuint sfid, ALsizei offset, ALsizei length); +AL_API ALvoid AL_APIENTRY alSoundfontUnmapSamplesSOFT(ALuint sfid); + 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); diff --git a/OpenAL32/Include/alMidi.h b/OpenAL32/Include/alMidi.h index b6835649..70a2120d 100644 --- a/OpenAL32/Include/alMidi.h +++ b/OpenAL32/Include/alMidi.h @@ -117,6 +117,8 @@ typedef struct ALsoundfont { ALshort *Samples; ALint NumSamples; + volatile ALenum Mapped; + ALuint id; } ALsoundfont; diff --git a/OpenAL32/alSoundfont.c b/OpenAL32/alSoundfont.c index 393df682..7b9d7d0a 100644 --- a/OpenAL32/alSoundfont.c +++ b/OpenAL32/alSoundfont.c @@ -83,7 +83,7 @@ AL_API ALvoid AL_APIENTRY alDeleteSoundfontsSOFT(ALsizei n, const ALuint *ids) /* Check for valid soundfont ID */ if((sfont=LookupSfont(device, ids[i])) == NULL) SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); - if(sfont->ref != 0) + if(sfont->Mapped != AL_FALSE || sfont->ref != 0) SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done); } @@ -119,6 +119,85 @@ AL_API ALboolean AL_APIENTRY alIsSoundfontSOFT(ALuint id) return ret; } +AL_API ALvoid AL_APIENTRY alSoundfontSamplesSOFT(ALuint sfid, ALenum type, ALsizei count, const ALvoid *samples) +{ + ALCdevice *device; + ALCcontext *context; + ALsoundfont *sfont; + + context = GetContextRef(); + if(!context) return; + + device = context->Device; + if(!(sfont=LookupSfont(device, sfid))) + SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); + if(type != AL_SHORT_SOFT) + SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + if(count <= 0) + SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + + // TODO: Lock and check ref count + { + void *temp = realloc(sfont->Samples, count * sizeof(ALshort)); + if(!temp) + SET_ERROR_AND_GOTO(context, AL_OUT_OF_MEMORY, done); + sfont->Samples = temp; + sfont->NumSamples = count; + if(samples) + memcpy(sfont->Samples, samples, count * sizeof(ALshort)); + } + +done: + ALCcontext_DecRef(context); +} + +AL_API ALvoid* AL_APIENTRY alSoundfontMapSamplesSOFT(ALuint sfid, ALsizei offset, ALsizei length) +{ + ALCdevice *device; + ALCcontext *context; + ALsoundfont *sfont; + ALvoid *ptr = NULL; + + context = GetContextRef(); + if(!context) return NULL; + + device = context->Device; + if(!(sfont=LookupSfont(device, sfid))) + SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); + if(offset < 0 || (ALuint)offset > sfont->NumSamples*sizeof(ALshort)) + SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + if(length <= 0 || (ALuint)length > (sfont->NumSamples*sizeof(ALshort) - offset)) + SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done); + if(ExchangeInt(&sfont->Mapped, AL_TRUE) == AL_TRUE) + SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done); + + ptr = (ALbyte*)sfont->Samples + offset; + +done: + ALCcontext_DecRef(context); + + return ptr; +} + +AL_API ALvoid AL_APIENTRY alSoundfontUnmapSamplesSOFT(ALuint sfid) +{ + ALCdevice *device; + ALCcontext *context; + ALsoundfont *sfont; + + context = GetContextRef(); + if(!context) return; + + device = context->Device; + if(!(sfont=LookupSfont(device, sfid))) + SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done); + if(ExchangeInt(&sfont->Mapped, AL_FALSE) == AL_FALSE) + SET_ERROR_AND_GOTO(context, AL_INVALID_OPERATION, done); + +done: + ALCcontext_DecRef(context); +} + /* ReleaseALSoundfonts * |