mirror of
https://github.com/RetroDECK/ES-DE.git
synced 2025-02-16 20:15:38 +00:00
Changed the sound cache to be part of the Sound class instead of
ThemeData.
This commit is contained in:
parent
8a52866ca6
commit
8d1ac3087e
|
@ -2,6 +2,35 @@
|
||||||
#include "AudioManager.h"
|
#include "AudioManager.h"
|
||||||
#include "Log.h"
|
#include "Log.h"
|
||||||
#include "Settings.h"
|
#include "Settings.h"
|
||||||
|
#include "ThemeData.h"
|
||||||
|
|
||||||
|
std::map< std::string, std::shared_ptr<Sound> > Sound::sMap;
|
||||||
|
|
||||||
|
std::shared_ptr<Sound> Sound::get(const std::string& path)
|
||||||
|
{
|
||||||
|
auto it = sMap.find(path);
|
||||||
|
if(it != sMap.end())
|
||||||
|
return it->second;
|
||||||
|
|
||||||
|
std::shared_ptr<Sound> sound = std::shared_ptr<Sound>(new Sound(path));
|
||||||
|
AudioManager::getInstance()->registerSound(sound);
|
||||||
|
sMap[path] = sound;
|
||||||
|
return sound;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<Sound> Sound::getFromTheme(const std::shared_ptr<ThemeData>& theme, const std::string& view, const std::string& element)
|
||||||
|
{
|
||||||
|
LOG(LogInfo) << " req sound [" << view << "." << element << "]";
|
||||||
|
|
||||||
|
const ThemeData::ThemeElement* elem = theme->getElement(view, element, "sound");
|
||||||
|
if(!elem || !elem->has("path"))
|
||||||
|
{
|
||||||
|
LOG(LogInfo) << " (missing)";
|
||||||
|
return get("");
|
||||||
|
}
|
||||||
|
|
||||||
|
return get(elem->get<std::string>("path"));
|
||||||
|
}
|
||||||
|
|
||||||
Sound::Sound(const std::string & path) : mSampleData(NULL), mSamplePos(0), mSampleLength(0), playing(false)
|
Sound::Sound(const std::string & path) : mSampleData(NULL), mSamplePos(0), mSampleLength(0), playing(false)
|
||||||
{
|
{
|
||||||
|
|
11
src/Sound.h
11
src/Sound.h
|
@ -2,8 +2,11 @@
|
||||||
#define _SOUND_H_
|
#define _SOUND_H_
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <map>
|
||||||
|
#include <memory>
|
||||||
#include "SDL_audio.h"
|
#include "SDL_audio.h"
|
||||||
|
|
||||||
|
class ThemeData;
|
||||||
|
|
||||||
class Sound
|
class Sound
|
||||||
{
|
{
|
||||||
|
@ -15,7 +18,9 @@ class Sound
|
||||||
bool playing;
|
bool playing;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Sound(const std::string & path = "");
|
static std::shared_ptr<Sound> get(const std::string& path);
|
||||||
|
static std::shared_ptr<Sound> getFromTheme(const std::shared_ptr<ThemeData>& theme, const std::string& view, const std::string& elem);
|
||||||
|
|
||||||
~Sound();
|
~Sound();
|
||||||
|
|
||||||
void init();
|
void init();
|
||||||
|
@ -32,6 +37,10 @@ public:
|
||||||
void setPosition(Uint32 newPosition);
|
void setPosition(Uint32 newPosition);
|
||||||
Uint32 getLength() const;
|
Uint32 getLength() const;
|
||||||
Uint32 getLengthMS() const;
|
Uint32 getLengthMS() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Sound(const std::string & path = "");
|
||||||
|
static std::map< std::string, std::shared_ptr<Sound> > sMap;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -33,7 +33,8 @@ std::map< std::string, std::map<std::string, ThemeData::ElementPropertyType> > T
|
||||||
("primaryColor", COLOR)
|
("primaryColor", COLOR)
|
||||||
("secondaryColor", COLOR)
|
("secondaryColor", COLOR)
|
||||||
("fontPath", PATH)
|
("fontPath", PATH)
|
||||||
("fontSize", FLOAT))
|
("fontSize", FLOAT)
|
||||||
|
("scrollSound", PATH))
|
||||||
("container", boost::assign::map_list_of
|
("container", boost::assign::map_list_of
|
||||||
("pos", NORMALIZED_PAIR)
|
("pos", NORMALIZED_PAIR)
|
||||||
("size", NORMALIZED_PAIR))
|
("size", NORMALIZED_PAIR))
|
||||||
|
@ -300,28 +301,17 @@ const ThemeData::ThemeElement* ThemeData::getElement(const std::string& view, co
|
||||||
return &elemIt->second;
|
return &elemIt->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ThemeData::playSound(const std::string& elementName)
|
const std::shared_ptr<ThemeData>& ThemeData::getDefault()
|
||||||
{
|
{
|
||||||
const ThemeElement* elem = getElement("common", elementName, "sound");
|
static std::shared_ptr<ThemeData> theme = nullptr;
|
||||||
if(!elem)
|
if(theme == nullptr)
|
||||||
return;
|
|
||||||
|
|
||||||
if(elem->has("path"))
|
|
||||||
{
|
{
|
||||||
const std::string path = elem->get<std::string>("path");
|
theme = std::shared_ptr<ThemeData>(new ThemeData());
|
||||||
auto cacheIt = mSoundCache.find(path);
|
theme->loadFile(getHomePath() + "/.emulationstation/es_theme_default.xml");
|
||||||
if(cacheIt != mSoundCache.end())
|
|
||||||
{
|
|
||||||
cacheIt->second->play();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<Sound> sound = std::shared_ptr<Sound>(new Sound(path));
|
|
||||||
sound->play();
|
|
||||||
mSoundCache[path] = sound;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
return theme;
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<GuiComponent*> ThemeData::makeExtras(const std::shared_ptr<ThemeData>& theme, const std::string& view, Window* window)
|
std::vector<GuiComponent*> ThemeData::makeExtras(const std::shared_ptr<ThemeData>& theme, const std::string& view, Window* window)
|
||||||
{
|
{
|
||||||
|
|
|
@ -127,13 +127,13 @@ public:
|
||||||
|
|
||||||
void renderExtras(const std::string& view, Window* window, const Eigen::Affine3f& transform);
|
void renderExtras(const std::string& view, Window* window, const Eigen::Affine3f& transform);
|
||||||
|
|
||||||
void playSound(const std::string& name);
|
|
||||||
|
|
||||||
// If expectedType is an empty string, will do no type checking.
|
// If expectedType is an empty string, will do no type checking.
|
||||||
const ThemeElement* getElement(const std::string& view, const std::string& element, const std::string& expectedType) const;
|
const ThemeElement* getElement(const std::string& view, const std::string& element, const std::string& expectedType) const;
|
||||||
|
|
||||||
static std::vector<GuiComponent*> makeExtras(const std::shared_ptr<ThemeData>& theme, const std::string& view, Window* window);
|
static std::vector<GuiComponent*> makeExtras(const std::shared_ptr<ThemeData>& theme, const std::string& view, Window* window);
|
||||||
|
|
||||||
|
static const std::shared_ptr<ThemeData>& getDefault();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static std::map< std::string, std::map<std::string, ElementPropertyType> > sElementMap;
|
static std::map< std::string, std::map<std::string, ElementPropertyType> > sElementMap;
|
||||||
|
|
||||||
|
@ -146,8 +146,6 @@ private:
|
||||||
void parseElement(const pugi::xml_node& elementNode, const std::map<std::string, ElementPropertyType>& typeMap, ThemeElement& element);
|
void parseElement(const pugi::xml_node& elementNode, const std::map<std::string, ElementPropertyType>& typeMap, ThemeElement& element);
|
||||||
|
|
||||||
std::map<std::string, ThemeView> mViews;
|
std::map<std::string, ThemeView> mViews;
|
||||||
|
|
||||||
std::map< std::string, std::shared_ptr<Sound> > mSoundCache;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// okay ideas for applying themes to GuiComponents:
|
// okay ideas for applying themes to GuiComponents:
|
||||||
|
|
|
@ -35,19 +35,21 @@ GuiMenu::GuiMenu(Window* window) : GuiComponent(window), mBackground(window, ":/
|
||||||
mList.setPosition(mSize.x() * 0.175f, mSize.y() * 0.05f);
|
mList.setPosition(mSize.x() * 0.175f, mSize.y() * 0.05f);
|
||||||
mList.setSize(mSize.x() * 0.65f, mSize.y() * 0.9f);
|
mList.setSize(mSize.x() * 0.65f, mSize.y() * 0.9f);
|
||||||
|
|
||||||
|
mTheme = ThemeData::getDefault();
|
||||||
|
|
||||||
using namespace ThemeFlags;
|
using namespace ThemeFlags;
|
||||||
mBackground.applyTheme(mTheme, "menu", "background", PATH);
|
mBackground.applyTheme(mTheme, "menu", "background", PATH);
|
||||||
mBackground.fitTo(Eigen::Vector2f(mList.getSize().x(), mSize.y()), Eigen::Vector3f(mList.getPosition().x(), 0, 0));
|
mBackground.fitTo(Eigen::Vector2f(mList.getSize().x(), mSize.y()), Eigen::Vector3f(mList.getPosition().x(), 0, 0));
|
||||||
addChild(&mBackground);
|
addChild(&mBackground);
|
||||||
|
|
||||||
mTheme = std::make_shared<ThemeData>();
|
|
||||||
|
|
||||||
mList.setFont(Font::get((int)(0.09f * Renderer::getScreenHeight())));
|
mList.setFont(Font::get((int)(0.09f * Renderer::getScreenHeight())));
|
||||||
mList.applyTheme(mTheme, "menu", "menulist", FONT_PATH | COLOR);
|
mList.applyTheme(mTheme, "menu", "menulist", FONT_PATH | COLOR | SOUND);
|
||||||
mList.setSelectorColor(0xBBBBBBFF);
|
mList.setSelectorColor(0xBBBBBBFF);
|
||||||
mList.setColor(0, 0x0000FFFF);
|
mList.setColor(0, 0x0000FFFF);
|
||||||
mList.setColor(1, 0xFF0000FF);
|
mList.setColor(1, 0xFF0000FF);
|
||||||
|
|
||||||
|
Sound::getFromTheme(mTheme, "menu", "menuOpen")->play();
|
||||||
|
|
||||||
addChild(&mList);
|
addChild(&mList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,7 +59,7 @@ bool GuiMenu::input(InputConfig* config, Input input)
|
||||||
{
|
{
|
||||||
if(config->isMappedTo("b", input) || config->isMappedTo("menu", input))
|
if(config->isMappedTo("b", input) || config->isMappedTo("menu", input))
|
||||||
{
|
{
|
||||||
mTheme->playSound("menuCloseSound");
|
Sound::getFromTheme(mTheme, "menu", "menuClose")->play();
|
||||||
delete this;
|
delete this;
|
||||||
return true;
|
return true;
|
||||||
}else if(config->isMappedTo("a", input) && mList.getList().size() > 0)
|
}else if(config->isMappedTo("a", input) && mList.getList().size() > 0)
|
||||||
|
|
|
@ -69,6 +69,7 @@ public:
|
||||||
inline void setSelectedColor(unsigned int color) { mSelectedColor = color; }
|
inline void setSelectedColor(unsigned int color) { mSelectedColor = color; }
|
||||||
inline void setScrollSound(const std::shared_ptr<Sound>& sound) { mScrollSound = sound; }
|
inline void setScrollSound(const std::shared_ptr<Sound>& sound) { mScrollSound = sound; }
|
||||||
inline void setColor(unsigned int id, unsigned int color) { mColors[id] = color; }
|
inline void setColor(unsigned int id, unsigned int color) { mColors[id] = color; }
|
||||||
|
inline void setSound(const std::shared_ptr<Sound>& sound) { mScrollSound = sound; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static const int MARQUEE_DELAY = 900;
|
static const int MARQUEE_DELAY = 900;
|
||||||
|
@ -429,6 +430,9 @@ void TextListComponent<T>::applyTheme(const std::shared_ptr<ThemeData>& theme, c
|
||||||
}
|
}
|
||||||
|
|
||||||
setFont(Font::getFromTheme(elem, properties, mFont));
|
setFont(Font::getFromTheme(elem, properties, mFont));
|
||||||
|
|
||||||
|
if(properties & SOUND && elem->has("scrollSound"))
|
||||||
|
setSound(Sound::get(elem->get<std::string>("scrollSound")));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -83,8 +83,6 @@ void ViewController::launch(FileData* game, Eigen::Vector3f center)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
game->getSystem()->getTheme()->playSound("gameSelectSound");
|
|
||||||
|
|
||||||
Eigen::Affine3f origCamera = mCamera;
|
Eigen::Affine3f origCamera = mCamera;
|
||||||
origCamera.translation() = -mCurrentView->getPosition();
|
origCamera.translation() = -mCurrentView->getPosition();
|
||||||
|
|
||||||
|
@ -165,7 +163,6 @@ bool ViewController::input(InputConfig* config, Input input)
|
||||||
{
|
{
|
||||||
// open menu
|
// open menu
|
||||||
mWindow->pushGui(new GuiMenu(mWindow));
|
mWindow->pushGui(new GuiMenu(mWindow));
|
||||||
ThemeData().playSound("menuOpenSound");
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ void BasicGameListView::onThemeChanged(const std::shared_ptr<ThemeData>& theme)
|
||||||
{
|
{
|
||||||
ISimpleGameListView::onThemeChanged(theme);
|
ISimpleGameListView::onThemeChanged(theme);
|
||||||
using namespace ThemeFlags;
|
using namespace ThemeFlags;
|
||||||
mList.applyTheme(theme, getName(), "gamelist", POSITION | ThemeFlags::SIZE | COLOR | SOUND | FONT_PATH | FONT_SIZE);
|
mList.applyTheme(theme, getName(), "gamelist", ALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BasicGameListView::onFileChanged(FileData* file, FileChangeType change)
|
void BasicGameListView::onFileChanged(FileData* file, FileChangeType change)
|
||||||
|
|
|
@ -21,7 +21,7 @@ bool IGameListView::input(InputConfig* config, Input input)
|
||||||
onFileChanged(file, FILE_REMOVED); //tell the view
|
onFileChanged(file, FILE_REMOVED); //tell the view
|
||||||
delete file; //free it
|
delete file; //free it
|
||||||
}));
|
}));
|
||||||
mTheme->playSound("menuOpenSound");
|
Sound::getFromTheme(mTheme, getName(), "menuOpen")->play();
|
||||||
return true;
|
return true;
|
||||||
}else if(config->isMappedTo("select", input) && input.value != 0)
|
}else if(config->isMappedTo("select", input) && input.value != 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include "../../ThemeData.h"
|
#include "../../ThemeData.h"
|
||||||
#include "../../Window.h"
|
#include "../../Window.h"
|
||||||
#include "../ViewController.h"
|
#include "../ViewController.h"
|
||||||
|
#include "../../Sound.h"
|
||||||
|
|
||||||
ISimpleGameListView::ISimpleGameListView(Window* window, FileData* root) : IGameListView(window, root),
|
ISimpleGameListView::ISimpleGameListView(Window* window, FileData* root) : IGameListView(window, root),
|
||||||
mHeaderText(window), mHeaderImage(window), mBackground(window), mThemeExtras(window)
|
mHeaderText(window), mHeaderImage(window), mBackground(window), mThemeExtras(window)
|
||||||
|
@ -57,6 +58,7 @@ bool ISimpleGameListView::input(InputConfig* config, Input input)
|
||||||
FileData* cursor = getCursor();
|
FileData* cursor = getCursor();
|
||||||
if(cursor->getType() == GAME)
|
if(cursor->getType() == GAME)
|
||||||
{
|
{
|
||||||
|
Sound::getFromTheme(getTheme(), getName(), "launch")->play();
|
||||||
launch(cursor);
|
launch(cursor);
|
||||||
}else{
|
}else{
|
||||||
// it's a folder
|
// it's a folder
|
||||||
|
@ -75,7 +77,7 @@ bool ISimpleGameListView::input(InputConfig* config, Input input)
|
||||||
populateList(mCursorStack.top()->getParent()->getChildren());
|
populateList(mCursorStack.top()->getParent()->getChildren());
|
||||||
setCursor(mCursorStack.top());
|
setCursor(mCursorStack.top());
|
||||||
mCursorStack.pop();
|
mCursorStack.pop();
|
||||||
getTheme()->playSound("backSound");
|
Sound::getFromTheme(getTheme(), getName(), "back")->play();
|
||||||
}else{
|
}else{
|
||||||
onFocusLost();
|
onFocusLost();
|
||||||
mWindow->getViewController()->goToSystemView(getCursor()->getSystem());
|
mWindow->getViewController()->goToSystemView(getCursor()->getSystem());
|
||||||
|
|
Loading…
Reference in a new issue