Magic_Game/core/Tool/Player.cpp

213 lines
3.6 KiB
C++

#include "..\e2dtool.h"
e2d::Player * e2d::Player::_instance = nullptr;
e2d::Player * e2d::Player::getInstance()
{
if (!_instance)
{
_instance = new (std::nothrow) Player;
}
return _instance;
}
void e2d::Player::destroyInstance()
{
if (_instance)
{
delete _instance;
_instance = nullptr;
}
}
e2d::Player::Player()
: _volume(1.f)
{
}
e2d::Player::~Player()
{
if (!_musicList.empty())
{
for (const auto& pair : _musicList)
{
delete pair.second;
}
}
}
bool e2d::Player::preload(const String & filePath)
{
if (filePath.isEmpty())
return false;
Music * music = new (std::nothrow) Music();
if (music && music->open(filePath))
{
music->setVolume(_volume);
_musicList.insert(std::make_pair(filePath.hash(), music));
return true;
}
return false;
}
bool e2d::Player::play(const String & filePath, int nLoopCount)
{
if (filePath.isEmpty())
return false;
if (Player::preload(filePath))
{
auto music = _musicList[filePath.hash()];
if (music->play(nLoopCount))
{
return true;
}
}
return false;
}
void e2d::Player::pause(const String & filePath)
{
if (filePath.isEmpty())
return;
size_t hash = filePath.hash();
if (_musicList.end() != _musicList.find(hash))
_musicList[hash]->pause();
}
void e2d::Player::resume(const String & filePath)
{
if (filePath.isEmpty())
return;
size_t hash = filePath.hash();
if (_musicList.end() != _musicList.find(hash))
_musicList[hash]->resume();
}
void e2d::Player::stop(const String & filePath)
{
if (filePath.isEmpty())
return;
size_t hash = filePath.hash();
if (_musicList.end() != _musicList.find(hash))
_musicList[hash]->stop();
}
bool e2d::Player::isPlaying(const String & filePath)
{
if (filePath.isEmpty())
return false;
size_t hash = filePath.hash();
if (_musicList.end() != _musicList.find(hash))
return _musicList[hash]->isPlaying();
return false;
}
bool e2d::Player::preload(const Resource& res)
{
if (_musicList.end() != _musicList.find(res.resNameId))
return true;
Music * music = new (std::nothrow) Music();
if (music && music->open(res))
{
music->setVolume(_volume);
_musicList.insert(std::make_pair(res.resNameId, music));
return true;
}
return false;
}
bool e2d::Player::play(const Resource& res, int nLoopCount)
{
if (Player::preload(res))
{
auto music = _musicList[res.resNameId];
if (music->play(nLoopCount))
{
return true;
}
}
return false;
}
void e2d::Player::pause(const Resource& res)
{
if (_musicList.end() != _musicList.find(res.resNameId))
_musicList[res.resNameId]->pause();
}
void e2d::Player::resume(const Resource& res)
{
if (_musicList.end() != _musicList.find(res.resNameId))
_musicList[res.resNameId]->resume();
}
void e2d::Player::stop(const Resource& res)
{
if (_musicList.end() != _musicList.find(res.resNameId))
_musicList[res.resNameId]->stop();
}
bool e2d::Player::isPlaying(const Resource& res)
{
if (_musicList.end() != _musicList.find(res.resNameId))
return _musicList[res.resNameId]->isPlaying();
return false;
}
float e2d::Player::getVolume()
{
return _volume;
}
void e2d::Player::setVolume(float volume)
{
_volume = std::min(std::max(volume, -224.f), 224.f);
for (const auto& pair : _musicList)
{
pair.second->setVolume(_volume);
}
}
void e2d::Player::pauseAll()
{
for (const auto& pair : _musicList)
{
pair.second->pause();
}
}
void e2d::Player::resumeAll()
{
for (const auto& pair : _musicList)
{
pair.second->resume();
}
}
void e2d::Player::stopAll()
{
for (const auto& pair : _musicList)
{
pair.second->stop();
}
}
void e2d::Player::clearCache()
{
for (const auto& pair : _musicList)
{
delete pair.second;
}
_musicList.clear();
}