#include "audio/audio.hpp" #include "assets/Assets.hpp" #include "engine/Engine.hpp" #include "api_lua.hpp" 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::Number x, lua::Number y, lua::Number z, lua::Number volume, lua::Number pitch, bool loop, int channel ) { if (channel == -1) { return 0; } auto assets = scripting::engine->getAssets(); if (assets == nullptr) { return 0; } auto sound = assets->get(name); if (sound == nullptr) { return 0; } return audio::play( sound, glm::vec3( static_cast(x), static_cast(y), static_cast(z) ), relative, volume, pitch, loop, audio::PRIORITY_NORMAL, channel ); } inline audio::speakerid_t play_stream( const char* filename, bool relative, lua::Number x, lua::Number y, lua::Number z, lua::Number volume, lua::Number pitch, bool loop, int channel ) { if (channel == -1) { return 0; } io::path file; if (std::strchr(filename, ':')) { file = std::string(filename); } else { const auto& paths = scripting::engine->getResPaths(); 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) { return 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) )) ); } /// @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) { return 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) )) ); } /// @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) { return 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) )) ); } /// @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) { return 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) )) ); } /// @brief audio.stop(speakerid: integer) -> nil static int l_audio_stop(lua::State* L) { auto speaker = audio::get_speaker(lua::tointeger(L, 1)); if (speaker != nullptr) { speaker->stop(); } return 0; } /// @brief audio.pause(speakerid: integer) -> nil static int l_audio_pause(lua::State* L) { auto speaker = audio::get_speaker(lua::tointeger(L, 1)); if (speaker != nullptr) { speaker->pause(); } return 0; } /// @brief audio.resume(speakerid: integer) -> nil static int l_audio_resume(lua::State* L) { auto speaker = audio::get_speaker(lua::tointeger(L, 1)); 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) { auto speaker = audio::get_speaker(lua::tointeger(L, 1)); if (speaker != nullptr) { speaker->setLoop(lua::toboolean(L, 2)); } return 0; } /// @brief audio.set_volume(speakerid: integer, value: number) -> nil static int l_audio_set_volume(lua::State* L) { auto speaker = audio::get_speaker(lua::tointeger(L, 1)); if (speaker != nullptr) { speaker->setVolume(static_cast(lua::tonumber(L, 2))); } return 0; } /// @brief audio.set_pitch(speakerid: integer, value: number) -> nil static int l_audio_set_pitch(lua::State* L) { auto speaker = audio::get_speaker(lua::tointeger(L, 1)); if (speaker != nullptr) { speaker->setPitch(static_cast(lua::tonumber(L, 2))); } return 0; } /// @brief audio.set_time(speakerid: integer, value: number) -> nil static int l_audio_set_time(lua::State* L) { auto speaker = audio::get_speaker(lua::tointeger(L, 1)); if (speaker != nullptr) { speaker->setTime(static_cast(lua::tonumber(L, 2))); } return 0; } /// @brief audio.set_position(speakerid: integer, x: number, y: number, z: /// number) -> nil static int l_audio_set_position(lua::State* L) { auto speaker = audio::get_speaker(lua::tointeger(L, 1)); if (speaker != nullptr) { auto x = lua::tonumber(L, 2); auto y = lua::tonumber(L, 3); auto 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) { auto speaker = audio::get_speaker(lua::tointeger(L, 1)); if (speaker != nullptr) { auto x = lua::tonumber(L, 2); auto y = lua::tonumber(L, 3); auto 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) { auto speaker = audio::get_speaker(lua::tointeger(L, 1)); if (speaker != nullptr) { return lua::pushboolean(L, speaker->isPlaying()); } return lua::pushboolean(L, false); } /// @brief audio.is_paused(speakerid: integer) -> bool static int l_audio_is_paused(lua::State* L) { auto speaker = audio::get_speaker(lua::tointeger(L, 1)); if (speaker != nullptr) { return lua::pushboolean(L, speaker->isPaused()); } return lua::pushboolean(L, false); } /// @brief audio.is_loop(speakerid: integer) -> bool static int l_audio_is_loop(lua::State* L) { auto speaker = audio::get_speaker(lua::tointeger(L, 1)); if (speaker != nullptr) { return lua::pushboolean(L, speaker->isLoop()); } return lua::pushboolean(L, false); } /// @brief audio.get_volume(speakerid: integer) -> number static int l_audio_get_volume(lua::State* L) { auto speaker = audio::get_speaker(lua::tointeger(L, 1)); if (speaker != nullptr) { return lua::pushnumber(L, speaker->getVolume()); } return lua::pushnumber(L, 0.0); } /// @brief audio.get_pitch(speakerid: integer) -> number static int l_audio_get_pitch(lua::State* L) { auto speaker = audio::get_speaker(lua::tointeger(L, 1)); if (speaker != nullptr) { return lua::pushnumber(L, speaker->getPitch()); } return lua::pushnumber(L, 1.0); } /// @brief audio.get_time(speakerid: integer) -> number static int l_audio_get_time(lua::State* L) { auto speaker = audio::get_speaker(lua::tointeger(L, 1)); if (speaker != nullptr) { return lua::pushnumber(L, speaker->getTime()); } return lua::pushnumber(L, 0.0); } /// @brief audio.get_duration(speakerid: integer) -> number static int l_audio_get_duration(lua::State* L) { auto speaker = audio::get_speaker(lua::tointeger(L, 1)); if (speaker != nullptr) { return lua::pushnumber(L, speaker->getDuration()); } return lua::pushnumber(L, 0.0); } /// @brief audio.get_position(speakerid: integer) -> number, number, number static int l_audio_get_position(lua::State* L) { auto speaker = audio::get_speaker(lua::tointeger(L, 1)); if (speaker != nullptr) { return lua::pushvec_stack(L, speaker->getPosition()); } return 0; } /// @brief audio.get_velocity(speakerid: integer) -> number, number, number static int l_audio_get_velocity(lua::State* L) { auto speaker = audio::get_speaker(lua::tointeger(L, 1)); if (speaker != nullptr) { return lua::pushvec_stack(L, speaker->getVelocity()); } return 0; } // @brief audio.count_speakers() -> integer static int l_audio_count_speakers(lua::State* L) { return lua::pushinteger(L, audio::count_speakers()); } // @brief audio.count_streams() -> integer static int l_audio_count_streams(lua::State* L) { return lua::pushinteger(L, audio::count_streams()); } const luaL_Reg audiolib[] = { {"play_sound", lua::wrap}, {"play_sound_2d", lua::wrap}, {"play_stream", lua::wrap}, {"play_stream_2d", lua::wrap}, {"stop", lua::wrap}, {"pause", lua::wrap}, {"resume", lua::wrap}, {"set_loop", lua::wrap}, {"set_volume", lua::wrap}, {"set_pitch", lua::wrap}, {"set_time", lua::wrap}, {"set_position", lua::wrap}, {"set_velocity", lua::wrap}, {"is_playing", lua::wrap}, {"is_paused", lua::wrap}, {"is_loop", lua::wrap}, {"get_volume", lua::wrap}, {"get_pitch", lua::wrap}, {"get_time", lua::wrap}, {"get_duration", lua::wrap}, {"get_position", lua::wrap}, {"get_velocity", lua::wrap}, {"count_speakers", lua::wrap}, {"count_streams", lua::wrap}, {NULL, NULL}};