test_graph_seeking sets the stop time to 6 seconds and then checks that
the media has stopped at that exact point in time. That test failed 10
out of the last 67 times on test.winehq.org because
IMediaSeeking_GetCurrentPosition returned a time that was 1 millisecond
after the stop time. To make the test pass consistently, clamp the
current time to the stop time.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7965
When queried by NtQueryInformationToken(TokenElevation).
---
As the test shows, a TokenElevation query is more complex than a check against the elevation type.
GOG Galaxy's updater relies on this behavior when its service is launched with a TokenElevationTypeDefault token (which doesn't currently happen, but I have patches in the works for that).
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7972
The basic `FindAllAsync()` method returns a collection of `DeviceInformation` objects representing all device interfaces on the system. This MR adds a basic implementation of this method, and the associated `IDeviceInformation` and `DeviceInformationCollection` objects it returns. For `IDeviceInformation`, this MR only implements the `Id()` method, which returns the symbolic link for the registered interface.
A basic working `DeviceInformation` and `FindAll` implementations are needed to implement `DeviceWatcher`'s `Added`, `Removed` events, which in turn is required for basic device discovery in `Windows.Devices.Bluetooth`.
--
v5: windows.devices.enumeration: Create IDeviceInformation objects from all present device interfaces.
windows.devices.enumeration: Add a stubbed IDeviceInformation implementation for device interfaces.
windows.devices.enumeration: Add a stubbed implementation for FindAllAsync() and DeviceInformationCollection.
windows.devices.enumeration/tests: Add conformance tests for FindAllAsync().
https://gitlab.winehq.org/wine/wine/-/merge_requests/6874
The basic `FindAllAsync()` method returns a collection of `DeviceInformation` objects representing all device interfaces on the system. This MR adds a basic implementation of this method, and the associated `IDeviceInformation` and `DeviceInformationCollection` objects it returns. For `IDeviceInformation`, this MR only implements the `Id()` method, which returns the symbolic link for the registered interface.
--
v4: windows.devices.enumeration: Implement IIterable<IDeviceInformation *> for DeviceInformationCollection.
windows.devices.enumeration: Implement IndexOf() and GetMany() for DeviceInformationCollection.
windows.devices.enumeration: Create IDeviceInformation objects from all present device interfaces.
windows.devices.enumeration: Add a stubbed IDeviceInformation implementation for device interfaces.
windows.devices.enumeration: Add a stubbed implementation for FindAllAsync() and DeviceInformationCollection.
windows.devices.enumeration/tests: Add conformance tests for IIterable and IIterator interfaces in DeviceInformationCollection.
windows.devices.enumeration/tests: Add conformance tests for GetMany() and IndexOf() methods in DeviceInformationCollection.
windows.devices.enumeration/tests: Add conformance tests for FindAllAsync().
https://gitlab.winehq.org/wine/wine/-/merge_requests/6874
This fixes Trials Fusion often crashing when disconnecting a controller while there are more still connected.
--
v4: hidclass: Set Status for pending IRPs of removed devices to STATUS_DEVICE_NOT_CONNECTED.
ntdll/tests: Add more NtCancelIoFile[Ex]() tests.
ntdll: Wait for all pending operations to be cancelled in NtCancelIoFile[Ex]().
https://gitlab.winehq.org/wine/wine/-/merge_requests/7797
__STRINGTOLD_L expects a pointer to a `_LDOUBLE` as its first argument, which we internally declare
as `MSVCRT__LDOUBLE`. Problem is, `_LDOUBLE` is 10 bytes long, whereas `MSVCRT__LDOUBLE` is 12 bytes
long (ULONG * 3). Writing into the third ULONG is technically a buffer overflow.
Declare `MSVCRT__LDOUBLE` instead as 2 ULONGs plus a USHORT.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7961
On Fri May 2 17:55:41 2025 +0000, Elizabeth Figura wrote:
> > > I guess native is supposed to not block in that case
> >
> > That's a good point. If we have two streams call
> `IMFMediaStream::RequestSample`, then we will process them in sequence
> rather than in parallel. That is, one stream will have to wait for the
> other to receive data (as we block all other streams once the source cs
> is acquired in `source_async_commands_Invoke`).
> >
> > This MR will at least unblock a stream when there is no more data, but
> Windows probably delivers data for the other stream immediately (i.e. it
> can deliver data for one stream, even if the other was already waiting).
> And I believe I recall seeing audio latency in Wine as a result of this.
> From memory, it was a 4K video, so delivery of the video sample took a
> while and as a result the audio fell behind. We should probably look to
> lock the individual streams rather than the entire source when possible.
> Hrm, I didn't think we had a locking problem, but if we do that should
> be fixed, yeah.
I'll have a think about how I can test this. I might be able to craft a file that'll delay one of the streams long enough, that whilst waiting for a sample, I can reliably request and receive a sample on the other.
Thanks for the review.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7824#note_102482
This MR fixes seek in VRChat by copying the sequence of flushes/stop/starts that Windows does.
The order on Windows is:
1. Stop sources;
2. Flush MFTs;
3. Start sources;
4. Request output down the chain of sink inputs;
6. Flush sinks; and
7. Start the clock
This takes place whether we pause before we seek or seek without pause.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7932