winealsa.drv: Implement IMarshal for IAudioClient.
This commit is contained in:
parent
0f4bc3b945
commit
4e565b0ef0
|
@ -100,6 +100,7 @@ struct ACImpl {
|
||||||
snd_pcm_format_t alsa_format;
|
snd_pcm_format_t alsa_format;
|
||||||
|
|
||||||
IMMDevice *parent;
|
IMMDevice *parent;
|
||||||
|
IUnknown *pUnkFTMarshal;
|
||||||
|
|
||||||
EDataFlow dataflow;
|
EDataFlow dataflow;
|
||||||
WAVEFORMATEX *fmt;
|
WAVEFORMATEX *fmt;
|
||||||
|
@ -772,6 +773,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient
|
||||||
static int handle_underrun = 1;
|
static int handle_underrun = 1;
|
||||||
char alsa_name[256];
|
char alsa_name[256];
|
||||||
EDataFlow dataflow;
|
EDataFlow dataflow;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
TRACE("%s %p %p\n", debugstr_guid(guid), dev, out);
|
TRACE("%s %p %p\n", debugstr_guid(guid), dev, out);
|
||||||
|
|
||||||
|
@ -798,6 +800,13 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient
|
||||||
return E_UNEXPECTED;
|
return E_UNEXPECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient_iface,
|
||||||
|
(IUnknown **)&This->pUnkFTMarshal);
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
HeapFree(GetProcessHeap(), 0, This);
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
This->dataflow = dataflow;
|
This->dataflow = dataflow;
|
||||||
if(handle_underrun && ((lconf = make_handle_underrun_config(alsa_name)))){
|
if(handle_underrun && ((lconf = make_handle_underrun_config(alsa_name)))){
|
||||||
err = snd_pcm_open_lconf(&This->pcm_handle, alsa_name, stream, SND_PCM_NONBLOCK, lconf);
|
err = snd_pcm_open_lconf(&This->pcm_handle, alsa_name, stream, SND_PCM_NONBLOCK, lconf);
|
||||||
|
@ -848,6 +857,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient
|
||||||
static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient *iface,
|
static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient *iface,
|
||||||
REFIID riid, void **ppv)
|
REFIID riid, void **ppv)
|
||||||
{
|
{
|
||||||
|
ACImpl *This = impl_from_IAudioClient(iface);
|
||||||
TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv);
|
TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv);
|
||||||
|
|
||||||
if(!ppv)
|
if(!ppv)
|
||||||
|
@ -855,6 +865,9 @@ static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient *iface,
|
||||||
*ppv = NULL;
|
*ppv = NULL;
|
||||||
if(IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IAudioClient))
|
if(IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IAudioClient))
|
||||||
*ppv = iface;
|
*ppv = iface;
|
||||||
|
else if(IsEqualIID(riid, &IID_IMarshal))
|
||||||
|
return IUnknown_QueryInterface(This->pUnkFTMarshal, riid, ppv);
|
||||||
|
|
||||||
if(*ppv){
|
if(*ppv){
|
||||||
IUnknown_AddRef((IUnknown*)*ppv);
|
IUnknown_AddRef((IUnknown*)*ppv);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
@ -881,6 +894,7 @@ static ULONG WINAPI AudioClient_Release(IAudioClient *iface)
|
||||||
if(!ref){
|
if(!ref){
|
||||||
IAudioClient_Stop(iface);
|
IAudioClient_Stop(iface);
|
||||||
IMMDevice_Release(This->parent);
|
IMMDevice_Release(This->parent);
|
||||||
|
IUnknown_Release(This->pUnkFTMarshal);
|
||||||
This->lock.DebugInfo->Spare[0] = 0;
|
This->lock.DebugInfo->Spare[0] = 0;
|
||||||
DeleteCriticalSection(&This->lock);
|
DeleteCriticalSection(&This->lock);
|
||||||
snd_pcm_drop(This->pcm_handle);
|
snd_pcm_drop(This->pcm_handle);
|
||||||
|
@ -2418,6 +2432,7 @@ static const IAudioClientVtbl AudioClient_Vtbl =
|
||||||
static HRESULT WINAPI AudioRenderClient_QueryInterface(
|
static HRESULT WINAPI AudioRenderClient_QueryInterface(
|
||||||
IAudioRenderClient *iface, REFIID riid, void **ppv)
|
IAudioRenderClient *iface, REFIID riid, void **ppv)
|
||||||
{
|
{
|
||||||
|
ACImpl *This = impl_from_IAudioRenderClient(iface);
|
||||||
TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv);
|
TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv);
|
||||||
|
|
||||||
if(!ppv)
|
if(!ppv)
|
||||||
|
@ -2427,6 +2442,9 @@ static HRESULT WINAPI AudioRenderClient_QueryInterface(
|
||||||
if(IsEqualIID(riid, &IID_IUnknown) ||
|
if(IsEqualIID(riid, &IID_IUnknown) ||
|
||||||
IsEqualIID(riid, &IID_IAudioRenderClient))
|
IsEqualIID(riid, &IID_IAudioRenderClient))
|
||||||
*ppv = iface;
|
*ppv = iface;
|
||||||
|
else if(IsEqualIID(riid, &IID_IMarshal))
|
||||||
|
return IUnknown_QueryInterface(This->pUnkFTMarshal, riid, ppv);
|
||||||
|
|
||||||
if(*ppv){
|
if(*ppv){
|
||||||
IUnknown_AddRef((IUnknown*)*ppv);
|
IUnknown_AddRef((IUnknown*)*ppv);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
@ -2582,6 +2600,7 @@ static const IAudioRenderClientVtbl AudioRenderClient_Vtbl = {
|
||||||
static HRESULT WINAPI AudioCaptureClient_QueryInterface(
|
static HRESULT WINAPI AudioCaptureClient_QueryInterface(
|
||||||
IAudioCaptureClient *iface, REFIID riid, void **ppv)
|
IAudioCaptureClient *iface, REFIID riid, void **ppv)
|
||||||
{
|
{
|
||||||
|
ACImpl *This = impl_from_IAudioCaptureClient(iface);
|
||||||
TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv);
|
TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv);
|
||||||
|
|
||||||
if(!ppv)
|
if(!ppv)
|
||||||
|
@ -2591,6 +2610,9 @@ static HRESULT WINAPI AudioCaptureClient_QueryInterface(
|
||||||
if(IsEqualIID(riid, &IID_IUnknown) ||
|
if(IsEqualIID(riid, &IID_IUnknown) ||
|
||||||
IsEqualIID(riid, &IID_IAudioCaptureClient))
|
IsEqualIID(riid, &IID_IAudioCaptureClient))
|
||||||
*ppv = iface;
|
*ppv = iface;
|
||||||
|
else if(IsEqualIID(riid, &IID_IMarshal))
|
||||||
|
return IUnknown_QueryInterface(This->pUnkFTMarshal, riid, ppv);
|
||||||
|
|
||||||
if(*ppv){
|
if(*ppv){
|
||||||
IUnknown_AddRef((IUnknown*)*ppv);
|
IUnknown_AddRef((IUnknown*)*ppv);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|
Loading…
Reference in New Issue