static int l_soundarc_duration(lua_State *L) { THSoundArchive* pArchive = luaT_testuserdata<THSoundArchive>(L); size_t iIndex = l_soundarc_checkidx(L, 2, pArchive); if(iIndex == pArchive->getSoundCount()) return 2; size_t iDuration = pArchive->getSoundDuration(iIndex); lua_pushnumber(L, static_cast<lua_Number>(iDuration) / static_cast<lua_Number>(1000)); return 1; }
static int l_soundfx_play(lua_State *L) { THSoundEffects *pEffects = luaT_testuserdata<THSoundEffects>(L); lua_settop(L, 7); lua_getfenv(L, 1); lua_pushliteral(L, "archive"); lua_rawget(L,8); THSoundArchive *pArchive = (THSoundArchive*)lua_touserdata(L, 9); if(pArchive == nullptr) { return 0; } // l_soundarc_checkidx requires the archive at the bottom of the stack lua_replace(L, 1); size_t iIndex = l_soundarc_checkidx(L, 2, pArchive); if(iIndex == pArchive->getSoundCount()) return 2; if(lua_isnil(L, 4)) { pEffects->playSound(iIndex, luaL_checknumber(L, 3)); } else { pEffects->playSoundAt(iIndex, luaL_checknumber(L, 3), static_cast<int>(luaL_checkinteger(L, 4)), static_cast<int>(luaL_checkinteger(L, 5))); } //SDL SOUND_OVER Callback Timer: //6: unusedPlayedCallbackID if(!lua_isnil(L, 6)) { //7: Callback delay int iPlayedCallbackDelay = 0; //ms if(!lua_isnil(L, 7)) iPlayedCallbackDelay = static_cast<int>(luaL_checknumber(L, 7)); if(m_iPlayedSoundCallbackIDsPointer == sizeof(m_a_iPlayedSoundCallbackIDs)) m_iPlayedSoundCallbackIDsPointer = 0; m_a_iPlayedSoundCallbackIDs[m_iPlayedSoundCallbackIDsPointer] = static_cast<int>(luaL_checkinteger(L, 6)); size_t interval = pArchive->getSoundDuration(iIndex) + iPlayedCallbackDelay; SDL_TimerID timersID = SDL_AddTimer(static_cast<Uint32>(interval), played_sound_callback, &(m_a_iPlayedSoundCallbackIDs[m_iPlayedSoundCallbackIDsPointer])); m_mapSoundTimers.insert(std::pair<int, SDL_TimerID>(m_a_iPlayedSoundCallbackIDs[m_iPlayedSoundCallbackIDsPointer], timersID)); m_iPlayedSoundCallbackIDsPointer++; } lua_pushboolean(L, 1); return 1; }