[Bug 31586] Myst V stucked when about playing the first cutscene in the game (DirectMusic segment handling/notification incomplete, IDirectMusicTool8::ProcessPMsg)

wine-bugs at winehq.org wine-bugs at winehq.org
Tue Oct 8 15:21:06 CDT 2013


http://bugs.winehq.org/show_bug.cgi?id=31586

Anastasius Focht <focht at gmx.net> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |focht at 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 at 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

-- 
Configure bugmail: http://bugs.winehq.org/userprefs.cgi?tab=email
Do not reply to this email, post in Bugzilla using the
above URL to reply.
------- You are receiving this mail because: -------
You are watching all bug changes.



More information about the wine-bugs mailing list