⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 duplex.c

📁 一个类似windows
💻 C
字号:
/*              DirectSoundFullDuplex * * Copyright 1998 Marcus Meissner * Copyright 1998 Rob Riggs * Copyright 2000-2001 TransGaming Technologies, Inc. * Copyright 2005 Robert Reif * * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA *//* * TODO: *	Implement DirectSoundFullDuplex support. */#include <stdarg.h>#define NONAMELESSSTRUCT#define NONAMELESSUNION#include "windef.h"#include "winbase.h"#include "mmsystem.h"#include "mmddk.h"#include "winreg.h"#include "winternl.h"#include "winnls.h"#include "wine/debug.h"#include "dsound.h"#include "dsdriver.h"#include "dsound_private.h"WINE_DEFAULT_DEBUG_CHANNEL(dsound);static HRESULT WINAPI IDirectSoundFullDuplexImpl_Initialize(    LPDIRECTSOUNDFULLDUPLEX iface,    LPCGUID pCaptureGuid,    LPCGUID pRendererGuid,    LPCDSCBUFFERDESC lpDscBufferDesc,    LPCDSBUFFERDESC lpDsBufferDesc,    HWND hWnd,    DWORD dwLevel,    LPLPDIRECTSOUNDCAPTUREBUFFER8 lplpDirectSoundCaptureBuffer8,    LPLPDIRECTSOUNDBUFFER8 lplpDirectSoundBuffer8 );static const IDirectSoundFullDuplexVtbl dsfdvt;/*************************************************************************** * DirectSoundFullDuplexCreate [DSOUND.10] * * Create and initialize a DirectSoundFullDuplex interface. * * PARAMS *    pcGuidCaptureDevice [I] Address of sound capture device GUID. *    pcGuidRenderDevice  [I] Address of sound render device GUID. *    pcDSCBufferDesc     [I] Address of capture buffer description. *    pcDSBufferDesc      [I] Address of  render buffer description. *    hWnd                [I] Handle to application window. *    dwLevel             [I] Cooperative level. *    ppDSFD              [O] Address where full duplex interface returned. *    ppDSCBuffer8        [0] Address where capture buffer interface returned. *    ppDSBuffer8         [0] Address where render buffer interface returned. *    pUnkOuter           [I] Must be NULL. * * RETURNS *    Success: DS_OK *    Failure: DSERR_NOAGGREGATION, DSERR_ALLOCATED, DSERR_INVALIDPARAM, *             DSERR_OUTOFMEMORY DSERR_INVALIDCALL DSERR_NODRIVER */HRESULT WINAPIDirectSoundFullDuplexCreate(    LPCGUID pcGuidCaptureDevice,    LPCGUID pcGuidRenderDevice,    LPCDSCBUFFERDESC pcDSCBufferDesc,    LPCDSBUFFERDESC pcDSBufferDesc,    HWND hWnd,    DWORD dwLevel,    LPDIRECTSOUNDFULLDUPLEX *ppDSFD,    LPDIRECTSOUNDCAPTUREBUFFER8 *ppDSCBuffer8,    LPDIRECTSOUNDBUFFER8 *ppDSBuffer8,    LPUNKNOWN pUnkOuter){    IDirectSoundFullDuplexImpl** ippDSFD=(IDirectSoundFullDuplexImpl**)ppDSFD;    TRACE("(%s,%s,%p,%p,%p,%lx,%p,%p,%p,%p)\n", debugstr_guid(pcGuidCaptureDevice),	debugstr_guid(pcGuidRenderDevice), pcDSCBufferDesc, pcDSBufferDesc,	hWnd, dwLevel, ppDSFD, ppDSCBuffer8, ppDSBuffer8, pUnkOuter);    if ( pUnkOuter ) {	WARN("pUnkOuter != 0\n");        return DSERR_NOAGGREGATION;    }    *ippDSFD = HeapAlloc(GetProcessHeap(),	HEAP_ZERO_MEMORY, sizeof(IDirectSoundFullDuplexImpl));    if (*ippDSFD == NULL) {	WARN("out of memory\n");	return DSERR_OUTOFMEMORY;    } else {	HRESULT hres;        IDirectSoundFullDuplexImpl *This = (IDirectSoundFullDuplexImpl *)*ippDSFD;        This->ref = 1;        This->lpVtbl = &dsfdvt;        InitializeCriticalSection( &(This->lock) );        This->lock.DebugInfo->Spare[0] = (DWORD_PTR)"DSDUPLEX_lock";        hres = IDirectSoundFullDuplexImpl_Initialize( (LPDIRECTSOUNDFULLDUPLEX)This,                                                      pcGuidCaptureDevice, pcGuidRenderDevice,                                                      pcDSCBufferDesc, pcDSBufferDesc,                                                      hWnd, dwLevel, ppDSCBuffer8, ppDSBuffer8);	if (hres != DS_OK)	    WARN("IDirectSoundFullDuplexImpl_Initialize failed\n");	return hres;    }}static HRESULT WINAPIIDirectSoundFullDuplexImpl_QueryInterface(    LPDIRECTSOUNDFULLDUPLEX iface,    REFIID riid,    LPVOID* ppobj ){    IDirectSoundFullDuplexImpl *This = (IDirectSoundFullDuplexImpl *)iface;    TRACE( "(%p,%s,%p)\n", This, debugstr_guid(riid), ppobj );    if (ppobj == NULL) {	WARN("invalid parameter\n");	return E_INVALIDARG;    }    *ppobj = NULL;    return E_NOINTERFACE;}static ULONG WINAPIIDirectSoundFullDuplexImpl_AddRef( LPDIRECTSOUNDFULLDUPLEX iface ){    IDirectSoundFullDuplexImpl *This = (IDirectSoundFullDuplexImpl *)iface;    ULONG ref = InterlockedIncrement(&(This->ref));    TRACE("(%p) ref was %ld\n", This, ref - 1);    return ref;}static ULONG WINAPIIDirectSoundFullDuplexImpl_Release( LPDIRECTSOUNDFULLDUPLEX iface ){    IDirectSoundFullDuplexImpl *This = (IDirectSoundFullDuplexImpl *)iface;    ULONG ref = InterlockedDecrement(&(This->ref));    TRACE("(%p) ref was %ld\n", This, ref - 1);    if (!ref) {        This->lock.DebugInfo->Spare[0] = 0;        DeleteCriticalSection( &(This->lock) );        HeapFree( GetProcessHeap(), 0, This );	TRACE("(%p) released\n", This);    }    return ref;}static HRESULT WINAPIIDirectSoundFullDuplexImpl_Initialize(    LPDIRECTSOUNDFULLDUPLEX iface,    LPCGUID pCaptureGuid,    LPCGUID pRendererGuid,    LPCDSCBUFFERDESC lpDscBufferDesc,    LPCDSBUFFERDESC lpDsBufferDesc,    HWND hWnd,    DWORD dwLevel,    LPLPDIRECTSOUNDCAPTUREBUFFER8 lplpDirectSoundCaptureBuffer8,    LPLPDIRECTSOUNDBUFFER8 lplpDirectSoundBuffer8 ){    IDirectSoundFullDuplexImpl *This = (IDirectSoundFullDuplexImpl *)iface;    IDirectSoundCaptureBufferImpl** ippdscb=(IDirectSoundCaptureBufferImpl**)lplpDirectSoundCaptureBuffer8;    IDirectSoundBufferImpl** ippdsc=(IDirectSoundBufferImpl**)lplpDirectSoundBuffer8;    FIXME( "(%p,%s,%s,%p,%p,%p,%lx,%p,%p) stub!\n", This, debugstr_guid(pCaptureGuid),	debugstr_guid(pRendererGuid), lpDscBufferDesc, lpDsBufferDesc, hWnd, dwLevel,	ippdscb, ippdsc);    return E_FAIL;}static const IDirectSoundFullDuplexVtbl dsfdvt ={    /* IUnknown methods */    IDirectSoundFullDuplexImpl_QueryInterface,    IDirectSoundFullDuplexImpl_AddRef,    IDirectSoundFullDuplexImpl_Release,    /* IDirectSoundFullDuplex methods */    IDirectSoundFullDuplexImpl_Initialize};/******************************************************************************* * DirectSoundFullDuplex ClassFactory */static HRESULT WINAPIDSFDCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj){    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;    FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);    return E_NOINTERFACE;}static ULONG WINAPIDSFDCF_AddRef(LPCLASSFACTORY iface){    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;    TRACE("(%p) ref was %ld\n", This, This->ref);    return InterlockedIncrement(&(This->ref));}static ULONG WINAPIDSFDCF_Release(LPCLASSFACTORY iface){    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;    /* static class, won't be  freed */    TRACE("(%p) ref was %ld\n", This, This->ref);    return InterlockedDecrement(&(This->ref));}static HRESULT WINAPIDSFDCF_CreateInstance(    LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj ){    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;    TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);    if (pOuter) {        WARN("aggregation not supported\n");        return CLASS_E_NOAGGREGATION;    }    if (ppobj == NULL) {	WARN("invalid parameter\n");	return E_INVALIDARG;    }    *ppobj = NULL;    if ( IsEqualGUID( &IID_IDirectSoundFullDuplex, riid ) ) {	/* FIXME: how do we do this one ? */	FIXME("not implemented\n");	return E_NOINTERFACE;    }    WARN("(%p,%p,%s,%p) Interface not found!\n",This,pOuter,debugstr_guid(riid),ppobj);	    return E_NOINTERFACE;}static HRESULT WINAPIDSFDCF_LockServer(LPCLASSFACTORY iface,BOOL dolock){    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;    FIXME("(%p)->(%d),stub!\n",This,dolock);    return S_OK;}static const IClassFactoryVtbl DSFDCF_Vtbl ={    DSFDCF_QueryInterface,    DSFDCF_AddRef,    DSFDCF_Release,    DSFDCF_CreateInstance,    DSFDCF_LockServer};IClassFactoryImpl DSOUND_FULLDUPLEX_CF = { &DSFDCF_Vtbl, 1 };

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -