Fix a few Linux things.

git-svn-id: http://pcsx2.googlecode.com/svn/trunk@1816 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
arcum42 2009-09-13 06:13:22 +00:00
parent c1f8444fe1
commit f72c913c4b
13 changed files with 453 additions and 142 deletions

View File

@ -19,8 +19,6 @@
<Add option="`wx-config --version=2.8 --static=no --unicode=yes --debug=yes --cflags`" /> <Add option="`wx-config --version=2.8 --static=no --unicode=yes --debug=yes --cflags`" />
<Add option="-DPCSX2_DEBUG" /> <Add option="-DPCSX2_DEBUG" />
<Add option="-DPCSX2_DEVBUILD" /> <Add option="-DPCSX2_DEVBUILD" />
<Add directory="../../include/Utilities" />
<Add directory="../../include" />
</Compiler> </Compiler>
</Target> </Target>
<Target title="Release"> <Target title="Release">
@ -63,15 +61,27 @@
<Add option="-march=pentium4" /> <Add option="-march=pentium4" />
<Add option="-march=i686" /> <Add option="-march=i686" />
<Add option="-march=i586" /> <Add option="-march=i586" />
<Add directory="../../include/Utilities" />
<Add directory="../../include" />
<Add directory="../../../3rdparty" />
</Compiler> </Compiler>
<Unit filename="../../../3rdparty/google/dense_hash_map" />
<Unit filename="../../../3rdparty/google/dense_hash_set" />
<Unit filename="../../../3rdparty/google/sparse_hash_map" />
<Unit filename="../../../3rdparty/google/sparse_hash_set" />
<Unit filename="../../../3rdparty/google/sparsehash/densehashtable.h" />
<Unit filename="../../../3rdparty/google/sparsehash/sparseconfig.h" />
<Unit filename="../../../3rdparty/google/sparsehash/sparsehashtable.h" />
<Unit filename="../../../3rdparty/google/sparsetable" />
<Unit filename="../../../3rdparty/google/type_traits.h" />
<Unit filename="../../include/Utilities/Console.h" /> <Unit filename="../../include/Utilities/Console.h" />
<Unit filename="../../include/Utilities/Dependencies.h" /> <Unit filename="../../include/Utilities/Dependencies.h" />
<Unit filename="../../include/Utilities/Exceptions.h" /> <Unit filename="../../include/Utilities/Exceptions.h" />
<Unit filename="../../include/Utilities/General.h" /> <Unit filename="../../include/Utilities/General.h" />
<Unit filename="../../include/Utilities/HashMap.h" /> <Unit filename="../../include/Utilities/HashMap.h" />
<Unit filename="../../include/Utilities/MemcpyFast.h" /> <Unit filename="../../include/Utilities/MemcpyFast.h" />
<Unit filename="../../include/Utilities/Path.h" /> <Unit filename="../../include/Utilities/Path.h" />
<Unit filename="../../include/Utilities/RedtapeWindows.h" /> <Unit filename="../../include/Utilities/RedtapeWindows.h" />
<Unit filename="../../include/Utilities/SafeArray.h" /> <Unit filename="../../include/Utilities/SafeArray.h" />
<Unit filename="../../include/Utilities/ScopedPtr.h" /> <Unit filename="../../include/Utilities/ScopedPtr.h" />
<Unit filename="../../include/Utilities/StringHelpers.h" /> <Unit filename="../../include/Utilities/StringHelpers.h" />
@ -83,12 +93,12 @@
<Unit filename="../../src/Utilities/AlignedMalloc.cpp" /> <Unit filename="../../src/Utilities/AlignedMalloc.cpp" />
<Unit filename="../../src/Utilities/Console.cpp" /> <Unit filename="../../src/Utilities/Console.cpp" />
<Unit filename="../../src/Utilities/Exceptions.cpp" /> <Unit filename="../../src/Utilities/Exceptions.cpp" />
<Unit filename="../../src/Utilities/HashTools.cpp" /> <Unit filename="../../src/Utilities/HashTools.cpp" />
<Unit filename="../../src/Utilities/Linux/LnxHostSys.cpp" /> <Unit filename="../../src/Utilities/Linux/LnxHostSys.cpp" />
<Unit filename="../../src/Utilities/Linux/LnxMisc.cpp" /> <Unit filename="../../src/Utilities/Linux/LnxMisc.cpp" />
<Unit filename="../../src/Utilities/Linux/LnxThreads.cpp" /> <Unit filename="../../src/Utilities/Linux/LnxThreads.cpp" />
<Unit filename="../../src/Utilities/PathUtils.cpp" /> <Unit filename="../../src/Utilities/PathUtils.cpp" />
<Unit filename="../../src/Utilities/StringHelpers.cpp" /> <Unit filename="../../src/Utilities/StringHelpers.cpp" />
<Unit filename="../../src/Utilities/ThreadTools.cpp" /> <Unit filename="../../src/Utilities/ThreadTools.cpp" />
<Unit filename="../../src/Utilities/vssprintf.cpp" /> <Unit filename="../../src/Utilities/vssprintf.cpp" />
<Unit filename="../../src/Utilities/x86/MemcpyFast.S" /> <Unit filename="../../src/Utilities/x86/MemcpyFast.S" />

View File

@ -1,12 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_workspace_file> <CodeBlocks_workspace_file>
<Workspace title="pcsx2_suite_2008 workspace"> <Workspace title="pcsx2_suite_2008 workspace">
<Project filename="pcsx2/Linux/pcsx2.cbp" active="1"> <Project filename="pcsx2/Linux/pcsx2.cbp" />
<Depends filename="common/build/x86emitter/x86emitter.cbp" />
<Depends filename="common/build/Utilities/Utilities.cbp" />
<Depends filename="3rdparty/zlib/zlib.cbp" />
<Depends filename="tools/bin2cpp/bin2cpp.cbp" />
</Project>
<Project filename="common/build/x86emitter/x86emitter.cbp" /> <Project filename="common/build/x86emitter/x86emitter.cbp" />
<Project filename="common/build/Utilities/Utilities.cbp" /> <Project filename="common/build/Utilities/Utilities.cbp" />
<Project filename="3rdparty/SoundTouch/SoundTouch.cbp" /> <Project filename="3rdparty/SoundTouch/SoundTouch.cbp" />
@ -22,6 +17,6 @@
<Project filename="plugins/onepad/Linux/OnePad.cbp" /> <Project filename="plugins/onepad/Linux/OnePad.cbp" />
<Project filename="plugins/zerogs/opengl/Linux/ZeroGS.cbp" /> <Project filename="plugins/zerogs/opengl/Linux/ZeroGS.cbp" />
<Project filename="tools/bin2cpp/bin2cpp.cbp" /> <Project filename="tools/bin2cpp/bin2cpp.cbp" />
<Project filename="plugins/spu2-x/src/Linux/SPU2-X.cbp" /> <Project filename="plugins/spu2-x/src/Linux/SPU2-X.cbp" active="1" />
</Workspace> </Workspace>
</CodeBlocks_workspace_file> </CodeBlocks_workspace_file>

View File

@ -1,6 +1,6 @@
/* PCSX2 - PS2 Emulator for PCs /* PCSX2 - PS2 Emulator for PCs
* Copyright (C) 2002-2009 PCSX2 Dev Team * Copyright (C) 2002-2009 PCSX2 Dev Team
* *
* PCSX2 is free software: you can redistribute it and/or modify it under the terms * 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- * 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. * ation, either version 3 of the License, or (at your option) any later version.
@ -16,6 +16,7 @@
#include "PrecompiledHeader.h" #include "PrecompiledHeader.h"
#include "GS.h" #include "GS.h"
#include <list>
#ifdef PCSX2_DEVBUILD #ifdef PCSX2_DEVBUILD
void SaveGSState(const wxString& file) void SaveGSState(const wxString& file)
@ -134,7 +135,7 @@ void RunGSState( gzLoadingState& f )
*(u32*)(PS2MEM_GS+0x1000) = (*(u32*)(PS2MEM_GS+0x1000) & ~(1<<13)) | newfield; *(u32*)(PS2MEM_GS+0x1000) = (*(u32*)(PS2MEM_GS+0x1000) & ~(1<<13)) | newfield;
GSvsync(newfield); GSvsync(newfield);
// fixme : Process pending app messages here. // fixme : Process pending app messages here.
//SysUpdate(); //SysUpdate();
@ -150,4 +151,4 @@ void RunGSState( gzLoadingState& f )
it = packets.begin(); it = packets.begin();
} }
} }
#endif #endif

View File

@ -1130,9 +1130,6 @@ void __forceinline finishmpeg2sliceIDEC(decoder_t* &decoder)
waitForSCD(); waitForSCD();
} }
// This fixes Mana Khemia if uncommented, but needs testing.
// Breaks Figital Devil Saga.
//#define ALWAYS_RESUME_BEFORE_EXITING
void mpeg2sliceIDEC(void* pdone) void mpeg2sliceIDEC(void* pdone)
{ {
u32 read; u32 read;

View File

@ -164,9 +164,9 @@
<Unit filename="../FPU.cpp" /> <Unit filename="../FPU.cpp" />
<Unit filename="../FiFo.cpp" /> <Unit filename="../FiFo.cpp" />
<Unit filename="../GS.cpp" /> <Unit filename="../GS.cpp" />
<Unit filename="../GS.h" /> <Unit filename="../GS.h" />
<Unit filename="../GSstate.cpp" /> <Unit filename="../GSState.cpp" />
<Unit filename="../Gif.cpp" /> <Unit filename="../Gif.cpp" />
<Unit filename="../HostGui.h" /> <Unit filename="../HostGui.h" />
<Unit filename="../Hw.cpp" /> <Unit filename="../Hw.cpp" />
<Unit filename="../Hw.h" /> <Unit filename="../Hw.h" />
@ -268,8 +268,8 @@
<Unit filename="../gui/AppAssert.cpp" /> <Unit filename="../gui/AppAssert.cpp" />
<Unit filename="../gui/AppConfig.cpp" /> <Unit filename="../gui/AppConfig.cpp" />
<Unit filename="../gui/AppConfig.h" /> <Unit filename="../gui/AppConfig.h" />
<Unit filename="../gui/AppMain.cpp" /> <Unit filename="../gui/AppMain.cpp" />
<Unit filename="../gui/AppRes.cpp" /> <Unit filename="../gui/AppRes.cpp" />
<Unit filename="../gui/CheckedStaticBox.cpp" /> <Unit filename="../gui/CheckedStaticBox.cpp" />
<Unit filename="../gui/CheckedStaticBox.h" /> <Unit filename="../gui/CheckedStaticBox.h" />
<Unit filename="../gui/ConsoleLogger.cpp" /> <Unit filename="../gui/ConsoleLogger.cpp" />

View File

@ -14,17 +14,19 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <string> #include <string>
using namespace std; using namespace std;
void SaveConf(); extern void SaveConf();
void LoadConf(); extern void LoadConf();
extern string s_strIniPath; 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 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) #define set_checked(main_widget,widget_name, state) gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(lookup_widget(main_widget, widget_name)), state)

View File

@ -1,6 +1,6 @@
/* SPU2-X, A plugin for Emulating the Sound Processing Unit of the Playstation 2 /* SPU2-X, A plugin for Emulating the Sound Processing Unit of the Playstation 2
* Developed and maintained by the Pcsx2 Development Team. * Developed and maintained by the Pcsx2 Development Team.
* *
* Original portions from SPU2ghz are (c) 2008 by David Quintana [gigaherz] * 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 * 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_t *handle;
snd_pcm_uframes_t buffer_size; snd_pcm_uframes_t buffer_size;
snd_async_handler_t *pcm_callback; snd_async_handler_t *pcm_callback;
uint period_time; uint period_time;
uint buffer_time; uint buffer_time;
@ -70,7 +70,7 @@ protected:
// Not sure if we just need an assert, or something like this: // Not sure if we just need an assert, or something like this:
//if( data->handle != snd_async_handler_get_pcm(pcm_callback) ) return; //if( data->handle != snd_async_handler_get_pcm(pcm_callback) ) return;
data->_InternalCallback(); data->_InternalCallback();
} }
@ -87,60 +87,60 @@ public:
handle = NULL; handle = NULL;
pcm_callback = NULL; pcm_callback = NULL;
pspeed = SAMPLE_RATE; pspeed = SAMPLE_RATE;
// buffer time and period time are in microseconds... // buffer time and period time are in microseconds...
// (don't simplify the equation below -- it'll just cause integer rounding errors. // (don't simplify the equation below -- it'll just cause integer rounding errors.
period_time = (SndOutPacketSize*1000) / (SampleRate / 1000); period_time = (SndOutPacketSize*1000) / (SampleRate / 1000);
buffer_time = period_time * NumBuffers; buffer_time = period_time * NumBuffers;
int err; int err;
err = snd_pcm_open(&handle, "default", SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK); 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)); ERROR_LOG("Audio open error: %s\n", snd_strerror(err));
return -1; return -1;
} }
err = snd_pcm_nonblock(handle, 0); err = snd_pcm_nonblock(handle, 0);
if(err < 0) if(err < 0)
{ {
ERROR_LOG("Can't set blocking mode: %s\n", snd_strerror(err)); ERROR_LOG("Can't set blocking mode: %s\n", snd_strerror(err));
return -1; return -1;
} }
snd_pcm_hw_params_alloca(&hwparams); snd_pcm_hw_params_alloca(&hwparams);
snd_pcm_sw_params_alloca(&swparams); snd_pcm_sw_params_alloca(&swparams);
err = snd_pcm_hw_params_any(handle, hwparams); 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)); ERROR_LOG("Broken configuration for this PCM: %s\n", snd_strerror(err));
return -1; return -1;
} }
err = snd_pcm_hw_params_set_access(handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED); 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)); ERROR_LOG("Access type not available: %s\n", snd_strerror(err));
return -1; return -1;
} }
err = snd_pcm_hw_params_set_format(handle, hwparams, format); 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)); ERROR_LOG("Sample format not available: %s\n", snd_strerror(err));
return -1; return -1;
} }
err = snd_pcm_hw_params_set_channels(handle, hwparams, pchannels); 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)); ERROR_LOG("Channels count not available: %s\n", snd_strerror(err));
return -1; return -1;
} }
err = snd_pcm_hw_params_set_rate_near(handle, hwparams, &pspeed, 0); 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)); ERROR_LOG("Rate not available: %s\n", snd_strerror(err));
return -1; return -1;
@ -151,31 +151,31 @@ public:
ERROR_LOG("Buffer time error: %s\n", snd_strerror(err)); ERROR_LOG("Buffer time error: %s\n", snd_strerror(err));
return -1; return -1;
} }
err = snd_pcm_hw_params_set_period_time_near(handle, hwparams, &period_time, 0); err = snd_pcm_hw_params_set_period_time_near(handle, hwparams, &period_time, 0);
if (err < 0) if (err < 0)
{ {
ERROR_LOG("Period time error: %s\n", snd_strerror(err)); ERROR_LOG("Period time error: %s\n", snd_strerror(err));
return -1; return -1;
} }
err = snd_pcm_hw_params(handle, hwparams); 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)); ERROR_LOG("Unable to install hw params: %s\n", snd_strerror(err));
return -1; return -1;
} }
snd_pcm_status_alloca(&status); snd_pcm_status_alloca(&status);
err = snd_pcm_status(handle, status); err = snd_pcm_status(handle, status);
if(err < 0) if(err < 0)
{ {
ERROR_LOG("Unable to get status: %s\n", snd_strerror(err)); ERROR_LOG("Unable to get status: %s\n", snd_strerror(err));
return -1; return -1;
} }
// Bind our asynchronous callback magic: // Bind our asynchronous callback magic:
snd_async_add_pcm_handler( &pcm_callback, handle, ExternalCallback, this ); snd_async_add_pcm_handler( &pcm_callback, handle, ExternalCallback, this );
snd_pcm_start( handle ); snd_pcm_start( handle );
@ -199,7 +199,7 @@ public:
} }
virtual bool Is51Out() const { return false; } virtual bool Is51Out() const { return false; }
s32 Test() const s32 Test() const
{ {
return 0; return 0;
@ -210,7 +210,7 @@ public:
if(handle == NULL) return 0; if(handle == NULL) return 0;
// Returns the amount of free buffer space, in samples. // 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; if( l < 0 ) return 0;
return (l / 1000) * (SampleRate / 1000); return (l / 1000) * (SampleRate / 1000);
} }
@ -234,4 +234,4 @@ public:
} }
} static Alsa; } static Alsa;
SndOutModule *AlsaOut = &Alsa; SndOutModule *AlsaOut = &Alsa;

View File

@ -1,6 +1,6 @@
/* SPU2-X, A plugin for Emulating the Sound Processing Unit of the Playstation 2 /* SPU2-X, A plugin for Emulating the Sound Processing Unit of the Playstation 2
* Developed and maintained by the Pcsx2 Development Team. * Developed and maintained by the Pcsx2 Development Team.
* *
* Original portions from SPU2ghz are (c) 2008 by David Quintana [gigaherz] * 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 * SPU2-X is free software: you can redistribute it and/or modify it under the terms
@ -97,8 +97,12 @@ void WriteSettings()
{ {
} }
void configure() void configure()
{ {
ReadSettings(); ReadSettings();
} }
void SysMessage(char const*, ...)
{
}

View File

@ -7,9 +7,9 @@
<Option compiler="gcc" /> <Option compiler="gcc" />
<Build> <Build>
<Target title="Debug"> <Target title="Debug">
<Option output="bin/Debug/SPU2-X" prefix_auto="1" extension_auto="1" /> <Option output="../../../../bin/plugins/SPU2-X.so" prefix_auto="0" extension_auto="0" />
<Option object_output="obj/Debug/" /> <Option object_output="obj/Debug/" />
<Option type="1" /> <Option type="3" />
<Option compiler="gcc" /> <Option compiler="gcc" />
<Compiler> <Compiler>
<Add option="-g" /> <Add option="-g" />
@ -17,9 +17,9 @@
</Compiler> </Compiler>
</Target> </Target>
<Target title="Release"> <Target title="Release">
<Option output="bin/Release/SPU2-X" prefix_auto="1" extension_auto="1" /> <Option output="../../../../bin/plugins/SPU2-X.so" prefix_auto="0" extension_auto="0" />
<Option object_output="obj/Release/" /> <Option object_output="obj/Release/" />
<Option type="1" /> <Option type="3" />
<Option compiler="gcc" /> <Option compiler="gcc" />
<Compiler> <Compiler>
<Add option="-O2" /> <Add option="-O2" />
@ -35,17 +35,43 @@
<Add option="`pkg-config gtk+-2.0 --cflags`" /> <Add option="`pkg-config gtk+-2.0 --cflags`" />
<Add option="-fPIC" /> <Add option="-fPIC" />
<Add option="-m32" /> <Add option="-m32" />
<Add option="-liconv" />
<Add option="-msse2" />
<Add directory="../Linux" /> <Add directory="../Linux" />
<Add directory="../../src" /> <Add directory="../../src" />
<Add directory="../3rdparty" /> <Add directory="../3rdparty" />
<Add directory="../3rdparty/liba52" /> <Add directory="../3rdparty/liba52" />
<Add directory="../../../../common/include" /> <Add directory="../../../../common/include" />
<Add directory="../../../../3rdparty/SoundTouch" />
<Add directory="../../../../3rdparty" />
</Compiler> </Compiler>
<Linker> <Linker>
<Add option="`pkg-config gtk+-2.0 --libs`" /> <Add option="`pkg-config gtk+-2.0 --libs`" />
<Add option="-shared" /> <Add option="-shared" />
<Add library="asound" /> <Add library="asound" />
<Add library="stdc++" />
</Linker> </Linker>
<Unit filename="../../../../3rdparty/SoundTouch/AAFilter.cpp" />
<Unit filename="../../../../3rdparty/SoundTouch/AAFilter.h" />
<Unit filename="../../../../3rdparty/SoundTouch/BPMDetect.h" />
<Unit filename="../../../../3rdparty/SoundTouch/FIFOSampleBuffer.cpp" />
<Unit filename="../../../../3rdparty/SoundTouch/FIFOSampleBuffer.h" />
<Unit filename="../../../../3rdparty/SoundTouch/FIFOSamplePipe.h" />
<Unit filename="../../../../3rdparty/SoundTouch/FIRFilter.cpp" />
<Unit filename="../../../../3rdparty/SoundTouch/FIRFilter.h" />
<Unit filename="../../../../3rdparty/SoundTouch/RateTransposer.cpp" />
<Unit filename="../../../../3rdparty/SoundTouch/RateTransposer.h" />
<Unit filename="../../../../3rdparty/SoundTouch/STTypes.h" />
<Unit filename="../../../../3rdparty/SoundTouch/SoundTouch.cpp" />
<Unit filename="../../../../3rdparty/SoundTouch/SoundTouch.h" />
<Unit filename="../../../../3rdparty/SoundTouch/TDStretch.cpp" />
<Unit filename="../../../../3rdparty/SoundTouch/TDStretch.h" />
<Unit filename="../../../../3rdparty/SoundTouch/WavFile.cpp" />
<Unit filename="../../../../3rdparty/SoundTouch/WavFile.h" />
<Unit filename="../../../../3rdparty/SoundTouch/cpu_detect.h" />
<Unit filename="../../../../3rdparty/SoundTouch/cpu_detect_x86_gcc.cpp" />
<Unit filename="../../../../3rdparty/SoundTouch/mmx_optimized.cpp" />
<Unit filename="../../../../3rdparty/SoundTouch/sse_optimized.cpp" />
<Unit filename="../3rdparty/liba52/a52.h" /> <Unit filename="../3rdparty/liba52/a52.h" />
<Unit filename="../3rdparty/liba52/a52_internal.h" /> <Unit filename="../3rdparty/liba52/a52_internal.h" />
<Unit filename="../3rdparty/liba52/attributes.h" /> <Unit filename="../3rdparty/liba52/attributes.h" />
@ -89,7 +115,6 @@
<Unit filename="ConfigSoundTouch.cpp" /> <Unit filename="ConfigSoundTouch.cpp" />
<Unit filename="Dialogs.cpp" /> <Unit filename="Dialogs.cpp" />
<Unit filename="Dialogs.h" /> <Unit filename="Dialogs.h" />
<Unit filename="Linux.cpp" />
<Unit filename="Linux.h" /> <Unit filename="Linux.h" />
<Unit filename="../Lowpass.cpp" /> <Unit filename="../Lowpass.cpp" />
<Unit filename="../Lowpass.h" /> <Unit filename="../Lowpass.h" />
@ -109,6 +134,7 @@
<Unit filename="../Timestretcher.cpp" /> <Unit filename="../Timestretcher.cpp" />
<Unit filename="../Wavedump_wav.cpp" /> <Unit filename="../Wavedump_wav.cpp" />
<Unit filename="../defs.h" /> <Unit filename="../defs.h" />
<Unit filename="../iconvert.cpp" />
<Unit filename="../regs.h" /> <Unit filename="../regs.h" />
<Unit filename="../spdif.h" /> <Unit filename="../spdif.h" />
<Unit filename="../utf8.cpp" /> <Unit filename="../utf8.cpp" />

View File

@ -1,6 +1,6 @@
/* SPU2-X, A plugin for Emulating the Sound Processing Unit of the Playstation 2 /* SPU2-X, A plugin for Emulating the Sound Processing Unit of the Playstation 2
* Developed and maintained by the Pcsx2 Development Team. * Developed and maintained by the Pcsx2 Development Team.
* *
* Original portions from SPU2ghz are (c) 2008 by David Quintana [gigaherz] * 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 * 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; has_to_call_irq=true;
} }
#ifdef _MSC_VER void SysMessage(const char *fmt, ...)
void SysMessage(const char *fmt, ...)
{ {
va_list list; va_list list;
char tmp[512]; char tmp[512];
@ -80,9 +79,6 @@ void SysMessage(const char *fmt, ...)
swprintf_s(wtmp, L"%S", tmp); swprintf_s(wtmp, L"%S", tmp);
MessageBox(0, wtmp, L"SPU2-X System Message", 0); MessageBox(0, wtmp, L"SPU2-X System Message", 0);
} }
#else
extern void SysMessage(const char *fmt, ...);
#endif
__forceinline s16 * __fastcall GetMemPtr(u32 addr) __forceinline s16 * __fastcall GetMemPtr(u32 addr)
{ {
@ -135,9 +131,9 @@ V_Core::V_Core()
void V_Core::Reset() void V_Core::Reset()
{ {
memset( this, 0, sizeof(V_Core) ); memset( this, 0, sizeof(V_Core) );
const int c = (this == Cores) ? 0 : 1; const int c = (this == Cores) ? 0 : 1;
Regs.STATX=0; Regs.STATX=0;
Regs.ATTR=0; Regs.ATTR=0;
ExtVol = V_VolumeLR::Max; ExtVol = V_VolumeLR::Max;
@ -158,7 +154,7 @@ void V_Core::Reset()
DryGate.SndR = -1; DryGate.SndR = -1;
WetGate.SndL = -1; WetGate.SndL = -1;
WetGate.SndR = -1; WetGate.SndR = -1;
Regs.MMIX = 0xFFCF; Regs.MMIX = 0xFFCF;
Regs.VMIXL = 0xFFFFFF; Regs.VMIXL = 0xFFFFFF;
Regs.VMIXR = 0xFFFFFF; Regs.VMIXR = 0xFFFFFF;
@ -169,16 +165,16 @@ void V_Core::Reset()
FxEnable=0; FxEnable=0;
IRQA=0xFFFF0; IRQA=0xFFFF0;
IRQEnable=1; IRQEnable=1;
for( uint v=0; v<NumVoices; ++v ) for( uint v=0; v<NumVoices; ++v )
{ {
VoiceGates[v].DryL = -1; VoiceGates[v].DryL = -1;
VoiceGates[v].DryR = -1; VoiceGates[v].DryR = -1;
VoiceGates[v].WetL = -1; VoiceGates[v].WetL = -1;
VoiceGates[v].WetR = -1; VoiceGates[v].WetR = -1;
Voices[v].Volume = V_VolumeSlideLR::Max; Voices[v].Volume = V_VolumeSlideLR::Max;
Voices[v].ADSR.Value = 0; Voices[v].ADSR.Value = 0;
Voices[v].ADSR.Phase = 0; Voices[v].ADSR.Phase = 0;
Voices[v].Pitch = 0x3FFF; Voices[v].Pitch = 0x3FFF;
@ -188,7 +184,7 @@ void V_Core::Reset()
} }
DMAICounter = 0; DMAICounter = 0;
AdmaInProgress = 0; AdmaInProgress = 0;
Regs.STATX = 0x80; Regs.STATX = 0x80;
} }
@ -208,7 +204,7 @@ s32 V_Core::EffectsBufferIndexer( s32 offset ) const
pos = EffectsEndA+1 - (offset % EffectsBufferSize ); pos = EffectsEndA+1 - (offset % EffectsBufferSize );
} }
return pos; return pos;
} }
void V_Core::UpdateFeedbackBuffersA() void V_Core::UpdateFeedbackBuffersA()
{ {
@ -226,7 +222,7 @@ void V_Core::UpdateEffectsBufferSize()
{ {
const s32 newbufsize = EffectsEndA - EffectsStartA + 1; const s32 newbufsize = EffectsEndA - EffectsStartA + 1;
if( !RevBuffers.NeedsUpdated && newbufsize == EffectsBufferSize ) return; if( !RevBuffers.NeedsUpdated && newbufsize == EffectsBufferSize ) return;
RevBuffers.NeedsUpdated = false; RevBuffers.NeedsUpdated = false;
EffectsBufferSize = newbufsize; EffectsBufferSize = newbufsize;
@ -245,17 +241,17 @@ void V_Core::UpdateEffectsBufferSize()
UpdateFeedbackBuffersA(); UpdateFeedbackBuffersA();
UpdateFeedbackBuffersB(); UpdateFeedbackBuffersB();
RevBuffers.IIR_DEST_A0 = EffectsBufferIndexer( Revb.IIR_DEST_A0 ); RevBuffers.IIR_DEST_A0 = EffectsBufferIndexer( Revb.IIR_DEST_A0 );
RevBuffers.IIR_DEST_A1 = EffectsBufferIndexer( Revb.IIR_DEST_A1 ); RevBuffers.IIR_DEST_A1 = EffectsBufferIndexer( Revb.IIR_DEST_A1 );
RevBuffers.IIR_DEST_B0 = EffectsBufferIndexer( Revb.IIR_DEST_B0 ); RevBuffers.IIR_DEST_B0 = EffectsBufferIndexer( Revb.IIR_DEST_B0 );
RevBuffers.IIR_DEST_B1 = EffectsBufferIndexer( Revb.IIR_DEST_B1 ); RevBuffers.IIR_DEST_B1 = EffectsBufferIndexer( Revb.IIR_DEST_B1 );
RevBuffers.IIR_SRC_A0 = EffectsBufferIndexer( Revb.IIR_SRC_A0 ); RevBuffers.IIR_SRC_A0 = EffectsBufferIndexer( Revb.IIR_SRC_A0 );
RevBuffers.IIR_SRC_A1 = EffectsBufferIndexer( Revb.IIR_SRC_A1 ); RevBuffers.IIR_SRC_A1 = EffectsBufferIndexer( Revb.IIR_SRC_A1 );
RevBuffers.IIR_SRC_B0 = EffectsBufferIndexer( Revb.IIR_SRC_B0 ); RevBuffers.IIR_SRC_B0 = EffectsBufferIndexer( Revb.IIR_SRC_B0 );
RevBuffers.IIR_SRC_B1 = EffectsBufferIndexer( Revb.IIR_SRC_B1 ); RevBuffers.IIR_SRC_B1 = EffectsBufferIndexer( Revb.IIR_SRC_B1 );
RevBuffers.MIX_DEST_A0 = EffectsBufferIndexer( Revb.MIX_DEST_A0 ); RevBuffers.MIX_DEST_A0 = EffectsBufferIndexer( Revb.MIX_DEST_A0 );
RevBuffers.MIX_DEST_A1 = EffectsBufferIndexer( Revb.MIX_DEST_A1 ); RevBuffers.MIX_DEST_A1 = EffectsBufferIndexer( Revb.MIX_DEST_A1 );
RevBuffers.MIX_DEST_B0 = EffectsBufferIndexer( Revb.MIX_DEST_B0 ); RevBuffers.MIX_DEST_B0 = EffectsBufferIndexer( Revb.MIX_DEST_B0 );
@ -412,7 +408,7 @@ __forceinline void TimeUpdate(u32 cClocks)
} }
//Update DMA4 interrupt delay counter //Update DMA4 interrupt delay counter
if(Cores[0].DMAICounter>0) if(Cores[0].DMAICounter>0)
{ {
Cores[0].DMAICounter-=TickInterval; Cores[0].DMAICounter-=TickInterval;
if(Cores[0].DMAICounter<=0) if(Cores[0].DMAICounter<=0)
@ -427,7 +423,7 @@ __forceinline void TimeUpdate(u32 cClocks)
} }
//Update DMA7 interrupt delay counter //Update DMA7 interrupt delay counter
if(Cores[1].DMAICounter>0) if(Cores[1].DMAICounter>0)
{ {
Cores[1].DMAICounter-=TickInterval; Cores[1].DMAICounter-=TickInterval;
if(Cores[1].DMAICounter<=0) if(Cores[1].DMAICounter<=0)
@ -506,7 +502,7 @@ void V_VolumeSlide::RegSet( u16 src )
Value = GetVol32( src ); Value = GetVol32( src );
} }
void SPU_ps1_write(u32 mem, u16 value) void SPU_ps1_write(u32 mem, u16 value)
{ {
bool show=true; 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.RegSet( value << 1 );
Cores[0].Voices[voice].Volume.Right.Reg_VOL = value; Cores[0].Voices[voice].Volume.Right.Reg_VOL = value;
break; break;
case 2: Cores[0].Voices[voice].Pitch = value; break; case 2: Cores[0].Voices[voice].Pitch = value; break;
case 3: Cores[0].Voices[voice].StartA = (u32)value<<8; 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.ReleaseRate = (value & 0x1F);
Cores[0].Voices[voice].ADSR.Reg_ADSR2 = value; Cores[0].Voices[voice].ADSR.Reg_ADSR2 = value;
break; break;
case 6: case 6:
Cores[0].Voices[voice].ADSR.Value = ((s32)value<<16) | value; Cores[0].Voices[voice].ADSR.Value = ((s32)value<<16) | value;
ConLog( "* SPU2: Mysterious ADSR Volume Set to 0x%x", 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) case 0x1d90:// Channel FM (pitch lfo) mode (0-15)
SPU2_FastWrite(REG_S_PMON,value); SPU2_FastWrite(REG_S_PMON,value);
break; break;
case 0x1d92:// Channel FM (pitch lfo) mode (16-23) case 0x1d92:// Channel FM (pitch lfo) mode (16-23)
SPU2_FastWrite(REG_S_PMON+2,value); SPU2_FastWrite(REG_S_PMON+2,value);
break; break;
@ -607,7 +603,7 @@ void SPU_ps1_write(u32 mem, u16 value)
case 0x1d94:// Channel Noise mode (0-15) case 0x1d94:// Channel Noise mode (0-15)
SPU2_FastWrite(REG_S_NON,value); SPU2_FastWrite(REG_S_NON,value);
break; break;
case 0x1d96:// Channel Noise mode (16-23) case 0x1d96:// Channel Noise mode (16-23)
SPU2_FastWrite(REG_S_NON+2,value); SPU2_FastWrite(REG_S_NON+2,value);
break; break;
@ -616,17 +612,17 @@ void SPU_ps1_write(u32 mem, u16 value)
SPU2_FastWrite(REG_S_VMIXEL,value); SPU2_FastWrite(REG_S_VMIXEL,value);
SPU2_FastWrite(REG_S_VMIXER,value); SPU2_FastWrite(REG_S_VMIXER,value);
break; break;
case 0x1d9a:// Channel Reverb mode (16-23) case 0x1d9a:// Channel Reverb mode (16-23)
SPU2_FastWrite(REG_S_VMIXEL+2,value); SPU2_FastWrite(REG_S_VMIXEL+2,value);
SPU2_FastWrite(REG_S_VMIXER+2,value); SPU2_FastWrite(REG_S_VMIXER+2,value);
break; break;
case 0x1d9c:// Channel Reverb mode (0-15) case 0x1d9c:// Channel Reverb mode (0-15)
SPU2_FastWrite(REG_S_VMIXL,value); SPU2_FastWrite(REG_S_VMIXL,value);
SPU2_FastWrite(REG_S_VMIXR,value); SPU2_FastWrite(REG_S_VMIXR,value);
break; break;
case 0x1d9e:// Channel Reverb mode (16-23) case 0x1d9e:// Channel Reverb mode (16-23)
SPU2_FastWrite(REG_S_VMIXL+2,value); SPU2_FastWrite(REG_S_VMIXL+2,value);
SPU2_FastWrite(REG_S_VMIXR+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); SPU2_FastWrite(REG_A_ESA+2,val>>16);
} }
break; break;
case 0x1da4: case 0x1da4:
Cores[0].IRQA=(u32)value<<8; Cores[0].IRQA=(u32)value<<8;
break; break;
@ -668,7 +664,7 @@ void SPU_ps1_write(u32 mem, u16 value)
spu2Ru16(mem)=value; spu2Ru16(mem)=value;
} }
u16 SPU_ps1_read(u32 mem) u16 SPU_ps1_read(u32 mem)
{ {
bool show=true; bool show=true;
u16 value = spu2Ru16(mem); 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].VolumeL.Value;
value = Cores[0].Voices[voice].Volume.Left.Reg_VOL; value = Cores[0].Voices[voice].Volume.Left.Reg_VOL;
break; break;
case 1: //VOLR (Volume R) case 1: //VOLR (Volume R)
//value=Cores[0].Voices[voice].VolumeR.Mode; //value=Cores[0].Voices[voice].VolumeR.Mode;
//value=Cores[0].Voices[voice].VolumeR.Value; //value=Cores[0].Voices[voice].VolumeR.Value;
value = Cores[0].Voices[voice].Volume.Right.Reg_VOL; value = Cores[0].Voices[voice].Volume.Right.Reg_VOL;
break; break;
case 2: value = Cores[0].Voices[voice].Pitch; break; case 2: value = Cores[0].Voices[voice].Pitch; break;
case 3: value = Cores[0].Voices[voice].StartA; break; case 3: value = Cores[0].Voices[voice].StartA; break;
case 4: value = Cores[0].Voices[voice].ADSR.Reg_ADSR1; 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 (mem & 0x400) { omem^=0x400; core=1; }
if (omem < 0x0180) // Voice Params if (omem < 0x0180) // Voice Params
{ {
const u32 voice = (omem & 0x1F0) >> 4; const u32 voice = (omem & 0x1F0) >> 4;
const u32 param = (omem & 0xF) >> 1; const u32 param = (omem & 0xF) >> 1;
V_Voice& thisvoice = Cores[core].Voices[voice]; V_Voice& thisvoice = Cores[core].Voices[voice];
switch (param) switch (param)
{ {
case 0: //VOLL (Volume L) case 0: //VOLL (Volume L)
case 1: //VOLR (Volume R) case 1: //VOLR (Volume R)
{ {
@ -852,7 +848,7 @@ __forceinline void SPU2_FastWrite( u32 rmem, u16 value )
thisvoice.ADSR.Value = (value << 16) | value; thisvoice.ADSR.Value = (value << 16) | value;
ConLog( "* SPU2: Mysterious ADSR Volume Set to 0x%x", value ); ConLog( "* SPU2: Mysterious ADSR Volume Set to 0x%x", value );
break; break;
case 6: thisvoice.Volume.Left.RegSet( value ); break; case 6: thisvoice.Volume.Left.RegSet( value ); break;
case 7: thisvoice.Volume.Right.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) switch (address)
{ {
case 0: // SSA (Waveform Start Addr) (hiword, 4 bits only) 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 ) if( IsDevBuild )
DebugCores[core].Voices[voice].lastSetStartA = thisvoice.StartA; DebugCores[core].Voices[voice].lastSetStartA = thisvoice.StartA;
break; break;
case 1: // SSA (loword) case 1: // SSA (loword)
thisvoice.StartA = (thisvoice.StartA & 0x0F0000) | (value & 0xFFF8); thisvoice.StartA = (thisvoice.StartA & 0x0F0000) | (value & 0xFFF8);
if( IsDevBuild ) if( IsDevBuild )
DebugCores[core].Voices[voice].lastSetStartA = thisvoice.StartA; DebugCores[core].Voices[voice].lastSetStartA = thisvoice.StartA;
break; break;
case 2: case 2:
thisvoice.LoopStartA = ((value & 0x0F) << 16) | (thisvoice.LoopStartA & 0xFFF8); thisvoice.LoopStartA = ((value & 0x0F) << 16) | (thisvoice.LoopStartA & 0xFFF8);
thisvoice.LoopMode = 3; thisvoice.LoopMode = 3;
break; break;
case 3: case 3:
thisvoice.LoopStartA = (thisvoice.LoopStartA & 0x0F0000) | (value & 0xFFF8); thisvoice.LoopStartA = (thisvoice.LoopStartA & 0x0F0000) | (value & 0xFFF8);
thisvoice.LoopMode = 3; thisvoice.LoopMode = 3;
@ -892,13 +888,13 @@ __forceinline void SPU2_FastWrite( u32 rmem, u16 value )
case 4: case 4:
thisvoice.NextA = ((value & 0x0F) << 16) | (thisvoice.NextA & 0xFFF8); thisvoice.NextA = ((value & 0x0F) << 16) | (thisvoice.NextA & 0xFFF8);
break; break;
case 5: case 5:
thisvoice.NextA = (thisvoice.NextA & 0x0F0000) | (value & 0xFFF8); thisvoice.NextA = (thisvoice.NextA & 0x0F0000) | (value & 0xFFF8);
break; break;
} }
} }
else if((mem>=0x07C0) && (mem<0x07CE)) else if((mem>=0x07C0) && (mem<0x07CE))
{ {
*(regtable[mem>>1]) = value; *(regtable[mem>>1]) = value;
UpdateSpdifMode(); UpdateSpdifMode();
@ -1040,10 +1036,10 @@ __forceinline void SPU2_FastWrite( u32 rmem, u16 value )
break; break;
case REG_P_MMIX: case REG_P_MMIX:
// Each MMIX gate is assigned either 0 or 0xffffffff depending on the status // 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. :) // of the MMIX bits. I use -1 below as a shorthand for 0xffffffff. :)
vx = value; vx = value;
if (core == 0) vx&=0xFF0; if (core == 0) vx&=0xFF0;
thiscore.WetGate.ExtR = (vx & 0x001) ? -1 : 0; thiscore.WetGate.ExtR = (vx & 0x001) ? -1 : 0;
@ -1081,7 +1077,7 @@ __forceinline void SPU2_FastWrite( u32 rmem, u16 value )
thiscore.Regs.ENDX&=0x00FF0000; thiscore.Regs.ENDX&=0x00FF0000;
break; break;
case (REG_S_ENDX + 2): case (REG_S_ENDX + 2):
thiscore.Regs.ENDX&=0xFFFF; thiscore.Regs.ENDX&=0xFFFF;
break; break;
@ -1109,16 +1105,16 @@ __forceinline void SPU2_FastWrite( u32 rmem, u16 value )
thiscore.UpdateEffectsBufferSize(); thiscore.UpdateEffectsBufferSize();
thiscore.ReverbX = 0; thiscore.ReverbX = 0;
break; break;
// Master Volume Address Write! // Master Volume Address Write!
case REG_P_MVOLL: case REG_P_MVOLL:
case REG_P_MVOLR: case REG_P_MVOLR:
{ {
V_VolumeSlide& thisvol = (omem==REG_P_MVOLL) ? thiscore.MasterVol.Left : thiscore.MasterVol.Right; V_VolumeSlide& thisvol = (omem==REG_P_MVOLL) ? thiscore.MasterVol.Left : thiscore.MasterVol.Right;
if( value & 0x8000 ) // +Lin/-Lin/+Exp/-Exp if( value & 0x8000 ) // +Lin/-Lin/+Exp/-Exp
{ {
thisvol.Mode = (value & 0xE000) / 0x2000; thisvol.Mode = (value & 0xE000) / 0x2000;
thisvol.Increment = (value & 0x7F); // | ((value & 0x800)/0x10); thisvol.Increment = (value & 0x7F); // | ((value & 0x800)/0x10);
} }
@ -1143,7 +1139,7 @@ __forceinline void SPU2_FastWrite( u32 rmem, u16 value )
case REG_P_EVOLR: case REG_P_EVOLR:
thiscore.FxVol.Right = GetVol32( value ); thiscore.FxVol.Right = GetVol32( value );
break; break;
case REG_P_AVOLL: case REG_P_AVOLL:
thiscore.ExtVol.Left = GetVol32( value ); thiscore.ExtVol.Left = GetVol32( value );
break; break;
@ -1151,7 +1147,7 @@ __forceinline void SPU2_FastWrite( u32 rmem, u16 value )
case REG_P_AVOLR: case REG_P_AVOLR:
thiscore.ExtVol.Right = GetVol32( value ); thiscore.ExtVol.Right = GetVol32( value );
break; break;
case REG_P_BVOLL: case REG_P_BVOLL:
thiscore.InpVol.Left = GetVol32( value ); thiscore.InpVol.Left = GetVol32( value );
break; break;
@ -1186,7 +1182,7 @@ void StartVoices(int core, u32 value)
if( value == 0 ) return; if( value == 0 ) return;
Cores[core].Regs.ENDX &= ~value; Cores[core].Regs.ENDX &= ~value;
for( u8 vc=0; vc<V_Core::NumVoices; vc++ ) for( u8 vc=0; vc<V_Core::NumVoices; vc++ )
{ {
if ((value>>vc) & 1) if ((value>>vc) & 1)

View File

@ -0,0 +1,261 @@
/*
* Copyright (C) 2001 Edmund Grimley Evans <edmundo@rano.org>
*
* 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 <assert.h>
#include <errno.h>
#include <iconv.h>
#include <stdlib.h>
#include <string.h>
/*
* 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) */

View File

@ -6,12 +6,12 @@
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or * the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * 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; size += 3;
} }
c = unicode[index++]; c = unicode[index++];
} }
out = (unsigned char*)malloc(size + 1); out = (unsigned char*)malloc(size + 1);
if (out == NULL) if (out == NULL)
@ -98,7 +98,7 @@ static wchar_t *make_unicode_string(const unsigned char *utf8)
} }
size += 1; size += 1;
c = utf8[index++]; c = utf8[index++];
} }
out = (wchar_t*)malloc((size + 1) * sizeof(wchar_t)); out = (wchar_t*)malloc((size + 1) * sizeof(wchar_t));
if (out == NULL) if (out == NULL)
@ -143,13 +143,13 @@ int utf8_encode(const char *from, char **to)
} }
unicode = (wchar_t*)calloc(wchars + 1, sizeof(unsigned short)); 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"); fprintf(stderr, "Out of memory processing string to UTF8\n");
return -1; return -1;
} }
err = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, from, err = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, from,
strlen(from), unicode, wchars); strlen(from), unicode, wchars);
if(err != wchars) if(err != wchars)
{ {
@ -158,7 +158,7 @@ int utf8_encode(const char *from, char **to)
return -1; 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. * MS doesn't actually have a consistent API across win32.
*/ */
*to = (char*)make_utf8_string(unicode); *to = (char*)make_utf8_string(unicode);
@ -172,11 +172,11 @@ int utf8_decode(const char *from, char **to)
wchar_t *unicode; wchar_t *unicode;
int chars, err; 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. * MS doesn't actually have a consistent API across win32.
*/ */
unicode = make_unicode_string((unsigned char*)from); 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"); fprintf(stderr, "Out of memory processing string from UTF8 to UNICODE16\n");
return -1; return -1;
@ -193,14 +193,14 @@ int utf8_decode(const char *from, char **to)
} }
*to = (char *)calloc(chars + 1, sizeof(unsigned char)); *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"); fprintf(stderr, "Out of memory processing string to local charset\n");
free(unicode); free(unicode);
return -1; return -1;
} }
err = WideCharToMultiByte(GetConsoleCP(), WC_COMPOSITECHECK, unicode, err = WideCharToMultiByte(GetConsoleCP(), WC_COMPOSITECHECK, unicode,
-1, *to, chars, NULL, NULL); -1, *to, chars, NULL, NULL);
if(err != chars) if(err != chars)
{ {
@ -217,12 +217,11 @@ int utf8_decode(const char *from, char **to)
#else /* End win32. Rest is for real operating systems */ #else /* End win32. Rest is for real operating systems */
#ifdef HAVE_LANGINFO_CODESET #ifdef HAVE_LANGINFO_CODESET
#include <langinfo.h> #include <langinfo.h>
#endif #endif
int iconvert(const char *fromcode, const char *tocode, extern int iconvert(const char *fromcode, const char *tocode,
const char *from, size_t fromlen, const char *from, size_t fromlen,
char **to, size_t *tolen); char **to, size_t *tolen);
@ -251,17 +250,17 @@ static int convert_buffer(const char *fromcode, const char *tocode,
{ {
int ret = -1; int ret = -1;
#ifdef HAVE_ICONV //#ifdef HAVE_ICONV
ret = iconvert(fromcode, tocode, from, fromlen, to, tolen); ret = iconvert(fromcode, tocode, from, fromlen, to, tolen);
if (ret != -1) if (ret != -1)
return ret; return ret;
#endif //#endif
#ifndef HAVE_ICONV /* should be ifdef USE_CHARSET_CONVERT */ //#ifndef HAVE_ICONV /* should be ifdef USE_CHARSET_CONVERT */
ret = charset_convert(fromcode, tocode, from, fromlen, to, tolen); // ret = charset_convert(fromcode, tocode, from, fromlen, to, tolen);
if (ret != -1) // if (ret != -1)
return ret; // return ret;
#endif //#endif
return ret; return ret;
} }

View File

@ -9,7 +9,6 @@
<Target title="Debug"> <Target title="Debug">
<Option output="../../../bin/plugins/libZeroSPU2.so.0.1.0" prefix_auto="0" extension_auto="0" /> <Option output="../../../bin/plugins/libZeroSPU2.so.0.1.0" prefix_auto="0" extension_auto="0" />
<Option object_output="obj/Debug/" /> <Option object_output="obj/Debug/" />
<Option external_deps="../../../3rdparty/SoundTouch/libSoundTouch.a;" />
<Option type="3" /> <Option type="3" />
<Option compiler="gcc" /> <Option compiler="gcc" />
<Option createDefFile="1" /> <Option createDefFile="1" />
@ -38,6 +37,7 @@
<Add option="`pkg-config gtk+-2.0 --cflags`" /> <Add option="`pkg-config gtk+-2.0 --cflags`" />
<Add option="-fPIC" /> <Add option="-fPIC" />
<Add option="-m32" /> <Add option="-m32" />
<Add option="-msse2" />
<Add option="-DVERSION=1" /> <Add option="-DVERSION=1" />
<Add directory="../Linux" /> <Add directory="../Linux" />
<Add directory="../../zerospu2" /> <Add directory="../../zerospu2" />
@ -53,6 +53,27 @@
<Add library="stdc++" /> <Add library="stdc++" />
<Add library="dl" /> <Add library="dl" />
</Linker> </Linker>
<Unit filename="../../../3rdparty/SoundTouch/AAFilter.cpp" />
<Unit filename="../../../3rdparty/SoundTouch/AAFilter.h" />
<Unit filename="../../../3rdparty/SoundTouch/BPMDetect.h" />
<Unit filename="../../../3rdparty/SoundTouch/FIFOSampleBuffer.cpp" />
<Unit filename="../../../3rdparty/SoundTouch/FIFOSampleBuffer.h" />
<Unit filename="../../../3rdparty/SoundTouch/FIFOSamplePipe.h" />
<Unit filename="../../../3rdparty/SoundTouch/FIRFilter.cpp" />
<Unit filename="../../../3rdparty/SoundTouch/FIRFilter.h" />
<Unit filename="../../../3rdparty/SoundTouch/RateTransposer.cpp" />
<Unit filename="../../../3rdparty/SoundTouch/RateTransposer.h" />
<Unit filename="../../../3rdparty/SoundTouch/STTypes.h" />
<Unit filename="../../../3rdparty/SoundTouch/SoundTouch.cpp" />
<Unit filename="../../../3rdparty/SoundTouch/SoundTouch.h" />
<Unit filename="../../../3rdparty/SoundTouch/TDStretch.cpp" />
<Unit filename="../../../3rdparty/SoundTouch/TDStretch.h" />
<Unit filename="../../../3rdparty/SoundTouch/WavFile.cpp" />
<Unit filename="../../../3rdparty/SoundTouch/WavFile.h" />
<Unit filename="../../../3rdparty/SoundTouch/cpu_detect.h" />
<Unit filename="../../../3rdparty/SoundTouch/cpu_detect_x86_gcc.cpp" />
<Unit filename="../../../3rdparty/SoundTouch/mmx_optimized.cpp" />
<Unit filename="../../../3rdparty/SoundTouch/sse_optimized.cpp" />
<Unit filename="Alsa.cpp" /> <Unit filename="Alsa.cpp" />
<Unit filename="Linux.cpp" /> <Unit filename="Linux.cpp" />
<Unit filename="Linux.h" /> <Unit filename="Linux.h" />
@ -66,7 +87,6 @@
<Option compilerVar="CC" /> <Option compilerVar="CC" />
</Unit> </Unit>
<Unit filename="support.h" /> <Unit filename="support.h" />
<Unit filename="zerospu2.glade" />
<Unit filename="../misc.h" /> <Unit filename="../misc.h" />
<Unit filename="../reg.h" /> <Unit filename="../reg.h" />
<Unit filename="../voices.cpp" /> <Unit filename="../voices.cpp" />