diff --git a/common/build/Utilities/Utilities.cbp b/common/build/Utilities/Utilities.cbp
index bd9a6ac593..ba2862ca5b 100644
--- a/common/build/Utilities/Utilities.cbp
+++ b/common/build/Utilities/Utilities.cbp
@@ -19,8 +19,6 @@
-
-
@@ -63,15 +61,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
@@ -83,12 +93,12 @@
-
-
+
+
-
-
+
+
diff --git a/pcsx2-codeblocks.workspace b/pcsx2-codeblocks.workspace
index 6aa305ae6e..0f78b59918 100644
--- a/pcsx2-codeblocks.workspace
+++ b/pcsx2-codeblocks.workspace
@@ -1,12 +1,7 @@
-
-
-
-
-
-
+
@@ -22,6 +17,6 @@
-
+
diff --git a/pcsx2/GSState.cpp b/pcsx2/GSState.cpp
index da4838d350..6236e78748 100644
--- a/pcsx2/GSState.cpp
+++ b/pcsx2/GSState.cpp
@@ -1,6 +1,6 @@
/* PCSX2 - PS2 Emulator for PCs
* Copyright (C) 2002-2009 PCSX2 Dev Team
- *
+ *
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
* of the GNU Lesser General Public License as published by the Free Software Found-
* ation, either version 3 of the License, or (at your option) any later version.
@@ -16,6 +16,7 @@
#include "PrecompiledHeader.h"
#include "GS.h"
+#include
#ifdef PCSX2_DEVBUILD
void SaveGSState(const wxString& file)
@@ -134,7 +135,7 @@ void RunGSState( gzLoadingState& f )
*(u32*)(PS2MEM_GS+0x1000) = (*(u32*)(PS2MEM_GS+0x1000) & ~(1<<13)) | newfield;
GSvsync(newfield);
-
+
// fixme : Process pending app messages here.
//SysUpdate();
@@ -150,4 +151,4 @@ void RunGSState( gzLoadingState& f )
it = packets.begin();
}
}
-#endif
\ No newline at end of file
+#endif
diff --git a/pcsx2/IPU/mpeg2lib/Mpeg.cpp b/pcsx2/IPU/mpeg2lib/Mpeg.cpp
index 3c8cc3451c..de153b1274 100644
--- a/pcsx2/IPU/mpeg2lib/Mpeg.cpp
+++ b/pcsx2/IPU/mpeg2lib/Mpeg.cpp
@@ -1130,9 +1130,6 @@ void __forceinline finishmpeg2sliceIDEC(decoder_t* &decoder)
waitForSCD();
}
-// This fixes Mana Khemia if uncommented, but needs testing.
-// Breaks Figital Devil Saga.
-//#define ALWAYS_RESUME_BEFORE_EXITING
void mpeg2sliceIDEC(void* pdone)
{
u32 read;
diff --git a/pcsx2/Linux/pcsx2.cbp b/pcsx2/Linux/pcsx2.cbp
index 0a192f3482..d28cef9363 100644
--- a/pcsx2/Linux/pcsx2.cbp
+++ b/pcsx2/Linux/pcsx2.cbp
@@ -164,9 +164,9 @@
-
-
-
+
+
+
@@ -268,8 +268,8 @@
-
-
+
+
diff --git a/plugins/SPU2null/Linux/Config.h b/plugins/SPU2null/Linux/Config.h
index ea196262a9..90b6a3c21c 100644
--- a/plugins/SPU2null/Linux/Config.h
+++ b/plugins/SPU2null/Linux/Config.h
@@ -14,17 +14,19 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
+ */
+
#include
#include
#include
#include
using namespace std;
-void SaveConf();
-void LoadConf();
+extern void SaveConf();
+extern void LoadConf();
extern string s_strIniPath;
+extern GtkWidget *MsgDlg;
+exter void OnMsg_Ok();
#define is_checked(main_widget, widget_name) (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(main_widget, widget_name))))
#define set_checked(main_widget,widget_name, state) gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(lookup_widget(main_widget, widget_name)), state)
diff --git a/plugins/spu2-x/src/Linux/Alsa.cpp b/plugins/spu2-x/src/Linux/Alsa.cpp
index 8f6cfa0484..41b2224a49 100644
--- a/plugins/spu2-x/src/Linux/Alsa.cpp
+++ b/plugins/spu2-x/src/Linux/Alsa.cpp
@@ -1,6 +1,6 @@
/* SPU2-X, A plugin for Emulating the Sound Processing Unit of the Playstation 2
* Developed and maintained by the Pcsx2 Development Team.
- *
+ *
* Original portions from SPU2ghz are (c) 2008 by David Quintana [gigaherz]
*
* SPU2-X is free software: you can redistribute it and/or modify it under the terms
@@ -34,7 +34,7 @@ protected:
snd_pcm_t *handle;
snd_pcm_uframes_t buffer_size;
snd_async_handler_t *pcm_callback;
-
+
uint period_time;
uint buffer_time;
@@ -70,7 +70,7 @@ protected:
// Not sure if we just need an assert, or something like this:
//if( data->handle != snd_async_handler_get_pcm(pcm_callback) ) return;
-
+
data->_InternalCallback();
}
@@ -87,60 +87,60 @@ public:
handle = NULL;
pcm_callback = NULL;
pspeed = SAMPLE_RATE;
-
+
// buffer time and period time are in microseconds...
// (don't simplify the equation below -- it'll just cause integer rounding errors.
period_time = (SndOutPacketSize*1000) / (SampleRate / 1000);
buffer_time = period_time * NumBuffers;
int err;
-
+
err = snd_pcm_open(&handle, "default", SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK);
- if(err < 0)
+ if(err < 0)
{
ERROR_LOG("Audio open error: %s\n", snd_strerror(err));
return -1;
}
-
+
err = snd_pcm_nonblock(handle, 0);
- if(err < 0)
+ if(err < 0)
{
ERROR_LOG("Can't set blocking mode: %s\n", snd_strerror(err));
return -1;
}
-
+
snd_pcm_hw_params_alloca(&hwparams);
snd_pcm_sw_params_alloca(&swparams);
-
+
err = snd_pcm_hw_params_any(handle, hwparams);
- if (err < 0)
+ if (err < 0)
{
ERROR_LOG("Broken configuration for this PCM: %s\n", snd_strerror(err));
return -1;
}
-
+
err = snd_pcm_hw_params_set_access(handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED);
- if (err < 0)
+ if (err < 0)
{
ERROR_LOG("Access type not available: %s\n", snd_strerror(err));
return -1;
}
err = snd_pcm_hw_params_set_format(handle, hwparams, format);
- if (err < 0)
+ if (err < 0)
{
ERROR_LOG("Sample format not available: %s\n", snd_strerror(err));
return -1;
}
-
+
err = snd_pcm_hw_params_set_channels(handle, hwparams, pchannels);
- if (err < 0)
+ if (err < 0)
{
ERROR_LOG("Channels count not available: %s\n", snd_strerror(err));
return -1;
}
err = snd_pcm_hw_params_set_rate_near(handle, hwparams, &pspeed, 0);
- if (err < 0)
+ if (err < 0)
{
ERROR_LOG("Rate not available: %s\n", snd_strerror(err));
return -1;
@@ -151,31 +151,31 @@ public:
ERROR_LOG("Buffer time error: %s\n", snd_strerror(err));
return -1;
}
-
+
err = snd_pcm_hw_params_set_period_time_near(handle, hwparams, &period_time, 0);
if (err < 0)
{
ERROR_LOG("Period time error: %s\n", snd_strerror(err));
return -1;
}
-
+
err = snd_pcm_hw_params(handle, hwparams);
- if (err < 0)
+ if (err < 0)
{
ERROR_LOG("Unable to install hw params: %s\n", snd_strerror(err));
return -1;
}
-
+
snd_pcm_status_alloca(&status);
err = snd_pcm_status(handle, status);
- if(err < 0)
+ if(err < 0)
{
ERROR_LOG("Unable to get status: %s\n", snd_strerror(err));
return -1;
}
// Bind our asynchronous callback magic:
-
+
snd_async_add_pcm_handler( &pcm_callback, handle, ExternalCallback, this );
snd_pcm_start( handle );
@@ -199,7 +199,7 @@ public:
}
virtual bool Is51Out() const { return false; }
-
+
s32 Test() const
{
return 0;
@@ -210,7 +210,7 @@ public:
if(handle == NULL) return 0;
// Returns the amount of free buffer space, in samples.
- uint l = snd_pcm_avail_update(handle);
+ uint l = snd_pcm_avail_update(handle);
if( l < 0 ) return 0;
return (l / 1000) * (SampleRate / 1000);
}
@@ -234,4 +234,4 @@ public:
}
} static Alsa;
-SndOutModule *AlsaOut = &Alsa;
+SndOutModule *AlsaOut = &Alsa;
diff --git a/plugins/spu2-x/src/Linux/Config.cpp b/plugins/spu2-x/src/Linux/Config.cpp
index c896779f41..bdb995b36f 100644
--- a/plugins/spu2-x/src/Linux/Config.cpp
+++ b/plugins/spu2-x/src/Linux/Config.cpp
@@ -1,6 +1,6 @@
/* SPU2-X, A plugin for Emulating the Sound Processing Unit of the Playstation 2
* Developed and maintained by the Pcsx2 Development Team.
- *
+ *
* Original portions from SPU2ghz are (c) 2008 by David Quintana [gigaherz]
*
* SPU2-X is free software: you can redistribute it and/or modify it under the terms
@@ -97,8 +97,12 @@ void WriteSettings()
{
}
-
+
void configure()
{
ReadSettings();
}
+
+void SysMessage(char const*, ...)
+{
+}
diff --git a/plugins/spu2-x/src/Linux/SPU2-X.cbp b/plugins/spu2-x/src/Linux/SPU2-X.cbp
index 9327345b9c..f127945b60 100644
--- a/plugins/spu2-x/src/Linux/SPU2-X.cbp
+++ b/plugins/spu2-x/src/Linux/SPU2-X.cbp
@@ -7,9 +7,9 @@
-
+
-
+
@@ -17,9 +17,9 @@
-
+
-
+
@@ -35,17 +35,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -89,7 +115,6 @@
-
@@ -109,6 +134,7 @@
+
diff --git a/plugins/spu2-x/src/Spu2.cpp b/plugins/spu2-x/src/Spu2.cpp
index 7928a8f0f2..0a4fb62713 100644
--- a/plugins/spu2-x/src/Spu2.cpp
+++ b/plugins/spu2-x/src/Spu2.cpp
@@ -1,6 +1,6 @@
/* SPU2-X, A plugin for Emulating the Sound Processing Unit of the Playstation 2
* Developed and maintained by the Pcsx2 Development Team.
- *
+ *
* Original portions from SPU2ghz are (c) 2008 by David Quintana [gigaherz]
*
* SPU2-X is free software: you can redistribute it and/or modify it under the terms
@@ -67,8 +67,7 @@ void SetIrqCall()
has_to_call_irq=true;
}
-#ifdef _MSC_VER
-void SysMessage(const char *fmt, ...)
+void SysMessage(const char *fmt, ...)
{
va_list list;
char tmp[512];
@@ -80,9 +79,6 @@ void SysMessage(const char *fmt, ...)
swprintf_s(wtmp, L"%S", tmp);
MessageBox(0, wtmp, L"SPU2-X System Message", 0);
}
-#else
-extern void SysMessage(const char *fmt, ...);
-#endif
__forceinline s16 * __fastcall GetMemPtr(u32 addr)
{
@@ -135,9 +131,9 @@ V_Core::V_Core()
void V_Core::Reset()
{
memset( this, 0, sizeof(V_Core) );
-
+
const int c = (this == Cores) ? 0 : 1;
-
+
Regs.STATX=0;
Regs.ATTR=0;
ExtVol = V_VolumeLR::Max;
@@ -158,7 +154,7 @@ void V_Core::Reset()
DryGate.SndR = -1;
WetGate.SndL = -1;
WetGate.SndR = -1;
-
+
Regs.MMIX = 0xFFCF;
Regs.VMIXL = 0xFFFFFF;
Regs.VMIXR = 0xFFFFFF;
@@ -169,16 +165,16 @@ void V_Core::Reset()
FxEnable=0;
IRQA=0xFFFF0;
IRQEnable=1;
-
+
for( uint v=0; v0)
+ if(Cores[0].DMAICounter>0)
{
Cores[0].DMAICounter-=TickInterval;
if(Cores[0].DMAICounter<=0)
@@ -427,7 +423,7 @@ __forceinline void TimeUpdate(u32 cClocks)
}
//Update DMA7 interrupt delay counter
- if(Cores[1].DMAICounter>0)
+ if(Cores[1].DMAICounter>0)
{
Cores[1].DMAICounter-=TickInterval;
if(Cores[1].DMAICounter<=0)
@@ -506,7 +502,7 @@ void V_VolumeSlide::RegSet( u16 src )
Value = GetVol32( src );
}
-void SPU_ps1_write(u32 mem, u16 value)
+void SPU_ps1_write(u32 mem, u16 value)
{
bool show=true;
@@ -530,7 +526,7 @@ void SPU_ps1_write(u32 mem, u16 value)
Cores[0].Voices[voice].Volume.Right.RegSet( value << 1 );
Cores[0].Voices[voice].Volume.Right.Reg_VOL = value;
break;
-
+
case 2: Cores[0].Voices[voice].Pitch = value; break;
case 3: Cores[0].Voices[voice].StartA = (u32)value<<8; break;
@@ -549,7 +545,7 @@ void SPU_ps1_write(u32 mem, u16 value)
Cores[0].Voices[voice].ADSR.ReleaseRate = (value & 0x1F);
Cores[0].Voices[voice].ADSR.Reg_ADSR2 = value;
break;
-
+
case 6:
Cores[0].Voices[voice].ADSR.Value = ((s32)value<<16) | value;
ConLog( "* SPU2: Mysterious ADSR Volume Set to 0x%x", value );
@@ -598,7 +594,7 @@ void SPU_ps1_write(u32 mem, u16 value)
case 0x1d90:// Channel FM (pitch lfo) mode (0-15)
SPU2_FastWrite(REG_S_PMON,value);
break;
-
+
case 0x1d92:// Channel FM (pitch lfo) mode (16-23)
SPU2_FastWrite(REG_S_PMON+2,value);
break;
@@ -607,7 +603,7 @@ void SPU_ps1_write(u32 mem, u16 value)
case 0x1d94:// Channel Noise mode (0-15)
SPU2_FastWrite(REG_S_NON,value);
break;
-
+
case 0x1d96:// Channel Noise mode (16-23)
SPU2_FastWrite(REG_S_NON+2,value);
break;
@@ -616,17 +612,17 @@ void SPU_ps1_write(u32 mem, u16 value)
SPU2_FastWrite(REG_S_VMIXEL,value);
SPU2_FastWrite(REG_S_VMIXER,value);
break;
-
+
case 0x1d9a:// Channel Reverb mode (16-23)
SPU2_FastWrite(REG_S_VMIXEL+2,value);
SPU2_FastWrite(REG_S_VMIXER+2,value);
break;
-
+
case 0x1d9c:// Channel Reverb mode (0-15)
SPU2_FastWrite(REG_S_VMIXL,value);
SPU2_FastWrite(REG_S_VMIXR,value);
break;
-
+
case 0x1d9e:// Channel Reverb mode (16-23)
SPU2_FastWrite(REG_S_VMIXL+2,value);
SPU2_FastWrite(REG_S_VMIXR+2,value);
@@ -640,7 +636,7 @@ void SPU_ps1_write(u32 mem, u16 value)
SPU2_FastWrite(REG_A_ESA+2,val>>16);
}
break;
-
+
case 0x1da4:
Cores[0].IRQA=(u32)value<<8;
break;
@@ -668,7 +664,7 @@ void SPU_ps1_write(u32 mem, u16 value)
spu2Ru16(mem)=value;
}
-u16 SPU_ps1_read(u32 mem)
+u16 SPU_ps1_read(u32 mem)
{
bool show=true;
u16 value = spu2Ru16(mem);
@@ -687,13 +683,13 @@ u16 SPU_ps1_read(u32 mem)
//value=Cores[0].Voices[voice].VolumeL.Value;
value = Cores[0].Voices[voice].Volume.Left.Reg_VOL;
break;
-
+
case 1: //VOLR (Volume R)
//value=Cores[0].Voices[voice].VolumeR.Mode;
//value=Cores[0].Voices[voice].VolumeR.Value;
value = Cores[0].Voices[voice].Volume.Right.Reg_VOL;
break;
-
+
case 2: value = Cores[0].Voices[voice].Pitch; break;
case 3: value = Cores[0].Voices[voice].StartA; break;
case 4: value = Cores[0].Voices[voice].ADSR.Reg_ADSR1; break;
@@ -802,13 +798,13 @@ __forceinline void SPU2_FastWrite( u32 rmem, u16 value )
if (mem & 0x400) { omem^=0x400; core=1; }
if (omem < 0x0180) // Voice Params
- {
+ {
const u32 voice = (omem & 0x1F0) >> 4;
const u32 param = (omem & 0xF) >> 1;
V_Voice& thisvoice = Cores[core].Voices[voice];
- switch (param)
- {
+ switch (param)
+ {
case 0: //VOLL (Volume L)
case 1: //VOLR (Volume R)
{
@@ -852,7 +848,7 @@ __forceinline void SPU2_FastWrite( u32 rmem, u16 value )
thisvoice.ADSR.Value = (value << 16) | value;
ConLog( "* SPU2: Mysterious ADSR Volume Set to 0x%x", value );
break;
-
+
case 6: thisvoice.Volume.Left.RegSet( value ); break;
case 7: thisvoice.Volume.Right.RegSet( value ); break;
@@ -868,22 +864,22 @@ __forceinline void SPU2_FastWrite( u32 rmem, u16 value )
switch (address)
{
case 0: // SSA (Waveform Start Addr) (hiword, 4 bits only)
- thisvoice.StartA = ((value & 0x0F) << 16) | (thisvoice.StartA & 0xFFF8);
+ thisvoice.StartA = ((value & 0x0F) << 16) | (thisvoice.StartA & 0xFFF8);
if( IsDevBuild )
- DebugCores[core].Voices[voice].lastSetStartA = thisvoice.StartA;
+ DebugCores[core].Voices[voice].lastSetStartA = thisvoice.StartA;
break;
-
+
case 1: // SSA (loword)
- thisvoice.StartA = (thisvoice.StartA & 0x0F0000) | (value & 0xFFF8);
+ thisvoice.StartA = (thisvoice.StartA & 0x0F0000) | (value & 0xFFF8);
if( IsDevBuild )
- DebugCores[core].Voices[voice].lastSetStartA = thisvoice.StartA;
+ DebugCores[core].Voices[voice].lastSetStartA = thisvoice.StartA;
break;
-
- case 2:
+
+ case 2:
thisvoice.LoopStartA = ((value & 0x0F) << 16) | (thisvoice.LoopStartA & 0xFFF8);
thisvoice.LoopMode = 3;
break;
-
+
case 3:
thisvoice.LoopStartA = (thisvoice.LoopStartA & 0x0F0000) | (value & 0xFFF8);
thisvoice.LoopMode = 3;
@@ -892,13 +888,13 @@ __forceinline void SPU2_FastWrite( u32 rmem, u16 value )
case 4:
thisvoice.NextA = ((value & 0x0F) << 16) | (thisvoice.NextA & 0xFFF8);
break;
-
+
case 5:
thisvoice.NextA = (thisvoice.NextA & 0x0F0000) | (value & 0xFFF8);
break;
}
}
- else if((mem>=0x07C0) && (mem<0x07CE))
+ else if((mem>=0x07C0) && (mem<0x07CE))
{
*(regtable[mem>>1]) = value;
UpdateSpdifMode();
@@ -1040,10 +1036,10 @@ __forceinline void SPU2_FastWrite( u32 rmem, u16 value )
break;
case REG_P_MMIX:
-
+
// Each MMIX gate is assigned either 0 or 0xffffffff depending on the status
// of the MMIX bits. I use -1 below as a shorthand for 0xffffffff. :)
-
+
vx = value;
if (core == 0) vx&=0xFF0;
thiscore.WetGate.ExtR = (vx & 0x001) ? -1 : 0;
@@ -1081,7 +1077,7 @@ __forceinline void SPU2_FastWrite( u32 rmem, u16 value )
thiscore.Regs.ENDX&=0x00FF0000;
break;
- case (REG_S_ENDX + 2):
+ case (REG_S_ENDX + 2):
thiscore.Regs.ENDX&=0xFFFF;
break;
@@ -1109,16 +1105,16 @@ __forceinline void SPU2_FastWrite( u32 rmem, u16 value )
thiscore.UpdateEffectsBufferSize();
thiscore.ReverbX = 0;
break;
-
+
// Master Volume Address Write!
-
+
case REG_P_MVOLL:
case REG_P_MVOLR:
{
V_VolumeSlide& thisvol = (omem==REG_P_MVOLL) ? thiscore.MasterVol.Left : thiscore.MasterVol.Right;
if( value & 0x8000 ) // +Lin/-Lin/+Exp/-Exp
- {
+ {
thisvol.Mode = (value & 0xE000) / 0x2000;
thisvol.Increment = (value & 0x7F); // | ((value & 0x800)/0x10);
}
@@ -1143,7 +1139,7 @@ __forceinline void SPU2_FastWrite( u32 rmem, u16 value )
case REG_P_EVOLR:
thiscore.FxVol.Right = GetVol32( value );
break;
-
+
case REG_P_AVOLL:
thiscore.ExtVol.Left = GetVol32( value );
break;
@@ -1151,7 +1147,7 @@ __forceinline void SPU2_FastWrite( u32 rmem, u16 value )
case REG_P_AVOLR:
thiscore.ExtVol.Right = GetVol32( value );
break;
-
+
case REG_P_BVOLL:
thiscore.InpVol.Left = GetVol32( value );
break;
@@ -1186,7 +1182,7 @@ void StartVoices(int core, u32 value)
if( value == 0 ) return;
Cores[core].Regs.ENDX &= ~value;
-
+
for( u8 vc=0; vc>vc) & 1)
diff --git a/plugins/spu2-x/src/iconvert.cpp b/plugins/spu2-x/src/iconvert.cpp
new file mode 100644
index 0000000000..16732d8ec1
--- /dev/null
+++ b/plugins/spu2-x/src/iconvert.cpp
@@ -0,0 +1,261 @@
+/*
+ * Copyright (C) 2001 Edmund Grimley Evans
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+//#ifdef HAVE_ICONV
+
+#include
+#include
+#include
+#include
+#include
+
+/*
+ * Convert data from one encoding to another. Return:
+ *
+ * -2 : memory allocation failed
+ * -1 : unknown encoding
+ * 0 : data was converted exactly
+ * 1 : data was converted inexactly
+ * 2 : data was invalid (but still converted)
+ *
+ * We convert in two steps, via UTF-8, as this is the only
+ * reliable way of distinguishing between invalid input
+ * and valid input which iconv refuses to transliterate.
+ * We convert from UTF-8 twice, because we have no way of
+ * knowing whether the conversion was exact if iconv returns
+ * E2BIG (due to a bug in the specification of iconv).
+ * An alternative approach is to assume that the output of
+ * iconv is never more than 4 times as long as the input,
+ * but I prefer to avoid that assumption if possible.
+ */
+
+
+
+int iconvert(const char *fromcode, const char *tocode,
+ const char *from, size_t fromlen,
+ char **to, size_t *tolen)
+{
+ int ret = 0;
+ iconv_t cd1, cd2;
+ char *ib;
+ char *ob;
+ char *utfbuf = 0, *outbuf, *newbuf;
+ size_t utflen, outlen, ibl, obl, k;
+ char tbuf[2048];
+
+ cd1 = iconv_open("UTF-8", fromcode);
+ if (cd1 == (iconv_t)(-1))
+ return -1;
+
+ cd2 = (iconv_t)(-1);
+ /* Don't use strcasecmp() as it's locale-dependent. */
+ if (!strchr("Uu", tocode[0]) ||
+ !strchr("Tt", tocode[1]) ||
+ !strchr("Ff", tocode[2]) ||
+ tocode[3] != '-' ||
+ tocode[4] != '8' ||
+ tocode[5] != '\0')
+ {
+ char *tocode1;
+
+ /*
+ * Try using this non-standard feature of glibc and libiconv.
+ * This is deliberately not a config option as people often
+ * change their iconv library without rebuilding applications.
+ */
+ tocode1 = (char *)malloc(strlen(tocode) + 11);
+ if (!tocode1)
+ goto fail;
+
+ strcpy(tocode1, tocode);
+ strcat(tocode1, "//TRANSLIT");
+ cd2 = iconv_open(tocode1, "UTF-8");
+ free(tocode1);
+
+ if (cd2 == (iconv_t)(-1))
+ cd2 = iconv_open(tocode, fromcode);
+
+ if (cd2 == (iconv_t)(-1))
+ {
+ iconv_close(cd1);
+ return -1;
+ }
+ }
+
+ utflen = 1; /*fromlen * 2 + 1; XXX */
+ utfbuf = (char *)malloc(utflen);
+ if (!utfbuf)
+ goto fail;
+
+ /* Convert to UTF-8 */
+ ib = (char *)from;
+ ibl = fromlen;
+ ob = utfbuf;
+ obl = utflen;
+ for (;;)
+ {
+ k = iconv(cd1, &ib, &ibl, &ob, &obl);
+ assert((!k && !ibl) ||
+ (k == (size_t)(-1) && errno == E2BIG && ibl && obl < 6) ||
+ (k == (size_t)(-1) &&
+ (errno == EILSEQ || errno == EINVAL) && ibl));
+ if (!ibl)
+ break;
+ if (obl < 6)
+ {
+ /* Enlarge the buffer */
+ utflen *= 2;
+ newbuf = (char *)realloc(utfbuf, utflen);
+ if (!newbuf)
+ goto fail;
+ ob = (ob - utfbuf) + newbuf;
+ obl = utflen - (ob - newbuf);
+ utfbuf = newbuf;
+ }
+ else
+ {
+ /* Invalid input */
+ ib++, ibl--;
+ *ob++ = '#', obl--;
+ ret = 2;
+ iconv(cd1, 0, 0, 0, 0);
+ }
+ }
+
+ if (cd2 == (iconv_t)(-1))
+ {
+ /* The target encoding was UTF-8 */
+ if (tolen)
+ *tolen = ob - utfbuf;
+ if (!to)
+ {
+ free(utfbuf);
+ iconv_close(cd1);
+ return ret;
+ }
+ newbuf = (char *)realloc(utfbuf, (ob - utfbuf) + 1);
+ if (!newbuf)
+ goto fail;
+ ob = (ob - utfbuf) + newbuf;
+ *ob = '\0';
+ *to = newbuf;
+ iconv_close(cd1);
+ return ret;
+ }
+
+ /* Truncate the buffer to be tidy */
+ utflen = ob - utfbuf;
+ newbuf = (char *)realloc(utfbuf, utflen);
+ if (!newbuf)
+ goto fail;
+ utfbuf = newbuf;
+
+ /* Convert from UTF-8 to discover how long the output is */
+ outlen = 0;
+ ib = utfbuf;
+ ibl = utflen;
+ while (ibl)
+ {
+ ob = tbuf;
+ obl = sizeof(tbuf);
+ k = iconv(cd2, &ib, &ibl, &ob, &obl);
+ assert((k != (size_t)(-1) && !ibl) ||
+ (k == (size_t)(-1) && errno == E2BIG && ibl) ||
+ (k == (size_t)(-1) && errno == EILSEQ && ibl));
+ if (ibl && !(k == (size_t)(-1) && errno == E2BIG))
+ {
+ /* Replace one character */
+ char *tb = "?";
+ size_t tbl = 1;
+
+ outlen += ob - tbuf;
+ ob = tbuf;
+ obl = sizeof(tbuf);
+ k = iconv(cd2, &tb, &tbl, &ob, &obl);
+ assert((!k && !tbl) ||
+ (k == (size_t)(-1) && errno == EILSEQ && tbl));
+ for (++ib, --ibl; ibl && (*ib & 0x80); ib++, ibl--)
+ ;
+ }
+ outlen += ob - tbuf;
+ }
+ ob = tbuf;
+ obl = sizeof(tbuf);
+ k = iconv(cd2, 0, 0, &ob, &obl);
+ assert(!k);
+ outlen += ob - tbuf;
+
+ /* Convert from UTF-8 for real */
+ outbuf = (char *)malloc(outlen + 1);
+ if (!outbuf)
+ goto fail;
+ ib = utfbuf;
+ ibl = utflen;
+ ob = outbuf;
+ obl = outlen;
+ while (ibl)
+ {
+ k = iconv(cd2, &ib, &ibl, &ob, &obl);
+ assert((k != (size_t)(-1) && !ibl) ||
+ (k == (size_t)(-1) && errno == EILSEQ && ibl));
+ if (k && !ret)
+ ret = 1;
+ if (ibl && !(k == (size_t)(-1) && errno == E2BIG))
+ {
+ /* Replace one character */
+ char *tb = "?";
+ size_t tbl = 1;
+
+ k = iconv(cd2, &tb, &tbl, &ob, &obl);
+ assert((!k && !tbl) ||
+ (k == (size_t)(-1) && errno == EILSEQ && tbl));
+ for (++ib, --ibl; ibl && (*ib & 0x80); ib++, ibl--)
+ ;
+ }
+ }
+ k = iconv(cd2, 0, 0, &ob, &obl);
+ assert(!k);
+ assert(!obl);
+ *ob = '\0';
+
+ free(utfbuf);
+ iconv_close(cd1);
+ iconv_close(cd2);
+ if (tolen)
+ *tolen = outlen;
+ if (!to)
+ {
+ free(outbuf);
+ return ret;
+ }
+ *to = outbuf;
+ return ret;
+
+fail:
+ free(utfbuf);
+ iconv_close(cd1);
+ if (cd2 != (iconv_t)(-1))
+ iconv_close(cd2);
+ return -2;
+}
+
+//#endif /* HAVE_ICONV */
+
+/* arch-tag: e0ffb4f6-e337-4d5f-af90-d49e2b14041e
+ (do not change this comment) */
diff --git a/plugins/spu2-x/src/utf8.cpp b/plugins/spu2-x/src/utf8.cpp
index 3fa83c178b..30fb1243a6 100644
--- a/plugins/spu2-x/src/utf8.cpp
+++ b/plugins/spu2-x/src/utf8.cpp
@@ -6,12 +6,12 @@
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@@ -53,7 +53,7 @@ static unsigned char *make_utf8_string(const wchar_t *unicode)
size += 3;
}
c = unicode[index++];
- }
+ }
out = (unsigned char*)malloc(size + 1);
if (out == NULL)
@@ -98,7 +98,7 @@ static wchar_t *make_unicode_string(const unsigned char *utf8)
}
size += 1;
c = utf8[index++];
- }
+ }
out = (wchar_t*)malloc((size + 1) * sizeof(wchar_t));
if (out == NULL)
@@ -143,13 +143,13 @@ int utf8_encode(const char *from, char **to)
}
unicode = (wchar_t*)calloc(wchars + 1, sizeof(unsigned short));
- if(unicode == NULL)
+ if(unicode == NULL)
{
fprintf(stderr, "Out of memory processing string to UTF8\n");
return -1;
}
- err = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, from,
+ err = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, from,
strlen(from), unicode, wchars);
if(err != wchars)
{
@@ -158,7 +158,7 @@ int utf8_encode(const char *from, char **to)
return -1;
}
- /* On NT-based windows systems, we could use WideCharToMultiByte(), but
+ /* On NT-based windows systems, we could use WideCharToMultiByte(), but
* MS doesn't actually have a consistent API across win32.
*/
*to = (char*)make_utf8_string(unicode);
@@ -172,11 +172,11 @@ int utf8_decode(const char *from, char **to)
wchar_t *unicode;
int chars, err;
- /* On NT-based windows systems, we could use MultiByteToWideChar(CP_UTF8), but
+ /* On NT-based windows systems, we could use MultiByteToWideChar(CP_UTF8), but
* MS doesn't actually have a consistent API across win32.
*/
unicode = make_unicode_string((unsigned char*)from);
- if(unicode == NULL)
+ if(unicode == NULL)
{
fprintf(stderr, "Out of memory processing string from UTF8 to UNICODE16\n");
return -1;
@@ -193,14 +193,14 @@ int utf8_decode(const char *from, char **to)
}
*to = (char *)calloc(chars + 1, sizeof(unsigned char));
- if(*to == NULL)
+ if(*to == NULL)
{
fprintf(stderr, "Out of memory processing string to local charset\n");
free(unicode);
return -1;
}
- err = WideCharToMultiByte(GetConsoleCP(), WC_COMPOSITECHECK, unicode,
+ err = WideCharToMultiByte(GetConsoleCP(), WC_COMPOSITECHECK, unicode,
-1, *to, chars, NULL, NULL);
if(err != chars)
{
@@ -217,12 +217,11 @@ int utf8_decode(const char *from, char **to)
#else /* End win32. Rest is for real operating systems */
-
#ifdef HAVE_LANGINFO_CODESET
#include
#endif
-int iconvert(const char *fromcode, const char *tocode,
+extern int iconvert(const char *fromcode, const char *tocode,
const char *from, size_t fromlen,
char **to, size_t *tolen);
@@ -251,17 +250,17 @@ static int convert_buffer(const char *fromcode, const char *tocode,
{
int ret = -1;
-#ifdef HAVE_ICONV
+//#ifdef HAVE_ICONV
ret = iconvert(fromcode, tocode, from, fromlen, to, tolen);
if (ret != -1)
return ret;
-#endif
+//#endif
-#ifndef HAVE_ICONV /* should be ifdef USE_CHARSET_CONVERT */
- ret = charset_convert(fromcode, tocode, from, fromlen, to, tolen);
- if (ret != -1)
- return ret;
-#endif
+//#ifndef HAVE_ICONV /* should be ifdef USE_CHARSET_CONVERT */
+// ret = charset_convert(fromcode, tocode, from, fromlen, to, tolen);
+ // if (ret != -1)
+ // return ret;
+//#endif
return ret;
}
diff --git a/plugins/zerospu2/Linux/ZeroSPU2.cbp b/plugins/zerospu2/Linux/ZeroSPU2.cbp
index b8fae29a5e..a80e65769d 100644
--- a/plugins/zerospu2/Linux/ZeroSPU2.cbp
+++ b/plugins/zerospu2/Linux/ZeroSPU2.cbp
@@ -9,7 +9,6 @@
-
@@ -38,6 +37,7 @@
+
@@ -53,6 +53,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -66,7 +87,6 @@
-