Start adding an audio scripting API, and also fix a deadlock in sfx_manager due to improper release of locks

This commit is contained in:
Marianne Gagnon 2015-06-21 18:31:16 -04:00
parent 789384a7bf
commit 90cf3176d1
4 changed files with 92 additions and 4 deletions

View File

@ -939,7 +939,7 @@ SFXBase* SFXManager::quickSound(const std::string &sound_type)
{
if (!sfxAllowed()) return NULL;
m_quick_sounds.lock();
MutexLockerHelper lock(m_quick_sounds);
std::map<std::string, SFXBase*>::iterator sound =
m_quick_sounds.getData().find(sound_type);
@ -950,14 +950,12 @@ SFXBase* SFXManager::quickSound(const std::string &sound_type)
if (new_sound == NULL) return NULL;
new_sound->play();
m_quick_sounds.getData()[sound_type] = new_sound;
m_quick_sounds.unlock();
return new_sound;
}
else
{
SFXBase *base_sound = sound->second;
base_sound->play();
m_quick_sounds.unlock();
return base_sound;
}

View File

@ -0,0 +1,55 @@
//
// SuperTuxKart - a fun racing game with go-kart
// Copyright (C) 2014-2015 SuperTuxKart Team
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 3
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "script_audio.hpp"
#include "audio/sfx_manager.hpp"
#include <angelscript.h>
#include <assert.h>
/** \cond DOXYGEN_IGNORE */
namespace Scripting
{
/** \endcond */
namespace Audio
{
/** \addtogroup Scripting
* @{
*/
/** \addtogroup Audio
* @{
*/
void playSound(const std::string* sound_name)
{
SFXManager::get()->quickSound(*sound_name);
}
/** @}*/
/** @}*/
void registerScriptFunctions(asIScriptEngine *engine)
{
int r; // of type asERetCodes
engine->SetDefaultNamespace("Audio");
r = engine->RegisterGlobalFunction("void playSound(const string &in)", asFUNCTION(playSound), asCALL_CDECL); assert(r >= 0);
}
}
/** \cond DOXYGEN_IGNORE */
}
/** \endcond */

View File

@ -0,0 +1,33 @@
//
// SuperTuxKart - a fun racing game with go-kart
// Copyright (C) 2014-2015 SuperTuxKart Team
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 3
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#ifndef HEADER_SCRIPT_AUDIO_HPP
#define HEADER_SCRIPT_AUDIO_HPP
#include <angelscript.h>
#include <string>
namespace Scripting
{
namespace Audio
{
void registerScriptFunctions(asIScriptEngine *engine);
}
}
#endif

View File

@ -21,6 +21,7 @@
#include "io/file_manager.hpp"
#include "karts/kart.hpp"
#include "modes/world.hpp"
#include "scriptengine/script_audio.hpp"
#include "scriptengine/script_challenges.hpp"
#include "scriptengine/script_kart.hpp"
#include "scriptengine/script_engine.hpp"
@ -336,7 +337,8 @@ namespace Scripting
Scripting::Utils::registerScriptFunctions(m_engine);
Scripting::GUI::registerScriptFunctions(m_engine);
Scripting::GUI::registerScriptEnums(m_engine);
Scripting::Audio::registerScriptFunctions(m_engine);
// It is possible to register the functions, properties, and types in
// configuration groups as well. When compiling the scripts it can then
// be defined which configuration groups should be available for that