diff --git a/src/api.h b/src/api.h index aba90d88..237525ac 100644 --- a/src/api.h +++ b/src/api.h @@ -18,6 +18,7 @@ int l_lovrTimerInit(lua_State* L); extern const luaL_Reg lovrAnimator[]; extern const luaL_Reg lovrAudio[]; +extern const luaL_Reg lovrAudioStream[]; extern const luaL_Reg lovrBallJoint[]; extern const luaL_Reg lovrBlob[]; extern const luaL_Reg lovrBoxShape[]; diff --git a/src/api/data.c b/src/api/data.c index 2fcaec8e..230bafc6 100644 --- a/src/api/data.c +++ b/src/api/data.c @@ -1,10 +1,13 @@ #include "api.h" #include "data/data.h" +#include "data/texture.h" +#include "data/audioStream.h" int l_lovrDataInit(lua_State* L) { lua_newtable(L); luaL_register(L, NULL, lovrData); luax_registertype(L, "TextureData", lovrTextureData); + luax_registertype(L, "AudioStream", lovrAudioStream); return 1; } @@ -17,7 +20,18 @@ int l_lovrDataNewTextureData(lua_State* L) { return 1; } +int l_lovrDataNewAudioStream(lua_State* L) { + Blob* blob = luax_readblob(L, 1, "Sound"); + size_t bufferSize = luaL_optinteger(L, 2, 4096); + AudioStream* stream = lovrAudioStreamCreate(blob, bufferSize); + lovrRelease(&blob->ref); + lovrRelease(&stream->ref); + luax_pushtype(L, AudioStream, stream); + return 1; +} + const luaL_Reg lovrData[] = { + { "newAudioStream", l_lovrDataNewAudioStream }, { "newTextureData", l_lovrDataNewTextureData }, { NULL, NULL } }; diff --git a/src/api/types/audioStream.c b/src/api/types/audioStream.c new file mode 100644 index 00000000..3db4c60a --- /dev/null +++ b/src/api/types/audioStream.c @@ -0,0 +1,42 @@ +#include "api.h" +#include "data/audioStream.h" + +int l_lovrAudioStreamGetBitDepth(lua_State* L) { + AudioStream* stream = luax_checktype(L, 1, AudioStream); + lua_pushinteger(L, stream->bitDepth); + return 1; +} + +int l_lovrAudioStreamGetChannelCount(lua_State* L) { + AudioStream* stream = luax_checktype(L, 1, AudioStream); + lua_pushinteger(L, stream->channelCount); + return 1; +} + +int l_lovrAudioStreamGetDuration(lua_State* L) { + AudioStream* stream = luax_checktype(L, 1, AudioStream); + lua_pushnumber(L, (float) stream->samples / stream->sampleRate); + return 1; +} + +int l_lovrAudioStreamGetSampleRate(lua_State* L) { + AudioStream* stream = luax_checktype(L, 1, AudioStream); + lua_pushinteger(L, stream->sampleRate); + return 1; +} + +int l_lovrAudioStreamSeek(lua_State* L) { + AudioStream* stream = luax_checktype(L, 1, AudioStream); + float seconds = luaL_checknumber(L, 2); + lovrAudioStreamSeek(stream, (int) (seconds * stream->sampleRate + .5)); + return 0; +} + +const luaL_Reg lovrAudioStream[] = { + { "getBitDepth", l_lovrAudioStreamGetBitDepth }, + { "getChannelCount", l_lovrAudioStreamGetChannelCount }, + { "getDuration", l_lovrAudioStreamGetDuration }, + { "getSampleRate", l_lovrAudioStreamGetSampleRate }, + { "seek", l_lovrAudioStreamSeek }, + { NULL, NULL } +};