用 mixer系列函数写显示音频音量幅度的程序有问题,高手请进!!

jlfuhappy 2003-08-23 10:30:13
程序源码如下:
HMIXER m_hMixer;
m_nNumMixers = ::mixerGetNumDevs();

m_hMixer = NULL;
::ZeroMemory(&m_mxcaps, sizeof(MIXERCAPS));

// open the first mixer
// A "mapper" for audio mixer devices does not currently exist.
if (m_nNumMixers != 0)
{
if (::mixerOpen(&m_hMixer,0,0,NULL,MIXER_OBJECTF_MIXER)
!= MMSYSERR_NOERROR)
return FALSE;

if (::mixerGetDevCaps((UINT)m_hMixer, &m_mxcaps, sizeof(MIXERCAPS))!= MMSYSERR_NOERROR)
return FALSE;
}
if (m_hMixer == NULL)
return FALSE;

// get dwLineID
MIXERLINE mxl;
mxl.cbStruct = sizeof(MIXERLINE);
// mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;
mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;

if (::mixerGetLineInfo((HMIXEROBJ)m_hMixer,&mxl, MIXER_OBJECTF_HMIXER |MIXER_GETLINEINFOF_COMPONENTTYPE)!= MSYSERR_NOERROR)
return FALSE;

// get dwControlID
MIXERCONTROL mxc;
MIXERLINECONTROLS mxlc;
mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
mxlc.dwLineID = mxl.dwLineID;
mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_PEAKMETER;
mxlc.cControls = 1;
mxlc.cbmxctrl = sizeof(MIXERCONTROL);
mxlc.pamxctrl = &mxc;

MMRESULT mmresult;
mmresult = ::mixerGetLineControls((HMIXEROBJ)m_hMixer, &mxlc,MIXER_OBJECTF_HMIXER | MIXER_GETLINECONTROLSF_ONEBYTYPE);

if (mmresult != MMSYSERR_NOERROR)
{
AfxMessageBox("MMSYSERR_NOERROR");
return FALSE;
}

运行到此处出现错误, 错误为: MIXERR_INVALCONTROL ,是什么原因!!
高手赐教!!
...全文
182 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
WvW 2003-11-22
  • 打赏
  • 举报
回复
是啊, 要看声卡是否支持频谱

很多播放软件都是播放的那个文件的wav频谱, 不是整个声卡的频谱
dkp999 2003-11-14
  • 打赏
  • 举报
回复
楼主说的就是声音的电平指示,我看了好多有关HMIXER的代码,好象不怎么灵光啊,有朋友说道得到的数据量即可表示声音的强度,所以我正想用dsound试试,用wavein也可以的吧
shimx 2003-10-29
  • 打赏
  • 举报
回复
这个我也很想要,也就是音量 、 麦克风的 meter问题,哪位知道的帮一下或给个提示也行啊。谢谢了
jlfuhappy 2003-09-05
  • 打赏
  • 举报
回复
laijunchen(来俊臣),在声卡的属性上是不能看到的。除非自己编程序来试验。
我指的是 向winamp上面的 那个波形显示的 东西。不过winamp显示的是声音的频谱。
我希望的是用一个竖条(好像进度条一样)来显示声音的幅度值,上下跳跃的那种。
laijunchen 2003-09-04
  • 打赏
  • 举报
回复
什么是波形幅度的显示?
我的声卡上的playback显示的只有volume,line in,microphone,
midi,cd audio,pc speaker,aux,wave.就这几种。
用上面的代码都可以调节。

在哪里可以调出来?给我看看。
jlfuhappy 2003-09-03
  • 打赏
  • 举报
回复
laijunchen(来俊臣),很谢谢你,但是我想要实现的是波形幅度的显示(跳跃的那个东西)。
你实现过么!???
jlfuhappy 2003-08-31
  • 打赏
  • 举报
回复
谢谢你们了,顺便问一下,谁知道什么样的声卡可以支持:MIXERCONTROL_CONTROLTYPE_PEAKMETER,功能,就是可以显示录音放音的音量幅度值的。上下跳动的哪个东西。
sin30 2003-08-28
  • 打赏
  • 举报
回复
我以前也遇到"MIXERR_INVALCONTROL"错误,原因好像是 MIXERLINECONTROLS mxlc中的一些成员的初始化与mixerGetLineControls函数的第三个参数不匹配。我没有用到过这个Control Type。我建议你最好枚举“MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE”的所有control 看看你的声卡是否支持“MIXERCONTROL_CONTROLTYPE_PEAKMETER”。
laijunchen 2003-08-28
  • 打赏
  • 举报
回复
这是我写的代码,你看一下可以用吗?

MMRESULT mmReturn; //多媒体系统里的返回值,
MIXERLINE mxl; MIXERLINECONTROLS mxLineControl;
MIXERCONTROL mxControl;
MIXERCONTROLDETAILS mxControlDetail;
// MIXERCONTROLDETAILS_BOOLEAN mxBool; //要的就是这个值。
MIXERCONTROLDETAILS_UNSIGNED mxValue;

//步骤:1,先从输入的ID号找到对应的设备LINE号,
//2。获得对应LINE的CONTROL。
//3。获得对应CONTROL的CONTROLDETAILS。在这个CONTROLDETAIL结构中有一个指针,
// 指向的数据就是我们需要的数据。
//4。要设置的话也要经过这个CONTROLDETAIL结构。

//------------1获得LINE-------------------
mxl.cbStruct=sizeof(mxl);
mxl.dwComponentType=MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;//DST_SPEAKERS;
mmReturn=mixerGetLineInfo((HMIXEROBJ)hmx,&mxl,MIXER_GETLINEINFOF_COMPONENTTYPE);
if(MMSYSERR_NOERROR!=mmReturn)
return false; //有错
//------------2获得CONTROL---------------
mxLineControl.cbStruct=sizeof(mxLineControl);
mxLineControl.cbmxctrl=sizeof(mxControl);
mxLineControl.dwControlType=MIXERCONTROL_CONTROLTYPE_VOLUME; mxLineControl.dwLineID=mxl.dwLineID;
mxLineControl.cControls=1
mxLineControl.pamxctrl=&mxControl;


mmReturn=mixerGetLineControls((HMIXEROBJ)hmx,&mxLineControl,MIXER_GETLINECONTROLSF_ONEBYTYPE);
if(MMSYSERR_NOERROR!=mmReturn)
return false;

//------------3获得DETAIL-----------------
mxControlDetail.cbStruct=sizeof(mxControlDetail);
mxControlDetail.cbDetails=sizeof(mxValue);
mxControlDetail.cChannels=1; mxControlDetail.dwControlID=mxControl.dwControlID;
mxControlDetail.hwndOwner=0;
mxControlDetail.paDetails=&mxValue; //就是要这个返回值
//------------4设置DETAIL-----------------
mxValue.dwValue=lVolume;
mmReturn=mixerSetControlDetails((HMIXEROBJ)hmx,&mxControlDetail,
MIXER_SETCONTROLDETAILSF_VALUE);
if(MMSYSERR_NOERROR!=mmReturn)
return false;
return true;

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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