diff --git a/src/audio/AL/ALAudio.cpp b/src/audio/AL/ALAudio.cpp index d9e2c402..19998c0f 100644 --- a/src/audio/AL/ALAudio.cpp +++ b/src/audio/AL/ALAudio.cpp @@ -25,7 +25,10 @@ Speaker* ALSound::newInstance(int priority, int channel) const { return nullptr; } AL_CHECK(alSourcei(source, AL_BUFFER, buffer)); - return new ALSpeaker(al, source, priority, channel); + + auto speaker = new ALSpeaker(al, source, priority, channel); + speaker->duration = duration; + return speaker; } ALStream::ALStream(ALAudio* al, std::shared_ptr source, bool keepSource) @@ -77,6 +80,11 @@ void ALStream::bindSpeaker(speakerid_t speaker) { sp->stop(); } this->speaker = speaker; + sp = audio::get_speaker(speaker); + if (sp) { + auto alspeaker = dynamic_cast(sp); + alspeaker->duration = source->getTotalDuration(); + } } speakerid_t ALStream::getSpeaker() const { @@ -207,6 +215,10 @@ duration_t ALSpeaker::getTime() const { return static_cast(AL::getSourcef(source, AL_SEC_OFFSET)); } +duration_t ALSpeaker::getDuration() const { + return duration; +} + void ALSpeaker::setTime(duration_t time) { AL_CHECK(alSourcef(source, AL_SEC_OFFSET, static_cast(time))); } diff --git a/src/audio/AL/ALAudio.h b/src/audio/AL/ALAudio.h index 4ba42bd2..94a1e3ba 100644 --- a/src/audio/AL/ALAudio.h +++ b/src/audio/AL/ALAudio.h @@ -79,6 +79,7 @@ namespace audio { bool stopped = true; bool paused = false; uint source; + duration_t duration = 0.0f; ALSpeaker(ALAudio* al, uint source, int priority, int channel); ~ALSpeaker(); @@ -102,6 +103,7 @@ namespace audio { void stop() override; duration_t getTime() const override; + duration_t getDuration() const override; void setTime(duration_t time) override; void setPosition(glm::vec3 pos) override; diff --git a/src/audio/audio.h b/src/audio/audio.h index 1e1e6c0e..67358173 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -269,6 +269,9 @@ namespace audio { /// @return time position in seconds virtual duration_t getTime() const = 0; + /// @brief Get playing audio total duration + virtual duration_t getDuration() const = 0; + /// @brief Set playing audio time position /// @param time time position in seconds virtual void setTime(duration_t time) = 0; diff --git a/src/logic/scripting/lua/libaudio.cpp b/src/logic/scripting/lua/libaudio.cpp index da55ce55..45fcd99f 100644 --- a/src/logic/scripting/lua/libaudio.cpp +++ b/src/logic/scripting/lua/libaudio.cpp @@ -355,6 +355,18 @@ static int l_audio_get_time(lua_State* L) { 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); @@ -399,6 +411,7 @@ const luaL_Reg audiolib [] = { {"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}, {NULL, NULL}