aboutsummaryrefslogtreecommitdiffstats
path: root/OpenAL32/alSoundfont.c
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2014-01-13 00:20:14 -0800
committerChris Robinson <[email protected]>2014-01-13 00:20:14 -0800
commit0c80f62de7268cd102c45f7253e58479c4c78141 (patch)
tree758db947e1c19964b3e7b028742c1bbbe175e67e /OpenAL32/alSoundfont.c
parent6f3dac6f584245adc2a9fb360cc08459eb2f8a6b (diff)
Add a method to get soundfont samples
Diffstat (limited to 'OpenAL32/alSoundfont.c')
-rw-r--r--OpenAL32/alSoundfont.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/OpenAL32/alSoundfont.c b/OpenAL32/alSoundfont.c
index 17812610..355c5b41 100644
--- a/OpenAL32/alSoundfont.c
+++ b/OpenAL32/alSoundfont.c
@@ -176,6 +176,41 @@ done:
ALCcontext_DecRef(context);
}
+AL_API void AL_APIENTRY alGetSoundfontSamplesSOFT(ALuint id, ALsizei offset, ALsizei count, ALenum type, ALvoid *samples)
+{
+ ALCdevice *device;
+ ALCcontext *context;
+ ALsoundfont *sfont;
+
+ 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);
+ if(type != AL_SHORT_SOFT)
+ SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
+ if(offset < 0 || count <= 0)
+ SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
+
+ ReadLock(&sfont->Lock);
+ if(offset >= sfont->NumSamples || count > (sfont->NumSamples-offset))
+ alSetError(context, AL_INVALID_VALUE);
+ else if(sfont->Mapped)
+ alSetError(context, AL_INVALID_OPERATION);
+ else
+ {
+ /* TODO: Allow conversion. */
+ memcpy(samples, sfont->Samples + offset*sizeof(ALshort), count * sizeof(ALshort));
+ }
+ ReadUnlock(&sfont->Lock);
+
+done:
+ ALCcontext_DecRef(context);
+}
+
AL_API ALvoid* AL_APIENTRY alSoundfontMapSamplesSOFT(ALuint id, ALsizei offset, ALsizei length)
{
ALCdevice *device;