diff --git a/zsnes/src/win/winlink.cpp b/zsnes/src/win/winlink.cpp index fa2896cb..a8ffd1aa 100644 --- a/zsnes/src/win/winlink.cpp +++ b/zsnes/src/win/winlink.cpp @@ -41,6 +41,7 @@ DWORD SoundBufferSize=1024*18; DWORD FirstSound=1; int SoundEnabled=1; +int UsePrimaryBuffer=0; DWORD FirstActivate = 1; @@ -668,6 +669,7 @@ DWORD PrevSoundQuality; InitSound() { WAVEFORMATEX wfx; + DSBCAPS dsbcaps; if (cfgsoundon == 0) return FALSE; @@ -676,14 +678,16 @@ InitSound() PrevSoundQuality=SoundQuality; PrevStereoSound=StereoSound; - if (DS_OK == pDirectSoundCreate8(NULL, &lpDirectSound,NULL)) + if (DS_OK == pDirectSoundCreate8(NULL, &lpDirectSound,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)) return FALSE; } + else UsePrimaryBuffer=1; } else { @@ -745,37 +749,51 @@ InitSound() memset(&dsbd, 0, sizeof(DSBUFFERDESC)); dsbd.dwSize = sizeof(DSBUFFERDESC); - dsbd.dwFlags = DSBCAPS_STICKYFOCUS; // | DSBCAPS_PRIMARYBUFFER; - dsbd.dwBufferBytes = SoundBufferSize; - dsbd.lpwfxFormat = &wfx; + dsbd.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_STICKYFOCUS; + if(UsePrimaryBuffer) dsbd.dwFlags |= DSBCAPS_PRIMARYBUFFER; + dsbd.dwBufferBytes = UsePrimaryBuffer ? 0 : SoundBufferSize; + dsbd.lpwfxFormat = UsePrimaryBuffer ? NULL : &wfx; if (DS_OK == lpDirectSound->CreateSoundBuffer(&dsbd, &lpPrimaryBuffer, NULL)) { - if (DS_OK == lpPrimaryBuffer->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID *) &lpSoundBuffer)) - { - if (DS_OK != lpSoundBuffer->Play(0,0,DSBPLAY_LOOPING)) - { - return FALSE; - } - SoundEnabled=1; - FirstSound=0; - return TRUE; - } - else - { - return FALSE; - } + if(!UsePrimaryBuffer) + { + if (DS_OK == lpPrimaryBuffer->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID *) &lpSoundBuffer)) + { + if (DS_OK != lpSoundBuffer->Play(0,0,DSBPLAY_LOOPING)) + { + 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; + FirstSound=0; + return TRUE; } else { return FALSE; } - } ReInitSound() { WAVEFORMATEX wfx; + DSBCAPS dsbcaps; if (lpSoundBuffer) { @@ -784,6 +802,13 @@ ReInitSound() lpSoundBuffer = NULL; } + if (lpPrimaryBuffer) + { + lpPrimaryBuffer->Stop(); + lpPrimaryBuffer->Release(); + lpPrimaryBuffer = NULL; + } + if (cfgsoundon == 0) { SoundEnabled = 0; @@ -853,32 +878,45 @@ ReInitSound() memset(&dsbd, 0, sizeof(DSBUFFERDESC)); dsbd.dwSize = sizeof(DSBUFFERDESC); - dsbd.dwFlags = DSBCAPS_STICKYFOCUS; - dsbd.dwBufferBytes = SoundBufferSize; - dsbd.lpwfxFormat = &wfx; + dsbd.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_STICKYFOCUS; + if(UsePrimaryBuffer) dsbd.dwFlags |= DSBCAPS_PRIMARYBUFFER; + dsbd.dwBufferBytes = UsePrimaryBuffer ? 0 : SoundBufferSize; + dsbd.lpwfxFormat = UsePrimaryBuffer ? NULL : &wfx; if (DS_OK == lpDirectSound->CreateSoundBuffer(&dsbd, &lpPrimaryBuffer, NULL)) { - if (DS_OK == lpPrimaryBuffer->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID *) &lpSoundBuffer)) - { - if (DS_OK != lpSoundBuffer->Play(0,0,DSBPLAY_LOOPING )) - { - return FALSE; - } - SoundEnabled=1; - LastUsedPos=0; - return TRUE; - } - else - { - return FALSE; - } + if(!UsePrimaryBuffer) + { + if (DS_OK == lpPrimaryBuffer->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID *) &lpSoundBuffer)) + { + if (DS_OK != lpSoundBuffer->Play(0,0,DSBPLAY_LOOPING)) + { + 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; + FirstSound=0; + return TRUE; } else { return FALSE; } - } BOOL FAR PASCAL InitJoystickInput(LPCDIDEVICEINSTANCE pdinst, LPVOID pvRef) @@ -2181,7 +2219,8 @@ void UpdateVFrame(void) if (SoundEnabled == 0) return; - lpSoundBuffer->GetCurrentPosition(&CurrentPos,&WritePos); + if(!UsePrimaryBuffer) lpSoundBuffer->GetCurrentPosition(&CurrentPos,&WritePos); + else lpPrimaryBuffer->GetCurrentPosition(&CurrentPos,&WritePos); if (LastUsedPos <= CurrentPos) { @@ -2262,13 +2301,26 @@ _top_mmx: if (DSPBuffer1[i]<-32767)Buffer[i]=-32767; } - if (DS_OK!=lpSoundBuffer->Lock(LastUsedPos, - SPCSize*2, &lpvPtr1, - &dwBytes1, &lpvPtr2, - &dwBytes2, 0)) - { - return; - } + if(!UsePrimaryBuffer) + { + if (DS_OK!=lpSoundBuffer->Lock(LastUsedPos, + SPCSize*2, &lpvPtr1, + &dwBytes1, &lpvPtr2, + &dwBytes2, 0)) + { + return; + } + } + else + { + if (DS_OK!=lpPrimaryBuffer->Lock(LastUsedPos, + SPCSize*2, &lpvPtr1, + &dwBytes1, &lpvPtr2, + &dwBytes2, 0)) + { + return; + } + } Sound=(short *)lpvPtr1; @@ -2279,10 +2331,20 @@ _top_mmx: CopyMemory(lpvPtr2, &Buffer[0]+dwBytes1, dwBytes2); } - if (DS_OK != lpSoundBuffer->Unlock(lpvPtr1, dwBytes1, lpvPtr2, dwBytes2)) - { - return; - } + if(!UsePrimaryBuffer) + { + if (DS_OK != lpSoundBuffer->Unlock(lpvPtr1, dwBytes1, lpvPtr2, dwBytes2)) + { + return; + } + } + else + { + if (DS_OK != lpPrimaryBuffer->Unlock(lpvPtr1, dwBytes1, lpvPtr2, dwBytes2)) + { + return; + } + } LastUsedPos+=SPCSize*2; if (LastUsedPos==SoundBufferSize) LastUsedPos=0; diff --git a/zsnes/todo.txt b/zsnes/todo.txt index 73a55d03..2453c6a1 100644 --- a/zsnes/todo.txt +++ b/zsnes/todo.txt @@ -1,8 +1,6 @@ Some Issues : 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 - Use another (free) compiler for the windows version (cygwin?) - Auto-detect high/low latency connections and adjust settings accordingly