mirror of https://github.com/bjornbytes/lovr.git
SoundData:setSample
This commit is contained in:
parent
f5fcb73324
commit
35ac33f184
|
@ -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 }
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue