添加EMusicUtils;更新EFuileUtils在提取和保存数字类型数据时的转换方法。

This commit is contained in:
Nomango 2017-10-25 10:54:03 +08:00
parent 69d2f66405
commit 3f892d23a8
3 changed files with 665 additions and 34 deletions

View File

@ -53,21 +53,17 @@ e2d::EString e2d::EFileUtils::getDefaultSavePath()
void e2d::EFileUtils::saveInt(LPCTSTR key, int value) void e2d::EFileUtils::saveInt(LPCTSTR key, int value)
{ {
std::wstringstream ss; ::WritePrivateProfileString(L"Default", key, std::to_wstring(value).c_str(), getDefaultSavePath().c_str());
ss << value;
::WritePrivateProfileString(L"Default", key, ss.str().c_str(), getDefaultSavePath().c_str());
} }
void e2d::EFileUtils::saveDouble(LPCTSTR key, double value) void e2d::EFileUtils::saveFloat(LPCTSTR key, float value)
{ {
std::wstringstream ss; ::WritePrivateProfileString(L"Default", key, std::to_wstring(value).c_str(), getDefaultSavePath().c_str());
ss << value;
::WritePrivateProfileString(L"Default", key, ss.str().c_str(), getDefaultSavePath().c_str());
} }
void e2d::EFileUtils::saveString(LPCTSTR key, EString value) void e2d::EFileUtils::saveString(LPCTSTR key, LPCTSTR value)
{ {
::WritePrivateProfileString(L"Default", key, value.c_str(), getDefaultSavePath().c_str()); ::WritePrivateProfileString(L"Default", key, value, getDefaultSavePath().c_str());
} }
int e2d::EFileUtils::getInt(LPCTSTR key, int default) int e2d::EFileUtils::getInt(LPCTSTR key, int default)
@ -75,25 +71,17 @@ int e2d::EFileUtils::getInt(LPCTSTR key, int default)
return ::GetPrivateProfileInt(L"Default", key, default, getDefaultSavePath().c_str()); return ::GetPrivateProfileInt(L"Default", key, default, getDefaultSavePath().c_str());
} }
double e2d::EFileUtils::getDouble(LPCTSTR key, double default) float e2d::EFileUtils::getFloat(LPCTSTR key, float default)
{ {
// 将 default 参数转化为字符串 TCHAR temp[32] = { 0 };
std::wstringstream ss; ::GetPrivateProfileString(L"Default", key, std::to_wstring(default).c_str(), temp, 31, getDefaultSavePath().c_str());
ss << default; return std::stof(temp);
// 读取数据
TCHAR temp[128] = { 0 };
::GetPrivateProfileString(L"Default", key, ss.str().c_str(), temp, 128, getDefaultSavePath().c_str());
// 转换为字符串流
ss.str(L"");
ss << temp;
// 将字符串转化为 double
return _wtof(ss.str().c_str());
} }
e2d::EString e2d::EFileUtils::geTString(LPCTSTR key, EString default) e2d::EString e2d::EFileUtils::geTString(LPCTSTR key, LPCTSTR default)
{ {
TCHAR temp[128] = { 0 }; TCHAR temp[256] = { 0 };
::GetPrivateProfileString(L"Default", key, default.c_str(), temp, 128, getDefaultSavePath().c_str()); ::GetPrivateProfileString(L"Default", key, default, temp, 255, getDefaultSavePath().c_str());
return EString(temp); return EString(temp);
} }

View File

@ -1 +1,510 @@
#include "..\etools.h" #include "..\etools.h"
#include "..\Win\winbase.h"
#include <mmsystem.h>
#pragma comment(lib , "winmm.lib")
#include <map>
#include <Digitalv.h>
////////////////////////////////////////////////////////////////////
// MciPlayer
////////////////////////////////////////////////////////////////////
class MciPlayer
{
public:
MciPlayer();
~MciPlayer();
void close();
void open(const e2d::EString & pFileName, UINT uId);
void open(const e2d::EString & pResouceName, const e2d::EString & pResouceType, const e2d::EString & musicExtension, UINT uId);
void play(bool bLoop = false);
void pause();
void resume();
void stop();
void rewind();
void setVolume(float volume);
bool isPlaying();
UINT getSoundID();
private:
void _sendCommand(int nCommand, DWORD_PTR param1 = 0, DWORD_PTR parma2 = 0);
MCIDEVICEID m_dev;
UINT m_nSoundID;
bool m_bPlaying;
bool m_bLoop;
e2d::EString m_sTmpFileName;
};
MciPlayer::MciPlayer() :
m_dev(0L),
m_nSoundID(0),
m_bPlaying(false),
m_bLoop(false)
{
}
MciPlayer::~MciPlayer()
{
close(); // 关闭播放器
}
void MciPlayer::open(const e2d::EString & pFileName, UINT uId)
{
// 忽略不存在的文件
if (pFileName.empty()) return;
// 停止当前音乐
close();
// 设置 MCI_OPEN_PARMS 参数
MCI_OPEN_PARMS mciOpen = { 0 };
mciOpen.lpstrDeviceType = (LPCTSTR)-1;
mciOpen.lpstrElementName = pFileName.c_str();
// 打开这个文件
MCIERROR mciError;
mciError = mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, reinterpret_cast<DWORD_PTR>(&mciOpen));
// 出现错误时,忽略这次操作
if (mciError) return;
// 保存设备等信息
m_dev = mciOpen.wDeviceID;
m_nSoundID = uId;
m_bPlaying = false;
}
void MciPlayer::open(const e2d::EString & pResouceName, const e2d::EString & pResouceType, const e2d::EString & musicExtension, UINT uId)
{
bool ExtractResource(LPCTSTR strDstFile, LPCTSTR strResType, LPCTSTR strResName);
// 忽略不存在的文件
if (pResouceName.empty() || pResouceType.empty()) return;
// 获取临时文件目录
TCHAR tmpFilePath[_MAX_PATH];
::GetTempPath(_MAX_PATH, tmpFilePath);
// 创建临时文件目录
e2d::EString tmpFileName = tmpFilePath + e2d::EApp::getAppName();
if (_waccess(tmpFileName.c_str(), 0) == -1)
{
_wmkdir(tmpFileName.c_str());
}
// 产生临时文件的文件名
tmpFileName.append(L"\\");
tmpFileName.append(std::to_wstring(uId));
tmpFileName.append(L"." + musicExtension);
// 导出资源为临时文件
if (ExtractResource(tmpFileName.c_str(), pResouceType.c_str(), pResouceName.c_str()))
{
// 停止当前音乐
close();
// 设置 MCI_OPEN_PARMS 参数
MCI_OPEN_PARMS mciOpen = { 0 };
mciOpen.lpstrDeviceType = (LPCTSTR)-1;
mciOpen.lpstrElementName = tmpFileName.c_str();
// 打开这个文件
MCIERROR mciError;
mciError = mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, reinterpret_cast<DWORD_PTR>(&mciOpen));
// 出现错误时,忽略这次操作
if (mciError) return;
// 保存设备等信息
m_dev = mciOpen.wDeviceID;
m_nSoundID = uId;
m_bPlaying = false;
m_sTmpFileName = tmpFileName;
}
}
void MciPlayer::play(bool bLoop)
{
// 设备为空时,忽略这次操作
if (!m_dev)
{
return;
}
// 设置播放参数
MCI_PLAY_PARMS mciPlay = { 0 };
MCIERROR s_mciError;
// 播放声音
s_mciError = mciSendCommand(m_dev, MCI_PLAY, MCI_FROM | (bLoop ? MCI_DGV_PLAY_REPEAT : 0), reinterpret_cast<DWORD_PTR>(&mciPlay));
// 未出错时,置 m_bPlaying 为 true
if (!s_mciError)
{
m_bPlaying = true;
m_bLoop = bLoop;
}
}
void MciPlayer::close()
{
// 停止音乐
if (m_bPlaying)
{
stop();
}
// 关闭设备
if (m_dev)
{
_sendCommand(MCI_CLOSE);
}
// 删除临时文件
if (!m_sTmpFileName.empty())
{
DeleteFile(m_sTmpFileName.c_str());
m_sTmpFileName.clear();
}
// 恢复默认属性
m_dev = 0;
m_bPlaying = false;
}
void MciPlayer::pause()
{
// 暂停音乐
_sendCommand(MCI_PAUSE);
m_bPlaying = false;
}
void MciPlayer::resume()
{
// 继续播放音乐
_sendCommand(MCI_RESUME);
m_bPlaying = true;
}
void MciPlayer::stop()
{
// 停止音乐
_sendCommand(MCI_STOP);
m_bPlaying = false;
}
void MciPlayer::rewind()
{
// 设备为空时,忽略这次操作
if (!m_dev)
{
return;
}
// 重置播放位置
mciSendCommand(m_dev, MCI_SEEK, MCI_SEEK_TO_START, 0);
// 播放音乐
MCI_PLAY_PARMS mciPlay = { 0 };
m_bPlaying = mciSendCommand(m_dev, MCI_PLAY, (m_bLoop ? MCI_DGV_PLAY_REPEAT : 0), reinterpret_cast<DWORD_PTR>(&mciPlay)) ? false : true;
}
void MciPlayer::setVolume(float volume)
{
MCI_DGV_SETAUDIO_PARMS mciSetAudioPara = { 0 };
mciSetAudioPara.dwItem = MCI_DGV_SETAUDIO_VOLUME;
mciSetAudioPara.dwValue = DWORD(1000 * min(max(volume, 0), 1));
mciSendCommand(m_dev, MCI_SETAUDIO, MCI_DGV_SETAUDIO_VALUE | MCI_DGV_SETAUDIO_ITEM, (DWORD_PTR)&mciSetAudioPara);
}
bool MciPlayer::isPlaying()
{
return m_bPlaying;
}
UINT MciPlayer::getSoundID()
{
return m_nSoundID;
}
void MciPlayer::_sendCommand(int nCommand, DWORD_PTR param1, DWORD_PTR parma2)
{
// 空设备时忽略这次操作
if (!m_dev)
{
return;
}
// 向当前设备发送操作
mciSendCommand(m_dev, nCommand, param1, parma2);
}
////////////////////////////////////////////////////////////////////
// e2d::EMusicUtils
////////////////////////////////////////////////////////////////////
typedef std::map<unsigned int, MciPlayer *> MusicList;
typedef std::pair<unsigned int, MciPlayer *> Music;
static size_t Hash(const e2d::EString & key);
static MusicList& getMciPlayerList()
{
static MusicList s_List;
return s_List;
}
static MciPlayer& getBgMciPlayer()
{
static MciPlayer s_Music;
return s_Music;
}
void e2d::EMusicUtils::end()
{
// 停止背景音乐
getBgMciPlayer().close();
// 停止其他所有音乐
for (auto& iter : getMciPlayerList())
{
SafeDelete(&iter.second);
}
// 清空音乐列表
getMciPlayerList().clear();
return;
}
void e2d::EMusicUtils::setVolume(float volume)
{
// 设置背景音乐音量
getBgMciPlayer().setVolume(volume);
// 设置其他音乐音量
for (auto& iter : getMciPlayerList())
{
iter.second->setVolume(volume);
}
}
void e2d::EMusicUtils::setVolume(const EString & musicFilePath, float volume)
{
unsigned int nRet = ::Hash(musicFilePath);
MusicList::iterator p = getMciPlayerList().find(nRet);
if (p != getMciPlayerList().end())
{
p->second->setVolume(volume);
}
}
void e2d::EMusicUtils::playBackgroundMusic(const EString & musicFilePath, bool bLoop)
{
if (musicFilePath.empty())
{
return;
}
getBgMciPlayer().open(musicFilePath, ::Hash(musicFilePath));
getBgMciPlayer().play(bLoop);
}
void e2d::EMusicUtils::playBackgroundMusic(const EString & musicResourceName, const EString & musicResourceType, const EString & musicExtension, bool loop)
{
if (musicResourceName.empty() || musicResourceType.empty())
{
return;
}
getBgMciPlayer().open(musicResourceName, musicResourceType, musicExtension, ::Hash(musicResourceName));
getBgMciPlayer().play(loop);
}
void e2d::EMusicUtils::stopBackgroundMusic(bool bReleaseData)
{
if (bReleaseData)
{
getBgMciPlayer().close();
}
else
{
getBgMciPlayer().stop();
}
}
void e2d::EMusicUtils::pauseBackgroundMusic()
{
getBgMciPlayer().pause();
}
void e2d::EMusicUtils::resumeBackgroundMusic()
{
getBgMciPlayer().resume();
}
void e2d::EMusicUtils::rewindBackgroundMusic()
{
getBgMciPlayer().rewind();
}
bool e2d::EMusicUtils::isBackgroundMusicPlaying()
{
return getBgMciPlayer().isPlaying();
}
void e2d::EMusicUtils::setBackgroundMusicVolume(float volume)
{
getBgMciPlayer().setVolume(volume);
}
void e2d::EMusicUtils::playMusic(const EString & musicFilePath, bool bLoop)
{
unsigned int nRet = ::Hash(musicFilePath);
preloadMusic(musicFilePath);
MusicList::iterator p = getMciPlayerList().find(nRet);
if (p != getMciPlayerList().end())
{
p->second->play(bLoop);
}
}
void e2d::EMusicUtils::playMusic(const EString & musicResourceName, const EString & musicResourceType, const EString & musicExtension, bool loop)
{
unsigned int nRet = ::Hash(musicResourceName);
preloadMusic(musicResourceName, musicResourceType, musicExtension);
MusicList::iterator p = getMciPlayerList().find(nRet);
if (p != getMciPlayerList().end())
{
p->second->play(loop);
}
}
void e2d::EMusicUtils::_stopMusic(size_t nSoundId)
{
MusicList::iterator p = getMciPlayerList().find(nSoundId);
if (p != getMciPlayerList().end())
{
p->second->stop();
}
}
void e2d::EMusicUtils::preloadMusic(const EString & musicFilePath)
{
if (musicFilePath.empty()) return;
int nRet = ::Hash(musicFilePath);
if (getMciPlayerList().end() != getMciPlayerList().find(nRet)) return;
getMciPlayerList().insert(Music(nRet, new MciPlayer()));
MciPlayer * pPlayer = getMciPlayerList()[nRet];
pPlayer->open(musicFilePath, nRet);
if (nRet == pPlayer->getSoundID()) return;
delete pPlayer;
getMciPlayerList().erase(nRet);
nRet = 0;
}
void e2d::EMusicUtils::preloadMusic(const EString & musicResourceName, const EString & musicResourceType, const EString & musicExtension)
{
if (musicResourceName.empty() || musicResourceType.empty()) return;
int nRet = ::Hash(musicResourceName);
if (getMciPlayerList().end() != getMciPlayerList().find(nRet)) return;
getMciPlayerList().insert(Music(nRet, new MciPlayer()));
MciPlayer * pPlayer = getMciPlayerList()[nRet];
pPlayer->open(musicResourceName, musicResourceType, musicExtension, nRet);
if (nRet == pPlayer->getSoundID()) return;
delete pPlayer;
getMciPlayerList().erase(nRet);
nRet = 0;
}
void e2d::EMusicUtils::_pauseMusic(size_t nSoundId)
{
MusicList::iterator p = getMciPlayerList().find(nSoundId);
if (p != getMciPlayerList().end())
{
p->second->pause();
}
}
void e2d::EMusicUtils::pauseAllMusics()
{
for (auto& iter : getMciPlayerList())
{
iter.second->pause();
}
}
void e2d::EMusicUtils::_resumeMusic(size_t nSoundId)
{
MusicList::iterator p = getMciPlayerList().find(nSoundId);
if (p != getMciPlayerList().end())
{
p->second->resume();
}
}
void e2d::EMusicUtils::resumeAllMusics()
{
for (auto& iter : getMciPlayerList())
{
iter.second->resume();
}
}
void e2d::EMusicUtils::stopAllMusics()
{
for (auto& iter : getMciPlayerList())
{
iter.second->stop();
}
}
void e2d::EMusicUtils::unloadMusic(const EString & musicFilePath)
{
unsigned int nID = ::Hash(musicFilePath);
MusicList::iterator p = getMciPlayerList().find(nID);
if (p != getMciPlayerList().end())
{
SafeDelete(&p->second);
getMciPlayerList().erase(nID);
}
}
size_t Hash(const e2d::EString & key)
{
static std::hash<e2d::EString> h;
return h(key);
}
bool ExtractResource(LPCTSTR strDstFile, LPCTSTR strResType, LPCTSTR strResName)
{
// 创建文件
HANDLE hFile = ::CreateFile(strDstFile, GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, NULL);
if (hFile == INVALID_HANDLE_VALUE)
return false;
// 查找资源文件中、加载资源到内存、得到资源大小
HRSRC hRes = ::FindResource(NULL, strResName, strResType);
HGLOBAL hMem = ::LoadResource(NULL, hRes);
DWORD dwSize = ::SizeofResource(NULL, hRes);
// 写入文件
DWORD dwWrite = 0; // 返回写入字节
::WriteFile(hFile, hMem, dwSize, &dwWrite, NULL);
::CloseHandle(hFile);
return true;
}

View File

@ -269,31 +269,54 @@ public:
static EString getDefaultSavePath(); static EString getDefaultSavePath();
// 保存 int 型的值 // 保存 int 型的值
static void saveInt(LPCTSTR key, int value); static void saveInt(
LPCTSTR key,
int value
);
// 保存 double 型的值 // 保存 float 型的值
static void saveDouble(LPCTSTR key, double value); static void saveFloat(
LPCTSTR key,
float value
);
// 保存 字符串 型的值(不要在 Unicode 字符集下保存中文字符) // 保存 字符串 型的值(不要在 Unicode 字符集下保存中文字符)
static void saveString(LPCTSTR key, EString value); static void saveString(
LPCTSTR key,
LPCTSTR value
);
// 获取 int 型的值(若不存在则返回 default 参数的值) // 获取 int 型的值(若不存在则返回 default 参数的值)
static int getInt(LPCTSTR key, int default); static int getInt(
LPCTSTR key,
int default
);
// 获取 double 型的值(若不存在则返回 default 参数的值) // 获取 float 型的值(若不存在则返回 default 参数的值)
static double getDouble(LPCTSTR key, double default); static float getFloat(
LPCTSTR key,
float default
);
// 获取 字符串 型的值(若不存在则返回 default 参数的值) // 获取 字符串 型的值(若不存在则返回 default 参数的值)
static EString geTString(LPCTSTR key, EString default); static EString geTString(
LPCTSTR key,
LPCTSTR default
);
// 得到文件扩展名(小写) // 得到文件扩展名(小写)
static EString getFileExtension(const EString & filePath); static EString getFileExtension(
const EString & filePath
);
/** /**
* true * true
* *
*/ */
static EString getSaveFilePath(LPCTSTR title = L"保存到", LPCTSTR defExt = NULL); static EString getSaveFilePath(
LPCTSTR title = L"保存到",
LPCTSTR defExt = NULL
);
}; };
@ -337,4 +360,115 @@ public:
static std::default_random_engine &getEngine(); static std::default_random_engine &getEngine();
}; };
class EMusicUtils
{
public:
// 播放背景音乐
static void playBackgroundMusic(
const EString & musicFilePath,
bool loop = true
);
// 播放背景音乐
static void playBackgroundMusic(
const EString & musicResourceName, /* 资源名称 */
const EString & musicResourceType, /* 资源类别 */
const EString & musicExtension, /* 指定资源的扩展名 */
bool loop = true
);
// 停止背景音乐
static void stopBackgroundMusic(
bool release = false
);
// 暂停背景音乐
static void pauseBackgroundMusic();
// 继续播放背景音乐
static void resumeBackgroundMusic();
// 从头播放背景音乐
static void rewindBackgroundMusic();
// 背景音乐是否正在播放
static bool isBackgroundMusicPlaying();
// 设置背景音乐音量,范围 [0 ~ 1.0]
static void setBackgroundMusicVolume(
float volume
);
// 播放音效
static void playMusic(
const EString & musicFilePath,
bool loop = false
);
// 播放音效
static void playMusic(
const EString & musicResourceName, /* 资源名称 */
const EString & musicResourceType, /* 资源类别 */
const EString & musicExtension, /* 指定资源的扩展名 */
bool loop = false
);
// 预加载音效
static void preloadMusic(
const EString & musicFilePath
);
// 预加载音效
static void preloadMusic(
const EString & musicResourceName, /* 资源名称 */
const EString & musicResourceType, /* 资源类别 */
const EString & musicExtension /* 指定资源的扩展名 */
);
// 卸载音效
static void unloadMusic(
const EString & musicFilePath
);
// 设置特定音乐的音量,范围 [0 ~ 1.0]
static void setVolume(
const EString & musicFilePath,
float volume
);
// 暂停所有音乐
static void pauseAllMusics();
// 继续播放所有音乐
static void resumeAllMusics();
// 停止所有音乐
static void stopAllMusics();
// 停止所有音乐,并释放内存
static void end();
// 设置总音量,范围 [0 ~ 1.0]
static void setVolume(
float volume
);
protected:
// 暂停音效
static void _pauseMusic(
size_t nSoundId
);
// 继续播放音效
static void _resumeMusic(
size_t nSoundId
);
// 停止音效
static void _stopMusic(
size_t nSoundId
);
};
} }