def GetControls(hmixer, mixerline): numCtrls = mixerline.cControls if numCtrls == 0: return [] mixerControlArray = (MIXERCONTROL * numCtrls)() mixerLineControls = MIXERLINECONTROLS() mixerLineControls.cbStruct = sizeof(MIXERLINECONTROLS) mixerLineControls.cControls = numCtrls mixerLineControls.dwLineID = mixerline.dwLineID mixerLineControls.pamxctrl = pointer(mixerControlArray[0]) mixerLineControls.cbmxctrl = sizeof(MIXERCONTROL) mixerGetLineControls(hmixer, byref(mixerLineControls), MIXER_GETLINECONTROLSF_ALL) result = [] for i in range(numCtrls): mixerControl = mixerControlArray[i] dwControlType = mixerControl.dwControlType controlClass = MIXER_CONTROL_CLASSES[dwControlType & MIXERCONTROL_CT_CLASS_MASK] controlClassTypeName = controlClass["types"][dwControlType] flagNames = [] fdwControl = mixerControl.fdwControl if fdwControl & MIXERCONTROL_CONTROLF_DISABLED: flagNames.append("Disabled") if fdwControl & MIXERCONTROL_CONTROLF_MULTIPLE: flagNames.append("Multiple(%i)" % mixerControl.cMultipleItems) if fdwControl & MIXERCONTROL_CONTROLF_UNIFORM: flagNames.append("Uniform") result.append((mixerControl.szName, controlClass["name"], controlClassTypeName, ", ".join(flagNames))) return result
def GetControls(hmixer, mixerline): numCtrls = mixerline.cControls if numCtrls == 0: return [] mixerControlArray = (MIXERCONTROL * numCtrls)() mixerLineControls = MIXERLINECONTROLS() mixerLineControls.cbStruct = sizeof(MIXERLINECONTROLS) mixerLineControls.cControls = numCtrls mixerLineControls.dwLineID = mixerline.dwLineID mixerLineControls.pamxctrl = pointer(mixerControlArray[0]) mixerLineControls.cbmxctrl = sizeof(MIXERCONTROL) mixerGetLineControls( hmixer, byref(mixerLineControls), MIXER_GETLINECONTROLSF_ALL ) result = [] for i in range(numCtrls): mixerControl = mixerControlArray[i] dwControlType = mixerControl.dwControlType controlClass = MIXER_CONTROL_CLASSES[ dwControlType & MIXERCONTROL_CT_CLASS_MASK ] controlClassTypeName = controlClass["types"][dwControlType] flagNames = [] fdwControl = mixerControl.fdwControl if fdwControl & MIXERCONTROL_CONTROLF_DISABLED: flagNames.append("Disabled") if fdwControl & MIXERCONTROL_CONTROLF_MULTIPLE: flagNames.append("Multiple(%i)" % mixerControl.cMultipleItems) if fdwControl & MIXERCONTROL_CONTROLF_UNIFORM: flagNames.append("Uniform") result.append( ( mixerControl.szName, controlClass["name"], controlClassTypeName, ", ".join(flagNames) ) ) return result
def GetMixerControl(componentType, ctrlType, deviceId=0): """ Obtains an appropriate pointer and info for the volume control This function attempts to obtain a mixer control. Raises SoundMixerException if not successful. """ deviceId = GetDeviceId(deviceId) hmixer = HMIXER() # Obtain the hmixer struct rc = mixerOpen(byref(hmixer), deviceId, 0, 0, 0) if rc != MMSYSERR_NOERROR: raise SoundMixerException() mixerLineControls = MIXERLINECONTROLS() mixerLineControls.cbStruct = sizeof(MIXERLINECONTROLS) mixerLine = MIXERLINE() mixerLine.cbStruct = sizeof(MIXERLINE) mixerControl = MIXERCONTROL() mixerControl.cbStruct = sizeof(MIXERCONTROL) mixerLine.dwComponentType = componentType # Obtain a line corresponding to the component type rc = mixerGetLineInfo( hmixer, byref(mixerLine), MIXER_GETLINEINFOF_COMPONENTTYPE ) if rc != MMSYSERR_NOERROR: raise SoundMixerException() mixerLineControls.dwLineID = mixerLine.dwLineID mixerLineControls.dwControlType = ctrlType mixerLineControls.cControls = 1 mixerLineControls.cbmxctrl = sizeof(mixerControl) mixerLineControls.pamxctrl = pointer(mixerControl) # Get the control rc = mixerGetLineControls( hmixer, byref(mixerLineControls), MIXER_GETLINECONTROLSF_ONEBYTYPE ) if MMSYSERR_NOERROR != rc: raise SoundMixerException() return hmixer, mixerControl