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

📄 dsound_main.c

📁 一个类似windows
💻 C
📖 第 1 页 / 共 2 页
字号:
/*************************************************************************** * DirectSoundEnumerateW [DSOUND.3] * * Enumerate all DirectSound drivers installed in the system * * PARAMS *    lpDSEnumCallback  [I] Address of callback function. *    lpContext         [I] Address of user defined context passed to callback function. * * RETURNS *    Success: DS_OK *    Failure: DSERR_INVALIDPARAM */HRESULT WINAPI DirectSoundEnumerateW(	LPDSENUMCALLBACKW lpDSEnumCallback,	LPVOID lpContext ){    unsigned devs, wod;    DSDRIVERDESC desc;    GUID guid;    int err;    WCHAR wDesc[MAXPNAMELEN];    WCHAR wName[MAXPNAMELEN];    TRACE("lpDSEnumCallback = %p, lpContext = %p\n",	lpDSEnumCallback, lpContext);    if (lpDSEnumCallback == NULL) {	WARN("invalid parameter: lpDSEnumCallback == NULL\n");	return DSERR_INVALIDPARAM;    }    devs = waveOutGetNumDevs();    if (devs > 0) {	if (GetDeviceID(&DSDEVID_DefaultPlayback, &guid) == DS_OK) {	    for (wod = 0; wod < devs; ++wod) {                if (IsEqualGUID( &guid, &DSOUND_renderer_guids[wod] ) ) {                    err = mmErr(WineWaveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));                    if (err == DS_OK) {                        TRACE("calling lpDSEnumCallback(NULL,\"%s\",\"%s\",%p)\n",                              "Primary Sound Driver",desc.szDrvname,lpContext);                        MultiByteToWideChar( CP_ACP, 0, "Primary Sound Driver", -1,                                             wDesc, sizeof(wDesc)/sizeof(WCHAR) );                        MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1,                                             wName, sizeof(wName)/sizeof(WCHAR) );                        if (lpDSEnumCallback(NULL, wDesc, wName, lpContext) == FALSE)                            return DS_OK;		    }		}	    }	}    }    for (wod = 0; wod < devs; ++wod) {	err = mmErr(WineWaveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));	if (err == DS_OK) {            TRACE("calling lpDSEnumCallback(%s,\"%s\",\"%s\",%p)\n",                  debugstr_guid(&DSOUND_renderer_guids[wod]),desc.szDesc,desc.szDrvname,lpContext);            MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1,                                 wDesc, sizeof(wDesc)/sizeof(WCHAR) );            MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1,                                 wName, sizeof(wName)/sizeof(WCHAR) );            if (lpDSEnumCallback(&DSOUND_renderer_guids[wod], wDesc, wName, lpContext) == FALSE)                return DS_OK;	}    }    return DS_OK;}/******************************************************************************* * DirectSound ClassFactory */static HRESULT WINAPIDSCF_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 WINAPI DSCF_AddRef(LPCLASSFACTORY iface){    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;    ULONG ref = InterlockedIncrement(&(This->ref));    TRACE("(%p) ref was %ld\n", This, ref - 1);    return ref;}static ULONG WINAPI DSCF_Release(LPCLASSFACTORY iface){    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;    ULONG ref = InterlockedDecrement(&(This->ref));    TRACE("(%p) ref was %ld\n", This, ref + 1);    /* static class, won't be freed */    return ref;}static HRESULT WINAPI DSCF_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)		return CLASS_E_NOAGGREGATION;	if (ppobj == NULL) {		WARN("invalid parameter\n");		return DSERR_INVALIDPARAM;	}	*ppobj = NULL;	if ( IsEqualIID( &IID_IDirectSound, riid ) )		return DSOUND_Create((LPDIRECTSOUND*)ppobj,pOuter);	if ( IsEqualIID( &IID_IDirectSound8, riid ) )		return DSOUND_Create8((LPDIRECTSOUND8*)ppobj,pOuter);	WARN("(%p,%p,%s,%p) Interface not found!\n",This,pOuter,debugstr_guid(riid),ppobj);		return E_NOINTERFACE;}static HRESULT WINAPI DSCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;	FIXME("(%p)->(%d),stub!\n",This,dolock);	return S_OK;}static const IClassFactoryVtbl DSCF_Vtbl = {	DSCF_QueryInterface,	DSCF_AddRef,	DSCF_Release,	DSCF_CreateInstance,	DSCF_LockServer};static IClassFactoryImpl DSOUND_CF = { &DSCF_Vtbl, 1 };/******************************************************************************* * DirectSoundPrivate ClassFactory */static HRESULT WINAPIDSPCF_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 WINAPI DSPCF_AddRef(LPCLASSFACTORY iface){    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;    ULONG ref = InterlockedIncrement(&(This->ref));    TRACE("(%p) ref was %ld\n", This, ref - 1);    return ref;}static ULONG WINAPI DSPCF_Release(LPCLASSFACTORY iface){    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;    ULONG ref = InterlockedDecrement(&(This->ref));    TRACE("(%p) ref was %ld\n", This, ref + 1);    /* static class, won't be freed */    return ref;}static HRESULT WINAPIDSPCF_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 (ppobj == NULL) {		WARN("invalid parameter\n");		return DSERR_INVALIDPARAM;	}	*ppobj = NULL;	if ( IsEqualGUID( &IID_IKsPropertySet, riid ) ) {		return IKsPrivatePropertySetImpl_Create((IKsPrivatePropertySetImpl**)ppobj);	}	WARN("(%p,%p,%s,%p) Interface not found!\n",This,pOuter,debugstr_guid(riid),ppobj);		return E_NOINTERFACE;}static HRESULT WINAPIDSPCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {	IClassFactoryImpl *This = (IClassFactoryImpl *)iface;	FIXME("(%p)->(%d),stub!\n",This,dolock);	return S_OK;}static const IClassFactoryVtbl DSPCF_Vtbl = {	DSPCF_QueryInterface,	DSPCF_AddRef,	DSPCF_Release,	DSPCF_CreateInstance,	DSPCF_LockServer};static IClassFactoryImpl DSOUND_PRIVATE_CF = { &DSPCF_Vtbl, 1 };/******************************************************************************* * DllGetClassObject [DSOUND.@] * Retrieves class object from a DLL object * * NOTES *    Docs say returns STDAPI * * PARAMS *    rclsid [I] CLSID for the class object *    riid   [I] Reference to identifier of interface for class object *    ppv    [O] Address of variable to receive interface pointer for riid * * RETURNS *    Success: S_OK *    Failure: CLASS_E_CLASSNOTAVAILABLE, E_OUTOFMEMORY, E_INVALIDARG, *             E_UNEXPECTED */HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv){    TRACE("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);    if (ppv == NULL) {	WARN("invalid parameter\n");	return E_INVALIDARG;    }    *ppv = NULL;    if ( IsEqualCLSID( &CLSID_DirectSound, rclsid ) ||	 IsEqualCLSID( &CLSID_DirectSound8, rclsid ) ) {	if ( IsEqualCLSID( &IID_IClassFactory, riid ) ) {	    *ppv = (LPVOID)&DSOUND_CF;	    IClassFactory_AddRef((IClassFactory*)*ppv);	    return S_OK;	}    	WARN("(%s,%s,%p): no interface found.\n",	    debugstr_guid(rclsid), debugstr_guid(riid), ppv);	return S_FALSE;    }    if ( IsEqualCLSID( &CLSID_DirectSoundCapture, rclsid ) ||	 IsEqualCLSID( &CLSID_DirectSoundCapture8, rclsid ) ) {	if ( IsEqualCLSID( &IID_IClassFactory, riid ) ) {	    *ppv = (LPVOID)&DSOUND_CAPTURE_CF;	    IClassFactory_AddRef((IClassFactory*)*ppv);	    return S_OK;	}    	WARN("(%s,%s,%p): no interface found.\n",	    debugstr_guid(rclsid), debugstr_guid(riid), ppv);	return S_FALSE;    }    if ( IsEqualCLSID( &CLSID_DirectSoundFullDuplex, rclsid ) ) {	if ( IsEqualCLSID( &IID_IClassFactory, riid ) ) {	    *ppv = (LPVOID)&DSOUND_FULLDUPLEX_CF;	    IClassFactory_AddRef((IClassFactory*)*ppv);	    return S_OK;	}    	WARN("(%s,%s,%p): no interface found.\n",	    debugstr_guid(rclsid), debugstr_guid(riid), ppv);	return S_FALSE;    }    if ( IsEqualCLSID( &CLSID_DirectSoundPrivate, rclsid ) ) {	if ( IsEqualCLSID( &IID_IClassFactory, riid ) ) {	    *ppv = (LPVOID)&DSOUND_PRIVATE_CF;	    IClassFactory_AddRef((IClassFactory*)*ppv);	    return S_OK;	}    	WARN("(%s,%s,%p): no interface found.\n",	    debugstr_guid(rclsid), debugstr_guid(riid), ppv);	return S_FALSE;    }    WARN("(%s,%s,%p): no class found.\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);    return CLASS_E_CLASSNOTAVAILABLE;}/******************************************************************************* * DllCanUnloadNow [DSOUND.4] * Determines whether the DLL is in use. * * RETURNS *    Success: S_OK *    Failure: S_FALSE */HRESULT WINAPI DllCanUnloadNow(void){    FIXME("(void): stub\n");    return S_FALSE;}#define INIT_GUID(guid, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)      \        guid.Data1 = l; guid.Data2 = w1; guid.Data3 = w2;               \        guid.Data4[0] = b1; guid.Data4[1] = b2; guid.Data4[2] = b3;     \        guid.Data4[3] = b4; guid.Data4[4] = b5; guid.Data4[5] = b6;     \        guid.Data4[6] = b7; guid.Data4[7] = b8;/*********************************************************************** *           DllMain (DSOUND.init) */BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved){    int i;    TRACE("(%p %ld %p)\n", hInstDLL, fdwReason, lpvReserved);    switch (fdwReason) {    case DLL_PROCESS_ATTACH:        TRACE("DLL_PROCESS_ATTACH\n");        for (i = 0; i < MAXWAVEDRIVERS; i++) {            DSOUND_renderer[i] = NULL;            DSOUND_capture[i] = NULL;            INIT_GUID(DSOUND_renderer_guids[i], 0xbd6dd71a, 0x3deb, 0x11d1, 0xb1, 0x71, 0x00, 0xc0, 0x4f, 0xc2, 0x00, 0x00 + i);            INIT_GUID(DSOUND_capture_guids[i],  0xbd6dd71b, 0x3deb, 0x11d1, 0xb1, 0x71, 0x00, 0xc0, 0x4f, 0xc2, 0x00, 0x00 + i);        }        break;    case DLL_PROCESS_DETACH:        TRACE("DLL_PROCESS_DETACH\n");        break;    case DLL_THREAD_ATTACH:        TRACE("DLL_THREAD_ATTACH\n");        break;    case DLL_THREAD_DETACH:        TRACE("DLL_THREAD_DETACH\n");        break;    default:        TRACE("UNKNOWN REASON\n");        break;    }    return TRUE;}

⌨️ 快捷键说明

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