winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
January
2003
December
November
October
September
August
July
June
May
April
March
February
January
2002
December
November
October
September
August
July
June
May
April
March
February
January
2001
December
November
October
September
August
July
June
May
April
March
February
List overview
wine-commits
March 2021
----- 2025 -----
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
2 participants
1163 discussions
Start a n
N
ew thread
Huw Davies : riched20: Use the text host stored in the editor structure.
by Alexandre Julliard
26 Mar '21
26 Mar '21
Module: wine Branch: master Commit: c4acdfd3b411b8f8dee5ac4f1c5907fb4fc8035b URL:
https://source.winehq.org/git/wine.git/?a=commit;h=c4acdfd3b411b8f8dee5ac4f…
Author: Huw Davies <huw(a)codeweavers.com> Date: Fri Mar 26 09:08:01 2021 +0000 riched20: Use the text host stored in the editor structure. Signed-off-by: Huw Davies <huw(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/riched20/txtsrv.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/dlls/riched20/txtsrv.c b/dlls/riched20/txtsrv.c index 5736964c1b1..4cd19a0d24b 100644 --- a/dlls/riched20/txtsrv.c +++ b/dlls/riched20/txtsrv.c @@ -38,7 +38,6 @@ struct text_services ITextServices ITextServices_iface; IUnknown *outer_unk; LONG ref; - ITextHost *host; ME_TextEditor *editor; char spare[256]; /* for bug #12179 */ }; @@ -150,7 +149,7 @@ static HRESULT update_client_rect( struct text_services *services, const RECT *c if (!client) { if (!services->editor->in_place_active) return E_INVALIDARG; - hr = ITextHost_TxGetClientRect( services->host, &rect ); + hr = ITextHost_TxGetClientRect( services->editor->texthost, &rect ); if (FAILED( hr )) return hr; } else rect = *client; @@ -186,7 +185,7 @@ DECLSPEC_HIDDEN HRESULT __thiscall fnTextSrv_TxDraw( ITextServices *iface, DWORD if (hr == S_OK) rewrap = TRUE; if (!dc && services->editor->in_place_active) - dc = ITextHost_TxGetDC( services->host ); + dc = ITextHost_TxGetDC( services->editor->texthost ); if (!dc) return E_FAIL; if (rewrap) @@ -196,7 +195,7 @@ DECLSPEC_HIDDEN HRESULT __thiscall fnTextSrv_TxDraw( ITextServices *iface, DWORD } editor_draw( services->editor, dc, update ); - if (!draw) ITextHost_TxReleaseDC( services->host, dc ); + if (!draw) ITextHost_TxReleaseDC( services->editor->texthost, dc ); return S_OK; } @@ -389,7 +388,7 @@ DECLSPEC_HIDDEN HRESULT __thiscall fnTextSrv_TxGetNaturalSize( ITextServices *if if (hr == S_OK) rewrap = TRUE; if (!dc && services->editor->in_place_active) - dc = ITextHost_TxGetDC( services->host ); + dc = ITextHost_TxGetDC( services->editor->texthost ); if (!dc) return E_FAIL; if (rewrap) @@ -401,7 +400,7 @@ DECLSPEC_HIDDEN HRESULT __thiscall fnTextSrv_TxGetNaturalSize( ITextServices *if *width = services->editor->nTotalWidth; *height = services->editor->nTotalLength; - if (!draw) ITextHost_TxReleaseDC( services->host, dc ); + if (!draw) ITextHost_TxReleaseDC( services->editor->texthost, dc ); return S_OK; } @@ -430,14 +429,14 @@ DECLSPEC_HIDDEN HRESULT __thiscall fnTextSrv_OnTxPropertyBitsChange( ITextServic if (mask & TXTBIT_SCROLLBARCHANGE) { - hr = ITextHost_TxGetScrollBars( services->host, &scrollbars ); + hr = ITextHost_TxGetScrollBars( services->editor->texthost, &scrollbars ); if (SUCCEEDED( hr )) { if ((services->editor->scrollbars ^ scrollbars) & WS_HSCROLL) - ITextHost_TxShowScrollBar( services->host, SB_HORZ, (scrollbars & WS_HSCROLL) && + ITextHost_TxShowScrollBar( services->editor->texthost, SB_HORZ, (scrollbars & WS_HSCROLL) && services->editor->nTotalWidth > services->editor->sizeWindow.cx ); if ((services->editor->scrollbars ^ scrollbars) & WS_VSCROLL) - ITextHost_TxShowScrollBar( services->host, SB_VERT, (scrollbars & WS_VSCROLL) && + ITextHost_TxShowScrollBar( services->editor->texthost, SB_VERT, (scrollbars & WS_VSCROLL) && services->editor->nTotalLength > services->editor->sizeWindow.cy ); services->editor->scrollbars = scrollbars; } @@ -449,10 +448,10 @@ DECLSPEC_HIDDEN HRESULT __thiscall fnTextSrv_OnTxPropertyBitsChange( ITextServic { LONG width; - hr = ITextHost_TxGetSelectionBarWidth( services->host, &width ); + hr = ITextHost_TxGetSelectionBarWidth( services->editor->texthost, &width ); if (hr == S_OK) { - ITextHost_TxInvalidateRect( services->host, &services->editor->rcFormat, TRUE ); + ITextHost_TxInvalidateRect( services->editor->texthost, &services->editor->rcFormat, TRUE ); services->editor->rcFormat.left -= services->editor->selofs; services->editor->selofs = width ? SELECTIONBAR_WIDTH : 0; /* FIXME: convert from HIMETRIC */ services->editor->rcFormat.left += services->editor->selofs; @@ -468,7 +467,7 @@ DECLSPEC_HIDDEN HRESULT __thiscall fnTextSrv_OnTxPropertyBitsChange( ITextServic if (mask & TXTBIT_USEPASSWORD) { - if (bits & TXTBIT_USEPASSWORD) ITextHost_TxGetPasswordChar( services->host, &services->editor->password_char ); + if (bits & TXTBIT_USEPASSWORD) ITextHost_TxGetPasswordChar( services->editor->texthost, &services->editor->password_char ); else services->editor->password_char = 0; repaint = TRUE; } @@ -593,7 +592,6 @@ HRESULT create_text_services( IUnknown *outer, ITextHost *text_host, IUnknown ** services = CoTaskMemAlloc( sizeof(*services) ); if (services == NULL) return E_OUTOFMEMORY; services->ref = 1; - services->host = text_host; /* Don't take a ref of the host - this would lead to a mutual dependency */ services->IUnknown_inner.lpVtbl = &textservices_inner_vtbl; services->ITextServices_iface.lpVtbl = &textservices_vtbl; services->editor = ME_MakeEditor( text_host, emulate_10 );
1
0
0
0
Huw Davies : include: Add ITextHost2.
by Alexandre Julliard
26 Mar '21
26 Mar '21
Module: wine Branch: master Commit: a15e45155daf7194c691282e227f05dc450a059a URL:
https://source.winehq.org/git/wine.git/?a=commit;h=a15e45155daf7194c691282e…
Author: Huw Davies <huw(a)codeweavers.com> Date: Fri Mar 26 09:08:00 2021 +0000 include: Add ITextHost2. Signed-off-by: Huw Davies <huw(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- include/textserv.h | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/include/textserv.h b/include/textserv.h index 3abdcee6a30..6198f6900ff 100644 --- a/include/textserv.h +++ b/include/textserv.h @@ -31,6 +31,7 @@ extern "C" { EXTERN_C const IID IID_ITextServices; EXTERN_C const IID IID_ITextHost; +EXTERN_C const IID IID_ITextHost2; /***************************************************************************** * ITextServices interface @@ -364,6 +365,80 @@ DECLARE_INTERFACE_(ITextHost,IUnknown) #define ITextHost_Release(p) (p)->lpVtbl->Release(p) #endif +/***************************************************************************** + * ITextHost2 interface + */ +#define INTERFACE ITextHost2 +DECLARE_INTERFACE_(ITextHost2,ITextHost) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)( THIS_ REFIID riid, void** ppvObject ) PURE; + STDMETHOD_(ULONG,AddRef)( THIS ) PURE; + STDMETHOD_(ULONG,Release)( THIS ) PURE; + /*** ITextHost methods ***/ + THISCALLMETHOD_(HDC,TxGetDC)( THIS ) PURE; + THISCALLMETHOD_(INT,TxReleaseDC)( THIS_ HDC hdc ) PURE; + THISCALLMETHOD_(BOOL,TxShowScrollBar)( THIS_ INT fnBar, BOOL fShow ) PURE; + THISCALLMETHOD_(BOOL,TxEnableScrollBar)( THIS_ INT fuSBFlags, INT fuArrowflags ) PURE; + THISCALLMETHOD_(BOOL,TxSetScrollRange)( THIS_ INT fnBar, LONG nMinPos, INT nMaxPos, BOOL fRedraw ) PURE; + THISCALLMETHOD_(BOOL,TxSetScrollPos)( THIS_ INT fnBar, INT nPos, BOOL fRedraw ) PURE; + THISCALLMETHOD_(void,TxInvalidateRect)( THIS_ LPCRECT prc, BOOL fMode ) PURE; + THISCALLMETHOD_(void,TxViewChange)( THIS_ BOOL fUpdate ) PURE; + THISCALLMETHOD_(BOOL,TxCreateCaret)( THIS_ HBITMAP hbmp, INT xWidth, INT yHeight ) PURE; + THISCALLMETHOD_(BOOL,TxShowCaret)( THIS_ BOOL fShow ) PURE; + THISCALLMETHOD_(BOOL,TxSetCaretPos)( THIS_ INT x, INT y ) PURE; + THISCALLMETHOD_(BOOL,TxSetTimer)( THIS_ UINT idTimer, UINT uTimeout ) PURE; + THISCALLMETHOD_(void,TxKillTimer)( THIS_ UINT idTimer ) PURE; + THISCALLMETHOD_(void,TxScrollWindowEx)( THIS_ INT dx, INT dy, LPCRECT lprcScroll, LPCRECT lprcClip, + HRGN hRgnUpdate, LPRECT lprcUpdate, UINT fuScroll ) PURE; + THISCALLMETHOD_(void,TxSetCapture)( THIS_ BOOL fCapture ) PURE; + THISCALLMETHOD_(void,TxSetFocus)( THIS ) PURE; + THISCALLMETHOD_(void,TxSetCursor)( THIS_ HCURSOR hcur, BOOL fText ) PURE; + THISCALLMETHOD_(BOOL,TxScreenToClient)( THIS_ LPPOINT lppt ) PURE; + THISCALLMETHOD_(BOOL,TxClientToScreen)( THIS_ LPPOINT lppt ) PURE; + THISCALLMETHOD_(HRESULT,TxActivate)( THIS_ LONG* plOldState ) PURE; + THISCALLMETHOD_(HRESULT,TxDeactivate)( THIS_ LONG lNewState ) PURE; + THISCALLMETHOD_(HRESULT,TxGetClientRect)( THIS_ LPRECT prc ) PURE; + THISCALLMETHOD_(HRESULT,TxGetViewInset)( THIS_ LPRECT prc ) PURE; + THISCALLMETHOD_(HRESULT,TxGetCharFormat)( THIS_ const CHARFORMATW** ppCF ) PURE; + THISCALLMETHOD_(HRESULT,TxGetParaFormat)( THIS_ const PARAFORMAT** ppPF ) PURE; + THISCALLMETHOD_(COLORREF,TxGetSysColor)( THIS_ int nIndex ) PURE; + THISCALLMETHOD_(HRESULT,TxGetBackStyle)( THIS_ TXTBACKSTYLE* pStyle ) PURE; + THISCALLMETHOD_(HRESULT,TxGetMaxLength)( THIS_ DWORD* plength ) PURE; + THISCALLMETHOD_(HRESULT,TxGetScrollBars)( THIS_ DWORD* pdwScrollBar ) PURE; + THISCALLMETHOD_(HRESULT,TxGetPasswordChar)( THIS_ WCHAR* pch ) PURE; + THISCALLMETHOD_(HRESULT,TxGetAcceleratorPos)( THIS_ LONG* pch ) PURE; + THISCALLMETHOD_(HRESULT,TxGetExtent)( THIS_ LPSIZEL lpExtent ) PURE; + THISCALLMETHOD_(HRESULT,OnTxCharFormatChange)( THIS_ const CHARFORMATW* pcf ) PURE; + THISCALLMETHOD_(HRESULT,OnTxParaFormatChange)( THIS_ const PARAFORMAT* ppf ) PURE; + THISCALLMETHOD_(HRESULT,TxGetPropertyBits)( THIS_ DWORD dwMask, DWORD* pdwBits ) PURE; + THISCALLMETHOD_(HRESULT,TxNotify)( THIS_ DWORD iNotify, void* pv ) PURE; + THISCALLMETHOD_(HIMC,TxImmGetContext)( THIS ) PURE; + THISCALLMETHOD_(void,TxImmReleaseContext)( THIS_ HIMC himc ) PURE; + THISCALLMETHOD_(HRESULT,TxGetSelectionBarWidth)( THIS_ LONG* lSelBarWidth ) PURE; + /* ITextHost2 methods */ + THISCALLMETHOD_(BOOL,TxIsDoubleClickPending)( THIS ) PURE; + THISCALLMETHOD_(HRESULT,TxGetWindow)( THIS_ HWND *hwnd ) PURE; + THISCALLMETHOD_(HRESULT,TxSetForegroundWindow)( THIS ) PURE; + THISCALLMETHOD_(HPALETTE,TxGetPalette)( THIS ) PURE; + THISCALLMETHOD_(HRESULT,TxGetEastAsianFlags)( THIS_ LONG *flags ) PURE; + THISCALLMETHOD_(HCURSOR,TxSetCursor2)( THIS_ HCURSOR cursor, BOOL text ) PURE; + THISCALLMETHOD_(void,TxFreeTextServicesNotification)( THIS ) PURE; + THISCALLMETHOD_(HRESULT,TxGetEditStyle)( THIS_ DWORD item, DWORD *data ) PURE; + THISCALLMETHOD_(HRESULT,TxGetWindowStyles)( THIS_ DWORD *style, DWORD *ex_style ) PURE; + THISCALLMETHOD_(HRESULT,TxShowDropCaret)( THIS_ BOOL show, HDC hdc, const RECT *rect ) PURE; + THISCALLMETHOD_(HRESULT,TxDestroyCaret)( THIS ) PURE; + THISCALLMETHOD_(HRESULT,TxGetHorzExtent)( THIS_ LONG *horz_extent ) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define ITextHost2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define ITextHost2_AddRef(p) (p)->lpVtbl->AddRef(p) +#define ITextHost2_Release(p) (p)->lpVtbl->Release(p) +#endif + HRESULT WINAPI CreateTextServices(IUnknown*,ITextHost*,IUnknown**); typedef HRESULT (WINAPI *PCreateTextServices)(IUnknown*,ITextHost*,IUnknown**);
1
0
0
0
Giovanni Mascellani : winegstreamer: Implement a stub IMFRateControl for the media source.
by Alexandre Julliard
26 Mar '21
26 Mar '21
Module: wine Branch: master Commit: 767c200f47b15aec7fe7eb95f76ee034c5bba95f URL:
https://source.winehq.org/git/wine.git/?a=commit;h=767c200f47b15aec7fe7eb95…
Author: Giovanni Mascellani <gmascellani(a)codeweavers.com> Date: Fri Mar 26 09:25:29 2021 +0100 winegstreamer: Implement a stub IMFRateControl for the media source. Signed-off-by: Giovanni Mascellani <gmascellani(a)codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/mfplat/tests/mfplat.c | 1 - dlls/winegstreamer/media_source.c | 66 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index a38cecab827..1e84acd08fa 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -759,7 +759,6 @@ static void test_source_resolver(void) check_interface(mediasource, &IID_IMFGetService, TRUE); check_service_interface(mediasource, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateSupport, TRUE); -todo_wine check_service_interface(mediasource, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateControl, TRUE); hr = IMFMediaSource_CreatePresentationDescriptor(mediasource, &descriptor); ok(hr == S_OK, "Failed to get presentation descriptor, hr %#x.\n", hr); diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c index 57c0b183ca8..eb5b9e366ec 100644 --- a/dlls/winegstreamer/media_source.c +++ b/dlls/winegstreamer/media_source.c @@ -80,6 +80,7 @@ struct media_source IMFMediaSource IMFMediaSource_iface; IMFGetService IMFGetService_iface; IMFRateSupport IMFRateSupport_iface; + IMFRateControl IMFRateControl_iface; IMFAsyncCallback async_commands_callback; LONG ref; DWORD async_commands_queue; @@ -125,6 +126,11 @@ static inline struct media_source *impl_from_IMFRateSupport(IMFRateSupport *ifac return CONTAINING_RECORD(iface, struct media_source, IMFRateSupport_iface); } +static inline struct media_source *impl_from_IMFRateControl(IMFRateControl *iface) +{ + return CONTAINING_RECORD(iface, struct media_source, IMFRateControl_iface); +} + static inline struct media_source *impl_from_async_commands_callback_IMFAsyncCallback(IMFAsyncCallback *iface) { return CONTAINING_RECORD(iface, struct media_source, async_commands_callback); @@ -867,6 +873,10 @@ static HRESULT WINAPI media_source_get_service_GetService(IMFGetService *iface, { *obj = &source->IMFRateSupport_iface; } + else if (IsEqualIID(riid, &IID_IMFRateControl)) + { + *obj = &source->IMFRateControl_iface; + } } else FIXME("Unsupported service %s.\n", debugstr_guid(service)); @@ -959,6 +969,61 @@ static const IMFRateSupportVtbl media_source_rate_support_vtbl = media_source_rate_support_IsRateSupported, }; +static HRESULT WINAPI media_source_rate_control_QueryInterface(IMFRateControl *iface, REFIID riid, void **obj) +{ + struct media_source *source = impl_from_IMFRateControl(iface); + return IMFMediaSource_QueryInterface(&source->IMFMediaSource_iface, riid, obj); +} + +static ULONG WINAPI media_source_rate_control_AddRef(IMFRateControl *iface) +{ + struct media_source *source = impl_from_IMFRateControl(iface); + return IMFMediaSource_AddRef(&source->IMFMediaSource_iface); +} + +static ULONG WINAPI media_source_rate_control_Release(IMFRateControl *iface) +{ + struct media_source *source = impl_from_IMFRateControl(iface); + return IMFMediaSource_Release(&source->IMFMediaSource_iface); +} + +static HRESULT WINAPI media_source_rate_control_SetRate(IMFRateControl *iface, BOOL thin, float rate) +{ + FIXME("%p, %d, %f.\n", iface, thin, rate); + + if (rate < 0.0f) + return MF_E_REVERSE_UNSUPPORTED; + + if (thin) + return MF_E_THINNING_UNSUPPORTED; + + if (rate != 1.0f) + return MF_E_UNSUPPORTED_RATE; + + return S_OK; +} + +static HRESULT WINAPI media_source_rate_control_GetRate(IMFRateControl *iface, BOOL *thin, float *rate) +{ + TRACE("%p, %p, %p.\n", iface, thin, rate); + + if (thin) + *thin = FALSE; + + *rate = 1.0f; + + return S_OK; +} + +static const IMFRateControlVtbl media_source_rate_control_vtbl = +{ + media_source_rate_control_QueryInterface, + media_source_rate_control_AddRef, + media_source_rate_control_Release, + media_source_rate_control_SetRate, + media_source_rate_control_GetRate, +}; + static HRESULT WINAPI media_source_QueryInterface(IMFMediaSource *iface, REFIID riid, void **out) { struct media_source *source = impl_from_IMFMediaSource(iface); @@ -1236,6 +1301,7 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_ object->IMFMediaSource_iface.lpVtbl = &IMFMediaSource_vtbl; object->IMFGetService_iface.lpVtbl = &media_source_get_service_vtbl; object->IMFRateSupport_iface.lpVtbl = &media_source_rate_support_vtbl; + object->IMFRateControl_iface.lpVtbl = &media_source_rate_control_vtbl; object->async_commands_callback.lpVtbl = &source_async_commands_callback_vtbl; object->ref = 1; object->byte_stream = bytestream;
1
0
0
0
Giovanni Mascellani : winegstreamer: Implement a stub IMFRateSupport for the media source.
by Alexandre Julliard
26 Mar '21
26 Mar '21
Module: wine Branch: master Commit: 6e4c7d4dba3d83b2c62d8059c0531322370c4006 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=6e4c7d4dba3d83b2c62d8059…
Author: Giovanni Mascellani <gmascellani(a)codeweavers.com> Date: Fri Mar 26 09:25:28 2021 +0100 winegstreamer: Implement a stub IMFRateSupport for the media source. Signed-off-by: Giovanni Mascellani <gmascellani(a)codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/mfplat/tests/mfplat.c | 3 +- dlls/winegstreamer/media_source.c | 102 +++++++++++++++++++++++++++++++++++++- 2 files changed, 101 insertions(+), 4 deletions(-) diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 6084d5131aa..a38cecab827 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -758,10 +758,9 @@ static void test_source_resolver(void) ok(obj_type == MF_OBJECT_MEDIASOURCE, "got %d\n", obj_type); check_interface(mediasource, &IID_IMFGetService, TRUE); -todo_wine { check_service_interface(mediasource, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateSupport, TRUE); +todo_wine check_service_interface(mediasource, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateControl, TRUE); -} hr = IMFMediaSource_CreatePresentationDescriptor(mediasource, &descriptor); ok(hr == S_OK, "Failed to get presentation descriptor, hr %#x.\n", hr); ok(descriptor != NULL, "got %p\n", descriptor); diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c index f795932e966..57c0b183ca8 100644 --- a/dlls/winegstreamer/media_source.c +++ b/dlls/winegstreamer/media_source.c @@ -79,6 +79,7 @@ struct media_source { IMFMediaSource IMFMediaSource_iface; IMFGetService IMFGetService_iface; + IMFRateSupport IMFRateSupport_iface; IMFAsyncCallback async_commands_callback; LONG ref; DWORD async_commands_queue; @@ -119,6 +120,11 @@ static inline struct media_source *impl_from_IMFGetService(IMFGetService *iface) return CONTAINING_RECORD(iface, struct media_source, IMFGetService_iface); } +static inline struct media_source *impl_from_IMFRateSupport(IMFRateSupport *iface) +{ + return CONTAINING_RECORD(iface, struct media_source, IMFRateSupport_iface); +} + static inline struct media_source *impl_from_async_commands_callback_IMFAsyncCallback(IMFAsyncCallback *iface) { return CONTAINING_RECORD(iface, struct media_source, async_commands_callback); @@ -849,9 +855,26 @@ static ULONG WINAPI media_source_get_service_Release(IMFGetService *iface) static HRESULT WINAPI media_source_get_service_GetService(IMFGetService *iface, REFGUID service, REFIID riid, void **obj) { - FIXME("stub %p, %s, %s, %p.\n", iface, debugstr_guid(service), debugstr_guid(riid), obj); + struct media_source *source = impl_from_IMFGetService(iface); - return E_NOINTERFACE; + TRACE("%p, %s, %s, %p.\n", iface, debugstr_guid(service), debugstr_guid(riid), obj); + + *obj = NULL; + + if (IsEqualGUID(service, &MF_RATE_CONTROL_SERVICE)) + { + if (IsEqualIID(riid, &IID_IMFRateSupport)) + { + *obj = &source->IMFRateSupport_iface; + } + } + else + FIXME("Unsupported service %s.\n", debugstr_guid(service)); + + if (*obj) + IUnknown_AddRef((IUnknown *)*obj); + + return *obj ? S_OK : E_NOINTERFACE; } static const IMFGetServiceVtbl media_source_get_service_vtbl = @@ -862,6 +885,80 @@ static const IMFGetServiceVtbl media_source_get_service_vtbl = media_source_get_service_GetService, }; +static HRESULT WINAPI media_source_rate_support_QueryInterface(IMFRateSupport *iface, REFIID riid, void **obj) +{ + struct media_source *source = impl_from_IMFRateSupport(iface); + return IMFMediaSource_QueryInterface(&source->IMFMediaSource_iface, riid, obj); +} + +static ULONG WINAPI media_source_rate_support_AddRef(IMFRateSupport *iface) +{ + struct media_source *source = impl_from_IMFRateSupport(iface); + return IMFMediaSource_AddRef(&source->IMFMediaSource_iface); +} + +static ULONG WINAPI media_source_rate_support_Release(IMFRateSupport *iface) +{ + struct media_source *source = impl_from_IMFRateSupport(iface); + return IMFMediaSource_Release(&source->IMFMediaSource_iface); +} + +static HRESULT WINAPI media_source_rate_support_GetSlowestRate(IMFRateSupport *iface, MFRATE_DIRECTION direction, BOOL thin, float *rate) +{ + TRACE("%p, %d, %d, %p.\n", iface, direction, thin, rate); + + if (direction == MFRATE_REVERSE) + return MF_E_REVERSE_UNSUPPORTED; + + if (thin) + return MF_E_THINNING_UNSUPPORTED; + + *rate = 1.0f; + + return S_OK; +} + +static HRESULT WINAPI media_source_rate_support_GetFastestRate(IMFRateSupport *iface, MFRATE_DIRECTION direction, BOOL thin, float *rate) +{ + TRACE("%p, %d, %d, %p.\n", iface, direction, thin, rate); + + if (direction == MFRATE_REVERSE) + return MF_E_REVERSE_UNSUPPORTED; + + if (thin) + return MF_E_THINNING_UNSUPPORTED; + + *rate = 1.0f; + + return S_OK; +} + +static HRESULT WINAPI media_source_rate_support_IsRateSupported(IMFRateSupport *iface, BOOL thin, float rate, float *nearest_support_rate) +{ + TRACE("%p, %d, %f, %p.\n", iface, thin, rate, nearest_support_rate); + + if (rate < 0.0f) + return MF_E_REVERSE_UNSUPPORTED; + + if (thin) + return MF_E_THINNING_UNSUPPORTED; + + if (nearest_support_rate) + *nearest_support_rate = 1.0f; + + return rate == 1.0f ? S_OK : MF_E_UNSUPPORTED_RATE; +} + +static const IMFRateSupportVtbl media_source_rate_support_vtbl = +{ + media_source_rate_support_QueryInterface, + media_source_rate_support_AddRef, + media_source_rate_support_Release, + media_source_rate_support_GetSlowestRate, + media_source_rate_support_GetFastestRate, + media_source_rate_support_IsRateSupported, +}; + static HRESULT WINAPI media_source_QueryInterface(IMFMediaSource *iface, REFIID riid, void **out) { struct media_source *source = impl_from_IMFMediaSource(iface); @@ -1138,6 +1235,7 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_ object->IMFMediaSource_iface.lpVtbl = &IMFMediaSource_vtbl; object->IMFGetService_iface.lpVtbl = &media_source_get_service_vtbl; + object->IMFRateSupport_iface.lpVtbl = &media_source_rate_support_vtbl; object->async_commands_callback.lpVtbl = &source_async_commands_callback_vtbl; object->ref = 1; object->byte_stream = bytestream;
1
0
0
0
Giovanni Mascellani : winegstreamer: Implement a stub IMFGetService for the media source.
by Alexandre Julliard
26 Mar '21
26 Mar '21
Module: wine Branch: master Commit: 0a0bf3cf21c5d08d9aa1873cd20da71e224c6aba URL:
https://source.winehq.org/git/wine.git/?a=commit;h=0a0bf3cf21c5d08d9aa1873c…
Author: Giovanni Mascellani <gmascellani(a)codeweavers.com> Date: Fri Mar 26 09:25:27 2021 +0100 winegstreamer: Implement a stub IMFGetService for the media source. Signed-off-by: Giovanni Mascellani <gmascellani(a)codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/mfplat/tests/mfplat.c | 2 +- dlls/winegstreamer/media_source.c | 44 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 103441be14c..6084d5131aa 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -757,8 +757,8 @@ static void test_source_resolver(void) ok(mediasource != NULL, "got %p\n", mediasource); ok(obj_type == MF_OBJECT_MEDIASOURCE, "got %d\n", obj_type); -todo_wine { check_interface(mediasource, &IID_IMFGetService, TRUE); +todo_wine { check_service_interface(mediasource, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateSupport, TRUE); check_service_interface(mediasource, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateControl, TRUE); } diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c index 589e894db2e..f795932e966 100644 --- a/dlls/winegstreamer/media_source.c +++ b/dlls/winegstreamer/media_source.c @@ -78,6 +78,7 @@ struct source_async_command struct media_source { IMFMediaSource IMFMediaSource_iface; + IMFGetService IMFGetService_iface; IMFAsyncCallback async_commands_callback; LONG ref; DWORD async_commands_queue; @@ -113,6 +114,11 @@ static inline struct media_source *impl_from_IMFMediaSource(IMFMediaSource *ifac return CONTAINING_RECORD(iface, struct media_source, IMFMediaSource_iface); } +static inline struct media_source *impl_from_IMFGetService(IMFGetService *iface) +{ + return CONTAINING_RECORD(iface, struct media_source, IMFGetService_iface); +} + static inline struct media_source *impl_from_async_commands_callback_IMFAsyncCallback(IMFAsyncCallback *iface) { return CONTAINING_RECORD(iface, struct media_source, async_commands_callback); @@ -823,6 +829,39 @@ done: return hr; } +static HRESULT WINAPI media_source_get_service_QueryInterface(IMFGetService *iface, REFIID riid, void **obj) +{ + struct media_source *source = impl_from_IMFGetService(iface); + return IMFMediaSource_QueryInterface(&source->IMFMediaSource_iface, riid, obj); +} + +static ULONG WINAPI media_source_get_service_AddRef(IMFGetService *iface) +{ + struct media_source *source = impl_from_IMFGetService(iface); + return IMFMediaSource_AddRef(&source->IMFMediaSource_iface); +} + +static ULONG WINAPI media_source_get_service_Release(IMFGetService *iface) +{ + struct media_source *source = impl_from_IMFGetService(iface); + return IMFMediaSource_Release(&source->IMFMediaSource_iface); +} + +static HRESULT WINAPI media_source_get_service_GetService(IMFGetService *iface, REFGUID service, REFIID riid, void **obj) +{ + FIXME("stub %p, %s, %s, %p.\n", iface, debugstr_guid(service), debugstr_guid(riid), obj); + + return E_NOINTERFACE; +} + +static const IMFGetServiceVtbl media_source_get_service_vtbl = +{ + media_source_get_service_QueryInterface, + media_source_get_service_AddRef, + media_source_get_service_Release, + media_source_get_service_GetService, +}; + static HRESULT WINAPI media_source_QueryInterface(IMFMediaSource *iface, REFIID riid, void **out) { struct media_source *source = impl_from_IMFMediaSource(iface); @@ -835,6 +874,10 @@ static HRESULT WINAPI media_source_QueryInterface(IMFMediaSource *iface, REFIID { *out = &source->IMFMediaSource_iface; } + else if (IsEqualIID(riid, &IID_IMFGetService)) + { + *out = &source->IMFGetService_iface; + } else { FIXME("(%s, %p)\n", debugstr_guid(riid), out); @@ -1094,6 +1137,7 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_ return E_OUTOFMEMORY; object->IMFMediaSource_iface.lpVtbl = &IMFMediaSource_vtbl; + object->IMFGetService_iface.lpVtbl = &media_source_get_service_vtbl; object->async_commands_callback.lpVtbl = &source_async_commands_callback_vtbl; object->ref = 1; object->byte_stream = bytestream;
1
0
0
0
Nikolay Sivov : mfplat/tests: Add media source rate service tests.
by Alexandre Julliard
26 Mar '21
26 Mar '21
Module: wine Branch: master Commit: 49886f031257cd8cf685456b89ed91fe77f60c6e URL:
https://source.winehq.org/git/wine.git/?a=commit;h=49886f031257cd8cf685456b…
Author: Nikolay Sivov <nsivov(a)codeweavers.com> Date: Fri Mar 26 09:25:26 2021 +0100 mfplat/tests: Add media source rate service tests. Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Giovanni Mascellani <gmascellani(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/mfplat/tests/mfplat.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 1b24dce2fe0..103441be14c 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -93,6 +93,26 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO IUnknown_Release(unk); } +#define check_service_interface(a, b, c, d) check_service_interface_(__LINE__, a, b, c, d) +static void check_service_interface_(unsigned int line, void *iface_ptr, REFGUID service, REFIID iid, BOOL supported) +{ + IUnknown *iface = iface_ptr; + HRESULT hr, expected_hr; + IMFGetService *gs; + IUnknown *unk; + + expected_hr = supported ? S_OK : E_NOINTERFACE; + + if (SUCCEEDED(hr = IUnknown_QueryInterface(iface, &IID_IMFGetService, (void **)&gs))) + { + hr = IMFGetService_GetService(gs, service, iid, (void **)&unk); + IMFGetService_Release(gs); + } + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); + if (SUCCEEDED(hr)) + IUnknown_Release(unk); +} + struct d3d11_resource_readback { ID3D11Resource *resource; @@ -737,6 +757,11 @@ static void test_source_resolver(void) ok(mediasource != NULL, "got %p\n", mediasource); ok(obj_type == MF_OBJECT_MEDIASOURCE, "got %d\n", obj_type); +todo_wine { + check_interface(mediasource, &IID_IMFGetService, TRUE); + check_service_interface(mediasource, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateSupport, TRUE); + check_service_interface(mediasource, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateControl, TRUE); +} hr = IMFMediaSource_CreatePresentationDescriptor(mediasource, &descriptor); ok(hr == S_OK, "Failed to get presentation descriptor, hr %#x.\n", hr); ok(descriptor != NULL, "got %p\n", descriptor);
1
0
0
0
Nikolay Sivov : mfreadwrite/reader: Use shared multi-threaded queue internally.
by Alexandre Julliard
26 Mar '21
26 Mar '21
Module: wine Branch: master Commit: 657a76ce2337e523c4f3c35e73aaf92c1f0969d6 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=657a76ce2337e523c4f3c35e…
Author: Nikolay Sivov <nsivov(a)codeweavers.com> Date: Fri Mar 26 11:23:21 2021 +0300 mfreadwrite/reader: Use shared multi-threaded queue internally. Using dedicated queue prevents potential lockups with event queue, specifically when waiting on event queue for seek to finish blocks events delivery. The issue was diagnosed by Giovanni. Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/mfreadwrite/reader.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/dlls/mfreadwrite/reader.c b/dlls/mfreadwrite/reader.c index ab9f6c83674..d3df7abd9fc 100644 --- a/dlls/mfreadwrite/reader.c +++ b/dlls/mfreadwrite/reader.c @@ -195,6 +195,7 @@ struct source_reader unsigned int last_read_index; unsigned int stream_count; unsigned int flags; + unsigned int queue; enum media_source_state source_state; struct media_stream *streams; struct list responses; @@ -384,8 +385,7 @@ static void source_reader_response_ready(struct source_reader *reader, struct st if (SUCCEEDED(source_reader_create_async_op(SOURCE_READER_ASYNC_SAMPLE_READY, &command))) { command->u.sample.stream_index = stream->index; - if (FAILED(hr = MFPutWorkItem(MFASYNC_CALLBACK_QUEUE_STANDARD, &reader->async_commands_callback, - &command->IUnknown_iface))) + if (FAILED(hr = MFPutWorkItem(reader->queue, &reader->async_commands_callback, &command->IUnknown_iface))) WARN("Failed to submit async result, hr %#x.\n", hr); IUnknown_Release(&command->IUnknown_iface); } @@ -1396,6 +1396,7 @@ static ULONG WINAPI src_reader_Release(IMFSourceReader *iface) } source_reader_release_responses(reader, NULL); heap_free(reader->streams); + MFUnlockWorkQueue(reader->queue); DeleteCriticalSection(&reader->cs); heap_free(reader); } @@ -1873,8 +1874,7 @@ static HRESULT WINAPI src_reader_SetCurrentPosition(IMFSourceReader *iface, REFG command->u.seek.format = *format; PropVariantCopy(&command->u.seek.position, position); - hr = MFPutWorkItem(MFASYNC_CALLBACK_QUEUE_MULTITHREADED, &reader->async_commands_callback, - &command->IUnknown_iface); + hr = MFPutWorkItem(reader->queue, &reader->async_commands_callback, &command->IUnknown_iface); IUnknown_Release(&command->IUnknown_iface); } } @@ -1976,7 +1976,7 @@ static HRESULT source_reader_read_sample_async(struct source_reader *reader, uns command->u.read.stream_index = index; command->u.read.flags = flags; - hr = MFPutWorkItem(MFASYNC_CALLBACK_QUEUE_STANDARD, &reader->async_commands_callback, &command->IUnknown_iface); + hr = MFPutWorkItem(reader->queue, &reader->async_commands_callback, &command->IUnknown_iface); IUnknown_Release(&command->IUnknown_iface); } } @@ -2040,7 +2040,7 @@ static HRESULT source_reader_flush_async(struct source_reader *reader, unsigned command->u.flush.stream_index = stream_index; - hr = MFPutWorkItem(MFASYNC_CALLBACK_QUEUE_STANDARD, &reader->async_commands_callback, &command->IUnknown_iface); + hr = MFPutWorkItem(reader->queue, &reader->async_commands_callback, &command->IUnknown_iface); IUnknown_Release(&command->IUnknown_iface); return hr; @@ -2265,7 +2265,7 @@ static HRESULT WINAPI stream_sample_allocator_cb_NotifyRelease(IMFVideoSampleAll if (SUCCEEDED(source_reader_create_async_op(SOURCE_READER_ASYNC_SA_READY, &command))) { command->u.sa.stream_index = stream->index; - MFPutWorkItem(MFASYNC_CALLBACK_QUEUE_STANDARD, &stream->reader->async_commands_callback, &command->IUnknown_iface); + MFPutWorkItem(stream->reader->queue, &stream->reader->async_commands_callback, &command->IUnknown_iface); IUnknown_Release(&command->IUnknown_iface); } @@ -2406,7 +2406,11 @@ static HRESULT create_source_reader_from_source(IMFMediaSource *source, IMFAttri } } - hr = IMFSourceReader_QueryInterface(&object->IMFSourceReader_iface, riid, out); + if (FAILED(hr = MFLockSharedWorkQueue(L"", 0, NULL, &object->queue))) + WARN("Failed to acquired shared queue, hr %#x.\n", hr); + + if (SUCCEEDED(hr)) + hr = IMFSourceReader_QueryInterface(&object->IMFSourceReader_iface, riid, out); failed: IMFSourceReader_Release(&object->IMFSourceReader_iface);
1
0
0
0
Giovanni Mascellani : mfreadwrite: Simplify iteration through streams.
by Alexandre Julliard
26 Mar '21
26 Mar '21
Module: wine Branch: master Commit: 06366bd16b82b79b21a698808c6cb3744fbba151 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=06366bd16b82b79b21a69880…
Author: Giovanni Mascellani <gmascellani(a)codeweavers.com> Date: Fri Mar 26 09:07:37 2021 +0100 mfreadwrite: Simplify iteration through streams. This also fixes a bug happening when the reader has only one stream, in which case the iteration body was not even executed once. Signed-off-by: Giovanni Mascellani <gmascellani(a)codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/mfreadwrite/reader.c | 14 ++++++------ dlls/mfreadwrite/tests/mfplat.c | 50 +++++++++++++++++++++++++++++++++++------ 2 files changed, 50 insertions(+), 14 deletions(-) diff --git a/dlls/mfreadwrite/reader.c b/dlls/mfreadwrite/reader.c index 2819b800eb9..ab9f6c83674 100644 --- a/dlls/mfreadwrite/reader.c +++ b/dlls/mfreadwrite/reader.c @@ -1087,13 +1087,10 @@ static BOOL source_reader_get_read_result(struct source_reader *reader, struct m static HRESULT source_reader_get_next_selected_stream(struct source_reader *reader, unsigned int *stream_index) { - unsigned int i, start_idx, stop_idx, first_selected = ~0u, requests = ~0u; + unsigned int i, first_selected = ~0u, requests = ~0u; BOOL selected, stream_drained; - start_idx = (reader->last_read_index + 1) % reader->stream_count; - stop_idx = reader->last_read_index == ~0u ? reader->stream_count : reader->last_read_index; - - for (i = start_idx; i < reader->stream_count && i != stop_idx; i = (i + 1) % (reader->stream_count + 1)) + for (i = (reader->last_read_index + 1) % reader->stream_count; ; i = (i + 1) % reader->stream_count) { stream_drained = reader->streams[i].state == STREAM_STATE_EOS && !reader->streams[i].responses; selected = SUCCEEDED(source_reader_get_stream_selection(reader, i, &selected)) && selected; @@ -1110,6 +1107,9 @@ static HRESULT source_reader_get_next_selected_stream(struct source_reader *read *stream_index = i; } } + + if (i == reader->last_read_index) + break; } /* If all selected streams reached EOS, use first selected. */ @@ -1477,7 +1477,7 @@ static HRESULT WINAPI src_reader_SetStreamSelection(IMFSourceReader *iface, DWOR } if (selection_changed) - reader->last_read_index = ~0u; + reader->last_read_index = reader->stream_count - 1; LeaveCriticalSection(&reader->cs); @@ -2360,7 +2360,7 @@ static HRESULT create_source_reader_from_source(IMFMediaSource *source, IMFAttri /* At least one major type has to be set. */ object->first_audio_stream_index = reader_get_first_stream_index(object->descriptor, &MFMediaType_Audio); object->first_video_stream_index = reader_get_first_stream_index(object->descriptor, &MFMediaType_Video); - object->last_read_index = ~0u; + object->last_read_index = object->stream_count - 1; if (object->first_audio_stream_index == MF_SOURCE_READER_INVALID_STREAM_INDEX && object->first_video_stream_index == MF_SOURCE_READER_INVALID_STREAM_INDEX) diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index 25aa29ac272..c27806f699e 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -501,7 +501,7 @@ static struct test_media_stream *create_test_stream(DWORD stream_index, IMFMedia return stream; } -static IMFMediaSource *create_test_source(void) +static IMFMediaSource *create_test_source(int stream_num) { struct test_source *source; int i; @@ -511,7 +511,7 @@ static IMFMediaSource *create_test_source(void) source->refcount = 1; MFCreateEventQueue(&source->event_queue); InitializeCriticalSection(&source->cs); - for (i = 0; i < ARRAY_SIZE(source->streams); ++i) + for (i = 0; i < stream_num; ++i) source->streams[i] = create_test_stream(i, &source->IMFMediaSource_iface); return &source->IMFMediaSource_iface; @@ -904,7 +904,7 @@ static void test_source_reader_from_media_source(void) int i; PROPVARIANT pos; - source = create_test_source(); + source = create_test_source(3); ok(!!source, "Failed to create test source.\n"); hr = MFCreateSourceReaderFromMediaSource(source, NULL, &reader); @@ -970,8 +970,44 @@ static void test_source_reader_from_media_source(void) IMFSourceReader_Release(reader); IMFMediaSource_Release(source); + source = create_test_source(1); + ok(!!source, "Failed to create test source.\n"); + + hr = MFCreateSourceReaderFromMediaSource(source, NULL, &reader); + ok(hr == S_OK, "Failed to create source reader, hr %#x.\n", hr); + + /* MF_SOURCE_READER_ANY_STREAM with a single stream */ + hr = IMFSourceReader_SetStreamSelection(reader, 0, TRUE); + ok(hr == S_OK, "Failed to select a stream, hr %#x.\n", hr); + + pos.vt = VT_I8; + pos.hVal.QuadPart = 0; + hr = IMFSourceReader_SetCurrentPosition(reader, &GUID_NULL, &pos); + ok(hr == S_OK, "Failed to seek to beginning of stream, hr %#x.\n", hr); + + hr = IMFSourceReader_ReadSample(reader, MF_SOURCE_READER_ANY_STREAM, 0, &actual_index, &stream_flags, + ×tamp, &sample); + ok(hr == S_OK, "Failed to get a sample, hr %#x.\n", hr); + ok(actual_index == 0, "Unexpected stream index %u\n", actual_index); + ok(!stream_flags, "Unexpected stream flags %#x.\n", stream_flags); + ok(timestamp == 123, "Unexpected timestamp.\n"); + ok(!!sample, "Expected sample object.\n"); + IMFSample_Release(sample); + + hr = IMFSourceReader_ReadSample(reader, MF_SOURCE_READER_ANY_STREAM, 0, &actual_index, &stream_flags, + ×tamp, &sample); + ok(hr == S_OK, "Failed to get a sample, hr %#x.\n", hr); + ok(actual_index == 0, "Unexpected stream index %u\n", actual_index); + ok(!stream_flags, "Unexpected stream flags %#x.\n", stream_flags); + ok(timestamp == 123, "Unexpected timestamp.\n"); + ok(!!sample, "Expected sample object.\n"); + IMFSample_Release(sample); + + IMFSourceReader_Release(reader); + IMFMediaSource_Release(source); + /* Request from stream 0. */ - source = create_test_source(); + source = create_test_source(3); ok(!!source, "Failed to create test source.\n"); hr = MFCreateSourceReaderFromMediaSource(source, NULL, &reader); @@ -1005,7 +1041,7 @@ static void test_source_reader_from_media_source(void) IMFMediaSource_Release(source); /* Async mode. */ - source = create_test_source(); + source = create_test_source(3); ok(!!source, "Failed to create test source.\n"); callback = create_async_callback(); @@ -1050,7 +1086,7 @@ static void test_source_reader_from_media_source(void) IMFMediaSource_Release(source); /* RequestSample failure. */ - source = create_test_source(); + source = create_test_source(3); ok(!!source, "Failed to create test source.\n"); fail_request_sample = TRUE; @@ -1120,7 +1156,7 @@ static void test_reader_d3d9(void) hr = IDirect3DDeviceManager9_ResetDevice(d3d9_manager, d3d9_device, token); ok(hr == S_OK, "Unexpected hr %#x.\n", hr); - source = create_test_source(); + source = create_test_source(3); ok(!!source, "Failed to create test source.\n"); hr = MFCreateAttributes(&attributes, 1);
1
0
0
0
Alistair Leslie-Hughes : msado15: Implement _Recordset get/put Bookmark.
by Alexandre Julliard
26 Mar '21
26 Mar '21
Module: wine Branch: master Commit: db509cf4fe862ed13beccd0d281b854aa905a45e URL:
https://source.winehq.org/git/wine.git/?a=commit;h=db509cf4fe862ed13beccd0d…
Author: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com> Date: Fri Mar 26 08:09:17 2021 +1100 msado15: Implement _Recordset get/put Bookmark. Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com> Signed-off-by: Hans Leidekker <hans(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/msado15/recordset.c | 22 ++++++++++++++++++---- dlls/msado15/tests/msado15.c | 17 +++++++++++++++++ 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c index a86936eb037..68d4c22d802 100644 --- a/dlls/msado15/recordset.c +++ b/dlls/msado15/recordset.c @@ -1029,14 +1029,28 @@ static HRESULT WINAPI recordset_get_BOF( _Recordset *iface, VARIANT_BOOL *bof ) static HRESULT WINAPI recordset_get_Bookmark( _Recordset *iface, VARIANT *bookmark ) { - FIXME( "%p, %p\n", iface, bookmark ); - return E_NOTIMPL; + struct recordset *recordset = impl_from_Recordset( iface ); + TRACE( "%p, %p\n", iface, bookmark ); + + if (recordset->state == adStateClosed) return MAKE_ADO_HRESULT( adErrObjectClosed ); + if (recordset->index < 0) return MAKE_ADO_HRESULT( adErrNoCurrentRecord ); + + V_VT(bookmark) = VT_I4; + V_I4(bookmark) = recordset->index; + return S_OK; } static HRESULT WINAPI recordset_put_Bookmark( _Recordset *iface, VARIANT bookmark ) { - FIXME( "%p, %s\n", iface, debugstr_variant(&bookmark) ); - return E_NOTIMPL; + struct recordset *recordset = impl_from_Recordset( iface ); + TRACE( "%p, %s\n", iface, debugstr_variant(&bookmark) ); + + if (recordset->state == adStateClosed) return MAKE_ADO_HRESULT( adErrObjectClosed ); + + if (V_VT(&bookmark) != VT_I4) return MAKE_ADO_HRESULT( adErrInvalidArgument ); + + recordset->index = V_I4(&bookmark); + return S_OK; } static HRESULT WINAPI recordset_get_CacheSize( _Recordset *iface, LONG *size ) diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c index bc9b4a24761..db606f21fab 100644 --- a/dlls/msado15/tests/msado15.c +++ b/dlls/msado15/tests/msado15.c @@ -74,6 +74,7 @@ static void test_Recordset(void) CursorTypeEnum cursor; BSTR name; HRESULT hr; + VARIANT bookmark; hr = CoCreateInstance( &CLSID_Recordset, NULL, CLSCTX_INPROC_SERVER, &IID__Recordset, (void **)&recordset ); ok( hr == S_OK, "got %08x\n", hr ); @@ -153,6 +154,14 @@ static void test_Recordset(void) ok( hr == S_OK, "got %08x\n", hr ); ok( cursor == adOpenForwardOnly, "got %d\n", cursor ); + VariantInit( &bookmark ); + hr = _Recordset_get_Bookmark( recordset, &bookmark ); + ok( hr == MAKE_ADO_HRESULT( adErrObjectClosed ), "got %08x\n", hr ); + + VariantInit( &bookmark ); + hr = _Recordset_put_Bookmark( recordset, bookmark ); + ok( hr == MAKE_ADO_HRESULT( adErrObjectClosed ), "got %08x\n", hr ); + VariantInit( &missing ); hr = _Recordset_AddNew( recordset, missing, missing ); ok( hr == MAKE_ADO_HRESULT( adErrObjectClosed ), "got %08x\n", hr ); @@ -188,6 +197,14 @@ static void test_Recordset(void) ok( hr == S_OK, "got %08x\n", hr ); ok( state == adStateOpen, "got %d\n", state ); + VariantInit( &bookmark ); + hr = _Recordset_get_Bookmark( recordset, &bookmark ); + ok( hr == MAKE_ADO_HRESULT( adErrNoCurrentRecord ), "got %08x\n", hr ); + + VariantInit( &bookmark ); + hr = _Recordset_put_Bookmark( recordset, bookmark ); + ok( hr == MAKE_ADO_HRESULT( adErrInvalidArgument ), "got %08x\n", hr ); + count = -1; hr = _Recordset_get_RecordCount( recordset, &count ); ok( hr == S_OK, "got %08x\n", hr );
1
0
0
0
Jacek Caban : mmdevapi/tests: Use nameless unions.
by Alexandre Julliard
26 Mar '21
26 Mar '21
Module: wine Branch: master Commit: 25f5734ead98dbf646e1b7a4a1ebe6c916891009 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=25f5734ead98dbf646e1b7a4…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Thu Mar 25 21:39:59 2021 +0100 mmdevapi/tests: Use nameless unions. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Andrew Eikum <aeikum(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/mmdevapi/tests/Makefile.in | 1 - dlls/mmdevapi/tests/propstore.c | 14 +++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/dlls/mmdevapi/tests/Makefile.in b/dlls/mmdevapi/tests/Makefile.in index 4b43b900b31..dd180a253b9 100644 --- a/dlls/mmdevapi/tests/Makefile.in +++ b/dlls/mmdevapi/tests/Makefile.in @@ -1,6 +1,5 @@ TESTDLL = mmdevapi.dll IMPORTS = ole32 version user32 advapi32 winmm -EXTRADEFS = -DWINE_NO_NAMELESS_EXTENSION C_SRCS = \ capture.c \ diff --git a/dlls/mmdevapi/tests/propstore.c b/dlls/mmdevapi/tests/propstore.c index e5071e67e52..8999699fe6b 100644 --- a/dlls/mmdevapi/tests/propstore.c +++ b/dlls/mmdevapi/tests/propstore.c @@ -49,7 +49,7 @@ static void test_propertystore(IPropertyStore *store) ok(pv.vt == VT_LPWSTR, "Value should be %i, is %i\n", VT_LPWSTR, pv.vt); if (hr == S_OK && pv.vt == VT_LPWSTR) { - WideCharToMultiByte(CP_ACP, 0, pv.u.pwszVal, -1, temp, sizeof(temp)-1, NULL, NULL); + WideCharToMultiByte(CP_ACP, 0, pv.pwszVal, -1, temp, sizeof(temp)-1, NULL, NULL); trace("guid: %s\n", temp); PropVariantClear(&pv); } @@ -57,7 +57,7 @@ static void test_propertystore(IPropertyStore *store) pv.vt = VT_EMPTY; hr = IPropertyStore_GetValue(store, (const PROPERTYKEY*)&DEVPKEY_DeviceInterface_FriendlyName, &pv); ok(hr == S_OK, "Failed with %08x\n", hr); - ok(pv.vt == VT_LPWSTR && pv.u.pwszVal, "FriendlyName value had wrong type: 0x%x or was NULL\n", pv.vt); + ok(pv.vt == VT_LPWSTR && pv.pwszVal, "FriendlyName value had wrong type: 0x%x or was NULL\n", pv.vt); PropVariantClear(&pv); pv.vt = VT_EMPTY; @@ -86,7 +86,7 @@ static void test_deviceinterface(IPropertyStore *store) hr = IPropertyStore_GetValue(store, &deviceinterface_key, &pv); ok(hr == S_OK, "GetValue failed: %08x\n", hr); ok(pv.vt == VT_LPWSTR, "Got wrong variant type: 0x%x\n", pv.vt); - trace("device interface: %s\n", wine_dbgstr_w(pv.u.pwszVal)); + trace("device interface: %s\n", wine_dbgstr_w(pv.pwszVal)); PropVariantClear(&pv); } @@ -139,10 +139,10 @@ static void test_setvalue_on_wow64(IPropertyStore *store) hr = IPropertyStore_GetValue(store, &PKEY_AudioEndpoint_GUID, &pv); ok(hr == S_OK, "Failed to get Endpoint GUID: %08x\n", hr); - guidW = pv.u.pwszVal; + guidW = pv.pwszVal; pv.vt = VT_UI4; - pv.u.ulVal = 0xAB; + pv.ulVal = 0xAB; hr = IPropertyStore_SetValue(store, &PKEY_Bogus, &pv); ok(hr == S_OK || hr == E_ACCESSDENIED, "SetValue failed: %08x\n", hr); @@ -152,11 +152,11 @@ static void test_setvalue_on_wow64(IPropertyStore *store) return; } - pv.u.ulVal = 0x00; + pv.ulVal = 0x00; hr = IPropertyStore_GetValue(store, &PKEY_Bogus, &pv); ok(hr == S_OK, "GetValue failed: %08x\n", hr); - ok(pv.u.ulVal == 0xAB, "Got wrong value: 0x%x\n", pv.u.ulVal); + ok(pv.ulVal == 0xAB, "Got wrong value: 0x%x\n", pv.ulVal); /* should find the key in 64-bit view */ ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE, software_renderW, 0, KEY_READ|KEY_WOW64_64KEY, &root);
1
0
0
0
← Newer
1
...
14
15
16
17
18
19
20
...
117
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
Results per page:
10
25
50
100
200