中国科学技术大学电子工程与信息科学系多媒体通信实验室(Copyright1999) MCI接口编程实验 一、实验目的 熟悉Windows下声卡编程的基本过程及原理,掌握Windows下MCI编程的基本知识。 二、预备知识 VC5编程方法、MCI编程方法。 三、实验原理 设计多媒体程序,关键是对多种媒体设备的控制和使用,在Windows3..1和Windows95系 统中,对多媒体设备进行控制主要有三种方法:第一种方法是使用微软公司窗口系统中对多 媒体支持的MCI,即媒体控制接口,MCI是多媒体设备和多媒体应用软件之间进行设备无 关的沟通的桥梁.在VB和VC中,MCI都得到了很好的支持。第二种方法,通过调用Windows 的API(应用程序接口)多媒体相关函数实现媒体控制.第三种方法是使用OLE(Object Linking &Embedding),即对象链接与嵌入技术,它为不同软件之间共享数据和资源提供了有力的手 段。 我们在本实验中用最简单的方法来实现声音的播放和录制一媒体控制接口编程。有关知 识请阅读附录中“VC多媒体”部分。 四、实验要求 本实验非常简单和基础,请已经熟悉VC和MCI这些内容的同学耐心地再做一遍。请同 学们参照示例中的程序代码,编制自己的声卡程序并应用各种声音播放的方法。具体要求如 下: 1.学会使用PlaySound()、SndPlaySound()来播放WAV文件: 2. 学会使用mciSendCommand()或mciSendString()来播放WAV文件: 3.学会使用mciSendCommand()或mciSendString()来录制WAV文件: 4.实验完成以后,需要实验室老师检查通过。 5.在意思清楚、完整的前提下,思考题的回答越精炼越好。 6. 在以上基本要求完成的前提下,有能力的同学可以试一下用MCI接口播放其他格式的文 件:制作一个媒体播放器。 如果您在阅读过程中发现疏漏和错误,请您尽快和编者取得联系network@ustc.cdu.cn cxh(@ustc.edu.cn
中国科学技术大学电子工程与信息科学系 多媒体通信实验室(Copyright 1999) MCI 接口编程实验 一、实验目的 熟悉 Windows 下声卡编程的基本过程及原理,掌握 Windows 下 MCI 编程的基本知识。 二、预备知识 VC5 编程方法、MCI 编程方法。 三、实验原理 设计多媒体程序,关键是对多种媒体设备的控制和使用,在 Windows3.1 和 Windows95 系 统中,对多媒体设备进行控制主要有三种方法:第一种方法是使用微软公司窗口系统中对多 媒体支持的 MCI,即媒体控制接口,MCI 是多媒体设备和多媒体应用软件之间进行设备无 关的沟通的桥梁。在 VB 和 VC 中,MCI 都得到了很好的支持。第二种方法,通过调用 Windows 的 API(应用程序接口)多媒体相关函数实现媒体控制。第三种方法是使用 OLE(Object Linking & Embedding),即对象链接与嵌入技术,它为不同软件之间共享数据和资源提供了有力的手 段。 我们在本实验中用最简单的方法来实现声音的播放和录制—媒体控制接口编程。有关知 识请阅读附录中“VC 多媒体”部分。 四、实验要求 本实验非常简单和基础,请已经熟悉 VC 和 MCI 这些内容的同学耐心地再做一遍。请同 学们参照示例中的程序代码,编制自己的声卡程序并应用各种声音播放的方法。具体要求如 下: 1. 学会使用 PlaySound()、SndPlaySound()来播放 WAV 文件; 2. 学会使用 mciSendCommand()或 mciSendString()来播放 WAV 文件; 3. 学会使用 mciSendCommand()或 mciSendString()来录制 WAV 文件; 4. 实验完成以后,需要实验室老师检查通过。 5. 在意思清楚、完整的前提下,思考题的回答越精炼越好。 6. 在以上基本要求完成的前提下,有能力的同学可以试一下用 MCI 接口播放其他格式的文 件;制作一个媒体播放器。 如果您在阅读过程中发现疏漏和错误,请您尽快和编者取得联系 network@ustc.edu.cn cxh@ustc.edu.cn
中国科学技术大学电子工程与信息科学系多媒体通信实验室(Copyright1999) 五、使用示例 1.sndPlaySound("ding.wav",SND SYNC); 2.PlaySound("chord.wav",NULL,SND SYNC ) 3.使用两个高级MCI函数 a.播放MDI文件示例 HWND hwnd; MCI OPEN PARMS mciopen; MCI OPEN PARMS mciplay; DWORD rtrn; char b[80]; hwnd=GetActiveWindow()->m hWnd: mciopen.IpstrElementName ="e:\test\test.rmi"; mciopen.IpstrDeviceType ="sequencer"; rtrn =mciSendCommand(0,MCI OPEN,MCI OPEN TYPEMCI OPEN ELEMENT, (DWORD)(LPVOID)&mciopen); if(rtrn !=0){ mciGetErrorString(rtrn,(LPSTR)b,80); ::MessageBox(hwnd,b,"MCI ERROR!",MB_OK); } wDevicelD=mciopen.wDevicelD; mciplay.dwCallback =(DWORD)hwnd; rtrn =mciSendCommand(wDevicelD,MCI PLAY,MCI NOTIFY,(DWORD)(LPVOID)&mciplay); if (rtrn !=OL) mciGetErrorString(rtrn,(LPSTR)b,80): MessageBox(hwnd,b,"MCI Error",MB OK): mciSendCommand(wDevicelD,MCI CLOSE,0,NULL); ∥停止播放 HWND hwnd; MCI GENERIC PARMS mcistop; hwnd=GetActive Window()->m_hWnd; mcistop.dwCallback =(DWORD)hwnd; mciSendCommand(MCI DEVTYPE SEQUENCER,MCI STOP,0,(DWORD)(LPVOID)&mcistop); } 如果您在阅读过程中发现疏漏和错误,请您尽快和编者取得联系network@ustc.cdu.cn cxh@ustc.cdu.cn
中国科学技术大学电子工程与信息科学系 多媒体通信实验室(Copyright 1999) 五、使用示例 1. sndPlaySound("ding.wav",SND_SYNC); 2. PlaySound("chord.wav",NULL,SND_SYNC ); 3. 使用两个高级 MCI 函数 a. 播放 MIDI 文件示例 { HWND hwnd; MCI_OPEN_PARMS mciopen; MCI_OPEN_PARMS mciplay; DWORD rtrn; char b[80]; hwnd=GetActiveWindow()->m_hWnd; mciopen.lpstrElementName = "e:\\test\\test.rmi"; mciopen.lpstrDeviceType = "sequencer" ; rtrn = mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT, (DWORD)(LPVOID)&mciopen); if(rtrn != 0){ mciGetErrorString(rtrn,(LPSTR)b,80); ::MessageBox(hwnd,b,"MCI ERROR!",MB_OK); } wDeviceID = mciopen.wDeviceID; mciplay.dwCallback = (DWORD)hwnd; rtrn = mciSendCommand(wDeviceID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)&mciplay); if (rtrn != 0L){ mciGetErrorString(rtrn,(LPSTR)b,80); ::MessageBox(hwnd,b,"MCI Error",MB_OK); mciSendCommand(wDeviceID,MCI_CLOSE,0,NULL); } } //停止播放 { HWND hwnd; MCI_GENERIC_PARMS mcistop; hwnd=GetActiveWindow()->m_hWnd; mcistop.dwCallback = (DWORD)hwnd; mciSendCommand(MCI_DEVTYPE_SEQUENCER,MCI_STOP,0,(DWORD)(LPVOID)&mcistop); } 如果您在阅读过程中发现疏漏和错误,请您尽快和编者取得联系 network@ustc.edu.cn cxh@ustc.edu.cn
中国科学技术大学电子工程与信息科学系多媒体通信实验室(Copyright1999) b. 录音示例 HWND hwnd: MCI OPEN PARMS mciopen; MCI RECORD PARMS mcil: MCI SAVE PARMS mcisave; DWORD rtrn; char b[80]; hwnd=GetActive Window()->m hWnd: mciopen.IpstrElementName "e:\ding.wav"; mcisave.Ipfilename ="e:\ding.wav"; mciopen.IpstrDeviceType ="waveaudio"; rtrn mciSendCommand(0,MCI OPEN,MCI OPEN_TYPEMCI OPEN ELEMENT, (DWORD)(LPVOID)&mciopen); ifrtrn!=0) mciGetErrorString(rtrn,(LPSTR)b,80); MessageBox(hwnd,b,"MCI ERROR!",MB OK); } wDevicelD mciopen.wDevicelD; mcil.dwCallback =(DWORD)hwnd; rtrn=mciSendCommand(wDeviceID,MCI RECORD,MCI NOTIFY,(DWORD)(LPVOID)&mcil): if (rtrn I=OL){ mciGetErrorString(rtrn,(LPSTR)b,80); MessageBox(hwnd,b,"MCI Error",MB OK), mciSendCommand(wDevicelD,MCI CLOSE,0,NULL); ∥保存到文件并停止录音 HWND hwnd; MCI SAVE PARMS mcisave: MCI_OPEN_PARMS mciopen; DWORD rtrn; char b[80]: hwnd=GetActive Window()->m hWnd; mciopen.lpstrElementName ="e:\ding.wav": mcisave.lpfilename="e:\ding.wav"; mciopen.IpstrDeviceType ="waveaudio"; mcisave.dwCallback =(DWORD)hwnd: 如果您在阅读过程中发现疏漏和错误,请您尽快和编者取得联系network@ustc.cdu.cn cxh@ustc.edu.cn
中国科学技术大学电子工程与信息科学系 多媒体通信实验室(Copyright 1999) b. 录音示例 { HWND hwnd; MCI_OPEN_PARMS mciopen; MCI_RECORD_PARMS mci1; MCI_SAVE_PARMS mcisave; DWORD rtrn; char b[80]; hwnd=GetActiveWindow()->m_hWnd; mciopen.lpstrElementName = "e:\\ding.wav"; mcisave.lpfilename = "e:\\ding.wav"; mciopen.lpstrDeviceType = "waveaudio"; rtrn = mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT, (DWORD)(LPVOID)&mciopen); if(rtrn != 0){ mciGetErrorString(rtrn,(LPSTR)b,80); ::MessageBox(hwnd,b,"MCI ERROR!",MB_OK); } wDeviceID = mciopen.wDeviceID; mci1.dwCallback = (DWORD)hwnd; rtrn = mciSendCommand(wDeviceID,MCI_RECORD,MCI_NOTIFY,(DWORD)(LPVOID)&mci1); if (rtrn != 0L){ mciGetErrorString(rtrn,(LPSTR)b,80); ::MessageBox(hwnd,b,"MCI Error",MB_OK); mciSendCommand(wDeviceID,MCI_CLOSE,0,NULL); } } //保存到文件并停止录音 { HWND hwnd; MCI_SAVE_PARMS mcisave; MCI_OPEN_PARMS mciopen; DWORD rtrn; char b[80]; hwnd=GetActiveWindow()->m_hWnd; mciopen.lpstrElementName = "e:\\ding.wav"; mcisave.lpfilename = "e:\\ding.wav"; mciopen.lpstrDeviceType = "waveaudio"; mcisave.dwCallback = (DWORD)hwnd; 如果您在阅读过程中发现疏漏和错误,请您尽快和编者取得联系 network@ustc.edu.cn cxh@ustc.edu.cn
中国科学技术大学电子工程与信息科学系多媒体通信实验室(Copyright1999) rtrn =mciSendCommand(wDevicelD,MCI SAVE,MCI NOTIFY,(DWORD)(LPVOID)&mcisave); if (rtrn !=OL) mciGetErrorString(rtrn,(LPSTR)b,80); :MessageBox(hwnd b,"MCI Error save",MB OK): mciSendCommand(wDevicelD,MCI CLOSE,0,NULL); } c.实验示例 现给出VC5下的声卡编程样本程序test.exe及其源代码。请同学们参照。 六、思考题 1什么是MCI接口?简述MCI所囊括的内容。 2 Windows下播放波形文件可以采用几种方法,各有什么优缺点? 3简述Windows下多媒体程序开发的特点。 如果您在阅读过程中发现疏漏和错误,请您尽快和编者取得联系network@ustc.cdu.cn cxh@ustc.edu.cn
中国科学技术大学电子工程与信息科学系 多媒体通信实验室(Copyright 1999) rtrn = mciSendCommand(wDeviceID,MCI_SAVE,MCI_NOTIFY,(DWORD)(LPVOID)&mcisave); if (rtrn != 0L){ mciGetErrorString(rtrn,(LPSTR)b,80); ::MessageBox(hwnd,b,"MCI Error save",MB_OK); mciSendCommand(wDeviceID,MCI_CLOSE,0,NULL); } } c. 实验示例 现给出 VC5 下的声卡编程样本程序 test.exe 及其源代码。请同学们参照。 六、思考题 1 什么是 MCI 接口?简述 MCI 所囊括的内容。 2 Windows 下播放波形文件可以采用几种方法,各有什么优缺点? 3 简述 Windows 下多媒体程序开发的特点。 如果您在阅读过程中发现疏漏和错误,请您尽快和编者取得联系 network@ustc.edu.cn cxh@ustc.edu.cn