Конференция "Media" » Уровень громкости записи микрофона [D7, WinXP]
 
  • iiunbreakableii (11.11.09 15:22) [0]
    Привет, Всем!
    Помогите пожалуйста разобраться. Мне нужно получить доступ к микшерам винды, а именно к тому который отвечает за регулировку уровня "микрофона" в "уровне записи".

    Откопал в инете сорцы, в которых реализована регулировка "микрофона", находящегося в "Воспроизведении", только вот не знаю как его модифицировать, чтобы получилось именно то, что мне надо.

    Вот то, что я нашёл:

    function TForm1.SetMicrophoneVolume(bValue: Word): Boolean;
    var { 0..65535 }
     hMix: HMIXER;
     mxlc: MIXERLINECONTROLS;
     mxcd: TMIXERCONTROLDETAILS;
     vol: TMIXERCONTROLDETAILS_UNSIGNED;
     mxc: MIXERCONTROL;
     mxl: TMixerLine;
     intRet: Integer;
     nMixerDevs: Integer;
     PrevVol: Pointer;
    begin
     // Check if Mixer is available
     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_MICROPHONE;
       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
           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 := 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;



    Подскажите пожалуйста, что надо переделать, чтобы получилось доступ к другим регуляторам, и в частности к "микрофону" из "уровня записи".

    Спасибо!!!

    P.S. без использования сторонних компонентов )
  • iiunbreakableii (11.11.09 16:27) [1]
    Народ, ну помогите пожалуйста, а то уже не знаю, что дела :(
  • Сергей М. © (12.11.09 09:35) [2]
  • iiunbreakableii (12.11.09 13:57) [3]
    Сергей М., спасибо за статью, но я уже её смотрел, там реализована регулировка "микрофона" , находящегося в "громкости", а мне бы найти, как отрегулировать "микрофон" в "уровне записи".
    Я пробовал модифицировать данный код, писал:
    mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_WAVEIN;


    ,но по-моему этого мало, нужно ещё что-то поменять, только вот что?
    Помогите кто знает, очень прошу :)
  • Омлет © (12.11.09 15:42) [4]
    > [3] iiunbreakableii   (12.11.09 13:57)
    > но по-моему этого мало

    Проверил или предположил?
  • iiunbreakableii (12.11.09 16:15) [5]
    проверил.
    у меня почти получилось.

    я подправил на:

    mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
    mxl.cbStruct := SizeOf(mxl);
    intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);
    mxl.dwSource:=1;
    intRet := mixerGetLineInfo(HMix,@mxl,MIXER_GETLINEINFOF_SOURCE or MIXER_OBJECTF_HMIXER);



    после этого всё работает, только вот мне не нравится "mxl.dwSource:=1;". на моём компе то работает, а может на др компах с др аудиокартами это не пройдёт?, что делать?
  • Zahar (12.11.09 21:15) [6]

    > что делать?

    перечислять все линии микшера и проверять микрофон ли это
    кстати в висте и выше этот код скорей всего будет бесполезен
  • semion (16.03.10 18:04) [7]
    Таки не работает (виндовс7).
    подскажите как в висте поймать микрофон ?
    (возможно с включенной галкой "прослушивать через данное устройство")
  • Eraser © (17.03.10 18:44) [8]
    > [7] semion   (16.03.10 18:04)

    http://code.progler.ru/view/627
 
Конференция "Media" » Уровень громкости записи микрофона [D7, WinXP]
Есть новые Нет новых   [134430   +4][b:0][p:0.002]