Slightly less hacky implementation of SampleTime register

This commit is contained in:
Luke Usher 2018-04-02 20:26:48 +01:00
parent 02128f1ce4
commit 03c5999359
2 changed files with 34 additions and 20 deletions

View File

@ -55,6 +55,34 @@ namespace xboxkrnl {
#include <process.h>
#include <clocale>
// Temporary APU Timer Functions
// TODO: Move these to LLE APUDevice once we have one!
#define APU_TIMER_FREQUENCY 48000
extern LARGE_INTEGER NativePerformanceFrequency;
LARGE_INTEGER APUInitialPerformanceCounter;
double NativeToXboxAPU_FactorForPerformanceFrequency = 0;
void ResetApuTimer()
{
// Measure current host performance counter and frequency
QueryPerformanceCounter(&APUInitialPerformanceCounter);
NativeToXboxAPU_FactorForPerformanceFrequency = (double)APU_TIMER_FREQUENCY / NativePerformanceFrequency.QuadPart;
}
uint32_t GetAPUTime()
{
::LARGE_INTEGER PerformanceCounter;
QueryPerformanceCounter(&PerformanceCounter);
// Re-Base on the time DirectSoundCreate was called
PerformanceCounter.QuadPart -= APUInitialPerformanceCounter.QuadPart;
// Apply a delta to make it appear to tick at 48khz
PerformanceCounter.QuadPart = (ULONGLONG)(NativeToXboxAPU_FactorForPerformanceFrequency * PerformanceCounter.QuadPart);
return PerformanceCounter.QuadPart;
}
// TODO: Tasks need to do for DirectSound HLE
// * Need create patches
// * Ac97CreateMediaObject (Need OOVPA)
@ -188,11 +216,6 @@ void CxbxInitAudio()
}
#endif
#define DSOUND_PERFORMANCE_FREQUENCY 48000 // GetSampleTime needs to tick at 48Khz
extern LARGE_INTEGER NativePerformanceFrequency;
LARGE_INTEGER DSoundInitialPerformanceCounter;
double NativeToXboxDSound_FactorForPerformanceFrequency = 0;
// ******************************************************************
// * patch: DirectSoundCreate
// ******************************************************************
@ -220,9 +243,7 @@ HRESULT WINAPI XTL::EMUPATCH(DirectSoundCreate)
enterCriticalSection;
// Measure current host performance counter and frequency
QueryPerformanceCounter(&DSoundInitialPerformanceCounter);
NativeToXboxDSound_FactorForPerformanceFrequency = (double)DSOUND_PERFORMANCE_FREQUENCY / NativePerformanceFrequency.QuadPart;
ResetApuTimer();
// Set this flag when this function is called
g_bDSoundCreateCalled = TRUE;
@ -3172,15 +3193,7 @@ DWORD WINAPI XTL::EMUPATCH(DirectSoundGetSampleTime)()
LOG_FUNC();
DWORD dwRet;
::LARGE_INTEGER PerformanceCounter;
QueryPerformanceCounter(&PerformanceCounter);
// Re-Base on the time DirectSoundCreate was called
PerformanceCounter.QuadPart -= DSoundInitialPerformanceCounter.QuadPart;
// Apply a delta to make it appear to tick at 48khz
PerformanceCounter.QuadPart = (ULONGLONG)(NativeToXboxDSound_FactorForPerformanceFrequency * PerformanceCounter.QuadPart);
dwRet = PerformanceCounter.QuadPart;
DWORD dwRet = GetAPUTime();
leaveCriticalSection;

View File

@ -51,11 +51,11 @@
#include "EmuX86.h"
#include "HLEIntercept.h" // for bLLE_GPU
#include "EmuXTL.h"
#include <assert.h>
#include "devices\Xbox.h" // For g_PCIBus
extern uint32_t GetAPUTime();
//
// Read & write handlers handlers for I/O
//
@ -180,7 +180,8 @@ uint32_t EmuX86_Read(xbaddr addr, int size)
if (addr >= XBOX_FLASH_ROM_BASE) { // 0xFFF00000 - 0xFFFFFFF
value = EmuFlash_Read32(addr - XBOX_FLASH_ROM_BASE); // TODO : Make flash access size-aware
} else if(addr == 0xFE80200C) {
return XTL::EMUPATCH(DirectSoundGetSampleTime)();
// TODO: Remove this once we have an LLE APU Device
return GetAPUTime();
} else {
// Pass the Read to the PCI Bus, this will handle devices with BARs set to MMIO addresses
if (g_PCIBus->MMIORead(addr, &value, size)) {