|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
08.09.2007, 11:57 | #1 |
Новичок
Джуниор
Регистрация: 08.09.2007
Сообщений: 2
|
Давольно интересная тема. Уже болие полутра лет я разбираюсь с API функциями. Накодил множество больших и мелких программ с их применением. И казалось постиг всю их истину. Ну не так, чтобы разбуди и спроси, но... материала накопил много. И тут на днях друг попросил дописть патч к комерческой проге. Прога-патч, должна уложится в три строчки, но я с ужасом понял (пару дней спустя), что написать ее не судьба. Посему прошу вашей помощи:
Прога должна программно включать и выключать микрофон (как это делается в ручную когда вы регулируете громкость через системный трей). Книги по API и ИНЕТ молчит об этой проблеме. Хотя на мой взгляд она решаема. И я знаю что ее кто-то решал. Прошу, помогите, кто чем сможет. P.S. Программный запуск панели настройки звука с последующей имитаций нажатий клавиш типа TAB и пробел не предлагать, сам могу рассказать |
08.09.2007, 21:42 | #2 |
Пользователь
Регистрация: 01.09.2007
Сообщений: 35
|
Скажу честно - нашел в хелпе, это не моё
uses MMSystem; // Setzt die Lautstarke fur das Mikrofon // Set the volume for the microphone function SetMicrophoneVolume(bValue: Word): Boolean; var {0..65535} hMix: HMIXER; mxlc: MIXERLINECONTROLS; mxcd: TMIXERCONTROLDETAILS; vol: TMIXERCONTROLDETAILS_UNSIGNED; mxc: MIXERCONTROL; mxl: TMixerLine; intRet: Integer; nMixerDevs: Integer; begin // Check if Mixer is available // Uberprufen, ob ein Mixer vorhanden nMixerDevs := mixerGetNumDevs(); if (nMixerDevs < 1) then begin Exit; end; // open the mixer intRet := mixerOpen(@hMix, 0, 0, 0, 0); if intRet = MMSYSERR_NOERROR then begin mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_MICROPH ONE; mxl.cbStruct := SizeOf(mxl); // get line info intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE); if intRet = MMSYSERR_NOERROR then begin ZeroMemory(@mxlc, SizeOf(mxlc)); mxlc.cbStruct := SizeOf(mxlc); mxlc.dwLineID := mxl.dwLineID; mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME; mxlc.cControls := 1; mxlc.cbmxctrl := SizeOf(mxc); mxlc.pamxctrl := @mxc; intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE); if intRet = MMSYSERR_NOERROR then begin { // Microphone Name Label1.Caption := mxlc.pamxctrl.szName; // Min/Max Volume Label2.Caption := IntToStr(mxc.Bounds.dwMinimum) + '->' + IntToStr(mxc.Bounds.dwMaximum); } ZeroMemory(@mxcd, SizeOf(mxcd)); mxcd.dwControlID := mxc.dwControlID; mxcd.cbStruct := SizeOf(mxcd); mxcd.cMultipleItems := 0; mxcd.cbDetails := SizeOf(Vol); mxcd.paDetails := @vol; mxcd.cChannels := 1; // vol.dwValue := mxlc.pamxctrl.Bounds.lMinimum; Set min. Volume / Minimum setzen // vol.dwValue := mxlc.pamxctrl.Bounds.lMaximum; Set max. Volume / Maximum setzen vol.dwValue := bValue; intRet := mixerSetControlDetails(hMix, @mxcd, MIXER_SETCONTROLDETAILSF_VALUE); if intRet <> MMSYSERR_NOERROR then ShowMessage('SetControlDetails Error'); end else ShowMessage('GetLineInfo Error'); end; intRet := mixerClose(hMix); end; end; procedure TForm1.Button1Click(Sender: TObject); begin SetMicrophoneVolume(30000); end; Продолжение дальше |
08.09.2007, 21:44 | #3 |
Пользователь
Регистрация: 01.09.2007
Сообщений: 35
|
{********************************** **********************}
// Enable/disable "Mute Microphone Volume" // Ton fur Mikrofon ein/ausschalten function SetMicrophoneVolumeMute(bMute: Boolean): Boolean; var hMix: HMIXER; mxlc: MIXERLINECONTROLS; mxcd: TMIXERCONTROLDETAILS; vol: TMIXERCONTROLDETAILS_UNSIGNED; mxc: MIXERCONTROL; mxl: TMixerLine; intRet: Integer; nMixerDevs: Integer; mcdMute: MIXERCONTROLDETAILS_BOOLEAN; begin // Check if Mixer is available // Uberprufen, ob ein Mixer vorhanden ist nMixerDevs := mixerGetNumDevs(); if (nMixerDevs < 1) then begin Exit; end; // open the mixer // Mixer offnen intRet := mixerOpen(@hMix, 0, 0, 0, 0); if intRet = MMSYSERR_NOERROR then begin mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_MICROPH ONE; mxl.cbStruct := SizeOf(mxl); // mixerline info intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE); if intRet = MMSYSERR_NOERROR then begin ZeroMemory(@mxlc, SizeOf(mxlc)); mxlc.cbStruct := SizeOf(mxlc); mxlc.dwLineID := mxl.dwLineID; mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_MUTE; mxlc.cControls := 1; mxlc.cbmxctrl := SizeOf(mxc); mxlc.pamxctrl := @mxc; // Get the mute control // Mute control ermitteln intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE); if intRet = MMSYSERR_NOERROR then begin ZeroMemory(@mxcd, SizeOf(mxcd)); mxcd.cbStruct := SizeOf(TMIXERCONTROLDETAILS); mxcd.dwControlID := mxc.dwControlID; mxcd.cChannels := 1; mxcd.cbDetails := SizeOf(MIXERCONTROLDETAILS_BOOLEAN) ; mxcd.paDetails := @mcdMute; mcdMute.fValue := Ord(bMute); // set, unset mute // Stumsschalten ein/aus intRet := mixerSetControlDetails(hMix, @mxcd, MIXER_SETCONTROLDETAILSF_VALUE); { mixerGetControlDetails(hMix, @mxcd, MIXER_GETCONTROLDETAILSF_VALUE); Result := Boolean(mcdMute.fValue); } Result := intRet = MMSYSERR_NOERROR; if intRet <> MMSYSERR_NOERROR then ShowMessage('SetControlDetails Error'); end else ShowMessage('GetLineInfo Error'); end; intRet := mixerClose(hMix); end; end; procedure TForm1.Button1Click(Sender: TObject); begin SetMicrophoneVolumeMute(False); end; И последнее |
08.09.2007, 21:44 | #4 |
Пользователь
Регистрация: 01.09.2007
Сообщений: 35
|
// Enable/disable "Mute" for several mixer line sources.
uses MMSystem; type TMixerLineSourceType = (lsDigital, lsLine, lsMicrophone, lsCompactDisk, lsTelephone, lsWaveOut, lsAuxiliary, lsAnalog, lsLast); function SetMixerLineSourceMute(AMixerLineSo urceType: TMixerLineSourceType; bMute: Boolean): Boolean; var hMix: HMIXER; mxlc: MIXERLINECONTROLS; mxcd: TMIXERCONTROLDETAILS; vol: TMIXERCONTROLDETAILS_UNSIGNED; mxc: MIXERCONTROL; mxl: TMixerLine; intRet: Integer; nMixerDevs: Integer; mcdMute: MIXERCONTROLDETAILS_BOOLEAN; begin Result := False; // Check if Mixer is available // Uberprufen, ob ein Mixer vorhanden ist nMixerDevs := mixerGetNumDevs(); if (nMixerDevs < 1) then begin Exit; end; // open the mixer // Mixer offnen intRet := mixerOpen(@hMix, 0, 0, 0, 0); if intRet = MMSYSERR_NOERROR then begin ZeroMemory(@mxl, SizeOf(mxl)); case AMixerLineSourceType of lsDigital: mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_DIGITAL ; lsLine: mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_LINE; lsMicrophone: mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_MICROPH ONE; lsCompactDisk: mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_COMPACT DISC; lsTelephone: mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_TELEPHO NE; lsWaveOut: mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT ; lsAuxiliary: mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_AUXILIA RY; lsAnalog: mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_ANALOG; lsLast: mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_LAST; end; // mixerline info mxl.cbStruct := SizeOf(mxl); intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE); if intRet = MMSYSERR_NOERROR then begin ZeroMemory(@mxlc, SizeOf(mxlc)); mxlc.cbStruct := SizeOf(mxlc); mxlc.dwLineID := mxl.dwLineID; mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_MUTE; mxlc.cControls := 1; mxlc.cbmxctrl := SizeOf(mxc); mxlc.pamxctrl := @mxc; // Get the mute control // Mute control ermitteln intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE); if intRet = MMSYSERR_NOERROR then begin ZeroMemory(@mxcd, SizeOf(mxcd)); mxcd.cbStruct := SizeOf(TMIXERCONTROLDETAILS); mxcd.dwControlID := mxc.dwControlID; mxcd.cChannels := 1; mxcd.cbDetails := SizeOf(MIXERCONTROLDETAILS_BOOLEAN) ; mxcd.paDetails := @mcdMute; mcdMute.fValue := Ord(bMute); // set, unset mute // Stumsschalten ein/aus intRet := mixerSetControlDetails(hMix, @mxcd, MIXER_SETCONTROLDETAILSF_VALUE); { mixerGetControlDetails(hMix, @mxcd, IXER_GETCONTROLDETAILSF_VALUE); Result := Boolean(mcdMute.fValue); } Result := intRet = MMSYSERR_NOERROR; if intRet <> MMSYSERR_NOERROR then ShowMessage('SetControlDetails Error'); end else ShowMessage('GetLineInfo Error'); end; intRet := mixerClose(hMix); end; end; // Example Call; Beispielaufruf: procedure TForm1.Button1Click(Sender: TObject); begin // Ton ausschalten SetMixerLineSourceMute(lsLine, True); end; |
17.09.2007, 11:14 | #5 |
Новичок
Джуниор
Регистрация: 08.09.2007
Сообщений: 2
|
Спасибо
Спасибо за помощь, очень благодарен.
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Микрофон | werser | Общие вопросы Delphi | 3 | 01.09.2008 08:08 |
микрофон и звук | AET | Работа с сетью в Delphi | 1 | 23.05.2008 10:02 |
Микрофон и JAVA | gadz | Общие вопросы по Java, Java SE, Kotlin | 0 | 29.04.2008 20:08 |
Как отключать и включать explorer(процесс) програмно? | Bill Gates | Win Api | 1 | 29.12.2007 00:05 |