x在Windows下音量设置无效的问题

在参照书上例子学习Cocos2d-x音量调节的时候,遇到了设置背景音量无效的问题,通过获取背景音量,每次返回值都是1。这是不正常的,因此网上搜索资料,解决了一些问题,但是不完全正确,或者说是瑕疵吧,这里把我调通的经过记录一下,供以后参考。

网上搜索的资料地址为:,这个解决方法不但对背景音量有效,而且对特效音量也是适用的。本文有一些内容是和上述资料有所重合的。

另外,我所用的Cocos2d-x版本是cocos2d-2.1beta3-x-2.1.1,编译环境是VS2010。

一、修改源代码(参考网上资料)

1、首先更改Cocos2d-x目录下CocosDenshion/win32/Mciplayer.h,如下(红色为新添加内容):

/**

*/

UINT GetSoundID();

// volume value ranges from 0 .. 1000

void Volume(UINT volume);

// return value ranges from 0 .. 1000

UINT Volume() const;

private:

friendLRESULT WINAPI _SoundPlayProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAMlParam);

2、然后更改Cocos2d-x目录下CocosDenshion/win32/Mciplayer.cpp,如下(红色为新添加内容):

void MciPlayer::Open(constchar* pFileName, UINT uId)

{

// WCHAR * pBuf = NULL;

do

{

BREAK_IF(! pFileName || ! m_hWnd);

m_bPlaying = false;

} while(0);

}

voidMciPlayer::Volume(UINT volume)

{

if (!m_hDev)

return;

MCI_DGV_SETAUDIO_PARMS mciParams = {0};

mciParams.dwItem = MCI_DGV_SETAUDIO_VOLUME;

mciParams.dwValue = volume;

mciSendCommand(m_hDev, MCI_SETAUDIO,MCI_DGV_SETAUDIO_ITEM | MCI_DGV_SETAUDIO_VALUE, (DWORD)&mciParams);

}

UINTMciPlayer::Volume() const

{

if (!m_hDev)

return 0;

MCI_STATUS_PARMS mciParams = {0};

mciParams.dwItem = MCI_DGV_STATUS_VOLUME;

mciSendCommand(m_hDev, MCI_STATUS,MCI_STATUS_ITEM, (DWORD)&mciParams);

return mciParams.dwReturn;

}

void MciPlayer::Play(UINT uTimes /*= 1 */)

{

if (!m_hDev)

{

return;

}

…代码省略…

}

3、最后更改Cocos2d-x目录下CocosDenshion/win32/ SimpleAudioEngine.cpp,如下(浅蓝色为去掉内容,红色为添加内容):

(1)修改getBackgroundMusicVolume

floatSimpleAudioEngine::getBackgroundMusicVolume()

{

//return 1.0;

return sharedMusic().Volume() / 1000.0f;

}

(2)修改setBackgroundMusicVolume

voidSimpleAudioEngine::setBackgroundMusicVolume(floatvolume)

{

sharedMusic().Volume((UINT) (volume * 1000.0));

}

(3)修改getEffectsVolume

floatSimpleAudioEngine::getEffectsVolume()

{

//return 1.0;

return sharedList().begin()->second->Volume() /1000.0f; // XXX returning the first

}

此处需要注意:网络上代码“sharedList().at(0)->Volume()/ 1000.0f;”在VS2010中是有编译错误的,此处map的使用有误。

(4)修改setEffectsVolume

voidSimpleAudioEngine::setEffectsVolume(floatvolume)

{

EffectList::iteratoriter;

for(iter = sharedList().begin(); iter != sharedList().end(); ++iter)

{

iter->second->Volume((UINT)(volume * 1000.0));

}

}

二、重新编译CocosDenshion

而做人的能力则会给你一百种机会。

x在Windows下音量设置无效的问题

相关文章:

你感兴趣的文章:

标签云: