Add use of DirectSound primary buffer in win port

This commit is contained in:
statmat
2004-04-27 23:00:08 +00:00
parent d1e2143fba
commit 536b78cd90
2 changed files with 112 additions and 52 deletions

View File

@@ -41,6 +41,7 @@ DWORD SoundBufferSize=1024*18;
DWORD FirstSound=1; DWORD FirstSound=1;
int SoundEnabled=1; int SoundEnabled=1;
int UsePrimaryBuffer=0;
DWORD FirstActivate = 1; DWORD FirstActivate = 1;
@@ -668,6 +669,7 @@ DWORD PrevSoundQuality;
InitSound() InitSound()
{ {
WAVEFORMATEX wfx; WAVEFORMATEX wfx;
DSBCAPS dsbcaps;
if (cfgsoundon == 0) return FALSE; if (cfgsoundon == 0) return FALSE;
@@ -679,11 +681,13 @@ InitSound()
if (DS_OK == pDirectSoundCreate8(NULL, &lpDirectSound,NULL)) if (DS_OK == pDirectSoundCreate8(NULL, &lpDirectSound,NULL))
{ {
lpDirectSound->Initialize(NULL); lpDirectSound->Initialize(NULL);
if (DS_OK != lpDirectSound->SetCooperativeLevel(hMainWindow, DSSCL_NORMAL))
if (DS_OK != lpDirectSound->SetCooperativeLevel(hMainWindow, DSSCL_WRITEPRIMARY))
{ {
if (DS_OK != lpDirectSound->SetCooperativeLevel(hMainWindow, DSSCL_EXCLUSIVE)) if (DS_OK != lpDirectSound->SetCooperativeLevel(hMainWindow, DSSCL_EXCLUSIVE))
return FALSE; return FALSE;
} }
else UsePrimaryBuffer=1;
} }
else else
{ {
@@ -745,11 +749,14 @@ InitSound()
memset(&dsbd, 0, sizeof(DSBUFFERDESC)); memset(&dsbd, 0, sizeof(DSBUFFERDESC));
dsbd.dwSize = sizeof(DSBUFFERDESC); dsbd.dwSize = sizeof(DSBUFFERDESC);
dsbd.dwFlags = DSBCAPS_STICKYFOCUS; // | DSBCAPS_PRIMARYBUFFER; dsbd.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_STICKYFOCUS;
dsbd.dwBufferBytes = SoundBufferSize; if(UsePrimaryBuffer) dsbd.dwFlags |= DSBCAPS_PRIMARYBUFFER;
dsbd.lpwfxFormat = &wfx; dsbd.dwBufferBytes = UsePrimaryBuffer ? 0 : SoundBufferSize;
dsbd.lpwfxFormat = UsePrimaryBuffer ? NULL : &wfx;
if (DS_OK == lpDirectSound->CreateSoundBuffer(&dsbd, &lpPrimaryBuffer, NULL)) if (DS_OK == lpDirectSound->CreateSoundBuffer(&dsbd, &lpPrimaryBuffer, NULL))
{
if(!UsePrimaryBuffer)
{ {
if (DS_OK == lpPrimaryBuffer->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID *) &lpSoundBuffer)) if (DS_OK == lpPrimaryBuffer->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID *) &lpSoundBuffer))
{ {
@@ -757,6 +764,22 @@ InitSound()
{ {
return FALSE; return FALSE;
} }
}
else return FALSE;
}
else
{
lpPrimaryBuffer->SetFormat(&wfx);
dsbcaps.dwSize=sizeof(DSBCAPS);
lpPrimaryBuffer->GetCaps(&dsbcaps);
SoundBufferSize=dsbcaps.dwBufferBytes;
if (DS_OK != lpPrimaryBuffer->Play(0,0,DSBPLAY_LOOPING))
{
return FALSE;
}
}
SoundEnabled=1; SoundEnabled=1;
FirstSound=0; FirstSound=0;
return TRUE; return TRUE;
@@ -766,16 +789,11 @@ InitSound()
return FALSE; return FALSE;
} }
} }
else
{
return FALSE;
}
}
ReInitSound() ReInitSound()
{ {
WAVEFORMATEX wfx; WAVEFORMATEX wfx;
DSBCAPS dsbcaps;
if (lpSoundBuffer) if (lpSoundBuffer)
{ {
@@ -784,6 +802,13 @@ ReInitSound()
lpSoundBuffer = NULL; lpSoundBuffer = NULL;
} }
if (lpPrimaryBuffer)
{
lpPrimaryBuffer->Stop();
lpPrimaryBuffer->Release();
lpPrimaryBuffer = NULL;
}
if (cfgsoundon == 0) if (cfgsoundon == 0)
{ {
SoundEnabled = 0; SoundEnabled = 0;
@@ -853,11 +878,14 @@ ReInitSound()
memset(&dsbd, 0, sizeof(DSBUFFERDESC)); memset(&dsbd, 0, sizeof(DSBUFFERDESC));
dsbd.dwSize = sizeof(DSBUFFERDESC); dsbd.dwSize = sizeof(DSBUFFERDESC);
dsbd.dwFlags = DSBCAPS_STICKYFOCUS; dsbd.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_STICKYFOCUS;
dsbd.dwBufferBytes = SoundBufferSize; if(UsePrimaryBuffer) dsbd.dwFlags |= DSBCAPS_PRIMARYBUFFER;
dsbd.lpwfxFormat = &wfx; dsbd.dwBufferBytes = UsePrimaryBuffer ? 0 : SoundBufferSize;
dsbd.lpwfxFormat = UsePrimaryBuffer ? NULL : &wfx;
if (DS_OK == lpDirectSound->CreateSoundBuffer(&dsbd, &lpPrimaryBuffer, NULL)) if (DS_OK == lpDirectSound->CreateSoundBuffer(&dsbd, &lpPrimaryBuffer, NULL))
{
if(!UsePrimaryBuffer)
{ {
if (DS_OK == lpPrimaryBuffer->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID *) &lpSoundBuffer)) if (DS_OK == lpPrimaryBuffer->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID *) &lpSoundBuffer))
{ {
@@ -865,8 +893,24 @@ ReInitSound()
{ {
return FALSE; return FALSE;
} }
}
else return FALSE;
}
else
{
lpPrimaryBuffer->SetFormat(&wfx);
dsbcaps.dwSize=sizeof(DSBCAPS);
lpPrimaryBuffer->GetCaps(&dsbcaps);
SoundBufferSize=dsbcaps.dwBufferBytes;
if (DS_OK != lpPrimaryBuffer->Play(0,0,DSBPLAY_LOOPING))
{
return FALSE;
}
}
SoundEnabled=1; SoundEnabled=1;
LastUsedPos=0; FirstSound=0;
return TRUE; return TRUE;
} }
else else
@@ -874,12 +918,6 @@ ReInitSound()
return FALSE; return FALSE;
} }
} }
else
{
return FALSE;
}
}
BOOL FAR PASCAL InitJoystickInput(LPCDIDEVICEINSTANCE pdinst, LPVOID pvRef) BOOL FAR PASCAL InitJoystickInput(LPCDIDEVICEINSTANCE pdinst, LPVOID pvRef)
{ {
@@ -2181,7 +2219,8 @@ void UpdateVFrame(void)
if (SoundEnabled == 0) return; if (SoundEnabled == 0) return;
lpSoundBuffer->GetCurrentPosition(&CurrentPos,&WritePos); if(!UsePrimaryBuffer) lpSoundBuffer->GetCurrentPosition(&CurrentPos,&WritePos);
else lpPrimaryBuffer->GetCurrentPosition(&CurrentPos,&WritePos);
if (LastUsedPos <= CurrentPos) if (LastUsedPos <= CurrentPos)
{ {
@@ -2262,6 +2301,8 @@ _top_mmx:
if (DSPBuffer1[i]<-32767)Buffer[i]=-32767; if (DSPBuffer1[i]<-32767)Buffer[i]=-32767;
} }
if(!UsePrimaryBuffer)
{
if (DS_OK!=lpSoundBuffer->Lock(LastUsedPos, if (DS_OK!=lpSoundBuffer->Lock(LastUsedPos,
SPCSize*2, &lpvPtr1, SPCSize*2, &lpvPtr1,
&dwBytes1, &lpvPtr2, &dwBytes1, &lpvPtr2,
@@ -2269,6 +2310,17 @@ _top_mmx:
{ {
return; return;
} }
}
else
{
if (DS_OK!=lpPrimaryBuffer->Lock(LastUsedPos,
SPCSize*2, &lpvPtr1,
&dwBytes1, &lpvPtr2,
&dwBytes2, 0))
{
return;
}
}
Sound=(short *)lpvPtr1; Sound=(short *)lpvPtr1;
@@ -2279,10 +2331,20 @@ _top_mmx:
CopyMemory(lpvPtr2, &Buffer[0]+dwBytes1, dwBytes2); CopyMemory(lpvPtr2, &Buffer[0]+dwBytes1, dwBytes2);
} }
if(!UsePrimaryBuffer)
{
if (DS_OK != lpSoundBuffer->Unlock(lpvPtr1, dwBytes1, lpvPtr2, dwBytes2)) if (DS_OK != lpSoundBuffer->Unlock(lpvPtr1, dwBytes1, lpvPtr2, dwBytes2))
{ {
return; return;
} }
}
else
{
if (DS_OK != lpPrimaryBuffer->Unlock(lpvPtr1, dwBytes1, lpvPtr2, dwBytes2))
{
return;
}
}
LastUsedPos+=SPCSize*2; LastUsedPos+=SPCSize*2;
if (LastUsedPos==SoundBufferSize) LastUsedPos=0; if (LastUsedPos==SoundBufferSize) LastUsedPos=0;

View File

@@ -1,8 +1,6 @@
Some Issues : Some Issues :
Windows Port: Windows Port:
- DirectSound in ZSNESw doesn't support the primary sound buffer.
Unfortunately, this causes 8-bit quality sounds on certain computers.
- OpenGL, or Direct3D support would be nice - OpenGL, or Direct3D support would be nice
- Use another (free) compiler for the windows version (cygwin?) - Use another (free) compiler for the windows version (cygwin?)
- Auto-detect high/low latency connections and adjust settings accordingly - Auto-detect high/low latency connections and adjust settings accordingly