📄 primary.c
字号:
} 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, &factors); 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, &factors); 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 + -