mciSendCommand与waveOut...系列函数混合编程

zoumengdiefly 2010-05-01 05:27:23
我在我的程序中用的是mciSendCommand(wDeviceId, ..)函数来播放音频文件,但是想在调用mciSendCommand(wDeviceId, ..)开始播放前用waveOutSetPitch(hWaveOut,num)函数设置播放的音调,现在不知道hWaveOut该赋什么值,请问大家怎么办啊?怎么从wDeviceID得到相应的hWaveOut?这两者应该是一一对应的吧?
...全文
384 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zoumengdiefly 2010-05-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yujia120 的回复:]
最好别MCI和Waveform Audio混用
就直接用waveform统一了吧
[/Quote]
那样感觉很是麻烦啊...还是试试吧
社会栋梁 2010-05-01
  • 打赏
  • 举报
回复
最好别MCI和Waveform Audio混用
就直接用waveform统一了吧
社会栋梁 2010-05-01
  • 打赏
  • 举报
回复
如果Open冲突
你试试不用MCI OPEN
用MMRESULT waveOutGetID(
HWAVEOUT hwo,
LPUINT puDeviceID
);
得到设备ID给
mciSendCommand (wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD) (LPMCI_PLAY_PARMS) &mciPlay) ;//开始播放文件
zoumengdiefly 2010-05-01
  • 打赏
  • 举报
回复
我晕,就是倒数第五行
zoumengdiefly 2010-05-01
  • 打赏
  • 举报
回复

//点击了播放按扭后,开始播放文件.
GetWindowText(hEditFile, szFileName, MAX_PATH);//取得文件名.
if(szFileName==NULL) {
MessageBox(NULL, "请指定文件名", "Error", 0);
return 0;
}
mciOpen.dwCallback = 0 ;
mciOpen.wDeviceID = 0 ;
mciOpen.lpstrDeviceType = NULL ;
mciOpen.lpstrElementName = szFileName ;
mciOpen.lpstrAlias = NULL ;

dwError = mciSendCommand (0, MCI_OPEN, MCI_WAIT | MCI_OPEN_ELEMENT, (DWORD) (LPMCI_OPEN_PARMS) &mciOpen) ;//打开设备

if (dwError != 0)
{
ShowError (hwnd, dwError) ;
return TRUE ;
}
wDeviceID = mciOpen.wDeviceID ;//设备的ID
mciPlay.dwCallback = (DWORD) hwnd ;
mciPlay.dwFrom = 0 ;
mciPlay.dwTo = 0 ;

//waveOutSetPitch(hWaveOut, num); 想在播放之前设置音调,其中hWaveOut不知道该赋予何值.

mciSendCommand (wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD) (LPMCI_PLAY_PARMS) &mciPlay) ;//开始播放文件.

SetWindowText(hBtnPlay, "pause");
iStatus = PLAYING;
...

问题就是上面红字部分.
社会栋梁 2010-05-01
  • 打赏
  • 举报
回复
楼主多贴点代码吧
zoumengdiefly 2010-05-01
  • 打赏
  • 举报
回复
有没有这样的函数啊,输入一个wDeviceId,输出一个hWaveOut,因为wDeviceID是知道的
zoumengdiefly 2010-05-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yujia120 的回复:]
C/C++ code

HWAVEOUT hWaveOut;
if (waveOutOpen (&hWaveOut, WAVE_MAPPER, &waveformat,
DWORD) hwnd, 0, CALLBACK_WINDOW)!= MMSYSERR_NOERROR)
{
...
}
[/Quote]
我之前已经用mciSendCommand(...)Open了一次,再次open会不会重复啊,这样会open失败吧
尹成 2010-05-01
  • 打赏
  • 举报
回复
waveOutOpen (&hWaveOut, wDeviceID, &waveformat, dwCallBack,

dwCallBackData, dwFlags) ;

将第一个参数设定为指向HWAVEOUT(handle to waveform audio output:波形声音输出句柄)型态的变量。从函数传回时,此变量将设定为一个句柄,后面的波形输出呼叫中将使用该句柄。

waveOutOpen的第二个参数是设备ID。它允许函数可以在安装多个声卡的机器上使用。参数的范围在0到系统所安装的波形输出设备数之间。呼叫waveOutGetNumDevs可以获得波形输出设备数,而呼叫waveOutGetDevCaps可以找出每个波形输出设备。如果想消除设备问号,那么您可以用常数WAVE_MAPPER(定义为-1)来选择设备,该设备在「控制台」的「多媒体」中「音效」页面卷标里的「喜欢使用的设备」中指定。另外,如果首选设备不能满足您的需要,而其它设备可以,那么系统将选择其它设备。

第三个参数是指向WAVEFORMATEX结构的指针(后面将详细介绍)。第四个参数是窗口句柄或指向动态链接库中callback函数的指标,用来表示接收波形输出消息的窗口或者callback函数。使用callback函数时,可在第五个参数中指定程序定义的数据。dwFlags参数可设为CALLBACK_WINDOW或CALLBACK_FUNCTION,以表示第四个参数的型态。您也可用WAVE_FORMAT_QUERY标记来检查能否打开设备(实际上并不打开它)。还有其它几个标记可用。
社会栋梁 2010-05-01
  • 打赏
  • 举报
回复

HWAVEOUT hWaveOut;
if (waveOutOpen (&hWaveOut, WAVE_MAPPER, &waveformat,
DWORD) hwnd, 0, CALLBACK_WINDOW)!= MMSYSERR_NOERROR)
{
...
}
社会栋梁 2010-05-01
  • 打赏
  • 举报
回复
waveOutOpen

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧