diff --git a/Source/Project64-audio/AudioMain.cpp b/Source/Project64-audio/AudioMain.cpp index 47e9ce2c0..31586b622 100644 --- a/Source/Project64-audio/AudioMain.cpp +++ b/Source/Project64-audio/AudioMain.cpp @@ -33,12 +33,15 @@ void SetTimerResolution ( void ); #endif +#define ENDIAN_SWAP_BYTE (~0 & 0x7 & 3) +#define BES(address) ((address) ^ ENDIAN_SWAP_BYTE) + /* Read header for type definition */ AUDIO_INFO g_AudioInfo; bool g_PluginInit = false; bool g_romopen = false; -uint32_t g_Dacrate = 0; +uint32_t g_Dacrate = 0, hack = 0; #ifdef _WIN32 DirectSoundDriver * g_SoundDriver = NULL; @@ -56,7 +59,7 @@ void PluginInit(void) SetupAudioSettings(); StartTrace(); #ifdef _WIN32 - SetTimerResolution(); + SetTimerResolution(); #endif g_PluginInit = true; } @@ -65,10 +68,10 @@ EXPORT void CALL PluginLoaded(void) { PluginInit(); WriteTrace(TraceAudioInterface, TraceDebug, "Called"); - if (g_settings != NULL) - { - g_settings->SetSyncViaAudioEnabled(true); - } + if (g_settings != NULL) + { + g_settings->SetSyncViaAudioEnabled(true); + } } EXPORT void CALL AiDacrateChanged(int SystemType) @@ -89,36 +92,48 @@ EXPORT void CALL AiDacrateChanged(int SystemType) WriteTrace(TraceAudioInterface, TraceNotice, "Unknown/reserved bits in AI_DACRATE_REG set. 0x%08X", *g_AudioInfo.AI_DACRATE_REG); } - uint32_t video_clock = 0; int32_t BufferSize = 0; - double audio_clock = 0; double framerate = (30 / 1.001); + uint32_t video_clock = 0, BufferSize = 0, Frequency = 0, divider = 0; switch (SystemType) { case SYSTEM_NTSC: video_clock = 48681812; break; - case SYSTEM_PAL: video_clock = 49656530; framerate = 25; break; + case SYSTEM_PAL: video_clock = 49656530; break; case SYSTEM_MPAL: video_clock = 48628316; break; } - uint32_t Frequency = (video_clock / (g_Dacrate + 1)); - if (Frequency < 4000) + Frequency = (video_clock / (g_Dacrate + 1)); + + if (Frequency < 8000) { WriteTrace(TraceAudioDriver, TraceDebug, "Not Audio Data!"); return; } - else + + switch (g_settings->GetBuffer()) { - if (g_settings->FPSBuffer() == false && SystemType != SYSTEM_PAL) - { - framerate = 30.475; // Needed for Body Harvest (U) - } - if (g_settings->TinyBuffer() == false) - { - framerate = (framerate / 2); - } - audio_clock = (video_clock / framerate); - BufferSize = (int32_t)(audio_clock / (g_Dacrate + 1)) + 1 & ~0x1; - g_SoundDriver->AI_SetFrequency(Frequency, BufferSize); + case 1: divider = 50; break; + case 2: divider = 45; break; + case 3: divider = 40; break; + case 4: divider = 30; break; + case 5: divider = 25; break; + case 6: divider = 20; break; + case 7: divider = 15; break; } + + BufferSize = ((Frequency / divider) + (int32_t)2.49 & ~0x3); + + if (hack == 'BH' && SystemType != SYSTEM_PAL) BufferSize -= 16; + + if (g_settings->RoundFreq()) + { + Frequency = ((Frequency / 25) + 1) * 25; + } + WriteTrace(TraceAudioDriver, TraceInfo, "Frequency = %d", Frequency); + WriteTrace(TraceAudioDriver, TraceInfo, "Divider = %.3f", (double)divider); + WriteTrace(TraceAudioDriver, TraceInfo, "Buffer = %d", g_settings->GetBuffer()); + WriteTrace(TraceAudioDriver, TraceInfo, "Buffer Size = %d", BufferSize); + + g_SoundDriver->AI_SetFrequency(Frequency, BufferSize); } WriteTrace(TraceAudioInterface, TraceDebug, "Done"); } @@ -166,12 +181,12 @@ EXPORT void CALL AiUpdate(int32_t Wait) EXPORT void CALL CloseDLL(void) { WriteTrace(TraceAudioInterface, TraceDebug, "Called"); - if (g_SoundDriver != NULL) - { - g_SoundDriver->AI_Shutdown(); - delete g_SoundDriver; - g_SoundDriver = NULL; - } + if (g_SoundDriver != NULL) + { + g_SoundDriver->AI_Shutdown(); + delete g_SoundDriver; + g_SoundDriver = NULL; + } CleanupAudioSettings(); StopTrace(); } @@ -224,6 +239,11 @@ EXPORT int32_t CALL InitiateAudio(AUDIO_INFO Audio_Info) #else g_SoundDriver = new OpenSLESDriver; #endif + const uint16_t cart_ID = 0x0000 + | (g_AudioInfo.HEADER[BES(0x3C)] << 8) + | (g_AudioInfo.HEADER[BES(0x3D)] << 0) + ; + hack = cart_ID; WriteTrace(TraceAudioInterface, TraceDebug, "Done (res: true)"); return true; } @@ -272,13 +292,13 @@ extern "C" void UseUnregisteredSetting(int /*SettingID*/) #ifdef _WIN32 void SetTimerResolution(void) { - HMODULE hMod = GetModuleHandle("ntdll.dll"); - if (hMod != NULL) - { - typedef LONG(NTAPI* tNtSetTimerResolution)(IN ULONG DesiredResolution, IN BOOLEAN SetResolution, OUT PULONG CurrentResolution); - tNtSetTimerResolution NtSetTimerResolution = (tNtSetTimerResolution)GetProcAddress(hMod, "NtSetTimerResolution"); - ULONG CurrentResolution = 0; - NtSetTimerResolution(10000, TRUE, &CurrentResolution); - } + HMODULE hMod = GetModuleHandle("ntdll.dll"); + if (hMod != NULL) + { + typedef LONG(NTAPI* tNtSetTimerResolution)(IN ULONG DesiredResolution, IN BOOLEAN SetResolution, OUT PULONG CurrentResolution); + tNtSetTimerResolution NtSetTimerResolution = (tNtSetTimerResolution)GetProcAddress(hMod, "NtSetTimerResolution"); + ULONG CurrentResolution = 0; + NtSetTimerResolution(10000, TRUE, &CurrentResolution); + } } #endif diff --git a/Source/Project64-audio/AudioSettings.cpp b/Source/Project64-audio/AudioSettings.cpp index 34ca1a721..68a45109c 100644 --- a/Source/Project64-audio/AudioSettings.cpp +++ b/Source/Project64-audio/AudioSettings.cpp @@ -31,8 +31,8 @@ CSettings::CSettings() : m_advanced_options(false), m_debugger_enabled(false), m_Volume(100), - m_TinyBuffer(true), - m_FPSBuffer(true), + m_Buffer(4), + m_RoundFreq(false), m_FixedAudio(false), m_SyncAudio(false), m_FullSpeed(true) @@ -50,6 +50,8 @@ CSettings::CSettings() : if (m_Set_FullSpeed != 0) { SettingsRegisterChange(true, m_Set_FullSpeed, this, stSettingsChanged); } if (m_Set_LimitFPS != 0) { SettingsRegisterChange(true, m_Set_LimitFPS, this, stSettingsChanged); } SettingsRegisterChange(false, Set_Volume, this, stSettingsChanged); + SettingsRegisterChange(false, Set_Buffer, this, stSettingsChanged); + SettingsRegisterChange(false, Set_RoundFreq, this, stSettingsChanged); SettingsRegisterChange(false, Set_Logging_MD5, this, stLogLevelChanged); SettingsRegisterChange(false, Set_Logging_Thread, this, stLogLevelChanged); @@ -70,6 +72,8 @@ CSettings::~CSettings() if (m_Set_FullSpeed != 0) { SettingsUnregisterChange(true, m_Set_FullSpeed, this, stSettingsChanged); } if (m_Set_LimitFPS != 0) { SettingsUnregisterChange(true, m_Set_LimitFPS, this, stSettingsChanged); } SettingsUnregisterChange(false, Set_Volume, this, stSettingsChanged); + SettingsUnregisterChange(false, Set_Buffer, this, stSettingsChanged); + SettingsUnregisterChange(false, Set_RoundFreq, this, stSettingsChanged); SettingsUnregisterChange(false, Set_Logging_MD5, this, stLogLevelChanged); SettingsUnregisterChange(false, Set_Logging_Thread, this, stLogLevelChanged); @@ -101,8 +105,8 @@ void CSettings::RegisterSettings(void) RegisterSetting(Set_Logging_InitShutdown, Data_DWORD_General, "InitShutdown", "Logging", g_ModuleLogLevel[TraceAudioInitShutdown], NULL); RegisterSetting(Set_Logging_Interface, Data_DWORD_General, "Interface", "Logging", g_ModuleLogLevel[TraceAudioInterface], NULL); RegisterSetting(Set_Logging_Driver, Data_DWORD_General, "Driver", "Logging", g_ModuleLogLevel[TraceAudioDriver], NULL); - RegisterSetting(Set_TinyBuffer, Data_DWORD_Game, "TinyBuffer", "", (bool)true, NULL); - RegisterSetting(Set_FPSBuffer, Data_DWORD_Game, "FPSBuffer", "", (bool)true, NULL); + RegisterSetting(Set_RoundFreq, Data_DWORD_General, "RoundFrequency", "Settings", (bool)false, NULL); + RegisterSetting(Set_Buffer, Data_DWORD_Game, "Buffer", "", 4, NULL); LogLevelChanged(); } @@ -130,14 +134,14 @@ void CSettings::SetVolume(uint32_t Volume) } } -void CSettings::SetTinyBuffer(bool TinyBuffer) +void CSettings::SetBuffer(uint32_t Buffer) { - SetSetting(Set_TinyBuffer, TinyBuffer ? 1 : 0); + SetSetting(Set_Buffer, Buffer); } -void CSettings::SetFPSBuffer(bool FPSBuffer) +void CSettings::SetRoundFreq(bool RoundFreq) { - SetSetting(Set_FPSBuffer, FPSBuffer ? 1 : 0); + SetSetting(Set_RoundFreq, RoundFreq ? 1 : 0); } void CSettings::LogLevelChanged(void) @@ -153,15 +157,14 @@ void CSettings::LogLevelChanged(void) void CSettings::ReadSettings(void) { bool bLimitFPS = m_Set_LimitFPS ? GetSystemSetting(m_Set_LimitFPS) != 0 : true; - m_Volume = GetSetting(Set_Volume); m_AudioEnabled = m_Set_EnableAudio ? GetSystemSetting(m_Set_EnableAudio) != 0 : true; m_advanced_options = m_Set_basic_mode ? GetSystemSetting(m_Set_basic_mode) == 0 : false; m_debugger_enabled = m_advanced_options && m_Set_debugger ? GetSystemSetting(m_Set_debugger) == 1 : false; - m_TinyBuffer = GetSetting(Set_TinyBuffer) != 0; - m_FPSBuffer = GetSetting(Set_FPSBuffer) != 0; + m_RoundFreq = GetSetting(Set_RoundFreq) != 0; + m_Buffer = GetSetting(Set_Buffer); m_FullSpeed = m_Set_FullSpeed ? GetSystemSetting(m_Set_FullSpeed) != 0 : false; - + m_FixedAudio = m_Set_FixedAudio ? GetSystemSetting(m_Set_FixedAudio) != 0 : false; m_SyncAudio = (!m_advanced_options || bLimitFPS); if (m_Set_log_dir != 0) diff --git a/Source/Project64-audio/AudioSettings.h b/Source/Project64-audio/AudioSettings.h index 334d74099..f6e1e4bbb 100644 --- a/Source/Project64-audio/AudioSettings.h +++ b/Source/Project64-audio/AudioSettings.h @@ -19,18 +19,19 @@ public: inline bool AudioEnabled(void) const { return m_AudioEnabled; } inline bool debugger_enabled(void) const { return m_debugger_enabled; } inline uint32_t GetVolume(void) const { return m_Volume; } - inline bool TinyBuffer(void) const { return m_TinyBuffer; } - inline bool FPSBuffer(void) const { return m_FPSBuffer; } + inline uint32_t GetBuffer(void) const { return m_Buffer; } + inline bool RoundFreq(void) const { return m_RoundFreq; } + inline bool FixedAudio(void) const { return m_FixedAudio; } inline bool SyncAudio(void) const { return m_SyncAudio; } inline bool FullSpeed(void) const { return m_FullSpeed; } inline bool FlushLogs(void) const { return m_FlushLogs; } inline const char * log_dir(void) const { return m_log_dir; } - void SetSyncViaAudioEnabled(bool Enabled); - void SetAudioEnabled(bool Enabled); - void SetVolume(uint32_t Volume); - void SetTinyBuffer(bool TinyBuffer); - void SetFPSBuffer(bool FPSBuffer); + void SetSyncViaAudioEnabled(bool Enabled); + void SetAudioEnabled(bool Enabled); + void SetVolume(uint32_t Volume); + void SetBuffer(uint32_t Buffer); + void SetRoundFreq(bool RoundFreq); void ReadSettings(); private: @@ -62,8 +63,8 @@ private: bool m_advanced_options; bool m_debugger_enabled; uint32_t m_Volume; - bool m_TinyBuffer; - bool m_FPSBuffer; + uint32_t m_Buffer; + bool m_RoundFreq; bool m_FixedAudio; bool m_SyncAudio; bool m_FullSpeed; diff --git a/Source/Project64-audio/ConfigUI.cpp b/Source/Project64-audio/ConfigUI.cpp index 61449d5da..6be994db1 100644 --- a/Source/Project64-audio/ConfigUI.cpp +++ b/Source/Project64-audio/ConfigUI.cpp @@ -54,6 +54,7 @@ public: BEGIN_MSG_MAP(CDebugSettings) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) COMMAND_ID_HANDLER_EX(IDC_MUTE, ItemChanged) + COMMAND_ID_HANDLER_EX(IDC_ROUND, ItemChanged) NOTIFY_HANDLER_EX(IDC_VOLUME, NM_RELEASEDCAPTURE, ItemChangedNotify); CHAIN_MSG_MAP(CPropertyPageImpl) END_MSG_MAP() @@ -68,6 +69,8 @@ public: m_Volume.SetTicFreq(20); m_Volume.SetRangeMin(0); m_Volume.SetRangeMax(100); + m_btnRound.Attach(GetDlgItem(IDC_ROUND)); + m_btnRound.SetCheck(g_settings->RoundFreq() ? BST_CHECKED : BST_UNCHECKED); return TRUE; } @@ -75,6 +78,7 @@ public: { g_settings->SetAudioEnabled(m_btnMute.GetCheck() != BST_CHECKED); g_settings->SetVolume(100 - m_Volume.GetPos()); + g_settings->SetRoundFreq(m_btnRound.GetCheck() == BST_CHECKED); FlushSettings(); return true; } @@ -89,10 +93,12 @@ private: void ItemChanged(UINT /*Code*/, int /*id*/, HWND /*ctl*/) { SendMessage(GetParent(), PSM_CHANGED, (WPARAM)m_hWnd, 0); + g_settings->SetRoundFreq(m_btnRound.GetCheck() == BST_CHECKED); } CTrackBarCtrl m_Volume; CButton m_btnMute; + CButton m_btnRound; }; class CGameSettings : @@ -103,37 +109,40 @@ public: BEGIN_MSG_MAP(CDebugSettings) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) - COMMAND_ID_HANDLER_EX(IDC_TINYBUFFER, ItemChanged) - COMMAND_ID_HANDLER_EX(IDC_FPSBUFFER, ItemChanged) - CHAIN_MSG_MAP(CPropertyPageImpl) + NOTIFY_HANDLER_EX(IDC_BUFFER, NM_RELEASEDCAPTURE, ItemChangedNotify); + CHAIN_MSG_MAP(CPropertyPageImpl) END_MSG_MAP() LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) { - m_btnTinyBuffer.Attach(GetDlgItem(IDC_TINYBUFFER)); - m_btnTinyBuffer.SetCheck(g_settings->TinyBuffer() ? BST_CHECKED : BST_UNCHECKED); - m_btnFPSBuffer.Attach(GetDlgItem(IDC_FPSBUFFER)); - m_btnFPSBuffer.SetCheck(g_settings->FPSBuffer() ? BST_CHECKED : BST_UNCHECKED); + m_Buffer.Attach(GetDlgItem(IDC_BUFFER)); + m_Buffer.SetTicFreq(1); + m_Buffer.SetRangeMin(1); + m_Buffer.SetRangeMax(7); + m_Buffer.SetPos(g_settings->GetBuffer()); return TRUE; } bool OnApply() { - g_settings->SetTinyBuffer(m_btnTinyBuffer.GetCheck() == BST_CHECKED); - g_settings->SetFPSBuffer(m_btnFPSBuffer.GetCheck() == BST_CHECKED); + g_settings->SetBuffer(m_Buffer.GetPos()); FlushSettings(); return true; } private: - CButton m_btnTinyBuffer; - CButton m_btnFPSBuffer; + CTrackBarCtrl m_Buffer; void ItemChanged(UINT /*Code*/, int /*id*/, HWND /*ctl*/) { SendMessage(GetParent(), PSM_CHANGED, (WPARAM)m_hWnd, 0); - g_settings->SetTinyBuffer(m_btnTinyBuffer.GetCheck() == BST_CHECKED); - g_settings->SetFPSBuffer(m_btnFPSBuffer.GetCheck() == BST_CHECKED); + } + + LRESULT ItemChangedNotify(NMHDR* /*pNMHDR*/) + { + SendMessage(GetParent(), PSM_CHANGED, (WPARAM)m_hWnd, 0); + g_settings->SetBuffer(m_Buffer.GetPos()); + return 0; } }; diff --git a/Source/Project64-audio/Driver/DirectSound.cpp b/Source/Project64-audio/Driver/DirectSound.cpp index 26edd6b12..3ce3a130d 100644 --- a/Source/Project64-audio/Driver/DirectSound.cpp +++ b/Source/Project64-audio/Driver/DirectSound.cpp @@ -123,7 +123,7 @@ void DirectSoundDriver::SetFrequency(uint32_t Frequency, uint32_t BufferSize) { WriteTrace(TraceAudioDriver, TraceDebug, "Start (Frequency: 0x%08X)", Frequency); StopAudio(); - m_LOCK_SIZE = (BufferSize * 2); + m_LOCK_SIZE = (BufferSize * 4); SetSegmentSize(m_LOCK_SIZE, Frequency); StartAudio(); diff --git a/Source/Project64-audio/Driver/SoundBase.cpp b/Source/Project64-audio/Driver/SoundBase.cpp index 7c25ae025..ad6f31c0c 100644 --- a/Source/Project64-audio/Driver/SoundBase.cpp +++ b/Source/Project64-audio/Driver/SoundBase.cpp @@ -37,12 +37,7 @@ bool SoundDriverBase::Initialize() void SoundDriverBase::AI_SetFrequency(uint32_t Frequency, uint32_t BufferSize) { SetFrequency(Frequency, BufferSize); - m_MaxBufferSize = (BufferSize * 4); - if (g_settings->TinyBuffer() == true) - { - m_MaxBufferSize = m_MaxBufferSize * 2; - } - m_BufferRemaining = 0; + m_MaxBufferSize = (BufferSize * 8); m_CurrentReadLoc = m_CurrentWriteLoc = m_BufferRemaining = 0; } diff --git a/Source/Project64-audio/Project64-audio.rc b/Source/Project64-audio/Project64-audio.rc index 67865f366..cdee3b106 100644 --- a/Source/Project64-audio/Project64-audio.rc +++ b/Source/Project64-audio/Project64-audio.rc @@ -18,6 +18,7 @@ #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// @@ -58,6 +59,7 @@ BEGIN CONTROL "",IDC_VOLUME,"msctls_trackbar32",TBS_AUTOTICKS | TBS_VERT | TBS_BOTH | WS_BORDER | WS_TABSTOP,8,14,32,67,WS_EX_STATICEDGE GROUPBOX "Volume",IDC_STATIC,3,3,45,94 CONTROL "Mute",IDC_MUTE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,83,32,10 + CONTROL "Rounded Frequencies",IDC_ROUND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,103,85,10 END IDD_LOG_SETTINGS DIALOGEX 0, 0, 311, 177 @@ -83,8 +85,8 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSM CAPTION "Game Settings" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - CONTROL "FPS Buffer",IDC_FPSBUFFER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,18,50,10 - CONTROL "Tiny Buffer",IDC_TINYBUFFER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,36,51,10 + CONTROL "",IDC_BUFFER,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,35,79,240,19 + GROUPBOX "Buffer Size",IDC_BUFFERTEXT,31,67,249,44,BS_CENTER END @@ -139,13 +141,13 @@ BEGIN BEGIN BLOCK "040904b0" BEGIN - VALUE "FileDescription", VER_FILE_DESCRIPTION_STR "\0" - VALUE "FileVersion", VER_FILE_VERSION_STR "\0" - VALUE "InternalName", VER_INTERNAL_NAME_STR "\0" - VALUE "LegalCopyright", VER_COPYRIGHT_STR "\0" + VALUE "FileDescription", VER_FILE_DESCRIPTION_STR "\0" + VALUE "FileVersion", VER_FILE_VERSION_STR "\0" + VALUE "InternalName", VER_INTERNAL_NAME_STR "\0" + VALUE "LegalCopyright", VER_COPYRIGHT_STR "\0" VALUE "OriginalFilename", VER_ORIGINAL_FILENAME_STR "\0" - VALUE "ProductName", VER_PRODUCTNAME_STR - VALUE "ProductVersion", VER_PRODUCT_VERSION_STR "\0" + VALUE "ProductName", VER_PRODUCTNAME_STR + VALUE "ProductVersion", VER_PRODUCT_VERSION_STR "\0" END END BLOCK "VarFileInfo" diff --git a/Source/Project64-audio/SettingsID.h b/Source/Project64-audio/SettingsID.h index f33316e6e..bf89bdde4 100644 --- a/Source/Project64-audio/SettingsID.h +++ b/Source/Project64-audio/SettingsID.h @@ -20,6 +20,6 @@ enum Set_Logging_InitShutdown, Set_Logging_Interface, Set_Logging_Driver, - Set_TinyBuffer, - Set_FPSBuffer, + Set_Buffer, + Set_RoundFreq, }; diff --git a/Source/Project64-audio/resource.h b/Source/Project64-audio/resource.h index 6de6540d9..7fe4f8517 100644 --- a/Source/Project64-audio/resource.h +++ b/Source/Project64-audio/resource.h @@ -9,13 +9,12 @@ #define IDD_CONFIG 9 #define IDD_LOG_SETTINGS 103 #define IDD_GAME_SETTING 104 -#define IDC_BUFFER_DIVIDER 1001 -#define IDC_BUFFER_LEVEL 1002 -#define IDC_VOLUME 1003 -#define IDC_MUTE 1004 -#define IDC_FPSBUFFER 1004 -#define IDC_CHECK2 1005 -#define IDC_TINYBUFFER 1005 +#define VERSION_BUILD 835 +#define IDC_VOLUME 1001 +#define IDC_MUTE 1002 +#define IDC_BUFFER 1003 +#define IDC_ROUND 1004 +#define IDC_BUFFERTEXT 1005 #define IDC_CMB_TRACE_PATH 1019 #define IDC_CMB_TRACE_INIT_SHUTDOWN 1020 #define IDC_CMB_TRACE_INTERFACE 1021