六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

VC下完成DirectSound

[摘要]武漢石化設計院電算室周紅漢---- 加入音樂是增強應用程序功能的所有方法中最簡單的一個。音樂可以使用戶心情愉快;在合適的場合播放恰當的音樂能夠使程序員和他的VC++程序煥發光彩。---- Micro...
武漢石化設計院電算室
周紅漢
---- 加入音樂是增強應用程序功能的所有方法中最簡單的一個。音樂可以使用戶心情
愉快;在合適的場合播放恰當的音樂能夠使程序員和他的VC++程序煥發光彩。

---- Microsoft Windows Multimedia API提供了三種方法來播放WAV文件:

PlaySound()函數。它可以通過單行編碼來播放Wave格式的聲音。此函數有兩個限制
:必須將聲音數據完整地載入物理內存;數據格式必須被所配置的某一音頻驅動器支
持。根據經驗,PlaySound()適用于100K以下的文件。

MCI(The Media Control Interface)。MCI功能強大,不僅可以實現WAV文件的播放,
而且還可以播放MIDI及CD音頻。

低級Wave音頻設備。用這些設備可以運行完全控制Wave數據的應用文件。
---- 前兩種方法使用簡單,但無法實現兩個及兩個以上的WAV文件的播放;第三種方法
實現起來非常復雜,非專業人員很難完成。DirectSound可以實現八個及八個以上WAV文
件的同時播放,能使多媒體程序更加生動,而且簡單易用,但它僅適合于Windows 95下
的程序,也不支持WAV文件的記錄及存儲""這是唯一讓人遺憾的地方。實現
DirectSound需要以下幾個步驟:
1. 創建及初始化DirectSound
LPDIRECTSOUND m_pDirectObject;
if(DirectSoundCreate(NULL,&m_pDirectObject,NULL)==DS_OK)
file://設定應用程序的聲音設備優先級別方式,一般為DSSCL_NORMAL
m_pDirectObject->SetCooperativeLevel
(this- >m_hWnd,DSSCL_NORMAL);
else
AfxMessageBox("DirectSound Create failed");

2. 將WAV文件讀入內存,找到格式塊,數據塊位置及數據長度。
m_pMemory,m_pFormat,m_pData,m_dwSize在頭文件中聲明。
BOOL CDirectWave::LoadFile (CString Filename){
CFile File;
DWORD dwSize;
if (!File.Open (Filename,
CFile::modeRead CFile::shareDenyNone))
return FALSE;
dwSize = File.Seek (0, CFile::end);
File.Seek (0, CFile::begin);
file://m_pMemory內存存儲塊指針,類型:LPVOID
m_pMemory = GlobalAlloc (GMEM_FIXED, dwSize);
if (File.ReadHuge (m_pMemory, dwSize) != dwSize){
File.Close ();
return FALSE;
}
File.Close ();

LPDWORD pdw,pdwEnd;
DWORD dwRiff,dwType, dwLength, dwLength;
if (m_pFormat) file://格式塊指針,類型:LPWAVEFORMATEX
m_pFormat = NULL;
if (m_pData) file://數據塊指針,類型:LPBYTE
m_pData = NULL;
if (m_dwSize) file://數據長度,類型:DWORD
m_dwSize = 0;
pdw = (DWORD *) m_pMemory;
dwRiff = *pdw++;
dwLength = *pdw++;
dwType = *pdw++;

if (dwRiff != mmioFOURCC ('R', 'I', 'F', 'F'))
return FALSE;
if (dwType != mmioFOURCC ('W', 'A', 'V', 'E'))
return FALSE;
file://尋找格式塊,數據塊位置及數據長度
pdwEnd = (DWORD *)((BYTE *) pdw + dwLength - 4);
while (pdw < pdwEnd){
dwType = *pdw++;
dwLength = *pdw++;
switch (dwType){
case mmioFOURCC('f', 'm', 't', ' '):
if (!m_pFormat){
if (dwLength < sizeof (WAVEFORMAT))
return FALSE;
m_pFormat = (LPWAVEFORMATEX) pdw;
if (m_pData && m_dwSize)
return TRUE;
}
break;

case mmioFOURCC('d', 'a', 't', 'a'):
if (!m_pData !m_dwSize){
m_pData = (LPBYTE) pdw;
m_dwSize = dwLength;
if (m_pFormat)
return TRUE;
}
break;
}
pdw = (DWORD *)((BYTE *) pdw +
((dwLength + 1) &~ 1));
}
file://未找到,返回FALSE
return FALSE;
}

3. 創建聲音緩沖區
DSBUFFERDESC BufferDesc;
memset (&BufferDesc, 0, sizeof (BufferDesc));
BufferDesc.lpwfxFormat = (LPWAVEFORMATEX) m_pFormat;
BufferDesc.dwSize = sizeof (DSBUFFERDESC);
BufferDesc.dwBufferBytes = m_dwSize;
BufferDesc.dwFlags = 0;
file://頭文件中聲明m_pDSoundBuffer,類
型:LPDIRECTSOUNDBUFFER
if (pDSoundObject->CreateSoundBuffer
(&BufferDesc, &m_pDSoundBuffer, 0) != DS_OK)
return FALSE;

4. 載入聲音數據
BOOL CDirectWave::LoadData (void){
LPVOID lpPtr1, lpPtr2;
DWORD dwLen1, dwLen2;
HRESULT hResult;

TryLoad:
hResult = m_pDSoundBuffer- >Lock
(0, m_dwSize, &lpPtr1, &dwLen1, &lpPtr2, &dwLen2, 0);
if (hResult == DS_OK){
memcpy (lpPtr1, m_pData, dwLen1);
if (lpPtr2)
memcpy (lpPtr2, m_pData + dwLen1, dwLen2);
m_pDSoundBuffer- >Unlock
(lpPtr1, dwLen1, lpPtr2, dwLen2);
return TRUE;
}
else if (hResult == DSERR_BUFFERLOST){
hResult = m_pDSoundBuffer- >Restore ();
if (hResult == DS_OK)
goto TryLoad;
}
return FALSE;
}

5. 播放及停止
void CDirectWave::Play (BOOL bLoop){
DWORD dwFlags = 0;
file://dwFlags= DSBPLAY_LOOPING可實現循環播放
TryPlay:
if (m_pDSoundBuffer- >
Play (0, 0, dwFlags) == DSERR_BUFFERLOST){
if (LoadData ())//數據丟失,重新裝載
goto TryPlay;
}
}
void CDirectWave::Stop (void){
m_pDSoundBuffer- >Stop ();
}
6. 關閉。釋放內存塊,聲音緩沖區。

DirectSound需要用到mmsystem.h,dsound.h兩個頭文件。


主站蜘蛛池模板: 日本激情视频网站w | 午夜视频福利在线观看 | 色播亚洲 | 中文字幕欧美视频 | 日韩黄色一级视频 | 在线播放性xxx欧美 在线播放色 | 天天干夜啪 | 日韩欧美三级视频 | 青春草在线 | 一级做a爰片久久毛片免费 一级做a爰片久久毛片美女图片 | 日本黄网址 | 午夜老司机福利 | 香蕉视频一级 | 欧美做真爱欧美观看免费 | 在线观看成年视频 | 日本a黄色片 | 天天色网站| 四虎4hu永久免费视频大全 | 日韩视频 中文字幕 | 天天干天天做 | 欧美一级在线播放 | 日韩欧美中文字幕在线视频 | 在线免费视频你懂的 | 特级淫片欧美高清视频蜜桃 | 天天操天天操天天操天天操 | 青青草原91 | 亚洲精品在线网址 | 香蕉成人福利片视频在线下载 | 亚洲产在线精品第一站不卡 | 青青青青操 | 天天综合网站 | 深夜视频在线播放视频在线观看免费观看 | 天天天狠天天透天天制色 | 日日日日人人人夜夜夜2017 | 欧美性猛交xxxx | 亚洲男人的天堂久久香蕉 | 日韩 亚洲 中文 图片 小说 | 亚洲综合狠狠 | 天天影视综合色区 | 天美视频在线观看 | 亚洲第一影视 |