Fixed sound disappearing after on-the-fly sample rate changes and
after certain underrun conditions. Compilation fixes for when USE_DSOUND3D is defined.
This commit is contained in:
parent
e17aaa22d4
commit
ed739334f4
|
@ -2,7 +2,7 @@
|
||||||
*
|
*
|
||||||
* Copyright 1998 Marcus Meissner
|
* Copyright 1998 Marcus Meissner
|
||||||
* Copyright 1998 Rob Riggs
|
* Copyright 1998 Rob Riggs
|
||||||
* Copyright 2000 Ove Kåven, TransGaming Technologies, Inc.
|
* Copyright 2000-2001 TransGaming Technologies, Inc.
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Most thread locking is complete. There may be a few race
|
* Most thread locking is complete. There may be a few race
|
||||||
|
@ -971,6 +971,8 @@ static HRESULT DSOUND_PrimaryOpen(IDirectSoundBufferImpl *dsb)
|
||||||
HRESULT merr = DS_OK;
|
HRESULT merr = DS_OK;
|
||||||
/* Start in pause mode, to allow buffers to get filled */
|
/* Start in pause mode, to allow buffers to get filled */
|
||||||
waveOutPause(dsb->dsound->hwo);
|
waveOutPause(dsb->dsound->hwo);
|
||||||
|
if (dsb->state == STATE_PLAYING) dsb->state = STATE_STARTING;
|
||||||
|
else if (dsb->state == STATE_STOPPING) dsb->state = STATE_STOPPED;
|
||||||
/* use fragments of 10ms (1/100s) each (which should get us within
|
/* use fragments of 10ms (1/100s) each (which should get us within
|
||||||
* the documented write cursor lead of 10-15ms) */
|
* the documented write cursor lead of 10-15ms) */
|
||||||
buflen = ((dsb->wfx.nAvgBytesPerSec / 100) & ~3) * DS_HEL_FRAGS;
|
buflen = ((dsb->wfx.nAvgBytesPerSec / 100) & ~3) * DS_HEL_FRAGS;
|
||||||
|
@ -1126,6 +1128,8 @@ static HRESULT WINAPI IDirectSoundBufferImpl_SetFormat(
|
||||||
err = IDsDriver_CreateSoundBuffer(primarybuf->dsound->driver,&(primarybuf->wfx),primarybuf->dsbd.dwFlags,0,
|
err = IDsDriver_CreateSoundBuffer(primarybuf->dsound->driver,&(primarybuf->wfx),primarybuf->dsbd.dwFlags,0,
|
||||||
&(primarybuf->buflen),&(primarybuf->buffer),
|
&(primarybuf->buflen),&(primarybuf->buffer),
|
||||||
(LPVOID)&(primarybuf->hwbuf));
|
(LPVOID)&(primarybuf->hwbuf));
|
||||||
|
if (primarybuf->state == STATE_PLAYING) primarybuf->state = STATE_STARTING;
|
||||||
|
else if (primarybuf->state == STATE_STOPPING) primarybuf->state = STATE_STOPPED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DSOUND_RecalcFormat(primarybuf);
|
DSOUND_RecalcFormat(primarybuf);
|
||||||
|
@ -1768,30 +1772,29 @@ static HRESULT WINAPI IDirectSoundBufferImpl_QueryInterface(
|
||||||
ds3db = (IDirectSound3DBufferImpl*)HeapAlloc(GetProcessHeap(),
|
ds3db = (IDirectSound3DBufferImpl*)HeapAlloc(GetProcessHeap(),
|
||||||
0,sizeof(*ds3db));
|
0,sizeof(*ds3db));
|
||||||
ds3db->ref = 1;
|
ds3db->ref = 1;
|
||||||
ds3db->dsb = (*ippdsb);
|
ds3db->dsb = This;
|
||||||
ICOM_VTBL(ds3db) = &ds3dbvt;
|
ICOM_VTBL(ds3db) = &ds3dbvt;
|
||||||
InitializeCriticalSection(&ds3db->lock);
|
InitializeCriticalSection(&ds3db->lock);
|
||||||
|
|
||||||
ds3db->ds3db = This;
|
|
||||||
IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER)This);
|
IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER)This);
|
||||||
|
|
||||||
ds3db->ds3db.dwSize = sizeof(DS3DBUFFER);
|
ds3db->ds3db.dwSize = sizeof(DS3DBUFFER);
|
||||||
ds3db->ds3db.vPosition.x.x = 0.0;
|
ds3db->ds3db.vPosition.u1.x = 0.0;
|
||||||
ds3db->ds3db.vPosition.y.y = 0.0;
|
ds3db->ds3db.vPosition.u2.y = 0.0;
|
||||||
ds3db->ds3db.vPosition.z.z = 0.0;
|
ds3db->ds3db.vPosition.u3.z = 0.0;
|
||||||
ds3db->ds3db.vVelocity.x.x = 0.0;
|
ds3db->ds3db.vVelocity.u1.x = 0.0;
|
||||||
ds3db->ds3db.vVelocity.y.y = 0.0;
|
ds3db->ds3db.vVelocity.u2.y = 0.0;
|
||||||
ds3db->ds3db.vVelocity.z.z = 0.0;
|
ds3db->ds3db.vVelocity.u3.z = 0.0;
|
||||||
ds3db->ds3db.dwInsideConeAngle = DS3D_DEFAULTCONEANGLE;
|
ds3db->ds3db.dwInsideConeAngle = DS3D_DEFAULTCONEANGLE;
|
||||||
ds3db->ds3db.dwOutsideConeAngle = DS3D_DEFAULTCONEANGLE;
|
ds3db->ds3db.dwOutsideConeAngle = DS3D_DEFAULTCONEANGLE;
|
||||||
ds3db->ds3db.vConeOrientation.x.x = 0.0;
|
ds3db->ds3db.vConeOrientation.u1.x = 0.0;
|
||||||
ds3db->ds3db.vConeOrientation.y.y = 0.0;
|
ds3db->ds3db.vConeOrientation.u2.y = 0.0;
|
||||||
ds3db->ds3db.vConeOrientation.z.z = 0.0;
|
ds3db->ds3db.vConeOrientation.u3.z = 0.0;
|
||||||
ds3db->ds3db.lConeOutsideVolume = DS3D_DEFAULTCONEOUTSIDEVOLUME; ds3db->ds3db.flMinDistance = DS3D_DEFAULTMINDISTANCE;
|
ds3db->ds3db.lConeOutsideVolume = DS3D_DEFAULTCONEOUTSIDEVOLUME; ds3db->ds3db.flMinDistance = DS3D_DEFAULTMINDISTANCE;
|
||||||
ds3db->ds3db.flMaxDistance = DS3D_DEFAULTMAXDISTANCE;
|
ds3db->ds3db.flMaxDistance = DS3D_DEFAULTMAXDISTANCE;
|
||||||
ds3db->ds3db.dwMode = DS3DMODE_NORMAL;
|
ds3db->ds3db.dwMode = DS3DMODE_NORMAL;
|
||||||
ds3db->buflen = ((*ippdsb)->buflen * primarybuf->wfx.nBlockAlign) /
|
ds3db->buflen = (This->buflen * primarybuf->wfx.nBlockAlign) /
|
||||||
(*ippdsb)->wfx.nBlockAlign;
|
This->wfx.nBlockAlign;
|
||||||
ds3db->buffer = HeapAlloc(GetProcessHeap(), 0, ds3db->buflen);
|
ds3db->buffer = HeapAlloc(GetProcessHeap(), 0, ds3db->buflen);
|
||||||
if (ds3db->buffer == NULL) {
|
if (ds3db->buffer == NULL) {
|
||||||
ds3db->buflen = 0;
|
ds3db->buflen = 0;
|
||||||
|
@ -2068,17 +2071,17 @@ static HRESULT WINAPI IDirectSoundImpl_CreateSoundBuffer(
|
||||||
InitializeCriticalSection(&ds3db->lock);
|
InitializeCriticalSection(&ds3db->lock);
|
||||||
|
|
||||||
ds3db->ds3db.dwSize = sizeof(DS3DBUFFER);
|
ds3db->ds3db.dwSize = sizeof(DS3DBUFFER);
|
||||||
ds3db->ds3db.vPosition.x.x = 0.0;
|
ds3db->ds3db.vPosition.u1.x = 0.0;
|
||||||
ds3db->ds3db.vPosition.y.y = 0.0;
|
ds3db->ds3db.vPosition.u2.y = 0.0;
|
||||||
ds3db->ds3db.vPosition.z.z = 0.0;
|
ds3db->ds3db.vPosition.u3.z = 0.0;
|
||||||
ds3db->ds3db.vVelocity.x.x = 0.0;
|
ds3db->ds3db.vVelocity.u1.x = 0.0;
|
||||||
ds3db->ds3db.vVelocity.y.y = 0.0;
|
ds3db->ds3db.vVelocity.u2.y = 0.0;
|
||||||
ds3db->ds3db.vVelocity.z.z = 0.0;
|
ds3db->ds3db.vVelocity.u3.z = 0.0;
|
||||||
ds3db->ds3db.dwInsideConeAngle = DS3D_DEFAULTCONEANGLE;
|
ds3db->ds3db.dwInsideConeAngle = DS3D_DEFAULTCONEANGLE;
|
||||||
ds3db->ds3db.dwOutsideConeAngle = DS3D_DEFAULTCONEANGLE;
|
ds3db->ds3db.dwOutsideConeAngle = DS3D_DEFAULTCONEANGLE;
|
||||||
ds3db->ds3db.vConeOrientation.x.x = 0.0;
|
ds3db->ds3db.vConeOrientation.u1.x = 0.0;
|
||||||
ds3db->ds3db.vConeOrientation.y.y = 0.0;
|
ds3db->ds3db.vConeOrientation.u2.y = 0.0;
|
||||||
ds3db->ds3db.vConeOrientation.z.z = 0.0;
|
ds3db->ds3db.vConeOrientation.u3.z = 0.0;
|
||||||
ds3db->ds3db.lConeOutsideVolume = DS3D_DEFAULTCONEOUTSIDEVOLUME;
|
ds3db->ds3db.lConeOutsideVolume = DS3D_DEFAULTCONEOUTSIDEVOLUME;
|
||||||
ds3db->ds3db.flMinDistance = DS3D_DEFAULTMINDISTANCE;
|
ds3db->ds3db.flMinDistance = DS3D_DEFAULTMINDISTANCE;
|
||||||
ds3db->ds3db.flMaxDistance = DS3D_DEFAULTMAXDISTANCE;
|
ds3db->ds3db.flMaxDistance = DS3D_DEFAULTMAXDISTANCE;
|
||||||
|
@ -2870,7 +2873,7 @@ static DWORD DSOUND_MixOne(IDirectSoundBufferImpl *dsb, DWORD playpos, DWORD wri
|
||||||
return slen;
|
return slen;
|
||||||
}
|
}
|
||||||
|
|
||||||
static DWORD DSOUND_MixToPrimary(DWORD playpos, DWORD writepos, DWORD mixlen)
|
static DWORD DSOUND_MixToPrimary(DWORD playpos, DWORD writepos, DWORD mixlen, BOOL recover)
|
||||||
{
|
{
|
||||||
INT i, len, maxlen = 0;
|
INT i, len, maxlen = 0;
|
||||||
IDirectSoundBufferImpl *dsb;
|
IDirectSoundBufferImpl *dsb;
|
||||||
|
@ -2888,7 +2891,7 @@ static DWORD DSOUND_MixToPrimary(DWORD playpos, DWORD writepos, DWORD mixlen)
|
||||||
DSOUND_MixCancel(dsb, writepos);
|
DSOUND_MixCancel(dsb, writepos);
|
||||||
dsb->state = STATE_STOPPED;
|
dsb->state = STATE_STOPPED;
|
||||||
} else {
|
} else {
|
||||||
if (dsb->state == STATE_STARTING)
|
if ((dsb->state == STATE_STARTING) || recover)
|
||||||
dsb->primary_mixpos = writepos;
|
dsb->primary_mixpos = writepos;
|
||||||
len = DSOUND_MixOne(dsb, playpos, writepos, mixlen);
|
len = DSOUND_MixOne(dsb, playpos, writepos, mixlen);
|
||||||
if (dsb->state == STATE_STARTING)
|
if (dsb->state == STATE_STARTING)
|
||||||
|
@ -3015,7 +3018,7 @@ static void CALLBACK DSOUND_timer(UINT timerID, UINT msg, DWORD dwUser, DWORD dw
|
||||||
}
|
}
|
||||||
|
|
||||||
/* do the mixing */
|
/* do the mixing */
|
||||||
frag = DSOUND_MixToPrimary(playpos, writepos, maxq);
|
frag = DSOUND_MixToPrimary(playpos, writepos, maxq, paused);
|
||||||
if (forced) frag = maxq - inq;
|
if (forced) frag = maxq - inq;
|
||||||
primarybuf->buf_mixpos += frag;
|
primarybuf->buf_mixpos += frag;
|
||||||
while (primarybuf->buf_mixpos >= primarybuf->buflen)
|
while (primarybuf->buf_mixpos >= primarybuf->buflen)
|
||||||
|
@ -3092,7 +3095,7 @@ static void CALLBACK DSOUND_timer(UINT timerID, UINT msg, DWORD dwUser, DWORD dw
|
||||||
/* do the mixing */
|
/* do the mixing */
|
||||||
if (dsound->priolevel != DSSCL_WRITEPRIMARY) {
|
if (dsound->priolevel != DSSCL_WRITEPRIMARY) {
|
||||||
DWORD frag, maxq = DS_SND_QUEUE * dsound->fraglen;
|
DWORD frag, maxq = DS_SND_QUEUE * dsound->fraglen;
|
||||||
frag = DSOUND_MixToPrimary(primarybuf->playpos, writepos, maxq);
|
frag = DSOUND_MixToPrimary(primarybuf->playpos, writepos, maxq, FALSE);
|
||||||
mixq = frag / dsound->fraglen;
|
mixq = frag / dsound->fraglen;
|
||||||
if (frag - (mixq * dsound->fraglen))
|
if (frag - (mixq * dsound->fraglen))
|
||||||
mixq++;
|
mixq++;
|
||||||
|
|
Loading…
Reference in New Issue