diff --git a/dlls/mf/Makefile.in b/dlls/mf/Makefile.in index 2eb9b346d91..ecedea65c19 100644 --- a/dlls/mf/Makefile.in +++ b/dlls/mf/Makefile.in @@ -5,6 +5,7 @@ IMPORTS = mfplat mfuuid C_SRCS = \ main.c \ samplegrabber.c \ + sar.c \ session.c \ topology.c diff --git a/dlls/mf/main.c b/dlls/mf/main.c index c2e5eb45d20..b5b4b0e7c80 100644 --- a/dlls/mf/main.c +++ b/dlls/mf/main.c @@ -392,7 +392,7 @@ static HRESULT WINAPI activate_object_ActivateObject(IMFActivate *iface, REFIID if (!activate->object) { - if (FAILED(hr = activate->funcs->create_object(activate->context, &object))) + if (FAILED(hr = activate->funcs->create_object((IMFAttributes *)iface, activate->context, &object))) return hr; if (!InterlockedCompareExchangePointer((void **)&activate->object, object, NULL)) diff --git a/dlls/mf/mf.spec b/dlls/mf/mf.spec index 61314952255..6e64404ba63 100644 --- a/dlls/mf/mf.spec +++ b/dlls/mf/mf.spec @@ -23,8 +23,8 @@ @ stub MFCreateASFStreamingMediaSinkActivate @ stub MFCreateAggregateSource @ stub MFCreateAppSourceProxy -@ stub MFCreateAudioRenderer -@ stub MFCreateAudioRendererActivate +@ stdcall MFCreateAudioRenderer(ptr ptr) +@ stdcall MFCreateAudioRendererActivate(ptr) @ stub MFCreateByteCacheFile @ stub MFCreateCacheManager @ stub MFCreateCredentialCache diff --git a/dlls/mf/mf_private.h b/dlls/mf/mf_private.h index 45a3834eecc..0b7d1c65fa4 100644 --- a/dlls/mf/mf_private.h +++ b/dlls/mf/mf_private.h @@ -49,7 +49,7 @@ static inline BOOL mf_array_reserve(void **elements, size_t *capacity, size_t co struct activate_funcs { - HRESULT (*create_object)(void *context, IUnknown **object); + HRESULT (*create_object)(IMFAttributes *attributes, void *context, IUnknown **object); void (*free_private)(void *context); }; diff --git a/dlls/mf/samplegrabber.c b/dlls/mf/samplegrabber.c index 1ffa3ba0b08..7b3536467c7 100644 --- a/dlls/mf/samplegrabber.c +++ b/dlls/mf/samplegrabber.c @@ -40,9 +40,9 @@ static void sample_grabber_free_private(void *user_context) heap_free(context); } -static HRESULT sample_grabber_create_object(void *user_context, IUnknown **obj) +static HRESULT sample_grabber_create_object(IMFAttributes *attributes, void *user_context, IUnknown **obj) { - FIXME("%p, %p.\n", user_context, obj); + FIXME("%p, %p, %p.\n", attributes, user_context, obj); return E_NOTIMPL; } diff --git a/dlls/mf/sar.c b/dlls/mf/sar.c new file mode 100644 index 00000000000..c0c1803df1f --- /dev/null +++ b/dlls/mf/sar.c @@ -0,0 +1,76 @@ +/* + * Copyright 2019 Nikolay Sivov for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define COBJMACROS + +#include "mfidl.h" +#include "mf_private.h" + +#include "wine/debug.h" +#include "wine/heap.h" + +WINE_DEFAULT_DEBUG_CHANNEL(mfplat); + +static HRESULT sar_create_object(IMFAttributes *attributes, void *user_context, IUnknown **obj) +{ + FIXME("%p, %p, %p.\n", attributes, user_context, obj); + + return E_NOTIMPL; +} + +static void sar_free_private(void *user_context) +{ +} + +static const struct activate_funcs sar_activate_funcs = +{ + sar_create_object, + sar_free_private, +}; + +/*********************************************************************** + * MFCreateAudioRendererActivate (mf.@) + */ +HRESULT WINAPI MFCreateAudioRendererActivate(IMFActivate **activate) +{ + TRACE("%p.\n", activate); + + if (!activate) + return E_POINTER; + + return create_activation_object(NULL, &sar_activate_funcs, activate); +} + +/*********************************************************************** + * MFCreateAudioRenderer (mf.@) + */ +HRESULT WINAPI MFCreateAudioRenderer(IMFAttributes *attributes, IMFMediaSink **sink) +{ + IUnknown *object; + HRESULT hr; + + TRACE("%p, %p.\n", attributes, sink); + + if (SUCCEEDED(hr = sar_create_object(attributes, NULL, &object))) + { + hr = IUnknown_QueryInterface(object, &IID_IMFMediaSink, (void **)sink); + IUnknown_Release(object); + } + + return hr; +}