SoundData:setSample

This commit is contained in:
Nevyn Bengtsson 2020-12-10 14:23:35 +01:00 committed by Bjorn
parent f5fcb73324
commit 35ac33f184
3 changed files with 21 additions and 0 deletions

View File

@ -24,8 +24,17 @@ static int l_lovrSoundDataAppend(lua_State* L) {
return 1;
}
static int l_lovrSoundDataSetSample(lua_State* L) {
SoundData* soundData = luax_checktype(L, 1, SoundData);
int index = luaL_checkinteger(L, 2);
float value = luax_checkfloat(L, 3);
lovrSoundDataSetSample(soundData, index, value);
return 0;
}
const luaL_Reg lovrSoundData[] = {
{ "getBlob", l_lovrSoundDataGetBlob },
{ "append", l_lovrSoundDataAppend },
{ "setSample", l_lovrSoundDataSetSample },
{ NULL, NULL }
};

View File

@ -7,6 +7,7 @@
#include "audio/audio_internal.h"
#include <stdlib.h>
#include <string.h>
#include <limits.h>
static uint32_t lovrSoundDataReadRaw(SoundData* soundData, uint32_t offset, uint32_t count, void* data) {
uint8_t* p = soundData->blob->data;
@ -175,6 +176,16 @@ size_t lovrSoundDataStreamAppendSound(SoundData *dest, SoundData *src) {
return lovrSoundDataStreamAppendBlob(dest, src->blob);
}
void lovrSoundDataSetSample(SoundData* soundData, size_t index, float value) {
size_t byteIndex = index * bytesPerAudioFrame(soundData->channels, soundData->format);
lovrAssert(byteIndex < soundData->blob->size, "Sample index out of range");
switch (soundData->format) {
case SAMPLE_I16: ((int16_t*) soundData->blob->data)[index] = value * SHRT_MAX; break;
case SAMPLE_F32: ((float*) soundData->blob->data)[index] = value; break;
default: lovrThrow("Unsupported SoundData format %d\n", soundData->format); break;
}
}
bool lovrSoundDataIsStream(SoundData *soundData) {
return soundData->read == lovrSoundDataReadRing;
}

View File

@ -34,6 +34,7 @@ SoundData* lovrSoundDataCreateFromFile(struct Blob* blob, bool decode);
// returns the number of frames successfully appended (if it's less than the size of blob, the internal ring buffer is full)
size_t lovrSoundDataStreamAppendBlob(SoundData *dest, struct Blob* blob);
size_t lovrSoundDataStreamAppendSound(SoundData *dest, SoundData *src);
void lovrSoundDataSetSample(SoundData* soundData, size_t index, float value);
uint32_t lovrSoundDataGetDuration(SoundData *soundData);