#include "api_lua.h" #include "lua_commons.h" #include "lua_util.h" #include "../../../audio/audio.h" #include "../../../engine.h" #include "../scripting.h" inline const char* DEFAULT_CHANNEL = "regular"; inline int extract_channel_index(lua_State* L, int idx) { const char* channel = DEFAULT_CHANNEL; if (!lua_isnoneornil(L, idx)) { channel = lua_tostring(L, idx); } int index = audio::get_channel_index(channel); if (index == 0) { return -1; } return index; } inline audio::speakerid_t play_sound( const char* name, bool relative, lua::luanumber x, lua::luanumber y, lua::luanumber z, lua::luanumber volume, lua::luanumber pitch, bool loop, int channel ) { if (channel == -1) return 0; auto assets = scripting::engine->getAssets(); auto sound = assets->getSound(name); if (sound == nullptr) { return 0; } return audio::play( sound, glm::vec3( static_cast(x), static_cast(y), static_cast(z) ), relative, volume, pitch, false, audio::PRIORITY_NORMAL, channel ); } inline audio::speakerid_t play_stream( const char* filename, bool relative, lua::luanumber x, lua::luanumber y, lua::luanumber z, lua::luanumber volume, lua::luanumber pitch, bool loop, int channel ) { if (channel == -1) return 0; auto paths = scripting::engine->getResPaths(); fs::path file = paths->find(filename); return audio::play_stream( file, glm::vec3( static_cast(x), static_cast(y), static_cast(z) ), relative, volume, pitch, loop, channel ); } /// @brief audio.play_stream( /// name: string, /// x: number, /// y: number, /// z: number, /// volume: number, /// pitch: number, /// channel: string = "regular", /// loop: bool = false) static int l_audio_play_stream(lua_State* L) { lua_pushinteger(L, static_cast( play_stream( lua_tostring(L, 1), false, lua_tonumber(L, 2), lua_tonumber(L, 3), lua_tonumber(L, 4), lua_tonumber(L, 5), lua_tonumber(L, 6), lua_toboolean(L, 8), extract_channel_index(L, 7) ) )); return 1; } /// @brief audio.play_stream_2d( /// name: string, /// volume: number, /// pitch: number, /// channel: string = "regular", /// loop: bool = false) static int l_audio_play_stream_2d(lua_State* L) { lua_pushinteger(L, static_cast( play_stream( lua_tostring(L, 1), true, 0.0, 0.0, 0.0, lua_tonumber(L, 2), lua_tonumber(L, 3), lua_toboolean(L, 5), extract_channel_index(L, 4) ) )); return 1; } /// @brief audio.play_sound( /// name: string, /// x: number, /// y: number, /// z: number, /// volume: number, /// pitch: number, /// channel: string = "regular", /// loop: bool = false) static int l_audio_play_sound(lua_State* L) { lua_pushinteger(L, static_cast( play_sound( lua_tostring(L, 1), false, lua_tonumber(L, 2), lua_tonumber(L, 3), lua_tonumber(L, 4), lua_tonumber(L, 5), lua_tonumber(L, 6), lua_toboolean(L, 8), extract_channel_index(L, 7) ) )); return 1; } /// @brief audio.play_sound_2d( /// name: string, /// volume: number, /// pitch: number, /// channel: string = "regular", /// loop: bool = false) static int l_audio_play_sound_2d(lua_State* L) { lua_pushinteger(L, static_cast( play_sound( lua_tostring(L, 1), true, 0.0, 0.0, 0.0, lua_tonumber(L, 2), lua_tonumber(L, 3), lua_toboolean(L, 5), extract_channel_index(L, 4) ) )); return 1; } /// @brief audio.stop(speakerid: integer) -> nil static int l_audio_stop(lua_State* L) { lua::luaint id = lua_tonumber(L, 1); auto speaker = audio::get_speaker(id); if (speaker != nullptr) { speaker->stop(); } return 0; } /// @brief audio.pause(speakerid: integer) -> nil static int l_audio_pause(lua_State* L) { lua::luaint id = lua_tonumber(L, 1); auto speaker = audio::get_speaker(id); if (speaker != nullptr) { speaker->pause(); } return 0; } /// @brief audio.resume(speakerid: integer) -> nil static int l_audio_resume(lua_State* L) { lua::luaint id = lua_tonumber(L, 1); auto speaker = audio::get_speaker(id); if (speaker != nullptr && speaker->isPaused()) { speaker->play(); } return 0; } /// @brief audio.set_loop(speakerid: integer, value: bool) -> nil static int l_audio_set_loop(lua_State* L) { lua::luaint id = lua_tonumber(L, 1); auto speaker = audio::get_speaker(id); if (speaker != nullptr) { bool value = lua_toboolean(L, 2); speaker->setLoop(value); } return 0; } /// @brief audio.set_volume(speakerid: integer, value: number) -> nil static int l_audio_set_volume(lua_State* L) { lua::luaint id = lua_tonumber(L, 1); auto speaker = audio::get_speaker(id); if (speaker != nullptr) { lua::luanumber value = lua_tonumber(L, 2); speaker->setVolume(static_cast(value)); } return 0; } /// @brief audio.set_pitch(speakerid: integer, value: number) -> nil static int l_audio_set_pitch(lua_State* L) { lua::luaint id = lua_tonumber(L, 1); auto speaker = audio::get_speaker(id); if (speaker != nullptr) { lua::luanumber value = lua_tonumber(L, 2); speaker->setPitch(static_cast(value)); } return 0; } /// @brief audio.set_time(speakerid: integer, value: number) -> nil static int l_audio_set_time(lua_State* L) { lua::luaint id = lua_tonumber(L, 1); auto speaker = audio::get_speaker(id); if (speaker != nullptr) { lua::luanumber value = lua_tonumber(L, 2); speaker->setTime(static_cast(value)); } return 0; } /// @brief audio.set_position(speakerid: integer, x: number, y: number, z: number) -> nil static int l_audio_set_position(lua_State* L) { lua::luaint id = lua_tonumber(L, 1); auto speaker = audio::get_speaker(id); if (speaker != nullptr) { lua::luanumber x = lua_tonumber(L, 2); lua::luanumber y = lua_tonumber(L, 3); lua::luanumber z = lua_tonumber(L, 4); speaker->setPosition(glm::vec3( static_cast(x), static_cast(y), static_cast(z) )); } return 0; } /// @brief audio.set_velocity(speakerid: integer, x: number, y: number, z: number) -> nil static int l_audio_set_velocity(lua_State* L) { lua::luaint id = lua_tonumber(L, 1); auto speaker = audio::get_speaker(id); if (speaker != nullptr) { lua::luanumber x = lua_tonumber(L, 2); lua::luanumber y = lua_tonumber(L, 3); lua::luanumber z = lua_tonumber(L, 4); speaker->setVelocity(glm::vec3( static_cast(x), static_cast(y), static_cast(z) )); } return 0; } /// @brief audio.is_playing(speakerid: integer) -> bool static int l_audio_is_playing(lua_State* L) { lua::luaint id = lua_tonumber(L, 1); auto speaker = audio::get_speaker(id); if (speaker != nullptr) { lua_pushboolean(L, speaker->isPlaying()); return 1; } lua_pushboolean(L, false); return 1; } /// @brief audio.is_paused(speakerid: integer) -> bool static int l_audio_is_paused(lua_State* L) { lua::luaint id = lua_tonumber(L, 1); auto speaker = audio::get_speaker(id); if (speaker != nullptr) { lua_pushboolean(L, speaker->isPaused()); return 1; } lua_pushboolean(L, false); return 1; } /// @brief audio.is_loop(speakerid: integer) -> bool static int l_audio_is_loop(lua_State* L) { lua::luaint id = lua_tonumber(L, 1); auto speaker = audio::get_speaker(id); if (speaker != nullptr) { lua_pushboolean(L, speaker->isLoop()); return 1; } lua_pushboolean(L, false); return 1; } /// @brief audio.get_volume(speakerid: integer) -> number static int l_audio_get_volume(lua_State* L) { lua::luaint id = lua_tonumber(L, 1); auto speaker = audio::get_speaker(id); if (speaker != nullptr) { lua_pushnumber(L, speaker->getVolume()); return 1; } lua_pushnumber(L, 0.0); return 1; } /// @brief audio.get_pitch(speakerid: integer) -> number static int l_audio_get_pitch(lua_State* L) { lua::luaint id = lua_tonumber(L, 1); auto speaker = audio::get_speaker(id); if (speaker != nullptr) { lua_pushnumber(L, speaker->getPitch()); return 1; } lua_pushnumber(L, 1.0); return 1; } /// @brief audio.get_time(speakerid: integer) -> number static int l_audio_get_time(lua_State* L) { lua::luaint id = lua_tonumber(L, 1); auto speaker = audio::get_speaker(id); if (speaker != nullptr) { lua_pushnumber(L, speaker->getTime()); return 1; } lua_pushnumber(L, 0.0); return 1; } /// @brief audio.get_duration(speakerid: integer) -> number static int l_audio_get_duration(lua_State* L) { lua::luaint id = lua_tonumber(L, 1); auto speaker = audio::get_speaker(id); if (speaker != nullptr) { lua_pushnumber(L, speaker->getDuration()); return 1; } lua_pushnumber(L, 0.0); return 1; } /// @brief audio.get_position(speakerid: integer) -> number, number, number static int l_audio_get_position(lua_State* L) { lua::luaint id = lua_tonumber(L, 1); auto speaker = audio::get_speaker(id); if (speaker != nullptr) { auto vec = speaker->getPosition(); lua::pushvec3(L, vec); return 1; } return 0; } /// @brief audio.get_velocity(speakerid: integer) -> number, number, number static int l_audio_get_velocity(lua_State* L) { lua::luaint id = lua_tonumber(L, 1); auto speaker = audio::get_speaker(id); if (speaker != nullptr) { auto vec = speaker->getVelocity(); lua::pushvec3(L, vec); return 1; } return 0; } // @brief audio.count_speakers() -> integer static int l_audio_count_speakers(lua_State* L) { lua_pushinteger(L, audio::count_speakers()); return 1; } // @brief audio.count_streams() -> integer static int l_audio_count_streams(lua_State* L) { lua_pushinteger(L, audio::count_streams()); return 1; } const luaL_Reg audiolib [] = { {"play_sound", lua_wrap_errors}, {"play_sound_2d", lua_wrap_errors}, {"play_stream", lua_wrap_errors}, {"play_stream_2d", lua_wrap_errors}, {"stop", lua_wrap_errors}, {"pause", lua_wrap_errors}, {"resume", lua_wrap_errors}, {"set_loop", lua_wrap_errors}, {"set_volume", lua_wrap_errors}, {"set_pitch", lua_wrap_errors}, {"set_time", lua_wrap_errors}, {"set_position", lua_wrap_errors}, {"set_velocity", lua_wrap_errors}, {"is_playing", lua_wrap_errors}, {"is_paused", lua_wrap_errors}, {"is_loop", lua_wrap_errors}, {"get_volume", lua_wrap_errors}, {"get_pitch", lua_wrap_errors}, {"get_time", lua_wrap_errors}, {"get_duration", lua_wrap_errors}, {"get_position", lua_wrap_errors}, {"get_velocity", lua_wrap_errors}, {"count_speakers", lua_wrap_errors}, {"count_streams", lua_wrap_errors}, {NULL, NULL} };