Skip to content

Commit

Permalink
fix audio frequency by set only given frequency value instead of from…
Browse files Browse the repository at this point in the history
… host function
  • Loading branch information
RadWolfie committed Jan 11, 2020
1 parent 195795b commit a375fab
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 27 deletions.
2 changes: 2 additions & 0 deletions src/core/hle/DSOUND/DirectSound/DirectSound.hpp
Expand Up @@ -108,6 +108,7 @@ struct X_CDirectSoundBuffer
DWORD Xb_dwHeadroom; DWORD Xb_dwHeadroom;
X_DSENVOLOPEDESC Xb_EnvolopeDesc; X_DSENVOLOPEDESC Xb_EnvolopeDesc;
X_DSVOICEPROPS Xb_VoiceProperties; X_DSVOICEPROPS Xb_VoiceProperties;
DWORD Xb_Frequency;
}; };


//Custom flags (4 bytes support up to 31 shifts,starting from 0) //Custom flags (4 bytes support up to 31 shifts,starting from 0)
Expand Down Expand Up @@ -260,6 +261,7 @@ class X_CDirectSoundStream
DWORD Xb_dwHeadroom; DWORD Xb_dwHeadroom;
X_DSENVOLOPEDESC Xb_EnvolopeDesc; X_DSENVOLOPEDESC Xb_EnvolopeDesc;
X_DSVOICEPROPS Xb_VoiceProperties; X_DSVOICEPROPS Xb_VoiceProperties;
DWORD Xb_Frequency;
}; };


// ****************************************************************** // ******************************************************************
Expand Down
6 changes: 3 additions & 3 deletions src/core/hle/DSOUND/DirectSound/DirectSoundBuffer.cpp
Expand Up @@ -933,7 +933,7 @@ HRESULT WINAPI XTL::EMUPATCH(IDirectSoundBuffer_SetFormat)
pThis->EmuBufferDesc, pThis->EmuFlags, pThis->EmuBufferDesc, pThis->EmuFlags,
pThis->EmuPlayFlags, pThis->EmuDirectSound3DBuffer8, pThis->EmuPlayFlags, pThis->EmuDirectSound3DBuffer8,
0, pThis->X_BufferCache, pThis->X_BufferCacheSize, 0, pThis->X_BufferCache, pThis->X_BufferCacheSize,
pThis->Xb_VoiceProperties, xbnullptr); pThis->Xb_VoiceProperties, xbnullptr, pThis->Xb_Frequency);


return hRet; return hRet;
} }
Expand All @@ -953,7 +953,7 @@ HRESULT WINAPI XTL::EMUPATCH(IDirectSoundBuffer_SetFrequency)
LOG_FUNC_ARG(dwFrequency) LOG_FUNC_ARG(dwFrequency)
LOG_FUNC_END; LOG_FUNC_END;


HRESULT hRet = HybridDirectSoundBuffer_SetFrequency(pThis->EmuDirectSoundBuffer8, dwFrequency); HRESULT hRet = HybridDirectSoundBuffer_SetFrequency(pThis->EmuDirectSoundBuffer8, dwFrequency, pThis->Xb_Frequency);


return hRet; return hRet;
} }
Expand Down Expand Up @@ -1286,7 +1286,7 @@ HRESULT WINAPI XTL::EMUPATCH(IDirectSoundBuffer_SetPitch)
LOG_FUNC_ARG(lPitch) LOG_FUNC_ARG(lPitch)
LOG_FUNC_END; LOG_FUNC_END;


HRESULT hRet = HybridDirectSoundBuffer_SetPitch(pThis->EmuDirectSoundBuffer8, lPitch); HRESULT hRet = HybridDirectSoundBuffer_SetPitch(pThis->EmuDirectSoundBuffer8, lPitch, pThis->Xb_Frequency);


return hRet; return hRet;
} }
Expand Down
45 changes: 24 additions & 21 deletions src/core/hle/DSOUND/DirectSound/DirectSoundInline.hpp
Expand Up @@ -584,7 +584,8 @@ static inline void DSound3DBufferCreate(LPDIRECTSOUNDBUFFER8 pDSBuffer, LPDIRECT
pThis->Xb_VolumeMixbin = 0L; \ pThis->Xb_VolumeMixbin = 0L; \
pThis->Xb_dwHeadroom = 600; /* default for 2D voice */ \ pThis->Xb_dwHeadroom = 600; /* default for 2D voice */ \
pThis->Xb_EnvolopeDesc = { 0 }; \ pThis->Xb_EnvolopeDesc = { 0 }; \
InitVoiceProperties(pThis->Xb_VoiceProperties); /* The rest will initialize in GeneratePCMFormat to GenerateMixBinDefault. */ InitVoiceProperties(pThis->Xb_VoiceProperties); /* The rest will initialize in GeneratePCMFormat to GenerateMixBinDefault. */ \
pThis->Xb_Frequency = XTL_DSXFREQUENCY_ORIGINAL;
//pThis->EmuBufferDesc = { 0 }; // Enable this when become necessary. //pThis->EmuBufferDesc = { 0 }; // Enable this when become necessary.
/* /*
pThis->EmuLockPtr1 = xbnullptr; \ pThis->EmuLockPtr1 = xbnullptr; \
Expand All @@ -605,20 +606,19 @@ static inline void DSoundBufferTransferSettings(
LPDIRECTSOUNDBUFFER8 &pDSBufferOld, LPDIRECTSOUNDBUFFER8 &pDSBufferOld,
LPDIRECTSOUNDBUFFER8 &pDSBufferNew, LPDIRECTSOUNDBUFFER8 &pDSBufferNew,
LPDIRECTSOUND3DBUFFER8 &pDS3DBufferOld, LPDIRECTSOUND3DBUFFER8 &pDS3DBufferOld,
LPDIRECTSOUND3DBUFFER8 &pDS3DBufferNew) LPDIRECTSOUND3DBUFFER8 &pDS3DBufferNew,
DWORD Xb_Frequency)
{ {
DWORD dwFrequency;
LONG lVolume, lPan; LONG lVolume, lPan;
DS3DBUFFER ds3dBuffer; DS3DBUFFER ds3dBuffer;


if (pDSBufferOld == nullptr) { if (pDSBufferOld == nullptr) {
return; return;
} }


pDSBufferOld->GetVolume(&lVolume); pDSBufferNew->SetFrequency(Xb_Frequency);
pDSBufferOld->GetFrequency(&dwFrequency);


pDSBufferNew->SetFrequency(dwFrequency); pDSBufferOld->GetVolume(&lVolume);
pDSBufferNew->SetVolume(lVolume); pDSBufferNew->SetVolume(lVolume);


if (pDS3DBufferOld != nullptr && pDS3DBufferNew != nullptr) { if (pDS3DBufferOld != nullptr && pDS3DBufferNew != nullptr) {
Expand All @@ -636,7 +636,8 @@ static inline void DSoundBufferReCreate(
DSBUFFERDESC &DSBufferDesc, DSBUFFERDESC &DSBufferDesc,
LPDIRECTSOUND3DBUFFER8 &pDS3DBuffer, LPDIRECTSOUND3DBUFFER8 &pDS3DBuffer,
LPDIRECTSOUNDBUFFER8 &pDSBufferNew, LPDIRECTSOUNDBUFFER8 &pDSBufferNew,
LPDIRECTSOUND3DBUFFER8 &pDS3DBufferNew) { LPDIRECTSOUND3DBUFFER8 &pDS3DBufferNew,
DWORD Xb_Frequency) {




DSoundBufferCreate(&DSBufferDesc, pDSBufferNew); DSoundBufferCreate(&DSBufferDesc, pDSBufferNew);
Expand All @@ -645,7 +646,7 @@ static inline void DSoundBufferReCreate(
DSound3DBufferCreate(pDSBufferNew, pDS3DBufferNew); DSound3DBufferCreate(pDSBufferNew, pDS3DBufferNew);
} }


DSoundBufferTransferSettings(pDSBuffer, pDSBufferNew, pDS3DBuffer, pDS3DBufferNew); DSoundBufferTransferSettings(pDSBuffer, pDSBufferNew, pDS3DBuffer, pDS3DBufferNew, Xb_Frequency);
} }


static inline void DSoundBufferRelease( static inline void DSoundBufferRelease(
Expand Down Expand Up @@ -695,7 +696,7 @@ static inline void DSoundBufferResizeSetSize(
LPDIRECTSOUND3DBUFFER8 pDS3DBufferNew = nullptr; LPDIRECTSOUND3DBUFFER8 pDS3DBufferNew = nullptr;


DSoundBufferReCreate(pThis->EmuDirectSoundBuffer8, pThis->EmuBufferDesc, pThis->EmuDirectSound3DBuffer8, DSoundBufferReCreate(pThis->EmuDirectSoundBuffer8, pThis->EmuBufferDesc, pThis->EmuDirectSound3DBuffer8,
pDSBufferNew, pDS3DBufferNew); pDSBufferNew, pDS3DBufferNew, pThis->Xb_Frequency);


// release old buffer // release old buffer
DSoundBufferRelease(pThis->EmuDirectSoundBuffer8, pThis->EmuDirectSound3DBuffer8, refCount); DSoundBufferRelease(pThis->EmuDirectSoundBuffer8, pThis->EmuDirectSound3DBuffer8, refCount);
Expand Down Expand Up @@ -781,14 +782,15 @@ static inline void DSoundBufferReplace(
LPDIRECTSOUNDBUFFER8 &pDSBuffer, LPDIRECTSOUNDBUFFER8 &pDSBuffer,
DSBUFFERDESC &DSBufferDesc, DSBUFFERDESC &DSBufferDesc,
DWORD PlayFlags, DWORD PlayFlags,
LPDIRECTSOUND3DBUFFER8 &pDS3DBuffer) LPDIRECTSOUND3DBUFFER8 &pDS3DBuffer,
DWORD Xb_Frequency)
{ {
DWORD refCount, dwPlayCursor, dwStatus; DWORD refCount, dwPlayCursor, dwStatus;
LPDIRECTSOUNDBUFFER8 pDSBufferNew = nullptr; LPDIRECTSOUNDBUFFER8 pDSBufferNew = nullptr;
LPDIRECTSOUND3DBUFFER8 pDS3DBufferNew = nullptr; LPDIRECTSOUND3DBUFFER8 pDS3DBufferNew = nullptr;


DSoundBufferReCreate(pDSBuffer, DSBufferDesc, pDS3DBuffer, DSoundBufferReCreate(pDSBuffer, DSBufferDesc, pDS3DBuffer,
pDSBufferNew, pDS3DBufferNew); pDSBufferNew, pDS3DBufferNew, Xb_Frequency);


HRESULT hRet = pDSBuffer->GetStatus(&dwStatus); HRESULT hRet = pDSBuffer->GetStatus(&dwStatus);


Expand Down Expand Up @@ -1425,7 +1427,8 @@ static inline HRESULT HybridDirectSoundBuffer_SetFormat(
LPVOID &X_BufferCache, LPVOID &X_BufferCache,
DWORD &X_BufferCacheSize, DWORD &X_BufferCacheSize,
XTL::X_DSVOICEPROPS &Xb_VoiceProperties, XTL::X_DSVOICEPROPS &Xb_VoiceProperties,
XTL::X_LPDSMIXBINS mixbins_output) XTL::X_LPDSMIXBINS mixbins_output,
DWORD Xb_Frequency)
{ {
pDSBuffer->Stop(); pDSBuffer->Stop();


Expand All @@ -1444,7 +1447,7 @@ static inline HRESULT HybridDirectSoundBuffer_SetFormat(
// Allocate at least 5 second worth of bytes in PCM format. // Allocate at least 5 second worth of bytes in PCM format.
BufferDesc.dwBufferBytes = BufferDesc.lpwfxFormat->nAvgBytesPerSec * 5; BufferDesc.dwBufferBytes = BufferDesc.lpwfxFormat->nAvgBytesPerSec * 5;
} }
DSoundBufferReplace(pDSBuffer, BufferDesc, dwPlayFlags, pDS3DBuffer); DSoundBufferReplace(pDSBuffer, BufferDesc, dwPlayFlags, pDS3DBuffer, Xb_Frequency);
} }


RETURN_RESULT_CHECK(hRet); RETURN_RESULT_CHECK(hRet);
Expand All @@ -1454,10 +1457,12 @@ static inline HRESULT HybridDirectSoundBuffer_SetFormat(
//IDirectSoundBuffer //IDirectSoundBuffer
static inline HRESULT HybridDirectSoundBuffer_SetFrequency( static inline HRESULT HybridDirectSoundBuffer_SetFrequency(
LPDIRECTSOUNDBUFFER8 pDSBuffer, LPDIRECTSOUNDBUFFER8 pDSBuffer,
DWORD dwFrequency) DWORD dwFrequency,
DWORD &Xb_Frequency)
{ {
HRESULT hRet = S_OK; HRESULT hRet = S_OK;


Xb_Frequency = dwFrequency;
hRet = pDSBuffer->SetFrequency(dwFrequency); hRet = pDSBuffer->SetFrequency(dwFrequency);


RETURN_RESULT_CHECK(hRet); RETURN_RESULT_CHECK(hRet);
Expand Down Expand Up @@ -1666,15 +1671,13 @@ static inline HRESULT HybridDirectSoundBuffer_SetOutputBuffer(
//IDirectSoundBuffer //IDirectSoundBuffer
static inline HRESULT HybridDirectSoundBuffer_SetPitch( static inline HRESULT HybridDirectSoundBuffer_SetPitch(
LPDIRECTSOUNDBUFFER8 pDSBuffer, LPDIRECTSOUNDBUFFER8 pDSBuffer,
LONG lPitch) LONG lPitch,
DWORD &Xb_Frequency)
{ {


// Convert pitch back to frequency // Convert pitch back to frequency
if (lPitch == 0) { // NOTE: pitch = 0 is equal to 48 KHz.
lPitch = 48000; // NOTE: pitch = 0 is equal to 48 KHz. Xb_Frequency = static_cast<DWORD>(exp((lPitch / 4096.0f) * log(2)) * 48000.0f);
} else {
lPitch = static_cast<LONG>(exp((lPitch / 4096.0f) * log(2)) * 48000.0f);
}


/* For research purpose of how to convert frequency to pitch and back to frequency. /* For research purpose of how to convert frequency to pitch and back to frequency.
// Edit hertz variable to see the result. // Edit hertz variable to see the result.
Expand All @@ -1689,7 +1692,7 @@ static inline HRESULT HybridDirectSoundBuffer_SetPitch(
// Convert pitch to hertz // Convert pitch to hertz
hertz = exp((pitch / pitchRatio) * log(2)) * hertzRatio;*/ hertz = exp((pitch / pitchRatio) * log(2)) * hertzRatio;*/


RETURN_RESULT_CHECK(pDSBuffer->SetFrequency(lPitch)); RETURN_RESULT_CHECK(pDSBuffer->SetFrequency(Xb_Frequency));
} }
/* /*
//Only has one function, this is not a requirement. //Only has one function, this is not a requirement.
Expand Down
6 changes: 3 additions & 3 deletions src/core/hle/DSOUND/DirectSound/DirectSoundStream.cpp
Expand Up @@ -904,7 +904,7 @@ HRESULT WINAPI XTL::EMUPATCH(CDirectSoundStream_SetFormat)
HRESULT hRet = HybridDirectSoundBuffer_SetFormat(pThis->EmuDirectSoundBuffer8, pwfxFormat, pThis->EmuBufferDesc, HRESULT hRet = HybridDirectSoundBuffer_SetFormat(pThis->EmuDirectSoundBuffer8, pwfxFormat, pThis->EmuBufferDesc,
pThis->EmuFlags, pThis->EmuPlayFlags, pThis->EmuDirectSound3DBuffer8, pThis->EmuFlags, pThis->EmuPlayFlags, pThis->EmuDirectSound3DBuffer8,
0, pThis->X_BufferCache, pThis->X_BufferCacheSize, 0, pThis->X_BufferCache, pThis->X_BufferCacheSize,
pThis->Xb_VoiceProperties, xbnullptr); pThis->Xb_VoiceProperties, xbnullptr, pThis->Xb_Frequency);


return hRet; return hRet;
} }
Expand All @@ -924,7 +924,7 @@ HRESULT WINAPI XTL::EMUPATCH(CDirectSoundStream_SetFrequency)
LOG_FUNC_ARG(dwFrequency) LOG_FUNC_ARG(dwFrequency)
LOG_FUNC_END; LOG_FUNC_END;


HRESULT hRet = HybridDirectSoundBuffer_SetFrequency(pThis->EmuDirectSoundBuffer8, dwFrequency); HRESULT hRet = HybridDirectSoundBuffer_SetFrequency(pThis->EmuDirectSoundBuffer8, dwFrequency, pThis->Xb_Frequency);


return hRet; return hRet;
} }
Expand Down Expand Up @@ -1231,7 +1231,7 @@ HRESULT WINAPI XTL::EMUPATCH(CDirectSoundStream_SetPitch)
LOG_FUNC_ARG(lPitch) LOG_FUNC_ARG(lPitch)
LOG_FUNC_END; LOG_FUNC_END;


HRESULT hRet = HybridDirectSoundBuffer_SetPitch(pThis->EmuDirectSoundBuffer8, lPitch); HRESULT hRet = HybridDirectSoundBuffer_SetPitch(pThis->EmuDirectSoundBuffer8, lPitch, pThis->Xb_Frequency);


return hRet; return hRet;
} }
Expand Down
5 changes: 5 additions & 0 deletions src/core/hle/DSOUND/XbDSoundTypes.h
Expand Up @@ -106,6 +106,11 @@ typedef struct _XDSMIXBINS {
#define X_DSBSTOPEX_RELEASEWAVEFORM 0x00000002 #define X_DSBSTOPEX_RELEASEWAVEFORM 0x00000002
#define X_DSBSTOPEX_ALL (X_DSBSTOPEX_ENVELOPE | X_DSBSTOPEX_RELEASEWAVEFORM) #define X_DSBSTOPEX_ALL (X_DSBSTOPEX_ENVELOPE | X_DSBSTOPEX_RELEASEWAVEFORM)


// Generic frequency range
#define XTL_DSXFREQUENCY_ORIGINAL 0x00000000
//#define XTL_DSGFREQUENCY_MIN 0x00000???
//#define XTL_DSGFREQUENCY_MAX 0x000?????

#define XTL_DSBCAPS_CTRL3D 0x00000010 #define XTL_DSBCAPS_CTRL3D 0x00000010
#define XTL_DSBCAPS_CTRLFREQUENCY 0x00000020 #define XTL_DSBCAPS_CTRLFREQUENCY 0x00000020
#define XTL_DSBCAPS_CTRLVOLUME 0x00000080 #define XTL_DSBCAPS_CTRLVOLUME 0x00000080
Expand Down

0 comments on commit a375fab

Please sign in to comment.