Sound:setFrames should use a stream's write buffer size, not read buffer size

otherwise you can never fill up a stream from scratch
This commit is contained in:
Nevyn Bengtsson 2021-04-15 18:22:47 +02:00 committed by Bjorn
parent 9f45e7a9c5
commit 6566423f66
3 changed files with 8 additions and 3 deletions

View File

@ -166,7 +166,7 @@ static int l_lovrSoundSetFrames(lua_State* L) {
Sound* sound = luax_checktype(L, 1, Sound);
size_t stride = lovrSoundGetStride(sound);
SampleFormat format = lovrSoundGetFormat(sound);
uint32_t frameCount = lovrSoundGetFrameCount(sound);
uint32_t frameCount = lovrSoundGetCapacity(sound);
uint32_t channels = lovrSoundGetChannelCount(sound);
if (lua_isuserdata(L, 2)) {
@ -186,7 +186,7 @@ static int l_lovrSoundSetFrames(lua_State* L) {
if (other) {
uint32_t srcOffset = luaL_optinteger(L, 5, 0);
uint32_t dstOffset = luaL_optinteger(L, 4, 0);
uint32_t count = luaL_optinteger(L, 3, lovrSoundGetFrameCount(other) - srcOffset);
uint32_t count = luaL_optinteger(L, 3, lovrSoundGetCapacity(other) - srcOffset);
uint32_t frames = lovrSoundCopy(other, sound, count, srcOffset, dstOffset);
lua_pushinteger(L, frames);
return 1;
@ -202,7 +202,7 @@ static int l_lovrSoundSetFrames(lua_State* L) {
uint32_t dstOffset = luaL_optinteger(L, 4, 0);
uint32_t limit = MIN(frameCount - dstOffset, (length - srcOffset) / channels + 1);
uint32_t count = luaL_optinteger(L, 3, limit);
lovrAssert(count <= limit, "Tried to write too many frames");
lovrAssert(count <= limit, "Tried to write too many frames (%d is over limit %d)", count, limit);
uint32_t frames = 0;
while (frames < count) {

View File

@ -367,6 +367,10 @@ uint32_t lovrSoundGetFrameCount(Sound* sound) {
return sound->stream ? ma_pcm_rb_available_read(sound->stream) : sound->frames;
}
uint32_t lovrSoundGetCapacity(Sound* sound) {
return sound->stream ? ma_pcm_rb_available_write(sound->stream) : sound->frames;
}
size_t lovrSoundGetStride(Sound* sound) {
return lovrSoundGetChannelCount(sound) * (sound->format == SAMPLE_I16 ? sizeof(short) : sizeof(float));
}

View File

@ -36,6 +36,7 @@ ChannelLayout lovrSoundGetChannelLayout(Sound* sound);
uint32_t lovrSoundGetChannelCount(Sound* sound);
uint32_t lovrSoundGetSampleRate(Sound* sound);
uint32_t lovrSoundGetFrameCount(Sound* sound);
uint32_t lovrSoundGetCapacity(Sound* sound);
size_t lovrSoundGetStride(Sound* sound);
bool lovrSoundIsCompressed(Sound* sound);
bool lovrSoundIsStream(Sound* sound);