Страницы

Поиск по вопросам

четверг, 29 ноября 2018 г.

Как правильно регулировать уровень громкости?

У меня получилось использовать только через winmm.dll, но в windows 10 звук регулируется только у приложения, а мне нужно регулировать общий уровень громкости.
[DllImport("winmm.dll")] public static extern int waveOutSetVolume(IntPtr hwo, uint dwVolume); ... waveOutSetVolume(IntPtr.Zero, NewVolumeAllChannels);
По описанию этой функции она принимает указатель на устройство вывода, но как его получить ?
так же пробовал через NAudio, но он отказался работать на windows 10. + перепробовал почти все способы на stackoverflow


Ответ

Это легко сделать с помощью AudioEndpoint API. Работает начиная с Windows 7.
[ComImport] [Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] internal class MMDeviceEnumerator { }
internal enum EDataFlow { eRender, eCapture, eAll, EDataFlow_enum_count }
internal enum ERole { eConsole, eMultimedia, eCommunications, ERole_enum_count }
[Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface IMMDeviceEnumerator { int NotImpl1();
[PreserveSig] int GetDefaultAudioEndpoint(EDataFlow dataFlow, ERole role, out IMMDevice ppDevice);
// the rest is not implemented }
[Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface IMMDevice { [PreserveSig] int Activate(ref Guid iid, int dwClsCtx, IntPtr pActivationParams, [MarshalAs(UnmanagedType.IUnknown)] out object ppInterface);
// the rest is not implemented }
[Guid("657804FA-D6AD-4496-8A60-352752AF4F89"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface IAudioEndpointVolumeCallback { int OnNotify(IntPtr pNotifyData); };
[Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface IAudioEndpointVolume { int RegisterControlChangeNotify(IAudioEndpointVolumeCallback pNotify); int UnregisterControlChangeNotify(IAudioEndpointVolumeCallback pNotify); int GetChannelCount(out int pnChannelCount); int SetMasterVolumeLevel(float fLevelDB, Guid pguidEventContext); int SetMasterVolumeLevelScalar(float fLevel, Guid pguidEventContext); int GetMasterVolumeLevel(out float pfLevelDB); int GetMasterVolumeLevelScalar(out float pfLevel); int SetChannelVolumeLevel(uint nChannel, float fLevelDB, Guid pguidEventContext); int SetChannelVolumeLevelScalar(uint nChannel, float fLevel, Guid pguidEventContext); int GetChannelVolumeLevel(uint nChannel, out float pfLevelDB); int GetChannelVolumeLevelScalar(uint nChannel, out float pfLevel); int SetMute([MarshalAs(UnmanagedType.Bool)] Boolean bMute, Guid pguidEventContext); int GetMute(out bool pbMute); int GetVolumeStepInfo(out uint pnStep, out uint pnStepCount); int VolumeStepUp(Guid pguidEventContext); int VolumeStepDown(Guid pguidEventContext); int QueryHardwareSupport(out uint pdwHardwareSupportMask); int GetVolumeRange(out float pflVolumeMindB, out float pflVolumeMaxdB, out float pflVolumeIncrementdB); }
static void Main(string[] args) { IMMDeviceEnumerator deviceEnumerator = (IMMDeviceEnumerator)(new MMDeviceEnumerator()); IMMDevice speakers = null; IAudioEndpointVolume vol = null; try { deviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia, out speakers); Guid IID_IAudioEndpointVolume = typeof(IAudioEndpointVolume).GUID; object o; speakers.Activate(ref IID_IAudioEndpointVolume, 0, IntPtr.Zero, out o); vol = (IAudioEndpointVolume)o; vol.SetMasterVolumeLevelScalar(0.7f, Guid.Empty); } catch (Exception ex) { Console.WriteLine(ex.Message); } if (vol != null) { Marshal.ReleaseComObject(vol); } if (speakers != null) { Marshal.ReleaseComObject(speakers); }
if (deviceEnumerator != null) { Marshal.ReleaseComObject(deviceEnumerator); } }

Комментариев нет:

Отправить комментарий