menubar.refresh()
modstore.init()
+engine.sound_play("main_menu", true)
update_menu()
^ returns true/false
engine.get_version()
^ returns current minetest version
+engine.sound_play(spec, looped) -> handle
+^ spec = SimpleSoundSpec (see lua-api.txt)
+^ looped = bool
+engine.sound_stop(handle)
GUI:
engine.update_formspec(formspec)
#include "main.h"
#include "settings.h"
#include "guiMainMenu.h"
+#include "sound.h"
+#include "sound_openal.h"
#include "guiEngine.h"
m_menumanager(menumgr),
m_smgr(smgr),
m_data(data),
+ m_sound_manager(NULL),
m_formspecgui(0),
m_buttonhandler(0),
m_menu(0),
m_data->errormessage = "";
}
+ //create soundmanager
+ MenuMusicFetcher soundfetcher;
+#if USE_SOUND
+ m_sound_manager = createOpenALSoundManager(&soundfetcher);
+#endif
+ if(!m_sound_manager)
+ m_sound_manager = &dummySoundManager;
+
//create topleft header
core::rect<s32> rect(0, 0, 500, 40);
rect += v2s32(4, 0);
{
video::IVideoDriver* driver = m_device->getVideoDriver();
assert(driver != 0);
-
+
+ if(m_sound_manager != &dummySoundManager){
+ delete m_sound_manager;
+ m_sound_manager = NULL;
+ }
+
//TODO: clean up m_menu here
lua_close(m_engineluastack);
m_irr_toplefttext->setText(narrow_to_wide(toset).c_str());
}
+
+/******************************************************************************/
+s32 GUIEngine::playSound(SimpleSoundSpec spec, bool looped)
+{
+ s32 handle = m_sound_manager->playSound(spec, looped);
+ return handle;
+}
+
+/******************************************************************************/
+void GUIEngine::stopSound(s32 handle)
+{
+ m_sound_manager->stopSound(handle);
+}
#include "clouds.h"
#include "guiLuaApi.h"
#include "guiFormSpecMenu.h"
+#include "sound.h"
/******************************************************************************/
/* Typedefs and macros */
/******************************************************************************/
class GUIEngine;
struct MainMenuData;
+struct SimpleSoundSpec;
/******************************************************************************/
/* declarations */
GUIEngine* m_engine;
};
+class MenuMusicFetcher: public OnDemandSoundFetcher
+{
+ std::set<std::string> m_fetched;
+public:
+
+ void fetchSounds(const std::string &name,
+ std::set<std::string> &dst_paths,
+ std::set<std::string> &dst_datas)
+ {
+ if(m_fetched.count(name))
+ return;
+ m_fetched.insert(name);
+ std::string base;
+ base = porting::path_share + DIR_DELIM + "sounds";
+ dst_paths.insert(base + DIR_DELIM + name + ".ogg");
+ int i;
+ for(i=0; i<10; i++)
+ dst_paths.insert(base + DIR_DELIM + name + "."+itos(i)+".ogg");
+ base = porting::path_user + DIR_DELIM + "sounds";
+ dst_paths.insert(base + DIR_DELIM + name + ".ogg");
+ for(i=0; i<10; i++)
+ dst_paths.insert(base + DIR_DELIM + name + "."+itos(i)+".ogg");
+ }
+};
/** implementation of main menu based uppon formspecs */
class GUIEngine {
/** default destructor */
virtual ~GUIEngine();
+ s32 playSound(SimpleSoundSpec spec, bool looped);
+ void stopSound(s32 handle);
+
protected:
/**
* process field data recieved from formspec
scene::ISceneManager* m_smgr;
/** pointer to data beeing transfered back to main game handling */
MainMenuData* m_data;
+ /** pointer to soundmanager*/
+ ISoundManager* m_sound_manager;
/** representation of form source to be used in mainmenu formspec */
FormspecFormSource* m_formspecgui;
#include "settings.h"
#include "filesys.h"
#include "convert_json.h"
+#include "sound.h"
#include "IFileArchive.h"
retval &= API_FCT(download_file);
retval &= API_FCT(get_modstore_details);
retval &= API_FCT(get_modstore_list);
+ retval &= API_FCT(sound_play);
+ retval &= API_FCT(sound_stop);
if (!retval) {
//TODO show error
return 1;
}
+/******************************************************************************/
+int guiLuaApi::l_sound_play(lua_State *L) {
+ GUIEngine* engine = get_engine(L);
+
+ SimpleSoundSpec spec;
+ if(lua_isnil(L, 1))
+ {
+ } else if(lua_istable(L, 1)){
+ lua_getfield(L, 1, "name");
+ if(lua_isstring(L, -1)){
+ size_t len = 0;
+ spec.name = lua_tolstring(L, -1, &len);
+ }
+ lua_pop(L, 1);
+
+ //luaL_checkfloat(L, 1, "gain", spec.gain);
+ lua_getfield(L, 1, "gain");
+ if(lua_isnumber(L, -1)){
+ spec.gain = lua_tonumber(L, -1);
+ }
+ lua_pop(L, 1);
+ } else if(lua_isstring(L, 1)){
+ spec.name = luaL_checkstring(L, 1);
+ }
+ bool looped = lua_toboolean(L, 2);
+
+ u32 handle = engine->playSound(spec, looped);
+
+ lua_pushinteger(L, handle);
+
+ return 1;
+}
+
+/******************************************************************************/
+int guiLuaApi::l_sound_stop(lua_State *L) {
+ GUIEngine* engine = get_engine(L);
+
+ u32 handle = luaL_checkinteger(L, 1);
+ engine->stopSound(handle);
+
+ return 1;
+}
+
/******************************************************************************/
int guiLuaApi::l_download_file(lua_State *L) {
GUIEngine* engine = get_engine(L);
static int l_get_version(lua_State *L);
+ static int l_sound_play(lua_State *L);
+
+ static int l_sound_stop(lua_State *L);
+
//gui
static int l_show_keys_menu(lua_State *L);
#include "subgame.h"
#include "quicktune.h"
#include "serverlist.h"
-#include "sound.h"
-#include "sound_openal.h"
#include "guiEngine.h"
/*
}
#endif
-//Client side main menu music fetcher
-#ifndef SERVER
-class MenuMusicFetcher: public OnDemandSoundFetcher
-{
- std::set<std::string> m_fetched;
-public:
-
- void fetchSounds(const std::string &name,
- std::set<std::string> &dst_paths,
- std::set<std::string> &dst_datas)
- {
- if(m_fetched.count(name))
- return;
- m_fetched.insert(name);
- std::string base;
- base = porting::path_share + DIR_DELIM + "sounds";
- dst_paths.insert(base + DIR_DELIM + name + ".ogg");
- dst_paths.insert(base + DIR_DELIM + name + ".0.ogg");
- dst_paths.insert(base + DIR_DELIM + name + ".1.ogg");
- dst_paths.insert(base + DIR_DELIM + name + ".2.ogg");
- dst_paths.insert(base + DIR_DELIM + name + ".3.ogg");
- dst_paths.insert(base + DIR_DELIM + name + ".4.ogg");
- dst_paths.insert(base + DIR_DELIM + name + ".5.ogg");
- dst_paths.insert(base + DIR_DELIM + name + ".6.ogg");
- dst_paths.insert(base + DIR_DELIM + name + ".7.ogg");
- dst_paths.insert(base + DIR_DELIM + name + ".8.ogg");
- dst_paths.insert(base + DIR_DELIM + name + ".9.ogg");
- base = porting::path_user + DIR_DELIM + "sounds";
- dst_paths.insert(base + DIR_DELIM + name + ".ogg");
- dst_paths.insert(base + DIR_DELIM + name + ".0.ogg");
- dst_paths.insert(base + DIR_DELIM + name + ".1.ogg");
- dst_paths.insert(base + DIR_DELIM + name + ".2.ogg");
- dst_paths.insert(base + DIR_DELIM + name + ".3.ogg");
- dst_paths.insert(base + DIR_DELIM + name + ".4.ogg");
- dst_paths.insert(base + DIR_DELIM + name + ".5.ogg");
- dst_paths.insert(base + DIR_DELIM + name + ".6.ogg");
- dst_paths.insert(base + DIR_DELIM + name + ".7.ogg");
- dst_paths.insert(base + DIR_DELIM + name + ".8.ogg");
- dst_paths.insert(base + DIR_DELIM + name + ".9.ogg");
- }
-};
-#endif
-
class StderrLogOutput: public ILogOutput
{
public:
// Continue to game
break;
}
-
+
// Break out of menu-game loop to shut down cleanly
if(device->run() == false || kill == true) {
g_settings->updateConfigFile(configpath.c_str());