From: Yuxuan Shui yshui@codeweavers.com
If allocator fails, native returns NS_E_NO_MORE_SAMPLES whereas we propagate the allocator's failure code. Some games checks this return value and will raise an error/exception if anything other than NS_E_NO_MORE_SAMPLES is returned, for example any game using the KiriKiri movie player [0] will do this.
[0]: https://github.com/krkrz/krkrz/blob/fd5c4baa6a2ef5978db1bd043634351f48667daf... --- dlls/winegstreamer/wm_reader.c | 2 ++ dlls/wmvcore/tests/wmvcore.c | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c index 467662b964c..624b0c591f3 100644 --- a/dlls/winegstreamer/wm_reader.c +++ b/dlls/winegstreamer/wm_reader.c @@ -2063,6 +2063,8 @@ static HRESULT WINAPI reader_GetNextSample(IWMSyncReader2 *iface,
if (SUCCEEDED(hr) && SUCCEEDED(hr = wm_reader_read_stream_sample(reader, &wg_buffer, sample, pts, duration, flags))) stream_number = wg_buffer.stream + 1; + + if (FAILED(hr)) hr = NS_E_NO_MORE_SAMPLES; }
if (stream && hr == NS_E_NO_MORE_SAMPLES) diff --git a/dlls/wmvcore/tests/wmvcore.c b/dlls/wmvcore/tests/wmvcore.c index 8fe56968b2b..d16947db6bb 100644 --- a/dlls/wmvcore/tests/wmvcore.c +++ b/dlls/wmvcore/tests/wmvcore.c @@ -4255,7 +4255,7 @@ static void test_sync_reader_allocator_failure(void) ok(hr == S_OK, "Got hr %#lx.\n", hr); hr = IWMSyncReader2_GetNextSample(reader, stream_num, &sample, &pts, &duration, &flags, &output_num, &stream_num); - todo_wine ok(hr == NS_E_NO_MORE_SAMPLES, "Got hr %#lx.\n", hr); + ok(hr == NS_E_NO_MORE_SAMPLES, "Got hr %#lx.\n", hr);
IWMSyncReader2_Release(reader);
@@ -4265,7 +4265,6 @@ static void test_sync_reader_allocator_failure(void) ok(ret, "Failed to delete %s, error %lu.\n", debugstr_w(filename), GetLastError()); }
- START_TEST(wmvcore) { HRESULT hr;