Add use of DirectSound primary buffer in win port
This commit is contained in:
@@ -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;
|
||||||
|
|
||||||
@@ -676,14 +678,16 @@ InitSound()
|
|||||||
PrevSoundQuality=SoundQuality;
|
PrevSoundQuality=SoundQuality;
|
||||||
PrevStereoSound=StereoSound;
|
PrevStereoSound=StereoSound;
|
||||||
|
|
||||||
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,37 +749,51 @@ 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 (DS_OK == lpPrimaryBuffer->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID *) &lpSoundBuffer))
|
if(!UsePrimaryBuffer)
|
||||||
{
|
{
|
||||||
if (DS_OK != lpSoundBuffer->Play(0,0,DSBPLAY_LOOPING))
|
if (DS_OK == lpPrimaryBuffer->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID *) &lpSoundBuffer))
|
||||||
{
|
{
|
||||||
return FALSE;
|
if (DS_OK != lpSoundBuffer->Play(0,0,DSBPLAY_LOOPING))
|
||||||
}
|
{
|
||||||
SoundEnabled=1;
|
return FALSE;
|
||||||
FirstSound=0;
|
}
|
||||||
return TRUE;
|
}
|
||||||
}
|
else return FALSE;
|
||||||
else
|
}
|
||||||
{
|
else
|
||||||
return FALSE;
|
{
|
||||||
}
|
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;
|
||||||
|
FirstSound=0;
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return FALSE;
|
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,32 +878,45 @@ 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 (DS_OK == lpPrimaryBuffer->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID *) &lpSoundBuffer))
|
if(!UsePrimaryBuffer)
|
||||||
{
|
{
|
||||||
if (DS_OK != lpSoundBuffer->Play(0,0,DSBPLAY_LOOPING ))
|
if (DS_OK == lpPrimaryBuffer->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID *) &lpSoundBuffer))
|
||||||
{
|
{
|
||||||
return FALSE;
|
if (DS_OK != lpSoundBuffer->Play(0,0,DSBPLAY_LOOPING))
|
||||||
}
|
{
|
||||||
SoundEnabled=1;
|
return FALSE;
|
||||||
LastUsedPos=0;
|
}
|
||||||
return TRUE;
|
}
|
||||||
}
|
else return FALSE;
|
||||||
else
|
}
|
||||||
{
|
else
|
||||||
return FALSE;
|
{
|
||||||
}
|
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;
|
||||||
|
FirstSound=0;
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return FALSE;
|
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,13 +2301,26 @@ _top_mmx:
|
|||||||
if (DSPBuffer1[i]<-32767)Buffer[i]=-32767;
|
if (DSPBuffer1[i]<-32767)Buffer[i]=-32767;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DS_OK!=lpSoundBuffer->Lock(LastUsedPos,
|
if(!UsePrimaryBuffer)
|
||||||
SPCSize*2, &lpvPtr1,
|
{
|
||||||
&dwBytes1, &lpvPtr2,
|
if (DS_OK!=lpSoundBuffer->Lock(LastUsedPos,
|
||||||
&dwBytes2, 0))
|
SPCSize*2, &lpvPtr1,
|
||||||
{
|
&dwBytes1, &lpvPtr2,
|
||||||
return;
|
&dwBytes2, 0))
|
||||||
}
|
{
|
||||||
|
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 (DS_OK != lpSoundBuffer->Unlock(lpvPtr1, dwBytes1, lpvPtr2, dwBytes2))
|
if(!UsePrimaryBuffer)
|
||||||
{
|
{
|
||||||
return;
|
if (DS_OK != lpSoundBuffer->Unlock(lpvPtr1, dwBytes1, lpvPtr2, dwBytes2))
|
||||||
}
|
{
|
||||||
|
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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user