播放聲音(轉)

內容簡介:

  加入音樂是增強應用程序功能的所有方法中最簡單的一個。幾乎每個計算機遊戲或多媒體程序都以某種MIDI或CD音樂爲背景。音樂可以使用戶心情愉快;在合適的場合播放恰當的音樂能夠使程序員和他的VC++程序煥發光彩。 

文檔內容:

第一部分 MIDI的播放

  樂器數字化接口(MIDI)是由音樂界的一些大公司(包括生產電子音樂合成器的公司)制訂的一項協議,後來被計算機產業所採用併成爲多媒體音樂文件的標準格式。MIDI文件一般較小,對硬件設備的要求高。

一、 原理 

  雖然MicroSoft支持MIDI文件,然而Visual C++或MFC並沒有創建任何組件來實現這種支持,但是MicroSoft API提供了三種不同的方法來實現MIDI的播放: 

MCI(The Media Control Interface)。這是最基本的方法,本文將詳細討論這種方法。

流緩衝器。這種格式允許應用程序爲MIDI數據分配緩衝器。在需要精確控制MIDI播放的時候,流緩衝器將很有用處。

低級MIDI設備。需要完全控制MIDI數據的應用程序可以使用這種方法。 

MCI可以通過mciSendCommand()和mciSendString()來完成,本文僅使用mciSendCommand()函數。 

原型:DWORD mciSendCommand(UINT wDeviceID,UINT wMessage,DWORD dwParam1,DWORD dwParam2); 

參數: wDeviceID:接受消息的設備ID

wMessage:MCI命令消息

dwParam1:命令的標誌位

dwParam2:所使用參數塊的指針

返值:調用成功,返回零;否則,返回雙字中的低字存放有錯誤信息。 

二、MIDI的播放控制

1. 打開設備 

MCI_OPEN_PARMS OpenParms;

OpenParms.lpstrDeviceType = (LPCSTR) MCI_DEVTYPE_SEQUENCER; //MIDI類型

OpenParms.lpstrElementName = (LPCSTR) Filename;

OpenParms.wDeviceID = 0;

mciSendCommand (NULL, MCI_OPEN, MCI_WAIT | MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT, (DWORD)(LPVOID) &OpenParms)

MCI設備ID指明打開了哪個設備,當發送了MCI_OPEN命令時,這個值在參數塊中返回——應被保存備用。 

2. 關閉設備 

mciSendCommand (m_wDeviceID, MCI_CLOSE, NULL, NULL);

3. 播放 

MCI_PLAY_PARMS PlayParms;

PlayParms.dwFrom = 0;

// 指定從什麼地方(時間)播放

mciSendCommand (m_wDeviceID, MCI_PLAY, MCI_FROM, (DWORD)(LPVOID)&PlayParms));

4. 暫停 

MCI_PLAY_PARMS PlayParms;

mciSendCommand (m_wDeviceID, MCI_PAUSE, 0, (DWORD)(LPVOID) &PlayParms);

5. 停止 

mciSendCommand (m_wDeviceID, MCI_STOP, NULL, NULL);

6. 跳躍 

* 跳轉到任意地方

MCI_SEEK_PARMS SeekParms;

SeekParms.dwTo = (nMinute * 60 + nSecond) * 1000;

//跳轉的目標時間,時間單位爲毫秒

mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_TO | MCI_WAIT,(DWORD)(LPVOID)&SeekParms);

* 跳到文件頭

mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL);

* 跳到文件尾

mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_END, NULL);

7. 查詢當前信息 

MCI_STATUS_PARMS StatusParms;

StatusParms.dwItem = MCI_SEQ_STATUS_DIVTYPE;

mciSendCommand (m_wDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&StatusParms);

返回信息存放於StatusParms.dwReturn中。

MCI_STATUS標誌

MCI_STATUS_LENGTH 獲得文件長度

MCI_STATUS_MODE 獲得文件播放的當前狀態

MCI_STATUS_POSITION 獲得文件播放的當前位置

MCI_STATUS_TIME_FORMAT 獲得當前的時間格式

MCI_SEQ_STATUS_DIVTYPE 判斷文件是PPQN類型還是SMPTE類型

MCI_SEQ_STATUS_TEMPO 獲得當前播放速度,PQRN類型,

此值爲節拍/分,SMPTE類型,此值爲禎/秒

8. 設置時間格式及播放速度 

MCI_SET_PARMS SetParms;

SetParms.dwTimeFormat = MCI_FORMAT_MILLISECONDS;

//設置時間單位爲毫秒

mciSendCommand (m_wDeviceID, MCI_SET, MCI_SET_TIME_FORMAT, (DWORD)(LPVOID) &SetParms);

MCI_SEQ_SET_TEMPO 設置播放速度,

PQRN類型,此值爲節拍/分,

SMPTE類型,此值爲禎/秒

第二部分 WAV文件的播放

一、原理 

MicroSoft API提供了三種不同的方法來實現WAV的播放: 

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

下的文件。

MCI(The Media Control Interface),與上一章播放MIDI文件相似,可以播放100K 以上的文件。

低級Wave音頻設備。用這些設備可以運行完全控制Wave數據的應用文件。 

二、 WAV文件播放控制 

因爲同樣使用MCI,與上一章相同,只列出不同的部分。 

1. 打開設備 

將MIDI的MCI_DEVTYPE_SEQUENCER 改爲"waveaudio" 

2. 錄音 

MCI_RECORD_PARMS RecordParms;

mciSendCommand (m_wDeviceID, MCI_RECORD, NULL, (DWORD)(LPVOID)&RecordParms);

3. 保存錄音 

MCI_SAVE_PARMS SaveParms;

SaveParms.lpfilename = (LPCSTR) Filename;

mciSendCommand (m_wDeviceID, MCI_SAVE, MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID) &SaveParms);

第三部分 CD的播放

  CD的獨特優勢在於,它由作曲家設計,並由音樂廠家生產。不同的計算機播放MIDI 文件時,聲音效果也不一樣,但是CD的聲音效果總是相同的。高品質的音頻對計算機用戶產生的效果會使你感到喫驚。我們依然採用MCI播放CD,大部分的播放控制與前兩部分相同,只列出不同的部分;

1. 開光驅門 

mciSendCommand (m_wDeviceID, MCI_SET, MCI_SET_DOOR_OPEN, NULL);

2. 關光驅門 

mciSendCommand (m_wDeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, NULL);

3. 打開設備 

將MIDI的MCI_DEVTYPE_SEQUENCER 改爲MCI_DEVTYPE_CD_AUDIO

4. 播放 

指定播放起點必須經過MCI_MAKE_TMSF(Track,Minute,Second,Frame)轉化 

5. 查詢當前信息 

MCI_STATUS_CURRENT_TRACK 得到當前曲目

MCI_STATUS_LENGTH 得到CD或指定曲目長度

MCI_STATUS_MODE 得到驅動器的當前狀態

MCI_STATUS_NUMBER_OF_TRACKS 得到CD曲目的數目

MCI_STATUS_POSITION 得到當前格式下的位置

MCI_STATUS_READY 檢查設備是否就緒

MCI_STATUS_TIME_FORMAT 得到當前時間格式

MCI_STATUS_MEDIA_PRESENT 檢查以確認CD是否在驅動器內

MCI_CDA_STATUS_TYPE_TRACK 檢查已確認某曲目是否爲音頻曲目

注意: 

使用MCI_STATUS_LENGTH參數查詢CD 及曲目長度,返回值通過調用MCI_MSF_MINUTE(),MCI_MSF_SECOND()轉換爲分、秒。

MCI_STATUS_POSITION參數返回值調用MCI_TMSF_TRACK(), MCI_TMSF_MINUTE(), MCI_TMSF_SECOND(),MCI_TMSF_FRAME才能得到當前的位置的道、分、秒、幀。 

6. 跳躍 

跳轉的目標必須經過MCI_MAKE_TMSF(Track,Minute,Second,Frame)轉化最好將上述三種格式分開建類,或做成動態連接庫。在 Project-- >Setting-- >Link-- >Object/library modules中加入winmm.lib,

源程序中包含< mmsystem.h >。 

MCI調用簡單,功能強大,可以滿足日常多媒體編程的基本需要。但是,MCI一次只能播放一個文件,使用DirectSound技術可以實現八個以上WAV文件的同時播放。

 

 

轉載自:

http://qingqingfeiangel.blog.163.com/blog/static/48132888200810695733942/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章