winmm: Remove 'dwLineID' check when MIXER_GETLINECONTROLSF_ONEBYID winmm/tests: Add flags tests for mixerGetLineControlsA/W support MIXER_GETLINECONTROLSF_ONEBYID and MIXER_GETLINECONTROLSF_ONEBYTYPE
Signed-off-by: YeshunYe yeyeshun@uniontech.com
From: YeshunYe yeyeshun@uniontech.com
support MIXER_GETLINECONTROLSF_ONEBYID and MIXER_GETLINECONTROLSF_ONEBYTYPE
Signed-off-by: YeshunYe yeyeshun@uniontech.com --- dlls/winmm/tests/mixer.c | 343 ++++++++++++++++++++++++++------------- 1 file changed, 226 insertions(+), 117 deletions(-)
diff --git a/dlls/winmm/tests/mixer.c b/dlls/winmm/tests/mixer.c index 5ab0d4a698d..828c53e723f 100644 --- a/dlls/winmm/tests/mixer.c +++ b/dlls/winmm/tests/mixer.c @@ -364,12 +364,117 @@ static void mixer_test_controlA(HMIXEROBJ mix, MIXERCONTROLA *control) } }
+static void test_mixerGetLineControlsA(MIXERLINEA* mixerlineA, HMIXEROBJ mix, DWORD fdwControls) +{ + LPMIXERCONTROLA array; + MMRESULT rc; + DWORD nc; + DWORD ids[] = {0, 1}; + DWORD types[] = {MIXERCONTROL_CONTROLTYPE_VOLUME, MIXERCONTROL_CONTROLTYPE_MUTE}; + int loop = 0; + const char* current_flag; + + if (mixerlineA->cControls) { + array=HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, + (fdwControls == MIXER_GETLINECONTROLSF_ALL) ? + mixerlineA->cControls*sizeof(MIXERCONTROLA) : sizeof(MIXERCONTROLA)); + if (array) { + MIXERLINECONTROLSA controls; + rc = mixerGetLineControlsA(mix, 0, fdwControls); + ok(rc==MMSYSERR_INVALPARAM, + "mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ALL): " + "MMSYSERR_INVALPARAM expected, got %s\n", + mmsys_error(rc)); + rc = mixerGetLineControlsA(mix, &controls, -1); + ok(rc==MMSYSERR_INVALFLAG||rc==MMSYSERR_INVALPARAM, + "mixerGetLineControlsA(-1): " + "MMSYSERR_INVALFLAG or MMSYSERR_INVALPARAM expected, got %s\n", + mmsys_error(rc)); + switch (fdwControls) + { + case MIXER_GETLINECONTROLSF_ALL: + loop = 1; + current_flag = "MIXER_GETLINECONTROLSF_ALL"; + break; + case MIXER_GETLINECONTROLSF_ONEBYID: + loop = sizeof(ids) / sizeof(ids[0]); + current_flag = "MIXER_GETLINECONTROLSF_ONEBYID"; + break; + case MIXER_GETLINECONTROLSF_ONEBYTYPE: + loop = sizeof(types) / sizeof(types[0]); + current_flag = "MIXER_GETLINECONTROLSF_ONEBYTYPE"; + break; + } + for (int i = 0; i < loop; i++) + { + switch (fdwControls) + { + case MIXER_GETLINECONTROLSF_ALL: + controls.cbStruct = sizeof(MIXERLINECONTROLSA); + controls.cControls = mixerlineA->cControls; + controls.dwLineID = mixerlineA->dwLineID; + controls.pamxctrl = array; + controls.cbmxctrl = sizeof(MIXERCONTROLA); + break; + case MIXER_GETLINECONTROLSF_ONEBYID: + controls.cbStruct = sizeof(MIXERLINECONTROLSA); + controls.cControls = 1; + controls.dwLineID = 0xdeadbeef; // MSDN: dwLineID will be ignored + controls.dwControlID = ids[i]; + controls.pamxctrl = array; + controls.cbmxctrl = sizeof(MIXERCONTROLA); + break; + case MIXER_GETLINECONTROLSF_ONEBYTYPE: + controls.cbStruct = sizeof(MIXERLINECONTROLSA); + controls.cControls = 1; + controls.dwLineID = mixerlineA->dwLineID; + controls.dwControlType = types[i]; + controls.pamxctrl = array; + controls.cbmxctrl = sizeof(MIXERCONTROLA); + break; + + default: + break; + } + + rc = mixerGetLineControlsA(mix, &controls, fdwControls); + todo_wine_if(fdwControls == MIXER_GETLINECONTROLSF_ONEBYID) + ok(rc==MMSYSERR_NOERROR, + "mixerGetLineControlsA(%s): " + "MMSYSERR_NOERROR expected, got %s\n", + current_flag, mmsys_error(rc)); + if (rc==MMSYSERR_NOERROR) { + for(nc=0;nc<controls.cControls;nc++) { + if (winetest_interactive) { + trace(" %ld: "%s" (%s) ControlID=%ld\n", nc, + array[nc].szShortName, + array[nc].szName, array[nc].dwControlID); + trace(" ControlType=%s\n", + control_type(array[nc].dwControlType)); + trace(" Control=0x%08lx(%s)\n", + array[nc].fdwControl, + control_flags(array[nc].fdwControl)); + trace(" Items=%ld Min=%ld Max=%ld Step=%ld\n", + array[nc].cMultipleItems, + S1(array[nc].Bounds).dwMinimum, + S1(array[nc].Bounds).dwMaximum, + array[nc].Metrics.cSteps); + } + mixer_test_controlA(mix, &array[nc]); + } + } + } + HeapFree(GetProcessHeap(),0,array); + } + } +} + static void mixer_test_deviceA(int device) { MIXERCAPSA capsA; HMIXEROBJ mix; MMRESULT rc; - DWORD d,s,ns,nc; + DWORD d,s,ns;
rc=mixerGetDevCapsA(device,0,sizeof(capsA)); ok(rc==MMSYSERR_INVALPARAM, @@ -488,8 +593,6 @@ static void mixer_test_deviceA(int device) if (rc==MMSYSERR_NODRIVER) trace(" No Driver\n"); else if (rc==MMSYSERR_NOERROR) { - LPMIXERCONTROLA array; - MIXERLINECONTROLSA controls; if (winetest_interactive) { trace(" %ld: "%s" (%s) Destination=%ld Source=%ld\n", s,mixerlineA.szShortName, mixerlineA.szName, @@ -512,61 +615,9 @@ static void mixer_test_deviceA(int device) mixerlineA.Target.wMid, mixerlineA.Target.wPid); } if (mixerlineA.cControls) { - array=HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, - mixerlineA.cControls*sizeof(MIXERCONTROLA)); - if (array) { - memset(&controls, 0, sizeof(controls)); - - rc = mixerGetLineControlsA(mix, 0, MIXER_GETLINECONTROLSF_ALL); - ok(rc==MMSYSERR_INVALPARAM, - "mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ALL): " - "MMSYSERR_INVALPARAM expected, got %s\n", - mmsys_error(rc)); - - rc = mixerGetLineControlsA(mix, &controls, -1); - ok(rc==MMSYSERR_INVALFLAG||rc==MMSYSERR_INVALPARAM, - "mixerGetLineControlsA(-1): " - "MMSYSERR_INVALFLAG or MMSYSERR_INVALPARAM expected, got %s\n", - mmsys_error(rc)); - - controls.cbStruct = sizeof(MIXERLINECONTROLSA); - controls.cControls = mixerlineA.cControls; - controls.dwLineID = mixerlineA.dwLineID; - controls.pamxctrl = array; - controls.cbmxctrl = sizeof(MIXERCONTROLA); - - /* FIXME: do MIXER_GETLINECONTROLSF_ONEBYID - * and MIXER_GETLINECONTROLSF_ONEBYTYPE - */ - rc = mixerGetLineControlsA(mix, &controls, MIXER_GETLINECONTROLSF_ALL); - ok(rc==MMSYSERR_NOERROR, - "mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ALL): " - "MMSYSERR_NOERROR expected, got %s\n", - mmsys_error(rc)); - if (rc==MMSYSERR_NOERROR) { - for(nc=0;nc<mixerlineA.cControls;nc++) { - if (winetest_interactive) { - trace(" %ld: "%s" (%s) ControlID=%ld\n", nc, - array[nc].szShortName, - array[nc].szName, array[nc].dwControlID); - trace(" ControlType=%s\n", - control_type(array[nc].dwControlType)); - trace(" Control=0x%08lx(%s)\n", - array[nc].fdwControl, - control_flags(array[nc].fdwControl)); - trace(" Items=%ld Min=%ld Max=%ld Step=%ld\n", - array[nc].cMultipleItems, - S1(array[nc].Bounds).dwMinimum, - S1(array[nc].Bounds).dwMaximum, - array[nc].Metrics.cSteps); - } - - mixer_test_controlA(mix, &array[nc]); - } - } - - HeapFree(GetProcessHeap(),0,array); - } + test_mixerGetLineControlsA(&mixerlineA, mix, MIXER_GETLINECONTROLSF_ONEBYID); + test_mixerGetLineControlsA(&mixerlineA, mix, MIXER_GETLINECONTROLSF_ONEBYTYPE); + test_mixerGetLineControlsA(&mixerlineA, mix, MIXER_GETLINECONTROLSF_ALL); } } } @@ -743,12 +794,125 @@ static void mixer_test_controlW(HMIXEROBJ mix, MIXERCONTROLW *control) } }
+static void test_mixerGetLineControlsW(MIXERLINEW* mixerlineW, HMIXEROBJ mix, DWORD fdwControls) +{ + LPMIXERCONTROLW array; + MMRESULT rc; + DWORD nc; + char szShortName[MIXER_SHORT_NAME_CHARS]; + char szName[MIXER_LONG_NAME_CHARS]; + DWORD ids[] = {0, 1}; + DWORD types[] = {MIXERCONTROL_CONTROLTYPE_VOLUME, MIXERCONTROL_CONTROLTYPE_MUTE}; + int loop = 0; + const char* current_flag; + + if (mixerlineW->cControls) { + array=HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, + fdwControls == MIXER_GETLINECONTROLSF_ALL ? + mixerlineW->cControls*sizeof(MIXERCONTROLW) : sizeof(MIXERCONTROLW)); + if (array) { + MIXERLINECONTROLSW controls; + rc = mixerGetLineControlsW(mix, 0, fdwControls); + ok(rc==MMSYSERR_INVALPARAM, + "mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ALL): " + "MMSYSERR_INVALPARAM expected, got %s\n", + mmsys_error(rc)); + rc = mixerGetLineControlsW(mix, &controls, -1); + ok(rc==MMSYSERR_INVALFLAG||rc==MMSYSERR_INVALPARAM, + "mixerGetLineControlsW(-1): " + "MMSYSERR_INVALFLAG or MMSYSERR_INVALPARAM expected, got %s\n", + mmsys_error(rc)); + switch (fdwControls) + { + case MIXER_GETLINECONTROLSF_ALL: + loop = 1; + current_flag = "MIXER_GETLINECONTROLSF_ALL"; + break; + case MIXER_GETLINECONTROLSF_ONEBYID: + loop = sizeof(ids) / sizeof(ids[0]); + current_flag = "MIXER_GETLINECONTROLSF_ONEBYID"; + break; + case MIXER_GETLINECONTROLSF_ONEBYTYPE: + loop = sizeof(types) / sizeof(types[0]); + current_flag = "MIXER_GETLINECONTROLSF_ONEBYTYPE"; + break; + } + for (int i = 0; i < loop; i++) + { + switch (fdwControls) + { + case MIXER_GETLINECONTROLSF_ALL: + controls.cbStruct = sizeof(MIXERLINECONTROLSW); + controls.cControls = mixerlineW->cControls; + controls.dwLineID = mixerlineW->dwLineID; + controls.pamxctrl = array; + controls.cbmxctrl = sizeof(MIXERCONTROLW); + break; + case MIXER_GETLINECONTROLSF_ONEBYID: + controls.cbStruct = sizeof(MIXERLINECONTROLSW); + controls.cControls = 1; + controls.dwLineID = 0xdeadbeef; // MSDN: dwLineID will be ignored + controls.dwControlID = ids[i]; + controls.pamxctrl = array; + controls.cbmxctrl = sizeof(MIXERCONTROLW); + break; + case MIXER_GETLINECONTROLSF_ONEBYTYPE: + controls.cbStruct = sizeof(MIXERLINECONTROLSW); + controls.cControls = 1; + controls.dwLineID = mixerlineW->dwLineID; + controls.dwControlType = types[i]; + controls.pamxctrl = array; + controls.cbmxctrl = sizeof(MIXERCONTROLW); + break; + + default: + break; + } + + rc = mixerGetLineControlsW(mix, &controls, fdwControls); + todo_wine_if(fdwControls == MIXER_GETLINECONTROLSF_ONEBYID) + ok(rc==MMSYSERR_NOERROR, + "mixerGetLineControlsW(%s): " + "MMSYSERR_NOERROR expected, got %s\n", + current_flag, mmsys_error(rc)); + if (rc==MMSYSERR_NOERROR) { + for(nc=0;nc<controls.cControls;nc++) { + if (winetest_interactive) { + WideCharToMultiByte(CP_ACP,0,array[nc].szShortName, + MIXER_SHORT_NAME_CHARS,szShortName, + MIXER_SHORT_NAME_CHARS,NULL,NULL); + WideCharToMultiByte(CP_ACP,0,array[nc].szName, + MIXER_LONG_NAME_CHARS,szName, + MIXER_LONG_NAME_CHARS,NULL,NULL); + trace(" %ld: "%s" (%s) ControlID=%ld\n", nc, + szShortName, szName, array[nc].dwControlID); + trace(" ControlType=%s\n", + control_type(array[nc].dwControlType)); + trace(" Control=0x%08lx(%s)\n", + array[nc].fdwControl, + control_flags(array[nc].fdwControl)); + trace(" Items=%ld Min=%ld Max=%ld Step=%ld\n", + array[nc].cMultipleItems, + S1(array[nc].Bounds).dwMinimum, + S1(array[nc].Bounds).dwMaximum, + array[nc].Metrics.cSteps); + } + mixer_test_controlW(mix, &array[nc]); + } + } + } + HeapFree(GetProcessHeap(),0,array); + } + } + +} + static void mixer_test_deviceW(int device) { MIXERCAPSW capsW; HMIXEROBJ mix; MMRESULT rc; - DWORD d,s,ns,nc; + DWORD d,s,ns; char szShortName[MIXER_SHORT_NAME_CHARS]; char szName[MIXER_LONG_NAME_CHARS]; char szPname[MAXPNAMELEN]; @@ -881,8 +1045,6 @@ static void mixer_test_deviceW(int device) if (rc==MMSYSERR_NODRIVER) trace(" No Driver\n"); else if (rc==MMSYSERR_NOERROR) { - LPMIXERCONTROLW array; - MIXERLINECONTROLSW controls; if (winetest_interactive) { WideCharToMultiByte(CP_ACP,0,mixerlineW.szShortName, MIXER_SHORT_NAME_CHARS,szShortName, @@ -913,62 +1075,9 @@ static void mixer_test_deviceW(int device) mixerlineW.Target.wMid, mixerlineW.Target.wPid); } if (mixerlineW.cControls) { - array=HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, - mixerlineW.cControls*sizeof(MIXERCONTROLW)); - if (array) { - rc = mixerGetLineControlsW(mix, 0, MIXER_GETLINECONTROLSF_ALL); - ok(rc==MMSYSERR_INVALPARAM, - "mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ALL): " - "MMSYSERR_INVALPARAM expected, got %s\n", - mmsys_error(rc)); - rc = mixerGetLineControlsW(mix, &controls, -1); - ok(rc==MMSYSERR_INVALFLAG||rc==MMSYSERR_INVALPARAM, - "mixerGetLineControlsW(-1): " - "MMSYSERR_INVALFLAG or MMSYSERR_INVALPARAM expected, got %s\n", - mmsys_error(rc)); - - controls.cbStruct = sizeof(MIXERLINECONTROLSW); - controls.cControls = mixerlineW.cControls; - controls.dwLineID = mixerlineW.dwLineID; - controls.pamxctrl = array; - controls.cbmxctrl = sizeof(MIXERCONTROLW); - - /* FIXME: do MIXER_GETLINECONTROLSF_ONEBYID - * and MIXER_GETLINECONTROLSF_ONEBYTYPE - */ - rc = mixerGetLineControlsW(mix, &controls, MIXER_GETLINECONTROLSF_ALL); - ok(rc==MMSYSERR_NOERROR, - "mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ALL): " - "MMSYSERR_NOERROR expected, got %s\n", - mmsys_error(rc)); - if (rc==MMSYSERR_NOERROR) { - for(nc=0;nc<mixerlineW.cControls;nc++) { - if (winetest_interactive) { - WideCharToMultiByte(CP_ACP,0,array[nc].szShortName, - MIXER_SHORT_NAME_CHARS,szShortName, - MIXER_SHORT_NAME_CHARS,NULL,NULL); - WideCharToMultiByte(CP_ACP,0,array[nc].szName, - MIXER_LONG_NAME_CHARS,szName, - MIXER_LONG_NAME_CHARS,NULL,NULL); - trace(" %ld: "%s" (%s) ControlID=%ld\n", nc, - szShortName, szName, array[nc].dwControlID); - trace(" ControlType=%s\n", - control_type(array[nc].dwControlType)); - trace(" Control=0x%08lx(%s)\n", - array[nc].fdwControl, - control_flags(array[nc].fdwControl)); - trace(" Items=%ld Min=%ld Max=%ld Step=%ld\n", - array[nc].cMultipleItems, - S1(array[nc].Bounds).dwMinimum, - S1(array[nc].Bounds).dwMaximum, - array[nc].Metrics.cSteps); - } - mixer_test_controlW(mix, &array[nc]); - } - } - - HeapFree(GetProcessHeap(),0,array); - } + test_mixerGetLineControlsW(&mixerlineW, mix, MIXER_GETLINECONTROLSF_ONEBYID); + test_mixerGetLineControlsW(&mixerlineW, mix, MIXER_GETLINECONTROLSF_ONEBYTYPE); + test_mixerGetLineControlsW(&mixerlineW, mix, MIXER_GETLINECONTROLSF_ALL); } } }
From: YeshunYe yeyeshun@uniontech.com
Signed-off-by: YeshunYe yeyeshun@uniontech.com --- dlls/winmm/tests/mixer.c | 2 -- dlls/winmm/waveform.c | 2 -- 2 files changed, 4 deletions(-)
diff --git a/dlls/winmm/tests/mixer.c b/dlls/winmm/tests/mixer.c index 828c53e723f..aeea722e75b 100644 --- a/dlls/winmm/tests/mixer.c +++ b/dlls/winmm/tests/mixer.c @@ -438,7 +438,6 @@ static void test_mixerGetLineControlsA(MIXERLINEA* mixerlineA, HMIXEROBJ mix, DW }
rc = mixerGetLineControlsA(mix, &controls, fdwControls); - todo_wine_if(fdwControls == MIXER_GETLINECONTROLSF_ONEBYID) ok(rc==MMSYSERR_NOERROR, "mixerGetLineControlsA(%s): " "MMSYSERR_NOERROR expected, got %s\n", @@ -870,7 +869,6 @@ static void test_mixerGetLineControlsW(MIXERLINEW* mixerlineW, HMIXEROBJ mix, DW }
rc = mixerGetLineControlsW(mix, &controls, fdwControls); - todo_wine_if(fdwControls == MIXER_GETLINECONTROLSF_ONEBYID) ok(rc==MMSYSERR_NOERROR, "mixerGetLineControlsW(%s): " "MMSYSERR_NOERROR expected, got %s\n", diff --git a/dlls/winmm/waveform.c b/dlls/winmm/waveform.c index ecd2acb8b28..ae4d325e7b2 100644 --- a/dlls/winmm/waveform.c +++ b/dlls/winmm/waveform.c @@ -4108,8 +4108,6 @@ UINT WINAPI mixerGetLineControlsW(HMIXEROBJ hmix, LPMIXERLINECONTROLSW lpmlcW, return MMSYSERR_INVALPARAM; if(lpmlcW->cbmxctrl < sizeof(MIXERCONTROLW)) return MMSYSERR_INVALPARAM; - if(lpmlcW->dwLineID != 0 && lpmlcW->dwLineID != 0xFFFF0000) - return MIXERR_INVALLINE; if(lpmlcW->u.dwControlID == 0) return WINMM_GetVolumeLineControl(mmdevice, lpmlcW->dwLineID, lpmlcW->pamxctrl, fdwControls);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=131332
Your paranoid android.
=== w7u_2qxl (32 bit report) ===
winmm: mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL
=== w7u_adm (32 bit report) ===
winmm: mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL
=== w7u_el (32 bit report) ===
winmm: mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL
=== w8 (32 bit report) ===
winmm: mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL
=== w8adm (32 bit report) ===
winmm: mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL
=== w864 (32 bit report) ===
winmm: mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL
=== w1064v1507 (32 bit report) ===
winmm: mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL
=== w1064v1809 (32 bit report) ===
winmm: mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL
=== w1064_tsign (32 bit report) ===
winmm: mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL
=== w10pro64 (32 bit report) ===
winmm: mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL
=== w11pro64 (32 bit report) ===
winmm: mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL
=== w7pro64 (64 bit report) ===
winmm: mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL
=== w864 (64 bit report) ===
winmm: mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL
=== w1064v1507 (64 bit report) ===
winmm: mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL
=== w1064v1809 (64 bit report) ===
winmm: mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL
=== w1064_2qxl (64 bit report) ===
winmm: mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL
=== w1064_adm (64 bit report) ===
winmm: mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL
=== w1064_tsign (64 bit report) ===
winmm: mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL
=== w10pro64 (64 bit report) ===
winmm: mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL
=== w10pro64_en_AE_u8 (64 bit report) ===
winmm: mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL
=== w10pro64_ar (64 bit report) ===
winmm: mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL
=== w10pro64_ja (64 bit report) ===
winmm: mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL
=== w10pro64_zh_CN (64 bit report) ===
winmm: mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:441: Test failed: mixerGetLineControlsA(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL mixer.c:872: Test failed: mixerGetLineControlsW(MIXER_GETLINECONTROLSF_ONEBYID): MMSYSERR_NOERROR expected, got MIXERR_INVALCONTROL