static int l_soundfx_play(lua_State *L) { THSoundEffects *pEffects = luaT_testuserdata<THSoundEffects>(L); lua_settop(L, 5); lua_getfenv(L, 1); lua_pushliteral(L, "archive"); lua_rawget(L, 6); THSoundArchive *pArchive = (THSoundArchive*)lua_touserdata(L, 7); if(pArchive == NULL) { 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), luaL_checkint(L, 4), luaL_checkint(L, 5)); } lua_pushboolean(L, 1); return 1; }
static int l_soundarc_filename(lua_State *L) { THSoundArchive* pArchive = luaT_testuserdata<THSoundArchive>(L); size_t iIndex = l_soundarc_checkidx(L, 2, pArchive); if(iIndex == pArchive->getSoundCount()) return 2; lua_pushstring(L, pArchive->getSoundFilename(iIndex)); return 1; }
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_soundarc_sound_exists(lua_State *L) { THSoundArchive* pArchive = luaT_testuserdata<THSoundArchive>(L); size_t iIndex = l_soundarc_checkidx(L, 2, pArchive); if(iIndex == pArchive->getSoundCount()) lua_pushboolean(L, 0); else lua_pushboolean(L, 1); 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; }
static int l_soundarc_filedata(lua_State *L) { THSoundArchive* pArchive = luaT_testuserdata<THSoundArchive>(L); size_t iIndex = l_soundarc_checkidx(L, 2, pArchive); if(iIndex == pArchive->getSoundCount()) return 2; SDL_RWops *pRWops = pArchive->loadSound(iIndex); if(!pRWops) return 0; int iLength = SDL_RWseek(pRWops, 0, SEEK_END); SDL_RWseek(pRWops, 0, SEEK_SET); // There is a potential leak of pRWops if either of these Lua calls cause // a memory error, but it isn't very likely, and this a debugging function // anyway, so it isn't very important. void *pBuffer = lua_newuserdata(L, iLength); lua_pushlstring(L, (const char*)pBuffer, SDL_RWread(pRWops, pBuffer, 1, iLength)); SDL_RWclose(pRWops); return 1; }
static int l_soundarc_count(lua_State *L) { THSoundArchive* pArchive = luaT_testuserdata<THSoundArchive>(L); lua_pushnumber(L, (lua_Number)pArchive->getSoundCount()); return 1; }