Czy może mi ktoś podać procke która wyciszy wejście miktrofonowe i procke ktora je potem "właczy"
Thx of up :)
Czy może mi ktoś podać procke która wyciszy wejście miktrofonowe i procke ktora je potem "właczy"
Thx of up :)
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);
Azgon: [soczek]
Może by tak artykulik o obsłudze mixera? Nie tylko mic?
No w sumie jak sie zmobilizuje to walne arcika :)
// [soczek] - m.M
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?
http://www.codeproject.com/Articles/437537/Muting-all-microphones-on-Vista-Win
Sprawdzone, działa.
Ale przykład w C++...
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?
Ja bym dodał do tego warunek, że jeżeli nie powiedzie się CoCreateInstance(CLASS_IMMDeviceEnumerator
to odpalasz starym sposobem (bez sprawdzania wersji systemu).
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.
a ma ktos kod do kontroli glosnosci dowolnej aplikacji (mikser Windowsa)?
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;
mixera robisz tak samo, tylko musisz podac konkretne 'device'.
Kod który wstawiłem powinien się nadać.
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.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.