From: "Changhui LIU" Subject: quartz: waveparser support wav file generated by ffmpeg (try 4) Message-Id: Date: Wed, 12 Aug 2015 13:22:44 +0800 Superseded patch 113458. Change log: Modified as Michael suggested. ------------------ Regards, Changhui Liu
Superseded patch 113458.

Change log:
Modified as Michael suggested.





------------------
Regards,
Changhui Liu
 
From 8f938a0f469867b25372704905719dea0844bb46 Mon Sep 17 00:00:00 2001 From: Changhui Liu Date: Wed, 12 Aug 2015 11:24:27 +0800 Subject: quartz: waveparser support wav file generated by ffmpeg To: wine-patches Reply-To: wine-devel --- dlls/quartz/tests/filtergraph.c | 31 +++++++++++++++++++++++++++++-- dlls/quartz/waveparser.c | 11 ++++++++--- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/dlls/quartz/tests/filtergraph.c b/dlls/quartz/tests/filtergraph.c index 2f56151..96dbea9 100644 --- a/dlls/quartz/tests/filtergraph.c +++ b/dlls/quartz/tests/filtergraph.c @@ -41,6 +41,17 @@ typedef struct TestFilterImpl static const WCHAR avifile[] = {'t','e','s','t','.','a','v','i',0}; static const WCHAR mpegfile[] = {'t','e','s','t','.','m','p','g',0}; +static const WCHAR wavfile[] = {'t','e','s','t','.','w','a','v',0}; + +/*ffmpeg generate wav file has a LIST chunk like this:*/ +static BYTE g_wav_data[] = { +0x52,0x49,0x46,0x46,0xd6,0xd6,0x14,0x00,0x57,0x41,0x56,0x45,0x66,0x6d,0x74,0x20, /*|RIFF....WAVEfmt |*/ +0x10,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x22,0x56,0x00,0x00,0x44,0xac,0x00,0x00, /*|........"V..D...|*/ +0x02,0x00,0x10,0x00,0x4c,0x49,0x53,0x54,0x1a,0x00,0x00,0x00,0x49,0x4e,0x46,0x4f, /*|....LIST....INFO|*/ +0x49,0x53,0x46,0x54,0x0e,0x00,0x00,0x00,0x4c,0x61,0x76,0x66,0x35,0x36,0x2e,0x32, /*|ISFT....Lavf56.2|*/ +0x35,0x2e,0x31,0x30,0x31,0x00,0x64,0x61,0x74,0x61,0x12,0x00,0x00,0x00,0x6a,0x00, /*|5.101.data....j.|*/ +0x32,0x00,0x20,0x00,0xb6,0x00,0x4b,0x01,0x72,0x01,0x22,0x01,0x93,0x00,0x39,0x00, /*|2. ...K.r."...9.|*/ +}; static IGraphBuilder *pgraph; @@ -153,8 +164,13 @@ static void test_render_run(const WCHAR *file) if (h != INVALID_HANDLE_VALUE) { CloseHandle(h); hr = IGraphBuilder_RenderFile(pgraph, file, NULL); - ok(hr==S_OK, "RenderFile returned: %x\n", hr); - rungraph(); + if (VFW_E_NO_AUDIO_HARDWARE==hr) { + trace("no audio hardware is available, or the hardware is not supported!\n"); + } + else { + ok(hr==S_OK, "RenderFile returned: %x\n", hr); + rungraph(); + } } releasefiltergraph(); @@ -1877,6 +1893,15 @@ static void test_render_filter_priority(void) START_TEST(filtergraph) { HRESULT hr; + HANDLE h = CreateFileW(wavfile, GENERIC_WRITE, 0, NULL, + CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if (INVALID_HANDLE_VALUE != h) + { + DWORD bytes = 0; + WriteFile(h, g_wav_data, sizeof(g_wav_data), &bytes, NULL); + CloseHandle(h); + } + CoInitializeEx(NULL, COINIT_MULTITHREADED); hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IGraphBuilder, (LPVOID*)&pgraph); @@ -1887,6 +1912,8 @@ START_TEST(filtergraph) IGraphBuilder_Release(pgraph); test_render_run(avifile); test_render_run(mpegfile); + test_render_run(wavfile); + DeleteFileW(wavfile); test_graph_builder(); test_graph_builder_addfilter(); test_mediacontrol(); diff --git a/dlls/quartz/waveparser.c b/dlls/quartz/waveparser.c index 2ceb0fd..350a413 100644 --- a/dlls/quartz/waveparser.c +++ b/dlls/quartz/waveparser.c @@ -302,10 +302,15 @@ static HRESULT WAVEParser_InputPin_PreConnect(IPin * iface, IPin * pConnectPin, pos += sizeof(chunk) + chunk.cb; hr = IAsyncReader_SyncRead(This->pReader, pos, sizeof(chunk), (BYTE *)&chunk); } - if (chunk.fcc != mmioFOURCC('d','a','t','a')) + while (chunk.fcc != mmioFOURCC('d','a','t','a')) { - ERR("Expected 'data' chunk, but got %.04s\n", (LPSTR)&chunk.fcc); - return E_FAIL; + pos += sizeof(chunk) + chunk.cb; + hr = IAsyncReader_SyncRead(This->pReader, pos, sizeof(chunk), (BYTE *)&chunk); + if (FAILED(hr)) + { + ERR("Expected 'data' chunk, but not found (0x%08x)\n", hr); + return E_FAIL; + } } if (hr == S_OK) -- 1.9.1