Wyciszanie mikrofonu

0

Czy może mi ktoś podać procke która wyciszy wejście miktrofonowe i procke ktora je potem "właczy"

Thx of up :)

0

Już sobie poradziłem, wklejam ten kod jak by ktoś go potrzebował:

Do uses trzeba dodać moduł "mmsystem"

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
 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);

   // 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
     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
       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;

Użycie:

SetMicrophoneVolumeMute(False);

lub

SetMicrophoneVolumeMute(True);
0

Azgon: [soczek]

Może by tak artykulik o obsłudze mixera? Nie tylko mic?

0

No w sumie jak sie zmobilizuje to walne arcika :)

// [soczek] - m.M

0

Witam, 11 letni odkop ale temat ten sam.
Powyższy kod pewnie działał na win 98/XP, jednak na win 7 na pewno nie działa.
ma ktoś pomysł na aktualizacje tego kodu pod nowsze systemy?

1

jak w C++ to gorzej, bo najgorzej go znam, ale jakiś czarów tam nie ma, w wolnej chwili postaram się przetłumaczyć na delphi

Kod w C++ naprowadził mnie na rozwiązanie, wstawiam je:

Unit obsługujący interfejsy mixera >= Win Vista.

 unit MMDevApi;

interface

uses
  Windows, ActiveX, ComObj;

const
  CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
  IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
  IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
  IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
  IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
  IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
  IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';

  DEVICE_STATE_ACTIVE = $00000001;
  DEVICE_STATE_UNPLUGGED = $00000002;
  DEVICE_STATE_NOTPRESENT = $00000004;
  DEVICE_STATEMASK_ALL = $00000007;

type
  EDataFlow = TOleEnum;

const
  eRender = $00000000;
  eCapture = $00000001;
  eAll = $00000002;
  EDataFlow_enum_count = $00000003;

type
  ERole = TOleEnum;

const
  eConsole = $00000000;
  eMultimedia = $00000001;
  eCommunications = $00000002;
  ERole_enum_count = $00000003;

type
  IAudioEndpointVolumeCallback = interface(IUnknown)
  ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
  end;

  IAudioEndpointVolume = interface(IUnknown)
  ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
    function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
    function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
    function GetChannelCount(out PInteger): Integer; stdcall;
    function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
    function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): Integer; stdcall;
    function GetMasterVolumeLevel(out fLevelDB: single): Integer; stdcall;
    function GetMasterVolumeLevelScaler(out fLevelDB: single): Integer; stdcall;
    function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
    function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): Integer; stdcall;
    function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): Integer; stdcall;
    function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): Integer; stdcall;
    function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;
    function GetMute(out bMute: Boolean): Integer; stdcall;
    function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): Integer; stdcall;
    function VolumeStepUp(pguidEventContext: PGUID): Integer; stdcall;
    function VolumeStepDown(pguidEventContext: PGUID): Integer; stdcall;
    function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
    function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
  end;

  IAudioMeterInformation = interface(IUnknown)
  ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']
  end;

  IPropertyStore = interface(IUnknown)
  end;

  IMMDevice = interface(IUnknown)
  ['{D666063F-1587-4E43-81F1-B948E807363F}']
    function Activate(const refId: TGUID;
                      dwClsCtx: DWORD;
                      pActivationParams: PInteger;
                      out pEndpointVolume: IAudioEndpointVolume): Hresult; stdCall;
    function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): Hresult; stdcall;
    function GetId(out ppstrId: PLPWSTR): Hresult; stdcall;
    function GetState(out State: Integer): Hresult; stdcall;
  end;


  IMMDeviceCollection = interface(IUnknown)
  ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
  end;

  IMMNotificationClient = interface(IUnknown)
  ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
  end;

  IMMDeviceEnumerator = interface(IUnknown)
  ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
    function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): Hresult; stdcall;
    function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): Hresult; stdcall;
    function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HResult; stdcall;
    function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): Hresult; stdcall;
  end;

implementation

end.

demo:

 
uses
 (..) ActiveX, MMDevApi

(...)
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    SpeakerVolume: IAudioEndpointVolume;
    MicrophoneVolume: IAudioEndpointVolume;
  end;

(...)

procedure TForm1.FormCreate(Sender: TObject);
var
  deviceEnumerator: IMMDeviceEnumerator;
  defaultDevice: IMMDevice;
begin
  CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);

  deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
  defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, SpeakerVolume);

  deviceEnumerator.GetDefaultAudioEndpoint(eCapture, eConsole, defaultDevice);
  defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, MicrophoneVolume);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  VolumeLevel: Single;
begin
  // ustawienie glosnosci wyjscia audio
  if SpeakerVolume = nil then
    Exit;
  VolumeLevel := 0.50;
  SpeakerVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);
  Caption := Format('%1.8f', [VolumeLevel]);

  // wyciszenie mikrofonu
  if MicrophoneVolume = nil then
    Exit;
  MicrophoneVolume.SetMute(True, nil);
end;

pozdrawiam serdecznie

PS. Może warto zrobić mały artykuł o tym (gotowiec), tzn przekleić to w odpowiednie miejsce?

0

Ja bym dodał do tego warunek, że jeżeli nie powiedzie się CoCreateInstance(CLASS_IMMDeviceEnumerator to odpalasz starym sposobem (bez sprawdzania wersji systemu).

0

można dodać obsługę starszych systemów, to już dla chętnych przeróbka, ja skupiam się na tym kodzie dla win 7 oraz 8.

0

a ma ktos kod do kontroli glosnosci dowolnej aplikacji (mikser Windowsa)?

0
    function SetMute(bMute: Boolean; pguidEventContext: PGUID): Integer; stdcall;
    function GetMute(out bMute: Boolean): Integer; stdcall;

zamiast boolean lepiej uzyc integer. Pamietam ze mialem z tym problemy, nie zawsze dzialalo jak bylo boolean;

    function SetMute(bMute: Integer; pguidEventContext: pGuid): HRESULT; stdcall;
    function GetMute(var pbMute: Integer): HRESULT; stdcall;
0

mixera robisz tak samo, tylko musisz podac konkretne 'device'.
Kod który wstawiłem powinien się nadać.

1

Tutaj masz załączone kody i exeki stworzone pod Delphi 7. Pierwszy załacznik - regulacja miskera globalnie. Drugi - dla danej aplikacji (tutaj reguluje sama siebie). Zdaje się bazuje to na kodach które ktoś niedawno zapodawał na forum.

Daj znać czy Tobie te rozwiązania też nie działają? U mnie pod Windows 7 64 bit PL Ultimate jest ok. Także i u Ciebie powinny zachowywać się prawidłowo.

1 użytkowników online, w tym zalogowanych: 0, gości: 1