Code/Resource
Windows Develop
Linux-Unix program
Internet-Socket-Network
Web Server
Browser Client
Ftp Server
Ftp Client
Browser Plugins
Proxy Server
Email Server
Email Client
WEB Mail
Firewall-Security
Telnet Server
Telnet Client
ICQ-IM-Chat
Search Engine
Sniffer Package capture
Remote Control
xml-soap-webservice
P2P
WEB(ASP,PHP,...)
TCP/IP Stack
SNMP
Grid Computing
SilverLight
DNS
Cluster Service
Network Security
Communication-Mobile
Game Program
Editor
Multimedia program
Graph program
Compiler program
Compress-Decompress algrithms
Crypt_Decrypt algrithms
Mathimatics-Numerical algorithms
MultiLanguage
Disk/Storage
Java Develop
assembly language
Applications
Other systems
Database system
Embeded-SCM Develop
FlashMX/Flex
source in ebook
Delphi VCL
OS Develop
MiddleWare
MPI
MacOS develop
LabView
ELanguage
Software/Tools
E-Books
Artical/Document
MusicPlace.cpp
Package: LwGame2.0.rar [view]
Upload User: semy2100
Upload Date: 2013-01-22
Package Size: 3633k
Code Size: 5k
Category:
Shot Game
Development Platform:
Visual C++
- /********************************************************************
- * 空运爆发 *
- * Version 2.0 *
- * 本游戏全部代码由: *
- * 冲天实验室 梁锋 编写 *
- * 邮箱:lenwine@126.com *
- * bbs: http://free2.e-168.cn/lenwind (正在开发中...) *
- **********************************************************************/
- //////////////////////////////////////////////////////////////////////
- #include "stdafx.h"
- #include "wgame.h"
- #include "MusicPlace.h"
- //////////////////////////////////////////////////////////////////////
- // Construction/Destruction
- //////////////////////////////////////////////////////////////////////
- //设置两个全局变量控制音量
- //用于控制背景音乐音量大小
- int m_bMusVoLF=DSBVOLUME_MAX;
- //用于控制音效音量大小
- int m_cMusVoLF=DSBVOLUME_MAX;
- MusicPlace::MusicPlace(const char* FileName,BOOL m_bgMusic,LPDIRECTSOUND lpDS,DWORD dwFlags)
- {
- //判断是否用于背景音乐
- //若m_bgMusic为TRUE,则该音乐用于背景音乐
- //若m_bgMusic为FALSE,则该音乐用于音效
- m_lenbm=m_bgMusic;
- //复位声音缓冲区
- m_lMusBuf=NULL;
- //打开wav文件
- FILE* pFile=fopen(FileName,"rb");
- if(!pFile)
- return;
- ////反相关信息读入lenwave
- LWaveF lenwave;
- if(fread(&lenwave,sizeof(lenwave),1,pFile)!=1)
- {
- fclose(pFile);
- return;
- }
- //所需的数据区的大小
- DWORD dwSize=lenwave.dwDSize;
- //是否是一个立体声音文件?
- BOOL bStereo=lenwave.wChnls>1?true:false;
- //为这个wav文件创建声音文件
- if(CreateSoundBuffer(lpDS,dwFlags,dwSize,lenwave.dwSRate,lenwave.BitsPerSample,lenwave.wBlkAlign,bStereo))
- {
- //从wav 文件中读入声音数据
- if(!Access(pFile,dwSize,sizeof(lenwave)))
- MessageBox(NULL,"读入声音数据出错",NULL,MB_OK);
- }
- fclose(pFile);
- }
- MusicPlace::~MusicPlace()
- {
- ActionStop();
- if(m_lMusBuf)
- {
- m_lMusBuf->Release();
- }
- }
- BOOL MusicPlace::CreateSoundBuffer(LPDIRECTSOUND lpDS,DWORD dwFlags,DWORD dwBufSize,DWORD dwFreq,DWORD dwBitsPerSample,DWORD dwBlkAlign,BOOL bStereo)
- {
- PCMWAVEFORMAT lenwav;
- DSBUFFERDESC lenbuf;
- //设置wave format结构
- memset(&lenwav,0,sizeof(PCMWAVEFORMAT));
- lenwav.wf.wFormatTag =WAVE_FORMAT_PCM;
- lenwav.wf.nChannels =bStereo?2:1;
- lenwav.wf.nSamplesPerSec =dwFreq;
- lenwav.wf.nBlockAlign =(WORD)dwBlkAlign;
- lenwav.wf.nAvgBytesPerSec =lenwav.wf.nSamplesPerSec * lenwav.wf.nBlockAlign;
- lenwav.wBitsPerSample =(WORD)dwBitsPerSample;
- //设置DSBUFFERDESC结构
- memset(&lenbuf,0,sizeof(DSBUFFERDESC));//Zero it out.
- lenbuf.dwSize =sizeof(DSBUFFERDESC);
- lenbuf.dwFlags =dwFlags;
- lenbuf.dwBufferBytes =dwBufSize;
- lenbuf.lpwfxFormat =(LPWAVEFORMATEX)&lenwav;
- if(DS_OK!=lpDS->CreateSoundBuffer(&lenbuf,&m_lMusBuf,NULL))
- {
- MessageBox(NULL,"创建声音缓冲区失败",NULL,MB_OK);
- return FALSE;
- }
- return TRUE;
- }
- BOOL MusicPlace::Access(FILE *pFile,DWORD dwSize,DWORD dwPos)
- {
- //定位到文件中的正确位置
- if(dwPos!=0xffffffff)
- {
- if(fseek(pFile,dwPos,SEEK_SET)!=0)
- {
- return FALSE;
- }
- }
- //锁定缓冲区数据
- LPVOID lBufdatao;
- DWORD dBufdatao;//缓冲区数据大小
- LPVOID lBufdatas;
- DWORD dBufdatas;//缓冲区数据大小
- HRESULT rval;
- rval=m_lMusBuf->Lock(0,dwSize,&lBufdatao,&dBufdatao,&lBufdatas,&dBufdatas,DSBLOCK_FROMWRITECURSOR);
- if(rval!=DS_OK)
- {
- return FALSE;
- }
- //读取数据
- if(dBufdatao>0)
- {
- if(fread(lBufdatao,dBufdatao,1,pFile)!=1)
- {
- return FALSE;
- }
- }
- if(dBufdatas>0)
- {
- if(fread(lBufdatas,dBufdatas,1,pFile)!=1)
- {
- return FALSE;
- }
- }
- //解除锁定
- rval=m_lMusBuf->Unlock(lBufdatao,dBufdatao,lBufdatas,dBufdatas);
- if(rval!=DS_OK)
- {
- return FALSE;
- }
- return TRUE;
- }
- //入口参数:bContinue控制调用ActionStop后是否接着原来的播放点播放
- //bContinue为TRUE时为接着原来点播放,为FALSE时从头播放
- //默认bContinue为FALSE
- BOOL MusicPlace::ActionPlay(BOOL bContinue)
- {
- if(m_lMusBuf)//确认声音缓冲区有效
- {
- DWORD dwStatus;
- if(DS_OK!=m_lMusBuf->GetStatus(&dwStatus))
- {
- MessageBox(NULL,"获取DirectSound缓冲区状态失败!",NULL,MB_OK);
- return FALSE;
- }
- if((dwStatus&DSBSTATUS_PLAYING)!=DSBSTATUS_PLAYING)
- {
- if(m_lenbm)//是背景音乐则循环播放
- {
- //设置播放位置
- if(!bContinue)
- m_lMusBuf->SetCurrentPosition(0);
- if(DS_OK!=m_lMusBuf->Play(0,0,DSBPLAY_LOOPING))//Play the sound
- {
- return FALSE;
- }
- }
- else
- //设置播放位置
- {
- if(!bContinue)
- m_lMusBuf->SetCurrentPosition(0);
- if(DS_OK!=m_lMusBuf->Play(0,0,0))//Play the sound
- {
- MessageBox(NULL,"不能播放声音缓冲区对象",NULL,MB_OK);
- }
- }
- }
- }
- return TRUE;
- }
- BOOL MusicPlace::ActionStop()
- {
- if(m_lMusBuf)//确认声音缓冲区有效
- {
- DWORD dwStatus;
- if(DS_OK!=m_lMusBuf->GetStatus(&dwStatus))
- {
- return FALSE;
- }
- if((dwStatus&DSBSTATUS_PLAYING)==DSBSTATUS_PLAYING)
- {
- if(DS_OK!=m_lMusBuf->Stop())//Stop the sound
- {
- return FALSE;
- }
- }
- }
- return TRUE;
- }
- BOOL MusicPlace::bTrue()
- {
- if(m_lMusBuf)
- return TRUE;
- else
- return FALSE;
- }
- //----------音量控制部分----------
- //SetVolume:设置音量
- //入口参数为百分数(0-100)
- //以后如果再需要用于控制音量部分就要再加函数。暂时设定一值
- void MusicPlace::CtrlVolume(int vol)
- {
- int cVol;
- if(vol<=0)
- cVol=DSBVOLUME_MIN;
- else if(vol>=100)
- cVol=DSBVOLUME_MAX;
- else
- cVol=DSBVOLUME_MIN+(DSBVOLUME_MAX-DSBVOLUME_MIN)/vol;
- //GetBuffer()->SetVolume();
- }