change volume of single audio device

M

moldevort87

hi,

i'd like to change the volume of my av-receiver (HDMI) and speakers (analogue) simultaneously. in order to use both outputs i'm using virtual audio cable but if i set it as default device and change volume, hdmi and analogue remains unchanged.
i intend to script a command line tool in python providing to change the volume of a single device (eg "setvolume {deviceID} {volume}")

i've been looking for a similar tool, but none of them worked (eg nircmd); i'm using Win7.

while looking for a solution i found that snippet of code

Code:
#!/usr/bin/env python
#Boa:PyApp:main
modules = {}

import ctypes

mixerSetControlDetails = (
ctypes.windll.winmm.mixerSetControlDetails)

mixerGetControlDetails = (
ctypes.windll.winmm.mixerGetControlDetailsA)

# Some constants
MIXER_OBJECTF_MIXER = 0 # mmsystem.h
VOLUME_CONTROL_ID = 0     # Same on all machines?
SPEAKER_LINE_FADER_ID = 0 # "Identifier <identifier> in OID value does not resolve to a positive integer"
MINIMUM_VOLUME = 0     # fader control (MSDN Library)
MAXIMUM_VOLUME = 65535 # fader control (MSDN Library)

class MIXERCONTROLDETAILS(ctypes.Structure):
_pack_ = 1
_fields_ = [('cbStruct', ctypes.c_ulong),
('dwControlID', ctypes.c_ulong),
('cChannels', ctypes.c_ulong),
('cMultipleItems', ctypes.c_ulong),
('cbDetails', ctypes.c_ulong),
('paDetails', ctypes.POINTER(ctypes.c_ulong))]

def setVolume(volume):
"""Set the speaker volume on the 'Volume Control' mixer"""
if not (MINIMUM_VOLUME <= volume <= MAXIMUM_VOLUME):
raise ValueError, "Volume out of range"
cd = MIXERCONTROLDETAILS(ctypes.sizeof(MIXERCONTROLDETAILS),
SPEAKER_LINE_FADER_ID,
1, 0,
ctypes.sizeof(ctypes.c_ulong),
ctypes.pointer(ctypes.c_ulong(volume)))

ret = mixerSetControlDetails(VOLUME_CONTROL_ID,
ctypes.byref(cd),
MIXER_OBJECTF_MIXER)

if ret != 0:
print WindowsError, "Error %d while setting volume" % ret

ret = mixerGetControlDetails(VOLUME_CONTROL_ID,
ctypes.byref(cd),
MIXER_OBJECTF_MIXER)
if ret != 0:
print WindowsError, "Error %d while setting volume" % ret
else:
print 'cbStruct', cd.cbStruct
print 'dwControlID', cd.dwControlID
print 'cChannels', cd.cChannels
print 'cMultipleItems', cd.cMultipleItems
print 'cbDetails', cd.cbDetails
print 'paDetails', cd.paDetails.contents
return

setVolume((2**16-1)/2)

from ctypes import *
from struct import *

winmm= windll.winmm
print
print 'waveOutGetNumDevs=',winmm.waveOutGetNumDevs()
print 'mixerGetNumDevs', winmm.mixerGetNumDevs()

wvcps= ' '*52
print 'res:', winmm.waveOutGetDevCapsA(0,wvcps,len(wvcps))

res = unpack('IIL32cLI', wvcps)
wMid=res[0]
wPid=res[1]
vDriverVersion=res[2]
szPname=''.join(res[3:35])
dwFormats=res[35]
wChannels=res[36]
print 'wMid=',wMid
print 'wPid=',wPid
print 'vDriverVersion=',vDriverVersion
print 'szPname=',szPname
print 'dwFormats=',dwFormats
print 'wChannels=',wChannels

vol=c_ulong()
print 'res', winmm.waveOutGetVolume(0, byref(vol))

print 'l:', vol.value & 0xffff, 'r:',vol.value >> 16 # left, right


on executing i get
Code:
<<type 'exceptions.WindowsError'> Error 11 while setting volume
<type 'exceptions.WindowsError'> Error 11 while setting volume

waveOutGetNumDevs= 3
mixerGetNumDevs 4
res: 0
wMid= 6553601
wPid= 1537
vDriverVersion= 2037083727
szPname= o (AMD High Definition Audi
dwFormats= 2
wChannels= 36
res 0
l: 65535 r: 0

Could anyone tell me why this error occurs?
 
S

Steven D'Aprano

on executing i get
Code:
<<type 'exceptions.WindowsError'> Error 11 while setting volume
<type 'exceptions.WindowsError'> Error 11 while setting volume

waveOutGetNumDevs= 3
mixerGetNumDevs 4
res: 0
wMid= 6553601
wPid= 1537
vDriverVersion= 2037083727
szPname= o (AMD High Definition Audi
dwFormats= 2
wChannels= 36
res 0
l: 65535 r: 0

Could anyone tell me why this error occurs?

It's a Windows error, not a Python error. You'll need to look up the
documentation for the Windows API used (I think it is
mixerSetControlDetails) and see what return code 11 means. I don't even
know if it's documented.

Start by googling for "mixerSetControlDetails return value 11" and go on
from there.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,012
Latest member
RoxanneDzm

Latest Threads

Top