diff --git a/src/api/l_data_sound.c b/src/api/l_data_sound.c index 7a5e6ba2..261d8019 100644 --- a/src/api/l_data_sound.c +++ b/src/api/l_data_sound.c @@ -129,13 +129,13 @@ static int l_lovrSoundGetFrames(lua_State* L) { short* shorts = (short*) buffer; for (uint32_t i = 0; i < samples; i++) { lua_pushnumber(L, *shorts++); - lua_rawseti(L, index, dstOffset + frames + i); + lua_rawseti(L, index, dstOffset + (frames * channels) + i); } } else { float* floats = (float*) buffer; for (uint32_t i = 0; i < samples; i++) { lua_pushnumber(L, *floats++); - lua_rawseti(L, index, dstOffset + frames + i); + lua_rawseti(L, index, dstOffset + (frames * channels) + i); } } @@ -208,7 +208,7 @@ static int l_lovrSoundSetFrames(lua_State* L) { int length = luax_len(L, 2); uint32_t srcOffset = luaL_optinteger(L, 5, 1); uint32_t dstOffset = luaL_optinteger(L, 4, 0); - uint32_t limit = MIN(frameCount - dstOffset, length - srcOffset + 1); + 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"); @@ -221,14 +221,14 @@ static int l_lovrSoundSetFrames(lua_State* L) { if (format == SAMPLE_I16) { short* shorts = (short*) buffer; for (uint32_t i = 0; i < samples; i++) { - lua_rawgeti(L, 2, srcOffset + frames + i); + lua_rawgeti(L, 2, srcOffset + (frames * channels) + i); *shorts++ = lua_tointeger(L, -1); lua_pop(L, 1); } } else if (format == SAMPLE_F32) { float* floats = (float*) buffer; for (uint32_t i = 0; i < samples; i++) { - lua_rawgeti(L, 2, srcOffset + frames + i); + lua_rawgeti(L, 2, srcOffset + (frames * channels) + i); *floats++ = lua_tonumber(L, -1); lua_pop(L, 1); }