




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
多媒体实验报告一姓名:方子乙 学号:201100300336班级:2011级软件6班
一、实验目的1、熟悉和掌握使用WindowsMCI进行编程的基本原理和方法。2、熟悉各种不同的音频文件格式。3、了解音频压缩的实现方法。二、实验内容 使用WindowsAPI和一种高级语言,编程实现类似于Windows录音机一类的小工具,要求能播放wav文件、mid文件,并实现打开、播放、暂停、停止、录音、保存(快进、快退)等功能。 更高要求:能实现压缩录音三、实验环境硬件:耳机麦克风软件:VisualC++6.0(或VisualBasic,Java),WindowsMCI四、实验步骤1、创建一个基于对话框的工程,如play。2、在对话框上添加相应的按钮,实现如录音、存盘、打开文件、暂停、播放、停止、前进、后退等项功能。可考虑添加滑动条(slider控件)用来反映目前的播放位置,等等。3、为各个按钮添加相应的函数。4、调试,运行。五、主要代码//playDlg.cpp:implementationfile//#include"stdafx.h"#include"play.h"#include"playDlg.h"#include"MMSYSTEM.H"#include<iostream>#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CPlayDlgdialogCPlayDlg::CPlayDlg(CWnd*pParent/*=NULL*/) :CDialog(CPlayDlg::IDD,pParent){ //{{AFX_DATA_INIT(CPlayDlg) //NOTE:theClassWizardwilladdmemberinitializationhere //}}AFX_DATA_INIT //NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32 m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);}voidCPlayDlg::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPlayDlg) //NOTE:theClassWizardwilladdDDXandDDVcallshere //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CPlayDlg,CDialog) //{{AFX_MSG_MAP(CPlayDlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON_STOP,OnButtonStop) ON_BN_CLICKED(IDC_BUTTON_BACK,OnButtonBack) ON_BN_CLICKED(IDC_BUTTON_FORWARD,OnButtonForward) ON_BN_CLICKED(IDC_BUTTON_OPEN,OnButtonOpen) ON_BN_CLICKED(IDC_BUTTON_SAVE,OnButtonSave) ON_BN_CLICKED(IDC_BUTTON_PLAYORPAUSE,OnButtonPlayorpause) ON_BN_CLICKED(IDC_BUTTON_RECORDORPAUSE,OnButtonRecordorpause) //}}AFX_MSG_MAP ON_MESSAGE(MM_MCINOTIFY,MciNotify)END_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CPlayDlgmessagehandlersBOOLCPlayDlg::OnInitDialog(){ CDialog::OnInitDialog(); //Settheiconforthisdialog.Theframeworkdoesthisautomatically //whentheapplication'smainwindowisnotadialog SetIcon(m_hIcon,TRUE); //Setbigicon SetIcon(m_hIcon,FALSE); //Setsmallicon //TODO:Addextrainitializationhere m_Ready=FALSE; m_PSign=FALSE; //初始化正在播放标识 m_ASign=FALSE; //初始化正在暂停标识 m_MCIDeviceID=0; //初始化设备标识 returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,//thisisautomaticallydoneforyoubytheframework.voidCPlayDlg::OnPaint(){ if(IsIconic()) { CPaintDCdc(this);//devicecontextforpainting SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0); //Centericoninclientrectangle intcxIcon=GetSystemMetrics(SM_CXICON); intcyIcon=GetSystemMetrics(SM_CYICON); CRectrect; GetClientRect(&rect); intx=(rect.Width()-cxIcon+1)/2; inty=(rect.Height()-cyIcon+1)/2; //Drawtheicon dc.DrawIcon(x,y,m_hIcon); } else { CDialog::OnPaint(); }}//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags//theminimizedwindow.HCURSORCPlayDlg::OnQueryDragIcon(){ return(HCURSOR)m_hIcon;}//添加的Notify消息处理LRESULTCPlayDlg::MciNotify(WPARAMwParam,LPARAMlParam){ if(wParam==MCI_NOTIFY_SUCCESSFUL)//成功播放完成后重置标识 { m_Ready=TRUE; m_PSign=FALSE;//设置正在播放标识为FALSE m_ASign=FALSE;//设置正在暂停标识为FALSE mciSendCommand(m_MCIDeviceID,MCI_SEEK,MCI_SEEK_TO_START|MCI_WAIT,NULL); GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(false); SetDlgItemText(IDC_BUTTON_PLAYORPAUSE,"播放"); return0; } return-1;//否则返回错误}voidCPlayDlg::OnButtonPlayorpause(){ //TODO:Addyourcontrolnotificationhandlercodehere if(m_Ready){//文件准备好 if(!m_PSign)//没有音乐播放时 OnButtonPlay(); else //有音乐播放 PauseOrContinue(); GetDlgItem(IDC_BUTTON_BACK)->EnableWindow(true); GetDlgItem(IDC_BUTTON_FORWARD)->EnableWindow(true); } else MessageBox("音乐文件没准备好!!!");}voidCPlayDlg::OnButtonPlay(){ //TODO:Addyourcontrolnotificationhandlercodehere MCI_OPEN_PARMSmciplay; mciplay.dwCallback=(long)GetSafeHwnd(); dwError=mciSendCommand(m_MCIDeviceID,MCI_SEEK,MCI_SEEK_TO_START,NULL); if(dwError) { if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,80)) MessageBox(szErrorBuf,"MCI出错",MB_ICONWARNING); else MessageBox("不明错误标识","MCI出错",MB_ICONWARNING); return; } dwError=mciSendCommand(m_MCIDeviceID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)&mciplay); if(dwError) { if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,80)) MessageBox(szErrorBuf,"MCI出错",MB_ICONWARNING); else MessageBox("不明错误标识","MCI出错",MB_ICONWARNING); return; } m_PSign=true;//设置正在播放标识为TRUE m_ASign=false; SetDlgItemText(IDC_BUTTON_PLAYORPAUSE,"暂停"); GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(true); MCI_STATUS_PARMSstatusParms; statusParms.dwItem=MCI_STATUS_LENGTH; mciSendCommand(m_MCIDeviceID, MCI_STATUS, MCI_STATUS_ITEM|MCI_WAIT, (DWORD)(LPVOID)&statusParms ); dwLength=statusParms.dwReturn;}voidCPlayDlg::OnButtonStop(){ //停止播放 dwError=mciSendCommand(m_MCIDeviceID,MCI_STOP,MCI_WAIT,NULL); if(dwError) { if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)) MessageBox(szErrorBuf,"MCI出错",MB_ICONWARNING); else MessageBox("不明错误标识","MCI出错",MB_ICONWARNING); return; } mciSendCommand(m_MCIDeviceID,MCI_SEEK,MCI_SEEK_TO_START|MCI_WAIT,NULL); m_PSign=FALSE; //设置正在播放标识为FALSE m_ASign=FALSE; //设置正在暂停标识为FALSE GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(false); GetDlgItem(IDC_BUTTON_BACK)->EnableWindow(false); GetDlgItem(IDC_BUTTON_FORWARD)->EnableWindow(false); SetDlgItemText(IDC_BUTTON_PLAYORPAUSE,"播放");}voidCPlayDlg::OnButtonBack(){ //TODO:Addyourcontrolnotificationhandlercodehere MCI_STATUS_PARMSstatusParms; MCI_PLAY_PARMSplayParms; statusParms.dwItem=MCI_STATUS_POSITION; mciSendCommand(m_MCIDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)(LPVOID)&statusParms );dwCurrentPos=statusParms.dwReturn; if(dwCurrentPos<=(dwLength/10)){mciSendCommand(m_MCIDeviceID,MCI_SEEK,MCI_SEEK_TO_END,NULL);mciSendCommand(m_MCIDeviceID,MCI_PLAY,0,(DWORD)(LPVOID)&playParms);}else{ playParms.dwFrom=dwCurrentPos-(DWORD)(dwLength/10);mciSendCommand(m_MCIDeviceID, MCI_PLAY, MCI_FROM, (DWORD)(LPVOID)&playParms); }}voidCPlayDlg::OnButtonForward(){ //TODO:Addyourcontrolnotificationhandlercodehere if(m_PSign){//只有又文件播放时时才可以快进,跳转到文件末尾 MCI_STATUS_PARMSstatusParms; MCI_PLAY_PARMSplayParms; statusParms.dwItem=MCI_STATUS_POSITION; mciSendCommand(m_MCIDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)(LPVOID)&statusParms );dwCurrentPos=statusParms.dwReturn; if((dwLength-dwCurrentPos)<=(dwLength/10)){mciSendCommand(m_MCIDeviceID,MCI_SEEK,MCI_SEEK_TO_END,NULL);mciSendCommand(m_MCIDeviceID,MCI_PLAY,0,(DWORD)(LPVOID)&playParms);}else{ playParms.dwFrom=dwCurrentPos+(DWORD)(dwLength/10);mciSendCommand(m_MCIDeviceID, MCI_PLAY, MCI_FROM, (DWORD)(LPVOID)&playParms); } }}voidCPlayDlg::OnButtonOpen()//仅仅打开文件,得到文件的基本信息{ //TODO:Addyourcontrolnotificationhandlercodehere staticcharszFilter[]="波形音频文件(*.wav)|*.wav|MIDI序列(*.mid)|*.mid||"; CFileDialogdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter); if(dlg.DoModal()==IDOK) { fileext=dlg.GetFileExt(); //获取打开的文件扩展名 m_strBBSFilePath=dlg.GetPathName(); if(m_PSign) //如果程序正在播放,则关闭 { dwError=mciSendCommand(m_MCIDeviceID,MCI_STOP,MCI_WAIT,NULL);//关闭文件 if(dwError) { if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)) MessageBox(szErrorBuf,"MCI出错",MB_ICONWARNING); else MessageBox("不明错误标识","MCI出错",MB_ICONWARNING); return; } dwError=mciSendCommand(m_MCIDeviceID,MCI_CLOSE,0,NULL);//关闭正在播放的声音 if(dwError) //如果关闭不成功,则显示出错的原因 { if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)) MessageBox(szErrorBuf,"MCI出错",MB_ICONWARNING); else MessageBox("不明错误标识","MCI出错",MB_ICONWARNING);//给出相应报告 return; } SetDlgItemText(IDC_BUTTON_PLAYORPAUSE,"播放"); } MCI_OPEN_PARMSmciOpenParms;//定义结构体变量用来存储打开文件的信息和返回的设备标识信息 //没有声音正在播放,则获取打开文件的后辍,并根据后辍决定相应的打开类型 if(!strcmp("wav",fileext)) //当后辍为wav时 mciOpenParms.lpstrDeviceType="waveaudio"; elseif(!strcmp("mid",fileext))//当后辍为mid时 mciOpenParms.lpstrDeviceType="sequencer"; mciOpenParms.lpstrElementName=m_strBBSFilePath.GetBuffer(m_strBBSFilePath.GetLength()); //将打开的文件名存入mciOpenParms结构体中 dwError=mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpenParms); //发送打开文件命令,MCI_OPEN_TYPE参数说明设备类型名包含在mciOpenParms结构体中, //MCI_OPEN_ELEMENT参数说明要打开的文件名包含在mciOpenParams结构体中 if(dwError)//如果打开不成功,则显示出错的原因 { if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)) MessageBox(szErrorBuf,"MCI出错",MB_ICONWARNING); else MessageBox("不明错误标识","MCI出错",MB_ICONWARNING); return; } m_MCIDeviceID=mciOpenParms.wDeviceID;//将获取的设备ID值赋给全局变量m_MCIDeviceID m_Ready=TRUE;//文件已准备好 m_PSign=FALSE;//设置正在播放标识为FALSE m_ASign=FALSE;//设置正在暂停标识为FALSE GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(false); GetDlgItem(IDC_BUTTON_PLAYORPAUSE)->EnableWindow(true); //GetDlgItem(IDC_BUTTON_BACK)->EnableWindow(false); //GetDlgItem(IDC_BUTTON_FORWARD)->EnableWindow(false); GetDlgItem(IDC_BUTTON_RECORDORPAUSE)->EnableWindow(true); SetDlgItemText(IDC_EDIT1,m_strBBSFilePath); }}voidCPlayDlg::OnButtonSave(){ //TODO:Addyourcontrolnotificationhandlercodehere CFileDialogdlg(FALSE,NULL,NULL,OFN_ALLOWMULTISELECT,_T("TextFiles(*.txt)|*.txt|AllFiles(*.*)|*.*||"),AfxGetMainWnd()); if(dlg.DoModal()==IDOK) { CStringm_strBBSFilePath=dlg.GetPathName(); SetDlgItemText(IDC_EDIT1,m_strBBSFilePath); } //保存功能要自己写————这里只得到保存的路径}voidCPlayDlg::PauseOrContinue(){ //TODO:Addyourcontrolnotificationhandlercodehere if(!m_ASign)//音乐正在播放时 { dwError=mciSendCommand(m_MCIDeviceID,MCI_PAUSE,0,NULL); //则暂停播放 if(dwError) { if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)) MessageBox(szErrorBuf,"MCI出错",MB_ICONWARNING); else MessageBox("不明错误标识","MCI出错",MB_ICONWARNING); return; } m_ASign=TRUE; //设置正在暂停标识为TRUE SetDlgItemText(IDC_BUTTON_PLAYORPAUSE,"播放"); } else//音乐暂停时 { dwError=mciSendCommand(m_MCIDeviceID,MCI_RESUME,0,NULL); //则继续播放 if(dwError) { if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)) MessageBox(szErrorBuf,"MCI出错",MB_ICONWARNING); else MessageBox("不明错误标识","MCI出错",MB_ICONWARNING); return; } m_ASign=FALSE; //设置正在暂停标识为false SetDlgItemText(IDC_BUTTON_PLAYORPAUSE,"暂停"); }}voidCPlayDlg::OnButtonRecordorpause(){ //TODO:Addyourcontrolnotificationhandlercodehere GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(false); GetDlgItem(IDC_BUTTON_OPEN)->EnableWindow(false); GetDlgItem(IDC_BUTTON_PLAYORPAUSE)->EnableWindow(false); GetDlgItem(IDC_BUTTON_BACK)->EnableWindow(false); GetDlgItem(IDC_BUTTON_FORWARD)->EnableWindow(false); GetDlgItem(IDC_BUTTON_RECORDORPAUSE)->EnableWindow(false); if(m_PSign) //如果程序正在播放,则关闭 { dwError=mciSendCommand(m_MCIDeviceID,MCI_STOP,MCI_WAIT,NULL);//关闭文件 if(dwError) { if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)) MessageBox(szErrorBuf,"MCI出错",MB_ICONWARNING); else MessageBox("不明错误标识","MCI出错",MB_ICONWARNING); return; } dwError=mciSendCommand(m_MCIDeviceID,MCI_CLOSE,0,NULL);//关闭正在播放的声音 if(dwError) //如果关闭不成功,则显示出错的原因 { if(mciGetErrorString(dwError,(LPSTR)szErrorBuf,MAXERRORLENGTH)) MessageBox(szErrorBuf,"MCI出错",MB_ICONWARNING); else MessageBox("不明错误标识","MCI出错",MB_ICONWARNING);//给出相应报告 return; } SetDlgItemText(IDC_BUTTON_PLAYORPAUSE,"播放"); } m_PSign=FALSE; m_ASign=FALSE; MCI_OPEN_PARMSmciOpenParms; MCI_RECORD_PARMSmciRecordParms; MCI_SAVE_PARMSmciSaveParms; MCI_PLAY_PARMSmciPlayParms; //用新文件打开波形声音,以进行录音 mciOpenParms.lpstrDeviceType="waveaudio"; mciOpenParms.lpstrElementName=""; if(dwError=mciSendCommand(0,MCI_OPEN,MCI_OPEN_ELEMENT|MCI_OPEN_TYPE,(DWORD)(LPVOID)&mciOpenParms)) { //打开设备失败,返回错误码 return; } //打开设备成功,获取设备ID m_MCIDeviceID=mciOpenParms.wDeviceID; //按指定的时间(ms)长度开始录音,等待录音结束再继续执行程序 //设备的时间格式应设为ms mciRecordParms.dwTo=(DWORD)5*1000; if(dwError=mciSendCommand(m_MCIDeviceID,MCI_RECORD,MCI_TO|MCI_WAIT,(DWORD)(LPVOID)&mciRecordParms)) { mciSendCommand(m_MCIDeviceID,MCI_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国血液代谢物POC分析仪行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国蛋糕糖霜和糖霜行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国蔬菜种植行业市场发展分析及前景趋势与投资研究报告
- 2025-2030中国自走式喷雾机行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国自动贴标签机行业市场深度调研及前景趋势与投资研究报告
- 2025-2030中国自动柜员机(ATM)安全系统行业市场发展趋势与前景展望战略研究报告
- 企业高校项目合作协议
- 屠宰场租赁合同
- 2025-2030中国膀胱过度活动症治疗药行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国肠镜行业市场发展趋势与前景展望战略研究报告
- 2022信息物理系统(CPS)安全技术研究
- 2024年南阳农业职业学院单招职业适应性测试题库附答案
- 2024年药学服务技能大赛(省赛)备考试题库(含答案)
- 2.2.3 茶会场地布置
- MOOC 音乐与科学-南京邮电大学 中国大学慕课答案
- 初中地理实验设计案例
- 施工现场一级动火作业审批表
- 污水管网巡查及养护投标方案(技术标)
- 肿瘤患者延续护理
- 《长方体和正方体的展开图》-课件
- 数字图像处理在航空航天中的应用
评论
0/150
提交评论