Как получить уровень громкости (dB) системный Windows | Python

Discussion in 'Болталка' started by Matrix001, 4 Jan 2021.

  1. altblitz

    altblitz Elder - Старейшина

    Joined:
    5 Jun 2009
    Messages:
    3,691
    Likes Received:
    3,145
    Reputations:
    236
    Так в OS Windows это легче простого.
    В настрийках аудо карты выставляется нужный уровень в первую очередь, а затем, в Settings Windows устанавливается уровень громкоси, выбрав нужную аудио карту.
    В Settings есть три-четыре таба, и в одном из них это и настраивается.
     
  2. Matrix001

    Matrix001 Active Member

    Joined:
    18 Aug 2016
    Messages:
    262
    Likes Received:
    146
    Reputations:
    3
    Сейчас вообще ничего не понял !!! Ты походу не понял что мне надо !
     
  3. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,492
    Reputations:
    25
    Дык есть еще такое:
    https://docs.microsoft.com/en-us/wi...intvolume-iaudioendpointvolume-getvolumerange

    Показывает минимум и максимум в децибелах.
     
  4. mankurt13

    mankurt13 Well-Known Member

    Joined:
    18 Oct 2019
    Messages:
    378
    Likes Received:
    1,538
    Reputations:
    3
    Откуда венда узнает какой уровень шума создает устройство, подключенное к ней ауксиальным кабелем?
     
  5. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,492
    Reputations:
    25
    Гугли IAudioEndpointVolume по msdn и будет тебе счастье.
     
  6. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,492
    Reputations:
    25
    Он скорей всего имеет ввиду относительный уровень звука. Ну как когда на динамик в трее нажимаешь...
     
  7. mankurt13

    mankurt13 Well-Known Member

    Joined:
    18 Oct 2019
    Messages:
    378
    Likes Received:
    1,538
    Reputations:
    3
    Ну так проценты это и есть нормальная относительная величина. Надо брать и не выёживаться.
     
    DartPhoenix likes this.
  8. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,492
    Reputations:
    25
    https://docs.microsoft.com/en-us/wi...udioendpointvolume-getmastervolumelevelscalar

    Вот еще. Тоже msdn и тот же интерфейс. Выдает значение "громкости" по шкале от 0.0 до 1.0.
    Было-бы желание называется... И это уже не говоря о низкоуровневых возможностях.
    ==================
    Пардон, понаоткрывал окон - путаюсь иногда.
     
  9. Matrix001

    Matrix001 Active Member

    Joined:
    18 Aug 2016
    Messages:
    262
    Likes Received:
    146
    Reputations:
    3
    Тут python-н как бы, сверхвысокоуровневый язык и вот что я нашел
    Code:
    import ctypes
    import comtypes
    from ctypes import wintypes
    
    MMDeviceApiLib = comtypes.GUID(
        '{2FDAAFA3-7523-4F66-9957-9D5E7FE698F6}')
    IID_IMMDevice = comtypes.GUID(
        '{D666063F-1587-4E43-81F1-B948E807363F}')
    IID_IMMDeviceCollection = comtypes.GUID(
        '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}')
    IID_IMMDeviceEnumerator = comtypes.GUID(
        '{A95664D2-9614-4F35-A746-DE8DB63617E6}')
    IID_IAudioEndpointVolume = comtypes.GUID(
        '{5CDF2C82-841E-4546-9722-0CF74078229A}')
    CLSID_MMDeviceEnumerator = comtypes.GUID(
        '{BCDE0395-E52F-467C-8E3D-C4579291692E}')
    
    # EDataFlow
    eRender = 0 # audio rendering stream
    eCapture = 1 # audio capture stream
    eAll = 2 # audio rendering or capture stream
    
    # ERole
    eConsole = 0 # games, system sounds, and voice commands
    eMultimedia = 1 # music, movies, narration
    eCommunications = 2 # voice communications
    
    LPCGUID = REFIID = ctypes.POINTER(comtypes.GUID)
    LPFLOAT = ctypes.POINTER(ctypes.c_float)
    LPDWORD = ctypes.POINTER(wintypes.DWORD)
    LPUINT = ctypes.POINTER(wintypes.UINT)
    LPBOOL = ctypes.POINTER(wintypes.BOOL)
    PIUnknown = ctypes.POINTER(comtypes.IUnknown)
    
    class IMMDevice(comtypes.IUnknown):
        _iid_ = IID_IMMDevice
        _methods_ = (
            comtypes.COMMETHOD([], ctypes.HRESULT, 'Activate',
                (['in'], REFIID, 'iid'),
                (['in'], wintypes.DWORD, 'dwClsCtx'),
                (['in'], LPDWORD, 'pActivationParams', None),
                (['out','retval'], ctypes.POINTER(PIUnknown), 'ppInterface')),
            comtypes.STDMETHOD(ctypes.HRESULT, 'OpenPropertyStore', []),
            comtypes.STDMETHOD(ctypes.HRESULT, 'GetId', []),
            comtypes.STDMETHOD(ctypes.HRESULT, 'GetState', []))
    
    PIMMDevice = ctypes.POINTER(IMMDevice)
    
    class IMMDeviceCollection(comtypes.IUnknown):
        _iid_ = IID_IMMDeviceCollection
    
    PIMMDeviceCollection = ctypes.POINTER(IMMDeviceCollection)
    
    class IMMDeviceEnumerator(comtypes.IUnknown):
        _iid_ = IID_IMMDeviceEnumerator
        _methods_ = (
            comtypes.COMMETHOD([], ctypes.HRESULT, 'EnumAudioEndpoints',
                (['in'], wintypes.DWORD, 'dataFlow'),
                (['in'], wintypes.DWORD, 'dwStateMask'),
                (['out','retval'], ctypes.POINTER(PIMMDeviceCollection),
                 'ppDevices')),
            comtypes.COMMETHOD([], ctypes.HRESULT, 'GetDefaultAudioEndpoint',
                (['in'], wintypes.DWORD, 'dataFlow'),
                (['in'], wintypes.DWORD, 'role'),
                (['out','retval'], ctypes.POINTER(PIMMDevice), 'ppDevices')))
        @classmethod
        def get_default(cls, dataFlow, role):
            enumerator = comtypes.CoCreateInstance(
                CLSID_MMDeviceEnumerator, cls, comtypes.CLSCTX_INPROC_SERVER)
            return enumerator.GetDefaultAudioEndpoint(dataFlow, role)
    
    class IAudioEndpointVolume(comtypes.IUnknown):
        _iid_ = IID_IAudioEndpointVolume
        _methods_ = (
            comtypes.STDMETHOD(ctypes.HRESULT, 'RegisterControlChangeNotify', []),
            comtypes.STDMETHOD(ctypes.HRESULT, 'UnregisterControlChangeNotify', []),
            comtypes.COMMETHOD([], ctypes.HRESULT, 'GetChannelCount',
                (['out', 'retval'], LPUINT, 'pnChannelCount')),
            comtypes.COMMETHOD([], ctypes.HRESULT, 'SetMasterVolumeLevel',
                (['in'], ctypes.c_float, 'fLevelDB'),
                (['in'], LPCGUID, 'pguidEventContext', None)),
            comtypes.COMMETHOD([], ctypes.HRESULT, 'SetMasterVolumeLevelScalar',
                (['in'], ctypes.c_float, 'fLevel'),
                (['in'], LPCGUID, 'pguidEventContext', None)),
            comtypes.COMMETHOD([], ctypes.HRESULT, 'GetMasterVolumeLevel',
                (['out','retval'], LPFLOAT, 'pfLevelDB')),
            comtypes.COMMETHOD([], ctypes.HRESULT, 'GetMasterVolumeLevelScalar',
                (['out','retval'], LPFLOAT, 'pfLevel')),
            comtypes.COMMETHOD([], ctypes.HRESULT, 'SetChannelVolumeLevel',
                (['in'], wintypes.UINT, 'nChannel'),
                (['in'], ctypes.c_float, 'fLevelDB'),
                (['in'], LPCGUID, 'pguidEventContext', None)),
            comtypes.COMMETHOD([], ctypes.HRESULT, 'SetChannelVolumeLevelScalar',
                (['in'], wintypes.UINT, 'nChannel'),
                (['in'], ctypes.c_float, 'fLevel'),
                (['in'], LPCGUID, 'pguidEventContext', None)),
            comtypes.COMMETHOD([], ctypes.HRESULT, 'GetChannelVolumeLevel',
                (['in'], wintypes.UINT, 'nChannel'),
                (['out','retval'], LPFLOAT, 'pfLevelDB')),
            comtypes.COMMETHOD([], ctypes.HRESULT, 'GetChannelVolumeLevelScalar',
                (['in'], wintypes.UINT, 'nChannel'),
                (['out','retval'], LPFLOAT, 'pfLevel')),
            comtypes.COMMETHOD([], ctypes.HRESULT, 'SetMute',
                (['in'], wintypes.BOOL, 'bMute'),
                (['in'], LPCGUID, 'pguidEventContext', None)),
            comtypes.COMMETHOD([], ctypes.HRESULT, 'GetMute',
                (['out','retval'], LPBOOL, 'pbMute')),
            comtypes.COMMETHOD([], ctypes.HRESULT, 'GetVolumeStepInfo',
                (['out','retval'], LPUINT, 'pnStep'),
                (['out','retval'], LPUINT, 'pnStepCount')),
            comtypes.COMMETHOD([], ctypes.HRESULT, 'VolumeStepUp',
                (['in'], LPCGUID, 'pguidEventContext', None)),
            comtypes.COMMETHOD([], ctypes.HRESULT, 'VolumeStepDown',
                (['in'], LPCGUID, 'pguidEventContext', None)),
            comtypes.COMMETHOD([], ctypes.HRESULT, 'QueryHardwareSupport',
                (['out','retval'], LPDWORD, 'pdwHardwareSupportMask')),
            comtypes.COMMETHOD([], ctypes.HRESULT, 'GetVolumeRange',
                (['out','retval'], LPFLOAT, 'pfLevelMinDB'),
                (['out','retval'], LPFLOAT, 'pfLevelMaxDB'),
                (['out','retval'], LPFLOAT, 'pfVolumeIncrementDB')))
        @classmethod
        def get_default(cls):
            endpoint = IMMDeviceEnumerator.get_default(eRender, eMultimedia)
            interface = endpoint.Activate(cls._iid_, comtypes.CLSCTX_INPROC_SERVER)
            return ctypes.cast(interface, ctypes.POINTER(cls))
    For example:
    
    if __name__ == '__main__':
    
        def show_vol(ev):
            voldb = ev.GetMasterVolumeLevel()
            volsc = ev.GetMasterVolumeLevelScalar()
            volst, nstep = ev.GetVolumeStepInfo()
            print('Master Volume (dB): %0.4f' % voldb)
            print('Master Volume (scalar): %0.4f' % volsc)
            print('Master Volume (step): %d / %d' % (volst, nstep))
    
        def test():
            ev = IAudioEndpointVolume.get_default()
            vol = ev.GetMasterVolumeLevelScalar()
            vmin, vmax, vinc = ev.GetVolumeRange()
            print('Volume Range (min, max, step) (dB): '
                  '%0.4f, %0.4f, %0.4f' % (vmin, vmax, vinc))
            show_vol(ev)
            try:
                print('\nIncrement the master volume')
                ev.VolumeStepUp()
                show_vol(ev)
                print('\nDecrement the master volume twice')
                ev.VolumeStepDown()
                ev.VolumeStepDown()
                show_vol(ev)
                print('\nSet the master volume to 0.75 scalar')
                ev.SetMasterVolumeLevelScalar(0.75)
                show_vol(ev)
                print('\nSet the master volume to 0.25 scalar')
                ev.SetMasterVolumeLevelScalar(0.25)
                show_vol(ev)
            finally:
                ev.SetMasterVolumeLevelScalar(vol)
    
        comtypes.CoInitialize()
     
  10. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,492
    Reputations:
    25
  11. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,492
    Reputations:
    25
    Ну правильно нашел. Какой он там уровневый - глубоко допезды. Он имеет же возможность обращаться к низкоуровневым механизмам ? Имеет. Остается только обращаться :)
     
  12. Matrix001

    Matrix001 Active Member

    Joined:
    18 Aug 2016
    Messages:
    262
    Likes Received:
    146
    Reputations:
    3
  13. Matrix001

    Matrix001 Active Member

    Joined:
    18 Aug 2016
    Messages:
    262
    Likes Received:
    146
    Reputations:
    3
    Это не то что мне надо, функция (GetMasterVolumeLevelScalar) возврощает тоже самое что и функция GetMasterVolumeLevel только в таком виде (0.333333121241) когда у меня установлена громкость на 33 из 100 значений.
    [​IMG]
     
  14. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,492
    Reputations:
    25
    А связи между 0.3333... и громкостью на 33 нет никакой ? :) Просто интересно...
     
  15. Matrix001

    Matrix001 Active Member

    Joined:
    18 Aug 2016
    Messages:
    262
    Likes Received:
    146
    Reputations:
    3
    Эт прям очень очень печально понимать что python не может справиться элементарно с элементарной задачей
     
  16. Matrix001

    Matrix001 Active Member

    Joined:
    18 Aug 2016
    Messages:
    262
    Likes Received:
    146
    Reputations:
    3
    Я же и написал что он ее так и показывает, то ск я высавил процентов громкости только через 0.
     
  17. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,492
    Reputations:
    25
    Действительно... :)
     
  18. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,492
    Reputations:
    25
    Нууу. Можешь умножить на 100 и взять целую часть. Не ?
     
  19. Matrix001

    Matrix001 Active Member

    Joined:
    18 Aug 2016
    Messages:
    262
    Likes Received:
    146
    Reputations:
    3
    :oops:
     
  20. Matrix001

    Matrix001 Active Member

    Joined:
    18 Aug 2016
    Messages:
    262
    Likes Received:
    146
    Reputations:
    3
    Я не понимаю, мне нужно живое значение подоваемого на микшер уровня входного сигнала когда что-то играет а не то какой процент громкости я выставил что бы хорошо это слышать !??? ЗАчем ??