通过API选择声卡输入通道
2008-12-09 15:07
239 查看
网上此类贴子很多,工作原理就不用介绍了,请看代码:
// AudioInputChannel.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include <windows.h>
#ifndef _INC_MMSYSTEM
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
#endif
void PrintMixerLinesInfo(void);
bool ActiveMixerInputChannel(UINT, UINT);
int _tmain(int argc, _TCHAR* argv[])
{
UINT di, li;
PrintMixerLinesInfo ();
_tcprintf( TEXT("输入设备编号与录音通道编号(例:0 1)") );
_tscanf ( TEXT("%d %d"), &di, &li );
if ( !ActiveMixerInputChannel ( di, li ) ){
_tcprintf( TEXT("设置失败!/n") );
} else {
_tcprintf( TEXT("设置成功!/n") );
PrintMixerLinesInfo ();
}
system("pause");
return 0;
}
void PrintMixerLinesInfo(void)
{
MIXERCAPS mxcaps = {0};
HMIXER hMixer = NULL;
for ( UINT i = 0; i < mixerGetNumDevs (); i++ ){
if ( MMSYSERR_NOERROR != mixerGetDevCaps ( i, &mxcaps, sizeof ( MIXERCAPS ) ) ){ continue; }
if ( MMSYSERR_NOERROR != mixerOpen ( &hMixer, i, NULL, NULL, 0 ) ){ continue; }
MIXERLINE mxl = { sizeof ( MIXERLINE ), 0, 0, 0, 0, 0, MIXERLINE_COMPONENTTYPE_DST_WAVEIN, 0};
if ( MMSYSERR_NOERROR != mixerGetLineInfo ( (HMIXEROBJ)hMixer, &mxl, MIXER_GETLINEINFOF_COMPONENTTYPE ) ){
mixerClose ( hMixer );
continue;
}
_tcprintf( TEXT("%d: %s /t[%s]/n"), i, mxcaps.szPname, mxl.szName );
MIXERCONTROL mxc = { sizeof ( MIXERCONTROL ), 0 };
MIXERLINECONTROLS mxlc = { sizeof ( MIXERLINECONTROLS ), mxl.dwLineID, MIXERCONTROL_CONTROLTYPE_MIXER, 1, mxc.cbStruct, &mxc };
if ( MMSYSERR_NOERROR != mixerGetLineControls ( (HMIXEROBJ)hMixer, &mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE ) ){
mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_MUX;
if ( MMSYSERR_NOERROR != mixerGetLineControls ( (HMIXEROBJ)hMixer, &mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE ) ){
mixerClose ( hMixer );
continue;
}
}
if ( mxc.cMultipleItems == 0 ){
mixerClose ( hMixer );
continue;
}
MIXERCONTROLDETAILS mxcd = { sizeof ( MIXERCONTROLDETAILS ), mxc.dwControlID, 1, 0 };
PMIXERCONTROLDETAILS_LISTTEXT mxcdlts = (PMIXERCONTROLDETAILS_LISTTEXT)malloc ( sizeof ( MIXERCONTROLDETAILS_LISTTEXT ) * mxc.cMultipleItems );
mxcd.cbDetails = sizeof ( MIXERCONTROLDETAILS_LISTTEXT );
mxcd.cMultipleItems = mxc.cMultipleItems;
mxcd.paDetails = mxcdlts;
if ( MMSYSERR_NOERROR != mixerGetControlDetails ( (HMIXEROBJ)hMixer, &mxcd, MIXER_GETCONTROLDETAILSF_LISTTEXT ) ){
free ( mxcdlts );
mixerClose ( hMixer );
continue;
}
PMIXERCONTROLDETAILS_BOOLEAN mxcdbls = (PMIXERCONTROLDETAILS_BOOLEAN)malloc ( sizeof ( MIXERCONTROLDETAILS_BOOLEAN ) * mxc.cMultipleItems );
mxcd.cbDetails = sizeof ( MIXERCONTROLDETAILS_BOOLEAN );
mxcd.cMultipleItems = mxc.cMultipleItems;
mxcd.paDetails = mxcdbls;
if ( MMSYSERR_NOERROR != mixerGetControlDetails ( (HMIXEROBJ)hMixer, &mxcd, MIXER_GETCONTROLDETAILSF_VALUE ) ){
free ( mxcdbls );
mixerClose ( hMixer );
continue;
}
DWORD dwConnections = mxl.cConnections;
DWORD dwDestination = mxl.dwDestination;
for ( DWORD j = 0; j < dwConnections; j++ ){
mxl.dwDestination = dwDestination;
mxl.dwSource = j;
if ( MMSYSERR_NOERROR != mixerGetLineInfo ( (HMIXEROBJ)hMixer, &mxl, MIXER_GETLINEINFOF_DESTINATION | MIXER_GETLINEINFOF_SOURCE ) ){ continue; }
for ( DWORD k = 0; k < mxc.cMultipleItems; k++ ){
if ( mxcdlts[k].dwParam1 == mxl.dwLineID ){
_tcprintf( TEXT("/t%d %s /t%s/n"), j, mxl.szName, mxcdbls[k].fValue ? TEXT("Enabled") : TEXT("Disabled") );
break;
}
}
}
_tcprintf( TEXT("/n") );
free ( mxcdbls );
free ( mxcdlts );
mixerClose ( hMixer );
}
}
bool ActiveMixerInputChannel(UINT nMixerDeviceIndex, UINT nMixerLineIndex)
{
bool result = false;
HMIXER hMixer = NULL;
MIXERCONTROL mxc = { sizeof ( MIXERCONTROL ), 0 };
MIXERLINE mxl = { sizeof ( MIXERLINE ), 0, 0, 0, 0, 0, MIXERLINE_COMPONENTTYPE_DST_WAVEIN, 0};
if ( MMSYSERR_NOERROR != mixerOpen ( &hMixer, nMixerDeviceIndex, NULL, NULL, 0 ) ){ return false; }
if ( MMSYSERR_NOERROR != mixerGetLineInfo ( (HMIXEROBJ)hMixer, &mxl, MIXER_GETLINEINFOF_COMPONENTTYPE ) ){
mixerClose ( hMixer );
return false;
}
MIXERLINECONTROLS mxlc = { sizeof ( MIXERLINECONTROLS ), mxl.dwLineID, MIXERCONTROL_CONTROLTYPE_MIXER, 1, mxc.cbStruct, &mxc };
mxl.dwSource = nMixerLineIndex;
if ( MMSYSERR_NOERROR != mixerGetLineInfo ( (HMIXEROBJ)hMixer, &mxl, MIXER_GETLINEINFOF_DESTINATION | MIXER_GETLINEINFOF_SOURCE ) ){
mixerClose ( hMixer );
return false;
}
if ( MMSYSERR_NOERROR != mixerGetLineControls ( (HMIXEROBJ)hMixer, &mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE ) ){
mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_MUX;
if ( MMSYSERR_NOERROR != mixerGetLineControls ( (HMIXEROBJ)hMixer, &mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE ) ){
mixerClose ( hMixer );
return false;
}
}
if ( mxc.cMultipleItems == 0 ){ mixerClose ( hMixer ); return false; }
PMIXERCONTROLDETAILS_BOOLEAN mxcdbls = (PMIXERCONTROLDETAILS_BOOLEAN)malloc ( sizeof ( MIXERCONTROLDETAILS_BOOLEAN ) * mxc.cMultipleItems );
PMIXERCONTROLDETAILS_LISTTEXT mxcdlts = (PMIXERCONTROLDETAILS_LISTTEXT)malloc ( sizeof ( MIXERCONTROLDETAILS_LISTTEXT ) * mxc.cMultipleItems );
MIXERCONTROLDETAILS mxcd = { sizeof ( MIXERCONTROLDETAILS ), mxc.dwControlID, 1, (HWND)mxc.cMultipleItems, sizeof ( MIXERCONTROLDETAILS_LISTTEXT ), mxcdlts };
if ( MMSYSERR_NOERROR == mixerGetControlDetails ( (HMIXEROBJ)hMixer, &mxcd, MIXER_GETCONTROLDETAILSF_LISTTEXT ) ){
memset ( mxcdbls, 0, sizeof ( MIXERCONTROLDETAILS_BOOLEAN ) * mxc.cMultipleItems );
for ( DWORD i = 0; i < mxc.cMultipleItems; i++ ){
if ( mxcdlts[i].dwParam1 == mxl.dwLineID ){
mxcdbls[i].fValue = 1;
mxcd.paDetails = mxcdbls;
mxcd.cbDetails = sizeof ( MIXERCONTROLDETAILS_BOOLEAN );
result = (MMSYSERR_NOERROR == mixerSetControlDetails ( (HMIXEROBJ)hMixer, &mxcd, MIXER_SETCONTROLDETAILSF_VALUE ) ); break;
}
}
}
free ( mxcdbls );
free ( mxcdlts );
mixerClose ( hMixer );
return result;
}
// AudioInputChannel.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include <windows.h>
#ifndef _INC_MMSYSTEM
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
#endif
void PrintMixerLinesInfo(void);
bool ActiveMixerInputChannel(UINT, UINT);
int _tmain(int argc, _TCHAR* argv[])
{
UINT di, li;
PrintMixerLinesInfo ();
_tcprintf( TEXT("输入设备编号与录音通道编号(例:0 1)") );
_tscanf ( TEXT("%d %d"), &di, &li );
if ( !ActiveMixerInputChannel ( di, li ) ){
_tcprintf( TEXT("设置失败!/n") );
} else {
_tcprintf( TEXT("设置成功!/n") );
PrintMixerLinesInfo ();
}
system("pause");
return 0;
}
void PrintMixerLinesInfo(void)
{
MIXERCAPS mxcaps = {0};
HMIXER hMixer = NULL;
for ( UINT i = 0; i < mixerGetNumDevs (); i++ ){
if ( MMSYSERR_NOERROR != mixerGetDevCaps ( i, &mxcaps, sizeof ( MIXERCAPS ) ) ){ continue; }
if ( MMSYSERR_NOERROR != mixerOpen ( &hMixer, i, NULL, NULL, 0 ) ){ continue; }
MIXERLINE mxl = { sizeof ( MIXERLINE ), 0, 0, 0, 0, 0, MIXERLINE_COMPONENTTYPE_DST_WAVEIN, 0};
if ( MMSYSERR_NOERROR != mixerGetLineInfo ( (HMIXEROBJ)hMixer, &mxl, MIXER_GETLINEINFOF_COMPONENTTYPE ) ){
mixerClose ( hMixer );
continue;
}
_tcprintf( TEXT("%d: %s /t[%s]/n"), i, mxcaps.szPname, mxl.szName );
MIXERCONTROL mxc = { sizeof ( MIXERCONTROL ), 0 };
MIXERLINECONTROLS mxlc = { sizeof ( MIXERLINECONTROLS ), mxl.dwLineID, MIXERCONTROL_CONTROLTYPE_MIXER, 1, mxc.cbStruct, &mxc };
if ( MMSYSERR_NOERROR != mixerGetLineControls ( (HMIXEROBJ)hMixer, &mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE ) ){
mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_MUX;
if ( MMSYSERR_NOERROR != mixerGetLineControls ( (HMIXEROBJ)hMixer, &mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE ) ){
mixerClose ( hMixer );
continue;
}
}
if ( mxc.cMultipleItems == 0 ){
mixerClose ( hMixer );
continue;
}
MIXERCONTROLDETAILS mxcd = { sizeof ( MIXERCONTROLDETAILS ), mxc.dwControlID, 1, 0 };
PMIXERCONTROLDETAILS_LISTTEXT mxcdlts = (PMIXERCONTROLDETAILS_LISTTEXT)malloc ( sizeof ( MIXERCONTROLDETAILS_LISTTEXT ) * mxc.cMultipleItems );
mxcd.cbDetails = sizeof ( MIXERCONTROLDETAILS_LISTTEXT );
mxcd.cMultipleItems = mxc.cMultipleItems;
mxcd.paDetails = mxcdlts;
if ( MMSYSERR_NOERROR != mixerGetControlDetails ( (HMIXEROBJ)hMixer, &mxcd, MIXER_GETCONTROLDETAILSF_LISTTEXT ) ){
free ( mxcdlts );
mixerClose ( hMixer );
continue;
}
PMIXERCONTROLDETAILS_BOOLEAN mxcdbls = (PMIXERCONTROLDETAILS_BOOLEAN)malloc ( sizeof ( MIXERCONTROLDETAILS_BOOLEAN ) * mxc.cMultipleItems );
mxcd.cbDetails = sizeof ( MIXERCONTROLDETAILS_BOOLEAN );
mxcd.cMultipleItems = mxc.cMultipleItems;
mxcd.paDetails = mxcdbls;
if ( MMSYSERR_NOERROR != mixerGetControlDetails ( (HMIXEROBJ)hMixer, &mxcd, MIXER_GETCONTROLDETAILSF_VALUE ) ){
free ( mxcdbls );
mixerClose ( hMixer );
continue;
}
DWORD dwConnections = mxl.cConnections;
DWORD dwDestination = mxl.dwDestination;
for ( DWORD j = 0; j < dwConnections; j++ ){
mxl.dwDestination = dwDestination;
mxl.dwSource = j;
if ( MMSYSERR_NOERROR != mixerGetLineInfo ( (HMIXEROBJ)hMixer, &mxl, MIXER_GETLINEINFOF_DESTINATION | MIXER_GETLINEINFOF_SOURCE ) ){ continue; }
for ( DWORD k = 0; k < mxc.cMultipleItems; k++ ){
if ( mxcdlts[k].dwParam1 == mxl.dwLineID ){
_tcprintf( TEXT("/t%d %s /t%s/n"), j, mxl.szName, mxcdbls[k].fValue ? TEXT("Enabled") : TEXT("Disabled") );
break;
}
}
}
_tcprintf( TEXT("/n") );
free ( mxcdbls );
free ( mxcdlts );
mixerClose ( hMixer );
}
}
bool ActiveMixerInputChannel(UINT nMixerDeviceIndex, UINT nMixerLineIndex)
{
bool result = false;
HMIXER hMixer = NULL;
MIXERCONTROL mxc = { sizeof ( MIXERCONTROL ), 0 };
MIXERLINE mxl = { sizeof ( MIXERLINE ), 0, 0, 0, 0, 0, MIXERLINE_COMPONENTTYPE_DST_WAVEIN, 0};
if ( MMSYSERR_NOERROR != mixerOpen ( &hMixer, nMixerDeviceIndex, NULL, NULL, 0 ) ){ return false; }
if ( MMSYSERR_NOERROR != mixerGetLineInfo ( (HMIXEROBJ)hMixer, &mxl, MIXER_GETLINEINFOF_COMPONENTTYPE ) ){
mixerClose ( hMixer );
return false;
}
MIXERLINECONTROLS mxlc = { sizeof ( MIXERLINECONTROLS ), mxl.dwLineID, MIXERCONTROL_CONTROLTYPE_MIXER, 1, mxc.cbStruct, &mxc };
mxl.dwSource = nMixerLineIndex;
if ( MMSYSERR_NOERROR != mixerGetLineInfo ( (HMIXEROBJ)hMixer, &mxl, MIXER_GETLINEINFOF_DESTINATION | MIXER_GETLINEINFOF_SOURCE ) ){
mixerClose ( hMixer );
return false;
}
if ( MMSYSERR_NOERROR != mixerGetLineControls ( (HMIXEROBJ)hMixer, &mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE ) ){
mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_MUX;
if ( MMSYSERR_NOERROR != mixerGetLineControls ( (HMIXEROBJ)hMixer, &mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE ) ){
mixerClose ( hMixer );
return false;
}
}
if ( mxc.cMultipleItems == 0 ){ mixerClose ( hMixer ); return false; }
PMIXERCONTROLDETAILS_BOOLEAN mxcdbls = (PMIXERCONTROLDETAILS_BOOLEAN)malloc ( sizeof ( MIXERCONTROLDETAILS_BOOLEAN ) * mxc.cMultipleItems );
PMIXERCONTROLDETAILS_LISTTEXT mxcdlts = (PMIXERCONTROLDETAILS_LISTTEXT)malloc ( sizeof ( MIXERCONTROLDETAILS_LISTTEXT ) * mxc.cMultipleItems );
MIXERCONTROLDETAILS mxcd = { sizeof ( MIXERCONTROLDETAILS ), mxc.dwControlID, 1, (HWND)mxc.cMultipleItems, sizeof ( MIXERCONTROLDETAILS_LISTTEXT ), mxcdlts };
if ( MMSYSERR_NOERROR == mixerGetControlDetails ( (HMIXEROBJ)hMixer, &mxcd, MIXER_GETCONTROLDETAILSF_LISTTEXT ) ){
memset ( mxcdbls, 0, sizeof ( MIXERCONTROLDETAILS_BOOLEAN ) * mxc.cMultipleItems );
for ( DWORD i = 0; i < mxc.cMultipleItems; i++ ){
if ( mxcdlts[i].dwParam1 == mxl.dwLineID ){
mxcdbls[i].fValue = 1;
mxcd.paDetails = mxcdbls;
mxcd.cbDetails = sizeof ( MIXERCONTROLDETAILS_BOOLEAN );
result = (MMSYSERR_NOERROR == mixerSetControlDetails ( (HMIXEROBJ)hMixer, &mxcd, MIXER_SETCONTROLDETAILSF_VALUE ) ); break;
}
}
}
free ( mxcdbls );
free ( mxcdlts );
mixerClose ( hMixer );
return result;
}
相关文章推荐
- Vim中通过tags跳转,手动输入选择哪条,"找到 tag: 1 / 2 或更多"
- 利用input type=file和FileReader API实现在浏览器客户端通过选择对话框读取文件
- angularjs 下实现即可通过select选择 也可以通过input输入
- VC++编程通过Bluetooth API调用对话框选择蓝牙设备并显示设备信息
- C++通过MySQL自带API输入随机生成的人物信息
- 通过豆瓣Api,输入ISBN获取图书信息
- 8266 执行./gen_misc.sh 通过管道实现默认输入参数,不用手动选择参数
- 通过选择排序,实现对用户输入的数字进行排序
- 编写Shell程序,通过编写完成compress1、decompress1函数,选择“压缩”或“解压”以及输入文件名,来自动完成文件的压缩、解压过程。
- 利用javascript使html的file不可手动输入文件路径,只可通过[浏览]按钮选择
- 参考选择屏幕(控制选择屏幕两个屏幕,单值输入……通过函数实现单值输入)
- 实现cxDateEdit控件只能通过下拉框选择日期,无法再编辑框输入日期
- 通过豆瓣Api,输入ISBN获取图书信息
- 通过INPUT输入值选择SELECT的值
- ArcGIS API for JavaScript 通过identifyTask实现画线批量选择要素
- vs2015 c#通过ComboBox选择查询类别并在TextBox输入条件进行查询
- 利用ALSA插件将5.1通道音频通过2通道立体声卡播放的配置(.asoundrc配置文件)
- ArcGIS API for JavaScript 通过identifyTask实现点击选择要素
- VC++编程通过Bluetooth API调用对话框选择蓝牙设备并显示设备信息
- 基于jQuery实现select下拉选择可输入附源码下载