Sound.cpp
资源名称:3DRPG.rar [点击查看]
上传用户:cjwanglu
上传日期:2013-07-10
资源大小:4744k
文件大小:6k
源码类别:
游戏
开发平台:
Visual C++
- #include "stdafx.h"
- #include "Sound.h"
- CSound::CSound(HWND hWnd)
- {
- /*volume=-1000;
- pan=0;
- result = DirectSoundCreate( NULL, &pDS, NULL );
- if(result != DS_OK) MessageBox(hWnd,"建立 DirectSound 对象失败!","提示",MB_OK);
- result = pDS->SetCooperativeLevel( hWnd, DSSCL_PRIORITY );
- if(result != DS_OK) MessageBox(hWnd,"设置协调层级失败!","提示",MB_OK);
- memset( &dsdesc,0, sizeof(dsdesc) );
- dsdesc.dwSize = sizeof(dsdesc);
- dsdesc.dwFlags = DSBCAPS_PRIMARYBUFFER;
- dsdesc.dwBufferBytes = 0;
- dsdesc.lpwfxFormat = NULL;
- result = pDS->CreateSoundBuffer( &dsdesc, &pPBuf, NULL );
- if(result != DS_OK) MessageBox(hWnd,"建立主缓冲区失败!","提示",MB_OK);
- memset( &pwfmt,0, sizeof(pwfmt) );
- pwfmt.wFormatTag = 0 ;
- pwfmt.nChannels = 2;
- pwfmt.nSamplesPerSec = 44100;
- pwfmt.wBitsPerSample = 16;
- pwfmt.nBlockAlign = pwfmt.wBitsPerSample / 8 * pwfmt.nChannels;
- pwfmt.nAvgBytesPerSec = pwfmt.nSamplesPerSec * pwfmt.nBlockAlign;
- result = pPBuf->SetFormat(&pwfmt);
- if(result != DS_OK) MessageBox(hWnd,"设置播放格式失败!","提示",MB_OK);
- hmmio = mmioOpen(pStr, NULL, MMIO_ALLOCBUF|MMIO_READ );
- if(hmmio == NULL) MessageBox(hWnd,"文件不存在!","提示",MB_OK);
- ckRiff.fccType = mmioFOURCC('W', 'A', 'V', 'E');
- mmresult = mmioDescend(hmmio,&ckRiff,NULL,MMIO_FINDRIFF);
- if(mmresult != MMSYSERR_NOERROR) MessageBox(hWnd,"文件格式错误!","提示",MB_OK);
- ckInfo.ckid = mmioFOURCC('f','m','t',' ');
- mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
- if(mmresult != MMSYSERR_NOERROR) MessageBox(hWnd,"文件格式错误!","提示",MB_OK);
- if(mmioRead(hmmio,(HPSTR)&swfmt,sizeof(swfmt)) == -1) MessageBox(hWnd,"读取格式失败!","提示",MB_OK);
- mmresult = mmioAscend(hmmio,&ckInfo,0);
- ckInfo.ckid = mmioFOURCC('d','a','t','a');
- mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
- //搜寻区块
- if(mmresult != MMSYSERR_NOERROR) MessageBox(hWnd,"文件格式错误!","提示",MB_OK);
- size = ckInfo.cksize;
- memset( &dsdesc,0,sizeof(dsdesc));
- dsdesc.dwSize = sizeof(dsdesc);
- dsdesc.dwFlags = DSBCAPS_STATIC |DSBCAPS_CTRLPAN |DSBCAPS_CTRLVOLUME| DSBCAPS_GLOBALFOCUS;
- dsdesc.dwBufferBytes = size;
- dsdesc.lpwfxFormat = &swfmt;
- result = pDS->CreateSoundBuffer( &dsdesc, &pSBuf, NULL );
- if(result != DS_OK) MessageBox(hWnd,"建立次缓冲区失败!","提示",MB_OK);
- result = pSBuf->Lock(0,size,&pAudio,&bytesAudio,NULL,NULL,NULL);
- if(result != DS_OK) MessageBox(hWnd,"锁定缓冲区失败!","提示",MB_OK);
- mmresult = mmioRead(hmmio,(HPSTR)pAudio,bytesAudio);
- if(mmresult == -1) MessageBox(hWnd,"读取声音文件失败!","提示",MB_OK);
- result = pSBuf->Unlock(pAudio,bytesAudio,NULL,NULL);
- if(result != DS_OK) MessageBox(hWnd,"解除锁定缓冲区失败!","提示",MB_OK);
- mmioClose(hmmio,0);*/
- m_pDirectAudioPerformance = NULL;
- m_pDirectAudioLoader = NULL;
- m_pSegment = NULL;
- m_pGraph = NULL;
- m_pMediaControl = NULL;
- m_pMediaPosition = NULL;
- m_enumFormat = Unknown;
- CoInitialize(NULL);
- //Create the DirectAudio performance object
- CoCreateInstance(CLSID_DirectMusicPerformance, NULL, CLSCTX_INPROC,
- IID_IDirectMusicPerformance8, (void**) &m_pDirectAudioPerformance);
- //Create the DirectAudio loader object
- CoCreateInstance(CLSID_DirectMusicLoader, NULL, CLSCTX_INPROC,
- IID_IDirectMusicLoader8, (void**) &m_pDirectAudioLoader);
- //Initialise the performance object
- m_pDirectAudioPerformance->InitAudio(NULL, NULL, hWnd, DMUS_APATH_SHARED_STEREOPLUSREVERB,
- 64, DMUS_AUDIOF_ALL, NULL);
- GetCurrentDirectory(MAX_PATH, strSoundPath);
- MultiByteToWideChar(CP_ACP, 0, strSoundPath, -1, wstrSoundPath, MAX_PATH);
- m_pDirectAudioLoader->SetSearchDirectory(GUID_DirectMusicAllTypes, wstrSoundPath, FALSE);
- CoCreateInstance(CLSID_FilterGraph, NULL,
- CLSCTX_INPROC, IID_IGraphBuilder, (void**)&m_pGraph);
- m_pGraph->QueryInterface(IID_IMediaControl, (void**)&m_pMediaControl);
- m_pGraph->QueryInterface(IID_IMediaPosition, (void**)&m_pMediaPosition);
- }
- CSound::~CSound()
- { /*pSBuf->Stop();
- pPBuf->Release();
- pSBuf->Release();
- pDS->Release();*/
- m_pMediaControl->Stop();
- m_pDirectAudioPerformance->StopEx(m_pSegment, 0, 0);
- m_pDirectAudioPerformance->Stop(NULL, NULL, 0, 0);
- m_pDirectAudioPerformance->CloseDown();
- SafeRRelease(m_pDirectAudioLoader);
- SafeRRelease(m_pDirectAudioPerformance);
- //m_pDirectAudioLoader->Release();
- //m_pDirectAudioPerformance->Release();
- CoUninitialize();
- }
- void CSound::Play(int t,CHAR * pStr)
- {
- /*// pSBuf->Stop();
- pSBuf->SetCurrentPosition(0);
- pSBuf->SetVolume(volume);
- pSBuf->SetPan(pan);
- pSBuf->Play(0,0,1); */
- switch(t)
- {
- case 0:
- m_enumFormat = WavMidi;
- //初始化WAV文件,将文件名转换为unicode
- MultiByteToWideChar(CP_ACP, 0, pStr, -1, wstrSoundPath, MAX_PATH);
- //加载声音
- m_pDirectAudioLoader->LoadObjectFromFile(CLSID_DirectMusicSegment, IID_IDirectMusicSegment8,
- wstrSoundPath, (void**) &m_pSegment);
- m_pSegment->Download(m_pDirectAudioPerformance);
- m_pSegment->SetRepeats(-1); //这里可以设置循环次数,-1为循环播放
- m_pDirectAudioPerformance->PlaySegmentEx(m_pSegment, NULL, NULL, 0, 0, NULL, NULL, NULL);
- break;
- case 1:
- m_enumFormat = MP3;
- //初始化MP3文件,得到MP3文件所在的目录
- GetCurrentDirectory(MAX_PATH, strSoundPath);
- strcat(strSoundPath, pStr);//\Love.mp3
- //将文件名转换为unicode
- MultiByteToWideChar(CP_ACP, 0, strSoundPath, -1, wstrSoundPath, MAX_PATH);
- m_pGraph->RenderFile(wstrSoundPath, NULL);
- m_pMediaPosition->put_CurrentPosition(0);
- m_pMediaControl->Run();
- break;
- }
- }
- void CSound::PlaySound(CHAR * pStr)
- {
- m_enumFormat = WavMidi;
- //初始化WAV文件,将文件名转换为unicode
- MultiByteToWideChar(CP_ACP, 0, pStr, -1, wstrSoundPath, MAX_PATH);
- //加载声音
- m_pDirectAudioLoader->LoadObjectFromFile(CLSID_DirectMusicSegment, IID_IDirectMusicSegment8,
- wstrSoundPath, (void**) &m_pSegment);
- m_pSegment->Download(m_pDirectAudioPerformance);
- m_pSegment->SetRepeats(0); //这里可以设置循环次数,-1为循环播放
- m_pDirectAudioPerformance->PlaySegmentEx(m_pSegment, NULL, NULL, 0, 0, NULL, NULL, NULL);
- }