Микрофон
Как сделать регулятор чуствительности(громкости) микрофона?
Ниже приведу набросок программы на С, осуществляющий работу с микшером микрофона.
Сначала инициализируем микшер:
int nd=mixerGetNumDevs();
if(nd<1) throw "Отсутствуют микшеры!";
MIXERCAPS caps;
mixerGetDevCaps(0,&caps,sizeof(caps));
WaveOutCheck(mixerOpen(&hMixer,0,Callback,0,CALLBACK_WINDOW));
MIXERLINE line;
line.cbStruct=sizeof(line);
line.dwDestination=1;
line.dwSource=1;
WaveOutCheck(mixerGetLineInfo(hMixer,&line,MIXER_GETLINEINFOF_DESTINATION|MIXER_OBJECTF_HMIXER));
int Connections=line.cConnections;
for(int Source=0;Source<Connections;Source++)
{
line.dwDestination=1;
line.dwLineID=1;
line.dwSource=Source;
WaveOutCheck(mixerGetLineInfo(hMixer,&line,MIXER_GETLINEINFOF_SOURCE|MIXER_OBJECTF_HMIXER));
if(line.dwComponentType==MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE)
break;
}
MIXERCONTROL *Control;
MIXERLINECONTROLS ctrl;
ctrl.cbStruct=sizeof(ctrl);
ctrl.dwLineID=line.dwLineID;
ctrl.cControls=line.cControls;
ctrl.cbmxctrl=sizeof(MIXERCONTROL);
Control=new MIXERCONTROL;
ctrl.pamxctrl=Control;
ctrl.dwControlType=MIXERCONTROL_CONTROLTYPE_VOLUME;
WaveOutCheck(mixerGetLineControls(hMixer,&ctrl,MIXER_GETLINECONTROLSF_ONEBYTYPE|MIXER_OBJECTF_HMIXER));
detailsMicVolume.cbStruct=sizeof(detailsMicVolume);
detailsMicVolume.cChannels=1;
detailsMicVolume.hwndOwner=0;
detailsMicVolume.dwControlID=Control->dwControlID;
detailsMicVolume.cbDetails=sizeof(MIXERCONTROLDETAILS_UNSIGNED);//Control->Metrics.cbCustomData;
detailsMicVolume.paDetails=(MIXERCONTROLDETAILS_UNSIGNED*) new MIXERCONTROLDETAILS_UNSIGNED;
delete Control;
Дальше можно изменять уровень чувствительности микрофона:
((MIXERCONTROLDETAILS_UNSIGNED*)detailsMicVolume.paDetails)->dwValue=Volume;
WaveOutCheck(mixerSetControlDetails(hMixer,&detailsMicVolume,MIXER_OBJECTF_HMIXER));
Считываем текушее значение чувствительности:
WaveOutCheck(mixerGetControlDetails(hMixer,&detailsMicVolume,MIXER_GETCONTROLDETAILSF_VALUE|
MIXER_OBJECTF_HMIXER));
Volume=((MIXERCONTROLDETAILS_UNSIGNED*)detailsMicVolume.paDetails)->dwValue;
Далее закрываем хенделы устройств:
delete (MIXERCONTROLDETAILS_UNSIGNED*)detailsMicVolume.paDetails;