http://bugs.winehq.org/show_bug.cgi?id=31586
Anastasius Focht focht@gmx.net changed:
What |Removed |Added ---------------------------------------------------------------------------- CC| |focht@gmx.net Summary|Myst V stucked when about |Myst V stucked when about |playing the first cutscene |playing the first cutscene |in the game |in the game (DirectMusic | |segment | |handling/notification | |incomplete, | |IDirectMusicTool8::ProcessP | |Msg)
--- Comment #8 from Anastasius Focht focht@gmx.net 2013-10-08 15:21:06 CDT --- Hello folks,
bought the game just for analysis ... confirming. When the monologue scene happens:
--- snip --- $ pwd /home/focht/.wine/drive_c/Program Files/GOG.com/Myst V End Of Ages
$ WINEDEBUG=+tid,+seh,+loaddll,+dmime wine ./eoa.exe ... 0009:trace:dmime:DllGetClassObject (CLSID_DirectMusicSegment, IID_IClassFactory, 0x33dcb8) 0009:trace:dmime:ClassFactory_CreateInstance ((nil), IID_IDirectMusicObject, 0x33e4d8) 0009:trace:dmime:IDirectMusicSegment8Impl_IUnknown_QueryInterface (0x9d33230, IID_IDirectMusicObject, 0x33e4d8) 0009:trace:dmime:IDirectMusicSegment8Impl_IUnknown_AddRef (0x9d33230): AddRef from 0 0009:trace:dmime:IDirectMusicSegment8Impl_IUnknown_QueryInterface (0x9d33230, IID_IPersistStream, 0x33e4dc) 0009:trace:dmime:IDirectMusicSegment8Impl_IUnknown_AddRef (0x9d33230): AddRef from 1 0009:trace:dmime:IDirectMusicSegment8Impl_IPersistStream_Load (0x9d33230, 0xb7a22f8): Loading 0009:trace:dmime:IDirectMusicSegment8Impl_IDirectMusicObject_GetDescriptor (0x9d33230, 0x33e188) 0009:trace:dmime:IDirectMusicSegment8Impl_IUnknown_Release (0x9d33230): ReleaseRef to 1 0009:trace:dmime:IDirectMusicSegment8Impl_IUnknown_QueryInterface (0x9d33230, IID_IDirectMusicSegment8, 0x33ec78) 0009:trace:dmime:IDirectMusicSegment8Impl_IUnknown_AddRef (0x9d33230): AddRef from 1 0009:trace:dmime:IDirectMusicSegment8Impl_IDirectMusicSegment8_GetLength (0x9d33230, 0x33ee98) 0009:fixme:dmime:IDirectMusicSegment8Impl_IDirectMusicSegment8_SetGraph (0x9d33230, 0x9be3d84): to complete 0009:trace:dmime:IDirectMusicGraphImpl_IUnknown_AddRef (0x9be3d80): AddRef from 1 0009:trace:dmime:IDirectMusicSegment8Impl_IDirectMusicSegment8_SetStartPoint (0x9d33230, 0) 0009:fixme:dmime:IDirectMusicPerformance8Impl_CreateStandardAudioPath (0x9d06da0)->(6, 32, 1, 0x33f0a0): semi-stub 0009:trace:dmime:IDirectMusicAudioPathImpl_IUnknown_QueryInterface (0x9dfd890, IID_IDirectMusicAudioPath, 0x33f034) 0009:trace:dmime:IDirectMusicAudioPathImpl_IUnknown_AddRef (0x9dfd890): AddRef from 0 0009:trace:dmime:IDirectMusicPerformance8Impl_CreateStandardAudioPath returning IDirectMusicAudioPath interface at 0x9dfd894. 0009:fixme:dmime:IDirectMusicAudioPathImpl_IDirectMusicAudioPath_Activate (0x9dfd890, 1): stub 0009:fixme:dmime:IDirectMusicAudioPathImpl_IDirectMusicAudioPath_SetVolume (0x9dfd890, -9600, 0): stub 0009:fixme:dmime:IDirectMusicAudioPathImpl_IDirectMusicAudioPath_GetObjectInPath (0x9dfd890, -5, 24576, 0, {00000000-0000-0000-0000-000000000000}, 0, {279afa86-4981-11ce-a521-0020af0be560}, 0x2b313d8): stub 0009:trace:dmime:IDirectMusicAudioPathImpl_IDirectMusicAudioPath_GetObjectInPath returning 0xb7a2304 0009:trace:dmime:IDirectMusicSegment8Impl_IDirectMusicSegment8_GetLength (0x9d33230, 0x33f0bc) 0009:fixme:dmime:IDirectMusicSegment8Impl_IDirectMusicSegment8_AddNotificationType (0x9d33230, GUID_NOTIFICATION_SEGMENT): stub 0009:fixme:dmime:IDirectMusicGraphImpl_IDirectMusicGraph_InsertTool (0x9be3d80, 0x178d880, (nil), 0, 0): use of pdwPChannels 0009:fixme:dmime:IDirectMusicAudioPathImpl_IDirectMusicAudioPath_SetVolume (0x9dfd890, -300, 0): stub 0009:fixme:dmime:IDirectMusicSegment8Impl_IDirectMusicSegment8_Download (0x9d33230, 0x9dfd894): stub 0009:fixme:dmime:IDirectMusicPerformance8Impl_PlaySegmentEx (0x9d06da0, 0x9d33234, (nil), (nil), 0, 0x0, 0x2b313cc, (nil), 0x9dfd894): stub 0009:trace:dmime:IDirectMusicSegmentState8Impl_QueryInterface (0xb7a24c0, IID_IDirectMusicSegmentState, 0x2b313cc) 0009:trace:dmime:IDirectMusicSegmentState8Impl_AddRef (0xb7a24c0): AddRef from 0 0009:fixme:d3d:resource_check_usage Unhandled usage flags 0x8. 0009:fixme:d3d:resource_check_usage Unhandled usage flags 0x8. ... --- snip ---
One indication of what could be missing is the registration for GUID_NOTIFICATION_SEGMENT. It seems the game code expects callback-style notifications to proceed further.
DirectMusic performance events can be delivered through several ways. I didn't see any calls to SetNotificationHandle() and performance->GetNotificationPMsg() so the notifications must be signaled/delivered in another way. Well, I found out the way the game expects to be notified: IDirectMusicTool8::ProcessPMsg() (see IDirectMusicGraphImpl_IDirectMusicGraph_InsertTool in log).
Wine's dmime code is incomplete/stubbed at various places so I really had a hard time to get some proof-of-concept with minimal effort working. I only needed an initial "trigger" of game callback ... First by posting a custom message in IDirectMusicPerformance8Impl_PlaySegmentEx to message thread. Within the message thread I processed the message and created DMUS_NOTIFICATION_PMSG object with type = DMUS_PMSGT_NOTIFICATION, guidNotificationType = GUID_NOTIFICATION_SEGMENT, dwNotificationOption = DMUS_NOTIFICATION_SEGSTART and called IDirectMusicTool8_ProcessPMsg() on the instanced the game code created earlier (segment -> music graph -> ...).
This is obviously a big hack but it was enough to have the callback trigger other in-game events and the guy actually started talking/acting, letting the scene continue. Pure Wine, no winetricks recipes used.
I debugged the game "sound start" callback and found it checks for following: Type must be DMUS_PMSGT_NOTIFICATION or DMUS_PMSGT_LYRIC In case of DMUS_PMSGT_NOTIFICATION type, the guid must be GUID_NOTIFICATION_SEGMENT.
There is still various stuff missing but maybe this gives people working on DirectMusic an idea.
Tested with Myst V: End of Ages from GOG.com:
$ du -sh setup_myst_5_end_of_ages_1.0.0.8* 2.0G setup_myst_5_end_of_ages_1.0.0.8-1.bin 1.7G setup_myst_5_end_of_ages_1.0.0.8-2.bin 2.5M setup_myst_5_end_of_ages_1.0.0.8.exe
$ sha1sum setup_myst_5_end_of_ages_1.0.0.8* 1f2ed82280231cfa8d2bc7023a1e69fc025a6b7c setup_myst_5_end_of_ages_1.0.0.8-1.bin 1c2aea52ed16a1f5f7215bdebf22597980c8813e setup_myst_5_end_of_ages_1.0.0.8-2.bin ba69842d5af28cf8280dc9c08f5a0c4ecb500a8b setup_myst_5_end_of_ages_1.0.0.8.exe
$ wine --version wine-1.7.3-269-gcd65c68
Regards