winmm mixer tests read and write details
Robert Reif
reif at earthlink.net
Fri Aug 27 13:14:10 CDT 2004
Adds tests to read and write control details.
-------------- next part --------------
Index: dlls/winmm/tests/mixer.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/tests/mixer.c,v
retrieving revision 1.5
diff -u -r1.5 mixer.c
--- dlls/winmm/tests/mixer.c 16 Aug 2004 21:10:04 -0000 1.5
+++ dlls/winmm/tests/mixer.c 27 Aug 2004 18:10:19 -0000
@@ -20,7 +20,6 @@
/*
* To Do:
- * examine and update control details
* add interactive tests
*/
@@ -181,6 +180,176 @@
return flags;
}
+
+static void mixer_test_controlA(HMIXER mix, LPMIXERCONTROLA control)
+{
+ MMRESULT rc;
+
+ if ((control->dwControlType == MIXERCONTROL_CONTROLTYPE_VOLUME) ||
+ (control->dwControlType == MIXERCONTROL_CONTROLTYPE_UNSIGNED)) {
+ MIXERCONTROLDETAILS details;
+ MIXERCONTROLDETAILS_UNSIGNED value;
+
+ details.cbStruct = sizeof(MIXERCONTROLDETAILS);
+ details.dwControlID = control->dwControlID;
+ details.cChannels = 1;
+ details.cMultipleItems = 0;
+ details.paDetails = &value;
+ details.cbDetails = sizeof(value);
+
+ /* read the current control value */
+ rc=mixerGetControlDetails((HMIXEROBJ)mix,&details,MIXER_GETCONTROLDETAILSF_VALUE);
+ ok(rc==MMSYSERR_NOERROR,"mixerGetControlDetails(MIXER_GETCONTROLDETAILSF_VALUE): "
+ "MMSYSERR_NOERROR expected, got %s\n",
+ mmsys_error(rc));
+ if (rc==MMSYSERR_NOERROR) {
+ MIXERCONTROLDETAILS new_details;
+ MIXERCONTROLDETAILS_UNSIGNED new_value;
+
+ if (winetest_interactive)
+ trace(" Value=%ld\n",value.dwValue);
+
+ if (value.dwValue + control->Metrics.cSteps < control->Bounds.dwMaximum)
+ new_value.dwValue = value.dwValue + control->Metrics.cSteps;
+ else
+ new_value.dwValue = value.dwValue - control->Metrics.cSteps;
+
+ new_details.cbStruct = sizeof(MIXERCONTROLDETAILS);
+ new_details.dwControlID = control->dwControlID;
+ new_details.cChannels = 1;
+ new_details.cMultipleItems = 0;
+ new_details.paDetails = &new_value;
+ new_details.cbDetails = sizeof(new_value);
+
+ /* change the control value by one step */
+ rc=mixerSetControlDetails((HMIXEROBJ)mix,&new_details,MIXER_SETCONTROLDETAILSF_VALUE);
+ ok(rc==MMSYSERR_NOERROR,"mixerSetControlDetails(MIXER_SETCONTROLDETAILSF_VALUE): "
+ "MMSYSERR_NOERROR expected, got %s\n",
+ mmsys_error(rc));
+ if (rc==MMSYSERR_NOERROR) {
+ MIXERCONTROLDETAILS ret_details;
+ MIXERCONTROLDETAILS_UNSIGNED ret_value;
+
+ ret_details.cbStruct = sizeof(MIXERCONTROLDETAILS);
+ ret_details.dwControlID = control->dwControlID;
+ ret_details.cChannels = 1;
+ ret_details.cMultipleItems = 0;
+ ret_details.paDetails = &ret_value;
+ ret_details.cbDetails = sizeof(ret_value);
+
+ /* read back the new control value */
+ rc=mixerGetControlDetails((HMIXEROBJ)mix,&ret_details,MIXER_GETCONTROLDETAILSF_VALUE);
+ ok(rc==MMSYSERR_NOERROR,"mixerGetControlDetails(MIXER_GETCONTROLDETAILSF_VALUE): "
+ "MMSYSERR_NOERROR expected, got %s\n",
+ mmsys_error(rc));
+ if (rc==MMSYSERR_NOERROR) {
+ /* result may not match exactly because of rounding */
+ ok(abs(ret_value.dwValue-new_value.dwValue)<=1,
+ "Couldn't change value from %ld to %ld, returned %ld\n",
+ value.dwValue,new_value.dwValue,ret_value.dwValue);
+
+ if (abs(ret_value.dwValue-new_value.dwValue)<=1) {
+ details.cbStruct = sizeof(MIXERCONTROLDETAILS);
+ details.dwControlID = control->dwControlID;
+ details.cChannels = 1;
+ details.cMultipleItems = 0;
+ details.paDetails = &value;
+ details.cbDetails = sizeof(value);
+
+ /* restore original value */
+ rc=mixerSetControlDetails((HMIXEROBJ)mix,&details,MIXER_SETCONTROLDETAILSF_VALUE);
+ ok(rc==MMSYSERR_NOERROR,"mixerSetControlDetails(MIXER_SETCONTROLDETAILSF_VALUE): "
+ "MMSYSERR_NOERROR expected, got %s\n",
+ mmsys_error(rc));
+ }
+ }
+ }
+ }
+ } else if ((control->dwControlType == MIXERCONTROL_CONTROLTYPE_MUTE) ||
+ (control->dwControlType == MIXERCONTROL_CONTROLTYPE_BOOLEAN) ||
+ (control->dwControlType == MIXERCONTROL_CONTROLTYPE_BUTTON)) {
+ MIXERCONTROLDETAILS details;
+ MIXERCONTROLDETAILS_BOOLEAN value;
+
+ details.cbStruct = sizeof(MIXERCONTROLDETAILS);
+ details.dwControlID = control->dwControlID;
+ details.cChannels = 1;
+ details.cMultipleItems = 0;
+ details.paDetails = &value;
+ details.cbDetails = sizeof(value);
+
+ rc=mixerGetControlDetails((HMIXEROBJ)mix,&details,MIXER_GETCONTROLDETAILSF_VALUE);
+ ok(rc==MMSYSERR_NOERROR,"mixerGetControlDetails(MIXER_GETCONTROLDETAILSF_VALUE): "
+ "MMSYSERR_NOERROR expected, got %s\n",
+ mmsys_error(rc));
+ if (rc==MMSYSERR_NOERROR) {
+ MIXERCONTROLDETAILS new_details;
+ MIXERCONTROLDETAILS_BOOLEAN new_value;
+
+ if (winetest_interactive)
+ trace(" Value=%ld\n",value.fValue);
+
+ if (value.fValue == FALSE)
+ new_value.fValue = TRUE;
+ else
+ new_value.fValue = FALSE;
+
+ new_details.cbStruct = sizeof(MIXERCONTROLDETAILS);
+ new_details.dwControlID = control->dwControlID;
+ new_details.cChannels = 1;
+ new_details.cMultipleItems = 0;
+ new_details.paDetails = &new_value;
+ new_details.cbDetails = sizeof(new_value);
+
+ /* change the control value by one step */
+ rc=mixerSetControlDetails((HMIXEROBJ)mix,&new_details,MIXER_SETCONTROLDETAILSF_VALUE);
+ ok(rc==MMSYSERR_NOERROR,"mixerSetControlDetails(MIXER_SETCONTROLDETAILSF_VALUE): "
+ "MMSYSERR_NOERROR expected, got %s\n",
+ mmsys_error(rc));
+ if (rc==MMSYSERR_NOERROR) {
+ MIXERCONTROLDETAILS ret_details;
+ MIXERCONTROLDETAILS_BOOLEAN ret_value;
+
+ ret_details.cbStruct = sizeof(MIXERCONTROLDETAILS);
+ ret_details.dwControlID = control->dwControlID;
+ ret_details.cChannels = 1;
+ ret_details.cMultipleItems = 0;
+ ret_details.paDetails = &ret_value;
+ ret_details.cbDetails = sizeof(ret_value);
+
+ /* read back the new control value */
+ rc=mixerGetControlDetails((HMIXEROBJ)mix,&ret_details,MIXER_GETCONTROLDETAILSF_VALUE);
+ ok(rc==MMSYSERR_NOERROR,"mixerGetControlDetails(MIXER_GETCONTROLDETAILSF_VALUE): "
+ "MMSYSERR_NOERROR expected, got %s\n",
+ mmsys_error(rc));
+ if (rc==MMSYSERR_NOERROR) {
+ /* result may not match exactly because of rounding */
+ ok(ret_value.fValue==new_value.fValue,
+ "Couldn't change value from %ld to %ld, returned %ld\n",
+ value.fValue,new_value.fValue,ret_value.fValue);
+
+ if (ret_value.fValue==new_value.fValue) {
+ details.cbStruct = sizeof(MIXERCONTROLDETAILS);
+ details.dwControlID = control->dwControlID;
+ details.cChannels = 1;
+ details.cMultipleItems = 0;
+ details.paDetails = &value;
+ details.cbDetails = sizeof(value);
+
+ /* restore original value */
+ rc=mixerSetControlDetails((HMIXEROBJ)mix,&details,MIXER_SETCONTROLDETAILSF_VALUE);
+ ok(rc==MMSYSERR_NOERROR,"mixerSetControlDetails(MIXER_SETCONTROLDETAILSF_VALUE): "
+ "MMSYSERR_NOERROR expected, got %s\n",
+ mmsys_error(rc));
+ }
+ }
+ }
+ }
+ } else {
+ /* FIXME */
+ }
+}
+
void mixer_test_deviceA(int device)
{
MIXERCAPSA capsA;
@@ -208,6 +377,10 @@
capsA.szPname, capsA.vDriverVersion >> 8,
capsA.vDriverVersion & 0xff,capsA.wMid,capsA.wPid,
capsA.cDestinations);
+ } else {
+ trace(" %d: \"%s\" %d.%d (%d:%d)\n", device,
+ capsA.szPname, capsA.vDriverVersion >> 8,
+ capsA.vDriverVersion & 0xff,capsA.wMid,capsA.wPid);
}
rc=mixerOpen(&mix, device, 0, 0, 0);
@@ -363,6 +536,8 @@
S1(array[nc].Bounds).dwMaximum,
array[nc].Metrics.cSteps);
}
+
+ mixer_test_controlA(mix, &array[nc]);
}
}
@@ -379,6 +554,175 @@
}
}
+static void mixer_test_controlW(HMIXER mix, LPMIXERCONTROLW control)
+{
+ MMRESULT rc;
+
+ if ((control->dwControlType == MIXERCONTROL_CONTROLTYPE_VOLUME) ||
+ (control->dwControlType == MIXERCONTROL_CONTROLTYPE_UNSIGNED)) {
+ MIXERCONTROLDETAILS details;
+ MIXERCONTROLDETAILS_UNSIGNED value;
+
+ details.cbStruct = sizeof(MIXERCONTROLDETAILS);
+ details.dwControlID = control->dwControlID;
+ details.cChannels = 1;
+ details.cMultipleItems = 0;
+ details.paDetails = &value;
+ details.cbDetails = sizeof(value);
+
+ /* read the current control value */
+ rc=mixerGetControlDetails((HMIXEROBJ)mix,&details,MIXER_GETCONTROLDETAILSF_VALUE);
+ ok(rc==MMSYSERR_NOERROR,"mixerGetControlDetails(MIXER_GETCONTROLDETAILSF_VALUE): "
+ "MMSYSERR_NOERROR expected, got %s\n",
+ mmsys_error(rc));
+ if (rc==MMSYSERR_NOERROR) {
+ MIXERCONTROLDETAILS new_details;
+ MIXERCONTROLDETAILS_UNSIGNED new_value;
+
+ if (winetest_interactive)
+ trace(" Value=%ld\n",value.dwValue);
+
+ if (value.dwValue + control->Metrics.cSteps < control->Bounds.dwMaximum)
+ new_value.dwValue = value.dwValue + control->Metrics.cSteps;
+ else
+ new_value.dwValue = value.dwValue - control->Metrics.cSteps;
+
+ new_details.cbStruct = sizeof(MIXERCONTROLDETAILS);
+ new_details.dwControlID = control->dwControlID;
+ new_details.cChannels = 1;
+ new_details.cMultipleItems = 0;
+ new_details.paDetails = &new_value;
+ new_details.cbDetails = sizeof(new_value);
+
+ /* change the control value by one step */
+ rc=mixerSetControlDetails((HMIXEROBJ)mix,&new_details,MIXER_SETCONTROLDETAILSF_VALUE);
+ ok(rc==MMSYSERR_NOERROR,"mixerSetControlDetails(MIXER_SETCONTROLDETAILSF_VALUE): "
+ "MMSYSERR_NOERROR expected, got %s\n",
+ mmsys_error(rc));
+ if (rc==MMSYSERR_NOERROR) {
+ MIXERCONTROLDETAILS ret_details;
+ MIXERCONTROLDETAILS_UNSIGNED ret_value;
+
+ ret_details.cbStruct = sizeof(MIXERCONTROLDETAILS);
+ ret_details.dwControlID = control->dwControlID;
+ ret_details.cChannels = 1;
+ ret_details.cMultipleItems = 0;
+ ret_details.paDetails = &ret_value;
+ ret_details.cbDetails = sizeof(ret_value);
+
+ /* read back the new control value */
+ rc=mixerGetControlDetails((HMIXEROBJ)mix,&ret_details,MIXER_GETCONTROLDETAILSF_VALUE);
+ ok(rc==MMSYSERR_NOERROR,"mixerGetControlDetails(MIXER_GETCONTROLDETAILSF_VALUE): "
+ "MMSYSERR_NOERROR expected, got %s\n",
+ mmsys_error(rc));
+ if (rc==MMSYSERR_NOERROR) {
+ /* result may not match exactly because of rounding */
+ ok(abs(ret_value.dwValue-new_value.dwValue)<=1,
+ "Couldn't change value from %ld to %ld, returned %ld\n",
+ value.dwValue,new_value.dwValue,ret_value.dwValue);
+
+ if (abs(ret_value.dwValue-new_value.dwValue)<=1) {
+ details.cbStruct = sizeof(MIXERCONTROLDETAILS);
+ details.dwControlID = control->dwControlID;
+ details.cChannels = 1;
+ details.cMultipleItems = 0;
+ details.paDetails = &value;
+ details.cbDetails = sizeof(value);
+
+ /* restore original value */
+ rc=mixerSetControlDetails((HMIXEROBJ)mix,&details,MIXER_SETCONTROLDETAILSF_VALUE);
+ ok(rc==MMSYSERR_NOERROR,"mixerSetControlDetails(MIXER_SETCONTROLDETAILSF_VALUE): "
+ "MMSYSERR_NOERROR expected, got %s\n",
+ mmsys_error(rc));
+ }
+ }
+ }
+ }
+ } else if ((control->dwControlType == MIXERCONTROL_CONTROLTYPE_MUTE) ||
+ (control->dwControlType == MIXERCONTROL_CONTROLTYPE_BOOLEAN) ||
+ (control->dwControlType == MIXERCONTROL_CONTROLTYPE_BUTTON)) {
+ MIXERCONTROLDETAILS details;
+ MIXERCONTROLDETAILS_BOOLEAN value;
+
+ details.cbStruct = sizeof(MIXERCONTROLDETAILS);
+ details.dwControlID = control->dwControlID;
+ details.cChannels = 1;
+ details.cMultipleItems = 0;
+ details.paDetails = &value;
+ details.cbDetails = sizeof(value);
+
+ rc=mixerGetControlDetails((HMIXEROBJ)mix,&details,MIXER_GETCONTROLDETAILSF_VALUE);
+ ok(rc==MMSYSERR_NOERROR,"mixerGetControlDetails(MIXER_GETCONTROLDETAILSF_VALUE): "
+ "MMSYSERR_NOERROR expected, got %s\n",
+ mmsys_error(rc));
+ if (rc==MMSYSERR_NOERROR) {
+ MIXERCONTROLDETAILS new_details;
+ MIXERCONTROLDETAILS_BOOLEAN new_value;
+
+ if (winetest_interactive)
+ trace(" Value=%ld\n",value.fValue);
+
+ if (value.fValue == FALSE)
+ new_value.fValue = TRUE;
+ else
+ new_value.fValue = FALSE;
+
+ new_details.cbStruct = sizeof(MIXERCONTROLDETAILS);
+ new_details.dwControlID = control->dwControlID;
+ new_details.cChannels = 1;
+ new_details.cMultipleItems = 0;
+ new_details.paDetails = &new_value;
+ new_details.cbDetails = sizeof(new_value);
+
+ /* change the control value by one step */
+ rc=mixerSetControlDetails((HMIXEROBJ)mix,&new_details,MIXER_SETCONTROLDETAILSF_VALUE);
+ ok(rc==MMSYSERR_NOERROR,"mixerSetControlDetails(MIXER_SETCONTROLDETAILSF_VALUE): "
+ "MMSYSERR_NOERROR expected, got %s\n",
+ mmsys_error(rc));
+ if (rc==MMSYSERR_NOERROR) {
+ MIXERCONTROLDETAILS ret_details;
+ MIXERCONTROLDETAILS_BOOLEAN ret_value;
+
+ ret_details.cbStruct = sizeof(MIXERCONTROLDETAILS);
+ ret_details.dwControlID = control->dwControlID;
+ ret_details.cChannels = 1;
+ ret_details.cMultipleItems = 0;
+ ret_details.paDetails = &ret_value;
+ ret_details.cbDetails = sizeof(ret_value);
+
+ /* read back the new control value */
+ rc=mixerGetControlDetails((HMIXEROBJ)mix,&ret_details,MIXER_GETCONTROLDETAILSF_VALUE);
+ ok(rc==MMSYSERR_NOERROR,"mixerGetControlDetails(MIXER_GETCONTROLDETAILSF_VALUE): "
+ "MMSYSERR_NOERROR expected, got %s\n",
+ mmsys_error(rc));
+ if (rc==MMSYSERR_NOERROR) {
+ /* result may not match exactly because of rounding */
+ ok(ret_value.fValue==new_value.fValue,
+ "Couldn't change value from %ld to %ld, returned %ld\n",
+ value.fValue,new_value.fValue,ret_value.fValue);
+
+ if (ret_value.fValue==new_value.fValue) {
+ details.cbStruct = sizeof(MIXERCONTROLDETAILS);
+ details.dwControlID = control->dwControlID;
+ details.cChannels = 1;
+ details.cMultipleItems = 0;
+ details.paDetails = &value;
+ details.cbDetails = sizeof(value);
+
+ /* restore original value */
+ rc=mixerSetControlDetails((HMIXEROBJ)mix,&details,MIXER_SETCONTROLDETAILSF_VALUE);
+ ok(rc==MMSYSERR_NOERROR,"mixerSetControlDetails(MIXER_SETCONTROLDETAILSF_VALUE): "
+ "MMSYSERR_NOERROR expected, got %s\n",
+ mmsys_error(rc));
+ }
+ }
+ }
+ }
+ } else {
+ /* FIXME */
+ }
+}
+
void mixer_test_deviceW(int device)
{
MIXERCAPSW capsW;
@@ -411,6 +755,10 @@
szPname, capsW.vDriverVersion >> 8,
capsW.vDriverVersion & 0xff,capsW.wMid,capsW.wPid,
capsW.cDestinations);
+ } else {
+ trace(" %d: \"%s\" %d.%d (%d:%d)\n", device,
+ szPname, capsW.vDriverVersion >> 8,
+ capsW.vDriverVersion & 0xff,capsW.wMid,capsW.wPid);
}
rc=mixerOpen(&mix, device, 0, 0, 0);
ok(rc==MMSYSERR_NOERROR,
@@ -586,6 +934,7 @@
S1(array[nc].Bounds).dwMaximum,
array[nc].Metrics.cSteps);
}
+ mixer_test_controlW(mix, &array[nc]);
}
}
More information about the wine-patches
mailing list