Added an option "Enable Loop Audio Hack" in DSP config.
I know hack is not good but before we find a better way to detect different games, at least this option allows some games to output normal sound without breaking other games. Besides, this commit will hopefully fix the "Unknown device: /dev/usb/hid" issue, but not sure as I have no game to test on this issue. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4623 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
60352d92eb
commit
0f7b1a2f95
|
@ -98,7 +98,7 @@ void Init()
|
||||||
g_DeviceMap[i] = new CWII_IPC_HLE_Device_usb_oh0(i, std::string("/dev/usb/oh0")); i++;
|
g_DeviceMap[i] = new CWII_IPC_HLE_Device_usb_oh0(i, std::string("/dev/usb/oh0")); i++;
|
||||||
g_DeviceMap[i] = new CWII_IPC_HLE_Device_usb_kbd(i, std::string("/dev/usb/kbd")); i++;
|
g_DeviceMap[i] = new CWII_IPC_HLE_Device_usb_kbd(i, std::string("/dev/usb/kbd")); i++;
|
||||||
g_DeviceMap[i] = new CWII_IPC_HLE_Device_sdio_slot0(i, std::string("/dev/sdio/slot0")); i++;
|
g_DeviceMap[i] = new CWII_IPC_HLE_Device_sdio_slot0(i, std::string("/dev/sdio/slot0")); i++;
|
||||||
//g_DeviceMap[i] = new CWII_IPC_HLE_Device_Error(i, std::string("_Unknown_Device_")); i++;
|
g_DeviceMap[i] = new CWII_IPC_HLE_Device_Error(i, std::string("_Unknown_Device_")); i++;
|
||||||
|
|
||||||
g_LastDeviceID = IPC_FIRST_FILEIO_ID;
|
g_LastDeviceID = IPC_FIRST_FILEIO_ID;
|
||||||
}
|
}
|
||||||
|
@ -287,7 +287,10 @@ void ExecuteCommand(u32 _Address)
|
||||||
if (DeviceName.find("/dev/") != std::string::npos)
|
if (DeviceName.find("/dev/") != std::string::npos)
|
||||||
{
|
{
|
||||||
ERROR_LOG(WII_IPC_FILEIO, "Unknown device: %s", DeviceName.c_str());
|
ERROR_LOG(WII_IPC_FILEIO, "Unknown device: %s", DeviceName.c_str());
|
||||||
PanicAlert("Unknown device: %s", DeviceName.c_str());
|
PanicAlert("Unknown device: %s\n\nMaybe you can continue to play or maybe the game will freeze.", DeviceName.c_str());
|
||||||
|
|
||||||
|
pDevice = AccessDeviceByID(GetDeviceIDByName(std::string("_Unknown_Device_")));
|
||||||
|
CmdSuccess = pDevice->Open(_Address, Mode);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -33,8 +33,9 @@ public:
|
||||||
|
|
||||||
virtual bool Open(u32 _CommandAddress, u32 _Mode)
|
virtual bool Open(u32 _CommandAddress, u32 _Mode)
|
||||||
{
|
{
|
||||||
PanicAlert("CWII_IPC_HLE_Device_Error");
|
//PanicAlert("CWII_IPC_HLE_Device_Error");
|
||||||
Memory::Write_U32(GetDeviceID(), _CommandAddress+4);
|
//Memory::Write_U32(GetDeviceID(), _CommandAddress+4);
|
||||||
|
Memory::Write_U32(0, _CommandAddress+4);
|
||||||
m_Active = true;
|
m_Active = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,7 @@ void CConfig::Load()
|
||||||
file.Load(FULL_CONFIG_DIR "DSP.ini");
|
file.Load(FULL_CONFIG_DIR "DSP.ini");
|
||||||
file.Get("Config", "EnableHLEAudio", &m_EnableHLEAudio, true); // Sound Settings
|
file.Get("Config", "EnableHLEAudio", &m_EnableHLEAudio, true); // Sound Settings
|
||||||
file.Get("Config", "EnableRE0AudioFix", &m_EnableRE0Fix, false); // RE0 Hack
|
file.Get("Config", "EnableRE0AudioFix", &m_EnableRE0Fix, false); // RE0 Hack
|
||||||
|
file.Get("Config", "EnableLoopAudioFix", &m_EnableLoopFix, false); // Loop Hack
|
||||||
ac_Config.Load(file);
|
ac_Config.Load(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,6 +45,7 @@ void CConfig::Save()
|
||||||
file.Load(FULL_CONFIG_DIR "DSP.ini");
|
file.Load(FULL_CONFIG_DIR "DSP.ini");
|
||||||
file.Set("Config", "EnableHLEAudio", m_EnableHLEAudio); // Sound Settings
|
file.Set("Config", "EnableHLEAudio", m_EnableHLEAudio); // Sound Settings
|
||||||
file.Set("Config", "EnableRE0AudioFix", m_EnableRE0Fix); // RE0 Hack
|
file.Set("Config", "EnableRE0AudioFix", m_EnableRE0Fix); // RE0 Hack
|
||||||
|
file.Set("Config", "EnableLoopAudioFix", m_EnableLoopFix); // Loop Hack
|
||||||
ac_Config.Set(file);
|
ac_Config.Set(file);
|
||||||
|
|
||||||
file.Save(FULL_CONFIG_DIR "DSP.ini");
|
file.Save(FULL_CONFIG_DIR "DSP.ini");
|
||||||
|
@ -51,11 +53,17 @@ void CConfig::Save()
|
||||||
|
|
||||||
void CConfig::GameIniLoad(const char *game_ini)
|
void CConfig::GameIniLoad(const char *game_ini)
|
||||||
{
|
{
|
||||||
|
// This game config will affect global system config
|
||||||
|
// Need a better way to seperate system config from game config
|
||||||
|
//
|
||||||
|
/*
|
||||||
if (game_ini && strlen(game_ini))
|
if (game_ini && strlen(game_ini))
|
||||||
{
|
{
|
||||||
IniFile iniFile;
|
IniFile iniFile;
|
||||||
iniFile.Load(game_ini);
|
iniFile.Load(game_ini);
|
||||||
iniFile.Get("HLEaudio", "UseRE0Fix", &m_EnableRE0Fix, 0);
|
//iniFile.Get("HLEaudio", "UseRE0Fix", &m_EnableRE0Fix, 0);
|
||||||
|
//iniFile.Get("HLEaudio", "UseLoopFix", &m_EnableLoopFix, 0);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@ struct CConfig
|
||||||
{
|
{
|
||||||
bool m_EnableHLEAudio;
|
bool m_EnableHLEAudio;
|
||||||
bool m_EnableRE0Fix;
|
bool m_EnableRE0Fix;
|
||||||
|
bool m_EnableLoopFix;
|
||||||
|
|
||||||
CConfig();
|
CConfig();
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@ EVT_CHECKBOX(ID_ENABLE_HLE_AUDIO, DSPConfigDialogHLE::SettingsChanged)
|
||||||
EVT_CHECKBOX(ID_ENABLE_DTK_MUSIC, DSPConfigDialogHLE::SettingsChanged)
|
EVT_CHECKBOX(ID_ENABLE_DTK_MUSIC, DSPConfigDialogHLE::SettingsChanged)
|
||||||
EVT_CHECKBOX(ID_ENABLE_THROTTLE, DSPConfigDialogHLE::SettingsChanged)
|
EVT_CHECKBOX(ID_ENABLE_THROTTLE, DSPConfigDialogHLE::SettingsChanged)
|
||||||
EVT_CHECKBOX(ID_ENABLE_RE0_FIX, DSPConfigDialogHLE::SettingsChanged)
|
EVT_CHECKBOX(ID_ENABLE_RE0_FIX, DSPConfigDialogHLE::SettingsChanged)
|
||||||
|
EVT_CHECKBOX(ID_ENABLE_LOOP_FIX, DSPConfigDialogHLE::SettingsChanged)
|
||||||
EVT_COMMAND_SCROLL(ID_VOLUME, DSPConfigDialogHLE::VolumeChanged)
|
EVT_COMMAND_SCROLL(ID_VOLUME, DSPConfigDialogHLE::VolumeChanged)
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
@ -40,7 +41,8 @@ DSPConfigDialogHLE::DSPConfigDialogHLE(wxWindow *parent, wxWindowID id, const wx
|
||||||
m_buttonEnableHLEAudio = new wxCheckBox(this, ID_ENABLE_HLE_AUDIO, wxT("Enable HLE Audio"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
m_buttonEnableHLEAudio = new wxCheckBox(this, ID_ENABLE_HLE_AUDIO, wxT("Enable HLE Audio"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||||
m_buttonEnableDTKMusic = new wxCheckBox(this, ID_ENABLE_DTK_MUSIC, wxT("Enable DTK Music"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
m_buttonEnableDTKMusic = new wxCheckBox(this, ID_ENABLE_DTK_MUSIC, wxT("Enable DTK Music"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||||
m_buttonEnableThrottle = new wxCheckBox(this, ID_ENABLE_THROTTLE, wxT("Enable Other Audio (Throttle)"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
m_buttonEnableThrottle = new wxCheckBox(this, ID_ENABLE_THROTTLE, wxT("Enable Other Audio (Throttle)"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||||
m_buttonEnableRE0Fix = new wxCheckBox(this, ID_ENABLE_RE0_FIX, wxT("Enable RE0 Audio Fix"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
m_buttonEnableRE0Fix = new wxCheckBox(this, ID_ENABLE_RE0_FIX, wxT("Enable RE0 Audio Hack"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||||
|
m_buttonEnableLoopFix = new wxCheckBox(this, ID_ENABLE_LOOP_FIX, wxT("Enable Loop Audio Hack"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||||
wxStaticText *BackendText = new wxStaticText(this, wxID_ANY, wxT("Audio Backend"), wxDefaultPosition, wxDefaultSize, 0);
|
wxStaticText *BackendText = new wxStaticText(this, wxID_ANY, wxT("Audio Backend"), wxDefaultPosition, wxDefaultSize, 0);
|
||||||
m_BackendSelection = new wxComboBox(this, ID_BACKEND, wxEmptyString, wxDefaultPosition, wxSize(90, 20), wxArrayBackends, wxCB_READONLY, wxDefaultValidator);
|
m_BackendSelection = new wxComboBox(this, ID_BACKEND, wxEmptyString, wxDefaultPosition, wxSize(90, 20), wxArrayBackends, wxCB_READONLY, wxDefaultValidator);
|
||||||
|
|
||||||
|
@ -49,9 +51,10 @@ DSPConfigDialogHLE::DSPConfigDialogHLE(wxWindow *parent, wxWindowID id, const wx
|
||||||
|
|
||||||
// Update values
|
// Update values
|
||||||
m_buttonEnableHLEAudio->SetValue(g_Config.m_EnableHLEAudio ? true : false);
|
m_buttonEnableHLEAudio->SetValue(g_Config.m_EnableHLEAudio ? true : false);
|
||||||
m_buttonEnableRE0Fix->SetValue(g_Config.m_EnableRE0Fix ? true : false);
|
|
||||||
m_buttonEnableDTKMusic->SetValue(ac_Config.m_EnableDTKMusic ? true : false);
|
m_buttonEnableDTKMusic->SetValue(ac_Config.m_EnableDTKMusic ? true : false);
|
||||||
m_buttonEnableThrottle->SetValue(ac_Config.m_EnableThrottle ? true : false);
|
m_buttonEnableThrottle->SetValue(ac_Config.m_EnableThrottle ? true : false);
|
||||||
|
m_buttonEnableRE0Fix->SetValue(g_Config.m_EnableRE0Fix ? true : false);
|
||||||
|
m_buttonEnableLoopFix->SetValue(g_Config.m_EnableLoopFix ? true : false);
|
||||||
|
|
||||||
// Add tooltips
|
// Add tooltips
|
||||||
m_buttonEnableHLEAudio->SetToolTip(wxT("This is the most common sound type"));
|
m_buttonEnableHLEAudio->SetToolTip(wxT("This is the most common sound type"));
|
||||||
|
@ -59,7 +62,10 @@ DSPConfigDialogHLE::DSPConfigDialogHLE(wxWindow *parent, wxWindowID id, const wx
|
||||||
m_buttonEnableThrottle->SetToolTip(wxT("This is sometimes used together with pre-rendered movies.\n")
|
m_buttonEnableThrottle->SetToolTip(wxT("This is sometimes used together with pre-rendered movies.\n")
|
||||||
wxT("Disabling this also disables the speed throttle which this causes,\n")
|
wxT("Disabling this also disables the speed throttle which this causes,\n")
|
||||||
wxT("meaning that there will be no upper limit on your FPS."));
|
wxT("meaning that there will be no upper limit on your FPS."));
|
||||||
m_buttonEnableRE0Fix->SetToolTip(wxT("This fixes audo in RE0 and maybe some other games."));
|
m_buttonEnableRE0Fix->SetToolTip(wxT("This fixes audio in Resident Evil Zero and maybe some other games."));
|
||||||
|
m_buttonEnableLoopFix->SetToolTip(wxT("This fixes audio loops in some games, by default it should be disabled.\n")
|
||||||
|
wxT("Unless you are experiencing strange sound loops, don't enable it,\n")
|
||||||
|
wxT("or it will cause some games to hang up."));
|
||||||
m_BackendSelection->SetToolTip(wxT("Changing this will have no effect while the emulator is running!"));
|
m_BackendSelection->SetToolTip(wxT("Changing this will have no effect while the emulator is running!"));
|
||||||
|
|
||||||
// Create sizer and add items to dialog
|
// Create sizer and add items to dialog
|
||||||
|
@ -73,6 +79,7 @@ DSPConfigDialogHLE::DSPConfigDialogHLE(wxWindow *parent, wxWindowID id, const wx
|
||||||
sbSettings->Add(m_buttonEnableDTKMusic, 0, wxALL, 5);
|
sbSettings->Add(m_buttonEnableDTKMusic, 0, wxALL, 5);
|
||||||
sbSettings->Add(m_buttonEnableThrottle, 0, wxALL, 5);
|
sbSettings->Add(m_buttonEnableThrottle, 0, wxALL, 5);
|
||||||
sbSettings->Add(m_buttonEnableRE0Fix, 0, wxALL, 5);
|
sbSettings->Add(m_buttonEnableRE0Fix, 0, wxALL, 5);
|
||||||
|
sbSettings->Add(m_buttonEnableLoopFix, 0, wxALL, 5);
|
||||||
sBackend->Add(BackendText, 0, wxALIGN_CENTER|wxALL, 5);
|
sBackend->Add(BackendText, 0, wxALIGN_CENTER|wxALL, 5);
|
||||||
sBackend->Add(m_BackendSelection, 0, wxALL, 1);
|
sBackend->Add(m_BackendSelection, 0, wxALL, 1);
|
||||||
sbSettings->Add(sBackend, 0, wxALL, 2);
|
sbSettings->Add(sBackend, 0, wxALL, 2);
|
||||||
|
@ -129,9 +136,10 @@ void DSPConfigDialogHLE::VolumeChanged(wxScrollEvent& WXUNUSED(event))
|
||||||
void DSPConfigDialogHLE::SettingsChanged(wxCommandEvent& event)
|
void DSPConfigDialogHLE::SettingsChanged(wxCommandEvent& event)
|
||||||
{
|
{
|
||||||
g_Config.m_EnableHLEAudio = m_buttonEnableHLEAudio->GetValue();
|
g_Config.m_EnableHLEAudio = m_buttonEnableHLEAudio->GetValue();
|
||||||
g_Config.m_EnableRE0Fix = m_buttonEnableRE0Fix->GetValue();
|
|
||||||
ac_Config.m_EnableDTKMusic = m_buttonEnableDTKMusic->GetValue();
|
ac_Config.m_EnableDTKMusic = m_buttonEnableDTKMusic->GetValue();
|
||||||
ac_Config.m_EnableThrottle = m_buttonEnableThrottle->GetValue();
|
ac_Config.m_EnableThrottle = m_buttonEnableThrottle->GetValue();
|
||||||
|
g_Config.m_EnableRE0Fix = m_buttonEnableRE0Fix->GetValue();
|
||||||
|
g_Config.m_EnableLoopFix = m_buttonEnableLoopFix->GetValue();
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
strncpy(ac_Config.sBackend, m_BackendSelection->GetValue().mb_str(), 128);
|
strncpy(ac_Config.sBackend, m_BackendSelection->GetValue().mb_str(), 128);
|
||||||
|
|
|
@ -47,6 +47,7 @@ private:
|
||||||
wxCheckBox *m_buttonEnableDTKMusic;
|
wxCheckBox *m_buttonEnableDTKMusic;
|
||||||
wxCheckBox *m_buttonEnableThrottle;
|
wxCheckBox *m_buttonEnableThrottle;
|
||||||
wxCheckBox *m_buttonEnableRE0Fix;
|
wxCheckBox *m_buttonEnableRE0Fix;
|
||||||
|
wxCheckBox *m_buttonEnableLoopFix;
|
||||||
wxArrayString wxArrayBackends;
|
wxArrayString wxArrayBackends;
|
||||||
wxComboBox *m_BackendSelection;
|
wxComboBox *m_BackendSelection;
|
||||||
|
|
||||||
|
@ -57,6 +58,7 @@ private:
|
||||||
ID_ENABLE_DTK_MUSIC,
|
ID_ENABLE_DTK_MUSIC,
|
||||||
ID_ENABLE_THROTTLE,
|
ID_ENABLE_THROTTLE,
|
||||||
ID_ENABLE_RE0_FIX,
|
ID_ENABLE_RE0_FIX,
|
||||||
|
ID_ENABLE_LOOP_FIX,
|
||||||
ID_BACKEND,
|
ID_BACKEND,
|
||||||
ID_VOLUME
|
ID_VOLUME
|
||||||
};
|
};
|
||||||
|
|
|
@ -21,8 +21,9 @@
|
||||||
#include "UCodes.h"
|
#include "UCodes.h"
|
||||||
#include "UCode_AX_ADPCM.h"
|
#include "UCode_AX_ADPCM.h"
|
||||||
#include "UCode_AX.h"
|
#include "UCode_AX.h"
|
||||||
#include "../main.h"
|
|
||||||
#include "Mixer.h"
|
#include "Mixer.h"
|
||||||
|
#include "../main.h"
|
||||||
|
#include "../Config.h"
|
||||||
|
|
||||||
// ----------------------------------------------------
|
// ----------------------------------------------------
|
||||||
// Externals
|
// Externals
|
||||||
|
@ -92,7 +93,6 @@ inline void MixAddVoice(ParamBlockType &pb, int *templbuffer, int *temprbuffer,
|
||||||
// =============
|
// =============
|
||||||
if (pb.running)
|
if (pb.running)
|
||||||
{
|
{
|
||||||
|
|
||||||
// Read initial parameters
|
// Read initial parameters
|
||||||
// ------------
|
// ------------
|
||||||
//constants
|
//constants
|
||||||
|
@ -191,7 +191,9 @@ inline void MixAddVoice(ParamBlockType &pb, int *templbuffer, int *temprbuffer,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AUDIOFORMAT_ADPCM:
|
case AUDIOFORMAT_ADPCM:
|
||||||
sample = ADPCM_Step(pb.adpcm, samplePos, newSamplePos, frac);
|
u32 toSamplePos;
|
||||||
|
toSamplePos = (newSamplePos > sampleEnd) ? sampleEnd : newSamplePos;
|
||||||
|
sample = ADPCM_Step(pb.adpcm, samplePos, toSamplePos, frac);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -246,7 +248,7 @@ inline void MixAddVoice(ParamBlockType &pb, int *templbuffer, int *temprbuffer,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (Wii && (_uCode == UCODE_AXWII))
|
if (!g_Config.m_EnableLoopFix && Wii && (_uCode == UCODE_AXWII))
|
||||||
{
|
{
|
||||||
// This accurate boundary wrapping will fix the hangup in many AXWii games like:
|
// This accurate boundary wrapping will fix the hangup in many AXWii games like:
|
||||||
// New Super Mario Bros.Wii, Fatal Frame 4, Resident Evil Darkside Chronicles
|
// New Super Mario Bros.Wii, Fatal Frame 4, Resident Evil Darkside Chronicles
|
||||||
|
@ -261,7 +263,9 @@ inline void MixAddVoice(ParamBlockType &pb, int *templbuffer, int *temprbuffer,
|
||||||
{
|
{
|
||||||
pb.running = 0;
|
pb.running = 0;
|
||||||
}
|
}
|
||||||
|
// not sure if this will mute the unwanted over looping sound
|
||||||
|
pb.mixer.volume_left = 0;
|
||||||
|
pb.mixer.volume_right = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue