void SetVolume(uint value) { MIXERCONTROLDETAILS volCtl = new MIXERCONTROLDETAILS(); MIXERCONTROLDETAILS_UNSIGNED volDat = new MIXERCONTROLDETAILS_UNSIGNED(); double volValue = (double)value * (double)(_volMax - _volMin) / 100D + _volMin; volDat.Value = (uint)volValue; Debug.WriteLine(string.Format("MixerAPI.SetCurrentVolume vol:{0} volMax:{1} volMin:{2} param:{3}", value, _volMax, _volMin, volDat.Value)); IntPtr volPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(new MIXERCONTROLDETAILS_UNSIGNED())); Marshal.StructureToPtr(volDat, volPtr, false); volCtl.StructSize = (uint)Marshal.SizeOf(new MIXERCONTROLDETAILS()); volCtl.ControlID = _volumeID; volCtl.Channels = 1; volCtl.MultipleItems = 0; volCtl.DetailsItemSize = (uint)Marshal.SizeOf(new MIXERCONTROLDETAILS_UNSIGNED()); volCtl.DetailsPointer = volPtr; uint mmresult = mixerSetControlDetails(_hMixer, ref volCtl, MIXER_OBJECTF.HMIXER, MIXER_GETCONTROLDETAILSF.VALUE); Marshal.FreeCoTaskMem(volPtr); if (mmresult != (uint)MMRESULT.MMSYSERR_NOERROR) { throw new MixerException("mixerSetControlDetails", mmresult); } }
private MMSYSERR SetVolume(IntPtr hmixer, MIXERCONTROL mxc, uint volume) { IntPtr hmem = IntPtr.Zero; MMSYSERR err = MMSYSERR.NOERROR; MIXERCONTROLDETAILS mxcd = new MIXERCONTROLDETAILS(); MIXERCONTROLDETAILS_UNSIGNED vol = new MIXERCONTROLDETAILS_UNSIGNED(); try { mxcd.hwndOwner = IntPtr.Zero; mxcd.dwControlID = mxc.dwControlID; mxcd.cbStruct = (uint)Marshal.SizeOf(mxcd); mxcd.cbDetails = (uint)Marshal.SizeOf(vol); mxcd.cChannels = 1; vol.value = volume; hmem = malloc(Marshal.SizeOf(vol)); mxcd.paDetails = hmem; Marshal.StructureToPtr(vol, mxcd.paDetails, true); err = mixerSetControlDetails(hmixer, ref mxcd, 0x0); if (hmem != IntPtr.Zero) { free(hmem, Marshal.SizeOf(vol)); } return(err); } catch { return(err); } }
uint GetCurrentVolume() { MIXERCONTROLDETAILS volCtl = new MIXERCONTROLDETAILS(); IntPtr volPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(new MIXERCONTROLDETAILS_UNSIGNED())); volCtl.StructSize = (uint)Marshal.SizeOf(new MIXERCONTROLDETAILS()); volCtl.ControlID = _volumeID; volCtl.Channels = 1; volCtl.MultipleItems = 0; volCtl.DetailsItemSize = (uint)Marshal.SizeOf(new MIXERCONTROLDETAILS_UNSIGNED()); volCtl.DetailsPointer = volPtr; uint mmresult = mixerGetControlDetails(_hMixer, ref volCtl, MIXER_OBJECTF.HMIXER, MIXER_GETCONTROLDETAILSF.VALUE); if (mmresult != (uint)MMRESULT.MMSYSERR_NOERROR) { Marshal.FreeCoTaskMem(volPtr); throw new MixerException("mixerGetControlDetails", mmresult); } MIXERCONTROLDETAILS_UNSIGNED volInfo = (MIXERCONTROLDETAILS_UNSIGNED)Marshal.PtrToStructure(volPtr, typeof(MIXERCONTROLDETAILS_UNSIGNED)); Marshal.FreeCoTaskMem(volPtr); double ret = ((double)(volInfo.Value - _volMin) * 100 + (double)(_volMax - _volMin) / 2) / (double)(_volMax - _volMin); Debug.WriteLine(string.Format("MixerAPI.GetCurrentVolume vol:{0} volMax:{1} volMin:{2} ret:{3}", volInfo.Value, _volMax, _volMin, ret)); return((uint)ret); }
private static void SetVolumeControl(int hmixer, MIXERCONTROL mxc, int volume) { // This function sets the value for a volume control. // Returns True if successful MIXERCONTROLDETAILS mxcd = new MIXERCONTROLDETAILS(); MIXERCONTROLDETAILS_UNSIGNED vol = new MIXERCONTROLDETAILS_UNSIGNED(); mxcd.item = 0; mxcd.dwControlID = mxc.dwControlID; mxcd.cbStruct = Marshal.SizeOf(mxcd); mxcd.cbDetails = Marshal.SizeOf(vol); // Allocate a buffer for the control value buffer mxcd.cChannels = 1; vol.dwValue = volume; // Copy the data into the control value buffer //mxcd.paDetails = vol; //(MIXERCONTROL)Marshal.PtrToStructure(mxlc.pamxctrl,typeof(MIXERCONTROL)); mxcd.paDetails = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(MIXERCONTROLDETAILS_UNSIGNED))); Marshal.StructureToPtr(vol, mxcd.paDetails, false); // Set the control value try { CheckErr(mixerSetControlDetails(hmixer, ref mxcd, MIXER_SETCONTROLDETAILSF_VALUE)); } catch (Exception e) { throw e; } finally { Marshal.FreeCoTaskMem(mxcd.paDetails); } }
private static bool SetVolumeControl(int hmixer, MIXERCONTROL mxc, int volume) { // This function sets the value for a volume control. // Returns True if successful bool retValue; int rc; MIXERCONTROLDETAILS mxcd = new MIXERCONTROLDETAILS(); MIXERCONTROLDETAILS_UNSIGNED vol = new MIXERCONTROLDETAILS_UNSIGNED(); mxcd.item = 0; mxcd.dwControlID = mxc.dwControlID; mxcd.cbStruct = Marshal.SizeOf(mxcd); mxcd.cbDetails = Marshal.SizeOf(vol); // Allocate a buffer for the control value buffer mxcd.cChannels = 1; vol.dwValue = volume; // Copy the data into the control value buffer mxcd.paDetails = Marshal.AllocCoTaskMem(Marshal.SizeOf( typeof(MIXERCONTROLDETAILS_UNSIGNED))); Marshal.StructureToPtr(vol, mxcd.paDetails, false); // Set the control value rc = mixerSetControlDetails(hmixer, ref mxcd, MIXER_SETCONTROLDETAILSF_VALUE); if (MMSYSERR_NOERROR == rc) { retValue = true; } else { retValue = false; } return(retValue); }
private bool SetVolumeControl( // SetVolumeControl int hmixer, MIXERCONTROL mxc, int volume) { bool retValue = false; int rc; MIXERCONTROLDETAILS mxcd = new MIXERCONTROLDETAILS(); MIXERCONTROLDETAILS_UNSIGNED vol = new MIXERCONTROLDETAILS_UNSIGNED(); mxcd.item = 0; mxcd.dwControlID = mxc.dwControlID; mxcd.cbStruct = Marshal.SizeOf(mxcd); mxcd.cbDetails = Marshal.SizeOf(vol); // Allocate a buffer for the control value buffer mxcd.cChannels = 1; vol.dwValue = volume; // Copy the data into the control value buffer mxcd.paDetails = Marshal.AllocCoTaskMem( Marshal.SizeOf(typeof(MIXERCONTROLDETAILS_UNSIGNED))); Marshal.StructureToPtr( vol, mxcd.paDetails, false); // Set the control value rc = mixerSetControlDetails( hmixer, ref mxcd, MIXER_SETCONTROLDETAILSF_VALUE); return(retValue = MMSYSERR_NOERROR == rc ? true : false); }
private static void GetVolumeControl(int hmixer, int componentType, int ctrlType, out MIXERCONTROL mxc, out int vCurrentVol) { // This function attempts to obtain a mixer control. // Returns True if successful. MIXERLINECONTROLS mxlc = new MIXERLINECONTROLS(); MIXERLINE mxl = new MIXERLINE(); MIXERCONTROLDETAILS pmxcd = new MIXERCONTROLDETAILS(); MIXERCONTROLDETAILS_UNSIGNED du = new MIXERCONTROLDETAILS_UNSIGNED(); mxc = new MIXERCONTROL(); vCurrentVol = -1; //mxl.szShortName = new string(' ', MIXER_SHORT_NAME_CHARS); //mxl.szName = new string(' ', MIXER_LONG_NAME_CHARS); mxl.cbStruct = Marshal.SizeOf(mxl); mxl.dwComponentType = componentType; // Obtain a line corresponding to the component public enum CheckErr(mixerGetLineInfoA(hmixer, ref mxl, MIXER_GETLINEINFOF_COMPONENTTYPE)); int sizeofMIXERCONTROL = 152; //Marshal.SizeOf(typeof(MIXERCONTROL)) int ctrl = Marshal.SizeOf(typeof(MIXERCONTROL)); mxlc.pamxctrl = Marshal.AllocCoTaskMem(sizeofMIXERCONTROL); //new MIXERCONTROL(); mxlc.cbStruct = Marshal.SizeOf(mxlc); mxlc.dwLineID = mxl.dwLineID; mxlc.dwControl = ctrlType; mxlc.cControls = 1; mxlc.cbmxctrl = sizeofMIXERCONTROL; // Allocate a buffer for the control mxc.cbStruct = sizeofMIXERCONTROL; // Get the control try { CheckErr(mixerGetLineControlsA(hmixer, ref mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE)); // Copy the control into the destination structure mxc = (MIXERCONTROL)Marshal.PtrToStructure(mxlc.pamxctrl, typeof(MIXERCONTROL)); } catch (Exception e) { throw e; } finally { Marshal.FreeCoTaskMem(mxlc.pamxctrl); } int sizeofMIXERCONTROLDETAILS = Marshal.SizeOf(typeof(MIXERCONTROLDETAILS)); int sizeofMIXERCONTROLDETAILS_UNSIGNED = Marshal.SizeOf(typeof(MIXERCONTROLDETAILS_UNSIGNED)); pmxcd.cbStruct = sizeofMIXERCONTROLDETAILS; pmxcd.dwControlID = mxc.dwControlID; pmxcd.paDetails = Marshal.AllocCoTaskMem(sizeofMIXERCONTROLDETAILS_UNSIGNED); pmxcd.cChannels = 1; pmxcd.item = 0; pmxcd.cbDetails = sizeofMIXERCONTROLDETAILS_UNSIGNED; try { CheckErr(mixerGetControlDetailsA(hmixer, ref pmxcd, MIXER_GETCONTROLDETAILSF_VALUE)); du = (MIXERCONTROLDETAILS_UNSIGNED)Marshal.PtrToStructure(pmxcd.paDetails, typeof(MIXERCONTROLDETAILS_UNSIGNED)); } catch (Exception e) { throw e; } finally { Marshal.FreeCoTaskMem(pmxcd.paDetails); } vCurrentVol = du.dwValue; }
public static void RestoreState() { int index = 0; uint[] ctrl_list = { MIXERCONTROL_CONTROLTYPE_CUSTOM, MIXERCONTROL_CONTROLTYPE_BOOLEANMETER, MIXERCONTROL_CONTROLTYPE_SIGNEDMETER, MIXERCONTROL_CONTROLTYPE_PEAKMETER, MIXERCONTROL_CONTROLTYPE_BOOLEAN, MIXERCONTROL_CONTROLTYPE_ONOFF, MIXERCONTROL_CONTROLTYPE_MUTE, MIXERCONTROL_CONTROLTYPE_MONO, MIXERCONTROL_CONTROLTYPE_LOUDNESS, MIXERCONTROL_CONTROLTYPE_STEREOENH, MIXERCONTROL_CONTROLTYPE_BUTTON, MIXERCONTROL_CONTROLTYPE_DECIBELS, MIXERCONTROL_CONTROLTYPE_SIGNED, MIXERCONTROL_CONTROLTYPE_SLIDER, MIXERCONTROL_CONTROLTYPE_PAN, MIXERCONTROL_CONTROLTYPE_QSOUNDPAN, MIXERCONTROL_CONTROLTYPE_SINGLESELECT, MIXERCONTROL_CONTROLTYPE_MUX, MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT, MIXERCONTROL_CONTROLTYPE_MIXER, MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER, MIXERCONTROL_CONTROLTYPE_UNSIGNED, MIXERCONTROL_CONTROLTYPE_BASS, MIXERCONTROL_CONTROLTYPE_EQUALIZER, MIXERCONTROL_CONTROLTYPE_FADER, MIXERCONTROL_CONTROLTYPE_TREBLE, MIXERCONTROL_CONTROLTYPE_VOLUME, MIXERCONTROL_CONTROLTYPE_MICROTIME, MIXERCONTROL_CONTROLTYPE_MILLITIME, MIXERCONTROL_CONTROLTYPE_PERCENT, }; int num_mixers = mixerGetNumDevs(); int mixer = -1; int retval = -1; for(int i=0; i<num_mixers; i++) // for each mixer { mixerOpen(out mixer, i, 0, 0, 0); MIXERCAPS mc = new MIXERCAPS(); retval = mixerGetDevCaps(mixer, ref mc, Marshal.SizeOf(mc)); if(retval == MMSYSERR_NOERROR) { int num_dest = mc.cDestinations; for(int j=0; j<num_dest; j++) // for each destination line in this mixer { MIXERLINE dst_line = new MIXERLINE(); dst_line.cbStruct = Marshal.SizeOf(dst_line); dst_line.dwDestination = j; retval = mixerGetLineInfo(mixer, ref dst_line, MIXER_GETLINEINFOF_DESTINATION); if(retval == MMSYSERR_NOERROR) { for(int k=0; k<30; k++) // for each control in this destination line { MIXERLINECONTROLS dst_lc = new MIXERLINECONTROLS(); int mcSize = 152; dst_lc.pamxctrl = Marshal.AllocCoTaskMem(mcSize); dst_lc.cbStruct = Marshal.SizeOf(dst_lc); dst_lc.dwLineID = dst_line.dwLineID; dst_lc.dwControl = ctrl_list[k]; dst_lc.cControls = 1; dst_lc.cbmxctrl = mcSize; // Get the control retval = mixerGetLineControls(mixer, ref dst_lc, MIXER_GETLINECONTROLSF_ONEBYTYPE); if(retval == MMSYSERR_NOERROR) { MIXERCONTROL ctrl = new MIXERCONTROL(); ctrl.cbStruct = mcSize; // Copy the control into the destination structure ctrl = (MIXERCONTROL)Marshal.PtrToStructure(dst_lc.pamxctrl, typeof(MIXERCONTROL)); MIXERCONTROLDETAILS details = new MIXERCONTROLDETAILS(); int size = Marshal.SizeOf(typeof(MIXERCONTROLDETAILS_SIGNED)); details.dwControlID = ctrl.dwControlID; details.cbDetails = size; details.item = ctrl.cMultipleItems; if(details.item > 0) size *= details.item; details.paDetails = Marshal.AllocCoTaskMem(size); details.cbStruct = Marshal.SizeOf(details); details.cChannels = 1; if(details.item > 0) { if(index != save.Count) { int rec_index = (int)save[index]; int[] val = new int[details.item]; for(int m=0; m<details.item; m++) { if(m == rec_index) val[m] = 1; else val[m] = 0; } Marshal.Copy(val, 0, details.paDetails, details.item); retval = mixerSetControlDetails(mixer, ref details, MIXER_GETCONTROLDETAILSF_VALUE); if(retval == MMSYSERR_NOERROR) index++; } } else { MIXERCONTROLDETAILS_UNSIGNED val = new MIXERCONTROLDETAILS_UNSIGNED(); val.dwValue = (int)save[index]; Marshal.StructureToPtr(val, details.paDetails, false); retval = mixerSetControlDetails(mixer, ref details, MIXER_GETCONTROLDETAILSF_VALUE); if(retval == MMSYSERR_NOERROR) index++; } Marshal.FreeCoTaskMem(details.paDetails); } Marshal.FreeCoTaskMem(dst_lc.pamxctrl); } int num_src = dst_line.cConnections; for(int k=0; k<num_src; k++) // for each source line connected to this destination { MIXERLINE src_line = new MIXERLINE(); src_line.cbStruct = dst_line.cbStruct; src_line.dwDestination = dst_line.dwDestination; src_line.dwSource = k; retval = mixerGetLineInfo(mixer, ref src_line, MIXER_GETLINEINFOF_SOURCE); if(retval == MMSYSERR_NOERROR) { for(int l=0; l<30; l++) // for each control in this source line { MIXERLINECONTROLS src_lc = new MIXERLINECONTROLS(); int mcSize = 152; src_lc.pamxctrl = Marshal.AllocCoTaskMem(mcSize); src_lc.cbStruct = Marshal.SizeOf(src_lc); src_lc.dwLineID = src_line.dwLineID; src_lc.dwControl = ctrl_list[l]; src_lc.cControls = 1; src_lc.cbmxctrl = mcSize; // Get the control retval = mixerGetLineControls(mixer, ref src_lc, MIXER_GETLINECONTROLSF_ONEBYTYPE); if(retval == MMSYSERR_NOERROR) { MIXERCONTROL ctrl = new MIXERCONTROL(); ctrl.cbStruct = mcSize; // Copy the control into the destination structure ctrl = (MIXERCONTROL)Marshal.PtrToStructure(src_lc.pamxctrl, typeof(MIXERCONTROL)); MIXERCONTROLDETAILS details = new MIXERCONTROLDETAILS(); int size; if(l<20) size = Marshal.SizeOf(typeof(MIXERCONTROLDETAILS_SIGNED)); else size = Marshal.SizeOf(typeof(MIXERCONTROLDETAILS_UNSIGNED)); details.dwControlID = ctrl.dwControlID; details.paDetails = Marshal.AllocCoTaskMem(size); details.cbStruct = Marshal.SizeOf(details); details.cChannels = 1; details.item = ctrl.cMultipleItems; details.cbDetails = size; if(details.item > 0) { int rec_index = (int)save[index]; MIXERCONTROLDETAILS_UNSIGNED[] val = new MIXERCONTROLDETAILS_UNSIGNED[details.item]; for(int m=0; m<details.item; m++) val[m] = new MIXERCONTROLDETAILS_UNSIGNED(); val[rec_index].dwValue = 1; Marshal.StructureToPtr(val[0], details.paDetails, false); } else { MIXERCONTROLDETAILS_UNSIGNED val = new MIXERCONTROLDETAILS_UNSIGNED(); val.dwValue = (int)save[index]; Marshal.StructureToPtr(val, details.paDetails, false); } retval = mixerSetControlDetails(mixer, ref details, MIXER_GETCONTROLDETAILSF_VALUE); if(retval == MMSYSERR_NOERROR) index++; Marshal.FreeCoTaskMem(details.paDetails); } Marshal.FreeCoTaskMem(src_lc.pamxctrl); } } } } } } } mixerClose(mixer); }
private static bool SetMute(int mixerID, uint dst_type, uint src_type, bool val) { int mixer; MIXERCONTROL muteCtrl = new MIXERCONTROL(); bool currentMute = GetMute(mixerID, dst_type, src_type); if(currentMute == val) return true; mixerOpen(out mixer, mixerID, 0, 0, 0); bool success = GetControlByType(mixer, dst_type, src_type, MIXERCONTROL_CONTROLTYPE_MUTE, out muteCtrl); if(success == true) { MIXERCONTROLDETAILS mxcd = new MIXERCONTROLDETAILS(); MIXERCONTROLDETAILS_UNSIGNED mute = new MIXERCONTROLDETAILS_UNSIGNED(); mxcd.item = 0; mxcd.dwControlID = muteCtrl.dwControlID; mxcd.cbStruct = Marshal.SizeOf(mxcd); mxcd.cbDetails = Marshal.SizeOf(mute); // Allocate a buffer for the control value buffer mxcd.cChannels = 1; if(val) mute.dwValue = 1; else mute.dwValue = 0; // Copy the data into the control value buffer mxcd.paDetails = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(MIXERCONTROLDETAILS_UNSIGNED))); Marshal.StructureToPtr(mute, mxcd.paDetails,false); // Set the control value int retval = mixerSetControlDetails(mixer, ref mxcd, MIXER_SETCONTROLDETAILSF_VALUE); if(retval == MMSYSERR_NOERROR) { currentMute = GetMute(mixerID, dst_type, src_type); if(currentMute != val) success = false; else success = true; } else success = false; Marshal.FreeCoTaskMem(mxcd.paDetails); } else success = false; mixerClose(mixer); return success; }
private static bool SetUnsigned(int mixer, MIXERCONTROL ctrl, int num) { int current_val; if(!GetUnsigned(mixer, ctrl, out current_val)) return false; if(current_val == num) return true; if(num > ctrl.lMaximum) num = ctrl.lMaximum; if(num < ctrl.lMinimum) num = ctrl.lMinimum; MIXERCONTROLDETAILS mxcd = new MIXERCONTROLDETAILS(); MIXERCONTROLDETAILS_UNSIGNED val = new MIXERCONTROLDETAILS_UNSIGNED(); mxcd.item = 0; mxcd.dwControlID = ctrl.dwControlID; mxcd.cbStruct = Marshal.SizeOf(mxcd); mxcd.cbDetails = Marshal.SizeOf(val); mxcd.cChannels = 1; val.dwValue = num; mxcd.paDetails = Marshal.AllocCoTaskMem(Marshal.SizeOf(val)); Marshal.StructureToPtr(val, mxcd.paDetails, false); int retval = mixerSetControlDetails(mixer, ref mxcd, MIXER_SETCONTROLDETAILSF_VALUE); Marshal.FreeCoTaskMem(mxcd.paDetails); if(retval != MMSYSERR_NOERROR) return false; if(!GetUnsigned(mixer, ctrl, out current_val)) return false; if(current_val == num) return true; else return false; }
private static void SetVolumeControl(int hmixer, MIXERCONTROL mxc, int volume) { // This function sets the value for a volume control. // Returns True if successful MIXERCONTROLDETAILS mxcd = new MIXERCONTROLDETAILS(); MIXERCONTROLDETAILS_UNSIGNED vol = new MIXERCONTROLDETAILS_UNSIGNED(); mxcd.item = 0; mxcd.dwControlID = mxc.dwControlID; mxcd.cbStruct = Marshal.SizeOf(mxcd); mxcd.cbDetails = Marshal.SizeOf(vol); // Allocate a buffer for the control value buffer mxcd.cChannels = 1; vol.dwValue = volume; // Copy the data into the control value buffer //mxcd.paDetails = vol; //(MIXERCONTROL)Marshal.PtrToStructure(mxlc.pamxctrl,typeof(MIXERCONTROL)); mxcd.paDetails = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof (MIXERCONTROLDETAILS_UNSIGNED))); Marshal.StructureToPtr(vol, mxcd.paDetails, false); // Set the control value try { CheckErr(mixerSetControlDetails(hmixer, ref mxcd, MIXER_SETCONTROLDETAILSF_VALUE)); } catch (Exception e) { throw e; } finally { Marshal.FreeCoTaskMem(mxcd.paDetails); } }
private static bool GetVolumeControl(int hmixer, int componentType, int ctrlType, out MIXERCONTROL mxc, out int vCurrentVol) { // This function attempts to obtain a mixer control. // Returns True if successful. MIXERLINECONTROLS mxlc = new MIXERLINECONTROLS(); MIXERLINE mxl = new MIXERLINE(); MIXERCONTROLDETAILS pmxcd = new MIXERCONTROLDETAILS(); MIXERCONTROLDETAILS_UNSIGNED du = new MIXERCONTROLDETAILS_UNSIGNED(); mxc = new MIXERCONTROL(); int rc; bool retValue; vCurrentVol = -1; mxl.cbStruct = Marshal.SizeOf(mxl); mxl.dwComponentType = componentType; rc = mixerGetLineInfoA(hmixer, ref mxl, MIXER_GETLINEINFOF_COMPONENTTYPE); if (MMSYSERR_NOERROR == rc) { int sizeofMIXERCONTROL = 152; int ctrl = Marshal.SizeOf(typeof (MIXERCONTROL)); mxlc.pamxctrl = Marshal.AllocCoTaskMem(sizeofMIXERCONTROL); mxlc.cbStruct = Marshal.SizeOf(mxlc); mxlc.dwLineID = mxl.dwLineID; mxlc.dwControl = ctrlType; mxlc.cControls = 1; mxlc.cbmxctrl = sizeofMIXERCONTROL; // Allocate a buffer for the control mxc.cbStruct = sizeofMIXERCONTROL; // Get the control rc = mixerGetLineControlsA(hmixer, ref mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE); if (MMSYSERR_NOERROR == rc) { retValue = true; // Copy the control into the destination structure mxc = (MIXERCONTROL)Marshal.PtrToStructure(mxlc.pamxctrl, typeof (MIXERCONTROL)); } else { retValue = false; } int sizeofMIXERCONTROLDETAILS = Marshal.SizeOf(typeof (MIXERCONTROLDETAILS)); int sizeofMIXERCONTROLDETAILS_UNSIGNED = Marshal.SizeOf(typeof (MIXERCONTROLDETAILS_UNSIGNED)); pmxcd.cbStruct = sizeofMIXERCONTROLDETAILS; pmxcd.dwControlID = mxc.dwControlID; pmxcd.paDetails = Marshal.AllocCoTaskMem(sizeofMIXERCONTROLDETAILS_UNSIGNED); pmxcd.cChannels = 1; pmxcd.item = 0; pmxcd.cbDetails = sizeofMIXERCONTROLDETAILS_UNSIGNED; rc = mixerGetControlDetailsA(hmixer, ref pmxcd, MIXER_GETCONTROLDETAILSF_VALUE); du = (MIXERCONTROLDETAILS_UNSIGNED)Marshal.PtrToStructure(pmxcd.paDetails, typeof (MIXERCONTROLDETAILS_UNSIGNED)); vCurrentVol = du.dwValue; return retValue; } retValue = false; return retValue; }
public static int GetMux(int mixerID) { int mixer; MIXERCONTROL ctrl = new MIXERCONTROL(); mixerOpen(out mixer, mixerID, 0, 0, 0); GetControlByType(mixer, MIXERLINE_COMPONENTTYPE_DST_WAVEIN, 0, MIXERCONTROL_CONTROLTYPE_MUX, out ctrl); MIXERCONTROLDETAILS details = new MIXERCONTROLDETAILS(); int size = Marshal.SizeOf(typeof(MIXERCONTROLDETAILS_UNSIGNED)); details.dwControlID = ctrl.dwControlID; details.item = ctrl.cMultipleItems; details.cbDetails = size; if(details.item > 0) size *= ctrl.cMultipleItems; details.paDetails = Marshal.AllocCoTaskMem(size); details.cbStruct = Marshal.SizeOf(details); details.cChannels = 1; int retval = mixerGetControlDetails(mixer, ref details, MIXER_GETCONTROLDETAILSF_VALUE); if(retval == MMSYSERR_NOERROR) { if(details.item > 0) { MIXERCONTROLDETAILS_UNSIGNED[] val = new MIXERCONTROLDETAILS_UNSIGNED[details.item]; for(int m=0; m<details.item; m++) { IntPtr ptr = new IntPtr(details.paDetails.ToInt32() + m*details.cbDetails); val[m] = new MIXERCONTROLDETAILS_UNSIGNED(); val[m] = (MIXERCONTROLDETAILS_UNSIGNED)Marshal.PtrToStructure(ptr, typeof(MIXERCONTROLDETAILS_UNSIGNED)); if(val[m].dwValue == 1) { retval = m; m = details.item; } } } } mixerClose(mixer); return retval; }
void SetVolume(uint value) { MIXERCONTROLDETAILS volCtl = new MIXERCONTROLDETAILS(); MIXERCONTROLDETAILS_UNSIGNED volDat = new MIXERCONTROLDETAILS_UNSIGNED(); double volValue = (double)value * (double)(_volMax - _volMin) / 100D + _volMin; volDat.Value = (uint)volValue; Debug.WriteLine(string.Format("MixerAPI.SetCurrentVolume vol:{0} volMax:{1} volMin:{2} param:{3}", value, _volMax, _volMin, volDat.Value)); IntPtr volPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(new MIXERCONTROLDETAILS_UNSIGNED())); Marshal.StructureToPtr(volDat, volPtr, false); volCtl.StructSize = (uint)Marshal.SizeOf(new MIXERCONTROLDETAILS()); volCtl.ControlID = _volumeID; volCtl.Channels = 1; volCtl.MultipleItems = 0; volCtl.DetailsItemSize = (uint)Marshal.SizeOf(new MIXERCONTROLDETAILS_UNSIGNED()); volCtl.DetailsPointer = volPtr; uint mmresult = mixerSetControlDetails(_hMixer, ref volCtl, MIXER_OBJECTF.HMIXER, MIXER_GETCONTROLDETAILSF.VALUE); Marshal.FreeCoTaskMem(volPtr); if (mmresult != (uint)MMRESULT.MMSYSERR_NOERROR) { throw new MixerException("mixerSetControlDetails" , mmresult); } }
private static bool SetVolume(int mixerID, uint dst_type, uint src_type, int val) { int mixer; MIXERCONTROL volCtrl = new MIXERCONTROL(); int currentVol = GetVolume(mixerID, dst_type, src_type); if(currentVol == val) return true; mixerOpen(out mixer, mixerID, 0, 0, 0); bool success = GetControlByType(mixer, dst_type, src_type, MIXERCONTROL_CONTROLTYPE_VOLUME, out volCtrl); if(success == true) { if(val>volCtrl.lMaximum) val = volCtrl.lMaximum; if(val<volCtrl.lMinimum) val = volCtrl.lMinimum; MIXERCONTROLDETAILS mxcd = new MIXERCONTROLDETAILS(); MIXERCONTROLDETAILS_UNSIGNED vol = new MIXERCONTROLDETAILS_UNSIGNED(); mxcd.item = 0; mxcd.dwControlID = volCtrl.dwControlID; mxcd.cbStruct = Marshal.SizeOf(mxcd); mxcd.cbDetails = Marshal.SizeOf(vol); // Allocate a buffer for the control value buffer mxcd.cChannels = 1; vol.dwValue = val; // Copy the data into the control value buffer mxcd.paDetails = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(MIXERCONTROLDETAILS_UNSIGNED))); Marshal.StructureToPtr(vol, mxcd.paDetails,false); // Set the control value int retval = mixerSetControlDetails(mixer, ref mxcd, MIXER_SETCONTROLDETAILSF_VALUE); if(retval == MMSYSERR_NOERROR) { currentVol = GetVolume(mixerID, dst_type, src_type); if(currentVol != val) success = false; else success = true; } else success = false; Marshal.FreeCoTaskMem(mxcd.paDetails); } else success = false; mixerClose(mixer); return success; }
// This function attempts to obtain a specified mixer control/component pair - // returns true if successful. private static bool GetMixerControl( // GetMixerControl int hmixer, int component, int control, out MIXERCONTROL mxc, out int vCurrentVol) { bool retValue = false; mxc = new MIXERCONTROL(); MIXERLINECONTROLS mxlc = new MIXERLINECONTROLS(); MIXERLINE mxl = new MIXERLINE(); MIXERCONTROLDETAILS pmxcd = new MIXERCONTROLDETAILS(); MIXERCONTROLDETAILS_UNSIGNED du = new MIXERCONTROLDETAILS_UNSIGNED(); vCurrentVol = -1; // A dummy value mxl.cbStruct = Marshal.SizeOf(mxl); mxl.dwComponentType = component; int rc = mixerGetLineInfoA( hmixer, ref mxl, MIXER_GETLINEINFOF_COMPONENTTYPE); if (MMSYSERR_NOERROR == rc) { int sizeofMIXERCONTROL = 152; int ctrl = Marshal.SizeOf(typeof(MIXERCONTROL)); mxlc.pamxctrl = Marshal.AllocCoTaskMem(sizeofMIXERCONTROL); mxlc.cbStruct = Marshal.SizeOf(mxlc); mxlc.dwLineID = mxl.dwLineID; mxlc.dwControl = control; mxlc.cControls = 1; mxlc.cbmxctrl = sizeofMIXERCONTROL; // Allocate a buffer for the control mxc.cbStruct = sizeofMIXERCONTROL; // Get the control rc = mixerGetLineControlsA( hmixer, ref mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE); if (MMSYSERR_NOERROR == rc) { retValue = true; // Copy the control into the destination structure mxc = (MIXERCONTROL)Marshal.PtrToStructure( mxlc.pamxctrl, typeof(MIXERCONTROL)); } int sizeofMIXERCONTROLDETAILS = Marshal.SizeOf(typeof(MIXERCONTROLDETAILS)); int sizeofMIXERCONTROLDETAILS_UNSIGNED = Marshal.SizeOf(typeof(MIXERCONTROLDETAILS_UNSIGNED)); pmxcd.cbStruct = sizeofMIXERCONTROLDETAILS; pmxcd.dwControlID = mxc.dwControlID; pmxcd.paDetails = Marshal.AllocCoTaskMem(sizeofMIXERCONTROLDETAILS_UNSIGNED); pmxcd.cChannels = 1; pmxcd.item = 0; pmxcd.cbDetails = sizeofMIXERCONTROLDETAILS_UNSIGNED; rc = mixerGetControlDetailsA( hmixer, ref pmxcd, MIXER_GETCONTROLDETAILSF_VALUE); du = (MIXERCONTROLDETAILS_UNSIGNED)Marshal.PtrToStructure( pmxcd.paDetails, typeof(MIXERCONTROLDETAILS_UNSIGNED)); vCurrentVol = du.dwValue; return(retValue); // true } return(retValue); // false }
private static bool SetBool(int mixer, MIXERCONTROL ctrl, bool b) { bool current; if(!GetBool(mixer, ctrl, out current)) return false; if(current == b) return true; MIXERCONTROLDETAILS mxcd = new MIXERCONTROLDETAILS(); MIXERCONTROLDETAILS_UNSIGNED val = new MIXERCONTROLDETAILS_UNSIGNED(); mxcd.item = 0; mxcd.dwControlID = ctrl.dwControlID; mxcd.cbStruct = Marshal.SizeOf(mxcd); mxcd.cbDetails = Marshal.SizeOf(val); // Allocate a buffer for the control value buffer mxcd.cChannels = 1; if(b) val.dwValue = 1; else val.dwValue = 0; // Copy the data into the control value buffer mxcd.paDetails = Marshal.AllocCoTaskMem(Marshal.SizeOf(val)); Marshal.StructureToPtr(val, mxcd.paDetails, false); // Set the control value int retval = mixerSetControlDetails(mixer, ref mxcd, MIXER_SETCONTROLDETAILSF_VALUE); if(retval != MMSYSERR_NOERROR) { Marshal.FreeCoTaskMem(mxcd.paDetails); return false; } Marshal.FreeCoTaskMem(mxcd.paDetails); if(!GetBool(mixer, ctrl, out current)) return false; if(current != b) return false; else return true; }
private static bool SetVolumeControl(int hmixer, MIXERCONTROL mxc, int volume) { // This function sets the value for a volume control. // Returns True if successful bool retValue; int rc; MIXERCONTROLDETAILS mxcd = new MIXERCONTROLDETAILS(); MIXERCONTROLDETAILS_UNSIGNED vol = new MIXERCONTROLDETAILS_UNSIGNED(); mxcd.item = 0; mxcd.dwControlID = mxc.dwControlID; mxcd.cbStruct = Marshal.SizeOf(mxcd); mxcd.cbDetails = Marshal.SizeOf(vol); // Allocate a buffer for the control value buffer mxcd.cChannels = 1; vol.dwValue = volume; // Copy the data into the control value buffer mxcd.paDetails = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof (MIXERCONTROLDETAILS_UNSIGNED))); Marshal.StructureToPtr(vol, mxcd.paDetails, false); // Set the control value rc = mixerSetControlDetails(hmixer, ref mxcd, MIXER_SETCONTROLDETAILSF_VALUE); if (MMSYSERR_NOERROR == rc) { retValue = true; } else { retValue = false; } return retValue; }
private static void GetVolumeControl(int hmixer, int componentType, int ctrlType, out MIXERCONTROL mxc, out int vCurrentVol) { // This function attempts to obtain a mixer control. // Returns True if successful. MIXERLINECONTROLS mxlc = new MIXERLINECONTROLS(); MIXERLINE mxl = new MIXERLINE(); MIXERCONTROLDETAILS pmxcd = new MIXERCONTROLDETAILS(); MIXERCONTROLDETAILS_UNSIGNED du = new MIXERCONTROLDETAILS_UNSIGNED(); mxc = new MIXERCONTROL(); vCurrentVol = -1; //mxl.szShortName = new string(' ', MIXER_SHORT_NAME_CHARS); //mxl.szName = new string(' ', MIXER_LONG_NAME_CHARS); mxl.cbStruct = Marshal.SizeOf(mxl); mxl.dwComponentType = componentType; // Obtain a line corresponding to the component public enum CheckErr(mixerGetLineInfoA(hmixer, ref mxl, MIXER_GETLINEINFOF_COMPONENTTYPE)); int sizeofMIXERCONTROL = 152; //Marshal.SizeOf(typeof(MIXERCONTROL)) int ctrl = Marshal.SizeOf(typeof (MIXERCONTROL)); mxlc.pamxctrl = Marshal.AllocCoTaskMem(sizeofMIXERCONTROL); //new MIXERCONTROL(); mxlc.cbStruct = Marshal.SizeOf(mxlc); mxlc.dwLineID = mxl.dwLineID; mxlc.dwControl = ctrlType; mxlc.cControls = 1; mxlc.cbmxctrl = sizeofMIXERCONTROL; // Allocate a buffer for the control mxc.cbStruct = sizeofMIXERCONTROL; // Get the control try { CheckErr(mixerGetLineControlsA(hmixer, ref mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE)); // Copy the control into the destination structure mxc = (MIXERCONTROL)Marshal.PtrToStructure(mxlc.pamxctrl, typeof (MIXERCONTROL)); } catch (Exception e) { throw e; } finally { Marshal.FreeCoTaskMem(mxlc.pamxctrl); } int sizeofMIXERCONTROLDETAILS = Marshal.SizeOf(typeof (MIXERCONTROLDETAILS)); int sizeofMIXERCONTROLDETAILS_UNSIGNED = Marshal.SizeOf(typeof (MIXERCONTROLDETAILS_UNSIGNED)); pmxcd.cbStruct = sizeofMIXERCONTROLDETAILS; pmxcd.dwControlID = mxc.dwControlID; pmxcd.paDetails = Marshal.AllocCoTaskMem(sizeofMIXERCONTROLDETAILS_UNSIGNED); pmxcd.cChannels = 1; pmxcd.item = 0; pmxcd.cbDetails = sizeofMIXERCONTROLDETAILS_UNSIGNED; try { CheckErr(mixerGetControlDetailsA(hmixer, ref pmxcd, MIXER_GETCONTROLDETAILSF_VALUE)); du = (MIXERCONTROLDETAILS_UNSIGNED)Marshal.PtrToStructure(pmxcd.paDetails, typeof (MIXERCONTROLDETAILS_UNSIGNED)); } catch (Exception e) { throw e; } finally { Marshal.FreeCoTaskMem(pmxcd.paDetails); } vCurrentVol = du.dwValue; }