http://bugs.winehq.org/show_bug.cgi?id=35371
Anastasius Focht focht@gmx.net changed:
What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW CC| |focht@gmx.net Component|-unknown |winmm&mci Summary|Battlefield 2: Wine crashes |Battlefield 2 voice setup |on mic setup |tool crashes when "Save | |Settings" button is clicked | |(winmm.mixerGetDevCaps | |should also accept mixer | |device handles) Ever confirmed|0 |1
--- Comment #1 from Anastasius Focht focht@gmx.net --- Hello folks,
confirming.
This reminded me of bug 16544 which I analyzed years ago (same backtrace). It's not the same thing though, the backtrace is just a manifestation of earlier problems.
--- snip --- $ pwd /home/focht/.wine/drive_c/Program Files/EA GAMES/Battlefield 2
$ WINEDEBUG=+tid,+seh,+relay,+winmm wine ./BF2VoiceSetup.exe >>log.txt 2>&1 ... 0024:Call winmm.mixerGetDevCapsA(00000000,0033f42c,00000030) ret=00408295 0024:trace:winmm:mixerGetDevCapsA (0, 0x33f42c, 48) 0024:trace:winmm:mixerGetDevCapsW (0, 0x33f354, 80) ... 0024:Ret winmm.mixerGetDevCapsA() retval=00000000 ret=00408295 0024:Call winmm.mixerOpen(00425f0c,00000000,00000000,00000000,00010000) ret=004082ac 0024:trace:winmm:mixerOpen (0x425f0c, 0, 0, 0, 10000) 0024:Ret winmm.mixerOpen() retval=00000000 ret=004082ac 0024:Call winmm.mixerGetDevCapsA(0000c000,0033f290,00000030) ret=00408021 0024:trace:winmm:mixerGetDevCapsA (49152, 0x33f290, 48) 0024:trace:winmm:mixerGetDevCapsW (49152, 0x33f1b4, 80) 0024:Ret winmm.mixerGetDevCapsA() retval=00000002 ret=00408021 ... 0024:Call msvcrt._wfsopen(0033dac0 L"C:\users\focht\My Documents\Battlefield 2\Profiles\BattleCommoDefaultUserSettings.con",7e468984 L"w",00000040) ret=7e40e7a6 0024:Call KERNEL32.CreateFileW(0033dac0 L"C:\users\focht\My Documents\Battlefield 2\Profiles\BattleCommoDefaultUserSettings.con",40000000,00000003,0033d870,00000002,00000080,00000000) ret=7e33d409 0024:Ret KERNEL32.CreateFileW() retval=000000b4 ret=7e33d409 0024:Ret msvcrt._wfsopen() retval=7e3ae440 ret=7e40e7a6 ... 0024:Ret msvcp71.?open@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXPBDHH@Z() retval=0033dd80 ret=00403918 0024:trace:seh:raise_exception code=c0000005 flags=0 addr=0x408661 ip=00408661 tid=0024 0024:trace:seh:raise_exception info[0]=00000000 0024:trace:seh:raise_exception info[1]=0000002c 0024:trace:seh:raise_exception eax=00000000 ebx=00000111 ecx=00000000 edx=00000002 esi=0033dc84 edi=0033dd68 0024:trace:seh:raise_exception ebp=0033dd68 esp=0033dc84 cs=0023 ds=002b es=002b fs=0063 gs=006b flags=00010206 0024:trace:seh:call_stack_handlers calling handler at 0x41d00c code=c0000005 flags=0 --- snip ---
The problem is the failing winmm.mixerGetDevCapsA() call, returning MMSYSERR_BADDEVICEID. The mixer id is the handle returned by earlier mixerOpen() call.
MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/dd757300%28v=vs.85%2...
--- quote --- ... This function also accepts a mixer device handle returned by the mixerOpen function as the uMxId parameter. The application should cast the HMIXER handle to a UINT. --- quote ---
Apparently Wine doesn't do this:
Source: http://source.winehq.org/git/wine.git/blob/06c95af45726674847d12440d904568f5...
--- snip --- 3724 UINT WINAPI mixerGetDevCapsW(UINT_PTR uDeviceID, LPMIXERCAPSW lpCaps, UINT uSize) 3725 { 3726 WINMM_MMDevice *mmdevice; 3727 MIXERCAPSW caps; 3728 HRESULT hr; 3729 3730 TRACE("(%lu, %p, %u)\n", uDeviceID, lpCaps, uSize); 3731 3732 hr = WINMM_InitMMDevices(); 3733 if(FAILED(hr)) 3734 return MMSYSERR_NODRIVER; 3735 3736 if(!lpCaps) 3737 return MMSYSERR_INVALPARAM; 3738 3739 if(!uSize) 3740 return MMSYSERR_NOERROR; 3741 3742 if(uDeviceID >= g_outmmdevices_count + g_inmmdevices_count) 3743 return MMSYSERR_BADDEVICEID; ... --- snip ---
Additionally a small diagnostic trace in mixerOpen(), printing the actual returned handle value (out param) would be helpful.
Regards