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

📄 primary.c

📁 一个类似windows
💻 C
📖 第 1 页 / 共 3 页
字号:
		} else {			*(LPBYTE*)lplpaudioptr1 = device->buffer+writecursor;			*audiobytes1 = device->buflen-writecursor;			if (lplpaudioptr2)				*(LPBYTE*)lplpaudioptr2 = device->buffer;			if (audiobytes2)				*audiobytes2 = writebytes-(device->buflen-writecursor);			TRACE("->%ld.%ld\n",*audiobytes1,audiobytes2?*audiobytes2:0);		}	}	return DS_OK;}static HRESULT WINAPI PrimaryBufferImpl_SetCurrentPosition(	LPDIRECTSOUNDBUFFER8 iface,DWORD newpos) {	PrimaryBufferImpl *This = (PrimaryBufferImpl *)iface;	TRACE("(%p,%ld)\n",This,newpos);	/* You cannot set the position of the primary buffer */	WARN("invalid call\n");	return DSERR_INVALIDCALL;}static HRESULT WINAPI PrimaryBufferImpl_SetPan(	LPDIRECTSOUNDBUFFER8 iface,LONG pan) {        DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->dsound->device;	DWORD ampfactors;	DSVOLUMEPAN volpan;        HRESULT hres = DS_OK;	TRACE("(%p,%ld)\n", iface, pan);	if (!(device->dsbd.dwFlags & DSBCAPS_CTRLPAN)) {		WARN("control unavailable\n");		return DSERR_CONTROLUNAVAIL;	}	if ((pan > DSBPAN_RIGHT) || (pan < DSBPAN_LEFT)) {		WARN("invalid parameter: pan = %ld\n", pan);		return DSERR_INVALIDPARAM;	}	/* **** */	EnterCriticalSection(&(device->mixlock));        waveOutGetVolume(device->hwo, &ampfactors);        volpan.dwTotalLeftAmpFactor=ampfactors & 0xffff;        volpan.dwTotalRightAmpFactor=ampfactors >> 16;        DSOUND_AmpFactorToVolPan(&volpan);        if (pan != volpan.lPan) {            volpan.lPan=pan;            DSOUND_RecalcVolPan(&volpan);            if (device->hwbuf) {                hres = IDsDriverBuffer_SetVolumePan(device->hwbuf, &volpan);                if (hres != DS_OK)                    WARN("IDsDriverBuffer_SetVolumePan failed\n");            } else {                ampfactors = (volpan.dwTotalLeftAmpFactor & 0xffff) | (volpan.dwTotalRightAmpFactor << 16);                waveOutSetVolume(device->hwo, ampfactors);            }        }	LeaveCriticalSection(&(device->mixlock));	/* **** */	return hres;}static HRESULT WINAPI PrimaryBufferImpl_GetPan(	LPDIRECTSOUNDBUFFER8 iface,LPLONG pan) {        DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->dsound->device;	DWORD ampfactors;	DSVOLUMEPAN volpan;	TRACE("(%p,%p)\n", iface, pan);	if (!(device->dsbd.dwFlags & DSBCAPS_CTRLPAN)) {		WARN("control unavailable\n");		return DSERR_CONTROLUNAVAIL;	}	if (pan == NULL) {		WARN("invalid parameter: pan == NULL\n");		return DSERR_INVALIDPARAM;	}	waveOutGetVolume(device->hwo, &ampfactors);	volpan.dwTotalLeftAmpFactor=ampfactors & 0xffff;	volpan.dwTotalRightAmpFactor=ampfactors >> 16;	DSOUND_AmpFactorToVolPan(&volpan);	*pan = volpan.lPan;	return DS_OK;}static HRESULT WINAPI PrimaryBufferImpl_Unlock(	LPDIRECTSOUNDBUFFER8 iface,LPVOID p1,DWORD x1,LPVOID p2,DWORD x2) {        DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->dsound->device;	TRACE("(%p,%p,%ld,%p,%ld)\n", iface, p1, x1, p2, x2);	if (device->priolevel != DSSCL_WRITEPRIMARY) {		WARN("failed priority check!\n");		return DSERR_PRIOLEVELNEEDED;	}	if (!(device->drvdesc.dwFlags & DSDDESC_DONTNEEDPRIMARYLOCK) && device->hwbuf) {		HRESULT	hres;				hres = IDsDriverBuffer_Unlock(device->hwbuf, p1, x1, p2, x2);		if (hres != DS_OK) {			WARN("IDsDriverBuffer_Unlock failed\n");			return hres;		}	}	return DS_OK;}static HRESULT WINAPI PrimaryBufferImpl_Restore(	LPDIRECTSOUNDBUFFER8 iface) {	PrimaryBufferImpl *This = (PrimaryBufferImpl *)iface;	FIXME("(%p):stub\n",This);	return DS_OK;}static HRESULT WINAPI PrimaryBufferImpl_GetFrequency(	LPDIRECTSOUNDBUFFER8 iface,LPDWORD freq) {        DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->dsound->device;	TRACE("(%p,%p)\n", iface, freq);	if (freq == NULL) {		WARN("invalid parameter: freq == NULL\n");		return DSERR_INVALIDPARAM;	}	if (!(device->dsbd.dwFlags & DSBCAPS_CTRLFREQUENCY)) {		WARN("control unavailable\n");		return DSERR_CONTROLUNAVAIL;	}	*freq = device->pwfx->nSamplesPerSec;	TRACE("-> %ld\n", *freq);	return DS_OK;}static HRESULT WINAPI PrimaryBufferImpl_SetFX(	LPDIRECTSOUNDBUFFER8 iface,DWORD dwEffectsCount,LPDSEFFECTDESC pDSFXDesc,LPDWORD pdwResultCodes) {	PrimaryBufferImpl *This = (PrimaryBufferImpl *)iface;	DWORD u;	FIXME("(%p,%lu,%p,%p): stub\n",This,dwEffectsCount,pDSFXDesc,pdwResultCodes);	if (pdwResultCodes)		for (u=0; u<dwEffectsCount; u++) pdwResultCodes[u] = DSFXR_UNKNOWN;	WARN("control unavailable\n");	return DSERR_CONTROLUNAVAIL;}static HRESULT WINAPI PrimaryBufferImpl_AcquireResources(	LPDIRECTSOUNDBUFFER8 iface,DWORD dwFlags,DWORD dwEffectsCount,LPDWORD pdwResultCodes) {	PrimaryBufferImpl *This = (PrimaryBufferImpl *)iface;	DWORD u;	FIXME("(%p,%08lu,%lu,%p): stub\n",This,dwFlags,dwEffectsCount,pdwResultCodes);	if (pdwResultCodes)		for (u=0; u<dwEffectsCount; u++) pdwResultCodes[u] = DSFXR_UNKNOWN;	WARN("control unavailable\n");	return DSERR_CONTROLUNAVAIL;}static HRESULT WINAPI PrimaryBufferImpl_GetObjectInPath(	LPDIRECTSOUNDBUFFER8 iface,REFGUID rguidObject,DWORD dwIndex,REFGUID rguidInterface,LPVOID* ppObject) {	PrimaryBufferImpl *This = (PrimaryBufferImpl *)iface;	FIXME("(%p,%s,%lu,%s,%p): stub\n",This,debugstr_guid(rguidObject),dwIndex,debugstr_guid(rguidInterface),ppObject);	WARN("control unavailable\n");	return DSERR_CONTROLUNAVAIL;}static HRESULT WINAPI PrimaryBufferImpl_Initialize(	LPDIRECTSOUNDBUFFER8 iface,LPDIRECTSOUND dsound,LPCDSBUFFERDESC dbsd) {	PrimaryBufferImpl *This = (PrimaryBufferImpl *)iface;	FIXME("(%p,%p,%p):stub\n",This,dsound,dbsd);	DPRINTF("Re-Init!!!\n");	WARN("already initialized\n");	return DSERR_ALREADYINITIALIZED;}static HRESULT WINAPI PrimaryBufferImpl_GetCaps(	LPDIRECTSOUNDBUFFER8 iface,LPDSBCAPS caps) {        DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->dsound->device;  	TRACE("(%p,%p)\n", iface, caps);	if (caps == NULL) {		WARN("invalid parameter: caps == NULL\n");		return DSERR_INVALIDPARAM;	}	if (caps->dwSize < sizeof(*caps)) {		WARN("invalid parameter: caps->dwSize = %ld: < %d\n", caps->dwSize, sizeof(*caps));		return DSERR_INVALIDPARAM;	}	caps->dwFlags = device->dsbd.dwFlags;	if (device->hwbuf) caps->dwFlags |= DSBCAPS_LOCHARDWARE;	else caps->dwFlags |= DSBCAPS_LOCSOFTWARE;	caps->dwBufferBytes = device->buflen;	/* This value represents the speed of the "unlock" command.	   As unlock is quite fast (it does not do anything), I put	   4096 ko/s = 4 Mo / s */	/* FIXME: hwbuf speed */	caps->dwUnlockTransferRate = 4096;	caps->dwPlayCpuOverhead = 0;	return DS_OK;}static HRESULT WINAPI PrimaryBufferImpl_QueryInterface(	LPDIRECTSOUNDBUFFER8 iface,REFIID riid,LPVOID *ppobj) {        PrimaryBufferImpl *This = (PrimaryBufferImpl *)iface;        DirectSoundDevice *device = This->dsound->device;	TRACE("(%p,%s,%p)\n", iface, debugstr_guid(riid), ppobj);	if (ppobj == NULL) {		WARN("invalid parameter\n");		return E_INVALIDARG;	}	*ppobj = NULL;	/* assume failure */	if ( IsEqualGUID(riid, &IID_IUnknown) ||	     IsEqualGUID(riid, &IID_IDirectSoundBuffer) ) {		IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER)This);		*ppobj = This;		return S_OK;	}	/* DirectSoundBuffer and DirectSoundBuffer8 are different and */	/* a primary buffer can't have a DirectSoundBuffer8 interface */	if ( IsEqualGUID( &IID_IDirectSoundBuffer8, riid ) ) {		WARN("app requested DirectSoundBuffer8 on primary buffer\n");		return E_NOINTERFACE;	}	if ( IsEqualGUID( &IID_IDirectSoundNotify, riid ) ) {		ERR("app requested IDirectSoundNotify on primary buffer\n");		/* FIXME: should we support this? */		return E_NOINTERFACE;	}	if ( IsEqualGUID( &IID_IDirectSound3DBuffer, riid ) ) {		ERR("app requested IDirectSound3DBuffer on primary buffer\n");		return E_NOINTERFACE;	}        if ( IsEqualGUID( &IID_IDirectSound3DListener, riid ) ) {		if (!device->listener)			IDirectSound3DListenerImpl_Create(This, &device->listener);		if (device->listener) {			*ppobj = device->listener;			IDirectSound3DListener_AddRef((LPDIRECTSOUND3DLISTENER)*ppobj);			return S_OK;		}		WARN("IID_IDirectSound3DListener failed\n");		return E_NOINTERFACE;	}	if ( IsEqualGUID( &IID_IKsPropertySet, riid ) ) {		FIXME("app requested IKsPropertySet on primary buffer\n");		return E_NOINTERFACE;	}	FIXME( "Unknown IID %s\n", debugstr_guid( riid ) );	return E_NOINTERFACE;}static const IDirectSoundBuffer8Vtbl dspbvt ={	PrimaryBufferImpl_QueryInterface,	PrimaryBufferImpl_AddRef,	PrimaryBufferImpl_Release,	PrimaryBufferImpl_GetCaps,	PrimaryBufferImpl_GetCurrentPosition,	PrimaryBufferImpl_GetFormat,	PrimaryBufferImpl_GetVolume,	PrimaryBufferImpl_GetPan,        PrimaryBufferImpl_GetFrequency,	PrimaryBufferImpl_GetStatus,	PrimaryBufferImpl_Initialize,	PrimaryBufferImpl_Lock,	PrimaryBufferImpl_Play,	PrimaryBufferImpl_SetCurrentPosition,	PrimaryBufferImpl_SetFormat,	PrimaryBufferImpl_SetVolume,	PrimaryBufferImpl_SetPan,	PrimaryBufferImpl_SetFrequency,	PrimaryBufferImpl_Stop,	PrimaryBufferImpl_Unlock,	PrimaryBufferImpl_Restore,	PrimaryBufferImpl_SetFX,	PrimaryBufferImpl_AcquireResources,	PrimaryBufferImpl_GetObjectInPath};HRESULT WINAPI PrimaryBufferImpl_Create(	IDirectSoundImpl *ds,	PrimaryBufferImpl **pdsb,	LPCDSBUFFERDESC dsbd){	PrimaryBufferImpl *dsb;	TRACE("%p,%p,%p)\n",ds,pdsb,dsbd);	if (dsbd->lpwfxFormat) {		WARN("invalid parameter: dsbd->lpwfxFormat != NULL\n");		*pdsb = NULL;		return DSERR_INVALIDPARAM;	}	dsb = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*dsb));	if (dsb == NULL) {		WARN("out of memory\n");		*pdsb = NULL;		return DSERR_OUTOFMEMORY;	}	dsb->ref = 0;	dsb->dsound = ds;	dsb->lpVtbl = &dspbvt;	CopyMemory(&ds->device->dsbd, dsbd, sizeof(*dsbd));	TRACE("Created primary buffer at %p\n", dsb);	TRACE("(formattag=0x%04x,chans=%d,samplerate=%ld,"		"bytespersec=%ld,blockalign=%d,bitspersamp=%d,cbSize=%d)\n",		ds->device->pwfx->wFormatTag, ds->device->pwfx->nChannels, ds->device->pwfx->nSamplesPerSec,		ds->device->pwfx->nAvgBytesPerSec, ds->device->pwfx->nBlockAlign,		ds->device->pwfx->wBitsPerSample, ds->device->pwfx->cbSize);	*pdsb = dsb;	return S_OK;}

⌨️ 快捷键说明

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