diff --git a/3rdparty/portaudio/CMakeLists.txt b/3rdparty/portaudio/CMakeLists.txt
new file mode 100644
index 000000000..febdf2f01
--- /dev/null
+++ b/3rdparty/portaudio/CMakeLists.txt
@@ -0,0 +1,344 @@
+# $Id: $
+#
+# For a "How-To" please refer to the Portaudio documentation at:
+# http://www.portaudio.com/trac/wiki/TutorialDir/Compile/CMake
+#
+PROJECT( portaudio )
+
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
+
+OPTION(PA_CONFIG_LIB_OUTPUT_PATH "Make sure that output paths are kept neat" OFF)
+IF(CMAKE_CL_64)
+SET(TARGET_POSTFIX x64)
+IF(PA_CONFIG_LIB_OUTPUT_PATH)
+SET(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/bin/x64)
+ENDIF(PA_CONFIG_LIB_OUTPUT_PATH)
+ELSE(CMAKE_CL_64)
+SET(TARGET_POSTFIX x86)
+IF(PA_CONFIG_LIB_OUTPUT_PATH)
+SET(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/bin/Win32)
+ENDIF(PA_CONFIG_LIB_OUTPUT_PATH)
+ENDIF(CMAKE_CL_64)
+
+IF(WIN32 AND MSVC)
+OPTION(PA_DLL_LINK_WITH_STATIC_RUNTIME "Link with static runtime libraries (minimizes runtime dependencies)" ON)
+IF(PA_DLL_LINK_WITH_STATIC_RUNTIME)
+ FOREACH(flag_var
+ CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
+ CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
+ CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
+ CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
+ IF(${flag_var} MATCHES "/MD")
+ STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
+ ENDIF(${flag_var} MATCHES "/MD")
+ ENDFOREACH(flag_var)
+ENDIF(PA_DLL_LINK_WITH_STATIC_RUNTIME)
+
+ENDIF(WIN32 AND MSVC)
+
+IF(WIN32)
+OPTION(PA_UNICODE_BUILD "Enable Portaudio Unicode build" ON)
+
+SET(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake_support)
+# Try to find DirectX SDK
+FIND_PACKAGE(DXSDK)
+# Try to find ASIO SDK (assumes that portaudio and asiosdk folders are side-by-side, see
+# http://www.portaudio.com/trac/wiki/TutorialDir/Compile/WindowsASIOMSVC)
+FIND_PACKAGE(ASIOSDK)
+
+IF(ASIOSDK_FOUND)
+OPTION(PA_USE_ASIO "Enable support for ASIO" ON)
+ELSE(ASIOSDK_FOUND)
+OPTION(PA_USE_ASIO "Enable support for ASIO" OFF)
+ENDIF(ASIOSDK_FOUND)
+IF(DXSDK_FOUND)
+OPTION(PA_USE_DS "Enable support for DirectSound" ON)
+ELSE(DXSDK_FOUND)
+OPTION(PA_USE_DS "Enable support for DirectSound" OFF)
+ENDIF(DXSDK_FOUND)
+OPTION(PA_USE_WMME "Enable support for MME" ON)
+OPTION(PA_USE_WASAPI "Enable support for WASAPI" ON)
+OPTION(PA_USE_WDMKS "Enable support for WDMKS" ON)
+OPTION(PA_USE_WDMKS_DEVICE_INFO "Use WDM/KS API for device info" ON)
+MARK_AS_ADVANCED(PA_USE_WDMKS_DEVICE_INFO)
+IF(PA_USE_DS)
+OPTION(PA_USE_DIRECTSOUNDFULLDUPLEXCREATE "Use DirectSound full duplex create" ON)
+MARK_AS_ADVANCED(PA_USE_DIRECTSOUNDFULLDUPLEXCREATE)
+ENDIF(PA_USE_DS)
+ENDIF(WIN32)
+
+# Set variables for DEF file expansion
+IF(NOT PA_USE_ASIO)
+SET(DEF_EXCLUDE_ASIO_SYMBOLS ";")
+ENDIF(NOT PA_USE_ASIO)
+
+IF(NOT PA_USE_WASAPI)
+SET(DEF_EXCLUDE_WASAPI_SYMBOLS ";")
+ENDIF(NOT PA_USE_WASAPI)
+
+IF(PA_USE_WDMKS_DEVICE_INFO)
+ADD_DEFINITIONS(-DPAWIN_USE_WDMKS_DEVICE_INFO)
+ENDIF(PA_USE_WDMKS_DEVICE_INFO)
+
+IF(PA_USE_DIRECTSOUNDFULLDUPLEXCREATE)
+ADD_DEFINITIONS(-DPAWIN_USE_DIRECTSOUNDFULLDUPLEXCREATE)
+ENDIF(PA_USE_DIRECTSOUNDFULLDUPLEXCREATE)
+
+#######################################
+IF(WIN32)
+INCLUDE_DIRECTORIES(src/os/win)
+ENDIF(WIN32)
+
+IF(PA_USE_ASIO)
+INCLUDE_DIRECTORIES(${ASIOSDK_ROOT_DIR}/common)
+INCLUDE_DIRECTORIES(${ASIOSDK_ROOT_DIR}/host)
+INCLUDE_DIRECTORIES(${ASIOSDK_ROOT_DIR}/host/pc)
+
+SET(PA_ASIO_INCLUDES
+ include/pa_asio.h
+)
+
+SET(PA_ASIO_SOURCES
+ src/hostapi/asio/pa_asio.cpp
+)
+
+SET(PA_ASIOSDK_SOURCES
+ ${ASIOSDK_ROOT_DIR}/common/asio.cpp
+ ${ASIOSDK_ROOT_DIR}/host/pc/asiolist.cpp
+ ${ASIOSDK_ROOT_DIR}/host/asiodrivers.cpp
+)
+
+SOURCE_GROUP("hostapi\\ASIO" FILES
+ ${PA_ASIO_SOURCES}
+)
+
+SOURCE_GROUP("hostapi\\ASIO\\ASIOSDK" FILES
+ ${PA_ASIOSDK_SOURCES}
+)
+ENDIF(PA_USE_ASIO)
+
+IF(PA_USE_DS)
+INCLUDE_DIRECTORIES(${DXSDK_INCLUDE_DIR})
+INCLUDE_DIRECTORIES(src/os/win)
+
+SET(PA_DS_INCLUDES
+ include/pa_win_ds.h
+ src/hostapi/dsound/pa_win_ds_dynlink.h
+)
+
+SET(PA_DS_SOURCES
+ src/hostapi/dsound/pa_win_ds.c
+ src/hostapi/dsound/pa_win_ds_dynlink.c
+)
+
+SOURCE_GROUP("hostapi\\dsound" FILES
+ ${PA_DS_INCLUDES}
+ ${PA_DS_SOURCES}
+)
+ENDIF(PA_USE_DS)
+
+IF(PA_USE_WMME)
+
+SET(PA_WMME_INCLUDES
+ include/pa_win_wmme.h
+)
+
+SET(PA_WMME_SOURCES
+ src/hostapi/wmme/pa_win_wmme.c
+)
+
+SOURCE_GROUP("hostapi\\wmme" FILES
+ ${PA_WMME_SOURCES}
+)
+ENDIF(PA_USE_WMME)
+
+IF(PA_USE_WASAPI)
+
+SET(PA_WASAPI_INCLUDES
+ include/pa_win_wasapi.h
+)
+
+SET(PA_WASAPI_SOURCES
+ src/hostapi/wasapi/pa_win_wasapi.c
+)
+
+SOURCE_GROUP("hostapi\\wasapi" FILES
+ ${PA_WASAPI_SOURCES}
+)
+ENDIF(PA_USE_WASAPI)
+
+IF(PA_USE_WDMKS)
+
+SET(PA_WDMKS_INCLUDES
+ include/pa_win_wdmks.h
+)
+
+SET(PA_WDMKS_SOURCES
+ src/hostapi/wdmks/pa_win_wdmks.c
+)
+
+SOURCE_GROUP("hostapi\\wdmks" FILES
+ ${PA_WDMKS_SOURCES}
+)
+ENDIF(PA_USE_WDMKS)
+
+SET(PA_SKELETON_SOURCES
+ src/hostapi/skeleton/pa_hostapi_skeleton.c
+)
+
+SOURCE_GROUP("hostapi\\skeleton"
+ ${PA_SKELETON_SOURCES})
+
+#######################################
+IF(WIN32)
+SET(PA_INCLUDES
+ include/portaudio.h
+ ${PA_ASIO_INCLUDES}
+ ${PA_DS_INCLUDES}
+ ${PA_WMME_INCLUDES}
+ ${PA_WASAPI_INCLUDES}
+ ${PA_WDMKS_INCLUDES}
+)
+ENDIF(WIN32)
+
+SOURCE_GROUP("include" FILES
+ ${PA_INCLUDES}
+)
+
+SET(PA_COMMON_INCLUDES
+ src/common/pa_allocation.h
+ src/common/pa_converters.h
+ src/common/pa_cpuload.h
+ src/common/pa_debugprint.h
+ src/common/pa_dither.h
+ src/common/pa_endianness.h
+ src/common/pa_hostapi.h
+ src/common/pa_memorybarrier.h
+ src/common/pa_process.h
+ src/common/pa_ringbuffer.h
+ src/common/pa_stream.h
+ src/common/pa_trace.h
+ src/common/pa_types.h
+ src/common/pa_util.h
+)
+
+SET(PA_COMMON_SOURCES
+ src/common/pa_allocation.c
+ src/common/pa_converters.c
+ src/common/pa_cpuload.c
+ src/common/pa_debugprint.c
+ src/common/pa_dither.c
+ src/common/pa_front.c
+ src/common/pa_process.c
+ src/common/pa_ringbuffer.c
+ src/common/pa_stream.c
+ src/common/pa_trace.c
+)
+
+SOURCE_GROUP("common" FILES
+ ${PA_COMMON_INCLUDES}
+ ${PA_COMMON_SOURCES}
+)
+
+SOURCE_GROUP("cmake_generated" FILES
+ ${CMAKE_CURRENT_BINARY_DIR}/portaudio_cmake.def
+ ${CMAKE_CURRENT_BINARY_DIR}/options_cmake.h
+)
+
+IF(WIN32)
+SET(PA_PLATFORM_SOURCES
+ src/os/win/pa_win_hostapis.c
+ src/os/win/pa_win_util.c
+ src/os/win/pa_win_waveformat.c
+ src/os/win/pa_win_wdmks_utils.c
+ src/os/win/pa_win_coinitialize.c
+ src/os/win/pa_x86_plain_converters.c
+)
+
+SOURCE_GROUP("os\\win" FILES
+ ${PA_PLATFORM_SOURCES}
+)
+ENDIF(WIN32)
+
+INCLUDE_DIRECTORIES( include )
+INCLUDE_DIRECTORIES( src/common )
+
+IF(WIN32 AND MSVC)
+ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
+ENDIF(WIN32 AND MSVC)
+
+ADD_DEFINITIONS(-DPORTAUDIO_CMAKE_GENERATED)
+INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR} )
+
+SET(SOURCES_LESS_ASIO_SDK
+ ${PA_COMMON_SOURCES}
+ ${PA_ASIO_SOURCES}
+ ${PA_DS_SOURCES}
+ ${PA_WMME_SOURCES}
+ ${PA_WASAPI_SOURCES}
+ ${PA_WDMKS_SOURCES}
+ ${PA_SKELETON_SOURCES}
+ ${PA_PLATFORM_SOURCES}
+)
+
+IF(PA_UNICODE_BUILD)
+SET_SOURCE_FILES_PROPERTIES(
+ ${SOURCES_LESS_ASIO_SDK}
+ PROPERTIES
+ COMPILE_DEFINITIONS "UNICODE;_UNICODE"
+)
+ENDIF(PA_UNICODE_BUILD)
+
+ADD_LIBRARY(portaudio SHARED
+ ${PA_INCLUDES}
+ ${PA_COMMON_INCLUDES}
+ ${SOURCES_LESS_ASIO_SDK}
+ ${PA_ASIOSDK_SOURCES}
+ ${CMAKE_CURRENT_BINARY_DIR}/portaudio_cmake.def
+ ${CMAKE_CURRENT_BINARY_DIR}/options_cmake.h
+)
+
+ADD_LIBRARY(portaudio_static STATIC
+ ${PA_INCLUDES}
+ ${PA_COMMON_INCLUDES}
+ ${SOURCES_LESS_ASIO_SDK}
+ ${PA_ASIOSDK_SOURCES}
+ ${CMAKE_CURRENT_BINARY_DIR}/options_cmake.h
+)
+
+# Configure the exports file according to settings
+SET(GENERATED_MESSAGE "CMake generated file, do NOT edit! Use CMake-GUI to change configuration instead.")
+CONFIGURE_FILE( cmake_support/template_portaudio.def ${CMAKE_CURRENT_BINARY_DIR}/portaudio_cmake.def @ONLY )
+# Configure header for options (PA_USE_xxx)
+CONFIGURE_FILE( cmake_support/options_cmake.h.in ${CMAKE_CURRENT_BINARY_DIR}/options_cmake.h @ONLY )
+
+IF(WIN32)
+# If we use DirectSound, we need this for the library to be found (if not in VS project settings)
+IF(PA_USE_DS AND DXSDK_FOUND)
+TARGET_LINK_LIBRARIES(portaudio ${DXSDK_DSOUND_LIBRARY})
+ENDIF(PA_USE_DS AND DXSDK_FOUND)
+
+# If we use WDM/KS we need setupapi.lib
+IF(PA_USE_WDMKS)
+TARGET_LINK_LIBRARIES(portaudio setupapi)
+ENDIF(PA_USE_WDMKS)
+
+SET_TARGET_PROPERTIES(portaudio PROPERTIES OUTPUT_NAME portaudio_${TARGET_POSTFIX})
+SET_TARGET_PROPERTIES(portaudio_static PROPERTIES OUTPUT_NAME portaudio_static_${TARGET_POSTFIX})
+ENDIF(WIN32)
+
+OPTION(PA_BUILD_TESTS "Include test projects" OFF)
+OPTION(PA_BUILD_EXAMPLES "Include example projects" OFF)
+
+# Prepared for inclusion of test files
+IF(PA_BUILD_TESTS)
+SUBDIRS(test)
+ENDIF(PA_BUILD_TESTS)
+
+# Prepared for inclusion of test files
+IF(PA_BUILD_EXAMPLES)
+SUBDIRS(examples)
+ENDIF(PA_BUILD_EXAMPLES)
+
+#################################
+
diff --git a/3rdparty/portaudio/build/msvc/portaudio.vcproj b/3rdparty/portaudio/build/msvc/portaudio.vcproj
index 4a7e3525c..5c91a11f5 100644
--- a/3rdparty/portaudio/build/msvc/portaudio.vcproj
+++ b/3rdparty/portaudio/build/msvc/portaudio.vcproj
@@ -942,6 +942,10 @@
RelativePath="..\..\include\pa_win_waveformat.h"
>
+
+
diff --git a/3rdparty/portaudio/build/msvc/portaudio.vcxproj b/3rdparty/portaudio/build/msvc/portaudio.vcxproj
index 646d1eba3..20f244010 100644
--- a/3rdparty/portaudio/build/msvc/portaudio.vcxproj
+++ b/3rdparty/portaudio/build/msvc/portaudio.vcxproj
@@ -639,6 +639,7 @@
+
diff --git a/3rdparty/portaudio/build/msvc/portaudio.vcxproj.filters b/3rdparty/portaudio/build/msvc/portaudio.vcxproj.filters
index 30203b306..29aa7178a 100644
--- a/3rdparty/portaudio/build/msvc/portaudio.vcxproj.filters
+++ b/3rdparty/portaudio/build/msvc/portaudio.vcxproj.filters
@@ -175,5 +175,8 @@
Header Files
+
+ Header Files
+
\ No newline at end of file
diff --git a/3rdparty/portaudio/cmake_support/FindASIOSDK.cmake b/3rdparty/portaudio/cmake_support/FindASIOSDK.cmake
new file mode 100644
index 000000000..55ad33d95
--- /dev/null
+++ b/3rdparty/portaudio/cmake_support/FindASIOSDK.cmake
@@ -0,0 +1,41 @@
+# $Id: $
+#
+# - Try to find the ASIO SDK
+# Once done this will define
+#
+# ASIOSDK_FOUND - system has ASIO SDK
+# ASIOSDK_ROOT_DIR - path to the ASIO SDK base directory
+# ASIOSDK_INCLUDE_DIR - the ASIO SDK include directory
+
+if(WIN32)
+else(WIN32)
+ message(FATAL_ERROR "FindASIOSDK.cmake: Unsupported platform ${CMAKE_SYSTEM_NAME}" )
+endif(WIN32)
+
+file(GLOB results "${CMAKE_CURRENT_SOURCE_DIR}/../as*")
+foreach(f ${results})
+ if(IS_DIRECTORY ${f})
+ set(ASIOSDK_PATH_HINT ${ASIOSDK_PATH_HINT} ${f})
+ endif()
+endforeach()
+
+find_path(ASIOSDK_ROOT_DIR
+ common/asio.h
+ HINTS
+ ${ASIOSDK_PATH_HINT}
+)
+
+find_path(ASIOSDK_INCLUDE_DIR
+ asio.h
+ PATHS
+ ${ASIOSDK_ROOT_DIR}/common
+)
+
+# handle the QUIETLY and REQUIRED arguments and set ASIOSDK_FOUND to TRUE if
+# all listed variables are TRUE
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(ASIOSDK DEFAULT_MSG ASIOSDK_ROOT_DIR ASIOSDK_INCLUDE_DIR)
+
+MARK_AS_ADVANCED(
+ ASIOSDK_ROOT_DIR ASIOSDK_INCLUDE_DIR
+)
diff --git a/3rdparty/portaudio/cmake_support/FindDXSDK.cmake b/3rdparty/portaudio/cmake_support/FindDXSDK.cmake
new file mode 100644
index 000000000..3d2f021d8
--- /dev/null
+++ b/3rdparty/portaudio/cmake_support/FindDXSDK.cmake
@@ -0,0 +1,59 @@
+# $Id: $
+#
+# - Try to find the DirectX SDK
+# Once done this will define
+#
+# DXSDK_FOUND - system has DirectX SDK
+# DXSDK_ROOT_DIR - path to the DirectX SDK base directory
+# DXSDK_INCLUDE_DIR - the DirectX SDK include directory
+# DXSDK_LIBRARY_DIR - DirectX SDK libraries path
+#
+# DXSDK_DSOUND_LIBRARY - Path to dsound.lib
+#
+
+if(WIN32)
+else(WIN32)
+ message(FATAL_ERROR "FindDXSDK.cmake: Unsupported platform ${CMAKE_SYSTEM_NAME}" )
+endif(WIN32)
+
+find_path(DXSDK_ROOT_DIR
+ include/dxsdkver.h
+ HINTS
+ $ENV{DXSDK_DIR}
+)
+
+find_path(DXSDK_INCLUDE_DIR
+ dxsdkver.h
+ PATHS
+ ${DXSDK_ROOT_DIR}/include
+)
+
+IF(CMAKE_CL_64)
+find_path(DXSDK_LIBRARY_DIR
+ dsound.lib
+ PATHS
+ ${DXSDK_ROOT_DIR}/lib/x64
+)
+ELSE(CMAKE_CL_64)
+find_path(DXSDK_LIBRARY_DIR
+ dsound.lib
+ PATHS
+ ${DXSDK_ROOT_DIR}/lib/x86
+)
+ENDIF(CMAKE_CL_64)
+
+find_library(DXSDK_DSOUND_LIBRARY
+ dsound.lib
+ PATHS
+ ${DXSDK_LIBRARY_DIR}
+)
+
+# handle the QUIETLY and REQUIRED arguments and set DXSDK_FOUND to TRUE if
+# all listed variables are TRUE
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(DXSDK DEFAULT_MSG DXSDK_ROOT_DIR DXSDK_INCLUDE_DIR)
+
+MARK_AS_ADVANCED(
+ DXSDK_ROOT_DIR DXSDK_INCLUDE_DIR
+ DXSDK_LIBRARY_DIR DXSDK_DSOUND_LIBRARY
+)
diff --git a/3rdparty/portaudio/cmake_support/options_cmake.h.in b/3rdparty/portaudio/cmake_support/options_cmake.h.in
new file mode 100644
index 000000000..cd076058e
--- /dev/null
+++ b/3rdparty/portaudio/cmake_support/options_cmake.h.in
@@ -0,0 +1,31 @@
+/* $Id: $
+
+ !!! @GENERATED_MESSAGE@ !!!
+
+ Header file configured by CMake to convert CMake options/vars to macros. It is done this way because if set via
+ preprocessor options, MSVC f.i. has no way of knowing when an option (or var) changes as there is no dependency chain.
+
+ The generated "options_cmake.h" should be included like so:
+
+ #ifdef PORTAUDIO_CMAKE_GENERATED
+ #include "options_cmake.h"
+ #endif
+
+ so that non-CMake build environments are left intact.
+
+ Source template: cmake_support/options_cmake.h.in
+*/
+
+#ifdef _WIN32
+#if defined(PA_USE_ASIO) || defined(PA_USE_DS) || defined(PA_USE_WMME) || defined(PA_USE_WASAPI) || defined(PA_USE_WDMKS)
+#error "This header needs to be included before pa_hostapi.h!!"
+#endif
+
+#cmakedefine01 PA_USE_ASIO
+#cmakedefine01 PA_USE_DS
+#cmakedefine01 PA_USE_WMME
+#cmakedefine01 PA_USE_WASAPI
+#cmakedefine01 PA_USE_WDMKS
+#else
+#error "Platform currently not supported by CMake script"
+#endif
diff --git a/3rdparty/portaudio/cmake_support/template_portaudio.def b/3rdparty/portaudio/cmake_support/template_portaudio.def
new file mode 100644
index 000000000..8ce2a98bf
--- /dev/null
+++ b/3rdparty/portaudio/cmake_support/template_portaudio.def
@@ -0,0 +1,53 @@
+; $Id: $
+;
+; !!! @GENERATED_MESSAGE@ !!!
+EXPORTS
+
+;
+Pa_GetVersion @1
+Pa_GetVersionText @2
+Pa_GetErrorText @3
+Pa_Initialize @4
+Pa_Terminate @5
+Pa_GetHostApiCount @6
+Pa_GetDefaultHostApi @7
+Pa_GetHostApiInfo @8
+Pa_HostApiTypeIdToHostApiIndex @9
+Pa_HostApiDeviceIndexToDeviceIndex @10
+Pa_GetLastHostErrorInfo @11
+Pa_GetDeviceCount @12
+Pa_GetDefaultInputDevice @13
+Pa_GetDefaultOutputDevice @14
+Pa_GetDeviceInfo @15
+Pa_IsFormatSupported @16
+Pa_OpenStream @17
+Pa_OpenDefaultStream @18
+Pa_CloseStream @19
+Pa_SetStreamFinishedCallback @20
+Pa_StartStream @21
+Pa_StopStream @22
+Pa_AbortStream @23
+Pa_IsStreamStopped @24
+Pa_IsStreamActive @25
+Pa_GetStreamInfo @26
+Pa_GetStreamTime @27
+Pa_GetStreamCpuLoad @28
+Pa_ReadStream @29
+Pa_WriteStream @30
+Pa_GetStreamReadAvailable @31
+Pa_GetStreamWriteAvailable @32
+Pa_GetSampleSize @33
+Pa_Sleep @34
+@DEF_EXCLUDE_ASIO_SYMBOLS@PaAsio_GetAvailableBufferSizes @50
+@DEF_EXCLUDE_ASIO_SYMBOLS@PaAsio_ShowControlPanel @51
+PaUtil_InitializeX86PlainConverters @52
+@DEF_EXCLUDE_ASIO_SYMBOLS@PaAsio_GetInputChannelName @53
+@DEF_EXCLUDE_ASIO_SYMBOLS@PaAsio_GetOutputChannelName @54
+PaUtil_SetDebugPrintFunction @55
+@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetDeviceDefaultFormat @56
+@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetDeviceRole @57
+@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_ThreadPriorityBoost @58
+@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_ThreadPriorityRevert @59
+@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetFramesPerHostBuffer @60
+@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetJackDescription @61
+@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetJackCount @62
diff --git a/3rdparty/portaudio/doc/src/mainpage.dox b/3rdparty/portaudio/doc/src/mainpage.dox
index 3b3cf8671..8f40edeb7 100644
--- a/3rdparty/portaudio/doc/src/mainpage.dox
+++ b/3rdparty/portaudio/doc/src/mainpage.dox
@@ -1,60 +1,60 @@
-/* doxygen index page */
-/** @mainpage
-
-@section overview Overview
-
-PortAudio is a cross-platform, open-source C language library for real-time audio input and output. The library provides functions that allow your software to acquire and output real-time audio streams from your computer's hardware audio interfaces. It is designed to simplify writing cross-platform audio applications, and also to simplify the development of audio software in general by hiding the complexities of dealing directly with each native audio API. PortAudio is used to implement sound recording, editing and mixing applications, software synthesizers, effects processors, music players, internet telephony applications, software defined radios and more. Supported platforms include MS Windows, Mac OS X and Linux. Third-party language bindings make it possible to call PortAudio from other programming languages including C++, C#, Python, PureBasic, FreePascal and Lazarus.
-
-
-@section start_here Start here
-
-- @ref api_overview
-A top-down view of the PortAudio API, its capabilities, functions and data structures
-
-- PortAudio Tutorials
-Get started writing code with PortAudio tutorials
-
-- @ref examples_src "Examples"
-Simple example programs demonstrating PortAudio usage
-
-- @ref License
-PortAudio is licenced under the MIT Expat open source licence. We make a non-binding request for you to contribute your changes back to the project.
-
-
-@section reference API Reference
-
-- portaudio.h Portable API
-Detailed documentation for each portable API function and data type
-
-- @ref public_header "Host API Specific Extensions"
-Documentation for non-portable platform-specific host API extensions
-
-
-@section resources Resources
-
-- The PortAudio website
-
-- Our mailing list for users and developers
-
-- The PortAudio wiki
-
-
-@section developer_resources Developer Resources
-
-@if INTERNAL
-- @ref srcguide
-@endif
-
-- Our Trac wiki and issue tracking system
-
-- Coding guidelines
-
-If you're interested in helping out with PortAudio development we're more than happy for you to be involved. Just drop by the PortAudio mailing list and ask how you can help. Or check out the starter tickets in Trac.
-
-
-@section older_api_versions Older API Versions
-
-This documentation covers the current API version: PortAudio V19, API version 2.0. API 2.0 differs in a number of ways from previous versions (most often encountered in PortAudio V18), please consult the enhancement proposals for details of what was added/changed for V19:
-http://www.portaudio.com/docs/proposals/index.html
-
+/* doxygen index page */
+/** @mainpage
+
+@section overview Overview
+
+PortAudio is a cross-platform, open-source C language library for real-time audio input and output. The library provides functions that allow your software to acquire and output real-time audio streams from your computer's hardware audio interfaces. It is designed to simplify writing cross-platform audio applications, and also to simplify the development of audio software in general by hiding the complexities of dealing directly with each native audio API. PortAudio is used to implement sound recording, editing and mixing applications, software synthesizers, effects processors, music players, internet telephony applications, software defined radios and more. Supported platforms include MS Windows, Mac OS X and Linux. Third-party language bindings make it possible to call PortAudio from other programming languages including C++, C#, Python, PureBasic, FreePascal and Lazarus.
+
+
+@section start_here Start here
+
+- @ref api_overview
+A top-down view of the PortAudio API, its capabilities, functions and data structures
+
+- @ref tutorial_start
+Get started writing code with PortAudio tutorials
+
+- @ref examples_src "Examples"
+Simple example programs demonstrating PortAudio usage
+
+- @ref License
+PortAudio is licenced under the MIT Expat open source licence. We make a non-binding request for you to contribute your changes back to the project.
+
+
+@section reference API Reference
+
+- portaudio.h Portable API
+Detailed documentation for each portable API function and data type
+
+- @ref public_header "Host API Specific Extensions"
+Documentation for non-portable platform-specific host API extensions
+
+
+@section resources Resources
+
+- The PortAudio website
+
+- Our mailing list for users and developers
+
+- The PortAudio wiki
+
+
+@section developer_resources Developer Resources
+
+@if INTERNAL
+- @ref srcguide
+@endif
+
+- Our wiki and issue tracking system
+
+- Coding guidelines
+
+If you're interested in helping out with PortAudio development we're more than happy for you to be involved. Just drop by the PortAudio mailing list and ask how you can help. Or check out the starter tickets.
+
+
+@section older_api_versions Older API Versions
+
+This documentation covers the current API version: PortAudio V19, API version 2.0. API 2.0 differs in a number of ways from previous versions (most often encountered in PortAudio V18), please consult the enhancement proposals for details of what was added/changed for V19:
+http://www.portaudio.com/docs/proposals/index.html
+
*/
\ No newline at end of file
diff --git a/3rdparty/portaudio/doc/src/tutorial/blocking_read_write.dox b/3rdparty/portaudio/doc/src/tutorial/blocking_read_write.dox
new file mode 100644
index 000000000..8905ee381
--- /dev/null
+++ b/3rdparty/portaudio/doc/src/tutorial/blocking_read_write.dox
@@ -0,0 +1,68 @@
+/** @page blocking_read_write Blocking Read/Write Functions
+@ingroup tutorial
+
+PortAudio V19 adds a huge advance over previous versions with a feature called Blocking I/O. Although it may have lower performance that the callback method described earlier in this tutorial, blocking I/O is easier to understand and is, in some cases, more compatible with third party systems than the callback method. Most people starting audio programming also find Blocking I/O easier to learn.
+
+Blocking I/O works in much the same way as the callback method except that instead of providing a function to provide (or consume) audio data, you must feed data to (or consume data from) PortAudio at regular intervals, usually inside a loop. The example below, excepted from patest_read_write_wire.c, shows how to open the default device, and pass data from its input to its output for a set period of time. Note that we use the default high latency values to help avoid underruns since we are usually reading and writing audio data from a relatively low priority thread, and there is usually extra buffering required to make blocking I/O work.
+
+Note that not all API's implement Blocking I/O at this point, so for maximum portability or performance, you'll still want to use callbacks.
+
+@code
+ /* -- initialize PortAudio -- */
+ err = Pa_Initialize();
+ if( err != paNoError ) goto error;
+
+ /* -- setup input and output -- */
+ inputParameters.device = Pa_GetDefaultInputDevice(); /* default input device */
+ inputParameters.channelCount = NUM_CHANNELS;
+ inputParameters.sampleFormat = PA_SAMPLE_TYPE;
+ inputParameters.suggestedLatency = Pa_GetDeviceInfo( inputParameters.device )->defaultHighInputLatency ;
+ inputParameters.hostApiSpecificStreamInfo = NULL;
+
+ outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */
+ outputParameters.channelCount = NUM_CHANNELS;
+ outputParameters.sampleFormat = PA_SAMPLE_TYPE;
+ outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultHighOutputLatency;
+ outputParameters.hostApiSpecificStreamInfo = NULL;
+
+ /* -- setup stream -- */
+ err = Pa_OpenStream(
+ &stream,
+ &inputParameters,
+ &outputParameters,
+ SAMPLE_RATE,
+ FRAMES_PER_BUFFER,
+ paClipOff, /* we won't output out of range samples so don't bother clipping them */
+ NULL, /* no callback, use blocking API */
+ NULL ); /* no callback, so no callback userData */
+ if( err != paNoError ) goto error;
+
+ /* -- start stream -- */
+ err = Pa_StartStream( stream );
+ if( err != paNoError ) goto error;
+ printf("Wire on. Will run one minute.\n"); fflush(stdout);
+
+ /* -- Here's the loop where we pass data from input to output -- */
+ for( i=0; i<(60*SAMPLE_RATE)/FRAMES_PER_BUFFER; ++i )
+ {
+ err = Pa_WriteStream( stream, sampleBlock, FRAMES_PER_BUFFER );
+ if( err ) goto xrun;
+ err = Pa_ReadStream( stream, sampleBlock, FRAMES_PER_BUFFER );
+ if( err ) goto xrun;
+ }
+ /* -- Now we stop the stream -- */
+ err = Pa_StopStream( stream );
+ if( err != paNoError ) goto error;
+
+ /* -- don't forget to cleanup! -- */
+ err = Pa_CloseStream( stream );
+ if( err != paNoError ) goto error;
+
+ Pa_Terminate();
+ return 0;
+@endcode
+
+
+Previous: \ref querying_devices | Next: \ref exploring
+
+*/
\ No newline at end of file
diff --git a/3rdparty/portaudio/doc/src/tutorial/compile_cmake.dox b/3rdparty/portaudio/doc/src/tutorial/compile_cmake.dox
new file mode 100644
index 000000000..ddf5eae61
--- /dev/null
+++ b/3rdparty/portaudio/doc/src/tutorial/compile_cmake.dox
@@ -0,0 +1,29 @@
+/** @page compile_cmake Creating MSVC Build Files via CMake
+@ingroup tutorial
+
+This is a simple "How-to" for creating build files for Microsoft Visual C++ via CMake and the CMakeLists.txt file
+
+1. Install CMake if you haven't got it already ([http://www.cmake.org], minimum version required is 2.8).
+
+2. If you want ASIO support you need to D/L the ASIO2 SDK from Steinberg, and place it according to \ref compile_windows_asio_msvc
+
+3. Run the CMake GUI application and browse to source files directory and build directory:
+ a. The source files directory ("Where is the source code") is where the portaudio CMakeLists.txt file is located.
+ b. The build directory ("Where to build the binaries") is pretty much anywhere you like. A common practice though is to have the build directory located outside the
+ source files tree (a so called "out-of-source build")
+
+4. Click Configure. This will prompt you to select which build files to generate. Note Only Microsoft Visual C++ build files currently supported!
+
+5. In the CMake option list, enable the PORTAUDIO_xxx options you need, then click Configure again (Note that after this there are no options marked with red color)
+
+6. Click Generate and you'll now (hopefully) have your VS build files in your previously defined build directory.
+
+Both ASIO and DirectX SDK are automatically searched for by the CMake script, so if you have DirectX SDK installed and have placed the ASIO2 SDK according to point 2 above, you should be able to build portaudio with !DirectSound and ASIO support.
+
+Should you later on decide to change a portaudio option, just jump in at step 5 above (MSVC will then prompt you to reload projects/solutions/workspace)
+
+--- Robert Bielik
+
+Back to the Tutorial: \ref tutorial_start
+
+*/
\ No newline at end of file
diff --git a/3rdparty/portaudio/doc/src/tutorial/compile_linux.dox b/3rdparty/portaudio/doc/src/tutorial/compile_linux.dox
new file mode 100644
index 000000000..232cac67e
--- /dev/null
+++ b/3rdparty/portaudio/doc/src/tutorial/compile_linux.dox
@@ -0,0 +1,77 @@
+/** @page compile_linux Building Portaudio for Linux
+@ingroup tutorial
+
+Note: this page has not been reviewed, and may contain errors.
+
+@section comp_linux1 Installing ALSA Development Kit
+
+The OSS sound API is very old and not well supported. It is recommended that you use the ALSA sound API.
+The PortAudio configure script will look for the ALSA SDK. You can install the ALSA SDK on Ubuntu using:
+
+@code
+sudo apt-get install libasound-dev
+@endcode
+
+You might need to use yum, or some other package manager, instead of apt-get on your machine.
+If you do not install ALSA then you might get a message when testing that says you have no audio devices.
+
+You can find out more about ALSA here: http://www.alsa-project.org/
+
+@section comp_linux2 Configuring and Compiling PortAudio
+
+You can build PortAudio in Linux Environments using the standard configure/make tools:
+
+@code
+./configure && make
+@endcode
+
+That will build PortAudio using Jack, ALSA and OSS in whatever combination they are found on your system. For example, if you have Jack and OSS but not ALSA, it will build using Jack and OSS but not ALSA. This step also builds a number of tests, which can be found in the bin directory of PortAudio. It's a good idea to run some of these tests to make sure PortAudio is working correctly.
+
+@section comp_linux3 Using PortAudio in your Projects
+
+To use PortAudio in your apps, you can simply install the .so files:
+
+@code
+make install
+@endcode
+
+Projects built this way will expect PortAudio to be installed on target systems in order to run. If you want to build a more self-contained binary, you may use the libportaudio.a file:
+
+@code
+cp lib/.libs/libportaudio.a /YOUR/PROJECT/DIR
+@endcode
+
+You may also need to copy portaudio.h, located in the include/ directory of PortAudio into your project. Note that you will usually need to link with the approriate libraries that you used, such as ALSA and JACK, as well as with librt and libpthread. For example:
+
+@code
+gcc -lrt -lasound -ljack -lpthread -o YOUR_BINARY main.c libportaudio.a
+@endcode
+
+@section comp_linux4 Linux Extensions
+
+Note that the ALSA PortAudio back-end adds a few extensions to the standard API that you may take advantage of. To use these functions be sure to include the pa_linux_alsa.h file found in the include file in the PortAudio folder. This file contains further documentation on the following functions:
+
+ PaAlsaStreamInfo/PaAlsa_InitializeStreamInfo::
+ Objects of the !PaAlsaStreamInfo type may be used for the !hostApiSpecificStreamInfo attribute of a !PaStreamParameters object, in order to specify the name of an ALSA device to open directly. Specify the device via !PaAlsaStreamInfo.deviceString, after initializing the object with PaAlsa_InitializeStreamInfo.
+
+ PaAlsa_EnableRealtimeScheduling::
+ PA ALSA supports real-time scheduling of the audio callback thread (using the FIFO pthread scheduling policy), via the extension PaAlsa_EnableRealtimeScheduling. Call this on the stream before starting it with the enableScheduling parameter set to true or false, to enable or disable this behaviour respectively.
+
+ PaAlsa_GetStreamInputCard::
+ Use this function to get the ALSA-lib card index of the stream's input device.
+
+ PaAlsa_GetStreamOutputCard::
+ Use this function to get the ALSA-lib card index of the stream's output device.
+
+Of particular importance is PaAlsa_EnableRealtimeScheduling, which allows ALSA to run at a high priority to prevent ordinary processes on the system from preempting audio playback. Without this, low latency audio playback will be irregular and will contain frequent drop-outs.
+
+@section comp_linux5 Linux Debugging
+
+Eliot Blennerhassett writes:
+
+On linux build, use e.g. "libtool gdb bin/patest_sine8" to debug that program.
+This is because on linux bin/patest_sine8 is a libtool shell script that wraps
+bin/.libs/patest_sine8 and allows it to find the appropriate libraries within
+the build tree.
+
+*/
\ No newline at end of file
diff --git a/3rdparty/portaudio/doc/src/tutorial/compile_mac_coreaudio.dox b/3rdparty/portaudio/doc/src/tutorial/compile_mac_coreaudio.dox
new file mode 100644
index 000000000..6984d1e7c
--- /dev/null
+++ b/3rdparty/portaudio/doc/src/tutorial/compile_mac_coreaudio.dox
@@ -0,0 +1,121 @@
+/** @page compile_mac_coreaudio Building Portaudio for Mac OS X
+@ingroup tutorial
+
+@section comp_mac_ca_1 Requirements
+
+* OS X 10.4 or later. PortAudio v19 currently only compiles and runs on OS X version 10.4 or later. Because of its heavy reliance on memory barriers, it's not clear how easy it would be to back-port PortAudio to OS X version 10.3. Leopard support requires the 2007 snapshot or later.
+
+* Apple's Xcode and its related tools installed in the default location. There is no Xcode project for PortAudio.
+
+* Mac 10.4 SDK. Look for "/Developer/SDKs/MacOSX10.4u.sdk" folder on your system. It may be installed with XCode. If not then you can download it from Apple Developer Connection. http://connect.apple.com/
+
+@section comp_mac_ca_2 Building
+
+To build PortAudio, simply use the Unix-style "./configure && make":
+
+@code
+ ./configure && make
+@endcode
+
+You do not need to do "make install", and we don't recommend it; however, you may be using software that instructs you to do so, in which case you should follow those instructions. (Note from Phil: I had to do "sudo make install" after the command above, otherwise XCode complained that it could not find "/usr/local/lib/libportaudio.dylib" when I compiled an example.)
+
+The result of these steps will be a file named "libportaudio.dylib" in the directory "usr/local/lib/".
+
+By default, this will create universal binaries and therefore requires the Universal SDK from Apple, included with XCode 2.1 and higher.
+
+@section comp_mac_ca_3 Other Build Options
+
+There are a variety of other options for building PortAudio. The default described above is recommended as it is the most supported and tested; however, your needs may differ and require other options, which are described below.
+
+@subsection comp_mac_ca_3.1 Building Non-Universal Libraries
+
+By default, PortAudio is built as a universal binary. This includes 64-bit versions if you are compiling on 10.5, Leopard. If you want a "thin", or single architecture library, you have two options:
+
+ * build a non-universal library using configure options.
+ * use lipo(1) on whatever part of the library you plan to use.
+
+Note that the first option may require an extremely recent version of PortAudio (February 5th '08 at least).
+
+@subsection comp_mac_ca_3.2 Building with --disable-mac-universal
+
+To build a non-universal library for the host architecture, simply use the --disable-mac-universal option with configure.
+
+@code
+ ./configure --disable-mac-universal && make
+@endcode
+
+The --disable-mac-universal option may also be used in conjunction with environment variables to give you more control over the universal binary build process. For example, to build a universal binary for the i386 and ppc architectures using the 10.4u sdk (which is the default on 10.4, but not 10.5), you might specify this configure command line:
+
+@code
+ CFLAGS="-O2 -g -Wall -arch i386 -arch ppc -isysroot /Developer/SDKs/MacOSX10.4u.sdk -mmacosx-version-min=10.3" \
+ LDFLAGS="-arch i386 -arch ppc -isysroot /Developer/SDKs/MacOSX10.4u.sdk -mmacosx-version-min=10.3" \
+ ./configure --disable-mac-universal --disable-dependency-tracking
+@endcode
+
+For more info, see Apple's documentation on the matter:
+
+ * http://developer.apple.com/technotes/tn2005/tn2137.html
+ * http://developer.apple.com/documentation/Porting/Conceptual/PortingUnix/intro/chapter_1_section_1.html
+
+@subsection comp_mac_ca_3.3 Using lipo
+
+The second option is to build normally, and use lipo (1) to extract the architectures you want. For example, if you want a "thin", i386 library only:
+
+@code
+ lipo lib/.libs/libportaudio.a -thin i386 -output libportaudio.a
+@endcode
+
+or if you want to extract a single architecture fat file:
+
+@code
+ lipo lib/.libs/libportaudio.a -extract i386 -output libportaudio.a
+@endcode
+
+@subsection comp_mac_ca_3.4 Building With Debug Options
+
+By default, PortAudio on the mac is built without any debugging options. This is because asserts are generally inappropriate for a production environment and debugging information has been suspected, though not proven, to cause trouble with some interfaces. If you would like to compile with debugging, you must run configure with the appropriate flags. For example:
+
+@code
+ ./configure --enable-mac-debug && make
+@endcode
+
+This will enable -g and disable -DNDEBUG which will effectively enable asserts.
+
+@section comp_mac_ca_4 Using the Library in XCode Projects
+
+If you are planning to follow the rest of the tutorial, several project types will work. You can create a "Standard Tool" under "Command Line Utility". If you are not following the rest of the tutorial, any type of project should work with PortAudio, but these instructions may not work perfectly.
+
+Once you've compiled PortAudio, the easiest and recommended way to use PortAudio in your XCode project is to add "/include/portaudio.h" and "/lib/.libs/libportaudio.a" to your project. Because "/lib/.libs/" is a hidden directory, you won't be able to navigate to it using the finder or the standard Mac OS file dialogs by clicking on files and folders. You can use command-shift-G in the finder to specify the exact path, or, from the shell, if you are in the portaudio directory, you can enter this command:
+
+@code
+ open lib/.libs
+@endcode
+
+Then drag the "libportaudio.a" file into your XCode project and place it in the "External Frameworks and Libraries" group, if the project type has it. If not you can simply add it to the top level folder of the project.
+
+You will need to add the following frameworks to your XCode project:
+
+ - CoreAudio.framework
+ - AudioToolbox.framework
+ - AudioUnit.framework
+ - CoreServices.framework
+
+@section comp_mac_ca_5 Using the Library in Other Projects
+
+For gcc/Make style projects, include "include/portaudio.h" and link "libportaudio.a", and use the frameworks listed in the previous section. How you do so depends on your build.
+
+@section comp_mac_ca_6 Using Mac-only Extensions to PortAudio
+
+For additional, Mac-only extensions to the PortAudio interface, you may also want to grab "include/pa_mac_core.h". This file contains some special, mac-only features relating to sample-rate conversion, channel mapping, performance and device hogging. See "src/hostapi/coreaudio/notes.txt" for more details on these features.
+
+@section comp_mac_ca_7 What Happened to Makefile.darwin?
+
+Note, there used to be a special makefile just for darwin. This is no longer supported because you can build universal binaries from the standard configure routine. If you find this file in your directory structure it means you have an outdated version of PortAudio.
+
+@code
+ make -f Makefile.darwin
+@endcode
+
+Back to the Tutorial: \ref tutorial_start
+
+*/
\ No newline at end of file
diff --git a/3rdparty/portaudio/doc/src/tutorial/compile_windows.dox b/3rdparty/portaudio/doc/src/tutorial/compile_windows.dox
new file mode 100644
index 000000000..63f1f63f7
--- /dev/null
+++ b/3rdparty/portaudio/doc/src/tutorial/compile_windows.dox
@@ -0,0 +1,97 @@
+/** @page compile_windows Building Portaudio for Windows using Microsoft Visual Studio
+@ingroup tutorial
+
+Below is a list of steps to build PortAudio into a dll and lib file. The resulting dll file may contain all five current win32 PortAudio APIs: MME, DirectSound, WASAPI, WDM/KS and ASIO, depending on the preprocessor definitions set in step 9 below.
+
+PortAudio can be compiled using Visual C++ Express Edition which is available free from Microsoft. If you do not already have a C++ development environment, simply download and install. These instructions have been observed to succeed using Visual Studio 2010 as well.
+
+1) PortAudio for Windows requires the files dsound.h and dsconf.h. Download and install the DirectX SDK from http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=3021d52b-514e-41d3-ad02-438a3ba730ba to obtain these files. If you installed the DirectX SDK then the !DirectSound libraries and header files should be found automatically by Visual !Studio/Visual C++. If you get an error saying dsound.h or dsconf.h is missing, you can declare these paths by hand. Alternatively, you can copy dsound.h and dsconf.h to portaudio\\include. There should also be a file named ''dsound.lib'' in C:\\Program Files\\Microsoft SDKs\\Windows\\v6.0A\\Lib.
+
+2) For ASIO support, download the ASIO SDK from Steinberg at http://www.steinberg.net/en/company/developer.html. The SDK is free but you will need to set up a developer account with Steinberg. Copy the entire ASIOSDK2 folder into src\\hostapi\\asio\\. Rename it from ASIOSDK2 to ASIOSDK. To build without ASIO (or other host API) see the "Building without ASIO support" section below.
+
+3) If you have Visual Studio 6.0, 7.0(VC.NET/2001) or 7.1(VC.2003), open portaudio.dsp and convert if needed.
+
+4) If you have Visual Studio 2005, Visual C++ 2008 Express Edition or Visual Studio 2010, double click the portaudio.sln file located in build\\msvc\\. Doing so will open Visual Studio or Visual C++. Click "Finish" if a wizard appears. The sln file contains four configurations: Win32 and Win64 in both Release and Debug variants.
+
+@section comp_win1 For Visual Studio 2005, Visual C++ 2008 Express Edition or Visual Studio 2010
+
+5) Open Project -> portaudio Properties and select "Configuration Properties" in the tree view.
+
+6) Select "all configurations" in the "Configurations" combo box above. Select "All Platforms" in the "Platforms" combo box.
+
+7) Now set a few options:
+
+C/C++ -> Optimization -> Omit frame pointers = Yes
+
+C/C++ -> Code Generation -> Runtime library = /MT
+
+Optional: C/C++ -> Code Generation -> Floating point model = fast
+
+NOTE: For most users it is not necessary to explicitly set the structure member alignment; the default should work fine. However some languages require, for example, 4-byte alignment. If you are having problems with portaudio.h structure members not being properly read or written to, it may be necessary to explicitly set this value by going to C/C++ -> Code Generation -> Struct member alignment and setting it to an appropriate value (four is a common value). If your compiler is configurable, you should ensure that it is set to use the same structure member alignment value as used for the PortAudio build.
+
+Click "Ok" when you have finished setting these parameters.
+
+@section comp_win2 Preprocessor Definitions
+
+Since the preprocessor definitions are different for each configuration and platform, you'll need to edit these individually for each configuration/platform combination that you want to modify using the "Configurations" and "Platforms" combo boxes.
+
+8) To suppress PortAudio runtime debug console output, go to Project -> Properties -> Configuration Properties -> C/C++ -> Preprocessor. In the field 'Preprocessor Definitions', find PA_ENABLE_DEBUG_OUTPUT and remove it. The console will not output debug messages.
+
+9) Also in the preprocessor definitions you need to explicitly define the audio APIs you wish to use. For Windows the available API definitions are:
+
+PA_USE_ASIO[[BR]]
+PA_USE_DS (DirectSound)[[BR]]
+PA_USE_WMME (MME)[[BR]]
+PA_USE_WASAPI[[BR]]
+PA_USE_WDMKS[[BR]]
+PA_USE_SKELETON
+
+For each of these, the value of 0 indicates that support for this API should not be included. The value 1 indicates that support for this API should be included.
+
+@section comp_win3 Building
+
+As when setting Preprocessor definitions, building is a per-configuration per-platform process. Follow these instructions for each configuration/platform combination that you're interested in.
+
+10) From the Build menu click Build -> Build solution. For 32-bit compilations, the dll file created by this process (portaudio_x86.dll) can be found in the directory build\\msvc\\Win32\\Release. For 64-bit compilations, the dll file is called portaudio_x64.dll, and is found in the directory build\\msvc\\x64\\Release.
+
+11) Now, any project which requires portaudio can be linked with portaudio_x86.lib (or _x64) and include the relevant headers (portaudio.h, and/or pa_asio.h , pa_x86_plain_converters.h) You may want to add/remove some DLL entry points. Right now those 6 entries are not from portaudio.h:
+
+(from portaudio.def)
+@code
+...
+PaAsio_GetAvailableLatencyValues @50
+PaAsio_ShowControlPanel @51
+PaUtil_InitializeX86PlainConverters @52
+PaAsio_GetInputChannelName @53
+PaAsio_GetOutputChannelName @54
+PaUtil_SetLogPrintFunction @55
+@endcode
+
+@section comp_win4 Building without ASIO support
+
+To build PortAudio without ASIO support you need to:
+
+1) Make sure your project doesn't try to build any ASIO SDK files. If you're using one of the shipped projects, remove the ASIO related files from the project.
+
+2) Make sure your project doesn't try to build the PortAudio ASIO implementation files:
+
+src\\hostapi\\pa_asio.cpp src\\hostapi\\iasiothiscallresolver.cpp
+
+If you're using one of the shipped projects, remove them from the project.
+
+3) Define the preprocessor symbols in the project properties as described in step 9 above. In VS2005 this can be accomplished by selecting
+Project Properties -> Configuration Properties -> C/C++ -> Preprocessor -> Preprocessor Definitions. Omitting PA_USE_ASIO or setting it to 0 stops src\\os\\win\\pa_win_hostapis.c from trying to initialize the PortAudio ASIO implementation.
+
+4) Remove PaAsio_* entry points from portaudio.def
+
+
+-----
+David Viens, davidv@plogue.com
+
+Updated by Chris on 5/26/2011
+
+Improvements by John Clements on 12/15/2011
+
+Back to the Tutorial: \ref tutorial_start
+
+*/
\ No newline at end of file
diff --git a/3rdparty/portaudio/doc/src/tutorial/compile_windows_asio_msvc.dox b/3rdparty/portaudio/doc/src/tutorial/compile_windows_asio_msvc.dox
new file mode 100644
index 000000000..8a8e10724
--- /dev/null
+++ b/3rdparty/portaudio/doc/src/tutorial/compile_windows_asio_msvc.dox
@@ -0,0 +1,95 @@
+/** @page compile_windows_asio_msvc Building Portaudio for Windows with ASIO support using MSVC
+@ingroup tutorial
+
+@section comp_win_asiomsvc1 Portaudio Windows ASIO with MSVC
+
+This tutorial describes how to build PortAudio with ASIO support using MSVC *from scratch*, without an existing Visual Studio project. For instructions for building PortAudio (including ASIO support) using the bundled Visual Studio project file see the compiling instructions for \ref compile_windows.
+
+ASIO is a low latency audio API from Steinberg. To compile an ASIO
+application, you must first download the ASIO SDK from Steinberg. You also
+need to obtain ASIO drivers for your audio device. Download the ASIO SDK from Steinberg at http://www.steinberg.net/en/company/developer.html. The SDK is free but you will need to set up a developer account with Steinberg.
+
+This tutorial assumes that you have 3 directories set up at the same level (side by side), one containing PortAudio, one containing the ASIO SDK and one containing your Visual Studio project:
+
+@code
+/ASIOSDK2
+/portaudio
+/DirContainingYourVisualStudioProject
+@endcode
+
+First, make sure that the Steinberg SDK and the portaudio files are "side by side" in the same directory.
+
+Open Microsoft Visual C++ and create a new blank Console exe Project/Workspace in that same directory.
+
+For example, the paths for all three groups might read like this:
+
+@code
+C:\Program Files\Microsoft Visual Studio\VC98\My Projects\ASIOSDK2
+C:\Program Files\Microsoft Visual Studio\VC98\My Projects\portaudio
+C:\Program Files\Microsoft Visual Studio\VC98\My Projects\Sawtooth
+@endcode
+
+
+Next, add the following Steinberg ASIO SDK files to the project Source Files:
+
+@code
+asio.cpp (ASIOSDK2\common)
+asiodrivers.cpp (ASIOSDK2\host)
+asiolist.cpp (ASIOSDK2\host\pc)
+@endcode
+
+
+Then, add the following PortAudio files to the project Source Files:
+
+@code
+pa_asio.cpp (portaudio\src\hostapi\asio)
+pa_allocation.c (portaudio\src\common)
+pa_converters.c (portaudio\src\common)
+pa_cpuload.c (portaudio\src\common)
+pa_dither.c (portaudio\src\common)
+pa_front.c (portaudio\src\common)
+pa_process.c (portaudio\src\common)
+pa_ringbuffer.c (portaudio\src\common)
+pa_stream.c (portaudio\src\common)
+pa_trace.c (portaudio\src\common)
+pa_win_hostapis.c (portaudio\src\os\win)
+pa_win_util.c (portaudio\src\os\win)
+pa_win_waveformat.c (portaudio\src\os\win)
+pa_x86_plain_converters.c (portaudio\src\os\win)
+patest_saw.c (portaudio\test) (Or another file containing main()
+ for the console exe to be built.)
+@endcode
+
+
+Although not strictly necessary, you may also want to add the following files to the project Header Files:
+
+@code
+portaudio.h (portaudio\include)
+pa_asio.h (portaudio\include)
+@endcode
+
+These header files define the interfaces to the PortAudio API.
+
+
+Next, go to Project Settings > All Configurations > C/C++ > Preprocessor > Preprocessor definitions and add
+PA_USE_ASIO=1 to any entries that might be there.
+
+eg: WIN32;_CONSOLE;_MBCS changes to WIN32;_CONSOLE,_MBCS;PA_USE_ASIO=1
+
+Then, on the same Project Settings tab, go down to Additional include directories: and enter the following relative include paths.
+
+@code
+..\portaudio\include,..\portaudio\src\common,..\asiosdk2\common,..\asiosdk2\host,..\asiosdk2\host\pc
+@endcode
+
+You'll need to make sure the relative paths are correct for the particular directory layout you're using. The above should work fine if you use the side-by-side layout we recommended earlier.
+
+You should now be able to build any of the test executables in the portaudio\test directory.
+We suggest that you start with patest_saw.c because it's one of the simplest test files.
+
+--- Chris Share, Tom McCandless, Ross Bencina
+
+[wiki:UsingThePortAudioSvnRepository SVN instructions]
+Back to the Tutorial: \ref tutorial_start
+
+*/
\ No newline at end of file
diff --git a/3rdparty/portaudio/doc/src/tutorial/compile_windows_mingw.dox b/3rdparty/portaudio/doc/src/tutorial/compile_windows_mingw.dox
new file mode 100644
index 000000000..47bba386a
--- /dev/null
+++ b/3rdparty/portaudio/doc/src/tutorial/compile_windows_mingw.dox
@@ -0,0 +1,53 @@
+/** @page compile_windows_mingw Building Portaudio for Windows with MinGW
+@ingroup tutorial
+
+@section comp_mingw1 Portaudio for Windows With MinGW
+
+The following document is still being reviewed
+
+= MinGW/MSYS =
+
+From the [http://www.mingw.org MinGW projectpage]:
+
+MinGW: A collection of freely available and freely distributable
+Windows specific header files and import libraries, augmenting
+the GNU Compiler Collection, (GCC), and its associated
+tools, (GNU binutils). MinGW provides a complete Open Source
+programming tool set which is suitable for the development of
+native Windows programs that do not depend on any 3rd-party C
+runtime DLLs.
+
+MSYS: A Minimal SYStem providing a POSIX compatible Bourne shell
+environment, with a small collection of UNIX command line
+tools. Primarily developed as a means to execute the configure
+scripts and Makefiles used to build Open Source software, but
+also useful as a general purpose command line interface to
+replace Windows cmd.exe.
+
+MinGW provides a compiler/linker toolchain while MSYS is required
+to actually run the PortAudio configure script.
+
+Once MinGW and MSYS are installed (see the [http://www.mingw.org/MinGWiki MinGW-Wiki]) open an MSYS shell and run the famous:
+
+@code
+./configure
+make
+make install
+@endcode
+
+The above should create a working version though you might want to
+provide '--prefix=' to configure.
+
+'./configure --help' gives details as to what can be tinkered with.
+
+--- Mikael Magnusson
+
+To update your copy or check out a fresh copy of the source
+
+[wiki:UsingThePortAudioSvnRepository SVN instructions]
+
+--- Bob !McGwier
+
+Back to the Tutorial: \ref tutorial_start
+
+*/
\ No newline at end of file
diff --git a/3rdparty/portaudio/doc/src/tutorial/exploring.dox b/3rdparty/portaudio/doc/src/tutorial/exploring.dox
new file mode 100644
index 000000000..9dd087348
--- /dev/null
+++ b/3rdparty/portaudio/doc/src/tutorial/exploring.dox
@@ -0,0 +1,15 @@
+/** @page exploring Exploring PortAudio
+@ingroup tutorial
+
+Now that you have a good idea of how PortAudio works, you can try out the example programs. You'll find them in the examples/ directory in the PortAudio distribution.
+
+For an example of playing a sine wave, see examples/paex_sine.c.
+
+For an example of recording and playing back a sound, see examples/paex_record.c.
+
+I also encourage you to examine the source for the PortAudio libraries. If you have suggestions on ways to improve them, please let us know. If you want to implement PortAudio on a new platform, please let us know as well so we can coordinate people's efforts.
+
+
+Previous: \ref blocking_read_write | Next: This is the end of the tutorial.
+
+*/
\ No newline at end of file
diff --git a/3rdparty/portaudio/doc/src/tutorial/initializing_portaudio.dox b/3rdparty/portaudio/doc/src/tutorial/initializing_portaudio.dox
new file mode 100644
index 000000000..9439c350d
--- /dev/null
+++ b/3rdparty/portaudio/doc/src/tutorial/initializing_portaudio.dox
@@ -0,0 +1,29 @@
+/** @page initializing_portaudio Initializing PortAudio
+@ingroup tutorial
+
+@section tut_init1 Initializing PortAudio
+
+Before making any other calls to PortAudio, you 'must' call Pa_Initialize(). This will trigger a scan of available devices which can be queried later. Like most PA functions, it will return a result of type paError. If the result is not paNoError, then an error has occurred.
+@code
+err = Pa_Initialize();
+if( err != paNoError ) goto error;
+@endcode
+
+You can get a text message that explains the error message by passing it to Pa_GetErrorText( err ). For Example:
+
+@code
+printf( "PortAudio error: %s\n", Pa_GetErrorText( err ) );
+@endcode
+
+It is also important, when you are done with PortAudio, to Terminate it:
+
+@code
+err = Pa_Terminate();
+if( err != paNoError )
+ printf( "PortAudio error: %s\n", Pa_GetErrorText( err ) );
+@endcode
+
+
+Previous: \ref writing_a_callback | Next: \ref open_default_stream
+
+*/
\ No newline at end of file
diff --git a/3rdparty/portaudio/doc/src/tutorial/open_default_stream.dox b/3rdparty/portaudio/doc/src/tutorial/open_default_stream.dox
new file mode 100644
index 000000000..7512d1e7e
--- /dev/null
+++ b/3rdparty/portaudio/doc/src/tutorial/open_default_stream.dox
@@ -0,0 +1,48 @@
+/** @page open_default_stream Opening a Stream Using Defaults
+@ingroup tutorial
+
+The next step is to open a stream, which is similar to opening a file. You can specify whether you want audio input and/or output, how many channels, the data format, sample rate, etc. Opening a ''default'' stream means opening the default input and output devices, which saves you the trouble of getting a list of devices and choosing one from the list. (We'll see how to do that later.)
+@code
+#define SAMPLE_RATE (44100)
+static paTestData data;
+
+.....
+
+ PaStream *stream;
+ PaError err;
+
+ /* Open an audio I/O stream. */
+ err = Pa_OpenDefaultStream( &stream,
+ 0, /* no input channels */
+ 2, /* stereo output */
+ paFloat32, /* 32 bit floating point output */
+ SAMPLE_RATE,
+ 256, /* frames per buffer, i.e. the number
+ of sample frames that PortAudio will
+ request from the callback. Many apps
+ may want to use
+ paFramesPerBufferUnspecified, which
+ tells PortAudio to pick the best,
+ possibly changing, buffer size.*/
+ patestCallback, /* this is your callback function */
+ &data ); /*This is a pointer that will be passed to
+ your callback*/
+ if( err != paNoError ) goto error;
+@endcode
+
+The data structure and callback are described in \ref writing_a_callback.
+
+The above example opens the stream for writing, which is sufficient for playback. It is also possible to open a stream for reading, to do recording, or both reading and writing, for simultaneous recording and playback or even real-time audio processing. If you plan to do playback and recording at the same time, open only one stream with valid input and output parameters.
+
+There are some caveats to note about simultaneous read/write:
+
+ - Some platforms can only open a read/write stream using the same device.
+ - Although multiple streams can be opened, it is difficult to synchronize them.
+ - Some platforms don't support opening multiple streams on the same device.
+ - Using multiple streams may not be as well tested as other features.
+ - The PortAudio library calls must be made from the same thread or synchronized by the user.
+
+
+Previous: \ref initializing_portaudio | Next: \ref start_stop_abort
+
+*/
\ No newline at end of file
diff --git a/3rdparty/portaudio/doc/src/tutorial/querying_devices.dox b/3rdparty/portaudio/doc/src/tutorial/querying_devices.dox
new file mode 100644
index 000000000..0c2327495
--- /dev/null
+++ b/3rdparty/portaudio/doc/src/tutorial/querying_devices.dox
@@ -0,0 +1,111 @@
+/** @page querying_devices Enumerating and Querying PortAudio Devices
+@ingroup tutorial
+
+@section tut_query1 Querying Devices
+
+It is often fine to use the default device as we did previously in this tutorial, but there are times when you'll want to explicitly choose the device from a list of available devices on the system. To see a working example of this, check out pa_devs.c in the tests/ directory of the PortAudio source code. To do so, you'll need to first initialize PortAudio and Query for the number of Devices:
+
+@code
+ int numDevices;
+
+ numDevices = Pa_GetDeviceCount();
+ if( numDevices < 0 )
+ {
+ printf( "ERROR: Pa_CountDevices returned 0x%x\n", numDevices );
+ err = numDevices;
+ goto error;
+ }
+@endcode
+
+
+If you want to get information about each device, simply loop through as follows:
+
+@code
+ const PaDeviceInfo *deviceInfo;
+
+ for( i=0; idefaultLowInputLatency ;
+ inputParameters.hostApiSpecificStreamInfo = NULL; //See you specific host's API docs for info on using this field
+
+
+ bzero( &outputParameters, sizeof( outputParameters ) ); //not necessary if you are filling in all the fields
+ outputParameters.channelCount = outChan;
+ outputParameters.device = outDevNum;
+ outputParameters.hostApiSpecificStreamInfo = NULL;
+ outputParameters.sampleFormat = paFloat32;
+ outputParameters.suggestedLatency = Pa_GetDeviceInfo(outDevNum)->defaultLowOutputLatency ;
+ outputParameters.hostApiSpecificStreamInfo = NULL; //See you specific host's API docs for info on using this field
+
+ err = Pa_OpenStream(
+ &stream,
+ &inputParameters,
+ &outputParameters,
+ srate,
+ framesPerBuffer,
+ paNoFlag, //flags that can be used to define dither, clip settings and more
+ portAudioCallback, //your callback function
+ (void *)this ); //data to be passed to callback. In C++, it is frequently (void *)this
+ //don't forget to check errors!
+@endcode
+
+
+Previous: \ref utility_functions | Next: \ref blocking_read_write
+
+*/
\ No newline at end of file
diff --git a/3rdparty/portaudio/doc/src/tutorial/start_stop_abort.dox b/3rdparty/portaudio/doc/src/tutorial/start_stop_abort.dox
new file mode 100644
index 000000000..6d4f77752
--- /dev/null
+++ b/3rdparty/portaudio/doc/src/tutorial/start_stop_abort.dox
@@ -0,0 +1,35 @@
+/** @page start_stop_abort Starting, Stopping and Aborting a Stream
+@ingroup tutorial
+
+@section tut_startstop1 Starting, Stopping and Aborting a Stream
+
+PortAudio will not start playing back audio until you start the stream. After calling Pa_StartStream(), PortAudio will start calling your callback function to perform the audio processing.
+
+@code
+ err = Pa_StartStream( stream );
+ if( err != paNoError ) goto error;
+@endcode
+
+You can communicate with your callback routine through the data structure you passed in on the open call, or through global variables, or using other interprocess communication techniques, but please be aware that your callback function may be called at interrupt time when your foreground process is least expecting it. So avoid sharing complex data structures that are easily corrupted like double linked lists, and avoid using locks such as mutexs as this may cause your callback function to block and therefore drop audio. Such techniques may even cause deadlock on some platforms.
+
+PortAudio will continue to call your callback and process audio until you stop the stream. This can be done in one of several ways, but, before we do so, we'll want to see that some of our audio gets processed by sleeping for a few seconds. This is easy to do with Pa_Sleep(), which is used by many of the examples in the patests/ directory for exactly this purpose. Note that, for a variety of reasons, you can not rely on this function for accurate scheduling, so your stream may not run for exactly the same amount of time as you expect, but it's good enough for our example.
+
+@code
+ /* Sleep for several seconds. */
+ Pa_Sleep(NUM_SECONDS*1000);
+@endcode
+
+Now we need to stop playback. There are several ways to do this, the simplest of which is to call Pa_StopStream():
+
+@code
+ err = Pa_StopStream( stream );
+ if( err != paNoError ) goto error;
+@endcode
+
+Pa_StopStream() is designed to make sure that the buffers you've processed in your callback are all played, which may cause some delay. Alternatively, you could call Pa_AbortStream(). On some platforms, aborting the stream is much faster and may cause some data processed by your callback not to be played.
+
+Another way to stop the stream is to return either paComplete, or paAbort from your callback. paComplete ensures that the last buffer is played whereas paAbort stops the stream as soon as possible. If you stop the stream using this technique, you will need to call Pa_StopStream() before starting the stream again.
+
+Previous: \ref open_default_stream | Next: \ref terminating_portaudio
+
+*/
\ No newline at end of file
diff --git a/3rdparty/portaudio/doc/src/tutorial/terminating_portaudio.dox b/3rdparty/portaudio/doc/src/tutorial/terminating_portaudio.dox
new file mode 100644
index 000000000..67f74f6bc
--- /dev/null
+++ b/3rdparty/portaudio/doc/src/tutorial/terminating_portaudio.dox
@@ -0,0 +1,20 @@
+/** @page terminating_portaudio Closing a Stream and Terminating PortAudio
+@ingroup tutorial
+
+When you are done with a stream, you should close it to free up resources:
+
+@code
+ err = Pa_CloseStream( stream );
+ if( err != paNoError ) goto error;
+@endcode
+
+We've already mentioned this in \ref initializing_portaudio, but in case you forgot, be sure to terminate PortAudio when you are done:
+
+@code
+ err = Pa_Terminate( );
+ if( err != paNoError ) goto error;
+@endcode
+
+Previous: \ref start_stop_abort | Next: \ref utility_functions
+
+*/
\ No newline at end of file
diff --git a/3rdparty/portaudio/doc/src/tutorial/tutorial_start.dox b/3rdparty/portaudio/doc/src/tutorial/tutorial_start.dox
new file mode 100644
index 000000000..b80bc236e
--- /dev/null
+++ b/3rdparty/portaudio/doc/src/tutorial/tutorial_start.dox
@@ -0,0 +1,56 @@
+/** @page tutorial_start PortAudio Tutorials
+@ingroup tutorial
+
+These tutorials takes you through a hands-on example of using PortAudio to make sound. If you'd prefer to start with a top-down overview of the PortAudio API, check out the @ref api_overview.
+
+@section tut_start1 Downloading
+
+First thing you need to do is download the PortAudio source code either as a tarball from the website, or from the Subversion Repository.
+
+@section tut_start2 Compiling
+
+Once you've downloaded PortAudio you'll need to compile it, which of course, depends on your environment:
+
+ - Windows
+ - \ref compile_windows
+ - \ref compile_windows_mingw
+ - \ref compile_windows_asio_msvc
+ - \ref compile_cmake
+ - Mac OS X
+ - \ref compile_mac_coreaudio
+ - POSIX
+ - \ref compile_linux
+
+Many platforms with GCC/make can use the simple ./configure && make combination and simply use the resulting libraries in their code.
+
+@section tut_start3 Programming with PortAudio
+
+Below are the steps to writing a PortAudio application:
+
+ - Write a callback function that will be called by PortAudio when audio processing is needed.
+ - Initialize the PA library and open a stream for audio I/O.
+ - Start the stream. Your callback function will be now be called repeatedly by PA in the background.
+ - In your callback you can read audio data from the inputBuffer and/or write data to the outputBuffer.
+ - Stop the stream by returning 1 from your callback, or by calling a stop function.
+ - Close the stream and terminate the library.
+
+In addition to this "Callback" architecture, V19 also supports a "Blocking I/O" model which uses read and write calls which may be more familiar to non-audio programmers. Note that at this time, not all APIs support this functionality.
+
+In this tutorial, we'll show how to use the callback architecture to play a sawtooth wave. Much of the tutorial is taken from the file paex_saw.c, which is part of the PortAudio distribution. When you're done with this tutorial, you'll be armed with the basic knowledge you need to write an audio program. If you need more sample code, look in the "examples" and "test" directory of the PortAudio distribution. Another great source of info is the portaudio.h Doxygen page, which documents the entire V19 API. Also see the page for tips on programming PortAudio on the PortAudio wiki.
+
+If you are upgrading from V18, you may want to look at the Proposed Enhancements to PortAudio, which describes the differences between V18 and V19.
+
+- \ref writing_a_callback
+- \ref initializing_portaudio
+- \ref open_default_stream
+- \ref start_stop_abort
+- \ref terminating_portaudio
+- \ref utility_functions
+- \ref querying_devices
+- \ref blocking_read_write
+
+Once you have a basic understanding of how to use PortAudio, you might be interested in \ref exploring.
+
+Next: \ref writing_a_callback
+
+*/
\ No newline at end of file
diff --git a/3rdparty/portaudio/doc/src/tutorial/utility_functions.dox b/3rdparty/portaudio/doc/src/tutorial/utility_functions.dox
new file mode 100644
index 000000000..c06bf3bca
--- /dev/null
+++ b/3rdparty/portaudio/doc/src/tutorial/utility_functions.dox
@@ -0,0 +1,69 @@
+/** @page utility_functions Utility Functions
+@ingroup tutorial
+
+In addition to the functions described elsewhere in this tutorial, PortAudio provides a number of Utility functions that are useful in a variety of circumstances.
+You'll want to read the portaudio.h reference, which documents the entire V19 API for details, but we'll try to cover the basics here.
+
+@section tut_util2 Version Information
+
+PortAudio offers two functions to determine the PortAudio Version. This is most useful when you are using PortAudio as a dynamic library, but it may also be useful at other times.
+
+@code
+int Pa_GetVersion (void)
+const char * Pa_GetVersionText (void)
+@endcode
+
+@section tut_util3 Error Text
+
+PortAudio allows you to get error text from an error number.
+
+@code
+const char * Pa_GetErrorText (PaError errorCode)
+@endcode
+
+@section tut_util4 Stream State
+
+PortAudio Streams exist in 3 states: Active, Stopped, and Callback Stopped. If a stream is in callback stopped state, you'll need to stop it before you can start it again. If you need to query the state of a PortAudio stream, there are two functions for doing so:
+
+@code
+PaError Pa_IsStreamStopped (PaStream *stream)
+PaError Pa_IsStreamActive (PaStream *stream)
+@endcode
+
+@section tut_util5 Stream Info
+
+If you need to retrieve info about a given stream, such as latency, and sample rate info, there's a function for that too:
+
+@code
+const PaStreamInfo * Pa_GetStreamInfo (PaStream *stream)
+@endcode
+
+@section tut_util6 Stream Time
+
+If you need to synchronise other activities such as display updates or MIDI output with the PortAudio callback you need to know the current time according to the same timebase used by the stream callback timestamps.
+
+@code
+PaTime Pa_GetStreamTime (PaStream *stream)
+@endcode
+
+@section tut_util6CPU Usage
+
+To determine how much CPU is being used by the callback, use these:
+
+@code
+double Pa_GetStreamCpuLoad (PaStream *stream)
+@endcode
+
+@section tut_util7 Other utilities
+
+These functions allow you to determine the size of a sample from its format and sleep for a given amount of time. The sleep function should not be used for precise timing or synchronization because it makes few guarantees about the exact length of time it waits. It is most useful for testing.
+
+@code
+PaError Pa_GetSampleSize (PaSampleFormat format)
+void Pa_Sleep (long msec)
+@endcode
+
+
+Previous: \ref terminating_portaudio | Next: \ref querying_devices
+
+*/
\ No newline at end of file
diff --git a/3rdparty/portaudio/doc/src/tutorial/writing_a_callback.dox b/3rdparty/portaudio/doc/src/tutorial/writing_a_callback.dox
new file mode 100644
index 000000000..f0a43ccd0
--- /dev/null
+++ b/3rdparty/portaudio/doc/src/tutorial/writing_a_callback.dox
@@ -0,0 +1,66 @@
+/** @page writing_a_callback Writing a Callback Function
+@ingroup tutorial
+
+To write a program using PortAudio, you must include the "portaudio.h" include file. You may wish to read "portaudio.h" because it contains a complete description of the PortAudio functions and constants. Alternatively, you could browse the [http://www.portaudio.com/docs/v19-doxydocs/portaudio_8h.html "portaudio.h" Doxygen page]
+@code
+#include "portaudio.h"
+@endcode
+The next task is to write your own "callback" function. The "callback" is a function that is called by the PortAudio engine whenever it has captured audio data, or when it needs more audio data for output.
+
+Before we begin, it's important to realize that the callback is a delicate place. This is because some systems perform the callback in a special thread, or interrupt handler, and it is rarely treated the same as the rest of your code. In addition, if you want your audio to reach the speakers on time, you'll need to make sure whatever code you run in the callback runs quickly. What is safe or not safe will vary from platform to platform, but as a rule of thumb, don't do anything like allocating or freeing memory, reading or writing files, printf(), or anything else that might take an unbounded amount of time or rely on the OS or require a context switch. Ed: is this still true?: Also do not call any PortAudio functions in the callback except for Pa_StreamTime() and Pa_GetCPULoad().
+
+Your callback function must return an int and accept the exact parameters specified in this typedef:
+
+@code
+typedef int PaStreamCallback( const void *input,
+ void *output,
+ unsigned long frameCount,
+ const PaStreamCallbackTimeInfo* timeInfo,
+ PaStreamCallbackFlags statusFlags,
+ void *userData ) ;
+@endcode
+Here is an example callback function from the test file "patests/patest_saw.c". It calculates a simple left and right sawtooth signal and writes it to the output buffer. Notice that in this example, the signals are of float data type. The signals must be between -1.0 and +1.0. You can also use 16 bit integers or other formats which are specified during setup, but floats are easiest to work with. You can pass a pointer to your data structure through PortAudio which will appear as userData.
+
+@code
+typedef struct
+{
+ float left_phase;
+ float right_phase;
+}
+paTestData;
+
+/* This routine will be called by the PortAudio engine when audio is needed.
+** It may called at interrupt level on some machines so don't do anything
+** that could mess up the system like calling malloc() or free().
+*/
+static int patestCallback( const void *inputBuffer, void *outputBuffer,
+ unsigned long framesPerBuffer,
+ const PaStreamCallbackTimeInfo* timeInfo,
+ PaStreamCallbackFlags statusFlags,
+ void *userData )
+{
+ /* Cast data passed through stream to our structure. */
+ paTestData *data = (paTestData*)userData;
+ float *out = (float*)outputBuffer;
+ unsigned int i;
+ (void) inputBuffer; /* Prevent unused variable warning. */
+
+ for( i=0; ileft_phase; /* left */
+ *out++ = data->right_phase; /* right */
+ /* Generate simple sawtooth phaser that ranges between -1.0 and 1.0. */
+ data->left_phase += 0.01f;
+ /* When signal reaches top, drop back down. */
+ if( data->left_phase >= 1.0f ) data->left_phase -= 2.0f;
+ /* higher pitch so we can distinguish left and right. */
+ data->right_phase += 0.03f;
+ if( data->right_phase >= 1.0f ) data->right_phase -= 2.0f;
+ }
+ return 0;
+}
+@endcode
+
+Previous: \ref tutorial_start | Next: \ref initializing_portaudio
+
+*/
\ No newline at end of file
diff --git a/3rdparty/portaudio/include/pa_mac_core.h b/3rdparty/portaudio/include/pa_mac_core.h
index f7a90f08f..1d615feed 100644
--- a/3rdparty/portaudio/include/pa_mac_core.h
+++ b/3rdparty/portaudio/include/pa_mac_core.h
@@ -124,6 +124,19 @@ AudioDeviceID PaMacCore_GetStreamOutputDevice( PaStream* s );
*/
const char *PaMacCore_GetChannelName( int device, int channelIndex, bool input );
+
+/** Retrieve the range of legal native buffer sizes for the specificed device, in sample frames.
+
+ @param device The global index of the PortAudio device about which the query is being made.
+ @param minBufferSizeFrames A pointer to the location which will receive the minimum buffer size value.
+ @param maxBufferSizeFrames A pointer to the location which will receive the maximum buffer size value.
+
+ @see kAudioDevicePropertyBufferFrameSizeRange in the CoreAudio SDK.
+ */
+PaError PaMacCore_GetBufferSizeRange( PaDeviceIndex device,
+ long *minBufferSizeFrames, long *maxBufferSizeFrames );
+
+
/**
* Flags
*/
diff --git a/3rdparty/portaudio/include/pa_win_wdmks.h b/3rdparty/portaudio/include/pa_win_wdmks.h
new file mode 100644
index 000000000..9fe9284bd
--- /dev/null
+++ b/3rdparty/portaudio/include/pa_win_wdmks.h
@@ -0,0 +1,106 @@
+#ifndef PA_WIN_WDMKS_H
+#define PA_WIN_WDMKS_H
+/*
+ * $Id: pa_win_wdmks.h 1812 2012-02-14 09:32:57Z robiwan $
+ * PortAudio Portable Real-Time Audio Library
+ * WDM/KS specific extensions
+ *
+ * Copyright (c) 1999-2007 Ross Bencina and Phil Burk
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * The text above constitutes the entire PortAudio license; however,
+ * the PortAudio community also makes the following non-binding requests:
+ *
+ * Any person wishing to distribute modifications to the Software is
+ * requested to send the modifications to the original developer so that
+ * they can be incorporated into the canonical version. It is also
+ * requested that these non-binding requests be included along with the
+ * license above.
+ */
+
+/** @file
+ @ingroup public_header
+ @brief WDM Kernel Streaming-specific PortAudio API extension header file.
+*/
+
+
+#include "portaudio.h"
+
+#include
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+ typedef struct PaWinWDMKSInfo{
+ unsigned long size; /**< sizeof(PaWinWDMKSInfo) */
+ PaHostApiTypeId hostApiType; /**< paWDMKS */
+ unsigned long version; /**< 1 */
+
+ /* The number of packets to use for WaveCyclic devices, range is [2, 8]. Set to zero for default value of 2. */
+ unsigned noOfPackets;
+ } PaWinWDMKSInfo;
+
+ typedef enum PaWDMKSType
+ {
+ Type_kNotUsed,
+ Type_kWaveCyclic,
+ Type_kWaveRT,
+ Type_kCnt,
+ } PaWDMKSType;
+
+ typedef enum PaWDMKSSubType
+ {
+ SubType_kUnknown,
+ SubType_kNotification,
+ SubType_kPolled,
+ SubType_kCnt,
+ } PaWDMKSSubType;
+
+ typedef struct PaWinWDMKSDeviceInfo {
+ wchar_t filterPath[MAX_PATH]; /**< KS filter path in Unicode! */
+ wchar_t topologyPath[MAX_PATH]; /**< Topology filter path in Unicode! */
+ PaWDMKSType streamingType;
+ GUID deviceProductGuid; /**< The product GUID of the device (if supported) */
+ } PaWinWDMKSDeviceInfo;
+
+ typedef struct PaWDMKSDirectionSpecificStreamInfo
+ {
+ PaDeviceIndex device;
+ unsigned channels; /**< No of channels the device is opened with */
+ unsigned framesPerHostBuffer; /**< No of frames of the device buffer */
+ int endpointPinId; /**< Endpoint pin ID (on topology filter if topologyName is not empty) */
+ int muxNodeId; /**< Only valid for input */
+ PaWDMKSSubType streamingSubType; /**< Not known until device is opened for streaming */
+ } PaWDMKSDirectionSpecificStreamInfo;
+
+ typedef struct PaWDMKSSpecificStreamInfo {
+ PaWDMKSDirectionSpecificStreamInfo input;
+ PaWDMKSDirectionSpecificStreamInfo output;
+ } PaWDMKSSpecificStreamInfo;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* PA_WIN_DS_H */
diff --git a/3rdparty/portaudio/src/SConscript b/3rdparty/portaudio/src/SConscript
index 5cc915216..84ab1338b 100644
--- a/3rdparty/portaudio/src/SConscript
+++ b/3rdparty/portaudio/src/SConscript
@@ -1,220 +1,220 @@
-import os.path, copy, sys
-
-def checkSymbol(conf, header, library=None, symbol=None, autoAdd=True, critical=False, pkgName=None):
- """ Check for symbol in library, optionally look only for header.
- @param conf: Configure instance.
- @param header: The header file where the symbol is declared.
- @param library: The library in which the symbol exists, if None it is taken to be the standard C library.
- @param symbol: The symbol to look for, if None only the header will be looked up.
- @param autoAdd: Automatically link with this library if check is positive.
- @param critical: Raise on error?
- @param pkgName: Optional name of pkg-config entry for library, to determine build parameters.
- @return: True/False
- """
- origEnv = conf.env.Copy() # Copy unmodified environment so we can restore it upon error
- env = conf.env
- if library is None:
- library = "c" # Standard library
- autoAdd = False
-
- if pkgName is not None:
- origLibs = copy.copy(env.get("LIBS", None))
-
- try: env.ParseConfig("pkg-config --silence-errors %s --cflags --libs" % pkgName)
- except: pass
- else:
- # I see no other way of checking that the parsing succeeded, if it did add no more linking parameters
- if env.get("LIBS", None) != origLibs:
- autoAdd = False
-
- try:
- if not conf.CheckCHeader(header, include_quotes="<>"):
- raise ConfigurationError("missing header %s" % header)
- if symbol is not None and not conf.CheckLib(library, symbol, language="C", autoadd=autoAdd):
- raise ConfigurationError("missing symbol %s in library %s" % (symbol, library))
- except ConfigurationError:
- conf.env = origEnv
- if not critical:
- return False
- raise
-
- return True
-
-import SCons.Errors
-
-# Import common variables
-
-# Could use '#' to refer to top-level SConstruct directory, but looks like env.SConsignFile doesn't interpret this at least :(
-sconsDir = os.path.abspath(os.path.join("build", "scons"))
-
-try:
- Import("Platform", "Posix", "ConfigurationError", "ApiVer")
-except SCons.Errors.UserError:
- # The common objects must be exported first
- SConscript(os.path.join(sconsDir, "SConscript_common"))
- Import("Platform", "Posix", "ConfigurationError", "ApiVer")
-
-Import("env")
-
-# This will be manipulated
-env = env.Copy()
-
-# We operate with a set of needed libraries and optional libraries, the latter stemming from host API implementations.
-# For libraries of both types we record a set of values that is used to look for the library in question, during
-# configuration. If the corresponding library for a host API implementation isn't found, the implementation is left out.
-neededLibs = []
-optionalImpls = {}
-if Platform in Posix:
- env.Append(CPPPATH=os.path.join("os", "unix"))
- neededLibs += [("pthread", "pthread.h", "pthread_create"), ("m", "math.h", "sin")]
- if env["useALSA"]:
- optionalImpls["ALSA"] = ("asound", "alsa/asoundlib.h", "snd_pcm_open")
- if env["useJACK"]:
- optionalImpls["JACK"] = ("jack", "jack/jack.h", "jack_client_new")
- if env["useOSS"]:
- # TODO: It looks like the prefix for soundcard.h depends on the platform
- optionalImpls["OSS"] = ("oss", "sys/soundcard.h", None)
- if Platform == 'netbsd':
- optionalImpls["OSS"] = ("ossaudio", "sys/soundcard.h", "_oss_ioctl")
- if env["useASIHPI"]:
- optionalImpls["ASIHPI"] = ("hpi", "asihpi/hpi.h", "HPI_SubSysCreate")
- if env["useCOREAUDIO"]:
- optionalImpls["COREAUDIO"] = ("CoreAudio", "CoreAudio/CoreAudio.h", None)
-else:
- raise ConfigurationError("unknown platform %s" % Platform)
-
-if Platform == "darwin":
- env.Append(LINKFLAGS="-framework CoreFoundation -framework CoreServices -framework CoreAudio -framework AudioToolBox -framework AudioUnit")
-elif Platform == "cygwin":
- env.Append(LIBS=["winmm"])
-elif Platform == "irix":
- neededLibs += [("audio", "dmedia/audio.h", "alOpenPort"), ("dmedia", "dmedia/dmedia.h", "dmGetUST")]
- env.Append(CPPDEFINES=["PA_USE_SGI"])
-
-def CheckCTypeSize(context, tp):
- """ Check size of C type.
- @param context: A configuration context.
- @param tp: The type to check.
- @return: Size of type, in bytes.
- """
- context.Message("Checking the size of C type %s..." % tp)
- ret = context.TryRun("""
-#include
-
-int main() {
- printf("%%d", sizeof(%s));
- return 0;
-}
-""" % tp, ".c")
- if not ret[0]:
- context.Result(" Couldn't obtain size of type %s!" % tp)
- return None
-
- assert ret[1]
- sz = int(ret[1])
- context.Result("%d" % sz)
- return sz
-
-"""
-if sys.byteorder == "little":
- env.Append(CPPDEFINES=["PA_LITTLE_ENDIAN"])
-elif sys.byteorder == "big":
- env.Append(CPPDEFINES=["PA_BIG_ENDIAN"])
-else:
- raise ConfigurationError("unknown byte order: %s" % sys.byteorder)
-"""
-if env["enableDebugOutput"]:
- env.Append(CPPDEFINES=["PA_ENABLE_DEBUG_OUTPUT"])
-
-# Start configuration
-
-# Use an absolute path for conf_dir, otherwise it gets created both relative to current directory and build directory
-conf = env.Configure(log_file=os.path.join(sconsDir, "sconf.log"), custom_tests={"CheckCTypeSize": CheckCTypeSize},
- conf_dir=os.path.join(sconsDir, ".sconf_temp"))
-conf.env.Append(CPPDEFINES=["SIZEOF_SHORT=%d" % conf.CheckCTypeSize("short")])
-conf.env.Append(CPPDEFINES=["SIZEOF_INT=%d" % conf.CheckCTypeSize("int")])
-conf.env.Append(CPPDEFINES=["SIZEOF_LONG=%d" % conf.CheckCTypeSize("long")])
-if checkSymbol(conf, "time.h", "rt", "clock_gettime"):
- conf.env.Append(CPPDEFINES=["HAVE_CLOCK_GETTIME"])
-if checkSymbol(conf, "time.h", symbol="nanosleep"):
- conf.env.Append(CPPDEFINES=["HAVE_NANOSLEEP"])
-if conf.CheckCHeader("sys/soundcard.h"):
- conf.env.Append(CPPDEFINES=["HAVE_SYS_SOUNDCARD_H"])
-if conf.CheckCHeader("linux/soundcard.h"):
- conf.env.Append(CPPDEFINES=["HAVE_LINUX_SOUNDCARD_H"])
-if conf.CheckCHeader("machine/soundcard.h"):
- conf.env.Append(CPPDEFINES=["HAVE_MACHINE_SOUNDCARD_H"])
-
-# Look for needed libraries and link with them
-for lib, hdr, sym in neededLibs:
- checkSymbol(conf, hdr, lib, sym, critical=True)
-# Look for host API libraries, if a library isn't found disable corresponding host API implementation.
-for name, val in optionalImpls.items():
- lib, hdr, sym = val
- if checkSymbol(conf, hdr, lib, sym, critical=False, pkgName=name.lower()):
- conf.env.Append(CPPDEFINES=["PA_USE_%s=1" % name.upper()])
- else:
- del optionalImpls[name]
-
-# Configuration finished
-env = conf.Finish()
-
-# PA infrastructure
-CommonSources = [os.path.join("common", f) for f in "pa_allocation.c pa_converters.c pa_cpuload.c pa_dither.c pa_front.c \
- pa_process.c pa_stream.c pa_trace.c pa_debugprint.c pa_ringbuffer.c".split()]
-CommonSources.append(os.path.join("hostapi", "skeleton", "pa_hostapi_skeleton.c"))
-
-# Host APIs implementations
-ImplSources = []
-if Platform in Posix:
- ImplSources += [os.path.join("os", "unix", f) for f in "pa_unix_hostapis.c pa_unix_util.c".split()]
-
-if "ALSA" in optionalImpls:
- ImplSources.append(os.path.join("hostapi", "alsa", "pa_linux_alsa.c"))
-if "JACK" in optionalImpls:
- ImplSources.append(os.path.join("hostapi", "jack", "pa_jack.c"))
-if "OSS" in optionalImpls:
- ImplSources.append(os.path.join("hostapi", "oss", "pa_unix_oss.c"))
-if "ASIHPI" in optionalImpls:
- ImplSources.append(os.path.join("hostapi", "asihpi", "pa_linux_asihpi.c"))
-if "COREAUDIO" in optionalImpls:
- ImplSources.append([os.path.join("hostapi", "coreaudio", f) for f in """
- pa_mac_core.c pa_mac_core_blocking.c pa_mac_core_utilities.c
- """.split()])
-
-
-sources = CommonSources + ImplSources
-
-sharedLibEnv = env.Copy()
-if Platform in Posix:
- # Add soname to library, this is so a reference is made to the versioned library in programs linking against libportaudio.so
- if Platform != 'darwin':
- sharedLibEnv.AppendUnique(SHLINKFLAGS="-Wl,-soname=libportaudio.so.%d" % int(ApiVer.split(".")[0]))
-sharedLib = sharedLibEnv.SharedLibrary(target="portaudio", source=sources)
-
-staticLib = env.StaticLibrary(target="portaudio", source=sources)
-
-if Platform in Posix:
- prefix = env["prefix"]
- includeDir = os.path.join(prefix, "include")
- libDir = os.path.join(prefix, "lib")
-
-testNames = ["patest_sine", "paqa_devs", "paqa_errs", "patest1", "patest_buffer", "patest_callbackstop", "patest_clip", \
- "patest_dither", "patest_hang", "patest_in_overflow", "patest_latency", "patest_leftright", "patest_longsine", \
- "patest_many", "patest_maxsines", "patest_multi_sine", "patest_out_underflow", "patest_pink", "patest_prime", \
- "patest_read_record", "patest_record", "patest_ringmix", "patest_saw", "patest_sine8", "patest_sine", \
- "patest_sine_time", "patest_start_stop", "patest_stop", "patest_sync", "patest_toomanysines", \
- "patest_underflow", "patest_wire", "patest_write_sine", "pa_devs", "pa_fuzz", "pa_minlat", \
- "patest_sine_channelmaps",]
-
-# The test directory ("bin") should be in the top-level PA directory
-tests = [env.Program(target=os.path.join("#", "bin", name), source=[os.path.join("#", "test", name + ".c"),
- staticLib]) for name in testNames]
-
-# Detect host APIs
-hostApis = []
-for cppdef in env["CPPDEFINES"]:
- if cppdef.startswith("PA_USE_"):
- hostApis.append(cppdef[7:-2])
-
-Return("sources", "sharedLib", "staticLib", "tests", "env", "hostApis")
+import os.path, copy, sys
+
+def checkSymbol(conf, header, library=None, symbol=None, autoAdd=True, critical=False, pkgName=None):
+ """ Check for symbol in library, optionally look only for header.
+ @param conf: Configure instance.
+ @param header: The header file where the symbol is declared.
+ @param library: The library in which the symbol exists, if None it is taken to be the standard C library.
+ @param symbol: The symbol to look for, if None only the header will be looked up.
+ @param autoAdd: Automatically link with this library if check is positive.
+ @param critical: Raise on error?
+ @param pkgName: Optional name of pkg-config entry for library, to determine build parameters.
+ @return: True/False
+ """
+ origEnv = conf.env.Copy() # Copy unmodified environment so we can restore it upon error
+ env = conf.env
+ if library is None:
+ library = "c" # Standard library
+ autoAdd = False
+
+ if pkgName is not None:
+ origLibs = copy.copy(env.get("LIBS", None))
+
+ try: env.ParseConfig("pkg-config --silence-errors %s --cflags --libs" % pkgName)
+ except: pass
+ else:
+ # I see no other way of checking that the parsing succeeded, if it did add no more linking parameters
+ if env.get("LIBS", None) != origLibs:
+ autoAdd = False
+
+ try:
+ if not conf.CheckCHeader(header, include_quotes="<>"):
+ raise ConfigurationError("missing header %s" % header)
+ if symbol is not None and not conf.CheckLib(library, symbol, language="C", autoadd=autoAdd):
+ raise ConfigurationError("missing symbol %s in library %s" % (symbol, library))
+ except ConfigurationError:
+ conf.env = origEnv
+ if not critical:
+ return False
+ raise
+
+ return True
+
+import SCons.Errors
+
+# Import common variables
+
+# Could use '#' to refer to top-level SConstruct directory, but looks like env.SConsignFile doesn't interpret this at least :(
+sconsDir = os.path.abspath(os.path.join("build", "scons"))
+
+try:
+ Import("Platform", "Posix", "ConfigurationError", "ApiVer")
+except SCons.Errors.UserError:
+ # The common objects must be exported first
+ SConscript(os.path.join(sconsDir, "SConscript_common"))
+ Import("Platform", "Posix", "ConfigurationError", "ApiVer")
+
+Import("env")
+
+# This will be manipulated
+env = env.Copy()
+
+# We operate with a set of needed libraries and optional libraries, the latter stemming from host API implementations.
+# For libraries of both types we record a set of values that is used to look for the library in question, during
+# configuration. If the corresponding library for a host API implementation isn't found, the implementation is left out.
+neededLibs = []
+optionalImpls = {}
+if Platform in Posix:
+ env.Append(CPPPATH=os.path.join("os", "unix"))
+ neededLibs += [("pthread", "pthread.h", "pthread_create"), ("m", "math.h", "sin")]
+ if env["useALSA"]:
+ optionalImpls["ALSA"] = ("asound", "alsa/asoundlib.h", "snd_pcm_open")
+ if env["useJACK"]:
+ optionalImpls["JACK"] = ("jack", "jack/jack.h", "jack_client_new")
+ if env["useOSS"]:
+ # TODO: It looks like the prefix for soundcard.h depends on the platform
+ optionalImpls["OSS"] = ("oss", "sys/soundcard.h", None)
+ if Platform == 'netbsd':
+ optionalImpls["OSS"] = ("ossaudio", "sys/soundcard.h", "_oss_ioctl")
+ if env["useASIHPI"]:
+ optionalImpls["ASIHPI"] = ("hpi", "asihpi/hpi.h", "HPI_SubSysCreate")
+ if env["useCOREAUDIO"]:
+ optionalImpls["COREAUDIO"] = ("CoreAudio", "CoreAudio/CoreAudio.h", None)
+else:
+ raise ConfigurationError("unknown platform %s" % Platform)
+
+if Platform == "darwin":
+ env.Append(LINKFLAGS="-framework CoreFoundation -framework CoreServices -framework CoreAudio -framework AudioToolBox -framework AudioUnit")
+elif Platform == "cygwin":
+ env.Append(LIBS=["winmm"])
+elif Platform == "irix":
+ neededLibs += [("audio", "dmedia/audio.h", "alOpenPort"), ("dmedia", "dmedia/dmedia.h", "dmGetUST")]
+ env.Append(CPPDEFINES=["PA_USE_SGI"])
+
+def CheckCTypeSize(context, tp):
+ """ Check size of C type.
+ @param context: A configuration context.
+ @param tp: The type to check.
+ @return: Size of type, in bytes.
+ """
+ context.Message("Checking the size of C type %s..." % tp)
+ ret = context.TryRun("""
+#include
+
+int main() {
+ printf("%%d", sizeof(%s));
+ return 0;
+}
+""" % tp, ".c")
+ if not ret[0]:
+ context.Result(" Couldn't obtain size of type %s!" % tp)
+ return None
+
+ assert ret[1]
+ sz = int(ret[1])
+ context.Result("%d" % sz)
+ return sz
+
+"""
+if sys.byteorder == "little":
+ env.Append(CPPDEFINES=["PA_LITTLE_ENDIAN"])
+elif sys.byteorder == "big":
+ env.Append(CPPDEFINES=["PA_BIG_ENDIAN"])
+else:
+ raise ConfigurationError("unknown byte order: %s" % sys.byteorder)
+"""
+if env["enableDebugOutput"]:
+ env.Append(CPPDEFINES=["PA_ENABLE_DEBUG_OUTPUT"])
+
+# Start configuration
+
+# Use an absolute path for conf_dir, otherwise it gets created both relative to current directory and build directory
+conf = env.Configure(log_file=os.path.join(sconsDir, "sconf.log"), custom_tests={"CheckCTypeSize": CheckCTypeSize},
+ conf_dir=os.path.join(sconsDir, ".sconf_temp"))
+conf.env.Append(CPPDEFINES=["SIZEOF_SHORT=%d" % conf.CheckCTypeSize("short")])
+conf.env.Append(CPPDEFINES=["SIZEOF_INT=%d" % conf.CheckCTypeSize("int")])
+conf.env.Append(CPPDEFINES=["SIZEOF_LONG=%d" % conf.CheckCTypeSize("long")])
+if checkSymbol(conf, "time.h", "rt", "clock_gettime"):
+ conf.env.Append(CPPDEFINES=["HAVE_CLOCK_GETTIME"])
+if checkSymbol(conf, "time.h", symbol="nanosleep"):
+ conf.env.Append(CPPDEFINES=["HAVE_NANOSLEEP"])
+if conf.CheckCHeader("sys/soundcard.h"):
+ conf.env.Append(CPPDEFINES=["HAVE_SYS_SOUNDCARD_H"])
+if conf.CheckCHeader("linux/soundcard.h"):
+ conf.env.Append(CPPDEFINES=["HAVE_LINUX_SOUNDCARD_H"])
+if conf.CheckCHeader("machine/soundcard.h"):
+ conf.env.Append(CPPDEFINES=["HAVE_MACHINE_SOUNDCARD_H"])
+
+# Look for needed libraries and link with them
+for lib, hdr, sym in neededLibs:
+ checkSymbol(conf, hdr, lib, sym, critical=True)
+# Look for host API libraries, if a library isn't found disable corresponding host API implementation.
+for name, val in optionalImpls.items():
+ lib, hdr, sym = val
+ if checkSymbol(conf, hdr, lib, sym, critical=False, pkgName=name.lower()):
+ conf.env.Append(CPPDEFINES=["PA_USE_%s=1" % name.upper()])
+ else:
+ del optionalImpls[name]
+
+# Configuration finished
+env = conf.Finish()
+
+# PA infrastructure
+CommonSources = [os.path.join("common", f) for f in "pa_allocation.c pa_converters.c pa_cpuload.c pa_dither.c pa_front.c \
+ pa_process.c pa_stream.c pa_trace.c pa_debugprint.c pa_ringbuffer.c".split()]
+CommonSources.append(os.path.join("hostapi", "skeleton", "pa_hostapi_skeleton.c"))
+
+# Host APIs implementations
+ImplSources = []
+if Platform in Posix:
+ ImplSources += [os.path.join("os", "unix", f) for f in "pa_unix_hostapis.c pa_unix_util.c".split()]
+
+if "ALSA" in optionalImpls:
+ ImplSources.append(os.path.join("hostapi", "alsa", "pa_linux_alsa.c"))
+if "JACK" in optionalImpls:
+ ImplSources.append(os.path.join("hostapi", "jack", "pa_jack.c"))
+if "OSS" in optionalImpls:
+ ImplSources.append(os.path.join("hostapi", "oss", "pa_unix_oss.c"))
+if "ASIHPI" in optionalImpls:
+ ImplSources.append(os.path.join("hostapi", "asihpi", "pa_linux_asihpi.c"))
+if "COREAUDIO" in optionalImpls:
+ ImplSources.append([os.path.join("hostapi", "coreaudio", f) for f in """
+ pa_mac_core.c pa_mac_core_blocking.c pa_mac_core_utilities.c
+ """.split()])
+
+
+sources = CommonSources + ImplSources
+
+sharedLibEnv = env.Copy()
+if Platform in Posix:
+ # Add soname to library, this is so a reference is made to the versioned library in programs linking against libportaudio.so
+ if Platform != 'darwin':
+ sharedLibEnv.AppendUnique(SHLINKFLAGS="-Wl,-soname=libportaudio.so.%d" % int(ApiVer.split(".")[0]))
+sharedLib = sharedLibEnv.SharedLibrary(target="portaudio", source=sources)
+
+staticLib = env.StaticLibrary(target="portaudio", source=sources)
+
+if Platform in Posix:
+ prefix = env["prefix"]
+ includeDir = os.path.join(prefix, "include")
+ libDir = os.path.join(prefix, "lib")
+
+testNames = ["patest_sine", "paqa_devs", "paqa_errs", "patest1", "patest_buffer", "patest_callbackstop", "patest_clip", \
+ "patest_dither", "patest_hang", "patest_in_overflow", "patest_latency", "patest_leftright", "patest_longsine", \
+ "patest_many", "patest_maxsines", "patest_multi_sine", "patest_out_underflow", "patest_pink", "patest_prime", \
+ "patest_read_record", "patest_record", "patest_ringmix", "patest_saw", "patest_sine8", "patest_sine", \
+ "patest_sine_time", "patest_start_stop", "patest_stop", "patest_sync", "patest_toomanysines", \
+ "patest_underflow", "patest_wire", "patest_write_sine", "pa_devs", "pa_fuzz", "pa_minlat", \
+ "patest_sine_channelmaps",]
+
+# The test directory ("bin") should be in the top-level PA directory
+tests = [env.Program(target=os.path.join("#", "bin", name), source=[os.path.join("#", "test", name + ".c"),
+ staticLib]) for name in testNames]
+
+# Detect host APIs
+hostApis = []
+for cppdef in env["CPPDEFINES"]:
+ if cppdef.startswith("PA_USE_"):
+ hostApis.append(cppdef[7:-2])
+
+Return("sources", "sharedLib", "staticLib", "tests", "env", "hostApis")
diff --git a/3rdparty/portaudio/src/common/pa_trace.c b/3rdparty/portaudio/src/common/pa_trace.c
index 24305003f..bf1ad443e 100644
--- a/3rdparty/portaudio/src/common/pa_trace.c
+++ b/3rdparty/portaudio/src/common/pa_trace.c
@@ -1,5 +1,5 @@
/*
- * $Id: pa_trace.c 1339 2008-02-15 07:50:33Z rossb $
+ * $Id: pa_trace.c 1812 2012-02-14 09:32:57Z robiwan $
* Portable Audio I/O Library Trace Facility
* Store trace information in real-time for later printing.
*
@@ -46,12 +46,16 @@
#include
#include
+#include
#include
+#include
#include "pa_trace.h"
+#include "pa_util.h"
+#include "pa_debugprint.h"
#if PA_TRACE_REALTIME_EVENTS
-static char *traceTextArray[PA_MAX_TRACE_RECORDS];
+static char const *traceTextArray[PA_MAX_TRACE_RECORDS];
static int traceIntArray[PA_MAX_TRACE_RECORDS];
static int traceIndex = 0;
static int traceBlock = 0;
@@ -94,4 +98,133 @@ void PaUtil_AddTraceMessage( const char *msg, int data )
}
}
+/************************************************************************/
+/* High performance log alternative */
+/************************************************************************/
+
+typedef unsigned long long PaUint64;
+
+typedef struct __PaHighPerformanceLog
+{
+ unsigned magik;
+ int writePtr;
+ int readPtr;
+ int size;
+ double refTime;
+ char* data;
+} PaHighPerformanceLog;
+
+static const unsigned kMagik = 0xcafebabe;
+
+#define USEC_PER_SEC (1000000ULL)
+
+int PaUtil_InitializeHighSpeedLog( LogHandle* phLog, unsigned maxSizeInBytes )
+{
+ PaHighPerformanceLog* pLog = (PaHighPerformanceLog*)PaUtil_AllocateMemory(sizeof(PaHighPerformanceLog));
+ if (pLog == 0)
+ {
+ return paInsufficientMemory;
+ }
+ assert(phLog != 0);
+ *phLog = pLog;
+
+ pLog->data = (char*)PaUtil_AllocateMemory(maxSizeInBytes);
+ if (pLog->data == 0)
+ {
+ PaUtil_FreeMemory(pLog);
+ return paInsufficientMemory;
+ }
+ pLog->magik = kMagik;
+ pLog->size = maxSizeInBytes;
+ pLog->refTime = PaUtil_GetTime();
+ return paNoError;
+}
+
+void PaUtil_ResetHighSpeedLogTimeRef( LogHandle hLog )
+{
+ PaHighPerformanceLog* pLog = (PaHighPerformanceLog*)hLog;
+ assert(pLog->magik == kMagik);
+ pLog->refTime = PaUtil_GetTime();
+}
+
+typedef struct __PaLogEntryHeader
+{
+ int size;
+ double timeStamp;
+} PaLogEntryHeader;
+
+#ifdef __APPLE__
+#define _vsnprintf vsnprintf
+#define min(a,b) ((a)<(b)?(a):(b))
+#endif
+
+
+int PaUtil_AddHighSpeedLogMessage( LogHandle hLog, const char* fmt, ... )
+{
+ va_list l;
+ int n = 0;
+ PaHighPerformanceLog* pLog = (PaHighPerformanceLog*)hLog;
+ if (pLog != 0)
+ {
+ PaLogEntryHeader* pHeader;
+ char* p;
+ int maxN;
+ assert(pLog->magik == kMagik);
+ pHeader = (PaLogEntryHeader*)( pLog->data + pLog->writePtr );
+ p = (char*)( pHeader + 1 );
+ maxN = pLog->size - pLog->writePtr - 2 * sizeof(PaLogEntryHeader);
+
+ pHeader->timeStamp = PaUtil_GetTime() - pLog->refTime;
+ if (maxN > 0)
+ {
+ if (maxN > 32)
+ {
+ va_start(l, fmt);
+ n = _vsnprintf(p, min(1024, maxN), fmt, l);
+ va_end(l);
+ }
+ else {
+ n = sprintf(p, "End of log...");
+ }
+ n = ((n + sizeof(unsigned)) & ~(sizeof(unsigned)-1)) + sizeof(PaLogEntryHeader);
+ pHeader->size = n;
+#if 0
+ PaUtil_DebugPrint("%05u.%03u: %s\n", pHeader->timeStamp/1000, pHeader->timeStamp%1000, p);
+#endif
+ pLog->writePtr += n;
+ }
+ }
+ return n;
+}
+
+void PaUtil_DumpHighSpeedLog( LogHandle hLog, const char* fileName )
+{
+ FILE* f = (fileName != NULL) ? fopen(fileName, "w") : stdout;
+ unsigned localWritePtr;
+ PaHighPerformanceLog* pLog = (PaHighPerformanceLog*)hLog;
+ assert(pLog->magik == kMagik);
+ localWritePtr = pLog->writePtr;
+ while (pLog->readPtr != localWritePtr)
+ {
+ const PaLogEntryHeader* pHeader = (const PaLogEntryHeader*)( pLog->data + pLog->readPtr );
+ const char* p = (const char*)( pHeader + 1 );
+ const PaUint64 ts = (const PaUint64)( pHeader->timeStamp * USEC_PER_SEC );
+ assert(pHeader->size < (1024+sizeof(unsigned)+sizeof(PaLogEntryHeader)));
+ fprintf(f, "%05u.%03u: %s\n", (unsigned)(ts/1000), (unsigned)(ts%1000), p);
+ pLog->readPtr += pHeader->size;
+ }
+ if (f != stdout)
+ {
+ fclose(f);
+ }
+}
+
+void PaUtil_DiscardHighSpeedLog( LogHandle hLog )
+{
+ PaHighPerformanceLog* pLog = (PaHighPerformanceLog*)hLog;
+ assert(pLog->magik == kMagik);
+ PaUtil_FreeMemory(pLog->data);
+ PaUtil_FreeMemory(pLog);
+}
+
#endif /* TRACE_REALTIME_EVENTS */
diff --git a/3rdparty/portaudio/src/common/pa_trace.h b/3rdparty/portaudio/src/common/pa_trace.h
index b11509e0e..612dbf327 100644
--- a/3rdparty/portaudio/src/common/pa_trace.h
+++ b/3rdparty/portaudio/src/common/pa_trace.h
@@ -1,7 +1,7 @@
#ifndef PA_TRACE_H
#define PA_TRACE_H
/*
- * $Id: pa_trace.h 1339 2008-02-15 07:50:33Z rossb $
+ * $Id: pa_trace.h 1812 2012-02-14 09:32:57Z robiwan $
* Portable Audio I/O Library Trace Facility
* Store trace information in real-time for later printing.
*
@@ -84,13 +84,29 @@ extern "C"
void PaUtil_ResetTraceMessages();
void PaUtil_AddTraceMessage( const char *msg, int data );
void PaUtil_DumpTraceMessages();
-
+
+/* Alternative interface */
+
+typedef void* LogHandle;
+
+int PaUtil_InitializeHighSpeedLog(LogHandle* phLog, unsigned maxSizeInBytes);
+void PaUtil_ResetHighSpeedLogTimeRef(LogHandle hLog);
+int PaUtil_AddHighSpeedLogMessage(LogHandle hLog, const char* fmt, ...);
+void PaUtil_DumpHighSpeedLog(LogHandle hLog, const char* fileName);
+void PaUtil_DiscardHighSpeedLog(LogHandle hLog);
+
#else
#define PaUtil_ResetTraceMessages() /* noop */
#define PaUtil_AddTraceMessage(msg,data) /* noop */
#define PaUtil_DumpTraceMessages() /* noop */
+#define PaUtil_InitializeHighSpeedLog(phLog, maxSizeInBytes) (0)
+#define PaUtil_ResetHighSpeedLogTimeRef(hLog)
+#define PaUtil_AddHighSpeedLogMessage(...) (0)
+#define PaUtil_DumpHighSpeedLog(hLog, fileName)
+#define PaUtil_DiscardHighSpeedLog(hLog)
+
#endif
diff --git a/3rdparty/portaudio/src/hostapi/alsa/pa_linux_alsa.c b/3rdparty/portaudio/src/hostapi/alsa/pa_linux_alsa.c
index 4dda3bb62..796b612f2 100644
--- a/3rdparty/portaudio/src/hostapi/alsa/pa_linux_alsa.c
+++ b/3rdparty/portaudio/src/hostapi/alsa/pa_linux_alsa.c
@@ -1,5 +1,5 @@
/*
- * $Id: pa_linux_alsa.c 1798 2011-12-08 19:43:29Z alan_horstmann $
+ * $Id: pa_linux_alsa.c 1822 2012-03-28 16:14:49Z dmitrykos $
* PortAudio Portable Real-Time Audio Library
* Latest Version at: http://www.portaudio.com
* ALSA implementation by Joshua Haberman and Arve Knudsen
@@ -7,6 +7,7 @@
* Copyright (c) 2002 Joshua Haberman
* Copyright (c) 2005-2009 Arve Knudsen
* Copyright (c) 2008 Kevin Kofler
+ * Copyright (c) 2011 Dmitry Kostjuchenko
*
* Based on the Open Source API proposed by Ross Bencina
* Copyright (c) 1999-2002 Ross Bencina, Phil Burk
@@ -79,10 +80,20 @@
#include "pa_linux_alsa.h"
+/* Add missing define (for compatibility with older ALSA versions). */
#ifndef SND_PCM_TSTAMP_ENABLE
-#define SND_PCM_TSTAMP_ENABLE SND_PCM_TSTAMP_MMAP
+ #define SND_PCM_TSTAMP_ENABLE SND_PCM_TSTAMP_MMAP
#endif
+/* Combine version elements into a single (unsigned) integer */
+#define ALSA_VERSION_INT(major, minor, subminor) ((major << 16) | (minor << 8) | subminor)
+
+/* Specifies that hardware audio sample needs byte-swapping into platfom native value representation. */
+#define paSwapEndian ((PaSampleFormat) 0x40000000) /**< @see PaSampleFormat */
+
+/* Remove paSwapEndian and paNonInterleaved flags to get pure format value. */
+#define PA_ALSA_TO_FORMAT(X) ((X) & ~(paSwapEndian|paNonInterleaved))
+
/* Defines Alsa function types and pointers to these functions. */
#define _PA_DEFINE_FUNC(x) typedef typeof(x) x##_ft; static x##_ft *alsa_##x = 0
@@ -186,6 +197,9 @@ _PA_DEFINE_FUNC(snd_pcm_info_set_subdevice);
_PA_DEFINE_FUNC(snd_pcm_info_set_stream);
_PA_DEFINE_FUNC(snd_pcm_info_get_name);
_PA_DEFINE_FUNC(snd_pcm_info_get_card);
+_PA_DEFINE_FUNC(snd_pcm_info_get_subdevices_count);
+_PA_DEFINE_FUNC(snd_pcm_info_get_subdevice_name);
+_PA_DEFINE_FUNC(snd_pcm_info_get_subdevices_avail);
#define alsa_snd_pcm_info_alloca(ptr) __alsa_snd_alloca(ptr, snd_pcm_info)
_PA_DEFINE_FUNC(snd_ctl_pcm_next_device);
@@ -219,6 +233,7 @@ _PA_DEFINE_FUNC(snd_pcm_status_get_delay);
#define alsa_snd_pcm_status_alloca(ptr) __alsa_snd_alloca(ptr, snd_pcm_status)
_PA_DEFINE_FUNC(snd_card_next);
+_PA_DEFINE_FUNC(snd_asoundlib_version);
_PA_DEFINE_FUNC(snd_strerror);
_PA_DEFINE_FUNC(snd_output_stdio_attach);
@@ -244,96 +259,96 @@ static void *g_AlsaLib = NULL;
int _PA_LOCAL_IMPL(snd_pcm_hw_params_set_rate_near) (snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
{
- int ret;
+ int ret;
- if ((ret = alsa_snd_pcm_hw_params_set_rate(pcm, params, (*val), (*dir))) < 0)
- return ret;
+ if ((ret = alsa_snd_pcm_hw_params_set_rate(pcm, params, (*val), (*dir))) < 0)
+ return ret;
- return 0;
+ return 0;
}
int _PA_LOCAL_IMPL(snd_pcm_hw_params_set_buffer_size_near) (snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val)
{
- int ret;
+ int ret;
- if ((ret = alsa_snd_pcm_hw_params_set_buffer_size(pcm, params, (*val))) < 0)
- return ret;
+ if ((ret = alsa_snd_pcm_hw_params_set_buffer_size(pcm, params, (*val))) < 0)
+ return ret;
- return 0;
+ return 0;
}
int _PA_LOCAL_IMPL(snd_pcm_hw_params_set_period_size_near) (snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val, int *dir)
{
- int ret;
+ int ret;
- if ((ret = alsa_snd_pcm_hw_params_set_period_size(pcm, params, (*val), (*dir))) < 0)
- return ret;
+ if ((ret = alsa_snd_pcm_hw_params_set_period_size(pcm, params, (*val), (*dir))) < 0)
+ return ret;
- return 0;
+ return 0;
}
int _PA_LOCAL_IMPL(snd_pcm_hw_params_get_channels_min) (const snd_pcm_hw_params_t *params, unsigned int *val)
{
- (*val) = 1;
- return 0;
+ (*val) = 1;
+ return 0;
}
int _PA_LOCAL_IMPL(snd_pcm_hw_params_get_channels_max) (const snd_pcm_hw_params_t *params, unsigned int *val)
{
- (*val) = 2;
- return 0;
+ (*val) = 2;
+ return 0;
}
int _PA_LOCAL_IMPL(snd_pcm_hw_params_get_periods_min) (const snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
{
- (*val) = 2;
- return 0;
+ (*val) = 2;
+ return 0;
}
int _PA_LOCAL_IMPL(snd_pcm_hw_params_get_periods_max) (const snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
{
- (*val) = 8;
- return 0;
+ (*val) = 8;
+ return 0;
}
int _PA_LOCAL_IMPL(snd_pcm_hw_params_get_period_size_min) (const snd_pcm_hw_params_t *params, snd_pcm_uframes_t *frames, int *dir)
{
- (*frames) = 64;
- return 0;
+ (*frames) = 64;
+ return 0;
}
int _PA_LOCAL_IMPL(snd_pcm_hw_params_get_period_size_max) (const snd_pcm_hw_params_t *params, snd_pcm_uframes_t *frames, int *dir)
{
- (*frames) = 512;
- return 0;
+ (*frames) = 512;
+ return 0;
}
int _PA_LOCAL_IMPL(snd_pcm_hw_params_get_buffer_size_max) (const snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val)
{
- int ret;
- int dir = 0;
- snd_pcm_uframes_t pmax = 0;
- unsigned int pcnt = 0;
+ int ret;
+ int dir = 0;
+ snd_pcm_uframes_t pmax = 0;
+ unsigned int pcnt = 0;
- if ((ret = _PA_LOCAL_IMPL(snd_pcm_hw_params_get_period_size_max)(params, &pmax, &dir)) < 0)
- return ret;
- if ((ret = _PA_LOCAL_IMPL(snd_pcm_hw_params_get_periods_max)(params, &pcnt, &dir)) < 0)
- return ret;
+ if ((ret = _PA_LOCAL_IMPL(snd_pcm_hw_params_get_period_size_max)(params, &pmax, &dir)) < 0)
+ return ret;
+ if ((ret = _PA_LOCAL_IMPL(snd_pcm_hw_params_get_periods_max)(params, &pcnt, &dir)) < 0)
+ return ret;
- (*val) = pmax * pcnt;
- return 0;
+ (*val) = pmax * pcnt;
+ return 0;
}
int _PA_LOCAL_IMPL(snd_pcm_hw_params_get_rate_min) (const snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
{
- (*val) = 44100;
- return 0;
+ (*val) = 44100;
+ return 0;
}
int _PA_LOCAL_IMPL(snd_pcm_hw_params_get_rate_max) (const snd_pcm_hw_params_t *params, unsigned int *val, int *dir)
{
- (*val) = 44100;
- return 0;
+ (*val) = 44100;
+ return 0;
}
#endif // PA_ALSA_DYNAMIC
@@ -345,22 +360,22 @@ static int PaAlsa_LoadLibrary()
{
#ifdef PA_ALSA_DYNAMIC
- PA_DEBUG(( "%s: loading ALSA library file - %s\n", __FUNCTION__, g_AlsaLibName ));
+ PA_DEBUG(( "%s: loading ALSA library file - %s\n", __FUNCTION__, g_AlsaLibName ));
- dlerror();
+ dlerror();
g_AlsaLib = dlopen(g_AlsaLibName, (RTLD_NOW|RTLD_GLOBAL));
if (g_AlsaLib == NULL)
{
- PA_DEBUG(( "%s: failed dlopen() ALSA library file - %s, error: %s\n", __FUNCTION__, g_AlsaLibName, dlerror() ));
- return 0;
+ PA_DEBUG(( "%s: failed dlopen() ALSA library file - %s, error: %s\n", __FUNCTION__, g_AlsaLibName, dlerror() ));
+ return 0;
}
PA_DEBUG(( "%s: loading ALSA API\n", __FUNCTION__ ));
#define _PA_LOAD_FUNC(x) do { \
- alsa_##x = dlsym(g_AlsaLib, #x); \
- if (alsa_##x == NULL) { \
- PA_DEBUG(( "%s: symbol [%s] not found in - %s, error: %s\n", __FUNCTION__, #x, g_AlsaLibName, dlerror() )); }\
+ alsa_##x = dlsym(g_AlsaLib, #x); \
+ if (alsa_##x == NULL) { \
+ PA_DEBUG(( "%s: symbol [%s] not found in - %s, error: %s\n", __FUNCTION__, #x, g_AlsaLibName, dlerror() )); }\
} while(0)
#else
@@ -464,6 +479,9 @@ _PA_LOAD_FUNC(snd_pcm_info_set_subdevice);
_PA_LOAD_FUNC(snd_pcm_info_set_stream);
_PA_LOAD_FUNC(snd_pcm_info_get_name);
_PA_LOAD_FUNC(snd_pcm_info_get_card);
+_PA_LOAD_FUNC(snd_pcm_info_get_subdevices_count);
+_PA_LOAD_FUNC(snd_pcm_info_get_subdevice_name);
+_PA_LOAD_FUNC(snd_pcm_info_get_subdevices_avail);
_PA_LOAD_FUNC(snd_ctl_pcm_next_device);
_PA_LOAD_FUNC(snd_ctl_pcm_info);
@@ -494,34 +512,35 @@ _PA_LOAD_FUNC(snd_pcm_status_get_trigger_tstamp);
_PA_LOAD_FUNC(snd_pcm_status_get_delay);
_PA_LOAD_FUNC(snd_card_next);
+_PA_LOAD_FUNC(snd_asoundlib_version);
_PA_LOAD_FUNC(snd_strerror);
_PA_LOAD_FUNC(snd_output_stdio_attach);
#undef _PA_LOAD_FUNC
#ifdef PA_ALSA_DYNAMIC
- PA_DEBUG(( "%s: loaded ALSA API - ok\n", __FUNCTION__ ));
+ PA_DEBUG(( "%s: loaded ALSA API - ok\n", __FUNCTION__ ));
#define _PA_VALIDATE_LOAD_REPLACEMENT(x)\
- do {\
- if (alsa_##x == NULL)\
- {\
- alsa_##x = &_PA_LOCAL_IMPL(x);\
- PA_DEBUG(( "%s: replacing [%s] with local implementation\n", __FUNCTION__, #x ));\
- }\
- } while (0)
+ do {\
+ if (alsa_##x == NULL)\
+ {\
+ alsa_##x = &_PA_LOCAL_IMPL(x);\
+ PA_DEBUG(( "%s: replacing [%s] with local implementation\n", __FUNCTION__, #x ));\
+ }\
+ } while (0)
- _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_set_rate_near);
- _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_set_buffer_size_near);
- _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_set_period_size_near);
- _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_channels_min);
- _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_channels_max);
- _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_periods_min);
- _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_periods_max);
- _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_period_size_min);
- _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_period_size_max);
- _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_buffer_size_max);
- _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_rate_min);
- _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_rate_max);
+ _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_set_rate_near);
+ _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_set_buffer_size_near);
+ _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_set_period_size_near);
+ _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_channels_min);
+ _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_channels_max);
+ _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_periods_min);
+ _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_periods_max);
+ _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_period_size_min);
+ _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_period_size_max);
+ _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_buffer_size_max);
+ _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_rate_min);
+ _PA_VALIDATE_LOAD_REPLACEMENT(snd_pcm_hw_params_get_rate_max);
#undef _PA_LOCAL_IMPL
#undef _PA_VALIDATE_LOAD_REPLACEMENT
@@ -545,14 +564,14 @@ static void PaAlsa_CloseLibrary()
{
#ifdef PA_ALSA_DYNAMIC
dlclose(g_AlsaLib);
- g_AlsaLib = NULL;
+ g_AlsaLib = NULL;
#endif
}
/* Check return value of ALSA function, and map it to PaError */
#define ENSURE_(expr, code) \
do { \
- int __pa_unsure_error_id;\
+ int __pa_unsure_error_id;\
if( UNLIKELY( (__pa_unsure_error_id = (expr)) < 0 ) ) \
{ \
/* PaUtil_SetLastHostErrorInfo should only be used in the main thread */ \
@@ -570,10 +589,10 @@ static void PaAlsa_CloseLibrary()
#define ASSERT_CALL_(expr, success) \
do {\
- int __pa_assert_error_id;\
- __pa_assert_error_id = (expr);\
- assert( success == __pa_assert_error_id );\
- } while (0)
+ int __pa_assert_error_id;\
+ __pa_assert_error_id = (expr);\
+ assert( success == __pa_assert_error_id );\
+ } while (0)
static int numPeriods_ = 4;
static int busyRetries_ = 100;
@@ -600,6 +619,8 @@ typedef struct
void *nonMmapBuffer;
unsigned int nonMmapBufferSize;
PaDeviceIndex device; /* Keep the device index */
+ int deviceIsPlug; /* Distinguish plug types from direct 'hw:' devices */
+ int useReventFix; /* Alsa older than 1.0.16, plug devices need a fix */
snd_pcm_t *pcm;
snd_pcm_uframes_t bufferSize;
@@ -659,6 +680,7 @@ typedef struct PaAlsaHostApiRepresentation
PaUtilAllocationGroup *allocations;
PaHostApiIndex hostApiIndex;
+ PaUint32 alsaLibVersion; /* Retrieved from the library at run-time */
}
PaAlsaHostApiRepresentation;
@@ -699,6 +721,7 @@ static double GetStreamCpuLoad( PaStream* stream );
static PaError BuildDeviceList( PaAlsaHostApiRepresentation *hostApi );
static int SetApproximateSampleRate( snd_pcm_t *pcm, snd_pcm_hw_params_t *hwParams, double sampleRate );
static int GetExactSampleRate( snd_pcm_hw_params_t *hwParams, double *sampleRate );
+static PaUint32 PaAlsaVersionNum(void);
/* Callback prototypes */
static void *CallbackThreadFunc( void *userData );
@@ -715,6 +738,9 @@ static const PaAlsaDeviceInfo *GetDeviceInfo( const PaUtilHostApiRepresentation
return (const PaAlsaDeviceInfo *)hostApi->deviceInfos[device];
}
+static void CheckAndReplaceConverterForSwapEndian(PaAlsaStream *stream, PaSampleFormat hostInputSampleFormat,
+ PaSampleFormat hostOutputSampleFormat);
+
/** Uncommented because AlsaErrorHandler is unused for anything good yet. If AlsaErrorHandler is
to be used, do not forget to register this callback in PaAlsa_Initialize, and unregister in Terminate.
*/
@@ -735,6 +761,7 @@ PaError PaAlsa_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex
sizeof(PaAlsaHostApiRepresentation) ), paInsufficientMemory );
PA_UNLESS( alsaHostApi->allocations = PaUtil_CreateAllocationGroup(), paInsufficientMemory );
alsaHostApi->hostApiIndex = hostApiIndex;
+ alsaHostApi->alsaLibVersion = PaAlsaVersionNum();
*hostApi = (PaUtilHostApiRepresentation*)alsaHostApi;
(*hostApi)->info.structVersion = 1;
@@ -944,6 +971,24 @@ static void InitializeDeviceInfo( PaDeviceInfo *deviceInfo )
deviceInfo->defaultSampleRate = -1.;
}
+
+/* Retrieve the version of the runtime Alsa-lib, as a single number equivalent to
+ * SND_LIB_VERSION. Only a version string is available ("a.b.c") so this has to be converted.
+ * Assume 'a' and 'b' are single digits only.
+ */
+static PaUint32 PaAlsaVersionNum(void)
+{
+ char* verStr;
+ PaUint32 verNum;
+
+ verStr = (char*) alsa_snd_asoundlib_version();
+ verNum = ALSA_VERSION_INT( atoi(verStr), atoi(verStr + 2), atoi(verStr + 4) );
+ PA_DEBUG(( "ALSA version (build): " SND_LIB_VERSION_STR "\nALSA version (runtime): %s\n", verStr ));
+
+ return verNum;
+}
+
+
/* Helper struct */
typedef struct
{
@@ -982,11 +1027,11 @@ HwDevInfo predefinedNames[] = {
{ "AndroidPlayback_ExtraDockSpeaker_normal", NULL, 0, 1, 0 },
{ "AndroidPlayback_TvOut_normal", NULL, 0, 1, 0 },
- { "AndroidRecord_Microphone", NULL, 0, 0, 1 },
+ { "AndroidRecord_Microphone", NULL, 0, 0, 1 },
{ "AndroidRecord_Earpiece_normal", NULL, 0, 0, 1 },
- { "AndroidRecord_Speaker_normal", NULL, 0, 0, 1 },
+ { "AndroidRecord_Speaker_normal", NULL, 0, 0, 1 },
{ "AndroidRecord_Headset_normal", NULL, 0, 0, 1 },
- { "AndroidRecord_Bluetooth_normal", NULL, 0, 0, 1 },
+ { "AndroidRecord_Bluetooth_normal", NULL, 0, 0, 1 },
{ "AndroidRecord_Speaker_Headset_normal", NULL, 0, 0, 1 },
{ NULL, NULL, 0, 1, 0 }
@@ -1061,8 +1106,7 @@ static int OpenPcm( snd_pcm_t **pcmp, const char *name, snd_pcm_stream_t stream,
ret = alsa_snd_pcm_open( pcmp, name, stream, mode );
if( -EBUSY != ret )
{
- PA_DEBUG(( "%s: Successfully opened initially busy device after %d tries\n",
- __FUNCTION__, tries ));
+ PA_DEBUG(( "%s: Successfully opened initially busy device after %d tries\n", __FUNCTION__, tries ));
}
}
if( -EBUSY == ret )
@@ -1071,8 +1115,8 @@ static int OpenPcm( snd_pcm_t **pcmp, const char *name, snd_pcm_stream_t stream,
}
else
{
- if (ret < 0)
- PA_DEBUG(( "%s: Opened device '%s' ptr[%p] - result: [%d:%s]\n", __FUNCTION__, name, *pcmp, ret, alsa_snd_strerror(ret) ));
+ if (ret < 0)
+ PA_DEBUG(( "%s: Opened device '%s' ptr[%p] - result: [%d:%s]\n", __FUNCTION__, name, *pcmp, ret, alsa_snd_strerror(ret) ));
}
return ret;
@@ -1086,7 +1130,7 @@ static PaError FillInDevInfo( PaAlsaHostApiRepresentation *alsaApi, HwDevInfo* d
snd_pcm_t *pcm = NULL;
PaUtilHostApiRepresentation *baseApi = &alsaApi->baseHostApiRep;
- PA_DEBUG(( "%s: filling device info for: %s\n", __FUNCTION__, deviceName->name ));
+ PA_DEBUG(( "%s: Filling device info for: %s\n", __FUNCTION__, deviceName->name ));
/* Zero fields */
InitializeDeviceInfo( baseDeviceInfo );
@@ -1096,8 +1140,7 @@ static PaError FillInDevInfo( PaAlsaHostApiRepresentation *alsaApi, HwDevInfo* d
/* Query capture */
if( deviceName->hasCapture &&
- OpenPcm( &pcm, deviceName->alsaName, SND_PCM_STREAM_CAPTURE, blocking, 0 )
- >= 0 )
+ OpenPcm( &pcm, deviceName->alsaName, SND_PCM_STREAM_CAPTURE, blocking, 0 ) >= 0 )
{
if( GropeDevice( pcm, deviceName->isPlug, StreamDirection_In, blocking, devInfo ) != paNoError )
{
@@ -1109,8 +1152,7 @@ static PaError FillInDevInfo( PaAlsaHostApiRepresentation *alsaApi, HwDevInfo* d
/* Query playback */
if( deviceName->hasPlayback &&
- OpenPcm( &pcm, deviceName->alsaName, SND_PCM_STREAM_PLAYBACK, blocking, 0 )
- >= 0 )
+ OpenPcm( &pcm, deviceName->alsaName, SND_PCM_STREAM_PLAYBACK, blocking, 0 ) >= 0 )
{
if( GropeDevice( pcm, deviceName->isPlug, StreamDirection_Out, blocking, devInfo ) != paNoError )
{
@@ -1121,10 +1163,10 @@ static PaError FillInDevInfo( PaAlsaHostApiRepresentation *alsaApi, HwDevInfo* d
}
baseDeviceInfo->structVersion = 2;
- baseDeviceInfo->hostApi = alsaApi->hostApiIndex;
- baseDeviceInfo->name = deviceName->name;
- devInfo->alsaName = deviceName->alsaName;
- devInfo->isPlug = deviceName->isPlug;
+ baseDeviceInfo->hostApi = alsaApi->hostApiIndex;
+ baseDeviceInfo->name = deviceName->name;
+ devInfo->alsaName = deviceName->alsaName;
+ devInfo->isPlug = deviceName->isPlug;
/* A: Storing pointer to PaAlsaDeviceInfo object as pointer to PaDeviceInfo object.
* Should now be safe to add device info, unless the device supports neither capture nor playback
@@ -1132,14 +1174,14 @@ static PaError FillInDevInfo( PaAlsaHostApiRepresentation *alsaApi, HwDevInfo* d
if( baseDeviceInfo->maxInputChannels > 0 || baseDeviceInfo->maxOutputChannels > 0 )
{
/* Make device default if there isn't already one or it is the ALSA "default" device */
- if( (baseApi->info.defaultInputDevice == paNoDevice || !strcmp(deviceName->alsaName,
- "default" )) && baseDeviceInfo->maxInputChannels > 0 )
+ if( (baseApi->info.defaultInputDevice == paNoDevice ||
+ !strcmp(deviceName->alsaName, "default" )) && baseDeviceInfo->maxInputChannels > 0 )
{
baseApi->info.defaultInputDevice = *devIdx;
PA_DEBUG(("Default input device: %s\n", deviceName->name));
}
- if( (baseApi->info.defaultOutputDevice == paNoDevice || !strcmp(deviceName->alsaName,
- "default" )) && baseDeviceInfo->maxOutputChannels > 0 )
+ if( (baseApi->info.defaultOutputDevice == paNoDevice ||
+ !strcmp(deviceName->alsaName, "default" )) && baseDeviceInfo->maxOutputChannels > 0 )
{
baseApi->info.defaultOutputDevice = *devIdx;
PA_DEBUG(("Default output device: %s\n", deviceName->name));
@@ -1150,7 +1192,7 @@ static PaError FillInDevInfo( PaAlsaHostApiRepresentation *alsaApi, HwDevInfo* d
}
else
{
- PA_DEBUG(( "%s: skipped device: %s, all channels - 0\n", __FUNCTION__, deviceName->name ));
+ PA_DEBUG(( "%s: Skipped device: %s, all channels == 0\n", __FUNCTION__, deviceName->name ));
}
end:
@@ -1171,7 +1213,6 @@ static PaError BuildDeviceList( PaAlsaHostApiRepresentation *alsaApi )
snd_pcm_info_t *pcmInfo;
int res;
int blocking = SND_PCM_NONBLOCK;
- char alsaCardName[50];
#ifdef PA_ENABLE_DEBUG_OUTPUT
PaTime startTime = PaUtil_GetTime();
#endif
@@ -1196,87 +1237,130 @@ static PaError BuildDeviceList( PaAlsaHostApiRepresentation *alsaApi )
alsa_snd_pcm_info_alloca( &pcmInfo );
while( alsa_snd_card_next( &cardIdx ) == 0 && cardIdx >= 0 )
{
+ char alsaCardNameId[64] = { 0 };
char *cardName;
int devIdx = -1;
snd_ctl_t *ctl;
- char buf[50];
- snprintf( alsaCardName, sizeof (alsaCardName), "hw:%d", cardIdx );
+ /* Make card name */
+ snprintf( alsaCardNameId, sizeof (alsaCardNameId)-1, "hw:%d", cardIdx );
- /* Acquire name of card */
- if( alsa_snd_ctl_open( &ctl, alsaCardName, 0 ) < 0 )
+ /* Try opening card */
+ if( alsa_snd_ctl_open( &ctl, alsaCardNameId, 0 ) < 0 )
{
/* Unable to open card :( */
- PA_DEBUG(( "%s: Unable to open device %s\n", __FUNCTION__, alsaCardName ));
+ PA_DEBUG(( "%s: Unable to open device %s\n", __FUNCTION__, alsaCardNameId ));
continue;
}
alsa_snd_ctl_card_info( ctl, cardInfo );
PA_ENSURE( PaAlsa_StrDup( alsaApi, &cardName, alsa_snd_ctl_card_info_get_name( cardInfo )) );
+ PA_DEBUG(( "%s: Open card: id[%s] name[%s]\n", __FUNCTION__, alsaCardNameId, cardName ));
+
+ /* Iterate devices */
while( alsa_snd_ctl_pcm_next_device( ctl, &devIdx ) == 0 && devIdx >= 0 )
{
char *alsaDeviceName, *deviceName;
size_t len;
int hasPlayback = 0, hasCapture = 0;
- snprintf( buf, sizeof (buf), "hw:%d,%d", cardIdx, devIdx );
+ int subDevIdx, subDevCount = 1;
- /* Obtain info about this particular device */
+ PA_DEBUG(( "%s: - idx = %d:\n", __FUNCTION__, devIdx ));
+
+ /* Make this device current */
alsa_snd_pcm_info_set_device( pcmInfo, devIdx );
- alsa_snd_pcm_info_set_subdevice( pcmInfo, 0 );
- alsa_snd_pcm_info_set_stream( pcmInfo, SND_PCM_STREAM_CAPTURE );
- if( alsa_snd_ctl_pcm_info( ctl, pcmInfo ) >= 0 )
+
+ /* Iterate sub-devices */
+ for( subDevIdx = 0; subDevIdx < subDevCount; ++subDevIdx )
{
- hasCapture = 1;
+ char buf[64] = { 0 };
+
+ /* Make this sub-device current */
+ alsa_snd_pcm_info_set_subdevice( pcmInfo, subDevIdx );
+
+ /* Test for Capture capability */
+ alsa_snd_pcm_info_set_stream( pcmInfo, SND_PCM_STREAM_CAPTURE );
+ if( alsa_snd_ctl_pcm_info( ctl, pcmInfo ) >= 0 )
+ {
+ hasCapture = 1;
+ }
+
+ /* Test for Playback capability */
+ alsa_snd_pcm_info_set_stream( pcmInfo, SND_PCM_STREAM_PLAYBACK );
+ if( alsa_snd_ctl_pcm_info( ctl, pcmInfo ) >= 0 )
+ {
+ hasPlayback = 1;
+ }
+
+ /* If neither supported, such device is stub or failed */
+ if( !hasPlayback && !hasCapture )
+ {
+ continue;
+ }
+
+ /* Get sub-device count */
+ if( subDevIdx == 0 )
+ {
+ subDevCount = alsa_snd_pcm_info_get_subdevices_count( pcmInfo );
+ PA_DEBUG(( "%s: sub-devices: %d/%d\n", __FUNCTION__, alsa_snd_pcm_info_get_subdevices_avail( pcmInfo ), subDevCount));
+ }
+
+ PA_DEBUG(( "%s: - sub: %d\n", __FUNCTION__, subDevIdx ));
+ if( hasCapture ) PA_DEBUG(( "%s: - cap: CAPTURE\n", __FUNCTION__ ));
+ if( hasPlayback ) PA_DEBUG(( "%s: - cap: PLAYBACK\n", __FUNCTION__ ));
+
+ /* Make name Id */
+ snprintf( buf, sizeof(buf)-1, ( subDevCount > 1 ? "hw:%d,%d,%d" : "hw:%d,%d" ), cardIdx, devIdx, subDevIdx );
+
+ /* Make name */
+ if( subDevCount <= 1 )
+ {
+ const char *snd_deviceName = alsa_snd_pcm_info_get_name( pcmInfo );
+
+ len = snprintf( NULL, 0, "%s: %s (%s)", cardName, snd_deviceName, buf ) + 1;
+ PA_UNLESS( deviceName = (char *)PaUtil_GroupAllocateMemory( alsaApi->allocations, len ), paInsufficientMemory );
+ snprintf( deviceName, len, "%s: %s (%s)", cardName, snd_deviceName, buf );
+ }
+ else
+ {
+ const char *snd_deviceName = alsa_snd_pcm_info_get_name( pcmInfo );
+ const char *snd_subDeviceName = alsa_snd_pcm_info_get_subdevice_name( pcmInfo );
+
+ len = snprintf( NULL, 0, "%s: %s (%s) {%s}", cardName, snd_deviceName, buf, snd_subDeviceName ) + 1;
+ PA_UNLESS( deviceName = (char *)PaUtil_GroupAllocateMemory( alsaApi->allocations, len ), paInsufficientMemory );
+ snprintf( deviceName, len, "%s: %s (%s) {%s}", cardName, snd_deviceName, buf, snd_subDeviceName );
+ }
+
+ ++numDeviceNames;
+ if( !hwDevInfos || numDeviceNames > maxDeviceNames )
+ {
+ maxDeviceNames *= 2;
+ PA_UNLESS( hwDevInfos = (HwDevInfo *) realloc( hwDevInfos, maxDeviceNames * sizeof (HwDevInfo) ), paInsufficientMemory );
+ }
+
+ PA_ENSURE( PaAlsa_StrDup( alsaApi, &alsaDeviceName, buf ) );
+
+ hwDevInfos[ numDeviceNames - 1 ].alsaName = alsaDeviceName;
+ hwDevInfos[ numDeviceNames - 1 ].name = deviceName;
+ hwDevInfos[ numDeviceNames - 1 ].isPlug = 0;
+ hwDevInfos[ numDeviceNames - 1 ].hasPlayback = hasPlayback;
+ hwDevInfos[ numDeviceNames - 1 ].hasCapture = hasCapture;
+
+ PA_DEBUG(( "%s: Registered device: id[%s] name[%s]\n", __FUNCTION__, alsaDeviceName, deviceName ));
}
-
- alsa_snd_pcm_info_set_stream( pcmInfo, SND_PCM_STREAM_PLAYBACK );
- if( alsa_snd_ctl_pcm_info( ctl, pcmInfo ) >= 0 )
- {
- hasPlayback = 1;
- }
-
- if( !hasPlayback && !hasCapture )
- {
- /* Error */
- continue;
- }
-
- /* The length of the string written by snprintf plus terminating 0 */
- len = snprintf( NULL, 0, "%s: %s (%s)", cardName, alsa_snd_pcm_info_get_name( pcmInfo ), buf ) + 1;
- PA_UNLESS( deviceName = (char *)PaUtil_GroupAllocateMemory( alsaApi->allocations, len ),
- paInsufficientMemory );
- snprintf( deviceName, len, "%s: %s (%s)", cardName,
- alsa_snd_pcm_info_get_name( pcmInfo ), buf );
-
- ++numDeviceNames;
- if( !hwDevInfos || numDeviceNames > maxDeviceNames )
- {
- maxDeviceNames *= 2;
- PA_UNLESS( hwDevInfos = (HwDevInfo *) realloc( hwDevInfos, maxDeviceNames * sizeof (HwDevInfo) ),
- paInsufficientMemory );
- }
-
- PA_ENSURE( PaAlsa_StrDup( alsaApi, &alsaDeviceName, buf ) );
-
- hwDevInfos[ numDeviceNames - 1 ].alsaName = alsaDeviceName;
- hwDevInfos[ numDeviceNames - 1 ].name = deviceName;
- hwDevInfos[ numDeviceNames - 1 ].isPlug = 0;
- hwDevInfos[ numDeviceNames - 1 ].hasPlayback = hasPlayback;
- hwDevInfos[ numDeviceNames - 1 ].hasCapture = hasCapture;
}
alsa_snd_ctl_close( ctl );
}
/* Iterate over plugin devices */
-
if( NULL == (*alsa_snd_config) )
{
/* alsa_snd_config_update is called implicitly by some functions, if this hasn't happened snd_config will be NULL (bleh) */
ENSURE_( alsa_snd_config_update(), paUnanticipatedHostError );
PA_DEBUG(( "Updating snd_config\n" ));
}
- assert( *alsa_snd_config );
+ assert( *alsa_snd_config );
if( (res = alsa_snd_config_search( *alsa_snd_config, "pcm", &topNode )) >= 0 )
{
snd_config_iterator_t i, next;
@@ -1309,36 +1393,34 @@ static PaError BuildDeviceList( PaAlsaHostApiRepresentation *alsaApi )
}
PA_DEBUG(( "%s: Found plugin [%s] of type [%s]\n", __FUNCTION__, idStr, tpStr ));
- PA_UNLESS( alsaDeviceName = (char*)PaUtil_GroupAllocateMemory( alsaApi->allocations,
- strlen(idStr) + 6 ), paInsufficientMemory );
+ PA_UNLESS( alsaDeviceName = (char*)PaUtil_GroupAllocateMemory( alsaApi->allocations, strlen(idStr) + 6 ), paInsufficientMemory );
strcpy( alsaDeviceName, idStr );
- PA_UNLESS( deviceName = (char*)PaUtil_GroupAllocateMemory( alsaApi->allocations,
- strlen(idStr) + 1 ), paInsufficientMemory );
+
+ PA_UNLESS( deviceName = (char*)PaUtil_GroupAllocateMemory( alsaApi->allocations, strlen(idStr) + 1 ), paInsufficientMemory );
strcpy( deviceName, idStr );
++numDeviceNames;
if( !hwDevInfos || numDeviceNames > maxDeviceNames )
{
maxDeviceNames *= 2;
- PA_UNLESS( hwDevInfos = (HwDevInfo *) realloc( hwDevInfos, maxDeviceNames * sizeof (HwDevInfo) ),
- paInsufficientMemory );
+ PA_UNLESS( hwDevInfos = (HwDevInfo *) realloc( hwDevInfos, maxDeviceNames * sizeof (HwDevInfo) ), paInsufficientMemory );
}
predefined = FindDeviceName( alsaDeviceName );
hwDevInfos[numDeviceNames - 1].alsaName = alsaDeviceName;
- hwDevInfos[numDeviceNames - 1].name = deviceName;
- hwDevInfos[numDeviceNames - 1].isPlug = 1;
+ hwDevInfos[numDeviceNames - 1].name = deviceName;
+ hwDevInfos[numDeviceNames - 1].isPlug = 1;
if( predefined )
{
hwDevInfos[numDeviceNames - 1].hasPlayback = predefined->hasPlayback;
- hwDevInfos[numDeviceNames - 1].hasCapture = predefined->hasCapture;
+ hwDevInfos[numDeviceNames - 1].hasCapture = predefined->hasCapture;
}
else
{
hwDevInfos[numDeviceNames - 1].hasPlayback = 1;
- hwDevInfos[numDeviceNames - 1].hasCapture = 1;
+ hwDevInfos[numDeviceNames - 1].hasCapture = 1;
}
}
}
@@ -1346,12 +1428,10 @@ static PaError BuildDeviceList( PaAlsaHostApiRepresentation *alsaApi )
PA_DEBUG(( "%s: Iterating over ALSA plugins failed: %s\n", __FUNCTION__, alsa_snd_strerror( res ) ));
/* allocate deviceInfo memory based on the number of devices */
- PA_UNLESS( baseApi->deviceInfos = (PaDeviceInfo**)PaUtil_GroupAllocateMemory(
- alsaApi->allocations, sizeof(PaDeviceInfo*) * (numDeviceNames) ), paInsufficientMemory );
+ PA_UNLESS( baseApi->deviceInfos = (PaDeviceInfo**)PaUtil_GroupAllocateMemory( alsaApi->allocations, sizeof(PaDeviceInfo*) * (numDeviceNames) ), paInsufficientMemory );
/* allocate all device info structs in a contiguous block */
- PA_UNLESS( deviceInfoArray = (PaAlsaDeviceInfo*)PaUtil_GroupAllocateMemory(
- alsaApi->allocations, sizeof(PaAlsaDeviceInfo) * numDeviceNames ), paInsufficientMemory );
+ PA_UNLESS( deviceInfoArray = (PaAlsaDeviceInfo*)PaUtil_GroupAllocateMemory( alsaApi->allocations, sizeof(PaAlsaDeviceInfo) * numDeviceNames ), paInsufficientMemory );
/* Loop over list of cards, filling in info. If a device is deemed unavailable (can't get name),
* it's ignored.
@@ -1361,7 +1441,7 @@ static PaError BuildDeviceList( PaAlsaHostApiRepresentation *alsaApi )
* (dmix) is closed. The 'default' plugin may also point to the dmix plugin, so the same goes
* for this.
*/
- PA_DEBUG(( "%s: filling device info for %d devices\n", __FUNCTION__, numDeviceNames ));
+ PA_DEBUG(( "%s: Filling device info for %d devices\n", __FUNCTION__, numDeviceNames ));
for( i = 0, devIdx = 0; i < numDeviceNames; ++i )
{
PaAlsaDeviceInfo* devInfo = &deviceInfoArray[i];
@@ -1384,8 +1464,7 @@ static PaError BuildDeviceList( PaAlsaHostApiRepresentation *alsaApi )
continue;
}
- PA_ENSURE( FillInDevInfo( alsaApi, hwInfo, blocking, devInfo,
- &devIdx ) );
+ PA_ENSURE( FillInDevInfo( alsaApi, hwInfo, blocking, devInfo, &devIdx ) );
}
free( hwDevInfos );
@@ -1449,32 +1528,58 @@ static PaSampleFormat GetAvailableFormats( snd_pcm_t *pcm )
alsa_snd_pcm_hw_params_any( pcm, hwParams );
- if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_FLOAT ) >= 0)
+ if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_FLOAT ) >= 0 )
available |= paFloat32;
- if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S32 ) >= 0)
+ if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S32 ) >= 0 )
available |= paInt32;
-#ifdef PA_LITTLE_ENDIAN
- if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S24_3LE ) >= 0)
+ if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S24_3LE ) >= 0 )
available |= paInt24;
-#elif defined PA_BIG_ENDIAN
- if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S24_3BE ) >= 0)
+ else
+ if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S24_3BE ) >= 0 )
available |= paInt24;
-#endif
- if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S16 ) >= 0)
+ if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S16 ) >= 0 )
available |= paInt16;
- if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_U8 ) >= 0)
+ if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_U8 ) >= 0 )
available |= paUInt8;
- if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S8 ) >= 0)
+ if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S8 ) >= 0 )
available |= paInt8;
return available;
}
+/* Check if format is available in native endianness, if not apply paSwapEndian flag for futher
+ processing by Alsa swapping converters.
+*/
+static void CheckAndApplyEndianSwapToFormat( PaSampleFormat *format, snd_pcm_t *pcm )
+{
+ snd_pcm_hw_params_t *hwParams;
+ alsa_snd_pcm_hw_params_alloca( &hwParams );
+
+ alsa_snd_pcm_hw_params_any( pcm, hwParams );
+
+ if( *format & paInt24 )
+ {
+#ifdef PA_LITTLE_ENDIAN
+ if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S24_3LE ) < 0 )
+ {
+ if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S24_3BE ) >= 0 )
+ *format |= paSwapEndian;
+ }
+#elif defined PA_BIG_ENDIAN
+ if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S24_3BE ) < 0 )
+ {
+ if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S24_3LE ) >= 0 )
+ *format |= paSwapEndian;
+ }
+#endif
+ }
+}
+
/* Output to console all formats supported by device */
static void LogAllAvailableFormats( snd_pcm_t *pcm )
{
@@ -1484,7 +1589,7 @@ static void LogAllAvailableFormats( snd_pcm_t *pcm )
alsa_snd_pcm_hw_params_any( pcm, hwParams );
- PA_DEBUG(( " --- Supported Formats ---\n" ));
+ PA_DEBUG(( " --- Supported Formats ---\n" ));
if( alsa_snd_pcm_hw_params_test_format( pcm, hwParams, SND_PCM_FORMAT_S8 ) >= 0)
PA_DEBUG(( "SND_PCM_FORMAT_S8\n" ));
@@ -1599,7 +1704,7 @@ static void LogAllAvailableFormats( snd_pcm_t *pcm )
static snd_pcm_format_t Pa2AlsaFormat( PaSampleFormat paFormat )
{
- switch( paFormat )
+ switch( PA_ALSA_TO_FORMAT(paFormat) )
{
case paFloat32:
return SND_PCM_FORMAT_FLOAT;
@@ -1609,11 +1714,10 @@ static snd_pcm_format_t Pa2AlsaFormat( PaSampleFormat paFormat )
case paInt24:
#ifdef PA_LITTLE_ENDIAN
- return SND_PCM_FORMAT_S24_3LE;
+ return ( paFormat & paSwapEndian ? SND_PCM_FORMAT_S24_3BE : SND_PCM_FORMAT_S24_3LE );
#elif defined PA_BIG_ENDIAN
- return SND_PCM_FORMAT_S24_3BE;
+ return ( paFormat & paSwapEndian ? SND_PCM_FORMAT_S24_3LE : SND_PCM_FORMAT_S24_3BE );
#endif
-
case paInt32:
return SND_PCM_FORMAT_S32;
@@ -1716,7 +1820,10 @@ static PaError TestParameters( const PaUtilHostApiRepresentation *hostApi, const
/* See if we can find a best possible match */
availableFormats = GetAvailableFormats( pcm );
- PA_ENSURE( hostFormat = PaUtil_SelectClosestAvailableFormat( availableFormats, parameters->sampleFormat ) );
+ PA_ENSURE( hostFormat = PaUtil_SelectClosestAvailableFormat( PA_ALSA_TO_FORMAT(availableFormats), parameters->sampleFormat ) );
+
+ /* Append endiannes conversion flag */
+ CheckAndApplyEndianSwapToFormat( &hostFormat, pcm );
/* Some specific hardware (reported: Audio8 DJ) can fail with assertion during this step. */
ENSURE_( alsa_snd_pcm_hw_params_set_format( pcm, hwParams, Pa2AlsaFormat( hostFormat ) ), paUnanticipatedHostError );
@@ -1801,9 +1908,11 @@ error:
return result;
}
+
static PaError PaAlsaStreamComponent_Initialize( PaAlsaStreamComponent *self, PaAlsaHostApiRepresentation *alsaApi,
const PaStreamParameters *params, StreamDirection streamDir, int callbackMode )
{
+ PaSampleFormat availableFormats;
PaError result = paNoError;
PaSampleFormat userSampleFormat = params->sampleFormat, hostSampleFormat = paNoError;
assert( params->channelCount > 0 );
@@ -1816,19 +1925,30 @@ static PaError PaAlsaStreamComponent_Initialize( PaAlsaStreamComponent *self, Pa
const PaAlsaDeviceInfo *devInfo = GetDeviceInfo( &alsaApi->baseHostApiRep, params->device );
self->numHostChannels = PA_MAX( params->channelCount, StreamDirection_In == streamDir ? devInfo->minInputChannels
: devInfo->minOutputChannels );
+ self->deviceIsPlug = devInfo->isPlug;
}
else
{
/* We're blissfully unaware of the minimum channelCount */
self->numHostChannels = params->channelCount;
+ /* Check if device name does not start with hw: to determine if it is a 'plug' device */
+ if( strncmp( "hw:", ((PaAlsaStreamInfo *)params->hostApiSpecificStreamInfo)->deviceString, 3 ) != 0 )
+ self->deviceIsPlug = 1; /* An Alsa plug device, not a direct hw device */
}
+ if( self->deviceIsPlug && alsaApi->alsaLibVersion < ALSA_VERSION_INT( 1, 0, 16 ) )
+ self->useReventFix = 1; /* Prior to Alsa1.0.16, plug devices may stutter without this fix */
self->device = params->device;
PA_ENSURE( AlsaOpen( &alsaApi->baseHostApiRep, params, streamDir, &self->pcm ) );
self->nfds = alsa_snd_pcm_poll_descriptors_count( self->pcm );
- PA_ENSURE( hostSampleFormat = PaUtil_SelectClosestAvailableFormat( GetAvailableFormats( self->pcm ), userSampleFormat ) );
+ /* Get host sample format */
+ availableFormats = GetAvailableFormats( self->pcm );
+ PA_ENSURE( hostSampleFormat = PaUtil_SelectClosestAvailableFormat( PA_ALSA_TO_FORMAT(availableFormats), userSampleFormat ) );
+
+ /* Append endiannes conversion flag */
+ CheckAndApplyEndianSwapToFormat( &hostSampleFormat, self->pcm );
self->hostSampleFormat = hostSampleFormat;
self->nativeFormat = Pa2AlsaFormat( hostSampleFormat );
@@ -1850,7 +1970,7 @@ error:
/* Log all available formats. */
if ( hostSampleFormat == paSampleFormatNotSupported )
- {
+ {
LogAllAvailableFormats( self->pcm );
PA_DEBUG(( "%s: Please provide the log output to PortAudio developers, your hardware does not have any sample format implemented yet.\n", __FUNCTION__ ));
}
@@ -2014,12 +2134,12 @@ static PaError PaAlsaStreamComponent_FinishConfigure( PaAlsaStreamComponent *sel
}
if (alsa_snd_pcm_hw_params_get_buffer_size != NULL)
{
- ENSURE_( alsa_snd_pcm_hw_params_get_buffer_size( hwParams, &self->bufferSize ), paUnanticipatedHostError );
- }
- else
- {
- self->bufferSize = bufSz;
- }
+ ENSURE_( alsa_snd_pcm_hw_params_get_buffer_size( hwParams, &self->bufferSize ), paUnanticipatedHostError );
+ }
+ else
+ {
+ self->bufferSize = bufSz;
+ }
/* Latency in seconds */
*latency = self->bufferSize / sampleRate;
@@ -2145,7 +2265,7 @@ static int CalculatePollTimeout( const PaAlsaStream *stream, unsigned long frame
*/
static unsigned long PaAlsa_AlignBackward(unsigned long v, unsigned long align)
{
- return ((v - (align ? v % align : 0)));
+ return ((v - (align ? v % align : 0)));
}
/** Align value in forward direction.
@@ -2155,8 +2275,8 @@ static unsigned long PaAlsa_AlignBackward(unsigned long v, unsigned long align)
*/
static unsigned long PaAlsa_AlignForward(unsigned long v, unsigned long align)
{
- unsigned long remainder = (align ? (v % align) : 0);
- return (remainder != 0 ? v + (align - remainder) : v);
+ unsigned long remainder = (align ? (v % align) : 0);
+ return (remainder != 0 ? v + (align - remainder) : v);
}
/** Get size of host buffer maintained from the number of user frames, sample rate and suggested latency. Minimum double buffering
@@ -2168,8 +2288,8 @@ static unsigned long PaAlsa_AlignForward(unsigned long v, unsigned long align)
*/
static unsigned long PaAlsa_GetFramesPerHostBuffer(unsigned long userFramesPerBuffer, PaTime suggestedLatency, double sampleRate)
{
- unsigned long frames = userFramesPerBuffer + PA_MAX( userFramesPerBuffer, (unsigned long)(suggestedLatency * sampleRate) );
- return frames;
+ unsigned long frames = userFramesPerBuffer + PA_MAX( userFramesPerBuffer, (unsigned long)(suggestedLatency * sampleRate) );
+ return frames;
}
/** Determine size per host buffer.
@@ -2239,7 +2359,7 @@ static PaError PaAlsaStreamComponent_DetermineFramesPerBuffer( PaAlsaStreamCompo
#endif
- {
+ {
unsigned numPeriods = numPeriods_, maxPeriods = 0, minPeriods = numPeriods_;
/* It may be that the device only supports 2 periods for instance */
@@ -2356,7 +2476,7 @@ static PaError PaAlsaStreamComponent_DetermineFramesPerBuffer( PaAlsaStreamCompo
framesPerHostBuffer = 2048;
#endif
PA_DEBUG(( "%s: suggested host buffer period = %lu \n", __FUNCTION__, framesPerHostBuffer ));
- }
+ }
{
/* Get min/max period sizes and adjust our chosen */
@@ -2377,10 +2497,10 @@ static PaError PaAlsaStreamComponent_DetermineFramesPerBuffer( PaAlsaStreamCompo
framesPerHostBuffer = ((minmax_diff == 2) ? max - 1 : max);
}
- PA_DEBUG(( "%s: device period minimum = %lu\n", __FUNCTION__, min ));
- PA_DEBUG(( "%s: device period maximum = %lu\n", __FUNCTION__, max ));
- PA_DEBUG(( "%s: host buffer period = %lu\n", __FUNCTION__, framesPerHostBuffer ));
- PA_DEBUG(( "%s: host buffer period latency = %f\n", __FUNCTION__, (double)(framesPerHostBuffer / sampleRate) ));
+ PA_DEBUG(( "%s: device period minimum = %lu\n", __FUNCTION__, min ));
+ PA_DEBUG(( "%s: device period maximum = %lu\n", __FUNCTION__, max ));
+ PA_DEBUG(( "%s: host buffer period = %lu\n", __FUNCTION__, framesPerHostBuffer ));
+ PA_DEBUG(( "%s: host buffer period latency = %f\n", __FUNCTION__, (double)(framesPerHostBuffer / sampleRate) ));
/* Try setting period size */
dir = 0;
@@ -2764,11 +2884,16 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi,
hostOutputSampleFormat = stream->playback.hostSampleFormat | (!stream->playback.hostInterleaved ? paNonInterleaved : 0);
PA_ENSURE( PaUtil_InitializeBufferProcessor( &stream->bufferProcessor,
- numInputChannels, inputSampleFormat, hostInputSampleFormat,
- numOutputChannels, outputSampleFormat, hostOutputSampleFormat,
+ numInputChannels, inputSampleFormat, (hostInputSampleFormat & ~paSwapEndian),
+ numOutputChannels, outputSampleFormat, (hostOutputSampleFormat & ~paSwapEndian),
sampleRate, streamFlags, framesPerBuffer, stream->maxFramesPerHostBuffer,
hostBufferSizeMode, callback, userData ) );
+ /* Some drivers may work only in Big-Endian format (like Audio4DJ), check it and replace
+ original converter with our specific with swapping capability.
+ */
+ CheckAndReplaceConverterForSwapEndian(stream, hostInputSampleFormat, hostOutputSampleFormat);
+
/* Ok, buffer processor is initialized, now we can deduce it's latency */
if( numInputChannels > 0 )
stream->streamRepresentation.streamInfo.inputLatency = inputLatency + (PaTime)(
@@ -3607,6 +3732,16 @@ static PaError PaAlsaStreamComponent_EndPolling( PaAlsaStreamComponent* self, st
*shouldPoll = 0;
}
+ else /* (A zero revent occurred) */
+ /* Work around an issue with Alsa older than 1.0.16 using some plugins (eg default with plug + dmix) where
+ * POLLIN or POLLOUT are zeroed by Alsa-lib if _mmap_avail() is a few frames short of avail_min at period
+ * boundary, possibly due to erratic dma interrupts at period boundary? Treat as a valid event.
+ */
+ if( self->useReventFix )
+ {
+ self->ready = 1;
+ *shouldPoll = 0;
+ }
error:
return result;
@@ -3769,8 +3904,8 @@ static PaError PaAlsaStream_WaitForFrames( PaAlsaStream *self, unsigned long *fr
/* not else ! */
if (timeouts >= 2048) /* audio device not working, shall return error to notify waiters */
{
- *framesAvail = 0; /* no frames available for processing */
- xrun = 1; /* try recovering device */
+ *framesAvail = 0; /* no frames available for processing */
+ xrun = 1; /* try recovering device */
PA_DEBUG(( "%s: poll timed out\n", __FUNCTION__, timeouts ));
goto end;/*PA_ENSURE( paTimedOut );*/
@@ -4148,7 +4283,7 @@ static void *CallbackThreadFunc( void *userData )
int xrun = 0;
#ifdef PTHREAD_CANCELED
- pthread_testcancel();
+ pthread_testcancel();
#endif
/* @concern StreamStop if the main thread has requested a stop and the stream has not been effectively
@@ -4550,3 +4685,648 @@ PaError PaAlsa_SetRetriesBusy( int retries )
busyRetries_ = retries;
return paNoError;
}
+
+/* -------------------------------------------------------------------------- */
+/* -------------------------------------------------------------------------- */
+/* -------------------------------------------------------------------------- */
+/* CONVERTERS (Swapping SRC/DST) */
+/* -------------------------------------------------------------------------- */
+
+#define PA_CLIP_( val, min, max )\
+ { val = ((val) < (min)) ? (min) : (((val) > (max)) ? (max) : (val)); }
+
+static const double const_1_div_2147483648_ = 1.0 / 2147483648.0; /* 32 bit multiplier */
+
+/* -------------------------------------------------------------------------- */
+
+static void Copy_24_To_24_Swap(
+ void *destinationBuffer, signed int destinationStride,
+ void *sourceBuffer, signed int sourceStride,
+ unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
+{
+ unsigned char *src = (unsigned char*)sourceBuffer;
+ unsigned char *dest = (unsigned char*)destinationBuffer;
+
+ (void) ditherGenerator; /* unused parameter */
+
+ while( count-- )
+ {
+ dest[2] = src[0];
+ dest[1] = src[1];
+ dest[0] = src[2];
+
+ src += sourceStride * 3;
+ dest += destinationStride * 3;
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+
+static void UInt8_To_Int24_Swap(
+ void *destinationBuffer, signed int destinationStride,
+ void *sourceBuffer, signed int sourceStride,
+ unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
+{
+ unsigned char *src = (unsigned char*)sourceBuffer;
+ unsigned char *dest = (unsigned char*)destinationBuffer;
+ (void) ditherGenerator; /* unused parameters */
+
+ while( count-- )
+ {
+
+#if defined(PA_LITTLE_ENDIAN)
+ dest[2] = 0;
+ dest[1] = 0;
+ dest[0] = (unsigned char)(*src - 128);
+#elif defined(PA_BIG_ENDIAN)
+ dest[2] = (unsigned char)(*src - 128);
+ dest[1] = 0;
+ dest[0] = 0;
+#endif
+
+ src += sourceStride;
+ dest += destinationStride * 3;
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+
+static void Int8_To_Int24_Swap(
+ void *destinationBuffer, signed int destinationStride,
+ void *sourceBuffer, signed int sourceStride,
+ unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
+{
+ signed char *src = (signed char*)sourceBuffer;
+ unsigned char *dest = (unsigned char*)destinationBuffer;
+ (void)ditherGenerator; /* unused parameter */
+
+ while( count-- )
+ {
+
+#if defined(PA_LITTLE_ENDIAN)
+ dest[2] = 0;
+ dest[1] = 0;
+ dest[0] = (*src);
+#elif defined(PA_BIG_ENDIAN)
+ dest[2] = (*src);
+ dest[1] = 0;
+ dest[0] = 0;
+#endif
+
+ src += sourceStride;
+ dest += destinationStride * 3;
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+
+static void Int16_To_Int24_Swap(
+ void *destinationBuffer, signed int destinationStride,
+ void *sourceBuffer, signed int sourceStride,
+ unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
+{
+ PaInt16 *src = (PaInt16*) sourceBuffer;
+ unsigned char *dest = (unsigned char*)destinationBuffer;
+ PaInt16 temp;
+
+ (void) ditherGenerator; /* unused parameter */
+
+ while( count-- )
+ {
+ temp = *src;
+
+#if defined(PA_LITTLE_ENDIAN)
+ dest[2] = 0;
+ dest[1] = (unsigned char)(temp);
+ dest[0] = (unsigned char)(temp >> 8);
+#elif defined(PA_BIG_ENDIAN)
+ dest[2] = (unsigned char)(temp >> 8);
+ dest[1] = (unsigned char)(temp);
+ dest[0] = 0;
+#endif
+
+ src += sourceStride;
+ dest += destinationStride * 3;
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+
+static void Int32_To_Int24_Swap(
+ void *destinationBuffer, signed int destinationStride,
+ void *sourceBuffer, signed int sourceStride,
+ unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
+{
+ PaInt32 *src = (PaInt32*)sourceBuffer;
+ unsigned char *dest = (unsigned char*)destinationBuffer;
+ (void) ditherGenerator; /* unused parameter */
+
+ while( count-- )
+ {
+ /* REVIEW */
+#if defined(PA_LITTLE_ENDIAN)
+ dest[2] = (unsigned char)(*src >> 8);
+ dest[1] = (unsigned char)(*src >> 16);
+ dest[0] = (unsigned char)(*src >> 24);
+#elif defined(PA_BIG_ENDIAN)
+ dest[2] = (unsigned char)(*src >> 24);
+ dest[1] = (unsigned char)(*src >> 16);
+ dest[0] = (unsigned char)(*src >> 8);
+#endif
+ src += sourceStride;
+ dest += destinationStride * 3;
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+
+static void Float32_To_Int24_Swap(
+ void *destinationBuffer, signed int destinationStride,
+ void *sourceBuffer, signed int sourceStride,
+ unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
+{
+ float *src = (float*)sourceBuffer;
+ unsigned char *dest = (unsigned char*)destinationBuffer;
+ PaInt32 temp;
+
+ (void) ditherGenerator; /* unused parameter */
+
+ while( count-- )
+ {
+ /* convert to 32 bit and drop the low 8 bits */
+ double scaled = (double)(*src) * 2147483647.0;
+ temp = (PaInt32) scaled;
+
+#if defined(PA_LITTLE_ENDIAN)
+ dest[2] = (unsigned char)(temp >> 8);
+ dest[1] = (unsigned char)(temp >> 16);
+ dest[0] = (unsigned char)(temp >> 24);
+#elif defined(PA_BIG_ENDIAN)
+ dest[2] = (unsigned char)(temp >> 24);
+ dest[1] = (unsigned char)(temp >> 16);
+ dest[0] = (unsigned char)(temp >> 8);
+#endif
+
+ src += sourceStride;
+ dest += destinationStride * 3;
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+
+static void Float32_To_Int24_Dither_Swap(
+ void *destinationBuffer, signed int destinationStride,
+ void *sourceBuffer, signed int sourceStride,
+ unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
+{
+ float *src = (float*)sourceBuffer;
+ unsigned char *dest = (unsigned char*)destinationBuffer;
+ PaInt32 temp;
+
+ while( count-- )
+ {
+ /* convert to 32 bit and drop the low 8 bits */
+
+ double dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator );
+ /* use smaller scaler to prevent overflow when we add the dither */
+ double dithered = ((double)*src * (2147483646.0)) + dither;
+
+ temp = (PaInt32) dithered;
+
+#if defined(PA_LITTLE_ENDIAN)
+ dest[2] = (unsigned char)(temp >> 8);
+ dest[1] = (unsigned char)(temp >> 16);
+ dest[0] = (unsigned char)(temp >> 24);
+#elif defined(PA_BIG_ENDIAN)
+ dest[2] = (unsigned char)(temp >> 24);
+ dest[1] = (unsigned char)(temp >> 16);
+ dest[0] = (unsigned char)(temp >> 8);
+#endif
+
+ src += sourceStride;
+ dest += destinationStride * 3;
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+
+static void Float32_To_Int24_Clip_Swap(
+ void *destinationBuffer, signed int destinationStride,
+ void *sourceBuffer, signed int sourceStride,
+ unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
+{
+ float *src = (float*)sourceBuffer;
+ unsigned char *dest = (unsigned char*)destinationBuffer;
+ PaInt32 temp;
+
+ (void) ditherGenerator; /* unused parameter */
+
+ while( count-- )
+ {
+ /* convert to 32 bit and drop the low 8 bits */
+ double scaled = *src * 0x7FFFFFFF;
+ PA_CLIP_( scaled, -2147483648., 2147483647. );
+ temp = (PaInt32) scaled;
+
+#if defined(PA_LITTLE_ENDIAN)
+ dest[2] = (unsigned char)(temp >> 8);
+ dest[1] = (unsigned char)(temp >> 16);
+ dest[0] = (unsigned char)(temp >> 24);
+#elif defined(PA_BIG_ENDIAN)
+ dest[2] = (unsigned char)(temp >> 24);
+ dest[1] = (unsigned char)(temp >> 16);
+ dest[0] = (unsigned char)(temp >> 8);
+#endif
+
+ src += sourceStride;
+ dest += destinationStride * 3;
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+
+static void Float32_To_Int24_DitherClip_Swap(
+ void *destinationBuffer, signed int destinationStride,
+ void *sourceBuffer, signed int sourceStride,
+ unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
+{
+ float *src = (float*)sourceBuffer;
+ unsigned char *dest = (unsigned char*)destinationBuffer;
+ PaInt32 temp;
+
+ while( count-- )
+ {
+ /* convert to 32 bit and drop the low 8 bits */
+
+ double dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator );
+ /* use smaller scaler to prevent overflow when we add the dither */
+ double dithered = ((double)*src * (2147483646.0)) + dither;
+ PA_CLIP_( dithered, -2147483648., 2147483647. );
+
+ temp = (PaInt32) dithered;
+
+#if defined(PA_LITTLE_ENDIAN)
+ dest[2] = (unsigned char)(temp >> 8);
+ dest[1] = (unsigned char)(temp >> 16);
+ dest[0] = (unsigned char)(temp >> 24);
+#elif defined(PA_BIG_ENDIAN)
+ dest[2] = (unsigned char)(temp >> 24);
+ dest[1] = (unsigned char)(temp >> 16);
+ dest[0] = (unsigned char)(temp >> 8);
+#endif
+
+ src += sourceStride;
+ dest += destinationStride * 3;
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+
+static void Int24_To_Float32_Swap(
+ void *destinationBuffer, signed int destinationStride,
+ void *sourceBuffer, signed int sourceStride,
+ unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
+{
+ unsigned char *src = (unsigned char*)sourceBuffer;
+ float *dest = (float*)destinationBuffer;
+ PaInt32 temp;
+
+ (void) ditherGenerator; /* unused parameter */
+
+ while( count-- )
+ {
+
+#if defined(PA_LITTLE_ENDIAN)
+ temp = (((PaInt32)src[2]) << 8);
+ temp = temp | (((PaInt32)src[1]) << 16);
+ temp = temp | (((PaInt32)src[0]) << 24);
+#elif defined(PA_BIG_ENDIAN)
+ temp = (((PaInt32)src[2]) << 24);
+ temp = temp | (((PaInt32)src[1]) << 16);
+ temp = temp | (((PaInt32)src[0]) << 8);
+#endif
+
+ *dest = (float) ((double)temp * const_1_div_2147483648_);
+
+ src += sourceStride * 3;
+ dest += destinationStride;
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+
+static void Int24_To_Int32_Swap(
+ void *destinationBuffer, signed int destinationStride,
+ void *sourceBuffer, signed int sourceStride,
+ unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
+{
+ unsigned char *src = (unsigned char*)sourceBuffer;
+ PaInt32 *dest = (PaInt32*) destinationBuffer;
+ PaInt32 temp;
+
+ (void) ditherGenerator; /* unused parameter */
+
+ while( count-- )
+ {
+
+#if defined(PA_LITTLE_ENDIAN)
+ temp = (((PaInt32)src[2]) << 8);
+ temp = temp | (((PaInt32)src[1]) << 16);
+ temp = temp | (((PaInt32)src[0]) << 24);
+#elif defined(PA_BIG_ENDIAN)
+ temp = (((PaInt32)src[2]) << 24);
+ temp = temp | (((PaInt32)src[1]) << 16);
+ temp = temp | (((PaInt32)src[0]) << 8);
+#endif
+
+ *dest = temp;
+
+ src += sourceStride * 3;
+ dest += destinationStride;
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+
+static void Int24_To_Int16_Swap(
+ void *destinationBuffer, signed int destinationStride,
+ void *sourceBuffer, signed int sourceStride,
+ unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
+{
+ unsigned char *src = (unsigned char*)sourceBuffer;
+ PaInt16 *dest = (PaInt16*)destinationBuffer;
+
+ PaInt16 temp;
+
+ (void) ditherGenerator; /* unused parameter */
+
+ while( count-- )
+ {
+
+#if defined(PA_LITTLE_ENDIAN)
+ /* src[2] is discarded */
+ temp = (((PaInt16)src[1]));
+ temp = temp | (PaInt16)(((PaInt16)src[0]) << 8);
+#elif defined(PA_BIG_ENDIAN)
+ /* src[0] is discarded */
+ temp = (PaInt16)(((PaInt16)src[2]) << 8);
+ temp = temp | (((PaInt16)src[1]));
+#endif
+
+ *dest = temp;
+
+ src += sourceStride * 3;
+ dest += destinationStride;
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+
+static void Int24_To_Int16_Dither_Swap(
+ void *destinationBuffer, signed int destinationStride,
+ void *sourceBuffer, signed int sourceStride,
+ unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
+{
+ unsigned char *src = (unsigned char*)sourceBuffer;
+ PaInt16 *dest = (PaInt16*)destinationBuffer;
+
+ PaInt32 temp, dither;
+
+ while( count-- )
+ {
+
+#if defined(PA_LITTLE_ENDIAN)
+ temp = (((PaInt32)src[2]) << 8);
+ temp = temp | (((PaInt32)src[1]) << 16);
+ temp = temp | (((PaInt32)src[0]) << 24);
+#elif defined(PA_BIG_ENDIAN)
+ temp = (((PaInt32)src[2]) << 24);
+ temp = temp | (((PaInt32)src[1]) << 16);
+ temp = temp | (((PaInt32)src[0]) << 8);
+#endif
+
+ /* REVIEW */
+ dither = PaUtil_Generate16BitTriangularDither( ditherGenerator );
+ *dest = (PaInt16) (((temp >> 1) + dither) >> 15);
+
+ src += sourceStride * 3;
+ dest += destinationStride;
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+
+static void Int24_To_Int8_Swap(
+ void *destinationBuffer, signed int destinationStride,
+ void *sourceBuffer, signed int sourceStride,
+ unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
+{
+ unsigned char *src = (unsigned char*)sourceBuffer;
+ signed char *dest = (signed char*)destinationBuffer;
+
+ (void) ditherGenerator; /* unused parameter */
+
+ while( count-- )
+ {
+
+#if defined(PA_LITTLE_ENDIAN)
+ /* src[0] is discarded */
+ /* src[1] is discarded */
+ *dest = src[0];
+#elif defined(PA_BIG_ENDIAN)
+ /* src[2] is discarded */
+ /* src[1] is discarded */
+ *dest = src[2];
+#endif
+
+ src += sourceStride * 3;
+ dest += destinationStride;
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+
+static void Int24_To_Int8_Dither_Swap(
+ void *destinationBuffer, signed int destinationStride,
+ void *sourceBuffer, signed int sourceStride,
+ unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
+{
+ unsigned char *src = (unsigned char*)sourceBuffer;
+ signed char *dest = (signed char*)destinationBuffer;
+
+ PaInt32 temp, dither;
+
+ while( count-- )
+ {
+
+#if defined(PA_LITTLE_ENDIAN)
+ temp = (((PaInt32)src[2]) << 8);
+ temp = temp | (((PaInt32)src[1]) << 16);
+ temp = temp | (((PaInt32)src[0]) << 24);
+#elif defined(PA_BIG_ENDIAN)
+ temp = (((PaInt32)src[2]) << 24);
+ temp = temp | (((PaInt32)src[1]) << 16);
+ temp = temp | (((PaInt32)src[0]) << 8);
+#endif
+
+ /* REVIEW */
+ dither = PaUtil_Generate16BitTriangularDither( ditherGenerator );
+ *dest = (signed char) (((temp >> 1) + dither) >> 23);
+
+ src += sourceStride * 3;
+ dest += destinationStride;
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+
+static void Int24_To_UInt8_Swap(
+ void *destinationBuffer, signed int destinationStride,
+ void *sourceBuffer, signed int sourceStride,
+ unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
+{
+ unsigned char *src = (unsigned char*)sourceBuffer;
+ unsigned char *dest = (unsigned char*)destinationBuffer;
+
+ (void) ditherGenerator; /* unused parameter */
+
+ while( count-- )
+ {
+
+#if defined(PA_LITTLE_ENDIAN)
+ /* src[0] is discarded */
+ /* src[1] is discarded */
+ *dest = (unsigned char)(src[0] + 128);
+#elif defined(PA_BIG_ENDIAN)
+ *dest = (unsigned char)(src[2] + 128);
+ /* src[1] is discarded */
+ /* src[2] is discarded */
+#endif
+
+ src += sourceStride * 3;
+ dest += destinationStride;
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+
+static void X_To_X_Stub(
+ void *destinationBuffer, signed int destinationStride,
+ void *sourceBuffer, signed int sourceStride,
+ unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator )
+{
+ (void) destinationBuffer; /* unused parameters */
+ (void) destinationStride; /* unused parameters */
+ (void) sourceBuffer; /* unused parameters */
+ (void) sourceStride; /* unused parameters */
+ (void) count; /* unused parameters */
+ (void) ditherGenerator; /* unused parameters */
+ /* IMPLEMENT ME */
+
+ assert(0 && "input/output format needs additional swapping converter");
+}
+
+/* -------------------------------------------------------------------------- */
+
+static PaUtilConverterTable paAlsaSwapConverters = {
+ X_To_X_Stub, /* PaUtilConverter *Float32_To_Int32; */
+ X_To_X_Stub, /* PaUtilConverter *Float32_To_Int32_Dither; */
+ X_To_X_Stub, /* PaUtilConverter *Float32_To_Int32_Clip; */
+ X_To_X_Stub, /* PaUtilConverter *Float32_To_Int32_DitherClip; */
+
+ Float32_To_Int24_Swap, /* PaUtilConverter *Float32_To_Int24; */
+ Float32_To_Int24_Dither_Swap, /* PaUtilConverter *Float32_To_Int24_Dither; */
+ Float32_To_Int24_Clip_Swap, /* PaUtilConverter *Float32_To_Int24_Clip; */
+ Float32_To_Int24_DitherClip_Swap, /* PaUtilConverter *Float32_To_Int24_DitherClip; */
+
+ X_To_X_Stub, /* PaUtilConverter *Float32_To_Int16; */
+ X_To_X_Stub, /* PaUtilConverter *Float32_To_Int16_Dither; */
+ X_To_X_Stub, /* PaUtilConverter *Float32_To_Int16_Clip; */
+ X_To_X_Stub, /* PaUtilConverter *Float32_To_Int16_DitherClip; */
+
+ X_To_X_Stub, /* PaUtilConverter *Float32_To_Int8; */
+ X_To_X_Stub, /* PaUtilConverter *Float32_To_Int8_Dither; */
+ X_To_X_Stub, /* PaUtilConverter *Float32_To_Int8_Clip; */
+ X_To_X_Stub, /* PaUtilConverter *Float32_To_Int8_DitherClip; */
+
+ X_To_X_Stub, /* PaUtilConverter *Float32_To_UInt8; */
+ X_To_X_Stub, /* PaUtilConverter *Float32_To_UInt8_Dither; */
+ X_To_X_Stub, /* PaUtilConverter *Float32_To_UInt8_Clip; */
+ X_To_X_Stub, /* PaUtilConverter *Float32_To_UInt8_DitherClip; */
+
+ X_To_X_Stub, /* PaUtilConverter *Int32_To_Float32; */
+ Int32_To_Int24_Swap, /* PaUtilConverter *Int32_To_Int24; */
+ X_To_X_Stub,/*TO-DO*//* PaUtilConverter *Int32_To_Int24_Dither; */
+ X_To_X_Stub, /* PaUtilConverter *Int32_To_Int16; */
+ X_To_X_Stub, /* PaUtilConverter *Int32_To_Int16_Dither; */
+ X_To_X_Stub, /* PaUtilConverter *Int32_To_Int8; */
+ X_To_X_Stub, /* PaUtilConverter *Int32_To_Int8_Dither; */
+ X_To_X_Stub, /* PaUtilConverter *Int32_To_UInt8; */
+ X_To_X_Stub, /* PaUtilConverter *Int32_To_UInt8_Dither; */
+
+ Int24_To_Float32_Swap, /* PaUtilConverter *Int24_To_Float32; */
+ Int24_To_Int32_Swap, /* PaUtilConverter *Int24_To_Int32; */
+ Int24_To_Int16_Swap, /* PaUtilConverter *Int24_To_Int16; */
+ Int24_To_Int16_Dither_Swap, /* PaUtilConverter *Int24_To_Int16_Dither; */
+ Int24_To_Int8_Swap, /* PaUtilConverter *Int24_To_Int8; */
+ Int24_To_Int8_Dither_Swap, /* PaUtilConverter *Int24_To_Int8_Dither; */
+ Int24_To_UInt8_Swap, /* PaUtilConverter *Int24_To_UInt8; */
+ X_To_X_Stub, /* PaUtilConverter *Int24_To_UInt8_Dither; */
+
+ X_To_X_Stub, /* PaUtilConverter *Int16_To_Float32; */
+ X_To_X_Stub, /* PaUtilConverter *Int16_To_Int32; */
+ Int16_To_Int24_Swap, /* PaUtilConverter *Int16_To_Int24; */
+ X_To_X_Stub, /* PaUtilConverter *Int16_To_Int8; */
+ X_To_X_Stub, /* PaUtilConverter *Int16_To_Int8_Dither; */
+ X_To_X_Stub, /* PaUtilConverter *Int16_To_UInt8; */
+ X_To_X_Stub, /* PaUtilConverter *Int16_To_UInt8_Dither; */
+
+ X_To_X_Stub, /* PaUtilConverter *Int8_To_Float32; */
+ X_To_X_Stub, /* PaUtilConverter *Int8_To_Int32; */
+ Int8_To_Int24_Swap, /* PaUtilConverter *Int8_To_Int24 */
+ X_To_X_Stub, /* PaUtilConverter *Int8_To_Int16; */
+ X_To_X_Stub, /* PaUtilConverter *Int8_To_UInt8; */
+
+ X_To_X_Stub, /* PaUtilConverter *UInt8_To_Float32; */
+ X_To_X_Stub, /* PaUtilConverter *UInt8_To_Int32; */
+ UInt8_To_Int24_Swap, /* PaUtilConverter *UInt8_To_Int24; */
+ X_To_X_Stub, /* PaUtilConverter *UInt8_To_Int16; */
+ X_To_X_Stub, /* PaUtilConverter *UInt8_To_Int8; */
+
+ X_To_X_Stub, /* PaUtilConverter *Copy_8_To_8; */
+ X_To_X_Stub, /* PaUtilConverter *Copy_16_To_16; */
+ Copy_24_To_24_Swap, /* PaUtilConverter *Copy_24_To_24; */
+ X_To_X_Stub /* PaUtilConverter *Copy_32_To_32; */
+};
+void CheckAndReplaceConverterForSwapEndian(PaAlsaStream *stream, PaSampleFormat hostInputSampleFormat,
+ PaSampleFormat hostOutputSampleFormat)
+{
+ PaUtilConverter **cv_org = (PaUtilConverter **)&paConverters,
+ **cv_swp = (PaUtilConverter **)&paAlsaSwapConverters;
+
+ int i, i_max = sizeof(PaUtilConverterTable)/sizeof(PaUtilConverter *);
+
+ if (hostInputSampleFormat & paSwapEndian)
+ {
+ for (i = 0; i < i_max; ++i)
+ {
+ if (cv_org[i] == stream->bufferProcessor.inputConverter)
+ {
+ stream->bufferProcessor.inputConverter = cv_swp[i];
+ break;
+ }
+ }
+ }
+
+ if (hostOutputSampleFormat & paSwapEndian)
+ {
+ for (i = 0; i < i_max; ++i)
+ {
+ if (cv_org[i] == stream->bufferProcessor.outputConverter)
+ {
+ stream->bufferProcessor.outputConverter = cv_swp[i];
+ break;
+ }
+ }
+ }
+}
diff --git a/3rdparty/portaudio/src/hostapi/asio/pa_asio.cpp b/3rdparty/portaudio/src/hostapi/asio/pa_asio.cpp
index 28eee9dbb..3ecc2170a 100644
--- a/3rdparty/portaudio/src/hostapi/asio/pa_asio.cpp
+++ b/3rdparty/portaudio/src/hostapi/asio/pa_asio.cpp
@@ -1,5 +1,5 @@
/*
- * $Id: pa_asio.cpp 1778 2011-11-10 13:59:53Z rossb $
+ * $Id: pa_asio.cpp 1825 2012-04-02 07:58:04Z rbencina $
* Portable Audio I/O Library for ASIO Drivers
*
* Author: Stephane Letz
@@ -1031,8 +1031,6 @@ PaError PaAsio_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex
PaAsioHostApiRepresentation *asioHostApi;
PaAsioDeviceInfo *deviceInfoArray;
char **names;
- PaAsioDriverInfo paAsioDriverInfo;
-
asioHostApi = (PaAsioHostApiRepresentation*)PaUtil_AllocateMemory( sizeof(PaAsioHostApiRepresentation) );
if( !asioHostApi )
{
@@ -1040,6 +1038,8 @@ PaError PaAsio_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex
goto error;
}
+ memset( asioHostApi, 0, sizeof(PaAsioHostApiRepresentation) ); /* ensure all fields are zeroed. especially asioHostApi->allocations */
+
/*
We initialize COM ourselves here and uninitialize it in Terminate().
This should be the only COM initialization needed in this module.
@@ -1142,6 +1142,13 @@ PaError PaAsio_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex
for( i=0; i < driverCount; ++i )
{
+ /* Due to the headless design of the ASIO API, drivers are free to write over data given to them (like M-Audio
+ drivers f.i.). This is an attempt to overcome that. */
+ union _tag_local {
+ PaAsioDriverInfo info;
+ char _padding[4096];
+ } paAsioDriver;
+
PA_DEBUG(("ASIO names[%d]:%s\n",i,names[i]));
@@ -1176,7 +1183,7 @@ PaError PaAsio_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex
/* Attempt to load the asio driver... */
- if( LoadAsioDriver( asioHostApi, names[i], &paAsioDriverInfo, asioHostApi->systemSpecific ) == paNoError )
+ if( LoadAsioDriver( asioHostApi, names[i], &paAsioDriver.info, asioHostApi->systemSpecific ) == paNoError )
{
PaAsioDeviceInfo *asioDeviceInfo = &deviceInfoArray[ (*hostApi)->info.deviceCount ];
PaDeviceInfo *deviceInfo = &asioDeviceInfo->commonDeviceInfo;
@@ -1186,15 +1193,15 @@ PaError PaAsio_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex
deviceInfo->name = names[i];
PA_DEBUG(("PaAsio_Initialize: drv:%d name = %s\n", i,deviceInfo->name));
- PA_DEBUG(("PaAsio_Initialize: drv:%d inputChannels = %d\n", i, paAsioDriverInfo.inputChannelCount));
- PA_DEBUG(("PaAsio_Initialize: drv:%d outputChannels = %d\n", i, paAsioDriverInfo.outputChannelCount));
- PA_DEBUG(("PaAsio_Initialize: drv:%d bufferMinSize = %d\n", i, paAsioDriverInfo.bufferMinSize));
- PA_DEBUG(("PaAsio_Initialize: drv:%d bufferMaxSize = %d\n", i, paAsioDriverInfo.bufferMaxSize));
- PA_DEBUG(("PaAsio_Initialize: drv:%d bufferPreferredSize = %d\n", i, paAsioDriverInfo.bufferPreferredSize));
- PA_DEBUG(("PaAsio_Initialize: drv:%d bufferGranularity = %d\n", i, paAsioDriverInfo.bufferGranularity));
+ PA_DEBUG(("PaAsio_Initialize: drv:%d inputChannels = %d\n", i, paAsioDriver.info.inputChannelCount));
+ PA_DEBUG(("PaAsio_Initialize: drv:%d outputChannels = %d\n", i, paAsioDriver.info.outputChannelCount));
+ PA_DEBUG(("PaAsio_Initialize: drv:%d bufferMinSize = %d\n", i, paAsioDriver.info.bufferMinSize));
+ PA_DEBUG(("PaAsio_Initialize: drv:%d bufferMaxSize = %d\n", i, paAsioDriver.info.bufferMaxSize));
+ PA_DEBUG(("PaAsio_Initialize: drv:%d bufferPreferredSize = %d\n", i, paAsioDriver.info.bufferPreferredSize));
+ PA_DEBUG(("PaAsio_Initialize: drv:%d bufferGranularity = %d\n", i, paAsioDriver.info.bufferGranularity));
- deviceInfo->maxInputChannels = paAsioDriverInfo.inputChannelCount;
- deviceInfo->maxOutputChannels = paAsioDriverInfo.outputChannelCount;
+ deviceInfo->maxInputChannels = paAsioDriver.info.inputChannelCount;
+ deviceInfo->maxOutputChannels = paAsioDriver.info.outputChannelCount;
deviceInfo->defaultSampleRate = 0.;
bool foundDefaultSampleRate = false;
@@ -1222,13 +1229,13 @@ PaError PaAsio_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex
*/
double defaultLowLatency =
- paAsioDriverInfo.bufferPreferredSize / deviceInfo->defaultSampleRate;
+ paAsioDriver.info.bufferPreferredSize / deviceInfo->defaultSampleRate;
deviceInfo->defaultLowInputLatency = defaultLowLatency;
deviceInfo->defaultLowOutputLatency = defaultLowLatency;
double defaultHighLatency =
- paAsioDriverInfo.bufferMaxSize / deviceInfo->defaultSampleRate;
+ paAsioDriver.info.bufferMaxSize / deviceInfo->defaultSampleRate;
if( defaultHighLatency < defaultLowLatency )
defaultHighLatency = defaultLowLatency; /* just in case the driver returns something strange */
@@ -1249,10 +1256,10 @@ PaError PaAsio_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex
PA_DEBUG(("PaAsio_Initialize: drv:%d defaultHighInputLatency = %f\n", i, deviceInfo->defaultHighInputLatency));
PA_DEBUG(("PaAsio_Initialize: drv:%d defaultHighOutputLatency = %f\n", i, deviceInfo->defaultHighOutputLatency));
- asioDeviceInfo->minBufferSize = paAsioDriverInfo.bufferMinSize;
- asioDeviceInfo->maxBufferSize = paAsioDriverInfo.bufferMaxSize;
- asioDeviceInfo->preferredBufferSize = paAsioDriverInfo.bufferPreferredSize;
- asioDeviceInfo->bufferGranularity = paAsioDriverInfo.bufferGranularity;
+ asioDeviceInfo->minBufferSize = paAsioDriver.info.bufferMinSize;
+ asioDeviceInfo->maxBufferSize = paAsioDriver.info.bufferMaxSize;
+ asioDeviceInfo->preferredBufferSize = paAsioDriver.info.bufferPreferredSize;
+ asioDeviceInfo->bufferGranularity = paAsioDriver.info.bufferGranularity;
asioDeviceInfo->asioChannelInfos = (ASIOChannelInfo*)PaUtil_GroupAllocateMemory(
@@ -3046,7 +3053,7 @@ previousIndex = index;
paTimeInfo.outputBufferDacTime = paTimeInfo.currentTime + theAsioStream->streamRepresentation.streamInfo.outputLatency;
*/
-/* Disabled! Stopping and re-starting the stream causes an input overflow / output undeflow. S.Fischer */
+/* Disabled! Stopping and re-starting the stream causes an input overflow / output underflow. S.Fischer */
#if 0
// detect underflows by checking inter-callback time > 2 buffer period
static double previousTime = -1;
@@ -3498,6 +3505,7 @@ static PaError IsStreamActive( PaStream *s )
static PaTime GetStreamTime( PaStream *s )
{
(void) s; /* unused parameter */
+
return (double)timeGetTime() * .001;
}
diff --git a/3rdparty/portaudio/src/hostapi/coreaudio/pa_mac_core.c b/3rdparty/portaudio/src/hostapi/coreaudio/pa_mac_core.c
index 55ce9f0c0..339e2afa3 100644
--- a/3rdparty/portaudio/src/hostapi/coreaudio/pa_mac_core.c
+++ b/3rdparty/portaudio/src/hostapi/coreaudio/pa_mac_core.c
@@ -204,8 +204,40 @@ const char *PaMacCore_GetChannelName( int device, int channelIndex, bool input )
return channelName;
}
+
+PaError PaMacCore_GetBufferSizeRange( PaDeviceIndex device,
+ long *minBufferSizeFrames, long *maxBufferSizeFrames )
+{
+ PaError result;
+ PaUtilHostApiRepresentation *hostApi;
+
+ result = PaUtil_GetHostApiRepresentation( &hostApi, paCoreAudio );
+
+ if( result == paNoError )
+ {
+ PaDeviceIndex hostApiDeviceIndex;
+ result = PaUtil_DeviceIndexToHostApiDeviceIndex( &hostApiDeviceIndex, device, hostApi );
+ if( result == paNoError )
+ {
+ PaMacAUHAL *macCoreHostApi = (PaMacAUHAL*)hostApi;
+ AudioDeviceID macCoreDeviceId = macCoreHostApi->devIds[hostApiDeviceIndex];
+ AudioValueRange audioRange;
+ UInt32 propSize = sizeof( audioRange );
+
+ // return the size range for the output scope unless we only have inputs
+ Boolean isInput = 0;
+ if( macCoreHostApi->inheritedHostApiRep.deviceInfos[hostApiDeviceIndex]->maxOutputChannels == 0 )
+ isInput = 1;
+
+ result = WARNING(AudioDeviceGetProperty( macCoreDeviceId, 0, isInput, kAudioDevicePropertyBufferFrameSizeRange, &propSize, &audioRange ) );
-
+ *minBufferSizeFrames = audioRange.mMinimum;
+ *maxBufferSizeFrames = audioRange.mMaximum;
+ }
+ }
+
+ return result;
+}
AudioDeviceID PaMacCore_GetStreamInputDevice( PaStream* s )
@@ -1596,12 +1628,19 @@ static UInt32 CalculateOptimalBufferSize( PaMacAUHAL *auhalHostApi,
resultBufferSizeFrames = MAX( resultBufferSizeFrames, (UInt32) variableLatencyFrames );
}
+ // can't have zero frames. code to round up to next user buffer requires non-zero
+ resultBufferSizeFrames = MAX( resultBufferSizeFrames, 1 );
+
if( requestedFramesPerBuffer != paFramesPerBufferUnspecified )
{
// make host buffer the next highest integer multiple of user frames per buffer
UInt32 n = (resultBufferSizeFrames + requestedFramesPerBuffer - 1) / requestedFramesPerBuffer;
resultBufferSizeFrames = n * requestedFramesPerBuffer;
+
+ // FIXME: really we should be searching for a multiple of requestedFramesPerBuffer
+ // that is >= suggested latency and also fits within device buffer min/max
+
}else{
VDBUG( ("Block Size unspecified. Based on Latency, the user wants a Block Size near: %ld.\n",
resultBufferSizeFrames ) );
diff --git a/3rdparty/portaudio/src/hostapi/dsound/pa_win_ds.c b/3rdparty/portaudio/src/hostapi/dsound/pa_win_ds.c
index 11dd701cf..24c322bbe 100644
--- a/3rdparty/portaudio/src/hostapi/dsound/pa_win_ds.c
+++ b/3rdparty/portaudio/src/hostapi/dsound/pa_win_ds.c
@@ -1,5 +1,5 @@
/*
- * $Id: pa_win_ds.c 1794 2011-11-24 18:11:33Z rossb $
+ * $Id: pa_win_ds.c 1824 2012-04-02 07:45:18Z rbencina $
* Portable Audio I/O Library DirectSound implementation
*
* Authors: Phil Burk, Robert Marsanyi & Ross Bencina
@@ -480,7 +480,7 @@ static PaError ExpandDSDeviceNameAndGUIDVector( DSDeviceNameAndGUIDVector *guidV
else
{
newItems[i].lpGUID = &newItems[i].guid;
- memcpy( &newItems[i].guid, guidVector->items[i].lpGUID, sizeof(GUID) );;
+ memcpy( &newItems[i].guid, guidVector->items[i].lpGUID, sizeof(GUID) );
}
newItems[i].pnpInterface = guidVector->items[i].pnpInterface;
}
@@ -1167,6 +1167,8 @@ PaError PaWinDs_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInde
goto error;
}
+ memset( winDsHostApi, 0, sizeof(PaWinDsHostApiRepresentation) ); /* ensure all fields are zeroed. especially winDsHostApi->allocations */
+
result = PaWinUtil_CoInitialize( paDirectSound, &winDsHostApi->comInitializationResult );
if( result != paNoError )
{
@@ -1306,7 +1308,7 @@ error:
TerminateDSDeviceNameAndGUIDVector( &deviceNamesAndGUIDs.inputNamesAndGUIDs );
TerminateDSDeviceNameAndGUIDVector( &deviceNamesAndGUIDs.outputNamesAndGUIDs );
- Terminate( winDsHostApi );
+ Terminate( (struct PaUtilHostApiRepresentation *)winDsHostApi );
return result;
}
@@ -1703,9 +1705,9 @@ static void CalculateBufferSettings( unsigned long *hostBufferSizeFrames,
unsigned long suggestedOutputLatencyFrames,
double sampleRate, unsigned long userFramesPerBuffer )
{
- unsigned long minimumPollingPeriodFrames = sampleRate * PA_DS_MINIMUM_POLLING_PERIOD_SECONDS;
- unsigned long maximumPollingPeriodFrames = sampleRate * PA_DS_MAXIMUM_POLLING_PERIOD_SECONDS;
- unsigned long pollingJitterFrames = sampleRate * PA_DS_POLLING_JITTER_SECONDS;
+ unsigned long minimumPollingPeriodFrames = (unsigned long)(sampleRate * PA_DS_MINIMUM_POLLING_PERIOD_SECONDS);
+ unsigned long maximumPollingPeriodFrames = (unsigned long)(sampleRate * PA_DS_MAXIMUM_POLLING_PERIOD_SECONDS);
+ unsigned long pollingJitterFrames = (unsigned long)(sampleRate * PA_DS_POLLING_JITTER_SECONDS);
if( userFramesPerBuffer == paFramesPerBufferUnspecified )
{
@@ -1771,9 +1773,9 @@ static void CalculatePollingPeriodFrames( unsigned long hostBufferSizeFrames,
unsigned long *pollingPeriodFrames,
double sampleRate, unsigned long userFramesPerBuffer )
{
- unsigned long minimumPollingPeriodFrames = sampleRate * PA_DS_MINIMUM_POLLING_PERIOD_SECONDS;
- unsigned long maximumPollingPeriodFrames = sampleRate * PA_DS_MAXIMUM_POLLING_PERIOD_SECONDS;
- unsigned long pollingJitterFrames = sampleRate * PA_DS_POLLING_JITTER_SECONDS;
+ unsigned long minimumPollingPeriodFrames = (unsigned long)(sampleRate * PA_DS_MINIMUM_POLLING_PERIOD_SECONDS);
+ unsigned long maximumPollingPeriodFrames = (unsigned long)(sampleRate * PA_DS_MAXIMUM_POLLING_PERIOD_SECONDS);
+ unsigned long pollingJitterFrames = (unsigned long)(sampleRate * PA_DS_POLLING_JITTER_SECONDS);
*pollingPeriodFrames = max( max(1, userFramesPerBuffer / 4), hostBufferSizeFrames / 16 );
@@ -2471,6 +2473,8 @@ static int TimeSlice( PaWinDsStream *stream )
framesToXfer = numOutFramesReady = bytesEmpty / stream->outputFrameSizeBytes;
/* Check for underflow */
+ /* FIXME QueryOutputSpace should not adjust underflow count as a side effect.
+ A query function should be a const operator on the stream and return a flag on underflow. */
if( stream->outputUnderflowCount != previousUnderflowCount )
stream->callbackFlags |= paOutputUnderflow;
@@ -2536,7 +2540,7 @@ static int TimeSlice( PaWinDsStream *stream )
{
/*
We don't currently add outputLatency here because it appears to produce worse
- results than non adding it. Need to do more testing to verify this.
+ results than not adding it. Need to do more testing to verify this.
*/
/* timeInfo.outputBufferDacTime = timeInfo.currentTime + outputLatency; */
timeInfo.outputBufferDacTime = timeInfo.currentTime;
@@ -2729,7 +2733,7 @@ PA_THREAD_FUNC ProcessingThreadProc( void *pArg )
LARGE_INTEGER dueTime;
int timerPeriodMs;
- timerPeriodMs = stream->pollingPeriodSeconds * MSECS_PER_SECOND;
+ timerPeriodMs = (int)(stream->pollingPeriodSeconds * MSECS_PER_SECOND);
if( timerPeriodMs < 1 )
timerPeriodMs = 1;
@@ -2953,7 +2957,7 @@ static PaError StartStream( PaStream *s )
if( stream->streamRepresentation.streamCallback )
{
TIMECAPS timecaps;
- int timerPeriodMs = stream->pollingPeriodSeconds * MSECS_PER_SECOND;
+ int timerPeriodMs = (int)(stream->pollingPeriodSeconds * MSECS_PER_SECOND);
if( timerPeriodMs < 1 )
timerPeriodMs = 1;
@@ -2967,7 +2971,7 @@ static PaError StartStream( PaStream *s )
if( timeGetDevCaps( &timecaps, sizeof(TIMECAPS) == MMSYSERR_NOERROR && timecaps.wPeriodMin > 0 ) )
{
/* aim for resolution 4 times higher than polling rate */
- stream->systemTimerResolutionPeriodMs = (stream->pollingPeriodSeconds * MSECS_PER_SECOND) / 4;
+ stream->systemTimerResolutionPeriodMs = (UINT)((stream->pollingPeriodSeconds * MSECS_PER_SECOND) * .25);
if( stream->systemTimerResolutionPeriodMs < timecaps.wPeriodMin )
stream->systemTimerResolutionPeriodMs = timecaps.wPeriodMin;
if( stream->systemTimerResolutionPeriodMs > timecaps.wPeriodMax )
diff --git a/3rdparty/portaudio/src/hostapi/wasapi/pa_win_wasapi.c b/3rdparty/portaudio/src/hostapi/wasapi/pa_win_wasapi.c
index 0172e4714..3cb5ecc73 100644
--- a/3rdparty/portaudio/src/hostapi/wasapi/pa_win_wasapi.c
+++ b/3rdparty/portaudio/src/hostapi/wasapi/pa_win_wasapi.c
@@ -1065,6 +1065,8 @@ PaError PaWasapi_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd
result = paInsufficientMemory;
goto error;
}
+
+ memset( paWasapi, 0, sizeof(PaWasapiHostApiRepresentation) ); /* ensure all fields are zeroed. especially paWasapi->allocations */
result = PaWinUtil_CoInitialize( paWASAPI, &paWasapi->comInitializationResult );
if( result != paNoError )
@@ -1248,7 +1250,7 @@ PaError PaWasapi_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd
goto error;
}
if (value.pwszVal)
- wcstombs(deviceName, value.pwszVal, MAX_STR_LEN-1);
+ WideCharToMultiByte(CP_UTF8, 0, value.pwszVal, (int)wcslen(value.pwszVal), deviceName, MAX_STR_LEN-1, 0, 0);
else
_snprintf(deviceName, MAX_STR_LEN-1, "baddev%d", i);
deviceInfo->name = deviceName;
@@ -2211,11 +2213,15 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu
if (framesPerLatency == 0)
framesPerLatency = MakeFramesFromHns(pInfo->DefaultDevicePeriod, pSub->wavex.Format.nSamplesPerSec);
- //! Exclusive Input stream renders data in 6 packets, we must set then the size of
- //! single packet, total buffer size, e.g. required latency will be PacketSize * 6
+ // Exclusive Input stream renders data in 6 packets, we must set then the size of
+ // single packet, total buffer size, e.g. required latency will be PacketSize * 6
if (!output && (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE))
{
- framesPerLatency /= WASAPI_PACKETS_PER_INPUT_BUFFER;
+ // Do it only for Polling mode
+ if ((pSub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) == 0)
+ {
+ framesPerLatency /= WASAPI_PACKETS_PER_INPUT_BUFFER;
+ }
}
// Calculate aligned period
@@ -3460,7 +3466,7 @@ static PaError ReadStream( PaStream* s, void *_buffer, unsigned long frames )
// Limit desired to amount of requested frames
desired = available;
- if (desired > frames)
+ if ((UINT32)desired > frames)
desired = frames;
// Get pointers to read regions
@@ -4795,13 +4801,15 @@ PA_THREAD_FUNC ProcThreadPoll(void *param)
// output
if (stream->bufferMode == paUtilFixedHostBufferSize)
{
- if (frames >= stream->out.framesPerBuffer)
+ while (frames >= stream->out.framesPerBuffer)
{
if ((hr = ProcessOutputBuffer(stream, processor, stream->out.framesPerBuffer)) != S_OK)
{
LogHostError(hr);
goto thread_error;
}
+
+ frames -= stream->out.framesPerBuffer;
}
}
else
diff --git a/3rdparty/portaudio/src/hostapi/wdmks/pa_win_wdmks.c b/3rdparty/portaudio/src/hostapi/wdmks/pa_win_wdmks.c
index 869cc4dac..4ab761a94 100644
--- a/3rdparty/portaudio/src/hostapi/wdmks/pa_win_wdmks.c
+++ b/3rdparty/portaudio/src/hostapi/wdmks/pa_win_wdmks.c
@@ -1,66 +1,70 @@
/*
- * $Id: pa_win_wdmks.c 1606 2011-02-17 15:56:04Z rob_bielik $
- * PortAudio Windows WDM-KS interface
- *
- * Author: Andrew Baldwin
- * Based on the Open Source API proposed by Ross Bencina
- * Copyright (c) 1999-2004 Andrew Baldwin, Ross Bencina, Phil Burk
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
+* $Id: pa_win_wdmks.c 1820 2012-02-25 07:43:10Z robiwan $
+* PortAudio Windows WDM-KS interface
+*
+* Author: Andrew Baldwin, Robert Bielik (WaveRT)
+* Based on the Open Source API proposed by Ross Bencina
+* Copyright (c) 1999-2004 Andrew Baldwin, Ross Bencina, Phil Burk
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files
+* (the "Software"), to deal in the Software without restriction,
+* including without limitation the rights to use, copy, modify, merge,
+* publish, distribute, sublicense, and/or sell copies of the Software,
+* and to permit persons to whom the Software is furnished to do so,
+* subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be
+* included in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
+* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
/*
- * The text above constitutes the entire PortAudio license; however,
- * the PortAudio community also makes the following non-binding requests:
- *
- * Any person wishing to distribute modifications to the Software is
- * requested to send the modifications to the original developer so that
- * they can be incorporated into the canonical version. It is also
- * requested that these non-binding requests be included along with the
- * license above.
- */
+* The text above constitutes the entire PortAudio license; however,
+* the PortAudio community also makes the following non-binding requests:
+*
+* Any person wishing to distribute modifications to the Software is
+* requested to send the modifications to the original developer so that
+* they can be incorporated into the canonical version. It is also
+* requested that these non-binding requests be included along with the
+* license above.
+*/
/** @file
- @ingroup hostapi_src
- @brief Portaudio WDM-KS host API.
+@ingroup hostapi_src
+@brief Portaudio WDM-KS host API.
- @note This is the implementation of the Portaudio host API using the
- Windows WDM/Kernel Streaming API in order to enable very low latency
- playback and recording on all modern Windows platforms (e.g. 2K, XP)
- Note: This API accesses the device drivers below the usual KMIXER
- component which is normally used to enable multi-client mixing and
- format conversion. That means that it will lock out all other users
- of a device for the duration of active stream using those devices
+@note This is the implementation of the Portaudio host API using the
+Windows WDM/Kernel Streaming API in order to enable very low latency
+playback and recording on all modern Windows platforms (e.g. 2K, XP, Vista, Win7)
+Note: This API accesses the device drivers below the usual KMIXER
+component which is normally used to enable multi-client mixing and
+format conversion. That means that it will lock out all other users
+of a device for the duration of active stream using those devices
*/
#include
+#if (defined(_WIN32) && (defined(_MSC_VER) && (_MSC_VER >= 1200))) /* MSC version 6 and above */
+#pragma comment( lib, "setupapi.lib" )
+#endif
+
/* Debugging/tracing support */
#define PA_LOGE_
#define PA_LOGL_
#ifdef __GNUC__
- #include
- #define _WIN32_WINNT 0x0501
- #define WINVER 0x0501
+#include
+#define _WIN32_WINNT 0x0501
+#define WINVER 0x0501
#endif
#include /* strlen() */
@@ -74,70 +78,95 @@
#include "pa_process.h"
#include "portaudio.h"
#include "pa_debugprint.h"
+#include "pa_memorybarrier.h"
+#include "pa_ringbuffer.h"
+#include "pa_trace.h"
+#include "pa_win_waveformat.h"
+
+#include "pa_win_wdmks.h"
#include
#include
#include
+#include
+
+#ifdef _MSC_VER
+#define snprintf _snprintf
+#define vsnprintf _vsnprintf
+#endif
+
+/* The PA_HP_TRACE macro is used in RT parts, so it can be switched off without affecting
+the rest of the debug tracing */
+#if 1
+#define PA_HP_TRACE(x) PaUtil_AddHighSpeedLogMessage x ;
+#else
+#define PA_HP_TRACE(x)
+#endif
+
+/* A define that selects whether the resulting pin names are chosen from pin category
+instead of the available pin names, who sometimes can be quite cheesy, like "Volume control".
+Default is to use the pin category.
+*/
+#ifndef PA_WDMKS_USE_CATEGORY_FOR_PIN_NAMES
+#define PA_WDMKS_USE_CATEGORY_FOR_PIN_NAMES 1
+#endif
+
#ifdef __GNUC__
- #undef PA_LOGE_
- #define PA_LOGE_ PA_DEBUG(("%s {\n",__FUNCTION__))
- #undef PA_LOGL_
- #define PA_LOGL_ PA_DEBUG(("} %s\n",__FUNCTION__))
- /* These defines are set in order to allow the WIndows DirectX
- * headers to compile with a GCC compiler such as MinGW
- * NOTE: The headers may generate a few warning in GCC, but
- * they should compile */
- #define _INC_MMSYSTEM
- #define _INC_MMREG
- #define _NTRTL_ /* Turn off default definition of DEFINE_GUIDEX */
- #define DEFINE_GUID_THUNK(name,guid) DEFINE_GUID(name,guid)
- #define DEFINE_GUIDEX(n) DEFINE_GUID_THUNK( n, STATIC_##n )
- #if !defined( DEFINE_WAVEFORMATEX_GUID )
- #define DEFINE_WAVEFORMATEX_GUID(x) (USHORT)(x), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71
- #endif
- #define WAVE_FORMAT_ADPCM 0x0002
- #define WAVE_FORMAT_IEEE_FLOAT 0x0003
- #define WAVE_FORMAT_ALAW 0x0006
- #define WAVE_FORMAT_MULAW 0x0007
- #define WAVE_FORMAT_MPEG 0x0050
- #define WAVE_FORMAT_DRM 0x0009
- #define DYNAMIC_GUID_THUNK(l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}
- #define DYNAMIC_GUID(data) DYNAMIC_GUID_THUNK(data)
+#undef PA_LOGE_
+#define PA_LOGE_ PA_DEBUG(("%s {\n",__FUNCTION__))
+#undef PA_LOGL_
+#define PA_LOGL_ PA_DEBUG(("} %s\n",__FUNCTION__))
+/* These defines are set in order to allow the WIndows DirectX
+* headers to compile with a GCC compiler such as MinGW
+* NOTE: The headers may generate a few warning in GCC, but
+* they should compile */
+#define _INC_MMSYSTEM
+#define _INC_MMREG
+#define _NTRTL_ /* Turn off default definition of DEFINE_GUIDEX */
+#define DEFINE_GUID_THUNK(name,guid) DEFINE_GUID(name,guid)
+#define DEFINE_GUIDEX(n) DEFINE_GUID_THUNK( n, STATIC_##n )
+#if !defined( DEFINE_WAVEFORMATEX_GUID )
+#define DEFINE_WAVEFORMATEX_GUID(x) (USHORT)(x), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71
+#endif
+#define WAVE_FORMAT_ADPCM 0x0002
+#define WAVE_FORMAT_IEEE_FLOAT 0x0003
+#define WAVE_FORMAT_ALAW 0x0006
+#define WAVE_FORMAT_MULAW 0x0007
+#define WAVE_FORMAT_MPEG 0x0050
+#define WAVE_FORMAT_DRM 0x0009
+#define DYNAMIC_GUID_THUNK(l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}
+#define DYNAMIC_GUID(data) DYNAMIC_GUID_THUNK(data)
#endif
-#if (defined(WIN32) && (defined(_MSC_VER) && (_MSC_VER >= 1200))) /* MSC version 6 and above */
-#pragma comment( lib, "setupapi.lib" )
-#endif
-
-/* use CreateThread for CYGWIN, _beginthreadex for all others */
-#ifndef __CYGWIN__
-#define CREATE_THREAD (HANDLE)_beginthreadex( 0, 0, ProcessingThreadProc, stream, 0, &stream->processingThreadId )
+/* use CreateThread for CYGWIN/Windows Mobile, _beginthreadex for all others */
+#if !defined(__CYGWIN__) && !defined(_WIN32_WCE)
+#define CREATE_THREAD_FUNCTION (HANDLE)_beginthreadex
+#define PA_THREAD_FUNC static unsigned WINAPI
#else
-#define CREATE_THREAD CreateThread( 0, 0, ProcessingThreadProc, stream, 0, &stream->processingThreadId )
-#endif
-
-/* use ExitThread for CYGWIN, _endthreadex for all others */
-#ifndef __CYGWIN__
-#define EXIT_THREAD _endthreadex(0)
-#else
-#define EXIT_THREAD ExitThread(0)
+#define CREATE_THREAD_FUNCTION CreateThread
+#define PA_THREAD_FUNC static DWORD WINAPI
#endif
#ifdef _MSC_VER
- //#define NOMMIDS
- #define DYNAMIC_GUID(data) {data}
- //#define _NTRTL_ /* Turn off default definition of DEFINE_GUIDEX */
- //#undef DEFINE_GUID
- //#define DEFINE_GUID(n,data) EXTERN_C const GUID n = {data}
- //#define DEFINE_GUID_THUNK(n,data) DEFINE_GUID(n,data)
- //#define DEFINE_GUIDEX(n) DEFINE_GUID_THUNK(n, STATIC_##n)
+#define NOMMIDS
+#define DYNAMIC_GUID(data) {data}
+#define _NTRTL_ /* Turn off default definition of DEFINE_GUIDEX */
+#undef DEFINE_GUID
+#define DEFINE_GUID(n,data) EXTERN_C const GUID n = {data}
+#define DEFINE_GUID_THUNK(n,data) DEFINE_GUID(n,data)
+#define DEFINE_GUIDEX(n) DEFINE_GUID_THUNK(n, STATIC_##n)
#endif
+#include
#include
#include
+
+/* Note that Windows SDK V6.0A or later is needed for WaveRT specific structs to be present in
+ ksmedia.h. Also make sure that the SDK include path is before other include paths (that may contain
+ an "old" ksmedia.h), so the proper ksmedia.h is used */
#include
-#include
+
#include
#include
@@ -146,17 +175,77 @@ typedef KSDDKAPI DWORD WINAPI KSCREATEPIN(HANDLE, PKSPIN_CONNECT, ACCESS_MASK, P
extern HMODULE DllKsUser;
extern KSCREATEPIN* FunctionKsCreatePin;
+/* These definitions allows the use of AVRT.DLL on Vista and later OSs */
+extern HMODULE DllAvRt;
+typedef HANDLE WINAPI AVSETMMTHREADCHARACTERISTICS(LPCSTR, LPDWORD TaskIndex);
+typedef BOOL WINAPI AVREVERTMMTHREADCHARACTERISTICS(HANDLE);
+typedef enum _PA_AVRT_PRIORITY
+{
+ PA_AVRT_PRIORITY_LOW = -1,
+ PA_AVRT_PRIORITY_NORMAL,
+ PA_AVRT_PRIORITY_HIGH,
+ PA_AVRT_PRIORITY_CRITICAL
+} PA_AVRT_PRIORITY, *PPA_AVRT_PRIORITY;
+typedef BOOL WINAPI AVSETMMTHREADPRIORITY(HANDLE, PA_AVRT_PRIORITY);
+extern AVSETMMTHREADCHARACTERISTICS* FunctionAvSetMmThreadCharacteristics;
+extern AVREVERTMMTHREADCHARACTERISTICS* FunctionAvRevertMmThreadCharacteristics;
+extern AVSETMMTHREADPRIORITY* FunctionAvSetMmThreadPriority;
+
+/* An unspecified channel count (-1) is not treated correctly, so we replace it with
+* an arbitrarily large number */
+#define MAXIMUM_NUMBER_OF_CHANNELS 256
+
/* Forward definition to break circular type reference between pin and filter */
struct __PaWinWdmFilter;
typedef struct __PaWinWdmFilter PaWinWdmFilter;
+struct __PaWinWdmPin;
+typedef struct __PaWinWdmPin PaWinWdmPin;
+
+struct __PaWinWdmStream;
+typedef struct __PaWinWdmStream PaWinWdmStream;
+
+/* Function prototype for getting audio position */
+typedef PaError (*FunctionGetPinAudioPosition)(PaWinWdmPin*, unsigned long*);
+
+/* Function prototype for memory barrier */
+typedef void (*FunctionMemoryBarrier)(void);
+
+struct __PaProcessThreadInfo;
+typedef struct __PaProcessThreadInfo PaProcessThreadInfo;
+
+typedef PaError (*FunctionPinHandler)(PaProcessThreadInfo* pInfo, unsigned eventIndex);
+
+typedef enum __PaStreamStartEnum
+{
+ StreamStart_kOk,
+ StreamStart_kFailed,
+ StreamStart_kCnt
+} PaStreamStartEnum;
+
+/* Multiplexed input structure.
+* Very often several physical inputs are multiplexed through a MUX node (represented in the topology filter) */
+typedef struct __PaWinWdmMuxedInput
+{
+ wchar_t friendlyName[MAX_PATH];
+ ULONG muxPinId;
+ ULONG muxNodeId;
+ ULONG endpointPinId;
+} PaWinWdmMuxedInput;
+
/* The Pin structure
- * A pin is an input or output node, e.g. for audio flow */
-typedef struct __PaWinWdmPin
+* A pin is an input or output node, e.g. for audio flow */
+struct __PaWinWdmPin
{
HANDLE handle;
+ PaWinWdmMuxedInput** inputs;
+ unsigned inputCount;
+ wchar_t friendlyName[MAX_PATH];
+
PaWinWdmFilter* parentFilter;
+ PaWDMKSSubType pinKsSubType;
unsigned long pinId;
+ unsigned long endpointPinId; /* For output pins */
KSPIN_CONNECT* pinConnect;
unsigned long pinConnectSize;
KSDATAFORMAT_WAVEFORMATEX* ksDataFormatWfx;
@@ -168,26 +257,46 @@ typedef struct __PaWinWdmPin
unsigned long frameSize;
int maxChannels;
unsigned long formats;
- int bestSampleRate;
-}
-PaWinWdmPin;
+ int defaultSampleRate;
+ ULONG *positionRegister; /* WaveRT */
+ ULONG hwLatency; /* WaveRT */
+ FunctionMemoryBarrier fnMemBarrier; /* WaveRT */
+ FunctionGetPinAudioPosition fnAudioPosition; /* WaveRT */
+ FunctionPinHandler fnEventHandler;
+ FunctionPinHandler fnSubmitHandler;
+};
/* The Filter structure
- * A filter has a number of pins and a "friendly name" */
+* A filter has a number of pins and a "friendly name" */
struct __PaWinWdmFilter
{
HANDLE handle;
+ PaWinWDMKSDeviceInfo devInfo; /* This will hold information that is exposed in PaDeviceInfo */
+
+ DWORD deviceNode;
int pinCount;
PaWinWdmPin** pins;
- TCHAR filterName[MAX_PATH];
- TCHAR friendlyName[MAX_PATH];
- int maxInputChannels;
- int maxOutputChannels;
- unsigned long formats;
+ PaWinWdmFilter* topologyFilter;
+ wchar_t friendlyName[MAX_PATH];
+ int validPinCount;
int usageCount;
- int bestSampleRate;
+ KSMULTIPLE_ITEM* connections;
+ KSMULTIPLE_ITEM* nodes;
+ int filterRefCount;
};
+
+typedef struct __PaWinWdmDeviceInfo
+{
+ PaDeviceInfo inheritedDeviceInfo;
+ char compositeName[MAX_PATH]; /* Composite name consists of pin name + device name in utf8 */
+ PaWinWdmFilter* filter;
+ unsigned long pin;
+ int muxPosition; /* Used only for input devices */
+ int endpointPinId;
+}
+PaWinWdmDeviceInfo;
+
/* PaWinWdmHostApiRepresentation - host api datastructure specific to this implementation */
typedef struct __PaWinWdmHostApiRepresentation
{
@@ -196,63 +305,114 @@ typedef struct __PaWinWdmHostApiRepresentation
PaUtilStreamInterface blockingStreamInterface;
PaUtilAllocationGroup* allocations;
- PaWinWdmFilter** filters;
- int filterCount;
+ int deviceCount;
}
PaWinWdmHostApiRepresentation;
-typedef struct __PaWinWdmDeviceInfo
-{
- PaDeviceInfo inheritedDeviceInfo;
- PaWinWdmFilter* filter;
-}
-PaWinWdmDeviceInfo;
-
typedef struct __DATAPACKET
{
KSSTREAM_HEADER Header;
OVERLAPPED Signal;
} DATAPACKET;
+typedef struct __PaIOPacket
+{
+ DATAPACKET* packet;
+ unsigned startByte;
+ unsigned lengthBytes;
+} PaIOPacket;
+
+typedef struct __PaWinWdmIOInfo
+{
+ PaWinWdmPin* pPin;
+ char* hostBuffer;
+ unsigned hostBufferSize;
+ unsigned framesPerBuffer;
+ unsigned bytesPerFrame;
+ unsigned bytesPerSample;
+ unsigned noOfPackets; /* Only used in WaveCyclic */
+ HANDLE *events; /* noOfPackets handles (WaveCyclic) 1 (WaveRT) */
+ DATAPACKET *packets; /* noOfPackets packets (WaveCyclic) 2 (WaveRT) */
+ /* WaveRT polled mode */
+ unsigned lastPosition;
+ unsigned pollCntr;
+} PaWinWdmIOInfo;
+
/* PaWinWdmStream - a stream data structure specifically for this implementation */
-typedef struct __PaWinWdmStream
+struct __PaWinWdmStream
{
PaUtilStreamRepresentation streamRepresentation;
+ PaWDMKSSpecificStreamInfo hostApiStreamInfo; /* This holds info that is exposed through PaStreamInfo */
PaUtilCpuLoadMeasurer cpuLoadMeasurer;
PaUtilBufferProcessor bufferProcessor;
- PaWinWdmPin* recordingPin;
- PaWinWdmPin* playbackPin;
- char* hostBuffer;
- unsigned long framesPerHostIBuffer;
- unsigned long framesPerHostOBuffer;
- int bytesPerInputFrame;
- int bytesPerOutputFrame;
+#if PA_TRACE_REALTIME_EVENTS
+ LogHandle hLog;
+#endif
+
+ PaUtilAllocationGroup* allocGroup;
+ PaWinWdmIOInfo capture;
+ PaWinWdmIOInfo render;
int streamStarted;
int streamActive;
int streamStop;
int streamAbort;
int oldProcessPriority;
HANDLE streamThread;
- HANDLE events[5]; /* 2 play + 2 record packets + abort events */
- DATAPACKET packets[4]; /* 2 play + 2 record */
+ HANDLE eventAbort;
+ HANDLE eventStreamStart[StreamStart_kCnt]; /* 0 = OK, 1 = Failed */
+ PaError threadResult;
PaStreamFlags streamFlags;
+
+ /* Capture ring buffer */
+ PaUtilRingBuffer ringBuffer;
+ char* ringBufferData;
+
/* These values handle the case where the user wants to use fewer
- * channels than the device has */
+ * channels than the device has */
int userInputChannels;
int deviceInputChannels;
int userOutputChannels;
int deviceOutputChannels;
- int inputSampleSize;
- int outputSampleSize;
-}
-PaWinWdmStream;
+};
-#include
+/* Gather all processing variables in a struct */
+struct __PaProcessThreadInfo
+{
+ PaWinWdmStream *stream;
+ PaStreamCallbackTimeInfo ti;
+ PaStreamCallbackFlags underover;
+ int cbResult;
+ volatile int pending;
+ volatile int priming;
+ volatile int pinsStarted;
+ unsigned long timeout;
+ unsigned captureHead;
+ unsigned captureTail;
+ unsigned renderHead;
+ unsigned renderTail;
+ PaIOPacket capturePackets[4];
+ PaIOPacket renderPackets[4];
+};
+
+/* Used for transferring device infos during scanning / rescanning */
+typedef struct __PaWinWDMScanDeviceInfosResults
+{
+ PaDeviceInfo **deviceInfos;
+ PaDeviceIndex defaultInputDevice;
+ PaDeviceIndex defaultOutputDevice;
+} PaWinWDMScanDeviceInfosResults;
+
+static const unsigned cPacketsArrayMask = 3;
HMODULE DllKsUser = NULL;
KSCREATEPIN* FunctionKsCreatePin = NULL;
+HMODULE DllAvRt = NULL;
+AVSETMMTHREADCHARACTERISTICS* FunctionAvSetMmThreadCharacteristics = NULL;
+AVREVERTMMTHREADCHARACTERISTICS* FunctionAvRevertMmThreadCharacteristics = NULL;
+AVSETMMTHREADPRIORITY* FunctionAvSetMmThreadPriority = NULL;
+
/* prototypes for functions declared in this file */
#ifdef __cplusplus
@@ -260,7 +420,7 @@ extern "C"
{
#endif /* __cplusplus */
-PaError PaWinWdm_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index );
+ PaError PaWinWdm_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index );
#ifdef __cplusplus
}
@@ -268,37 +428,48 @@ PaError PaWinWdm_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd
/* Low level I/O functions */
static PaError WdmSyncIoctl(HANDLE handle,
- unsigned long ioctlNumber,
- void* inBuffer,
- unsigned long inBufferCount,
- void* outBuffer,
- unsigned long outBufferCount,
- unsigned long* bytesReturned);
+ unsigned long ioctlNumber,
+ void* inBuffer,
+ unsigned long inBufferCount,
+ void* outBuffer,
+ unsigned long outBufferCount,
+ unsigned long* bytesReturned);
static PaError WdmGetPropertySimple(HANDLE handle,
- const GUID* const guidPropertySet,
- unsigned long property,
- void* value,
- unsigned long valueCount,
- void* instance,
- unsigned long instanceCount);
+ const GUID* const guidPropertySet,
+ unsigned long property,
+ void* value,
+ unsigned long valueCount,
+ void* instance,
+ unsigned long instanceCount);
static PaError WdmSetPropertySimple(HANDLE handle,
- const GUID* const guidPropertySet,
- unsigned long property,
- void* value,
- unsigned long valueCount,
- void* instance,
- unsigned long instanceCount);
+ const GUID* const guidPropertySet,
+ unsigned long property,
+ void* value,
+ unsigned long valueCount,
+ void* instance,
+ unsigned long instanceCount);
+
static PaError WdmGetPinPropertySimple(HANDLE handle,
- unsigned long pinId,
- const GUID* const guidPropertySet,
- unsigned long property,
- void* value,
- unsigned long valueCount);
+ unsigned long pinId,
+ const GUID* const guidPropertySet,
+ unsigned long property,
+ void* value,
+ unsigned long valueCount,
+ unsigned long* byteCount);
static PaError WdmGetPinPropertyMulti(HANDLE handle,
- unsigned long pinId,
- const GUID* const guidPropertySet,
- unsigned long property,
- KSMULTIPLE_ITEM** ksMultipleItem);
+ unsigned long pinId,
+ const GUID* const guidPropertySet,
+ unsigned long property,
+ KSMULTIPLE_ITEM** ksMultipleItem);
+static PaError WdmGetPropertyMulti(HANDLE handle,
+ const GUID* const guidPropertySet,
+ unsigned long property,
+ KSMULTIPLE_ITEM** ksMultipleItem);
+
+static PaError WdmSetMuxNodeProperty(HANDLE handle,
+ ULONG nodeId,
+ ULONG pinId);
+
/** Pin management functions */
static PaWinWdmPin* PinNew(PaWinWdmFilter* parentFilter, unsigned long pinId, PaError* error);
@@ -309,49 +480,47 @@ static PaError PinInstantiate(PaWinWdmPin* pin);
static PaError PinSetState(PaWinWdmPin* pin, KSSTATE state);
static PaError PinSetFormat(PaWinWdmPin* pin, const WAVEFORMATEX* format);
static PaError PinIsFormatSupported(PaWinWdmPin* pin, const WAVEFORMATEX* format);
+/* WaveRT support */
+static PaError PinQueryNotificationSupport(PaWinWdmPin* pPin, BOOL* pbResult);
+static PaError PinGetBuffer(PaWinWdmPin* pPin, void** pBuffer, DWORD* pRequestedBufSize, BOOL* pbCallMemBarrier);
+static PaError PinRegisterPositionRegister(PaWinWdmPin* pPin);
+static PaError PinRegisterNotificationHandle(PaWinWdmPin* pPin, HANDLE handle);
+static PaError PinUnregisterNotificationHandle(PaWinWdmPin* pPin, HANDLE handle);
+static PaError PinGetHwLatency(PaWinWdmPin* pPin, ULONG* pFifoSize, ULONG* pChipsetDelay, ULONG* pCodecDelay);
+static PaError PinGetAudioPositionDirect(PaWinWdmPin* pPin, ULONG* pPosition);
+static PaError PinGetAudioPositionViaIOCTL(PaWinWdmPin* pPin, ULONG* pPosition);
/* Filter management functions */
-static PaWinWdmFilter* FilterNew(
- TCHAR* filterName,
- TCHAR* friendlyName,
- PaError* error);
+static PaWinWdmFilter* FilterNew(PaWDMKSType type, DWORD devNode, const wchar_t* filterName, const wchar_t* friendlyName, PaError* error);
+static PaError FilterInitializePins(PaWinWdmFilter* filter);
static void FilterFree(PaWinWdmFilter* filter);
-static PaWinWdmPin* FilterCreateRenderPin(
- PaWinWdmFilter* filter,
- const WAVEFORMATEX* wfex,
- PaError* error);
-static PaWinWdmPin* FilterFindViableRenderPin(
- PaWinWdmFilter* filter,
- const WAVEFORMATEX* wfex,
- PaError* error);
-static PaError FilterCanCreateRenderPin(
- PaWinWdmFilter* filter,
- const WAVEFORMATEX* wfex);
-static PaWinWdmPin* FilterCreateCapturePin(
- PaWinWdmFilter* filter,
- const WAVEFORMATEX* wfex,
- PaError* error);
-static PaWinWdmPin* FilterFindViableCapturePin(
- PaWinWdmFilter* filter,
- const WAVEFORMATEX* wfex,
- PaError* error);
-static PaError FilterCanCreateCapturePin(
- PaWinWdmFilter* filter,
- const WAVEFORMATEX* pwfx);
-static PaError FilterUse(
- PaWinWdmFilter* filter);
-static void FilterRelease(
- PaWinWdmFilter* filter);
+static void FilterAddRef(PaWinWdmFilter* filter);
+static PaWinWdmPin* FilterCreatePin(
+ PaWinWdmFilter* filter,
+ int pinId,
+ const WAVEFORMATEX* wfex,
+ PaError* error);
+static PaError FilterUse(PaWinWdmFilter* filter);
+static void FilterRelease(PaWinWdmFilter* filter);
+
+/* Hot plug functions */
+static BOOL IsDeviceTheSame(const PaWinWdmDeviceInfo* pDev1,
+ const PaWinWdmDeviceInfo* pDev2);
/* Interface functions */
static void Terminate( struct PaUtilHostApiRepresentation *hostApi );
static PaError IsFormatSupported(
- struct PaUtilHostApiRepresentation *hostApi,
+struct PaUtilHostApiRepresentation *hostApi,
const PaStreamParameters *inputParameters,
const PaStreamParameters *outputParameters,
double sampleRate );
+
+static PaError ScanDeviceInfos( struct PaUtilHostApiRepresentation *hostApi, PaHostApiIndex index, void **newDeviceInfos, int *newDeviceCount );
+static PaError CommitDeviceInfos( struct PaUtilHostApiRepresentation *hostApi, PaHostApiIndex index, void *deviceInfos, int deviceCount );
+static PaError DisposeDeviceInfos( struct PaUtilHostApiRepresentation *hostApi, void *deviceInfos, int deviceCount );
+
static PaError OpenStream(
- struct PaUtilHostApiRepresentation *hostApi,
+struct PaUtilHostApiRepresentation *hostApi,
PaStream** s,
const PaStreamParameters *inputParameters,
const PaStreamParameters *outputParameters,
@@ -369,27 +538,108 @@ static PaError IsStreamActive( PaStream *stream );
static PaTime GetStreamTime( PaStream *stream );
static double GetStreamCpuLoad( PaStream* stream );
static PaError ReadStream(
- PaStream* stream,
- void *buffer,
- unsigned long frames );
+ PaStream* stream,
+ void *buffer,
+ unsigned long frames );
static PaError WriteStream(
- PaStream* stream,
- const void *buffer,
- unsigned long frames );
+ PaStream* stream,
+ const void *buffer,
+ unsigned long frames );
static signed long GetStreamReadAvailable( PaStream* stream );
static signed long GetStreamWriteAvailable( PaStream* stream );
/* Utility functions */
static unsigned long GetWfexSize(const WAVEFORMATEX* wfex);
-static PaError BuildFilterList(PaWinWdmHostApiRepresentation* wdmHostApi);
+static PaWinWdmFilter** BuildFilterList(int* filterCount, int* noOfPaDevices, PaError* result);
static BOOL PinWrite(HANDLE h, DATAPACKET* p);
static BOOL PinRead(HANDLE h, DATAPACKET* p);
static void DuplicateFirstChannelInt16(void* buffer, int channels, int samples);
static void DuplicateFirstChannelInt24(void* buffer, int channels, int samples);
-static DWORD WINAPI ProcessingThread(LPVOID pParam);
+PA_THREAD_FUNC ProcessingThread(void*);
+
+/* Pin handler functions */
+static PaError PaPinCaptureEventHandler_WaveCyclic(PaProcessThreadInfo* pInfo, unsigned eventIndex);
+static PaError PaPinCaptureSubmitHandler_WaveCyclic(PaProcessThreadInfo* pInfo, unsigned eventIndex);
+
+static PaError PaPinRenderEventHandler_WaveCyclic(PaProcessThreadInfo* pInfo, unsigned eventIndex);
+static PaError PaPinRenderSubmitHandler_WaveCyclic(PaProcessThreadInfo* pInfo, unsigned eventIndex);
+
+static PaError PaPinCaptureEventHandler_WaveRTEvent(PaProcessThreadInfo* pInfo, unsigned eventIndex);
+static PaError PaPinCaptureEventHandler_WaveRTPolled(PaProcessThreadInfo* pInfo, unsigned eventIndex);
+static PaError PaPinCaptureSubmitHandler_WaveRTEvent(PaProcessThreadInfo* pInfo, unsigned eventIndex);
+static PaError PaPinCaptureSubmitHandler_WaveRTPolled(PaProcessThreadInfo* pInfo, unsigned eventIndex);
+
+static PaError PaPinRenderEventHandler_WaveRTEvent(PaProcessThreadInfo* pInfo, unsigned eventIndex);
+static PaError PaPinRenderEventHandler_WaveRTPolled(PaProcessThreadInfo* pInfo, unsigned eventIndex);
+static PaError PaPinRenderSubmitHandler_WaveRTEvent(PaProcessThreadInfo* pInfo, unsigned eventIndex);
+static PaError PaPinRenderSubmitHandler_WaveRTPolled(PaProcessThreadInfo* pInfo, unsigned eventIndex);
/* Function bodies */
+#if defined(_DEBUG) && defined(PA_ENABLE_DEBUG_OUTPUT)
+#define PA_WDMKS_SET_TREF
+static PaTime tRef = 0;
+
+static void PaWinWdmDebugPrintf(const char* fmt, ...)
+{
+ va_list list;
+ char buffer[1024];
+ PaTime t = PaUtil_GetTime() - tRef;
+ va_start(list, fmt);
+ _vsnprintf(buffer, 1023, fmt, list);
+ va_end(list);
+ PaUtil_DebugPrint("%6.3lf: %s", t, buffer);
+}
+
+#ifdef PA_DEBUG
+#undef PA_DEBUG
+#define PA_DEBUG(x) PaWinWdmDebugPrintf x ;
+#endif
+#endif
+
+static BOOL IsDeviceTheSame(const PaWinWdmDeviceInfo* pDev1,
+ const PaWinWdmDeviceInfo* pDev2)
+{
+ if (pDev1 == NULL || pDev2 == NULL)
+ return FALSE;
+
+ if (pDev1 == pDev2)
+ return TRUE;
+
+ if (strcmp(pDev1->compositeName, pDev2->compositeName) == 0)
+ return TRUE;
+
+ return FALSE;
+}
+
+static BOOL IsEarlierThanVista()
+{
+ OSVERSIONINFO osvi;
+ osvi.dwOSVersionInfoSize = sizeof(osvi);
+ if (GetVersionEx(&osvi) && osvi.dwMajorVersion<6)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+
+static void MemoryBarrierDummy(void)
+{
+ /* Do nothing */
+}
+
+static void MemoryBarrierRead(void)
+{
+ PaUtil_ReadMemoryBarrier();
+}
+
+static void MemoryBarrierWrite(void)
+{
+ PaUtil_WriteMemoryBarrier();
+}
+
static unsigned long GetWfexSize(const WAVEFORMATEX* wfex)
{
if( wfex->wFormatTag == WAVE_FORMAT_PCM )
@@ -402,90 +652,67 @@ static unsigned long GetWfexSize(const WAVEFORMATEX* wfex)
}
}
+static void PaWinWDM_SetLastErrorInfo(long errCode, const char* fmt, ...)
+{
+ va_list list;
+ char buffer[1024];
+ va_start(list, fmt);
+ _vsnprintf(buffer, 1023, fmt, list);
+ va_end(list);
+ PaUtil_SetLastHostErrorInfo(paWDMKS, errCode, buffer);
+}
+
/*
Low level pin/filter access functions
*/
static PaError WdmSyncIoctl(
- HANDLE handle,
- unsigned long ioctlNumber,
- void* inBuffer,
- unsigned long inBufferCount,
- void* outBuffer,
- unsigned long outBufferCount,
- unsigned long* bytesReturned)
+ HANDLE handle,
+ unsigned long ioctlNumber,
+ void* inBuffer,
+ unsigned long inBufferCount,
+ void* outBuffer,
+ unsigned long outBufferCount,
+ unsigned long* bytesReturned)
{
PaError result = paNoError;
- OVERLAPPED overlapped;
- int boolResult;
- unsigned long dummyBytesReturned;
- unsigned long error;
+ unsigned long dummyBytesReturned = 0;
+ BOOL bRes;
if( !bytesReturned )
{
- /* User a dummy as the caller hasn't supplied one */
+ /* Use a dummy as the caller hasn't supplied one */
bytesReturned = &dummyBytesReturned;
}
- FillMemory((void *)&overlapped,sizeof(overlapped),0);
- overlapped.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
- if( !overlapped.hEvent )
+ bRes = DeviceIoControl(handle, ioctlNumber, inBuffer, inBufferCount, outBuffer, outBufferCount, bytesReturned, NULL);
+ if (!bRes)
{
- result = paInsufficientMemory;
- goto error;
- }
- overlapped.hEvent = (HANDLE)((DWORD_PTR)overlapped.hEvent | 0x1);
-
- boolResult = DeviceIoControl(handle, ioctlNumber, inBuffer, inBufferCount,
- outBuffer, outBufferCount, bytesReturned, &overlapped);
- if( !boolResult )
- {
- error = GetLastError();
- if( error == ERROR_IO_PENDING )
- {
- error = WaitForSingleObject(overlapped.hEvent,INFINITE);
- if( error != WAIT_OBJECT_0 )
- {
- result = paUnanticipatedHostError;
- goto error;
- }
- }
- else if((( error == ERROR_INSUFFICIENT_BUFFER ) ||
- ( error == ERROR_MORE_DATA )) &&
- ( ioctlNumber == IOCTL_KS_PROPERTY ) &&
- ( outBufferCount == 0 ))
- {
- boolResult = TRUE;
- }
- else
+ unsigned long error = GetLastError();
+ if ( !(((error == ERROR_INSUFFICIENT_BUFFER ) || ( error == ERROR_MORE_DATA )) &&
+ ( ioctlNumber == IOCTL_KS_PROPERTY ) &&
+ ( outBufferCount == 0 ) ) )
{
+ PaWinWDM_SetLastErrorInfo(result, "WdmSyncIoctl: DeviceIoControl GLE = 0x%08X", error);
result = paUnanticipatedHostError;
}
}
- if( !boolResult )
- *bytesReturned = 0;
-
-error:
- if( overlapped.hEvent )
- {
- CloseHandle( overlapped.hEvent );
- }
return result;
}
static PaError WdmGetPropertySimple(HANDLE handle,
- const GUID* const guidPropertySet,
- unsigned long property,
- void* value,
- unsigned long valueCount,
- void* instance,
- unsigned long instanceCount)
+ const GUID* const guidPropertySet,
+ unsigned long property,
+ void* value,
+ unsigned long valueCount,
+ void* instance,
+ unsigned long instanceCount)
{
PaError result;
KSPROPERTY* ksProperty;
unsigned long propertyCount;
propertyCount = sizeof(KSPROPERTY) + instanceCount;
- ksProperty = (KSPROPERTY*)PaUtil_AllocateMemory( propertyCount );
+ ksProperty = (KSPROPERTY*)_alloca( propertyCount );
if( !ksProperty )
{
return paInsufficientMemory;
@@ -502,33 +729,32 @@ static PaError WdmGetPropertySimple(HANDLE handle,
}
result = WdmSyncIoctl(
- handle,
- IOCTL_KS_PROPERTY,
- ksProperty,
- propertyCount,
- value,
- valueCount,
- NULL);
+ handle,
+ IOCTL_KS_PROPERTY,
+ ksProperty,
+ propertyCount,
+ value,
+ valueCount,
+ NULL);
- PaUtil_FreeMemory( ksProperty );
return result;
}
static PaError WdmSetPropertySimple(
- HANDLE handle,
- const GUID* const guidPropertySet,
- unsigned long property,
- void* value,
- unsigned long valueCount,
- void* instance,
- unsigned long instanceCount)
+ HANDLE handle,
+ const GUID* const guidPropertySet,
+ unsigned long property,
+ void* value,
+ unsigned long valueCount,
+ void* instance,
+ unsigned long instanceCount)
{
PaError result;
KSPROPERTY* ksProperty;
unsigned long propertyCount = 0;
propertyCount = sizeof(KSPROPERTY) + instanceCount;
- ksProperty = (KSPROPERTY*)PaUtil_AllocateMemory( propertyCount );
+ ksProperty = (KSPROPERTY*)_alloca( propertyCount );
if( !ksProperty )
{
return paInsufficientMemory;
@@ -544,25 +770,25 @@ static PaError WdmSetPropertySimple(
}
result = WdmSyncIoctl(
- handle,
- IOCTL_KS_PROPERTY,
- ksProperty,
- propertyCount,
- value,
- valueCount,
- NULL);
+ handle,
+ IOCTL_KS_PROPERTY,
+ ksProperty,
+ propertyCount,
+ value,
+ valueCount,
+ NULL);
- PaUtil_FreeMemory( ksProperty );
return result;
}
static PaError WdmGetPinPropertySimple(
- HANDLE handle,
- unsigned long pinId,
- const GUID* const guidPropertySet,
- unsigned long property,
- void* value,
- unsigned long valueCount)
+ HANDLE handle,
+ unsigned long pinId,
+ const GUID* const guidPropertySet,
+ unsigned long property,
+ void* value,
+ unsigned long valueCount,
+ unsigned long *byteCount)
{
PaError result;
@@ -574,23 +800,23 @@ static PaError WdmGetPinPropertySimple(
ksPProp.Reserved = 0;
result = WdmSyncIoctl(
- handle,
- IOCTL_KS_PROPERTY,
- &ksPProp,
- sizeof(KSP_PIN),
- value,
- valueCount,
- NULL);
+ handle,
+ IOCTL_KS_PROPERTY,
+ &ksPProp,
+ sizeof(KSP_PIN),
+ value,
+ valueCount,
+ byteCount);
return result;
}
static PaError WdmGetPinPropertyMulti(
- HANDLE handle,
- unsigned long pinId,
- const GUID* const guidPropertySet,
- unsigned long property,
- KSMULTIPLE_ITEM** ksMultipleItem)
+ HANDLE handle,
+ unsigned long pinId,
+ const GUID* const guidPropertySet,
+ unsigned long property,
+ KSMULTIPLE_ITEM** ksMultipleItem)
{
PaError result;
unsigned long multipleItemSize = 0;
@@ -603,13 +829,13 @@ static PaError WdmGetPinPropertyMulti(
ksPProp.Reserved = 0;
result = WdmSyncIoctl(
- handle,
- IOCTL_KS_PROPERTY,
- &ksPProp.Property,
- sizeof(KSP_PIN),
- NULL,
- 0,
- &multipleItemSize);
+ handle,
+ IOCTL_KS_PROPERTY,
+ &ksPProp.Property,
+ sizeof(KSP_PIN),
+ NULL,
+ 0,
+ &multipleItemSize);
if( result != paNoError )
{
return result;
@@ -622,13 +848,13 @@ static PaError WdmGetPinPropertyMulti(
}
result = WdmSyncIoctl(
- handle,
- IOCTL_KS_PROPERTY,
- &ksPProp,
- sizeof(KSP_PIN),
- (void*)*ksMultipleItem,
- multipleItemSize,
- NULL);
+ handle,
+ IOCTL_KS_PROPERTY,
+ &ksPProp,
+ sizeof(KSP_PIN),
+ (void*)*ksMultipleItem,
+ multipleItemSize,
+ NULL);
if( result != paNoError )
{
@@ -638,6 +864,398 @@ static PaError WdmGetPinPropertyMulti(
return result;
}
+static PaError WdmGetPropertyMulti(HANDLE handle,
+ const GUID* const guidPropertySet,
+ unsigned long property,
+ KSMULTIPLE_ITEM** ksMultipleItem)
+{
+ PaError result;
+ unsigned long multipleItemSize = 0;
+ KSPROPERTY ksProp;
+
+ ksProp.Set = *guidPropertySet;
+ ksProp.Id = property;
+ ksProp.Flags = KSPROPERTY_TYPE_GET;
+
+ result = WdmSyncIoctl(
+ handle,
+ IOCTL_KS_PROPERTY,
+ &ksProp,
+ sizeof(KSPROPERTY),
+ NULL,
+ 0,
+ &multipleItemSize);
+ if( result != paNoError )
+ {
+ return result;
+ }
+
+ *ksMultipleItem = (KSMULTIPLE_ITEM*)PaUtil_AllocateMemory( multipleItemSize );
+ if( !*ksMultipleItem )
+ {
+ return paInsufficientMemory;
+ }
+
+ result = WdmSyncIoctl(
+ handle,
+ IOCTL_KS_PROPERTY,
+ &ksProp,
+ sizeof(KSPROPERTY),
+ (void*)*ksMultipleItem,
+ multipleItemSize,
+ NULL);
+
+ if( result != paNoError )
+ {
+ PaUtil_FreeMemory( ksMultipleItem );
+ }
+
+ return result;
+}
+
+static PaError WdmSetMuxNodeProperty(HANDLE handle,
+ ULONG nodeId,
+ ULONG pinId)
+{
+ PaError result = paNoError;
+ KSNODEPROPERTY prop;
+ prop.Property.Set = KSPROPSETID_Audio;
+ prop.Property.Id = KSPROPERTY_AUDIO_MUX_SOURCE;
+ prop.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY;
+ prop.NodeId = nodeId;
+ prop.Reserved = 0;
+
+ result = WdmSyncIoctl(handle, IOCTL_KS_PROPERTY, &prop, sizeof(KSNODEPROPERTY), &pinId, sizeof(ULONG), NULL);
+
+ return result;
+}
+
+/* Used when traversing topology for outputs */
+static const KSTOPOLOGY_CONNECTION* GetConnectionTo(const KSTOPOLOGY_CONNECTION* pFrom, PaWinWdmFilter* filter, int muxIdx)
+{
+ unsigned i;
+ const KSTOPOLOGY_CONNECTION* retval = NULL;
+ const KSTOPOLOGY_CONNECTION* connections = (const KSTOPOLOGY_CONNECTION*)(filter->connections + 1);
+ (void)muxIdx;
+ PA_DEBUG(("GetConnectionTo: Checking %u connections... (pFrom = %p)", filter->connections->Count, pFrom));
+ for (i = 0; i < filter->connections->Count; ++i)
+ {
+ const KSTOPOLOGY_CONNECTION* pConn = connections + i;
+ if (pConn == pFrom)
+ continue;
+
+ if (pConn->FromNode == pFrom->ToNode)
+ {
+ retval = pConn;
+ break;
+ }
+ }
+ PA_DEBUG(("GetConnectionTo: Returning %p\n", retval));
+ return retval;
+}
+
+/* Used when traversing topology for inputs */
+static const KSTOPOLOGY_CONNECTION* GetConnectionFrom(const KSTOPOLOGY_CONNECTION* pTo, PaWinWdmFilter* filter, int muxIdx)
+{
+ unsigned i;
+ const KSTOPOLOGY_CONNECTION* retval = NULL;
+ const KSTOPOLOGY_CONNECTION* connections = (const KSTOPOLOGY_CONNECTION*)(filter->connections + 1);
+ int muxCntr = 0;
+ PA_DEBUG(("GetConnectionFrom: Checking %u connections... (pTo = %p)\n", filter->connections->Count, pTo));
+ for (i = 0; i < filter->connections->Count; ++i)
+ {
+ const KSTOPOLOGY_CONNECTION* pConn = connections + i;
+ if (pConn == pTo)
+ continue;
+
+ if (pConn->ToNode == pTo->FromNode)
+ {
+ if (muxIdx >= 0)
+ {
+ if (muxCntr < muxIdx)
+ {
+ ++muxCntr;
+ continue;
+ }
+ }
+ retval = pConn;
+ break;
+ }
+ }
+ PA_DEBUG(("GetConnectionFrom: Returning %p\n", retval));
+ return retval;
+}
+
+static ULONG GetNumberOfConnectionsTo(const KSTOPOLOGY_CONNECTION* pTo, PaWinWdmFilter* filter)
+{
+ ULONG retval = 0;
+ unsigned i;
+ const KSTOPOLOGY_CONNECTION* connections = (const KSTOPOLOGY_CONNECTION*)(filter->connections + 1);
+ PA_DEBUG(("GetNumberOfConnectionsTo: Checking %u connections...", filter->connections->Count));
+ for (i = 0; i < filter->connections->Count; ++i)
+ {
+ const KSTOPOLOGY_CONNECTION* pConn = connections + i;
+ if (pConn->ToNode == pTo->FromNode &&
+ (pTo->FromNode != KSFILTER_NODE || pConn->ToNodePin == pTo->FromNodePin))
+ {
+ ++retval;
+ }
+ }
+ return retval;
+}
+
+typedef const KSTOPOLOGY_CONNECTION *(*TFnGetConnection)(const KSTOPOLOGY_CONNECTION*, PaWinWdmFilter*, int);
+
+static const KSTOPOLOGY_CONNECTION* FindStartConnectionFrom(ULONG startPin, PaWinWdmFilter* filter)
+{
+ unsigned i;
+ const KSTOPOLOGY_CONNECTION* connections = (const KSTOPOLOGY_CONNECTION*)(filter->connections + 1);
+ PA_DEBUG(("FindStartConnectionFrom: Checking %u connections...", filter->connections->Count));
+ for (i = 0; i < filter->connections->Count; ++i)
+ {
+ const KSTOPOLOGY_CONNECTION* pConn = connections + i;
+ if (pConn->ToNode == KSFILTER_NODE && pConn->ToNodePin == startPin)
+ {
+ return pConn;
+ }
+ }
+
+ assert(FALSE);
+ return 0;
+}
+
+static const KSTOPOLOGY_CONNECTION* FindStartConnectionTo(ULONG startPin, PaWinWdmFilter* filter)
+{
+ unsigned i;
+ const KSTOPOLOGY_CONNECTION* connections = (const KSTOPOLOGY_CONNECTION*)(filter->connections + 1);
+ PA_DEBUG(("FindStartConnectionTo: Checking %u connections...", filter->connections->Count));
+ for (i = 0; i < filter->connections->Count; ++i)
+ {
+ const KSTOPOLOGY_CONNECTION* pConn = connections + i;
+ if (pConn->FromNode == KSFILTER_NODE && pConn->FromNodePin == startPin)
+ {
+ return pConn;
+ }
+ }
+
+ assert(FALSE);
+ return 0;
+}
+
+static ULONG GetConnectedPin(ULONG startPin, BOOL forward, PaWinWdmFilter* filter, int muxPosition, ULONG *muxInputPinId, ULONG *muxNodeId)
+{
+ const KSTOPOLOGY_CONNECTION *conn = NULL;
+ TFnGetConnection fnGetConnection = forward ? GetConnectionTo : GetConnectionFrom ;
+ while (1)
+ {
+ if (conn == NULL)
+ {
+ conn = forward ? FindStartConnectionTo(startPin, filter) : FindStartConnectionFrom(startPin, filter);
+ }
+ else
+ {
+ conn = fnGetConnection(conn, filter, -1);
+ }
+
+ /* Handling case of erroneous connection list */
+ if (conn == NULL)
+ {
+ break;
+ }
+
+ if (forward ? conn->ToNode == KSFILTER_NODE : conn->FromNode == KSFILTER_NODE)
+ {
+ return forward ? conn->ToNodePin : conn->FromNodePin;
+ }
+ else
+ {
+ PA_DEBUG(("GetConnectedPin: count=%d, forward=%d, muxPosition=%d\n", filter->nodes->Count, forward, muxPosition));
+ if (filter->nodes->Count > 0 && !forward && muxPosition >= 0)
+ {
+ const GUID* nodes = (const GUID*)(filter->nodes + 1);
+ if (IsEqualGUID(&nodes[conn->FromNode], &KSNODETYPE_MUX))
+ {
+ ULONG nConn = GetNumberOfConnectionsTo(conn, filter);
+ conn = fnGetConnection(conn, filter, muxPosition);
+ if (conn == NULL)
+ {
+ break;
+ }
+ if (muxInputPinId != 0)
+ {
+ *muxInputPinId = conn->ToNodePin;
+ }
+ if (muxNodeId != 0)
+ {
+ *muxNodeId = conn->ToNode;
+ }
+ }
+ }
+ }
+ }
+ return KSFILTER_NODE;
+}
+
+static void DumpConnectionsAndNodes(PaWinWdmFilter* filter)
+{
+ unsigned i;
+ const KSTOPOLOGY_CONNECTION* connections = (const KSTOPOLOGY_CONNECTION*)(filter->connections + 1);
+ const GUID* nodes = (const GUID*)(filter->nodes + 1);
+
+ PA_DEBUG(("DumpConnectionsAndNodes: connections=%d, nodes=%d\n", filter->connections->Count, filter->nodes->Count));
+
+ for (i=0; i < filter->connections->Count; ++i)
+ {
+ const KSTOPOLOGY_CONNECTION* pConn = connections + i;
+ PA_DEBUG((" Connection: %u - FromNode=%u,FromPin=%u -> ToNode=%u,ToPin=%u\n",
+ i,
+ pConn->FromNode, pConn->FromNodePin,
+ pConn->ToNode, pConn->ToNodePin
+ ));
+ }
+
+ for (i=0; i < filter->nodes->Count; ++i)
+ {
+ const GUID* pConn = nodes + i;
+ PA_DEBUG((" Node: %d - {%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}\n",
+ i,
+ pConn->Data1, pConn->Data2, pConn->Data3,
+ pConn->Data4[0], pConn->Data4[1],
+ pConn->Data4[2], pConn->Data4[3],
+ pConn->Data4[4], pConn->Data4[5],
+ pConn->Data4[6], pConn->Data4[7]
+ ));
+ }
+
+}
+
+typedef struct __PaUsbTerminalGUIDToName
+{
+ USHORT usbGUID;
+ wchar_t name[64];
+} PaUsbTerminalGUIDToName;
+
+static const PaUsbTerminalGUIDToName kNames[] =
+{
+ /* Types copied from: http://msdn.microsoft.com/en-us/library/ff537742(v=vs.85).aspx */
+ /* Input terminal types */
+ { 0x0201, L"Microphone" },
+ { 0x0202, L"Desktop Microphone" },
+ { 0x0203, L"Personal Microphone" },
+ { 0x0204, L"Omni Directional Microphone" },
+ { 0x0205, L"Microphone Array" },
+ { 0x0206, L"Processing Microphone Array" },
+ /* Output terminal types */
+ { 0x0301, L"Speakers" },
+ { 0x0302, L"Headphones" },
+ { 0x0303, L"Head Mounted Display Audio" },
+ { 0x0304, L"Desktop Speaker" },
+ { 0x0305, L"Room Speaker" },
+ { 0x0306, L"Communication Speaker" },
+ { 0x0307, L"LFE Speakers" },
+ /* External terminal types */
+ { 0x0601, L"Analog" },
+ { 0x0602, L"Digital" },
+ { 0x0603, L"Line" },
+ { 0x0604, L"Audio" },
+ { 0x0605, L"SPDIF" },
+};
+
+static const unsigned kNamesCnt = sizeof(kNames)/sizeof(PaUsbTerminalGUIDToName);
+
+static int PaUsbTerminalGUIDToNameCmp(const void* lhs, const void* rhs)
+{
+ const PaUsbTerminalGUIDToName* pL = (const PaUsbTerminalGUIDToName*)lhs;
+ const PaUsbTerminalGUIDToName* pR = (const PaUsbTerminalGUIDToName*)rhs;
+ return ((int)(pL->usbGUID) - (int)(pR->usbGUID));
+}
+
+static PaError GetNameFromCategory(const GUID* pGUID, BOOL input, wchar_t* name, unsigned length)
+{
+ PaError result = paUnanticipatedHostError;
+ USHORT usbTerminalGUID = (USHORT)(pGUID->Data1 - 0xDFF219E0);
+
+ if (input && usbTerminalGUID >= 0x301 && usbTerminalGUID < 0x400)
+ {
+ /* Output terminal name for an input !? Set it to Line! */
+ usbTerminalGUID = 0x603;
+ }
+ if (!input && usbTerminalGUID >= 0x201 && usbTerminalGUID < 0x300)
+ {
+ /* Input terminal name for an output !? Set it to Line! */
+ usbTerminalGUID = 0x603;
+ }
+ if (usbTerminalGUID >= 0x201 && usbTerminalGUID < 0x713)
+ {
+ PaUsbTerminalGUIDToName s = { usbTerminalGUID };
+ const PaUsbTerminalGUIDToName* ptr = bsearch(
+ &s,
+ kNames,
+ kNamesCnt,
+ sizeof(PaUsbTerminalGUIDToName),
+ PaUsbTerminalGUIDToNameCmp
+ );
+ if (ptr != 0)
+ {
+ PA_DEBUG(("GetNameFromCategory: USB GUID %04X -> '%S'\n", usbTerminalGUID, ptr->name));
+
+ if (name != NULL && length > 0)
+ {
+ int n = _snwprintf(name, length, L"%s", ptr->name);
+ if (usbTerminalGUID >= 0x601 && usbTerminalGUID < 0x700)
+ {
+ _snwprintf(name + n, length - n, L" %s", (input ? L"In":L"Out"));
+ }
+ }
+ result = paNoError;
+ }
+ }
+ else
+ {
+ PaWinWDM_SetLastErrorInfo(result, "GetNameFromCategory: usbTerminalGUID = %04X ", usbTerminalGUID);
+ }
+ return result;
+}
+
+static BOOL IsFrequencyWithinRange(const KSDATARANGE_AUDIO* range, int frequency)
+{
+ if (frequency < (int)range->MinimumSampleFrequency)
+ return FALSE;
+ if (frequency > (int)range->MaximumSampleFrequency)
+ return FALSE;
+ return TRUE;
+}
+
+static BOOL IsBitsWithinRange(const KSDATARANGE_AUDIO* range, int noOfBits)
+{
+ if (noOfBits < (int)range->MinimumBitsPerSample)
+ return FALSE;
+ if (noOfBits > (int)range->MaximumBitsPerSample)
+ return FALSE;
+ return TRUE;
+}
+
+/* Note: Somewhat different order compared to WMME implementation, as we want to focus on fidelity first */
+static const int defaultSampleRateSearchOrder[] =
+{ 44100, 48000, 88200, 96000, 192000, 32000, 24000, 22050, 16000, 12000, 11025, 9600, 8000 };
+static const int defaultSampleRateSearchOrderCount = sizeof(defaultSampleRateSearchOrder)/sizeof(defaultSampleRateSearchOrder[0]);
+
+static int DefaultSampleFrequencyIndex(const KSDATARANGE_AUDIO* range)
+{
+ int i;
+
+ for(i=0; i < defaultSampleRateSearchOrderCount; ++i)
+ {
+ int currentFrequency = defaultSampleRateSearchOrder[i];
+
+ if (IsFrequencyWithinRange(range, currentFrequency))
+ {
+ return i;
+ }
+ }
+
+ return -1;
+}
/*
Create a new pin object belonging to a filter
@@ -652,9 +1270,11 @@ static PaWinWdmPin* PinNew(PaWinWdmFilter* parentFilter, unsigned long pinId, Pa
KSMULTIPLE_ITEM* item = NULL;
KSIDENTIFIER* identifier;
KSDATARANGE* dataRange;
+ const ULONG streamingId = (parentFilter->devInfo.streamingType == Type_kWaveRT) ? KSINTERFACE_STANDARD_LOOPED_STREAMING : KSINTERFACE_STANDARD_STREAMING;
+ int defaultSampleRateIndex = defaultSampleRateSearchOrderCount;
PA_LOGE_;
- PA_DEBUG(("Creating pin %d:\n",pinId));
+ PA_DEBUG(("PinNew: Creating pin %d:\n",pinId));
/* Allocate the new PIN object */
pin = (PaWinWdmPin*)PaUtil_AllocateMemory( sizeof(PaWinWdmPin) );
@@ -681,7 +1301,7 @@ static PaWinWdmPin* PinNew(PaWinWdmFilter* parentFilter, unsigned long pinId, Pa
/* Configure the connect structure with default values */
pin->pinConnect->Interface.Set = KSINTERFACESETID_Standard;
- pin->pinConnect->Interface.Id = KSINTERFACE_STANDARD_STREAMING;
+ pin->pinConnect->Interface.Id = streamingId;
pin->pinConnect->Interface.Flags = 0;
pin->pinConnect->Medium.Set = KSMEDIUMSETID_Standard;
pin->pinConnect->Medium.Id = KSMEDIUM_TYPE_ANYINSTANCE;
@@ -707,15 +1327,16 @@ static PaWinWdmPin* PinNew(PaWinWdmFilter* parentFilter, unsigned long pinId, Pa
&KSPROPSETID_Pin,
KSPROPERTY_PIN_COMMUNICATION,
&pin->communication,
- sizeof(KSPIN_COMMUNICATION));
+ sizeof(KSPIN_COMMUNICATION),
+ NULL);
if( result != paNoError )
goto error;
if( /*(pin->communication != KSPIN_COMMUNICATION_SOURCE) &&*/
- (pin->communication != KSPIN_COMMUNICATION_SINK) &&
- (pin->communication != KSPIN_COMMUNICATION_BOTH) )
+ (pin->communication != KSPIN_COMMUNICATION_SINK) &&
+ (pin->communication != KSPIN_COMMUNICATION_BOTH) )
{
- PA_DEBUG(("Not source/sink\n"));
+ PA_DEBUG(("PinNew: Not source/sink\n"));
result = paInvalidDevice;
goto error;
}
@@ -727,7 +1348,8 @@ static PaWinWdmPin* PinNew(PaWinWdmFilter* parentFilter, unsigned long pinId, Pa
&KSPROPSETID_Pin,
KSPROPERTY_PIN_DATAFLOW,
&pin->dataFlow,
- sizeof(KSPIN_DATAFLOW));
+ sizeof(KSPIN_DATAFLOW),
+ NULL);
if( result != paNoError )
goto error;
@@ -749,8 +1371,7 @@ static PaWinWdmPin* PinNew(PaWinWdmFilter* parentFilter, unsigned long pinId, Pa
result = paUnanticipatedHostError;
for( i = 0; i < item->Count; i++ )
{
- if( !memcmp( (void*)&identifier[i].Set, (void*)&KSINTERFACESETID_Standard, sizeof( GUID ) ) &&
- ( identifier[i].Id == KSINTERFACE_STANDARD_STREAMING ) )
+ if( IsEqualGUID(&identifier[i].Set, &KSINTERFACESETID_Standard) && ( identifier[i].Id == streamingId ) )
{
result = paNoError;
break;
@@ -759,7 +1380,7 @@ static PaWinWdmPin* PinNew(PaWinWdmFilter* parentFilter, unsigned long pinId, Pa
if( result != paNoError )
{
- PA_DEBUG(("No standard streaming\n"));
+ PA_DEBUG(("PinNew: No %s streaming\n", streamingId==KSINTERFACE_STANDARD_LOOPED_STREAMING?"looped":"standard"));
goto error;
}
@@ -784,8 +1405,7 @@ static PaWinWdmPin* PinNew(PaWinWdmFilter* parentFilter, unsigned long pinId, Pa
result = paUnanticipatedHostError;
for( i = 0; i < item->Count; i++ )
{
- if( !memcmp( (void*)&identifier[i].Set, (void*)&KSMEDIUMSETID_Standard, sizeof( GUID ) ) &&
- ( identifier[i].Id == KSMEDIUM_STANDARD_DEVIO ) )
+ if( IsEqualGUID(&identifier[i].Set, &KSMEDIUMSETID_Standard) && ( identifier[i].Id == KSMEDIUM_STANDARD_DEVIO ) )
{
result = paNoError;
break;
@@ -818,53 +1438,66 @@ static PaWinWdmPin* PinNew(PaWinWdmFilter* parentFilter, unsigned long pinId, Pa
result = paUnanticipatedHostError;
dataRange = pin->dataRanges;
pin->maxChannels = 0;
- pin->bestSampleRate = 0;
+ pin->defaultSampleRate = 0;
pin->formats = 0;
- for( i = 0; i dataRangesItem->Count; i++)
+ PA_DEBUG(("PinNew: Checking %u no of dataranges...\n", pin->dataRangesItem->Count));
+ for( i = 0; i < pin->dataRangesItem->Count; i++)
{
- PA_DEBUG(("DR major format %x\n",*(unsigned long*)(&(dataRange->MajorFormat))));
+ PA_DEBUG(("PinNew: DR major format %x\n",*(unsigned long*)(&(dataRange->MajorFormat))));
/* Check that subformat is WAVEFORMATEX, PCM or WILDCARD */
if( IS_VALID_WAVEFORMATEX_GUID(&dataRange->SubFormat) ||
- !memcmp((void*)&dataRange->SubFormat, (void*)&KSDATAFORMAT_SUBTYPE_PCM, sizeof ( GUID ) ) ||
- ( !memcmp((void*)&dataRange->SubFormat, (void*)&KSDATAFORMAT_SUBTYPE_WILDCARD, sizeof ( GUID ) ) &&
- ( !memcmp((void*)&dataRange->MajorFormat, (void*)&KSDATAFORMAT_TYPE_AUDIO, sizeof ( GUID ) ) ) ) )
+ IsEqualGUID(&dataRange->SubFormat, &KSDATAFORMAT_SUBTYPE_PCM) ||
+ IsEqualGUID(&dataRange->SubFormat, &KSDATAFORMAT_SUBTYPE_IEEE_FLOAT) ||
+ IsEqualGUID(&dataRange->SubFormat, &KSDATAFORMAT_SUBTYPE_WILDCARD) ||
+ IsEqualGUID(&dataRange->MajorFormat, &KSDATAFORMAT_TYPE_AUDIO) )
{
+ int defaultIndex;
result = paNoError;
/* Record the maximum possible channels with this pin */
- PA_DEBUG(("MaxChannel: %d\n",pin->maxChannels));
- if( (int)((KSDATARANGE_AUDIO*)dataRange)->MaximumChannels > pin->maxChannels )
+ if( ((KSDATARANGE_AUDIO*)dataRange)->MaximumChannels == (ULONG) -1 )
{
- pin->maxChannels = ((KSDATARANGE_AUDIO*)dataRange)->MaximumChannels;
- /*PA_DEBUG(("MaxChannel: %d\n",pin->maxChannels));*/
+ pin->maxChannels = MAXIMUM_NUMBER_OF_CHANNELS;
}
+ else if( (int) ((KSDATARANGE_AUDIO*)dataRange)->MaximumChannels > pin->maxChannels )
+ {
+ pin->maxChannels = (int) ((KSDATARANGE_AUDIO*)dataRange)->MaximumChannels;
+ }
+ PA_DEBUG(("PinNew: MaxChannel: %d\n",pin->maxChannels));
+
/* Record the formats (bit depths) that are supported */
- if( ((KSDATARANGE_AUDIO*)dataRange)->MinimumBitsPerSample <= 16 )
+ if( IsBitsWithinRange((KSDATARANGE_AUDIO*)dataRange, 8) )
+ {
+ pin->formats |= paInt8;
+ PA_DEBUG(("PinNew: Format PCM 8 bit supported\n"));
+ }
+ if( IsBitsWithinRange((KSDATARANGE_AUDIO*)dataRange, 16) )
{
pin->formats |= paInt16;
- PA_DEBUG(("Format 16 bit supported\n"));
+ PA_DEBUG(("PinNew: Format PCM 16 bit supported\n"));
}
- if( ((KSDATARANGE_AUDIO*)dataRange)->MaximumBitsPerSample >= 24 )
+ if( IsBitsWithinRange((KSDATARANGE_AUDIO*)dataRange, 24) )
{
pin->formats |= paInt24;
- PA_DEBUG(("Format 24 bit supported\n"));
+ PA_DEBUG(("PinNew: Format PCM 24 bit supported\n"));
}
- if( ( pin->bestSampleRate != 48000) &&
- (((KSDATARANGE_AUDIO*)dataRange)->MaximumSampleFrequency >= 48000) &&
- (((KSDATARANGE_AUDIO*)dataRange)->MinimumSampleFrequency <= 48000) )
+ if( IsBitsWithinRange((KSDATARANGE_AUDIO*)dataRange, 32) )
{
- pin->bestSampleRate = 48000;
- PA_DEBUG(("48kHz supported\n"));
+ if (IsEqualGUID(&dataRange->SubFormat, &KSDATAFORMAT_SUBTYPE_IEEE_FLOAT))
+ {
+ pin->formats |= paFloat32;
+ PA_DEBUG(("PinNew: Format IEEE float 32 bit supported\n"));
+ }
+ else
+ {
+ pin->formats |= paInt32;
+ PA_DEBUG(("PinNew: Format PCM 32 bit supported\n"));
+ }
}
- else if(( pin->bestSampleRate != 48000) && ( pin->bestSampleRate != 44100 ) &&
- (((KSDATARANGE_AUDIO*)dataRange)->MaximumSampleFrequency >= 44100) &&
- (((KSDATARANGE_AUDIO*)dataRange)->MinimumSampleFrequency <= 44100) )
+
+ defaultIndex = DefaultSampleFrequencyIndex((KSDATARANGE_AUDIO*)dataRange);
+ if (defaultIndex >= 0 && defaultIndex < defaultSampleRateIndex)
{
- pin->bestSampleRate = 44100;
- PA_DEBUG(("44.1kHz supported\n"));
- }
- else
- {
- pin->bestSampleRate = ((KSDATARANGE_AUDIO*)dataRange)->MaximumSampleFrequency;
+ defaultSampleRateIndex = defaultIndex;
}
}
dataRange = (KSDATARANGE*)( ((char*)dataRange) + dataRange->FormatSize);
@@ -873,6 +1506,19 @@ static PaWinWdmPin* PinNew(PaWinWdmFilter* parentFilter, unsigned long pinId, Pa
if( result != paNoError )
goto error;
+ /* If none of the frequencies searched for are present, there's something seriously wrong */
+ if (defaultSampleRateIndex == defaultSampleRateSearchOrderCount)
+ {
+ PA_DEBUG(("PinNew: No default sample rate found, skipping pin!\n"));
+ PaWinWDM_SetLastErrorInfo(paUnanticipatedHostError, "PinNew: No default sample rate found");
+ result = paUnanticipatedHostError;
+ goto error;
+ }
+
+ /* Set the default sample rate */
+ pin->defaultSampleRate = defaultSampleRateSearchOrder[defaultSampleRateIndex];
+ PA_DEBUG(("PinNew: Default sample rate = %d Hz\n", pin->defaultSampleRate));
+
/* Get instance information */
result = WdmGetPinPropertySimple(
parentFilter->handle,
@@ -880,11 +1526,413 @@ static PaWinWdmPin* PinNew(PaWinWdmFilter* parentFilter, unsigned long pinId, Pa
&KSPROPSETID_Pin,
KSPROPERTY_PIN_CINSTANCES,
&pin->instances,
- sizeof(KSPIN_CINSTANCES));
+ sizeof(KSPIN_CINSTANCES),
+ NULL);
if( result != paNoError )
goto error;
+ /* If WaveRT, check if pin supports notification mode */
+ if (parentFilter->devInfo.streamingType == Type_kWaveRT)
+ {
+ BOOL bSupportsNotification = FALSE;
+ if (PinQueryNotificationSupport(pin, &bSupportsNotification) == paNoError)
+ {
+ pin->pinKsSubType = bSupportsNotification ? SubType_kNotification : SubType_kPolled;
+ }
+ }
+
+ /* Query pin name (which means we need to traverse to non IRP pin, via physical connection to topology filter pin, through
+ its nodes to the endpoint pin, and get that ones name... phew...) */
+ PA_DEBUG(("PinNew: Finding topology pin...\n"));
+
+ {
+ ULONG topoPinId = GetConnectedPin(pinId, (pin->dataFlow == KSPIN_DATAFLOW_IN), parentFilter, -1, NULL, NULL);
+ const wchar_t kInputName[] = L"Input";
+ const wchar_t kOutputName[] = L"Output";
+
+ if (topoPinId != KSFILTER_NODE)
+ {
+ /* Get physical connection for topo pin */
+ unsigned long cbBytes = 0;
+ PA_DEBUG(("PinNew: Getting physical connection...\n"));
+ result = WdmGetPinPropertySimple(parentFilter->handle,
+ topoPinId,
+ &KSPROPSETID_Pin,
+ KSPROPERTY_PIN_PHYSICALCONNECTION,
+ 0,
+ 0,
+ &cbBytes
+ );
+
+ if (result != paNoError)
+ {
+ /* No physical connection -> there is no topology filter! So we get the name of the pin! */
+ PA_DEBUG(("PinNew: No physical connection! Getting the pin name\n"));
+ result = WdmGetPinPropertySimple(parentFilter->handle,
+ topoPinId,
+ &KSPROPSETID_Pin,
+ KSPROPERTY_PIN_NAME,
+ pin->friendlyName,
+ MAX_PATH,
+ NULL);
+ if (result != paNoError)
+ {
+ GUID category = {0};
+
+ /* Get pin category information */
+ result = WdmGetPinPropertySimple(parentFilter->handle,
+ topoPinId,
+ &KSPROPSETID_Pin,
+ KSPROPERTY_PIN_CATEGORY,
+ &category,
+ sizeof(GUID),
+ NULL);
+
+ if (result == paNoError)
+ {
+ result = GetNameFromCategory(&category, (pin->dataFlow == KSPIN_DATAFLOW_OUT), pin->friendlyName, MAX_PATH);
+ }
+ }
+
+ /* Make sure pin gets a name here... */
+ if (wcslen(pin->friendlyName) == 0)
+ {
+ wcscpy(pin->friendlyName, (pin->dataFlow == KSPIN_DATAFLOW_IN) ? kOutputName : kInputName);
+#ifdef UNICODE
+ PA_DEBUG(("PinNew: Setting pin friendly name to '%s'\n", pin->friendlyName));
+#else
+ PA_DEBUG(("PinNew: Setting pin friendly name to '%S'\n", pin->friendlyName));
+#endif
+ }
+
+ /* This is then == the endpoint pin */
+ pin->endpointPinId = (pin->dataFlow == KSPIN_DATAFLOW_IN) ? pinId : topoPinId;
+ }
+ else
+ {
+ KSPIN_PHYSICALCONNECTION* pc = (KSPIN_PHYSICALCONNECTION*)PaUtil_AllocateMemory(cbBytes + 2);
+ PA_DEBUG(("PinNew: Physical connection found!\n"));
+ if (pc == NULL)
+ {
+ result = paInsufficientMemory;
+ goto error;
+ }
+ result = WdmGetPinPropertySimple(parentFilter->handle,
+ topoPinId,
+ &KSPROPSETID_Pin,
+ KSPROPERTY_PIN_PHYSICALCONNECTION,
+ pc,
+ cbBytes,
+ NULL
+ );
+ if (result == paNoError)
+ {
+ wchar_t symbLinkName[MAX_PATH];
+ wcsncpy(symbLinkName, pc->SymbolicLinkName, MAX_PATH);
+ if (symbLinkName[1] == TEXT('?'))
+ {
+ symbLinkName[1] = TEXT('\\');
+ }
+
+ if (pin->parentFilter->topologyFilter == NULL)
+ {
+ PA_DEBUG(("PinNew: Creating topology filter '%S'\n", symbLinkName));
+
+ pin->parentFilter->topologyFilter = FilterNew(Type_kNotUsed, 0, symbLinkName, L"", &result);
+ if (pin->parentFilter->topologyFilter == NULL)
+ {
+ PA_DEBUG(("PinNew: Failed creating topology filter\n"));
+ result = paUnanticipatedHostError;
+ PaWinWDM_SetLastErrorInfo(result, "Failed to create topology filter '%S'", symbLinkName);
+ goto error;
+ }
+
+ /* Copy info so we have it in device info */
+ wcsncpy(pin->parentFilter->devInfo.topologyPath, symbLinkName, MAX_PATH);
+ }
+ else
+ {
+ /* Must be the same */
+ assert(wcscmp(symbLinkName, pin->parentFilter->topologyFilter->devInfo.filterPath) == 0);
+ }
+
+ PA_DEBUG(("PinNew: Opening topology filter..."));
+
+ result = FilterUse(pin->parentFilter->topologyFilter);
+ if (result == paNoError)
+ {
+ unsigned long endpointPinId;
+
+ if (pin->dataFlow == KSPIN_DATAFLOW_IN)
+ {
+ /* The "endpointPinId" is what WASAPI looks at for pin names */
+ GUID category = {0};
+
+ PA_DEBUG(("PinNew: Checking for output endpoint pin id...\n"));
+
+ endpointPinId = GetConnectedPin(pc->Pin, TRUE, pin->parentFilter->topologyFilter, -1, NULL, NULL);
+
+ if (endpointPinId == KSFILTER_NODE)
+ {
+ result = paUnanticipatedHostError;
+ PaWinWDM_SetLastErrorInfo(result, "Failed to get endpoint pin ID on topology filter!");
+ goto error;
+ }
+
+ PA_DEBUG(("PinNew: Found endpoint pin id %u\n", endpointPinId));
+
+ /* Get pin category information */
+ result = WdmGetPinPropertySimple(pin->parentFilter->topologyFilter->handle,
+ endpointPinId,
+ &KSPROPSETID_Pin,
+ KSPROPERTY_PIN_CATEGORY,
+ &category,
+ sizeof(GUID),
+ NULL);
+
+ if (result == paNoError)
+ {
+#if !PA_WDMKS_USE_CATEGORY_FOR_PIN_NAMES
+ wchar_t pinName[MAX_PATH];
+
+ PA_DEBUG(("PinNew: Getting pin name property..."));
+
+ /* Ok, try pin name also, and favor that if available */
+ result = WdmGetPinPropertySimple(pin->parentFilter->topologyFilter->handle,
+ endpointPinId,
+ &KSPROPSETID_Pin,
+ KSPROPERTY_PIN_NAME,
+ pinName,
+ MAX_PATH,
+ NULL);
+
+ if (result == paNoError && wcslen(pinName)>0)
+ {
+ wcsncpy(pin->friendlyName, pinName, MAX_PATH);
+ }
+ else
+#endif
+ {
+ result = GetNameFromCategory(&category, (pin->dataFlow == KSPIN_DATAFLOW_OUT), pin->friendlyName, MAX_PATH);
+ }
+
+ if (wcslen(pin->friendlyName) == 0)
+ {
+ wcscpy(pin->friendlyName, L"Output");
+ }
+#ifdef UNICODE
+ PA_DEBUG(("PinNew: Pin name '%s'\n", pin->friendlyName));
+#else
+ PA_DEBUG(("PinNew: Pin name '%S'\n", pin->friendlyName));
+#endif
+ }
+
+ /* Set endpoint pin ID (this is the topology INPUT pin, since portmixer will always traverse the
+ filter in audio streaming direction, see http://msdn.microsoft.com/en-us/library/windows/hardware/ff536331(v=vs.85).aspx
+ for more information)
+ */
+ pin->endpointPinId = pc->Pin;
+ }
+ else
+ {
+ unsigned muxCount = 0;
+ int muxPos = 0;
+ /* Max 64 multiplexer inputs... sanity check :) */
+ for (i = 0; i < 64; ++i)
+ {
+ ULONG muxNodeIdTest = (unsigned)-1;
+ PA_DEBUG(("PinNew: Checking for input endpoint pin id (%d)...\n", i));
+
+ endpointPinId = GetConnectedPin(pc->Pin,
+ FALSE,
+ pin->parentFilter->topologyFilter,
+ (int)i,
+ NULL,
+ &muxNodeIdTest);
+
+
+ if (endpointPinId == KSFILTER_NODE)
+ {
+ /* We're done */
+ PA_DEBUG(("PinNew: Done with inputs.\n", endpointPinId));
+ break;
+ }
+ else
+ {
+ /* The "endpointPinId" is what WASAPI looks at for pin names */
+ GUID category = {0};
+
+ PA_DEBUG(("PinNew: Found endpoint pin id %u\n", endpointPinId));
+
+ /* Get pin category information */
+ result = WdmGetPinPropertySimple(pin->parentFilter->topologyFilter->handle,
+ endpointPinId,
+ &KSPROPSETID_Pin,
+ KSPROPERTY_PIN_CATEGORY,
+ &category,
+ sizeof(GUID),
+ NULL);
+
+ if (result == paNoError)
+ {
+ if (muxNodeIdTest == (unsigned)-1)
+ {
+ /* Ok, try pin name, and favor that if available */
+ result = WdmGetPinPropertySimple(pin->parentFilter->topologyFilter->handle,
+ endpointPinId,
+ &KSPROPSETID_Pin,
+ KSPROPERTY_PIN_NAME,
+ pin->friendlyName,
+ MAX_PATH,
+ NULL);
+
+ if (result != paNoError)
+ {
+ result = GetNameFromCategory(&category, TRUE, pin->friendlyName, MAX_PATH);
+ }
+ break;
+ }
+ else
+ {
+ result = GetNameFromCategory(&category, TRUE, NULL, 0);
+
+ if (result == paNoError)
+ {
+ ++muxCount;
+ }
+ }
+ }
+ else
+ {
+ PA_DEBUG(("PinNew: Failed to get pin category"));
+ }
+ }
+ }
+
+ if (muxCount == 0)
+ {
+ pin->endpointPinId = endpointPinId;
+ /* Make sure we get a name for the pin */
+ if (wcslen(pin->friendlyName) == 0)
+ {
+ wcscpy(pin->friendlyName, kInputName);
+ }
+#ifdef UNICODE
+ PA_DEBUG(("PinNew: Input friendly name '%s'\n", pin->friendlyName));
+#else
+ PA_DEBUG(("PinNew: Input friendly name '%S'\n", pin->friendlyName));
+#endif
+ }
+ else // muxCount > 0
+ {
+ PA_DEBUG(("PinNew: Setting up %u inputs\n", muxCount));
+
+ /* Now we redo the operation once known how many multiplexer positions there are */
+ pin->inputs = (PaWinWdmMuxedInput**)PaUtil_AllocateMemory(muxCount * sizeof(PaWinWdmMuxedInput*));
+ if (pin->inputs == NULL)
+ {
+ FilterRelease(pin->parentFilter->topologyFilter);
+ result = paInsufficientMemory;
+ goto error;
+ }
+ pin->inputCount = muxCount;
+
+ for (i = 0; i < muxCount; ++muxPos)
+ {
+ PA_DEBUG(("PinNew: Setting up input %u...\n", i));
+
+ if (pin->inputs[i] == NULL)
+ {
+ pin->inputs[i] = (PaWinWdmMuxedInput*)PaUtil_AllocateMemory(sizeof(PaWinWdmMuxedInput));
+ if (pin->inputs[i] == NULL)
+ {
+ FilterRelease(pin->parentFilter->topologyFilter);
+ result = paInsufficientMemory;
+ goto error;
+ }
+ }
+
+ endpointPinId = GetConnectedPin(pc->Pin,
+ FALSE,
+ pin->parentFilter->topologyFilter,
+ muxPos,
+ &pin->inputs[i]->muxPinId,
+ &pin->inputs[i]->muxNodeId);
+
+ if (endpointPinId != KSFILTER_NODE)
+ {
+ /* The "endpointPinId" is what WASAPI looks at for pin names */
+ GUID category = {0};
+
+ /* Set input endpoint ID */
+ pin->inputs[i]->endpointPinId = endpointPinId;
+
+ /* Get pin category information */
+ result = WdmGetPinPropertySimple(pin->parentFilter->topologyFilter->handle,
+ endpointPinId,
+ &KSPROPSETID_Pin,
+ KSPROPERTY_PIN_CATEGORY,
+ &category,
+ sizeof(GUID),
+ NULL);
+
+ if (result == paNoError)
+ {
+ /* Try pin name first, and if that is not defined, use category instead */
+ result = WdmGetPinPropertySimple(pin->parentFilter->topologyFilter->handle,
+ endpointPinId,
+ &KSPROPSETID_Pin,
+ KSPROPERTY_PIN_NAME,
+ pin->inputs[i]->friendlyName,
+ MAX_PATH,
+ NULL);
+
+ if (result != paNoError)
+ {
+ result = GetNameFromCategory(&category, TRUE, pin->inputs[i]->friendlyName, MAX_PATH);
+ if (result != paNoError)
+ {
+ /* Only specify name, let name hash in ScanDeviceInfos fix postfix enumerators */
+ wcscpy(pin->inputs[i]->friendlyName, kInputName);
+ }
+ }
+#ifdef UNICODE
+ PA_DEBUG(("PinNew: Input (%u) friendly name '%s'\n", i, pin->inputs[i]->friendlyName));
+#else
+ PA_DEBUG(("PinNew: Input (%u) friendly name '%S'\n", i, pin->inputs[i]->friendlyName));
+#endif
+ ++i;
+ }
+ }
+ else
+ {
+ /* Should never come here! */
+ assert(FALSE);
+ }
+ }
+ }
+ }
+ }
+ }
+ PaUtil_FreeMemory(pc);
+ }
+ }
+ else
+ {
+ PA_DEBUG(("PinNew: No topology pin id found. Bad...\n"));
+ /* No TOPO pin id ??? This is bad. Ok, so we just say it is an input or output... */
+ wcscpy(pin->friendlyName, (pin->dataFlow == KSPIN_DATAFLOW_IN) ? kOutputName : kInputName);
+ }
+ }
+
+ /* Release topology filter if it has been used */
+ if (pin->parentFilter->topologyFilter && pin->parentFilter->topologyFilter->handle != NULL)
+ {
+ PA_DEBUG(("PinNew: Releasing topology filter...\n"));
+ FilterRelease(pin->parentFilter->topologyFilter);
+ }
+
/* Success */
*error = paNoError;
PA_DEBUG(("Pin created successfully\n"));
@@ -892,12 +1940,19 @@ static PaWinWdmPin* PinNew(PaWinWdmFilter* parentFilter, unsigned long pinId, Pa
return pin;
error:
+ PA_DEBUG(("PinNew: Error %d\n", result));
/*
Error cleanup
*/
+
PaUtil_FreeMemory( item );
if( pin )
{
+ if (pin->parentFilter->topologyFilter && pin->parentFilter->topologyFilter->handle != NULL)
+ {
+ FilterRelease(pin->parentFilter->topologyFilter);
+ }
+
PaUtil_FreeMemory( pin->pinConnect );
PaUtil_FreeMemory( pin->dataRangesItem );
PaUtil_FreeMemory( pin );
@@ -912,6 +1967,7 @@ Safely free all resources associated with the pin
*/
static void PinFree(PaWinWdmPin* pin)
{
+ unsigned i;
PA_LOGE_;
if( pin )
{
@@ -924,6 +1980,14 @@ static void PinFree(PaWinWdmPin* pin)
{
PaUtil_FreeMemory( pin->dataRangesItem );
}
+ if( pin->inputs )
+ {
+ for (i = 0; i < pin->inputCount; ++i)
+ {
+ PaUtil_FreeMemory( pin->inputs[i] );
+ }
+ PaUtil_FreeMemory( pin->inputs );
+ }
PaUtil_FreeMemory( pin );
}
PA_LOGL_;
@@ -957,22 +2021,21 @@ Set the state of this (instantiated) pin
*/
static PaError PinSetState(PaWinWdmPin* pin, KSSTATE state)
{
- PaError result;
+ PaError result = paNoError;
+ KSPROPERTY prop;
PA_LOGE_;
+ prop.Set = KSPROPSETID_Connection;
+ prop.Id = KSPROPERTY_CONNECTION_STATE;
+ prop.Flags = KSPROPERTY_TYPE_SET;
+
if( pin == NULL )
return paInternalError;
if( pin->handle == NULL )
return paInternalError;
- result = WdmSetPropertySimple(
- pin->handle,
- &KSPROPSETID_Connection,
- KSPROPERTY_CONNECTION_STATE,
- &state,
- sizeof(state),
- NULL,
- 0);
+ result = WdmSyncIoctl(pin->handle, IOCTL_KS_PROPERTY, &prop, sizeof(KSPROPERTY), &state, sizeof(KSSTATE), NULL);
+
PA_LOGL_;
return result;
}
@@ -1000,41 +2063,56 @@ static PaError PinInstantiate(PaWinWdmPin* pin)
&pin->handle
);
- PA_DEBUG(("Pin create result = %x\n",createResult));
+ PA_DEBUG(("Pin create result = 0x%08x\n",createResult));
if( createResult != ERROR_SUCCESS )
{
FilterRelease(pin->parentFilter);
pin->handle = NULL;
- return paInvalidDevice;
+ switch (createResult)
+ {
+ case ERROR_INVALID_PARAMETER:
+ /* First case when pin actually don't support the format */
+ return paSampleFormatNotSupported;
+ case ERROR_BAD_COMMAND:
+ /* Case when pin is occupied (by another application) */
+ return paDeviceUnavailable;
+ default:
+ /* All other cases */
+ return paInvalidDevice;
+ }
}
- result = WdmGetPropertySimple(
- pin->handle,
- &KSPROPSETID_Connection,
- KSPROPERTY_CONNECTION_ALLOCATORFRAMING,
- &ksaf,
- sizeof(ksaf),
- NULL,
- 0);
-
- if( result != paNoError )
+ if (pin->parentFilter->devInfo.streamingType == Type_kWaveCyclic)
{
+ /* Framing size query only valid for WaveCyclic devices */
result = WdmGetPropertySimple(
pin->handle,
&KSPROPSETID_Connection,
- KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX,
- &ksafex,
- sizeof(ksafex),
+ KSPROPERTY_CONNECTION_ALLOCATORFRAMING,
+ &ksaf,
+ sizeof(ksaf),
NULL,
0);
- if( result == paNoError )
+
+ if( result != paNoError )
{
- pin->frameSize = ksafex.FramingItem[0].FramingRange.Range.MinFrameSize;
+ result = WdmGetPropertySimple(
+ pin->handle,
+ &KSPROPSETID_Connection,
+ KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX,
+ &ksafex,
+ sizeof(ksafex),
+ NULL,
+ 0);
+ if( result == paNoError )
+ {
+ pin->frameSize = ksafex.FramingItem[0].FramingRange.Range.MinFrameSize;
+ }
+ }
+ else
+ {
+ pin->frameSize = ksaf.FrameSize;
}
- }
- else
- {
- pin->frameSize = ksaf.FrameSize;
}
PA_LOGL_;
@@ -1042,30 +2120,6 @@ static PaError PinInstantiate(PaWinWdmPin* pin)
return paNoError;
}
-/* NOT USED
-static PaError PinGetState(PaWinWdmPin* pin, KSSTATE* state)
-{
- PaError result;
-
- if( state == NULL )
- return paInternalError;
- if( pin == NULL )
- return paInternalError;
- if( pin->handle == NULL )
- return paInternalError;
-
- result = WdmGetPropertySimple(
- pin->handle,
- KSPROPSETID_Connection,
- KSPROPERTY_CONNECTION_STATE,
- state,
- sizeof(KSSTATE),
- NULL,
- 0);
-
- return result;
-}
-*/
static PaError PinSetFormat(PaWinWdmPin* pin, const WAVEFORMATEX* format)
{
unsigned long size;
@@ -1107,65 +2161,285 @@ static PaError PinIsFormatSupported(PaWinWdmPin* pin, const WAVEFORMATEX* format
unsigned long count;
GUID guid = DYNAMIC_GUID( DEFINE_WAVEFORMATEX_GUID(format->wFormatTag) );
PaError result = paInvalidDevice;
+ const WAVEFORMATEXTENSIBLE* pFormatExt = (format->wFormatTag == WAVE_FORMAT_EXTENSIBLE) ? (const WAVEFORMATEXTENSIBLE*)format : 0;
PA_LOGE_;
- if( format->wFormatTag == WAVE_FORMAT_EXTENSIBLE )
+ if( pFormatExt != 0 )
{
- guid = ((WAVEFORMATEXTENSIBLE*)format)->SubFormat;
+ guid = pFormatExt->SubFormat;
}
dataRange = (KSDATARANGE_AUDIO*)pin->dataRanges;
- for(count = 0; countdataRangesItem->Count; count++)
+ for(count = 0;
+ countdataRangesItem->Count;
+ count++,
+ dataRange = (KSDATARANGE_AUDIO*)( ((char*)dataRange) + dataRange->DataRange.FormatSize)) /* Need to update dataRange here, due to 'continue' !! */
{
- if(( !memcmp(&(dataRange->DataRange.MajorFormat),&KSDATAFORMAT_TYPE_AUDIO,sizeof(GUID)) ) ||
- ( !memcmp(&(dataRange->DataRange.MajorFormat),&KSDATAFORMAT_TYPE_WILDCARD,sizeof(GUID)) ))
+ /* Check major format*/
+ if (!(IsEqualGUID(&(dataRange->DataRange.MajorFormat), &KSDATAFORMAT_TYPE_AUDIO) ||
+ IsEqualGUID(&(dataRange->DataRange.MajorFormat), &KSDATAFORMAT_TYPE_WILDCARD)))
{
- /* This is an audio or wildcard datarange... */
- if(( !memcmp(&(dataRange->DataRange.SubFormat),&KSDATAFORMAT_SUBTYPE_WILDCARD,sizeof(GUID)) ) ||
- ( !memcmp(&(dataRange->DataRange.SubFormat),&guid,sizeof(GUID)) ))
+ continue;
+ }
+
+ /* This is an audio or wildcard datarange... */
+ if (! (IsEqualGUID(&(dataRange->DataRange.SubFormat), &KSDATAFORMAT_SUBTYPE_WILDCARD) ||
+ IsEqualGUID(&(dataRange->DataRange.SubFormat), &KSDATAFORMAT_SUBTYPE_PCM) ||
+ IsEqualGUID(&(dataRange->DataRange.SubFormat), &guid) ))
+ {
+ continue;
+ }
+
+ /* Check specifier... */
+ if (! (IsEqualGUID(&(dataRange->DataRange.Specifier), &KSDATAFORMAT_SPECIFIER_WILDCARD) ||
+ IsEqualGUID(&(dataRange->DataRange.Specifier), &KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)) )
+ {
+ continue;
+ }
+
+ PA_DEBUG(("Pin:%x, DataRange:%d\n",(void*)pin,count));
+ PA_DEBUG(("\tFormatSize:%d, SampleSize:%d\n",dataRange->DataRange.FormatSize,dataRange->DataRange.SampleSize));
+ PA_DEBUG(("\tMaxChannels:%d\n",dataRange->MaximumChannels));
+ PA_DEBUG(("\tBits:%d-%d\n",dataRange->MinimumBitsPerSample,dataRange->MaximumBitsPerSample));
+ PA_DEBUG(("\tSampleRate:%d-%d\n",dataRange->MinimumSampleFrequency,dataRange->MaximumSampleFrequency));
+
+ if( dataRange->MaximumChannels != (ULONG)-1 &&
+ dataRange->MaximumChannels < format->nChannels )
+ {
+ result = paInvalidChannelCount;
+ continue;
+ }
+
+ if (pFormatExt != 0)
+ {
+ if ( dataRange->MinimumBitsPerSample > pFormatExt->Samples.wValidBitsPerSample )
{
- if(( !memcmp(&(dataRange->DataRange.Specifier),&KSDATAFORMAT_SPECIFIER_WILDCARD,sizeof(GUID)) ) ||
- ( !memcmp(&(dataRange->DataRange.Specifier),&KSDATAFORMAT_SPECIFIER_WAVEFORMATEX,sizeof(GUID) )))
- {
-
- PA_DEBUG(("Pin:%x, DataRange:%d\n",(void*)pin,count));
- PA_DEBUG(("\tFormatSize:%d, SampleSize:%d\n",dataRange->DataRange.FormatSize,dataRange->DataRange.SampleSize));
- PA_DEBUG(("\tMaxChannels:%d\n",dataRange->MaximumChannels));
- PA_DEBUG(("\tBits:%d-%d\n",dataRange->MinimumBitsPerSample,dataRange->MaximumBitsPerSample));
- PA_DEBUG(("\tSampleRate:%d-%d\n",dataRange->MinimumSampleFrequency,dataRange->MaximumSampleFrequency));
-
- if( dataRange->MaximumChannels < format->nChannels )
- {
- result = paInvalidChannelCount;
- continue;
- }
- if( dataRange->MinimumBitsPerSample > format->wBitsPerSample )
- {
- result = paSampleFormatNotSupported;
- continue;
- }
- if( dataRange->MaximumBitsPerSample < format->wBitsPerSample )
- {
- result = paSampleFormatNotSupported;
- continue;
- }
- if( dataRange->MinimumSampleFrequency > format->nSamplesPerSec )
- {
- result = paInvalidSampleRate;
- continue;
- }
- if( dataRange->MaximumSampleFrequency < format->nSamplesPerSec )
- {
- result = paInvalidSampleRate;
- continue;
- }
- /* Success! */
- PA_LOGL_;
- return paNoError;
- }
+ result = paSampleFormatNotSupported;
+ continue;
+ }
+ if ( dataRange->MaximumBitsPerSample < pFormatExt->Samples.wValidBitsPerSample )
+ {
+ result = paSampleFormatNotSupported;
+ continue;
}
}
- dataRange = (KSDATARANGE_AUDIO*)( ((char*)dataRange) + dataRange->DataRange.FormatSize);
+ else
+ {
+ if( dataRange->MinimumBitsPerSample > format->wBitsPerSample )
+ {
+ result = paSampleFormatNotSupported;
+ continue;
+ }
+
+ if( dataRange->MaximumBitsPerSample < format->wBitsPerSample )
+ {
+ result = paSampleFormatNotSupported;
+ continue;
+ }
+ }
+
+ if( dataRange->MinimumSampleFrequency > format->nSamplesPerSec )
+ {
+ result = paInvalidSampleRate;
+ continue;
+ }
+
+ if( dataRange->MaximumSampleFrequency < format->nSamplesPerSec )
+ {
+ result = paInvalidSampleRate;
+ continue;
+ }
+
+ /* Success! */
+ result = paNoError;
+ break;
+ }
+
+ PA_LOGL_;
+ return result;
+}
+
+static PaError PinQueryNotificationSupport(PaWinWdmPin* pPin, BOOL* pbResult)
+{
+ PaError result = paNoError;
+ KSPROPERTY propIn;
+
+ propIn.Set = KSPROPSETID_RtAudio;
+ propIn.Id = 8; /* = KSPROPERTY_RTAUDIO_QUERY_NOTIFICATION_SUPPORT */
+ propIn.Flags = KSPROPERTY_TYPE_GET;
+
+ result = WdmSyncIoctl(pPin->handle, IOCTL_KS_PROPERTY,
+ &propIn,
+ sizeof(KSPROPERTY),
+ pbResult,
+ sizeof(BOOL),
+ NULL);
+
+ if (result != paNoError)
+ {
+ PA_DEBUG(("Failed PinQueryNotificationSupport\n"));
+ }
+
+ return result;
+
+}
+
+static PaError PinGetBufferWithNotification(PaWinWdmPin* pPin, void** pBuffer, DWORD* pRequestedBufSize, BOOL* pbCallMemBarrier)
+{
+ PaError result = paNoError;
+ KSRTAUDIO_BUFFER_PROPERTY_WITH_NOTIFICATION propIn;
+ KSRTAUDIO_BUFFER propOut;
+
+ propIn.BaseAddress = 0;
+ propIn.NotificationCount = 2;
+ propIn.RequestedBufferSize = *pRequestedBufSize;
+ propIn.Property.Set = KSPROPSETID_RtAudio;
+ propIn.Property.Id = KSPROPERTY_RTAUDIO_BUFFER_WITH_NOTIFICATION;
+ propIn.Property.Flags = KSPROPERTY_TYPE_GET;
+
+ result = WdmSyncIoctl(pPin->handle, IOCTL_KS_PROPERTY,
+ &propIn,
+ sizeof(KSRTAUDIO_BUFFER_PROPERTY_WITH_NOTIFICATION),
+ &propOut,
+ sizeof(KSRTAUDIO_BUFFER),
+ NULL);
+
+ if (result == paNoError)
+ {
+ *pBuffer = propOut.BufferAddress;
+ *pRequestedBufSize = propOut.ActualBufferSize;
+ *pbCallMemBarrier = propOut.CallMemoryBarrier;
+ }
+ else
+ {
+ PA_DEBUG(("Failed to get buffer with notification\n"));
+ }
+
+ return result;
+}
+
+static PaError PinGetBufferWithoutNotification(PaWinWdmPin* pPin, void** pBuffer, DWORD* pRequestedBufSize, BOOL* pbCallMemBarrier)
+{
+ PaError result = paNoError;
+ KSRTAUDIO_BUFFER_PROPERTY propIn;
+ KSRTAUDIO_BUFFER propOut;
+
+ propIn.BaseAddress = NULL;
+ propIn.RequestedBufferSize = *pRequestedBufSize;
+ propIn.Property.Set = KSPROPSETID_RtAudio;
+ propIn.Property.Id = KSPROPERTY_RTAUDIO_BUFFER;
+ propIn.Property.Flags = KSPROPERTY_TYPE_GET;
+
+ result = WdmSyncIoctl(pPin->handle, IOCTL_KS_PROPERTY,
+ &propIn,
+ sizeof(KSRTAUDIO_BUFFER_PROPERTY),
+ &propOut,
+ sizeof(KSRTAUDIO_BUFFER),
+ NULL);
+
+ if (result == paNoError)
+ {
+ *pBuffer = propOut.BufferAddress;
+ *pRequestedBufSize = propOut.ActualBufferSize;
+ *pbCallMemBarrier = propOut.CallMemoryBarrier;
+ }
+ else
+ {
+ PA_DEBUG(("Failed to get buffer without notification\n"));
+ }
+
+ return result;
+}
+
+/* greatest common divisor - PGCD in French */
+static unsigned long PaWinWDMGCD( unsigned long a, unsigned long b )
+{
+ return (b==0) ? a : PaWinWDMGCD( b, a%b);
+}
+
+
+/* This function will handle getting the cyclic buffer from a WaveRT driver. Certain WaveRT drivers needs to have
+requested buffer size on multiples of 128 bytes:
+
+*/
+static PaError PinGetBuffer(PaWinWdmPin* pPin, void** pBuffer, DWORD* pRequestedBufSize, BOOL* pbCallMemBarrier)
+{
+ PaError result = paNoError;
+
+ while (1)
+ {
+ if (pPin->pinKsSubType != SubType_kPolled)
+ {
+ /* In case of unknown (or notification), we try both modes */
+ result = PinGetBufferWithNotification(pPin, pBuffer, pRequestedBufSize, pbCallMemBarrier);
+ if (result == paNoError)
+ {
+ PA_DEBUG(("PinGetBuffer: SubType_kNotification\n"));
+ pPin->pinKsSubType = SubType_kNotification;
+ break;
+ }
+ }
+
+ result = PinGetBufferWithoutNotification(pPin, pBuffer, pRequestedBufSize, pbCallMemBarrier);
+ if (result == paNoError)
+ {
+ PA_DEBUG(("PinGetBuffer: SubType_kPolled\n"));
+ pPin->pinKsSubType = SubType_kPolled;
+ break;
+ }
+
+ /* Check if requested size is on a 128 byte boundary */
+ if (((*pRequestedBufSize) % 128UL) == 0)
+ {
+ PA_DEBUG(("Buffer size on 128 byte boundary, still fails :(\n"));
+ /* Ok, can't do much more */
+ break;
+ }
+ else
+ {
+ /* Compute LCM so we know which sizes are on a 128 byte boundary */
+ const unsigned gcd = PaWinWDMGCD(128UL, pPin->ksDataFormatWfx->WaveFormatEx.nBlockAlign);
+ const unsigned lcm = (128UL * pPin->ksDataFormatWfx->WaveFormatEx.nBlockAlign) / gcd;
+ DWORD dwOldSize = *pRequestedBufSize;
+
+ /* Align size to (next larger) LCM byte boundary, and then we try again. Note that LCM is not necessarily a
+ power of 2. */
+ *pRequestedBufSize = ((*pRequestedBufSize + lcm - 1) / lcm) * lcm;
+
+ PA_DEBUG(("Adjusting buffer size from %u to %u bytes (128 byte boundary, LCM=%u)\n", dwOldSize, *pRequestedBufSize, lcm));
+ }
+ }
+
+ return result;
+}
+
+static PaError PinRegisterPositionRegister(PaWinWdmPin* pPin)
+{
+ PaError result = paNoError;
+ KSRTAUDIO_HWREGISTER_PROPERTY propIn;
+ KSRTAUDIO_HWREGISTER propOut;
+
+ PA_LOGE_;
+
+ propIn.BaseAddress = NULL;
+ propIn.Property.Set = KSPROPSETID_RtAudio;
+ propIn.Property.Id = KSPROPERTY_RTAUDIO_POSITIONREGISTER;
+ propIn.Property.Flags = KSPROPERTY_TYPE_GET;
+
+ result = WdmSyncIoctl(pPin->handle, IOCTL_KS_PROPERTY,
+ &propIn,
+ sizeof(KSRTAUDIO_HWREGISTER_PROPERTY),
+ &propOut,
+ sizeof(KSRTAUDIO_HWREGISTER),
+ NULL);
+
+ if (result == paNoError)
+ {
+ pPin->positionRegister = (ULONG*)propOut.Register;
+ }
+ else
+ {
+ PA_DEBUG(("Failed to register position register\n"));
}
PA_LOGL_;
@@ -1173,16 +2447,151 @@ static PaError PinIsFormatSupported(PaWinWdmPin* pin, const WAVEFORMATEX* format
return result;
}
-/**
- * Create a new filter object
- */
-static PaWinWdmFilter* FilterNew(TCHAR* filterName, TCHAR* friendlyName, PaError* error)
+static PaError PinRegisterNotificationHandle(PaWinWdmPin* pPin, HANDLE handle)
{
- PaWinWdmFilter* filter;
- PaError result;
- int pinId;
- int valid;
+ PaError result = paNoError;
+ KSRTAUDIO_NOTIFICATION_EVENT_PROPERTY prop;
+ PA_LOGE_;
+
+ prop.NotificationEvent = handle;
+ prop.Property.Set = KSPROPSETID_RtAudio;
+ prop.Property.Id = KSPROPERTY_RTAUDIO_REGISTER_NOTIFICATION_EVENT;
+ prop.Property.Flags = KSPROPERTY_TYPE_GET;
+
+ result = WdmSyncIoctl(pPin->handle,
+ IOCTL_KS_PROPERTY,
+ &prop,
+ sizeof(KSRTAUDIO_NOTIFICATION_EVENT_PROPERTY),
+ &prop,
+ sizeof(KSRTAUDIO_NOTIFICATION_EVENT_PROPERTY),
+ NULL);
+
+ if (result != paNoError) {
+ PA_DEBUG(("Failed to register notification handle 0x%08X\n", handle));
+ }
+
+ PA_LOGL_;
+
+ return result;
+}
+
+static PaError PinUnregisterNotificationHandle(PaWinWdmPin* pPin, HANDLE handle)
+{
+ PaError result = paNoError;
+ KSRTAUDIO_NOTIFICATION_EVENT_PROPERTY prop;
+
+ PA_LOGE_;
+
+ if (handle != NULL)
+ {
+ prop.NotificationEvent = handle;
+ prop.Property.Set = KSPROPSETID_RtAudio;
+ prop.Property.Id = KSPROPERTY_RTAUDIO_UNREGISTER_NOTIFICATION_EVENT;
+ prop.Property.Flags = KSPROPERTY_TYPE_GET;
+
+ result = WdmSyncIoctl(pPin->handle,
+ IOCTL_KS_PROPERTY,
+ &prop,
+ sizeof(KSRTAUDIO_NOTIFICATION_EVENT_PROPERTY),
+ &prop,
+ sizeof(KSRTAUDIO_NOTIFICATION_EVENT_PROPERTY),
+ NULL);
+
+ if (result != paNoError) {
+ PA_DEBUG(("Failed to unregister notification handle 0x%08X\n", handle));
+ }
+ }
+ PA_LOGL_;
+
+ return result;
+}
+
+static PaError PinGetHwLatency(PaWinWdmPin* pPin, ULONG* pFifoSize, ULONG* pChipsetDelay, ULONG* pCodecDelay)
+{
+ PaError result = paNoError;
+ KSPROPERTY propIn;
+ KSRTAUDIO_HWLATENCY propOut;
+
+ PA_LOGE_;
+
+ propIn.Set = KSPROPSETID_RtAudio;
+ propIn.Id = KSPROPERTY_RTAUDIO_HWLATENCY;
+ propIn.Flags = KSPROPERTY_TYPE_GET;
+
+ result = WdmSyncIoctl(pPin->handle, IOCTL_KS_PROPERTY,
+ &propIn,
+ sizeof(KSPROPERTY),
+ &propOut,
+ sizeof(KSRTAUDIO_HWLATENCY),
+ NULL);
+
+ if (result == paNoError)
+ {
+ *pFifoSize = propOut.FifoSize;
+ *pChipsetDelay = propOut.ChipsetDelay;
+ *pCodecDelay = propOut.CodecDelay;
+ }
+ else
+ {
+ PA_DEBUG(("Failed to retrieve hardware FIFO size!\n"));
+ }
+
+ PA_LOGL_;
+
+ return result;
+}
+
+/* This one is used for WaveRT */
+static PaError PinGetAudioPositionDirect(PaWinWdmPin* pPin, ULONG* pPosition)
+{
+ *pPosition = (*pPin->positionRegister);
+ return paNoError;
+}
+
+/* This one also, but in case the driver hasn't implemented memory mapped access to the position register */
+static PaError PinGetAudioPositionViaIOCTL(PaWinWdmPin* pPin, ULONG* pPosition)
+{
+ PaError result = paNoError;
+ KSPROPERTY propIn;
+ KSAUDIO_POSITION propOut;
+
+ PA_LOGE_;
+
+ propIn.Set = KSPROPSETID_Audio;
+ propIn.Id = KSPROPERTY_AUDIO_POSITION;
+ propIn.Flags = KSPROPERTY_TYPE_GET;
+
+ result = WdmSyncIoctl(pPin->handle,
+ IOCTL_KS_PROPERTY,
+ &propIn, sizeof(KSPROPERTY),
+ &propOut, sizeof(KSAUDIO_POSITION),
+ NULL);
+
+ if (result == paNoError)
+ {
+ *pPosition = (ULONG)(propOut.PlayOffset);
+ }
+ else
+ {
+ PA_DEBUG(("Failed to get audio position!\n"));
+ }
+
+ PA_LOGL_;
+
+ return result;
+
+}
+
+/***********************************************************************************************/
+
+/**
+* Create a new filter object.
+*/
+static PaWinWdmFilter* FilterNew( PaWDMKSType type, DWORD devNode, const wchar_t* filterName, const wchar_t* friendlyName, PaError* error )
+{
+ PaWinWdmFilter* filter = 0;
+ PaError result;
/* Allocate the new filter object */
filter = (PaWinWdmFilter*)PaUtil_AllocateMemory( sizeof(PaWinWdmFilter) );
@@ -1192,14 +2601,24 @@ static PaWinWdmFilter* FilterNew(TCHAR* filterName, TCHAR* friendlyName, PaError
goto error;
}
+ PA_DEBUG(("FilterNew: Creating filter '%S'\n", friendlyName));
+
+ /* Set type flag */
+ filter->devInfo.streamingType = type;
+
+ /* Store device node */
+ filter->deviceNode = devNode;
+
/* Zero the filter object - done by AllocateMemory */
/* memset( (void*)filter, 0, sizeof(PaWinWdmFilter) ); */
/* Copy the filter name */
- _tcsncpy(filter->filterName, filterName, MAX_PATH);
+ wcsncpy(filter->devInfo.filterPath, filterName, MAX_PATH);
/* Copy the friendly name */
- _tcsncpy(filter->friendlyName, friendlyName, MAX_PATH);
+ wcsncpy(filter->friendlyName, friendlyName, MAX_PATH);
+
+ PA_DEBUG(("FilterNew: Opening filter...\n", friendlyName));
/* Open the filter handle */
result = FilterUse(filter);
@@ -1216,14 +2635,106 @@ static PaWinWdmFilter* FilterNew(TCHAR* filterName, TCHAR* friendlyName, PaError
&KSPROPSETID_Pin,
KSPROPERTY_PIN_CTYPES,
&filter->pinCount,
- sizeof(filter->pinCount)
- );
+ sizeof(filter->pinCount),
+ NULL);
if( result != paNoError)
{
goto error;
}
+ /* Get connections & nodes for filter */
+ result = WdmGetPropertyMulti(
+ filter->handle,
+ &KSPROPSETID_Topology,
+ KSPROPERTY_TOPOLOGY_CONNECTIONS,
+ &filter->connections);
+
+ if( result != paNoError)
+ {
+ goto error;
+ }
+
+ result = WdmGetPropertyMulti(
+ filter->handle,
+ &KSPROPSETID_Topology,
+ KSPROPERTY_TOPOLOGY_NODES,
+ &filter->nodes);
+
+ if( result != paNoError)
+ {
+ goto error;
+ }
+
+ /* For debugging purposes */
+ DumpConnectionsAndNodes(filter);
+
+ /* Get product GUID (it might not be supported) */
+ {
+ KSCOMPONENTID compId;
+ if (WdmGetPropertySimple(filter->handle, &KSPROPSETID_General, KSPROPERTY_GENERAL_COMPONENTID, &compId, sizeof(KSCOMPONENTID), NULL, 0) == paNoError)
+ {
+ filter->devInfo.deviceProductGuid = compId.Product;
+ }
+ }
+
+ /* This section is not executed for topology filters */
+ if (type != Type_kNotUsed)
+ {
+ /* Initialize the pins */
+ result = FilterInitializePins(filter);
+
+ if( result != paNoError)
+ {
+ goto error;
+ }
+ }
+
+ /* Close the filter handle for now
+ * It will be opened later when needed */
+ FilterRelease(filter);
+
+ *error = paNoError;
+ return filter;
+
+error:
+ PA_DEBUG(("FilterNew: Error %d\n", result));
+ /*
+ Error cleanup
+ */
+ FilterFree(filter);
+
+ *error = result;
+ return NULL;
+}
+
+/**
+* Add reference to filter
+*/
+static void FilterAddRef( PaWinWdmFilter* filter )
+{
+ if (filter != 0)
+ {
+ filter->filterRefCount++;
+ }
+}
+
+
+/**
+* Initialize the pins of the filter. This is separated from FilterNew because this might fail if there is another
+* process using the pin(s).
+*/
+PaError FilterInitializePins( PaWinWdmFilter* filter )
+{
+ PaError result = paNoError;
+ int pinId;
+
+ if (filter->devInfo.streamingType == Type_kNotUsed)
+ return paNoError;
+
+ if (filter->pins != NULL)
+ return paNoError;
+
/* Allocate pointer array to hold the pins */
filter->pins = (PaWinWdmPin**)PaUtil_AllocateMemory( sizeof(PaWinWdmPin*) * filter->pinCount );
if( !filter->pins )
@@ -1233,11 +2744,6 @@ static PaWinWdmFilter* FilterNew(TCHAR* filterName, TCHAR* friendlyName, PaError
}
/* Create all the pins we can */
- filter->maxInputChannels = 0;
- filter->maxOutputChannels = 0;
- filter->bestSampleRate = 0;
-
- valid = 0;
for(pinId = 0; pinId < filter->pinCount; pinId++)
{
/* Create the pin with this Id */
@@ -1248,83 +2754,75 @@ static PaWinWdmFilter* FilterNew(TCHAR* filterName, TCHAR* friendlyName, PaError
if( newPin != NULL )
{
filter->pins[pinId] = newPin;
- valid = 1;
-
- /* Get the max output channel count */
- if(( newPin->dataFlow == KSPIN_DATAFLOW_IN ) &&
- (( newPin->communication == KSPIN_COMMUNICATION_SINK) ||
- ( newPin->communication == KSPIN_COMMUNICATION_BOTH)))
- {
- if(newPin->maxChannels > filter->maxOutputChannels)
- filter->maxOutputChannels = newPin->maxChannels;
- filter->formats |= newPin->formats;
- }
- /* Get the max input channel count */
- if(( newPin->dataFlow == KSPIN_DATAFLOW_OUT ) &&
- (( newPin->communication == KSPIN_COMMUNICATION_SINK) ||
- ( newPin->communication == KSPIN_COMMUNICATION_BOTH)))
- {
- if(newPin->maxChannels > filter->maxInputChannels)
- filter->maxInputChannels = newPin->maxChannels;
- filter->formats |= newPin->formats;
- }
-
- if(newPin->bestSampleRate > filter->bestSampleRate)
- {
- filter->bestSampleRate = newPin->bestSampleRate;
- }
+ ++filter->validPinCount;
}
}
- if(( filter->maxInputChannels == 0) && ( filter->maxOutputChannels == 0))
+ if (filter->validPinCount == 0)
{
- /* No input or output... not valid */
- valid = 0;
- }
-
- if( !valid )
- {
- /* No valid pin was found on this filter so we destroy it */
result = paDeviceUnavailable;
goto error;
}
- /* Close the filter handle for now
- * It will be opened later when needed */
- FilterRelease(filter);
-
- *error = paNoError;
- return filter;
+ return paNoError;
error:
- /*
- Error cleanup
- */
- if( filter )
+
+ if (filter->pins)
{
- for( pinId = 0; pinId < filter->pinCount; pinId++ )
- PinFree(filter->pins[pinId]);
+ for (pinId = 0; pinId < filter->pinCount; ++pinId)
+ {
+ if (filter->pins[pinId])
+ {
+ PaUtil_FreeMemory(filter->pins[pinId]);
+ filter->pins[pinId] = 0;
+ }
+ }
PaUtil_FreeMemory( filter->pins );
- if( filter->handle )
- CloseHandle( filter->handle );
- PaUtil_FreeMemory( filter );
+ filter->pins = 0;
}
- *error = result;
- return NULL;
+
+ return result;
}
+
/**
- * Free a previously created filter
- */
+* Free a previously created filter
+*/
static void FilterFree(PaWinWdmFilter* filter)
{
int pinId;
PA_LOGL_;
if( filter )
{
- for( pinId = 0; pinId < filter->pinCount; pinId++ )
- PinFree(filter->pins[pinId]);
- PaUtil_FreeMemory( filter->pins );
+ if (--filter->filterRefCount > 0)
+ {
+ /* Ok, a stream has a ref count to this filter */
+ return;
+ }
+
+ if (filter->topologyFilter)
+ {
+ FilterFree(filter->topologyFilter);
+ filter->topologyFilter = 0;
+ }
+ if ( filter->pins )
+ {
+ for( pinId = 0; pinId < filter->pinCount; pinId++ )
+ PinFree(filter->pins[pinId]);
+ PaUtil_FreeMemory( filter->pins );
+ filter->pins = 0;
+ }
+ if( filter->connections )
+ {
+ PaUtil_FreeMemory(filter->connections);
+ filter->connections = 0;
+ }
+ if( filter->nodes )
+ {
+ PaUtil_FreeMemory(filter->nodes);
+ filter->nodes = 0;
+ }
if( filter->handle )
CloseHandle( filter->handle );
PaUtil_FreeMemory( filter );
@@ -1333,8 +2831,8 @@ static void FilterFree(PaWinWdmFilter* filter)
}
/**
- * Reopen the filter handle if necessary so it can be used
- **/
+* Reopen the filter handle if necessary so it can be used
+**/
static PaError FilterUse(PaWinWdmFilter* filter)
{
assert( filter );
@@ -1343,8 +2841,8 @@ static PaError FilterUse(PaWinWdmFilter* filter)
if( filter->handle == NULL )
{
/* Open the filter */
- filter->handle = CreateFile(
- filter->filterName,
+ filter->handle = CreateFileW(
+ filter->devInfo.filterPath,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
@@ -1363,14 +2861,20 @@ static PaError FilterUse(PaWinWdmFilter* filter)
}
/**
- * Release the filter handle if nobody is using it
- **/
+* Release the filter handle if nobody is using it
+**/
static void FilterRelease(PaWinWdmFilter* filter)
{
assert( filter );
assert( filter->usageCount > 0 );
PA_LOGE_;
+ /* Check first topology filter, if used */
+ if (filter->topologyFilter != NULL && filter->topologyFilter->handle != NULL)
+ {
+ FilterRelease(filter->topologyFilter);
+ }
+
filter->usageCount--;
if( filter->usageCount == 0 )
{
@@ -1384,200 +2888,85 @@ static void FilterRelease(PaWinWdmFilter* filter)
}
/**
- * Create a render (playback) Pin using the supplied format
- **/
-static PaWinWdmPin* FilterCreateRenderPin(PaWinWdmFilter* filter,
- const WAVEFORMATEX* wfex,
- PaError* error)
-{
- PaError result;
- PaWinWdmPin* pin;
-
- assert( filter );
-
- pin = FilterFindViableRenderPin(filter,wfex,&result);
- if(!pin)
- {
- goto error;
- }
- result = PinSetFormat(pin,wfex);
- if( result != paNoError )
- {
- goto error;
- }
- result = PinInstantiate(pin);
- if( result != paNoError )
- {
- goto error;
- }
-
- *error = paNoError;
- return pin;
-
-error:
- *error = result;
- return NULL;
-}
-
-/**
- * Find a pin that supports the given format
- **/
-static PaWinWdmPin* FilterFindViableRenderPin(PaWinWdmFilter* filter,
- const WAVEFORMATEX* wfex,
- PaError* error)
-{
- int pinId;
- PaWinWdmPin* pin;
- PaError result = paDeviceUnavailable;
- *error = paNoError;
-
- assert( filter );
-
- for( pinId = 0; pinIdpinCount; pinId++ )
- {
- pin = filter->pins[pinId];
- if( pin != NULL )
- {
- if(( pin->dataFlow == KSPIN_DATAFLOW_IN ) &&
- (( pin->communication == KSPIN_COMMUNICATION_SINK) ||
- ( pin->communication == KSPIN_COMMUNICATION_BOTH)))
- {
- result = PinIsFormatSupported( pin, wfex );
- if( result == paNoError )
- {
- return pin;
- }
- }
- }
- }
-
- *error = result;
- return NULL;
-}
-
-/**
- * Check if there is a pin that should playback
- * with the supplied format
- **/
-static PaError FilterCanCreateRenderPin(PaWinWdmFilter* filter,
- const WAVEFORMATEX* wfex)
-{
- PaWinWdmPin* pin;
- PaError result;
-
- assert ( filter );
-
- pin = FilterFindViableRenderPin(filter,wfex,&result);
- /* result will be paNoError if pin found
- * or else an error code indicating what is wrong with the format
- **/
- return result;
-}
-
-/**
- * Create a capture (record) Pin using the supplied format
- **/
-static PaWinWdmPin* FilterCreateCapturePin(PaWinWdmFilter* filter,
- const WAVEFORMATEX* wfex,
- PaError* error)
-{
- PaError result;
- PaWinWdmPin* pin;
-
- assert( filter );
-
- pin = FilterFindViableCapturePin(filter,wfex,&result);
- if(!pin)
- {
- goto error;
- }
-
- result = PinSetFormat(pin,wfex);
- if( result != paNoError )
- {
- goto error;
- }
-
- result = PinInstantiate(pin);
- if( result != paNoError )
- {
- goto error;
- }
-
- *error = paNoError;
- return pin;
-
-error:
- *error = result;
- return NULL;
-}
-
-/**
- * Find a capture pin that supports the given format
- **/
-static PaWinWdmPin* FilterFindViableCapturePin(PaWinWdmFilter* filter,
- const WAVEFORMATEX* wfex,
- PaError* error)
-{
- int pinId;
- PaWinWdmPin* pin;
- PaError result = paDeviceUnavailable;
- *error = paNoError;
-
- assert( filter );
-
- for( pinId = 0; pinIdpinCount; pinId++ )
- {
- pin = filter->pins[pinId];
- if( pin != NULL )
- {
- if(( pin->dataFlow == KSPIN_DATAFLOW_OUT ) &&
- (( pin->communication == KSPIN_COMMUNICATION_SINK) ||
- ( pin->communication == KSPIN_COMMUNICATION_BOTH)))
- {
- result = PinIsFormatSupported( pin, wfex );
- if( result == paNoError )
- {
- return pin;
- }
- }
- }
- }
-
- *error = result;
- return NULL;
-}
-
-/**
- * Check if there is a pin that should playback
- * with the supplied format
- **/
-static PaError FilterCanCreateCapturePin(PaWinWdmFilter* filter,
- const WAVEFORMATEX* wfex)
-{
- PaWinWdmPin* pin;
- PaError result;
-
- assert ( filter );
-
- pin = FilterFindViableCapturePin(filter,wfex,&result);
- /* result will be paNoError if pin found
- * or else an error code indicating what is wrong with the format
- **/
- return result;
-}
-
-/**
- * Build the list of available filters
- * Use the SetupDi API to enumerate all devices in the KSCATEGORY_AUDIO which
- * have a KSCATEGORY_RENDER or KSCATEGORY_CAPTURE alias. For each of these
- * devices initialise a PaWinWdmFilter structure by calling our NewFilter()
- * function. We enumerate devices twice, once to count how many there are,
- * and once to initialize the PaWinWdmFilter structures.
- */
-static PaError BuildFilterList(PaWinWdmHostApiRepresentation* wdmHostApi)
+* Create a render or playback pin using the supplied format
+**/
+static PaWinWdmPin* FilterCreatePin(PaWinWdmFilter* filter,
+ int pinId,
+ const WAVEFORMATEX* wfex,
+ PaError* error)
{
PaError result = paNoError;
+ PaWinWdmPin* pin = NULL;
+ assert( filter );
+ assert( pinId < filter->pinCount );
+ pin = filter->pins[pinId];
+ assert( pin );
+ result = PinSetFormat(pin,wfex);
+ if( result == paNoError )
+ {
+ result = PinInstantiate(pin);
+ }
+ *error = result;
+ return result == paNoError ? pin : 0;
+}
+
+static const wchar_t kUsbPrefix[] = L"\\\\?\\USB";
+
+static BOOL IsUSBDevice(const wchar_t* devicePath)
+{
+ /* Alex Lessard pointed out that different devices might present the device path with
+ lower case letters. */
+ return (_wcsnicmp(devicePath, kUsbPrefix, sizeof(kUsbPrefix)/sizeof(kUsbPrefix[0]) ) == 0);
+}
+
+/* This should make it more language tolerant, I hope... */
+static const wchar_t kUsbNamePrefix[] = L"USB Audio";
+
+static BOOL IsNameUSBAudioDevice(const wchar_t* friendlyName)
+{
+ return (_wcsnicmp(friendlyName, kUsbNamePrefix, sizeof(kUsbNamePrefix)/sizeof(kUsbNamePrefix[0])) == 0);
+}
+
+typedef enum _tag_EAlias
+{
+ Alias_kRender = (1<<0),
+ Alias_kCapture = (1<<1),
+ Alias_kRealtime = (1<<2),
+} EAlias;
+
+/* Trim whitespace from string */
+static void TrimString(wchar_t* str, size_t length)
+{
+ wchar_t* s = str;
+ wchar_t* e = 0;
+
+ /* Find start of string */
+ while (iswspace(*s)) ++s;
+ e=s+min(length,wcslen(s))-1;
+
+ /* Find end of string */
+ while(e>s && iswspace(*e)) --e;
+ ++e;
+
+ length = e - s;
+ memmove(str, s, length * sizeof(wchar_t));
+ str[length] = 0;
+}
+
+/**
+* Build the list of available filters
+* Use the SetupDi API to enumerate all devices in the KSCATEGORY_AUDIO which
+* have a KSCATEGORY_RENDER or KSCATEGORY_CAPTURE alias. For each of these
+* devices initialise a PaWinWdmFilter structure by calling our NewFilter()
+* function. We enumerate devices twice, once to count how many there are,
+* and once to initialize the PaWinWdmFilter structures.
+*
+* Vista and later: Also check KSCATEGORY_REALTIME for WaveRT devices.
+*/
+//PaError BuildFilterList( PaWinWdmHostApiRepresentation* wdmHostApi, int* noOfPaDevices )
+PaWinWdmFilter** BuildFilterList( int* pFilterCount, int* pNoOfPaDevices, PaError* pResult )
+{
+ PaWinWdmFilter** ppFilters = NULL;
HDEVINFO handle = NULL;
int device;
int invalidDevices;
@@ -1588,26 +2977,32 @@ static PaError BuildFilterList(PaWinWdmHostApiRepresentation* wdmHostApi)
int noError;
const int sizeInterface = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) + (MAX_PATH * sizeof(WCHAR));
unsigned char interfaceDetailsArray[sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) + (MAX_PATH * sizeof(WCHAR))];
- SP_DEVICE_INTERFACE_DETAIL_DATA* devInterfaceDetails = (SP_DEVICE_INTERFACE_DETAIL_DATA*)interfaceDetailsArray;
- TCHAR friendlyName[MAX_PATH];
- HKEY hkey;
- DWORD sizeFriendlyName;
- DWORD type;
- PaWinWdmFilter* newFilter;
- GUID* category = (GUID*)&KSCATEGORY_AUDIO;
- GUID* alias_render = (GUID*)&KSCATEGORY_RENDER;
- GUID* alias_capture = (GUID*)&KSCATEGORY_CAPTURE;
- DWORD hasAlias;
+ SP_DEVICE_INTERFACE_DETAIL_DATA_W* devInterfaceDetails = (SP_DEVICE_INTERFACE_DETAIL_DATA_W*)interfaceDetailsArray;
+ const GUID* category = (const GUID*)&KSCATEGORY_AUDIO;
+ const GUID* alias_render = (const GUID*)&KSCATEGORY_RENDER;
+ const GUID* alias_capture = (const GUID*)&KSCATEGORY_CAPTURE;
+ const GUID* category_realtime = (const GUID*)&KSCATEGORY_REALTIME;
+ DWORD aliasFlags;
+ PaWDMKSType streamingType;
+ int filterCount = 0;
+ int noOfPaDevices = 0;
PA_LOGE_;
- devInterfaceDetails->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
+ assert(pFilterCount != NULL);
+ assert(pNoOfPaDevices != NULL);
+ assert(pResult != NULL);
+
+ devInterfaceDetails->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_W);
+ *pFilterCount = 0;
+ *pNoOfPaDevices = 0;
/* Open a handle to search for devices (filters) */
handle = SetupDiGetClassDevs(category,NULL,NULL,DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
- if( handle == NULL )
+ if( handle == INVALID_HANDLE_VALUE )
{
- return paUnanticipatedHostError;
+ *pResult = paUnanticipatedHostError;
+ return NULL;
}
PA_DEBUG(("Setup called\n"));
@@ -1625,7 +3020,7 @@ static PaError BuildFilterList(PaWinWdmHostApiRepresentation* wdmHostApi)
break; /* No more devices */
/* Check this one has the render or capture alias */
- hasAlias = 0;
+ aliasFlags = 0;
noError = SetupDiGetDeviceInterfaceAlias(handle,&interfaceData,alias_render,&aliasData);
PA_DEBUG(("noError = %d\n",noError));
if(noError)
@@ -1633,7 +3028,7 @@ static PaError BuildFilterList(PaWinWdmHostApiRepresentation* wdmHostApi)
if(aliasData.Flags && (!(aliasData.Flags & SPINT_REMOVED)))
{
PA_DEBUG(("Device %d has render alias\n",device));
- hasAlias |= 1; /* Has render alias */
+ aliasFlags |= Alias_kRender; /* Has render alias */
}
else
{
@@ -1646,29 +3041,29 @@ static PaError BuildFilterList(PaWinWdmHostApiRepresentation* wdmHostApi)
if(aliasData.Flags && (!(aliasData.Flags & SPINT_REMOVED)))
{
PA_DEBUG(("Device %d has capture alias\n",device));
- hasAlias |= 2; /* Has capture alias */
+ aliasFlags |= Alias_kCapture; /* Has capture alias */
}
else
{
PA_DEBUG(("Device %d has no capture alias\n",device));
}
}
- if(!hasAlias)
+ if(!aliasFlags)
invalidDevices++; /* This was not a valid capture or render audio device */
-
}
/* Remember how many there are */
- wdmHostApi->filterCount = device-invalidDevices;
+ filterCount = device-invalidDevices;
PA_DEBUG(("Interfaces found: %d\n",device-invalidDevices));
/* Now allocate the list of pointers to devices */
- wdmHostApi->filters = (PaWinWdmFilter**)PaUtil_AllocateMemory( sizeof(PaWinWdmFilter*) * device );
- if( !wdmHostApi->filters )
+ ppFilters = (PaWinWdmFilter**)PaUtil_AllocateMemory( sizeof(PaWinWdmFilter*) * filterCount);
+ if( ppFilters == 0 )
{
if(handle != NULL)
SetupDiDestroyDeviceInfoList(handle);
- return paInsufficientMemory;
+ *pResult = paInsufficientMemory;
+ return NULL;
}
/* Now create filter objects for each interface found */
@@ -1681,20 +3076,21 @@ static PaError BuildFilterList(PaWinWdmHostApiRepresentation* wdmHostApi)
aliasData.Reserved = 0;
devInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
devInfoData.Reserved = 0;
+ streamingType = Type_kWaveCyclic;
noError = SetupDiEnumDeviceInterfaces(handle,NULL,category,device,&interfaceData);
if( !noError )
break; /* No more devices */
/* Check this one has the render or capture alias */
- hasAlias = 0;
+ aliasFlags = 0;
noError = SetupDiGetDeviceInterfaceAlias(handle,&interfaceData,alias_render,&aliasData);
if(noError)
{
if(aliasData.Flags && (!(aliasData.Flags & SPINT_REMOVED)))
{
PA_DEBUG(("Device %d has render alias\n",device));
- hasAlias |= 1; /* Has render alias */
+ aliasFlags |= Alias_kRender; /* Has render alias */
}
}
noError = SetupDiGetDeviceInterfaceAlias(handle,&interfaceData,alias_capture,&aliasData);
@@ -1703,48 +3099,114 @@ static PaError BuildFilterList(PaWinWdmHostApiRepresentation* wdmHostApi)
if(aliasData.Flags && (!(aliasData.Flags & SPINT_REMOVED)))
{
PA_DEBUG(("Device %d has capture alias\n",device));
- hasAlias |= 2; /* Has capture alias */
+ aliasFlags |= Alias_kCapture; /* Has capture alias */
}
}
- if(!hasAlias)
+ if(!aliasFlags)
+ {
continue; /* This was not a valid capture or render audio device */
+ }
+ else
+ {
+ /* Check if filter is WaveRT, if not it is a WaveCyclic */
+ noError = SetupDiGetDeviceInterfaceAlias(handle,&interfaceData,category_realtime,&aliasData);
+ if (noError)
+ {
+ PA_DEBUG(("Device %d has realtime alias\n",device));
+ aliasFlags |= Alias_kRealtime;
+ streamingType = Type_kWaveRT;
+ }
+ }
- noError = SetupDiGetDeviceInterfaceDetail(handle,&interfaceData,devInterfaceDetails,sizeInterface,NULL,&devInfoData);
+ noError = SetupDiGetDeviceInterfaceDetailW(handle,&interfaceData,devInterfaceDetails,sizeInterface,NULL,&devInfoData);
if( noError )
{
+ DWORD type;
+ WCHAR friendlyName[MAX_PATH] = {0};
+ DWORD sizeFriendlyName;
+ PaWinWdmFilter* newFilter = 0;
+
+ PaError result = paNoError;
/* Try to get the "friendly name" for this interface */
sizeFriendlyName = sizeof(friendlyName);
- /* Fix contributed by Ben Allison
- * Removed KEY_SET_VALUE from flags on following call
- * as its causes failure when running without admin rights
- * and it was not required */
- hkey=SetupDiOpenDeviceInterfaceRegKey(handle,&interfaceData,0,KEY_QUERY_VALUE);
- if(hkey!=INVALID_HANDLE_VALUE)
+
+ if (IsEarlierThanVista() && IsUSBDevice(devInterfaceDetails->DevicePath))
{
- noError = RegQueryValueEx(hkey,TEXT("FriendlyName"),0,&type,(BYTE*)friendlyName,&sizeFriendlyName);
- if( noError == ERROR_SUCCESS )
- {
- PA_DEBUG(("Interface %d, Name: %s\n",device,friendlyName));
- RegCloseKey(hkey);
- }
- else
+ /* XP and USB audio device needs to look elsewhere, otherwise it'll only be a "USB Audio Device". Not
+ very literate. */
+ if (!SetupDiGetDeviceRegistryPropertyW(handle,
+ &devInfoData,
+ SPDRP_LOCATION_INFORMATION,
+ &type,
+ (BYTE*)friendlyName,
+ sizeof(friendlyName),
+ NULL))
{
friendlyName[0] = 0;
}
}
- newFilter = FilterNew(devInterfaceDetails->DevicePath,friendlyName,&result);
+
+ if (friendlyName[0] == 0 || IsNameUSBAudioDevice(friendlyName))
+ {
+ /* Fix contributed by Ben Allison
+ * Removed KEY_SET_VALUE from flags on following call
+ * as its causes failure when running without admin rights
+ * and it was not required */
+ HKEY hkey=SetupDiOpenDeviceInterfaceRegKey(handle,&interfaceData,0,KEY_QUERY_VALUE);
+ if(hkey!=INVALID_HANDLE_VALUE)
+ {
+ noError = RegQueryValueExW(hkey,L"FriendlyName",0,&type,(BYTE*)friendlyName,&sizeFriendlyName);
+ if( noError == ERROR_SUCCESS )
+ {
+ PA_DEBUG(("Interface %d, Name: %s\n",device,friendlyName));
+ RegCloseKey(hkey);
+ }
+ else
+ {
+ friendlyName[0] = 0;
+ }
+ }
+ }
+
+ TrimString(friendlyName, sizeFriendlyName);
+
+ newFilter = FilterNew(streamingType,
+ devInfoData.DevInst,
+ devInterfaceDetails->DevicePath,
+ friendlyName,
+ &result);
+
if( result == paNoError )
{
- PA_DEBUG(("Filter created\n"));
- wdmHostApi->filters[slot] = newFilter;
+ int pin;
+ unsigned filterIOs = 0;
+
+ /* Increment number of "devices" */
+ for (pin = 0; pin < newFilter->pinCount; ++pin)
+ {
+ PaWinWdmPin* pPin = newFilter->pins[pin];
+ if (pPin == NULL)
+ continue;
+
+ filterIOs += max(1, pPin->inputCount);
+ }
+
+ noOfPaDevices += filterIOs;
+
+ PA_DEBUG(("Filter (%s) created with %d valid pins (total I/Os: %u)\n", ((newFilter->devInfo.streamingType==Type_kWaveRT)?"WaveRT":"WaveCyclic"), newFilter->validPinCount, filterIOs));
+
+ assert(slot < filterCount);
+
+ ppFilters[slot] = newFilter;
+
slot++;
}
else
{
PA_DEBUG(("Filter NOT created\n"));
/* As there are now less filters than we initially thought
- * we must reduce the count by one */
- wdmHostApi->filterCount--;
+ * we must reduce the count by one */
+ filterCount--;
}
}
}
@@ -1753,21 +3215,467 @@ static PaError BuildFilterList(PaWinWdmHostApiRepresentation* wdmHostApi)
if(handle != NULL)
SetupDiDestroyDeviceInfoList(handle);
+ *pFilterCount = filterCount;
+ *pNoOfPaDevices = noOfPaDevices;
+
+ return ppFilters;
+}
+
+typedef struct PaNameHashIndex
+{
+ unsigned index;
+ unsigned count;
+ ULONG hash;
+ struct PaNameHashIndex *next;
+} PaNameHashIndex;
+
+typedef struct PaNameHashObject
+{
+ PaNameHashIndex* list;
+ PaUtilAllocationGroup* allocGroup;
+} PaNameHashObject;
+
+static ULONG GetNameHash(const wchar_t* str, const BOOL input)
+{
+ /* This is to make sure that a name that exists as both input & output won't get the same hash value */
+ const ULONG fnv_prime = (input ? 0x811C9DD7 : 0x811FEB0B);
+ ULONG hash = 0;
+ for(; *str != 0; str++)
+ {
+ hash *= fnv_prime;
+ hash ^= (*str);
+ }
+ assert(hash != 0);
+ return hash;
+}
+
+static PaError CreateHashEntry(PaNameHashObject* obj, const wchar_t* name, const BOOL input)
+{
+ ULONG hash = GetNameHash(name, input);
+ PaNameHashIndex * pLast = NULL;
+ PaNameHashIndex * p = obj->list;
+ while (p != 0)
+ {
+ if (p->hash == hash)
+ {
+ break;
+ }
+ pLast = p;
+ p = p->next;
+ }
+ if (p == NULL)
+ {
+ p = (PaNameHashIndex*)PaUtil_GroupAllocateMemory(obj->allocGroup, sizeof(PaNameHashIndex));
+ if (p == NULL)
+ {
+ return paInsufficientMemory;
+ }
+ p->hash = hash;
+ p->count = 1;
+ if (pLast != 0)
+ {
+ assert(pLast->next == 0);
+ pLast->next = p;
+ }
+ if (obj->list == 0)
+ {
+ obj->list = p;
+ }
+ }
+ else
+ {
+ ++p->count;
+ }
return paNoError;
}
+static PaError InitNameHashObject(PaNameHashObject* obj, PaWinWdmFilter* pFilter)
+{
+ int i;
+
+ obj->allocGroup = PaUtil_CreateAllocationGroup();
+ if (obj->allocGroup == NULL)
+ {
+ return paInsufficientMemory;
+ }
+
+ for (i = 0; i < pFilter->pinCount; ++i)
+ {
+ unsigned m;
+ PaWinWdmPin* pin = pFilter->pins[i];
+
+ if (pin == NULL)
+ continue;
+
+ for (m = 0; m < max(1, pin->inputCount); ++m)
+ {
+ const BOOL isInput = (pin->dataFlow == KSPIN_DATAFLOW_OUT);
+ const wchar_t* name = (pin->inputs == NULL) ? pin->friendlyName : pin->inputs[m]->friendlyName;
+
+ PaError result = CreateHashEntry(obj, name, isInput);
+
+ if (result != paNoError)
+ {
+ return result;
+ }
+ }
+ }
+ return paNoError;
+}
+
+static void DeinitNameHashObject(PaNameHashObject* obj)
+{
+ assert(obj != 0);
+ PaUtil_FreeAllAllocations(obj->allocGroup);
+ PaUtil_DestroyAllocationGroup(obj->allocGroup);
+ memset(obj, 0, sizeof(PaNameHashObject));
+}
+
+static unsigned GetNameIndex(PaNameHashObject* obj, const wchar_t* name, const BOOL input)
+{
+ ULONG hash = GetNameHash(name, input);
+ PaNameHashIndex* p = obj->list;
+ while (p != NULL)
+ {
+ if (p->hash == hash)
+ {
+ if (p->count > 1)
+ {
+ return (++p->index);
+ }
+ else
+ {
+ return 0;
+ }
+ }
+
+ p = p->next;
+ }
+ // Should never get here!!
+ assert(FALSE);
+ return 0;
+}
+
+static PaError ScanDeviceInfos( struct PaUtilHostApiRepresentation *hostApi, PaHostApiIndex hostApiIndex, void **scanResults, int *newDeviceCount )
+{
+ PaWinWdmHostApiRepresentation *wdmHostApi = (PaWinWdmHostApiRepresentation*)hostApi;
+ PaError result = paNoError;
+ PaWinWdmFilter** ppFilters = 0;
+ PaWinWDMScanDeviceInfosResults *outArgument = 0;
+ int filterCount = 0;
+ int totalDeviceCount = 0;
+ int idxDevice = 0;
+
+ ppFilters = BuildFilterList( &filterCount, &totalDeviceCount, &result );
+ if( result != paNoError )
+ {
+ goto error;
+ }
+
+ if( totalDeviceCount > 0 )
+ {
+ PaWinWdmDeviceInfo *deviceInfoArray = 0;
+ int idxFilter;
+ int i;
+
+ /* Allocate the out param for all the info we need */
+ outArgument = (PaWinWDMScanDeviceInfosResults *) PaUtil_GroupAllocateMemory(
+ wdmHostApi->allocations, sizeof(PaWinWDMScanDeviceInfosResults) );
+ if( !outArgument )
+ {
+ result = paInsufficientMemory;
+ goto error;
+ }
+
+ outArgument->defaultInputDevice = paNoDevice;
+ outArgument->defaultOutputDevice = paNoDevice;
+
+ outArgument->deviceInfos = (PaDeviceInfo**)PaUtil_GroupAllocateMemory(
+ wdmHostApi->allocations, sizeof(PaDeviceInfo*) * totalDeviceCount );
+ if( !outArgument->deviceInfos )
+ {
+ result = paInsufficientMemory;
+ goto error;
+ }
+
+ /* allocate all device info structs in a contiguous block */
+ deviceInfoArray = (PaWinWdmDeviceInfo*)PaUtil_GroupAllocateMemory(
+ wdmHostApi->allocations, sizeof(PaWinWdmDeviceInfo) * totalDeviceCount );
+ if( !deviceInfoArray )
+ {
+ result = paInsufficientMemory;
+ goto error;
+ }
+
+ /* Make sure all items in array */
+ for( i = 0 ; i < totalDeviceCount; ++i )
+ {
+ PaDeviceInfo *deviceInfo = &deviceInfoArray[i].inheritedDeviceInfo;
+ deviceInfo->structVersion = 2;
+ deviceInfo->hostApi = hostApiIndex;
+ deviceInfo->name = 0;
+ outArgument->deviceInfos[ i ] = deviceInfo;
+ }
+
+ idxDevice = 0;
+ for (idxFilter = 0; idxFilter < filterCount; ++idxFilter)
+ {
+ PaNameHashObject nameHash = {0};
+ PaWinWdmFilter* pFilter = ppFilters[idxFilter];
+ if( pFilter == NULL )
+ continue;
+
+ if (InitNameHashObject(&nameHash, pFilter) != paNoError)
+ {
+ DeinitNameHashObject(&nameHash);
+ continue;
+ }
+
+ for (i = 0; i < pFilter->pinCount; ++i)
+ {
+ unsigned m;
+ ULONG nameIndex = 0;
+ ULONG nameIndexHash = 0;
+ PaWinWdmPin* pin = pFilter->pins[i];
+
+ if (pin == NULL)
+ continue;
+
+ for (m = 0; m < max(1, pin->inputCount); ++m)
+ {
+ PaWinWdmDeviceInfo *wdmDeviceInfo = (PaWinWdmDeviceInfo *)outArgument->deviceInfos[idxDevice];
+ PaDeviceInfo *deviceInfo = &wdmDeviceInfo->inheritedDeviceInfo;
+ wchar_t localCompositeName[MAX_PATH];
+ unsigned nameIndex = 0;
+ const BOOL isInput = (pin->dataFlow == KSPIN_DATAFLOW_OUT);
+
+ wdmDeviceInfo->filter = pFilter;
+
+ deviceInfo->structVersion = 2;
+ deviceInfo->hostApi = hostApiIndex;
+ deviceInfo->name = wdmDeviceInfo->compositeName;
+ /* deviceInfo->hostApiSpecificDeviceInfo = &pFilter->devInfo; */
+
+ wdmDeviceInfo->pin = pin->pinId;
+
+ /* Get the name of the "device" */
+ if (pin->inputs == NULL)
+ {
+ wcsncpy(localCompositeName, pin->friendlyName, MAX_PATH);
+ wdmDeviceInfo->muxPosition = -1;
+ wdmDeviceInfo->endpointPinId = pin->endpointPinId;
+ }
+ else
+ {
+ PaWinWdmMuxedInput* input = pin->inputs[m];
+ wcsncpy(localCompositeName, input->friendlyName, MAX_PATH);
+ wdmDeviceInfo->muxPosition = (int)m;
+ wdmDeviceInfo->endpointPinId = input->endpointPinId;
+ }
+
+ {
+ /* Get base length */
+ size_t n = wcslen(localCompositeName);
+
+ /* Check if there are more entries with same name (which might very well be the case), if there
+ are, the name will be postfixed with an index. */
+ nameIndex = GetNameIndex(&nameHash, localCompositeName, isInput);
+ if (nameIndex > 0)
+ {
+ /* This name has multiple instances, so we post fix with a number */
+ n += _snwprintf(localCompositeName + n, MAX_PATH - n, L" %u", nameIndex);
+ }
+ /* Postfix with filter name */
+ _snwprintf(localCompositeName + n, MAX_PATH - n, L" (%s)", pFilter->friendlyName);
+ }
+
+ /* Convert wide char string to utf-8 */
+ WideCharToMultiByte(CP_UTF8, 0, localCompositeName, -1, wdmDeviceInfo->compositeName, MAX_PATH, NULL, NULL);
+
+ /* NB! WDM/KS has no concept of a full-duplex device, each pin is either an input or and output */
+ if (isInput)
+ {
+ /* INPUT ! */
+ deviceInfo->maxInputChannels = pin->maxChannels;
+ deviceInfo->maxOutputChannels = 0;
+
+ if (outArgument->defaultInputDevice == paNoDevice)
+ {
+ outArgument->defaultInputDevice = idxDevice;
+ }
+ }
+ else
+ {
+ /* OUTPUT ! */
+ deviceInfo->maxInputChannels = 0;
+ deviceInfo->maxOutputChannels = pin->maxChannels;
+
+ if (outArgument->defaultOutputDevice == paNoDevice)
+ {
+ outArgument->defaultOutputDevice = idxDevice;
+ }
+ }
+
+ /* These low values are not very useful because
+ * a) The lowest latency we end up with can depend on many factors such
+ * as the device buffer sizes/granularities, sample rate, channels and format
+ * b) We cannot know the device buffer sizes until we try to open/use it at
+ * a particular setting
+ * So: we give 512x48000Hz frames as the default low input latency
+ **/
+ switch (pFilter->devInfo.streamingType)
+ {
+ case Type_kWaveCyclic:
+ if (IsEarlierThanVista())
+ {
+ /* XP doesn't tolerate low latency, unless the Process Priority Class is set to REALTIME_PRIORITY_CLASS
+ through SetPriorityClass, then 10 ms is quite feasible. However, one should then bear in mind that ALL of
+ the process is running in REALTIME_PRIORITY_CLASS, which might not be appropriate for an application with
+ a GUI . In this case it is advisable to separate the audio engine in another process and use IPC to communicate
+ with it. */
+ deviceInfo->defaultLowInputLatency = 0.02;
+ deviceInfo->defaultLowOutputLatency = 0.02;
+ }
+ else
+ {
+ /* This is a conservative estimate. Most WaveCyclic drivers will limit the available latency, but f.i. my Edirol
+ PCR-A30 can reach 3 ms latency easily... */
+ deviceInfo->defaultLowInputLatency = 0.01;
+ deviceInfo->defaultLowOutputLatency = 0.01;
+ }
+ deviceInfo->defaultHighInputLatency = (4096.0/48000.0);
+ deviceInfo->defaultHighOutputLatency = (4096.0/48000.0);
+ deviceInfo->defaultSampleRate = (double)(pin->defaultSampleRate);
+ break;
+ case Type_kWaveRT:
+ /* This is also a conservative estimate, based on WaveRT polled mode. In polled mode, the latency will be dictated
+ by the buffer size given by the driver. */
+ deviceInfo->defaultLowInputLatency = 0.01;
+ deviceInfo->defaultLowOutputLatency = 0.01;
+ deviceInfo->defaultHighInputLatency = 0.04;
+ deviceInfo->defaultHighOutputLatency = 0.04;
+ deviceInfo->defaultSampleRate = (double)(pin->defaultSampleRate);
+ break;
+ default:
+ assert(0);
+ break;
+ }
+
+ /* Add reference to filter */
+ FilterAddRef(wdmDeviceInfo->filter);
+
+ assert(idxDevice < totalDeviceCount);
+ ++idxDevice;
+ }
+ }
+
+ /* If no one has add ref'd the filter, drop it */
+ if (pFilter->filterRefCount == 0)
+ {
+ FilterFree(pFilter);
+ }
+
+ /* Deinitialize name hash object */
+ DeinitNameHashObject(&nameHash);
+ }
+ }
+
+ *scanResults = outArgument;
+ *newDeviceCount = idxDevice;
+ return result;
+
+error:
+ result = DisposeDeviceInfos(hostApi, outArgument, totalDeviceCount);
+
+ return result;
+}
+
+static PaError CommitDeviceInfos( struct PaUtilHostApiRepresentation *hostApi, PaHostApiIndex index, void *scanResults, int deviceCount )
+{
+ PaWinWdmHostApiRepresentation *wdmHostApi = (PaWinWdmHostApiRepresentation*)hostApi;
+
+ hostApi->info.deviceCount = 0;
+ hostApi->info.defaultInputDevice = paNoDevice;
+ hostApi->info.defaultOutputDevice = paNoDevice;
+
+ /* Free any old memory which might be in the device info */
+ if( hostApi->deviceInfos )
+ {
+ PaWinWDMScanDeviceInfosResults* localScanResults = (PaWinWDMScanDeviceInfosResults*)PaUtil_GroupAllocateMemory(
+ wdmHostApi->allocations, sizeof(PaWinWDMScanDeviceInfosResults));
+ localScanResults->deviceInfos = hostApi->deviceInfos;
+
+ DisposeDeviceInfos(hostApi, &localScanResults, hostApi->info.deviceCount);
+
+ hostApi->deviceInfos = NULL;
+ }
+
+ if( scanResults != NULL )
+ {
+ PaWinWDMScanDeviceInfosResults *scanDeviceInfosResults = ( PaWinWDMScanDeviceInfosResults * ) scanResults;
+
+ if( deviceCount > 0 )
+ {
+ /* use the array allocated in ScanDeviceInfos() as our deviceInfos */
+ hostApi->deviceInfos = scanDeviceInfosResults->deviceInfos;
+
+ hostApi->info.defaultInputDevice = scanDeviceInfosResults->defaultInputDevice;
+ hostApi->info.defaultOutputDevice = scanDeviceInfosResults->defaultOutputDevice;
+
+ hostApi->info.deviceCount = deviceCount;
+ }
+
+ PaUtil_GroupFreeMemory( wdmHostApi->allocations, scanDeviceInfosResults );
+ }
+
+ return paNoError;
+
+}
+
+static PaError DisposeDeviceInfos( struct PaUtilHostApiRepresentation *hostApi, void *scanResults, int deviceCount )
+{
+ PaWinWdmHostApiRepresentation *winDsHostApi = (PaWinWdmHostApiRepresentation*)hostApi;
+
+ if( scanResults != NULL )
+ {
+ PaWinWDMScanDeviceInfosResults *scanDeviceInfosResults = ( PaWinWDMScanDeviceInfosResults * ) scanResults;
+
+ if( scanDeviceInfosResults->deviceInfos )
+ {
+ int i;
+ for (i = 0; i < deviceCount; ++i)
+ {
+ PaWinWdmDeviceInfo* pDevice = (PaWinWdmDeviceInfo*)scanDeviceInfosResults->deviceInfos[i];
+ if (pDevice->filter != 0)
+ {
+ FilterFree(pDevice->filter);
+ }
+ }
+
+ PaUtil_GroupFreeMemory( winDsHostApi->allocations, scanDeviceInfosResults->deviceInfos[0] ); /* all device info structs are allocated in a block so we can destroy them here */
+ PaUtil_GroupFreeMemory( winDsHostApi->allocations, scanDeviceInfosResults->deviceInfos );
+ }
+
+ PaUtil_GroupFreeMemory( winDsHostApi->allocations, scanDeviceInfosResults );
+ }
+
+ return paNoError;
+
+}
+
PaError PaWinWdm_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex hostApiIndex )
{
PaError result = paNoError;
- int i, deviceCount;
+ int deviceCount = 0;
+ void *scanResults = 0;
PaWinWdmHostApiRepresentation *wdmHostApi;
- PaWinWdmDeviceInfo *deviceInfoArray;
- PaWinWdmFilter* pFilter;
- PaWinWdmDeviceInfo *wdmDeviceInfo;
- PaDeviceInfo *deviceInfo;
PA_LOGE_;
+#ifdef PA_WDMKS_SET_TREF
+ tRef = PaUtil_GetTime();
+#endif
+
/*
Attempt to load the KSUSER.DLL without which we cannot create pins
We will unload this on termination
@@ -1779,6 +3687,18 @@ PaError PaWinWdm_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd
goto error;
}
+ /* Attempt to load AVRT.DLL, if we can't, then we'll just use time critical prio instead... */
+ if(DllAvRt == NULL)
+ {
+ DllAvRt = LoadLibrary(TEXT("avrt.dll"));
+ if (DllAvRt != NULL)
+ {
+ FunctionAvSetMmThreadCharacteristics = (AVSETMMTHREADCHARACTERISTICS*)GetProcAddress(DllAvRt,"AvSetMmThreadCharacteristicsA");
+ FunctionAvRevertMmThreadCharacteristics = (AVREVERTMMTHREADCHARACTERISTICS*)GetProcAddress(DllAvRt, "AvRevertMmThreadCharacteristics");
+ FunctionAvSetMmThreadPriority = (AVSETMMTHREADPRIORITY*)GetProcAddress(DllAvRt, "AvSetMmThreadPriority");
+ }
+ }
+
FunctionKsCreatePin = (KSCREATEPIN*)GetProcAddress(DllKsUser, "KsCreatePin");
if(FunctionKsCreatePin == NULL)
goto error;
@@ -1797,129 +3717,50 @@ PaError PaWinWdm_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd
goto error;
}
- result = BuildFilterList( wdmHostApi );
- if( result != paNoError )
- {
- goto error;
- }
- deviceCount = wdmHostApi->filterCount;
-
*hostApi = &wdmHostApi->inheritedHostApiRep;
(*hostApi)->info.structVersion = 1;
(*hostApi)->info.type = paWDMKS;
(*hostApi)->info.name = "Windows WDM-KS";
+
+ /* these are all updated by CommitDeviceInfos() */
+ (*hostApi)->info.deviceCount = 0;
(*hostApi)->info.defaultInputDevice = paNoDevice;
(*hostApi)->info.defaultOutputDevice = paNoDevice;
+ (*hostApi)->deviceInfos = 0;
- if( deviceCount > 0 )
+ result = ScanDeviceInfos(&wdmHostApi->inheritedHostApiRep, hostApiIndex, &scanResults, &deviceCount);
+ if (result != paNoError)
{
- (*hostApi)->deviceInfos = (PaDeviceInfo**)PaUtil_GroupAllocateMemory(
- wdmHostApi->allocations, sizeof(PaWinWdmDeviceInfo*) * deviceCount );
- if( !(*hostApi)->deviceInfos )
- {
- result = paInsufficientMemory;
- goto error;
- }
-
- /* allocate all device info structs in a contiguous block */
- deviceInfoArray = (PaWinWdmDeviceInfo*)PaUtil_GroupAllocateMemory(
- wdmHostApi->allocations, sizeof(PaWinWdmDeviceInfo) * deviceCount );
- if( !deviceInfoArray )
- {
- result = paInsufficientMemory;
- goto error;
- }
-
- for( i=0; i < deviceCount; ++i )
- {
- wdmDeviceInfo = &deviceInfoArray[i];
- deviceInfo = &wdmDeviceInfo->inheritedDeviceInfo;
- pFilter = wdmHostApi->filters[i];
- if( pFilter == NULL )
- continue;
- wdmDeviceInfo->filter = pFilter;
- deviceInfo->structVersion = 2;
- deviceInfo->hostApi = hostApiIndex;
- deviceInfo->name = (char*)pFilter->friendlyName;
- PA_DEBUG(("Device found name: %s\n",(char*)pFilter->friendlyName));
- deviceInfo->maxInputChannels = pFilter->maxInputChannels;
- if(deviceInfo->maxInputChannels > 0)
- {
- /* Set the default input device to the first device we find with
- * more than zero input channels
- **/
- if((*hostApi)->info.defaultInputDevice == paNoDevice)
- {
- (*hostApi)->info.defaultInputDevice = i;
- }
- }
-
- deviceInfo->maxOutputChannels = pFilter->maxOutputChannels;
- if(deviceInfo->maxOutputChannels > 0)
- {
- /* Set the default output device to the first device we find with
- * more than zero output channels
- **/
- if((*hostApi)->info.defaultOutputDevice == paNoDevice)
- {
- (*hostApi)->info.defaultOutputDevice = i;
- }
- }
-
- /* These low values are not very useful because
- * a) The lowest latency we end up with can depend on many factors such
- * as the device buffer sizes/granularities, sample rate, channels and format
- * b) We cannot know the device buffer sizes until we try to open/use it at
- * a particular setting
- * So: we give 512x48000Hz frames as the default low input latency
- **/
- deviceInfo->defaultLowInputLatency = (512.0/48000.0);
- deviceInfo->defaultLowOutputLatency = (512.0/48000.0);
- deviceInfo->defaultHighInputLatency = (4096.0/48000.0);
- deviceInfo->defaultHighOutputLatency = (4096.0/48000.0);
- deviceInfo->defaultSampleRate = (double)(pFilter->bestSampleRate);
-
- (*hostApi)->deviceInfos[i] = deviceInfo;
- }
+ goto error;
}
- (*hostApi)->info.deviceCount = deviceCount;
+ CommitDeviceInfos(&wdmHostApi->inheritedHostApiRep, hostApiIndex, scanResults, deviceCount);
(*hostApi)->Terminate = Terminate;
(*hostApi)->OpenStream = OpenStream;
(*hostApi)->IsFormatSupported = IsFormatSupported;
-
+ /* In preparation for hotplug
+ (*hostApi)->ScanDeviceInfos = ScanDeviceInfos;
+ (*hostApi)->CommitDeviceInfos = CommitDeviceInfos;
+ (*hostApi)->DisposeDeviceInfos = DisposeDeviceInfos;
+ */
PaUtil_InitializeStreamInterface( &wdmHostApi->callbackStreamInterface, CloseStream, StartStream,
- StopStream, AbortStream, IsStreamStopped, IsStreamActive,
- GetStreamTime, GetStreamCpuLoad,
- PaUtil_DummyRead, PaUtil_DummyWrite,
- PaUtil_DummyGetReadAvailable, PaUtil_DummyGetWriteAvailable );
+ StopStream, AbortStream, IsStreamStopped, IsStreamActive,
+ GetStreamTime, GetStreamCpuLoad,
+ PaUtil_DummyRead, PaUtil_DummyWrite,
+ PaUtil_DummyGetReadAvailable, PaUtil_DummyGetWriteAvailable );
PaUtil_InitializeStreamInterface( &wdmHostApi->blockingStreamInterface, CloseStream, StartStream,
- StopStream, AbortStream, IsStreamStopped, IsStreamActive,
- GetStreamTime, PaUtil_DummyGetCpuLoad,
- ReadStream, WriteStream, GetStreamReadAvailable, GetStreamWriteAvailable );
+ StopStream, AbortStream, IsStreamStopped, IsStreamActive,
+ GetStreamTime, PaUtil_DummyGetCpuLoad,
+ ReadStream, WriteStream, GetStreamReadAvailable, GetStreamWriteAvailable );
PA_LOGL_;
return result;
error:
- if( DllKsUser != NULL )
- {
- FreeLibrary( DllKsUser );
- DllKsUser = NULL;
- }
+ Terminate( (PaUtilHostApiRepresentation*)wdmHostApi );
- if( wdmHostApi )
- {
- PaUtil_FreeMemory( wdmHostApi->filters );
- if( wdmHostApi->allocations )
- {
- PaUtil_FreeAllAllocations( wdmHostApi->allocations );
- PaUtil_DestroyAllocationGroup( wdmHostApi->allocations );
- }
- PaUtil_FreeMemory( wdmHostApi );
- }
PA_LOGL_;
return result;
}
@@ -1928,85 +3769,42 @@ error:
static void Terminate( struct PaUtilHostApiRepresentation *hostApi )
{
PaWinWdmHostApiRepresentation *wdmHostApi = (PaWinWdmHostApiRepresentation*)hostApi;
- int i;
PA_LOGE_;
- if( wdmHostApi->filters )
+ /* Do not unload the libraries */
+ if( DllKsUser != NULL )
{
- for( i=0; ifilterCount; i++)
+ FreeLibrary( DllKsUser );
+ DllKsUser = NULL;
+ }
+
+ if( DllAvRt != NULL )
+ {
+ FreeLibrary( DllAvRt );
+ DllAvRt = NULL;
+ }
+
+ if( wdmHostApi)
+ {
+ PaWinWDMScanDeviceInfosResults* localScanResults = (PaWinWDMScanDeviceInfosResults*)PaUtil_GroupAllocateMemory(
+ wdmHostApi->allocations, sizeof(PaWinWDMScanDeviceInfosResults));
+ localScanResults->deviceInfos = hostApi->deviceInfos;
+ DisposeDeviceInfos(hostApi, localScanResults, hostApi->info.deviceCount);
+
+ if( wdmHostApi->allocations )
{
- if( wdmHostApi->filters[i] != NULL )
- {
- FilterFree( wdmHostApi->filters[i] );
- wdmHostApi->filters[i] = NULL;
- }
+ PaUtil_FreeAllAllocations( wdmHostApi->allocations );
+ PaUtil_DestroyAllocationGroup( wdmHostApi->allocations );
}
+ PaUtil_FreeMemory( wdmHostApi );
}
- PaUtil_FreeMemory( wdmHostApi->filters );
- if( wdmHostApi->allocations )
- {
- PaUtil_FreeAllAllocations( wdmHostApi->allocations );
- PaUtil_DestroyAllocationGroup( wdmHostApi->allocations );
- }
- PaUtil_FreeMemory( wdmHostApi );
- PA_LOGL_;
-}
-
-static void FillWFEXT( WAVEFORMATEXTENSIBLE* pwfext, PaSampleFormat sampleFormat, double sampleRate, int channelCount)
-{
- PA_LOGE_;
- PA_DEBUG(( "sampleFormat = %lx\n" , sampleFormat ));
- PA_DEBUG(( "sampleRate = %f\n" , sampleRate ));
- PA_DEBUG(( "chanelCount = %d\n", channelCount ));
-
- pwfext->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
- pwfext->Format.nChannels = channelCount;
- pwfext->Format.nSamplesPerSec = (int)sampleRate;
- if(channelCount == 1)
- pwfext->dwChannelMask = KSAUDIO_SPEAKER_DIRECTOUT;
- else
- pwfext->dwChannelMask = KSAUDIO_SPEAKER_STEREO;
- if(sampleFormat == paFloat32)
- {
- pwfext->Format.nBlockAlign = channelCount * 4;
- pwfext->Format.wBitsPerSample = 32;
- pwfext->Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX);
- pwfext->Samples.wValidBitsPerSample = 32;
- pwfext->SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT;
- }
- else if(sampleFormat == paInt32)
- {
- pwfext->Format.nBlockAlign = channelCount * 4;
- pwfext->Format.wBitsPerSample = 32;
- pwfext->Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX);
- pwfext->Samples.wValidBitsPerSample = 32;
- pwfext->SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
- }
- else if(sampleFormat == paInt24)
- {
- pwfext->Format.nBlockAlign = channelCount * 3;
- pwfext->Format.wBitsPerSample = 24;
- pwfext->Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX);
- pwfext->Samples.wValidBitsPerSample = 24;
- pwfext->SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
- }
- else if(sampleFormat == paInt16)
- {
- pwfext->Format.nBlockAlign = channelCount * 2;
- pwfext->Format.wBitsPerSample = 16;
- pwfext->Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX);
- pwfext->Samples.wValidBitsPerSample = 16;
- pwfext->SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
- }
- pwfext->Format.nAvgBytesPerSec = pwfext->Format.nSamplesPerSec * pwfext->Format.nBlockAlign;
-
PA_LOGL_;
}
static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi,
- const PaStreamParameters *inputParameters,
- const PaStreamParameters *outputParameters,
- double sampleRate )
+ const PaStreamParameters *inputParameters,
+ const PaStreamParameters *outputParameters,
+ double sampleRate )
{
int inputChannelCount, outputChannelCount;
PaSampleFormat inputSampleFormat, outputSampleFormat;
@@ -2014,49 +3812,114 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi,
PaWinWdmFilter* pFilter;
int result = paFormatIsSupported;
WAVEFORMATEXTENSIBLE wfx;
+ PaWinWaveFormatChannelMask channelMask;
PA_LOGE_;
if( inputParameters )
{
+ PaWinWdmDeviceInfo* pDeviceInfo = (PaWinWdmDeviceInfo*)wdmHostApi->inheritedHostApiRep.deviceInfos[inputParameters->device];
+ PaWinWdmPin* pin;
+ unsigned fmt;
+ unsigned long testFormat = 0;
+ unsigned validBits = 0;
+
inputChannelCount = inputParameters->channelCount;
inputSampleFormat = inputParameters->sampleFormat;
/* all standard sample formats are supported by the buffer adapter,
- this implementation doesn't support any custom sample formats */
+ this implementation doesn't support any custom sample formats */
if( inputSampleFormat & paCustomFormat )
+ {
+ PaWinWDM_SetLastErrorInfo(paSampleFormatNotSupported, "IsFormatSupported: Custom input format not supported");
return paSampleFormatNotSupported;
+ }
/* unless alternate device specification is supported, reject the use of
- paUseHostApiSpecificDeviceSpecification */
+ paUseHostApiSpecificDeviceSpecification */
if( inputParameters->device == paUseHostApiSpecificDeviceSpecification )
+ {
+ PaWinWDM_SetLastErrorInfo(paInvalidDevice, "IsFormatSupported: paUseHostApiSpecificDeviceSpecification not supported");
return paInvalidDevice;
+ }
/* check that input device can support inputChannelCount */
if( inputChannelCount > hostApi->deviceInfos[ inputParameters->device ]->maxInputChannels )
+ {
+ PaWinWDM_SetLastErrorInfo(paInvalidChannelCount, "IsFormatSupported: Invalid input channel count");
return paInvalidChannelCount;
+ }
/* validate inputStreamInfo */
if( inputParameters->hostApiSpecificStreamInfo )
+ {
+ PaWinWDM_SetLastErrorInfo(paIncompatibleHostApiSpecificStreamInfo, "Host API stream info not supported");
return paIncompatibleHostApiSpecificStreamInfo; /* this implementation doesn't use custom stream info */
+ }
+
+ pFilter = pDeviceInfo->filter;
+ pin = pFilter->pins[pDeviceInfo->pin];
+
+ /* Find out the testing format */
+ for (fmt = paFloat32; fmt <= paUInt8; fmt <<= 1)
+ {
+ if ((fmt & pin->formats) != 0)
+ {
+ /* Found a matching format! */
+ testFormat = fmt;
+ break;
+ }
+ }
+ if (testFormat == 0)
+ {
+ PaWinWDM_SetLastErrorInfo(result, "IsFormatSupported(capture) failed: no testformat found!");
+ return paUnanticipatedHostError;
+ }
+
+ /* Due to special considerations, WaveRT devices with paInt24 should be tested with paInt32 and
+ valid bits = 24 (instead of 24 bit samples) */
+ if (pFilter->devInfo.streamingType == Type_kWaveRT && testFormat == paInt24)
+ {
+ PA_DEBUG(("IsFormatSupported (capture): WaveRT overriding testFormat paInt24 with paInt32 (24 valid bits)"));
+ testFormat = paInt32;
+ validBits = 24;
+ }
/* Check that the input format is supported */
- FillWFEXT(&wfx,paInt16,sampleRate,inputChannelCount);
+ channelMask = PaWin_DefaultChannelMask(inputChannelCount);
+ PaWin_InitializeWaveFormatExtensible((PaWinWaveFormat*)&wfx,
+ inputChannelCount,
+ testFormat,
+ PaWin_SampleFormatToLinearWaveFormatTag(testFormat),
+ sampleRate,
+ channelMask );
+ if (validBits != 0)
+ {
+ wfx.Samples.wValidBitsPerSample = validBits;
+ }
- pFilter = wdmHostApi->filters[inputParameters->device];
- result = FilterCanCreateCapturePin(pFilter,(const WAVEFORMATEX*)&wfx);
+ result = PinIsFormatSupported(pin, (const WAVEFORMATEX*)&wfx);
if( result != paNoError )
{
/* Try a WAVE_FORMAT_PCM instead */
- wfx.Format.wFormatTag = WAVE_FORMAT_PCM;
- wfx.Format.cbSize = 0;
- wfx.Samples.wValidBitsPerSample = 0;
- wfx.dwChannelMask = 0;
- wfx.SubFormat = GUID_NULL;
- result = FilterCanCreateCapturePin(pFilter,(const WAVEFORMATEX*)&wfx);
+ PaWin_InitializeWaveFormatEx((PaWinWaveFormat*)&wfx,
+ inputChannelCount,
+ testFormat,
+ PaWin_SampleFormatToLinearWaveFormatTag(testFormat),
+ sampleRate);
+
+ if (validBits != 0)
+ {
+ wfx.Samples.wValidBitsPerSample = validBits;
+ }
+
+ result = PinIsFormatSupported(pin, (const WAVEFORMATEX*)&wfx);
if( result != paNoError )
- return result;
+ {
+ PaWinWDM_SetLastErrorInfo(result, "IsFormatSupported(capture) failed: sr=%u,ch=%u,bits=%u", wfx.Format.nSamplesPerSec, wfx.Format.nChannels, wfx.Format.wBitsPerSample);
+ return result;
+ }
}
}
else
@@ -2066,44 +3929,109 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi,
if( outputParameters )
{
+ PaWinWdmDeviceInfo* pDeviceInfo = (PaWinWdmDeviceInfo*)wdmHostApi->inheritedHostApiRep.deviceInfos[outputParameters->device];
+ PaWinWdmPin* pin;
+ unsigned fmt;
+ unsigned long testFormat = 0;
+ unsigned validBits = 0;
+
outputChannelCount = outputParameters->channelCount;
outputSampleFormat = outputParameters->sampleFormat;
/* all standard sample formats are supported by the buffer adapter,
- this implementation doesn't support any custom sample formats */
+ this implementation doesn't support any custom sample formats */
if( outputSampleFormat & paCustomFormat )
+ {
+ PaWinWDM_SetLastErrorInfo(paSampleFormatNotSupported, "IsFormatSupported: Custom output format not supported");
return paSampleFormatNotSupported;
+ }
/* unless alternate device specification is supported, reject the use of
- paUseHostApiSpecificDeviceSpecification */
+ paUseHostApiSpecificDeviceSpecification */
if( outputParameters->device == paUseHostApiSpecificDeviceSpecification )
+ {
+ PaWinWDM_SetLastErrorInfo(paInvalidDevice, "IsFormatSupported: paUseHostApiSpecificDeviceSpecification not supported");
return paInvalidDevice;
+ }
/* check that output device can support outputChannelCount */
if( outputChannelCount > hostApi->deviceInfos[ outputParameters->device ]->maxOutputChannels )
+ {
+ PaWinWDM_SetLastErrorInfo(paInvalidChannelCount, "Invalid output channel count");
return paInvalidChannelCount;
+ }
/* validate outputStreamInfo */
if( outputParameters->hostApiSpecificStreamInfo )
+ {
+ PaWinWDM_SetLastErrorInfo(paIncompatibleHostApiSpecificStreamInfo, "Host API stream info not supported");
return paIncompatibleHostApiSpecificStreamInfo; /* this implementation doesn't use custom stream info */
+ }
+
+ pFilter = pDeviceInfo->filter;
+ pin = pFilter->pins[pDeviceInfo->pin];
+
+ /* Find out the testing format */
+ for (fmt = paFloat32; fmt <= paUInt8; fmt <<= 1)
+ {
+ if ((fmt & pin->formats) != 0)
+ {
+ /* Found a matching format! */
+ testFormat = fmt;
+ break;
+ }
+ }
+ if (testFormat == 0)
+ {
+ PaWinWDM_SetLastErrorInfo(result, "IsFormatSupported(render) failed: no testformat found!");
+ return paUnanticipatedHostError;
+ }
+
+ /* Due to special considerations, WaveRT devices with paInt24 should be tested with paInt32 and
+ valid bits = 24 (instead of 24 bit samples) */
+ if (pFilter->devInfo.streamingType == Type_kWaveRT && testFormat == paInt24)
+ {
+ PA_DEBUG(("IsFormatSupported (render): WaveRT overriding testFormat paInt24 with paInt32 (24 valid bits)"));
+ testFormat = paInt32;
+ validBits = 24;
+ }
/* Check that the output format is supported */
- FillWFEXT(&wfx,paInt16,sampleRate,outputChannelCount);
+ channelMask = PaWin_DefaultChannelMask(outputChannelCount);
+ PaWin_InitializeWaveFormatExtensible((PaWinWaveFormat*)&wfx,
+ outputChannelCount,
+ testFormat,
+ PaWin_SampleFormatToLinearWaveFormatTag(testFormat),
+ sampleRate,
+ channelMask );
- pFilter = wdmHostApi->filters[outputParameters->device];
- result = FilterCanCreateRenderPin(pFilter,(const WAVEFORMATEX*)&wfx);
+ if (validBits != 0)
+ {
+ wfx.Samples.wValidBitsPerSample = validBits;
+ }
+
+ result = PinIsFormatSupported(pin, (const WAVEFORMATEX*)&wfx);
if( result != paNoError )
{
/* Try a WAVE_FORMAT_PCM instead */
- wfx.Format.wFormatTag = WAVE_FORMAT_PCM;
- wfx.Format.cbSize = 0;
- wfx.Samples.wValidBitsPerSample = 0;
- wfx.dwChannelMask = 0;
- wfx.SubFormat = GUID_NULL;
- result = FilterCanCreateRenderPin(pFilter,(const WAVEFORMATEX*)&wfx);
+ PaWin_InitializeWaveFormatEx((PaWinWaveFormat*)&wfx,
+ outputChannelCount,
+ testFormat,
+ PaWin_SampleFormatToLinearWaveFormatTag(testFormat),
+ sampleRate);
+
+ if (validBits != 0)
+ {
+ wfx.Samples.wValidBitsPerSample = validBits;
+ }
+
+ result = PinIsFormatSupported(pin, (const WAVEFORMATEX*)&wfx);
if( result != paNoError )
- return result;
+ {
+ PaWinWDM_SetLastErrorInfo(result, "IsFormatSupported(render) failed: %u,%u,%u", wfx.Format.nSamplesPerSec, wfx.Format.nChannels, wfx.Format.wBitsPerSample);
+ return result;
+ }
}
}
@@ -2113,43 +4041,149 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi,
}
/*
- IMPLEMENT ME:
+ IMPLEMENT ME:
- - if a full duplex stream is requested, check that the combination
- of input and output parameters is supported if necessary
+ - if a full duplex stream is requested, check that the combination
+ of input and output parameters is supported if necessary
- - check that the device supports sampleRate
+ - check that the device supports sampleRate
- Because the buffer adapter handles conversion between all standard
- sample formats, the following checks are only required if paCustomFormat
- is implemented, or under some other unusual conditions.
+ Because the buffer adapter handles conversion between all standard
+ sample formats, the following checks are only required if paCustomFormat
+ is implemented, or under some other unusual conditions.
- - check that input device can support inputSampleFormat, or that
- we have the capability to convert from inputSampleFormat to
- a native format
+ - check that input device can support inputSampleFormat, or that
+ we have the capability to convert from inputSampleFormat to
+ a native format
- - check that output device can support outputSampleFormat, or that
- we have the capability to convert from outputSampleFormat to
- a native format
+ - check that output device can support outputSampleFormat, or that
+ we have the capability to convert from outputSampleFormat to
+ a native format
*/
if((inputChannelCount == 0)&&(outputChannelCount == 0))
- result = paSampleFormatNotSupported; /* Not right error */
+ {
+ PaWinWDM_SetLastErrorInfo(paSampleFormatNotSupported, "No input or output channels defined");
+ result = paSampleFormatNotSupported; /* Not right error */
+ }
PA_LOGL_;
return result;
}
+static void ResetStreamEvents(PaWinWdmStream* stream)
+{
+ unsigned i;
+ ResetEvent(stream->eventAbort);
+ ResetEvent(stream->eventStreamStart[StreamStart_kOk]);
+ ResetEvent(stream->eventStreamStart[StreamStart_kFailed]);
+
+ for (i=0; icapture.noOfPackets; ++i)
+ {
+ if (stream->capture.events && stream->capture.events[i])
+ {
+ ResetEvent(stream->capture.events[i]);
+ }
+ }
+
+ for (i=0; irender.noOfPackets; ++i)
+ {
+ if (stream->render.events && stream->render.events[i])
+ {
+ ResetEvent(stream->render.events[i]);
+ }
+ }
+}
+
+static void CloseStreamEvents(PaWinWdmStream* stream)
+{
+ unsigned i;
+ PaWinWdmIOInfo* ios[2] = { &stream->capture, &stream->render };
+
+ if (stream->eventAbort)
+ {
+ CloseHandle(stream->eventAbort);
+ stream->eventAbort = 0;
+ }
+ if (stream->eventStreamStart[StreamStart_kOk])
+ {
+ CloseHandle(stream->eventStreamStart[StreamStart_kOk]);
+ }
+ if (stream->eventStreamStart[StreamStart_kFailed])
+ {
+ CloseHandle(stream->eventStreamStart[StreamStart_kFailed]);
+ }
+
+ for (i = 0; i < 2; ++i)
+ {
+ unsigned j;
+ /* Unregister notification handles for WaveRT */
+ if (ios[i]->pPin && ios[i]->pPin->parentFilter->devInfo.streamingType == Type_kWaveRT &&
+ ios[i]->pPin->pinKsSubType == SubType_kNotification &&
+ ios[i]->events != 0)
+ {
+ PinUnregisterNotificationHandle(ios[i]->pPin, ios[i]->events[0]);
+ }
+
+ for (j=0; j < ios[i]->noOfPackets; ++j)
+ {
+ if (ios[i]->events && ios[i]->events[j])
+ {
+ CloseHandle(ios[i]->events[j]);
+ ios[i]->events[j] = 0;
+ }
+ }
+ }
+}
+
+static unsigned NextPowerOf2(unsigned val)
+{
+ val--;
+ val = (val >> 1) | val;
+ val = (val >> 2) | val;
+ val = (val >> 4) | val;
+ val = (val >> 8) | val;
+ val = (val >> 16) | val;
+ return ++val;
+}
+
+static PaError ValidateSpecificStreamParameters(
+ const PaStreamParameters *streamParameters,
+ const PaWinWDMKSInfo *streamInfo)
+{
+ if( streamInfo )
+ {
+ if( streamInfo->size != sizeof( PaWinWDMKSInfo )
+ || streamInfo->version != 1 )
+ {
+ PA_DEBUG(("Stream parameters: size or version not correct"));
+ return paIncompatibleHostApiSpecificStreamInfo;
+ }
+
+ if (streamInfo->noOfPackets != 0 &&
+ (streamInfo->noOfPackets < 2 || streamInfo->noOfPackets > 8))
+ {
+ PA_DEBUG(("Stream parameters: noOfPackets %u out of range [2,8]", streamInfo->noOfPackets));
+ return paIncompatibleHostApiSpecificStreamInfo;
+ }
+
+ }
+
+ return paNoError;
+}
+
+
+
/* see pa_hostapi.h for a list of validity guarantees made about OpenStream parameters */
static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi,
- PaStream** s,
- const PaStreamParameters *inputParameters,
- const PaStreamParameters *outputParameters,
- double sampleRate,
- unsigned long framesPerBuffer,
- PaStreamFlags streamFlags,
- PaStreamCallback *streamCallback,
- void *userData )
+ PaStream** s,
+ const PaStreamParameters *inputParameters,
+ const PaStreamParameters *outputParameters,
+ double sampleRate,
+ unsigned long framesPerUserBuffer,
+ PaStreamFlags streamFlags,
+ PaStreamCallback *streamCallback,
+ void *userData )
{
PaError result = paNoError;
PaWinWdmHostApiRepresentation *wdmHostApi = (PaWinWdmHostApiRepresentation*)hostApi;
@@ -2158,13 +4192,11 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi,
PaSampleFormat inputSampleFormat, outputSampleFormat;
PaSampleFormat hostInputSampleFormat, hostOutputSampleFormat;
int userInputChannels,userOutputChannels;
- int size;
- PaWinWdmFilter* pFilter;
WAVEFORMATEXTENSIBLE wfx;
PA_LOGE_;
PA_DEBUG(("OpenStream:sampleRate = %f\n",sampleRate));
- PA_DEBUG(("OpenStream:framesPerBuffer = %lu\n",framesPerBuffer));
+ PA_DEBUG(("OpenStream:framesPerBuffer = %lu\n",framesPerUserBuffer));
if( inputParameters )
{
@@ -2172,24 +4204,33 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi,
inputSampleFormat = inputParameters->sampleFormat;
/* unless alternate device specification is supported, reject the use of
- paUseHostApiSpecificDeviceSpecification */
+ paUseHostApiSpecificDeviceSpecification */
if( inputParameters->device == paUseHostApiSpecificDeviceSpecification )
+ {
+ PaWinWDM_SetLastErrorInfo(paInvalidDevice, "paUseHostApiSpecificDeviceSpecification(in) not supported");
return paInvalidDevice;
+ }
/* check that input device can support stream->userInputChannels */
if( userInputChannels > hostApi->deviceInfos[ inputParameters->device ]->maxInputChannels )
+ {
+ PaWinWDM_SetLastErrorInfo(paInvalidChannelCount, "Invalid input channel count");
return paInvalidChannelCount;
+ }
/* validate inputStreamInfo */
- if( inputParameters->hostApiSpecificStreamInfo )
- return paIncompatibleHostApiSpecificStreamInfo; /* this implementation doesn't use custom stream info */
-
+ result = ValidateSpecificStreamParameters(inputParameters, inputParameters->hostApiSpecificStreamInfo);
+ if(result != paNoError)
+ {
+ PaWinWDM_SetLastErrorInfo(result, "Host API stream info not supported (in)");
+ return result; /* this implementation doesn't use custom stream info */
+ }
}
else
{
userInputChannels = 0;
- inputSampleFormat = hostInputSampleFormat = paInt16; /* Surpress 'uninitialised var' warnings. */
+ inputSampleFormat = hostInputSampleFormat = paInt16; /* Supress 'uninitialised var' warnings. */
}
if( outputParameters )
@@ -2198,29 +4239,41 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi,
outputSampleFormat = outputParameters->sampleFormat;
/* unless alternate device specification is supported, reject the use of
- paUseHostApiSpecificDeviceSpecification */
+ paUseHostApiSpecificDeviceSpecification */
if( outputParameters->device == paUseHostApiSpecificDeviceSpecification )
+ {
+ PaWinWDM_SetLastErrorInfo(paInvalidDevice, "paUseHostApiSpecificDeviceSpecification(out) not supported");
return paInvalidDevice;
+ }
/* check that output device can support stream->userInputChannels */
if( userOutputChannels > hostApi->deviceInfos[ outputParameters->device ]->maxOutputChannels )
+ {
+ PaWinWDM_SetLastErrorInfo(paInvalidChannelCount, "Invalid output channel count");
return paInvalidChannelCount;
+ }
/* validate outputStreamInfo */
- if( outputParameters->hostApiSpecificStreamInfo )
- return paIncompatibleHostApiSpecificStreamInfo; /* this implementation doesn't use custom stream info */
-
+ result = ValidateSpecificStreamParameters( outputParameters, outputParameters->hostApiSpecificStreamInfo );
+ if (result != paNoError)
+ {
+ PaWinWDM_SetLastErrorInfo(result, "Host API stream info not supported (out)");
+ return result; /* this implementation doesn't use custom stream info */
+ }
}
else
{
userOutputChannels = 0;
- outputSampleFormat = hostOutputSampleFormat = paInt16; /* Surpress 'uninitialized var' warnings. */
+ outputSampleFormat = hostOutputSampleFormat = paInt16; /* Supress 'uninitialized var' warnings. */
}
/* validate platform specific flags */
if( (streamFlags & paPlatformSpecificFlags) != 0 )
+ {
+ PaWinWDM_SetLastErrorInfo(paInvalidFlag, "Invalid flag supplied");
return paInvalidFlag; /* unexpected platform specific flag */
+ }
stream = (PaWinWdmStream*)PaUtil_AllocateMemory( sizeof(PaWinWdmStream) );
if( !stream )
@@ -2228,18 +4281,33 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi,
result = paInsufficientMemory;
goto error;
}
+
+ /* Create allocation group */
+ stream->allocGroup = PaUtil_CreateAllocationGroup();
+ if( !stream->allocGroup )
+ {
+ result = paInsufficientMemory;
+ goto error;
+ }
+
/* Zero the stream object */
/* memset((void*)stream,0,sizeof(PaWinWdmStream)); */
if( streamCallback )
{
PaUtil_InitializeStreamRepresentation( &stream->streamRepresentation,
- &wdmHostApi->callbackStreamInterface, streamCallback, userData );
+ &wdmHostApi->callbackStreamInterface, streamCallback, userData );
}
else
{
- PaUtil_InitializeStreamRepresentation( &stream->streamRepresentation,
- &wdmHostApi->blockingStreamInterface, streamCallback, userData );
+ /* PaUtil_InitializeStreamRepresentation( &stream->streamRepresentation,
+ &wdmHostApi->blockingStreamInterface, streamCallback, userData ); */
+
+ /* We don't support the blocking API yet */
+ PA_DEBUG(("Blocking API not supported yet!\n"));
+ PaWinWDM_SetLastErrorInfo(paUnanticipatedHostError, "Blocking API not supported yet");
+ result = paUnanticipatedHostError;
+ goto error;
}
PaUtil_InitializeCpuLoadMeasurer( &stream->cpuLoadMeasurer, sampleRate );
@@ -2247,315 +4315,767 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi,
/* Instantiate the input pin if necessary */
if(userInputChannels > 0)
{
+ PaWinWdmFilter* pFilter;
+ PaWinWdmDeviceInfo* pDeviceInfo;
+ PaWinWdmPin* pPin;
+ unsigned validBitsPerSample = 0;
+ PaWinWaveFormatChannelMask channelMask = PaWin_DefaultChannelMask( userInputChannels );
+
result = paSampleFormatNotSupported;
- pFilter = wdmHostApi->filters[inputParameters->device];
+ pDeviceInfo = (PaWinWdmDeviceInfo*)wdmHostApi->inheritedHostApiRep.deviceInfos[inputParameters->device];
+ pFilter = pDeviceInfo->filter;
+ pPin = pFilter->pins[pDeviceInfo->pin];
+
stream->userInputChannels = userInputChannels;
- if(((inputSampleFormat & ~paNonInterleaved) & pFilter->formats) != 0)
- { /* inputSampleFormat is supported, so try to use it */
- hostInputSampleFormat = inputSampleFormat;
- FillWFEXT(&wfx, hostInputSampleFormat, sampleRate, stream->userInputChannels);
- stream->bytesPerInputFrame = wfx.Format.nBlockAlign;
- stream->recordingPin = FilterCreateCapturePin(pFilter, (const WAVEFORMATEX*)&wfx, &result);
- stream->deviceInputChannels = stream->userInputChannels;
- }
-
- if(result != paNoError)
- { /* Search through all PaSampleFormats to find one that works */
- hostInputSampleFormat = paFloat32;
-
- do {
- FillWFEXT(&wfx, hostInputSampleFormat, sampleRate, stream->userInputChannels);
- stream->bytesPerInputFrame = wfx.Format.nBlockAlign;
- stream->recordingPin = FilterCreateCapturePin(pFilter, (const WAVEFORMATEX*)&wfx, &result);
- stream->deviceInputChannels = stream->userInputChannels;
-
- if(stream->recordingPin == NULL) result = paSampleFormatNotSupported;
- if(result != paNoError) hostInputSampleFormat <<= 1;
- }
- while(result != paNoError && hostInputSampleFormat <= paUInt8);
- }
-
- if(result != paNoError)
- { /* None of the PaSampleFormats worked. Set the hostInputSampleFormat to the best fit
- * and try a PCM format.
- **/
- hostInputSampleFormat =
- PaUtil_SelectClosestAvailableFormat( pFilter->formats, inputSampleFormat );
-
- /* Try a WAVE_FORMAT_PCM instead */
- wfx.Format.wFormatTag = WAVE_FORMAT_PCM;
- wfx.Format.cbSize = 0;
- wfx.Samples.wValidBitsPerSample = 0;
- wfx.dwChannelMask = 0;
- wfx.SubFormat = GUID_NULL;
- stream->recordingPin = FilterCreateCapturePin(pFilter,(const WAVEFORMATEX*)&wfx,&result);
- if(stream->recordingPin == NULL) result = paSampleFormatNotSupported;
- }
-
- if( result != paNoError )
+ hostInputSampleFormat = PaUtil_SelectClosestAvailableFormat( pPin->formats, inputSampleFormat );
+ if (hostInputSampleFormat == paSampleFormatNotSupported)
{
- /* Some or all KS devices can only handle the exact number of channels
- * they specify. But PortAudio clients expect to be able to
- * at least specify mono I/O on a multi-channel device
- * If this is the case, then we will do the channel mapping internally
- **/
- if( stream->userInputChannels < pFilter->maxInputChannels )
- {
- FillWFEXT(&wfx,hostInputSampleFormat,sampleRate,pFilter->maxInputChannels);
- stream->bytesPerInputFrame = wfx.Format.nBlockAlign;
- stream->recordingPin = FilterCreateCapturePin(pFilter,(const WAVEFORMATEX*)&wfx,&result);
- stream->deviceInputChannels = pFilter->maxInputChannels;
+ result = paUnanticipatedHostError;
+ PaWinWDM_SetLastErrorInfo(result, "PU_SCAF(%X,%X) failed (input)", pPin->formats, inputSampleFormat);
+ goto error;
+ }
+ else if (pFilter->devInfo.streamingType == Type_kWaveRT && hostInputSampleFormat == paInt24)
+ {
+ /* For WaveRT, we choose 32 bit format instead of paInt24, since we MIGHT need to align buffer on a
+ 128 byte boundary (see PinGetBuffer) */
+ hostInputSampleFormat = paInt32;
+ /* But we'll tell the driver that it's 24 bit in 32 bit container */
+ validBitsPerSample = 24;
+ }
- if( result != paNoError )
+ while (hostInputSampleFormat <= paUInt8)
+ {
+ unsigned channelsToProbe = stream->userInputChannels;
+ /* Some or all KS devices can only handle the exact number of channels
+ * they specify. But PortAudio clients expect to be able to
+ * at least specify mono I/O on a multi-channel device
+ * If this is the case, then we will do the channel mapping internally
+ * The following loop tests this case
+ **/
+ while (1)
+ {
+ PaWin_InitializeWaveFormatExtensible((PaWinWaveFormat*)&wfx,
+ channelsToProbe,
+ hostInputSampleFormat,
+ PaWin_SampleFormatToLinearWaveFormatTag(hostInputSampleFormat),
+ sampleRate,
+ channelMask );
+ stream->capture.bytesPerFrame = wfx.Format.nBlockAlign;
+ if (validBitsPerSample != 0)
+ {
+ wfx.Samples.wValidBitsPerSample = validBitsPerSample;
+ }
+ stream->capture.pPin = FilterCreatePin(pFilter, pPin->pinId, (WAVEFORMATEX*)&wfx, &result);
+ stream->deviceInputChannels = channelsToProbe;
+
+ if( result != paNoError && result != paDeviceUnavailable )
{
/* Try a WAVE_FORMAT_PCM instead */
- wfx.Format.wFormatTag = WAVE_FORMAT_PCM;
- wfx.Format.cbSize = 0;
- wfx.Samples.wValidBitsPerSample = 0;
- wfx.dwChannelMask = 0;
- wfx.SubFormat = GUID_NULL;
- stream->recordingPin = FilterCreateCapturePin(pFilter,(const WAVEFORMATEX*)&wfx,&result);
+ PaWin_InitializeWaveFormatEx((PaWinWaveFormat*)&wfx,
+ channelsToProbe,
+ hostInputSampleFormat,
+ PaWin_SampleFormatToLinearWaveFormatTag(hostInputSampleFormat),
+ sampleRate);
+ if (validBitsPerSample != 0)
+ {
+ wfx.Samples.wValidBitsPerSample = validBitsPerSample;
+ }
+ stream->capture.pPin = FilterCreatePin(pFilter, pPin->pinId, (const WAVEFORMATEX*)&wfx, &result);
}
+
+ if (result == paDeviceUnavailable) goto occupied;
+
+ if (result == paNoError)
+ {
+ /* We're done */
+ break;
+ }
+
+ if (channelsToProbe < (unsigned)pPin->maxChannels)
+ {
+ /* Go to next multiple of 2 */
+ channelsToProbe = min((((channelsToProbe>>1)+1)<<1), (unsigned)pPin->maxChannels);
+ continue;
+ }
+
+ break;
}
+
+ if (result == paNoError)
+ {
+ /* We're done */
+ break;
+ }
+
+ /* Go to next format in line with lower resolution */
+ hostInputSampleFormat <<= 1;
}
- if(stream->recordingPin == NULL)
+ if(stream->capture.pPin == NULL)
{
+ PaWinWDM_SetLastErrorInfo(result, "Failed to create capture pin: sr=%u,ch=%u,bits=%u,align=%u",
+ wfx.Format.nSamplesPerSec, wfx.Format.nChannels, wfx.Format.wBitsPerSample, wfx.Format.nBlockAlign);
goto error;
}
- switch(hostInputSampleFormat)
+ /* Select correct mux input on MUX node of topology filter */
+ if (pDeviceInfo->muxPosition >= 0)
{
- case paInt16: stream->inputSampleSize = 2; break;
- case paInt24: stream->inputSampleSize = 3; break;
- case paInt32:
- case paFloat32: stream->inputSampleSize = 4; break;
+ assert(pPin->parentFilter->topologyFilter != NULL);
+
+ result = FilterUse(pPin->parentFilter->topologyFilter);
+ if (result != paNoError)
+ {
+ PaWinWDM_SetLastErrorInfo(result, "Failed to open topology filter");
+ goto error;
+ }
+
+ result = WdmSetMuxNodeProperty(pPin->parentFilter->topologyFilter->handle,
+ pPin->inputs[pDeviceInfo->muxPosition]->muxNodeId,
+ pPin->inputs[pDeviceInfo->muxPosition]->muxPinId);
+
+ FilterRelease(pPin->parentFilter->topologyFilter);
+
+ if(result != paNoError)
+ {
+ PaWinWDM_SetLastErrorInfo(result, "Failed to set topology mux node");
+ goto error;
+ }
}
- stream->recordingPin->frameSize /= stream->bytesPerInputFrame;
- PA_DEBUG(("Pin output frames: %d\n",stream->recordingPin->frameSize));
+ stream->capture.bytesPerSample = stream->capture.bytesPerFrame / stream->deviceInputChannels;
+ stream->capture.pPin->frameSize /= stream->capture.bytesPerFrame;
+ PA_DEBUG(("Capture pin frames: %d\n",stream->capture.pPin->frameSize));
}
else
{
- stream->recordingPin = NULL;
- stream->bytesPerInputFrame = 0;
+ stream->capture.pPin = NULL;
+ stream->capture.bytesPerFrame = 0;
}
/* Instantiate the output pin if necessary */
if(userOutputChannels > 0)
{
+ PaWinWdmFilter* pFilter;
+ PaWinWdmDeviceInfo* pDeviceInfo;
+ PaWinWdmPin* pPin;
+ unsigned validBitsPerSample = 0;
+ PaWinWaveFormatChannelMask channelMask = PaWin_DefaultChannelMask( userOutputChannels );
+
result = paSampleFormatNotSupported;
- pFilter = wdmHostApi->filters[outputParameters->device];
+ pDeviceInfo = (PaWinWdmDeviceInfo*)wdmHostApi->inheritedHostApiRep.deviceInfos[outputParameters->device];
+ pFilter = pDeviceInfo->filter;
+ pPin = pFilter->pins[pDeviceInfo->pin];
+
stream->userOutputChannels = userOutputChannels;
- if(((outputSampleFormat & ~paNonInterleaved) & pFilter->formats) != 0)
+ hostOutputSampleFormat = PaUtil_SelectClosestAvailableFormat( pPin->formats, outputSampleFormat );
+ if (hostOutputSampleFormat == paSampleFormatNotSupported)
{
- hostOutputSampleFormat = outputSampleFormat;
- FillWFEXT(&wfx,hostOutputSampleFormat,sampleRate,stream->userOutputChannels);
- stream->bytesPerOutputFrame = wfx.Format.nBlockAlign;
- stream->playbackPin = FilterCreateRenderPin(pFilter,(WAVEFORMATEX*)&wfx,&result);
- stream->deviceOutputChannels = stream->userOutputChannels;
+ result = paUnanticipatedHostError;
+ PaWinWDM_SetLastErrorInfo(result, "PU_SCAF(%X,%X) failed (output)", pPin->formats, hostOutputSampleFormat);
+ goto error;
+ }
+ else if (pFilter->devInfo.streamingType == Type_kWaveRT && hostOutputSampleFormat == paInt24)
+ {
+ /* For WaveRT, we choose 32 bit format instead of paInt24, since we MIGHT need to align buffer on a
+ 128 byte boundary (see PinGetBuffer) */
+ hostOutputSampleFormat = paInt32;
+ /* But we'll tell the driver that it's 24 bit in 32 bit container */
+ validBitsPerSample = 24;
}
- if(result != paNoError)
- {
- hostOutputSampleFormat = paFloat32;
-
- do {
- FillWFEXT(&wfx,hostOutputSampleFormat,sampleRate,stream->userOutputChannels);
- stream->bytesPerOutputFrame = wfx.Format.nBlockAlign;
- stream->playbackPin = FilterCreateRenderPin(pFilter,(WAVEFORMATEX*)&wfx,&result);
- stream->deviceOutputChannels = stream->userOutputChannels;
-
- if(stream->playbackPin == NULL) result = paSampleFormatNotSupported;
- if(result != paNoError) hostOutputSampleFormat <<= 1;
- }
- while(result != paNoError && hostOutputSampleFormat <= paUInt8);
- }
-
- if(result != paNoError)
- {
- hostOutputSampleFormat =
- PaUtil_SelectClosestAvailableFormat( pFilter->formats, outputSampleFormat );
-
- /* Try a WAVE_FORMAT_PCM instead */
- wfx.Format.wFormatTag = WAVE_FORMAT_PCM;
- wfx.Format.cbSize = 0;
- wfx.Samples.wValidBitsPerSample = 0;
- wfx.dwChannelMask = 0;
- wfx.SubFormat = GUID_NULL;
- stream->playbackPin = FilterCreateRenderPin(pFilter,(WAVEFORMATEX*)&wfx,&result);
- if(stream->playbackPin == NULL) result = paSampleFormatNotSupported;
- }
-
- if( result != paNoError )
+ while (hostOutputSampleFormat <= paUInt8)
{
+ unsigned channelsToProbe = stream->userOutputChannels;
/* Some or all KS devices can only handle the exact number of channels
- * they specify. But PortAudio clients expect to be able to
- * at least specify mono I/O on a multi-channel device
- * If this is the case, then we will do the channel mapping internally
- **/
- if( stream->userOutputChannels < pFilter->maxOutputChannels )
+ * they specify. But PortAudio clients expect to be able to
+ * at least specify mono I/O on a multi-channel device
+ * If this is the case, then we will do the channel mapping internally
+ * The following loop tests this case
+ **/
+ while (1)
{
- FillWFEXT(&wfx,hostOutputSampleFormat,sampleRate,pFilter->maxOutputChannels);
- stream->bytesPerOutputFrame = wfx.Format.nBlockAlign;
- stream->playbackPin = FilterCreateRenderPin(pFilter,(const WAVEFORMATEX*)&wfx,&result);
- stream->deviceOutputChannels = pFilter->maxOutputChannels;
- if( result != paNoError )
+ PaWin_InitializeWaveFormatExtensible((PaWinWaveFormat*)&wfx,
+ channelsToProbe,
+ hostOutputSampleFormat,
+ PaWin_SampleFormatToLinearWaveFormatTag(hostOutputSampleFormat),
+ sampleRate,
+ channelMask );
+ stream->render.bytesPerFrame = wfx.Format.nBlockAlign;
+ if (validBitsPerSample != 0)
{
- /* Try a WAVE_FORMAT_PCM instead */
- wfx.Format.wFormatTag = WAVE_FORMAT_PCM;
- wfx.Format.cbSize = 0;
- wfx.Samples.wValidBitsPerSample = 0;
- wfx.dwChannelMask = 0;
- wfx.SubFormat = GUID_NULL;
- stream->playbackPin = FilterCreateRenderPin(pFilter,(const WAVEFORMATEX*)&wfx,&result);
+ wfx.Samples.wValidBitsPerSample = validBitsPerSample;
}
+ stream->render.pPin = FilterCreatePin(pFilter, pPin->pinId, (WAVEFORMATEX*)&wfx, &result);
+ stream->deviceOutputChannels = channelsToProbe;
+
+ if( result != paNoError && result != paDeviceUnavailable )
+ {
+ PaWin_InitializeWaveFormatEx((PaWinWaveFormat*)&wfx,
+ channelsToProbe,
+ hostOutputSampleFormat,
+ PaWin_SampleFormatToLinearWaveFormatTag(hostOutputSampleFormat),
+ sampleRate);
+ if (validBitsPerSample != 0)
+ {
+ wfx.Samples.wValidBitsPerSample = validBitsPerSample;
+ }
+ stream->render.pPin = FilterCreatePin(pFilter, pPin->pinId, (const WAVEFORMATEX*)&wfx, &result);
+ }
+
+ if (result == paDeviceUnavailable) goto occupied;
+
+ if (result == paNoError)
+ {
+ /* We're done */
+ break;
+ }
+
+ if (channelsToProbe < (unsigned)pPin->maxChannels)
+ {
+ /* Go to next multiple of 2 */
+ channelsToProbe = min((((channelsToProbe>>1)+1)<<1), (unsigned)pPin->maxChannels);
+ continue;
+ }
+
+ break;
+ };
+
+ if (result == paNoError)
+ {
+ /* We're done */
+ break;
}
+
+ /* Go to next format in line with lower resolution */
+ hostOutputSampleFormat <<= 1;
}
- if(stream->playbackPin == NULL)
+ if(stream->render.pPin == NULL)
{
+ PaWinWDM_SetLastErrorInfo(result, "Failed to create render pin: sr=%u,ch=%u,bits=%u,align=%u",
+ wfx.Format.nSamplesPerSec, wfx.Format.nChannels, wfx.Format.wBitsPerSample, wfx.Format.nBlockAlign);
goto error;
}
- switch(hostOutputSampleFormat)
- {
- case paInt16: stream->outputSampleSize = 2; break;
- case paInt24: stream->outputSampleSize = 3; break;
- case paInt32:
- case paFloat32: stream->outputSampleSize = 4; break;
- }
-
- stream->playbackPin->frameSize /= stream->bytesPerOutputFrame;
- PA_DEBUG(("Pin output frames: %d\n",stream->playbackPin->frameSize));
+ stream->render.bytesPerSample = stream->render.bytesPerFrame / stream->deviceOutputChannels;
+ stream->render.pPin->frameSize /= stream->render.bytesPerFrame;
+ PA_DEBUG(("Render pin frames: %d\n",stream->render.pPin->frameSize));
}
else
{
- stream->playbackPin = NULL;
- stream->bytesPerOutputFrame = 0;
+ stream->render.pPin = NULL;
+ stream->render.bytesPerFrame = 0;
}
/* Calculate the framesPerHostXxxxBuffer size based upon the suggested latency values */
-
/* Record the buffer length */
if(inputParameters)
{
/* Calculate the frames from the user's value - add a bit to round up */
- stream->framesPerHostIBuffer = (unsigned long)((inputParameters->suggestedLatency*sampleRate)+0.0001);
- if(stream->framesPerHostIBuffer > (unsigned long)sampleRate)
+ stream->capture.framesPerBuffer = (unsigned long)((inputParameters->suggestedLatency*sampleRate)+0.0001);
+ if(stream->capture.framesPerBuffer > (unsigned long)sampleRate)
{ /* Upper limit is 1 second */
- stream->framesPerHostIBuffer = (unsigned long)sampleRate;
+ stream->capture.framesPerBuffer = (unsigned long)sampleRate;
}
- else if(stream->framesPerHostIBuffer < stream->recordingPin->frameSize)
+ else if(stream->capture.framesPerBuffer < stream->capture.pPin->frameSize)
{
- stream->framesPerHostIBuffer = stream->recordingPin->frameSize;
+ stream->capture.framesPerBuffer = stream->capture.pPin->frameSize;
+ }
+ PA_DEBUG(("Input frames chosen:%ld\n",stream->capture.framesPerBuffer));
+
+ /* Setup number of packets to use */
+ stream->capture.noOfPackets = 2;
+
+ if (inputParameters->hostApiSpecificStreamInfo)
+ {
+ PaWinWDMKSInfo* pInfo = (PaWinWDMKSInfo*)inputParameters->hostApiSpecificStreamInfo;
+
+ if (stream->capture.pPin->parentFilter->devInfo.streamingType == Type_kWaveCyclic &&
+ pInfo->noOfPackets != 0)
+ {
+ stream->capture.noOfPackets = pInfo->noOfPackets;
+ }
}
- PA_DEBUG(("Input frames chosen:%ld\n",stream->framesPerHostIBuffer));
}
if(outputParameters)
{
/* Calculate the frames from the user's value - add a bit to round up */
- stream->framesPerHostOBuffer = (unsigned long)((outputParameters->suggestedLatency*sampleRate)+0.0001);
- if(stream->framesPerHostOBuffer > (unsigned long)sampleRate)
+ stream->render.framesPerBuffer = (unsigned long)((outputParameters->suggestedLatency*sampleRate)+0.0001);
+ if(stream->render.framesPerBuffer > (unsigned long)sampleRate)
{ /* Upper limit is 1 second */
- stream->framesPerHostOBuffer = (unsigned long)sampleRate;
+ stream->render.framesPerBuffer = (unsigned long)sampleRate;
}
- else if(stream->framesPerHostOBuffer < stream->playbackPin->frameSize)
+ else if(stream->render.framesPerBuffer < stream->render.pPin->frameSize)
{
- stream->framesPerHostOBuffer = stream->playbackPin->frameSize;
+ stream->render.framesPerBuffer = stream->render.pPin->frameSize;
+ }
+ PA_DEBUG(("Output frames chosen:%ld\n",stream->render.framesPerBuffer));
+
+ /* Setup number of packets to use */
+ stream->render.noOfPackets = 2;
+
+ if (outputParameters->hostApiSpecificStreamInfo)
+ {
+ PaWinWDMKSInfo* pInfo = (PaWinWDMKSInfo*)outputParameters->hostApiSpecificStreamInfo;
+
+ if (stream->render.pPin->parentFilter->devInfo.streamingType == Type_kWaveCyclic &&
+ pInfo->noOfPackets != 0)
+ {
+ stream->render.noOfPackets = pInfo->noOfPackets;
+ }
}
- PA_DEBUG(("Output frames chosen:%ld\n",stream->framesPerHostOBuffer));
}
- /* Host buffer size is bounded to the largest of the input and output
- frame sizes */
-
+ /* Host buffer size is bound to the largest of the input and output frame sizes */
result = PaUtil_InitializeBufferProcessor( &stream->bufferProcessor,
- stream->userInputChannels, inputSampleFormat, hostInputSampleFormat,
- stream->userOutputChannels, outputSampleFormat, hostOutputSampleFormat,
- sampleRate, streamFlags, framesPerBuffer,
- max(stream->framesPerHostOBuffer,stream->framesPerHostIBuffer),
- paUtilBoundedHostBufferSize,
- streamCallback, userData );
+ stream->userInputChannels, inputSampleFormat, hostInputSampleFormat,
+ stream->userOutputChannels, outputSampleFormat, hostOutputSampleFormat,
+ sampleRate, streamFlags, framesPerUserBuffer,
+ max(stream->capture.framesPerBuffer, stream->render.framesPerBuffer),
+ paUtilBoundedHostBufferSize,
+ streamCallback, userData );
if( result != paNoError )
+ {
+ PaWinWDM_SetLastErrorInfo(result, "PaUtil_InitializeBufferProcessor failed: ich=%u, isf=%u, hisf=%u, och=%u, osf=%u, hosf=%u, sr=%lf, flags=0x%X, fpub=%u, fphb=%u",
+ stream->userInputChannels, inputSampleFormat, hostInputSampleFormat,
+ stream->userOutputChannels, outputSampleFormat, hostOutputSampleFormat,
+ sampleRate, streamFlags, framesPerUserBuffer,
+ max(stream->capture.framesPerBuffer, stream->render.framesPerBuffer));
goto error;
+ }
+
+ /* Allocate/get all the buffers for host I/O */
+ if (stream->userInputChannels > 0)
+ {
+ stream->streamRepresentation.streamInfo.inputLatency = stream->capture.framesPerBuffer / sampleRate;
+
+ switch (stream->capture.pPin->parentFilter->devInfo.streamingType)
+ {
+ case Type_kWaveCyclic:
+ {
+ unsigned size = stream->capture.noOfPackets * stream->capture.framesPerBuffer * stream->capture.bytesPerFrame;
+ /* Allocate input host buffer */
+ stream->capture.hostBuffer = (char*)PaUtil_GroupAllocateMemory(stream->allocGroup, size);
+ PA_DEBUG(("Input buffer allocated (size = %u)\n", size));
+ if( !stream->capture.hostBuffer )
+ {
+ PA_DEBUG(("Cannot allocate host input buffer!\n"));
+ PaWinWDM_SetLastErrorInfo(paInsufficientMemory, "Failed to allocate input buffer");
+ result = paInsufficientMemory;
+ goto error;
+ }
+ stream->capture.hostBufferSize = size;
+ PA_DEBUG(("Input buffer start = %p (size=%u)\n",stream->capture.hostBuffer, stream->capture.hostBufferSize));
+ stream->capture.pPin->fnEventHandler = PaPinCaptureEventHandler_WaveCyclic;
+ stream->capture.pPin->fnSubmitHandler = PaPinCaptureSubmitHandler_WaveCyclic;
+ }
+ break;
+ case Type_kWaveRT:
+ {
+ const DWORD dwTotalSize = 2 * stream->capture.framesPerBuffer * stream->capture.bytesPerFrame;
+ DWORD dwRequestedSize = dwTotalSize;
+ BOOL bCallMemoryBarrier = FALSE;
+ ULONG hwFifoLatency = 0;
+ ULONG dummy;
+ result = PinGetBuffer(stream->capture.pPin, (void**)&stream->capture.hostBuffer, &dwRequestedSize, &bCallMemoryBarrier);
+ if (!result)
+ {
+ PA_DEBUG(("Input buffer start = %p, size = %u\n", stream->capture.hostBuffer, dwRequestedSize));
+ if (dwRequestedSize != dwTotalSize)
+ {
+ PA_DEBUG(("Buffer length changed by driver from %u to %u !\n", dwTotalSize, dwRequestedSize));
+ /* Recalculate to what the driver has given us */
+ stream->capture.framesPerBuffer = dwRequestedSize / (2 * stream->capture.bytesPerFrame);
+ }
+ stream->capture.hostBufferSize = dwRequestedSize;
+
+ if (stream->capture.pPin->pinKsSubType == SubType_kPolled)
+ {
+ stream->capture.pPin->fnEventHandler = PaPinCaptureEventHandler_WaveRTPolled;
+ stream->capture.pPin->fnSubmitHandler = PaPinCaptureSubmitHandler_WaveRTPolled;
+ }
+ else
+ {
+ stream->capture.pPin->fnEventHandler = PaPinCaptureEventHandler_WaveRTEvent;
+ stream->capture.pPin->fnSubmitHandler = PaPinCaptureSubmitHandler_WaveRTEvent;
+ }
+
+ stream->capture.pPin->fnMemBarrier = bCallMemoryBarrier ? MemoryBarrierRead : MemoryBarrierDummy;
+ }
+ else
+ {
+ PA_DEBUG(("Failed to get input buffer (WaveRT)\n"));
+ PaWinWDM_SetLastErrorInfo(paUnanticipatedHostError, "Failed to get input buffer (WaveRT)");
+ result = paUnanticipatedHostError;
+ goto error;
+ }
+
+ /* Get latency */
+ result = PinGetHwLatency(stream->capture.pPin, &hwFifoLatency, &dummy, &dummy);
+ if (result == paNoError)
+ {
+ stream->capture.pPin->hwLatency = hwFifoLatency;
+
+ /* Add HW latency into total input latency */
+ stream->streamRepresentation.streamInfo.inputLatency += ((hwFifoLatency / stream->capture.bytesPerFrame) / sampleRate);
+ }
+ else
+ {
+ PA_DEBUG(("Failed to get size of FIFO hardware buffer (is set to zero)\n"));
+ stream->capture.pPin->hwLatency = 0;
+ }
+ }
+ break;
+ default:
+ /* Undefined wave type!! */
+ assert(0);
+ result = paInternalError;
+ PaWinWDM_SetLastErrorInfo(result, "Wave type %u ??", stream->capture.pPin->parentFilter->devInfo.streamingType);
+ goto error;
+ }
+ }
+ else
+ {
+ stream->capture.hostBuffer = 0;
+ }
+
+ if (stream->userOutputChannels > 0)
+ {
+ stream->streamRepresentation.streamInfo.outputLatency = stream->render.framesPerBuffer / sampleRate;
+
+ switch (stream->render.pPin->parentFilter->devInfo.streamingType)
+ {
+ case Type_kWaveCyclic:
+ {
+ unsigned size = stream->render.noOfPackets * stream->render.framesPerBuffer * stream->render.bytesPerFrame;
+ /* Allocate output device buffer */
+ stream->render.hostBuffer = (char*)PaUtil_GroupAllocateMemory(stream->allocGroup, size);
+ PA_DEBUG(("Output buffer allocated (size = %u)\n", size));
+ if( !stream->render.hostBuffer )
+ {
+ PA_DEBUG(("Cannot allocate host output buffer!\n"));
+ PaWinWDM_SetLastErrorInfo(paInsufficientMemory, "Failed to allocate output buffer");
+ result = paInsufficientMemory;
+ goto error;
+ }
+ stream->render.hostBufferSize = size;
+ PA_DEBUG(("Output buffer start = %p (size=%u)\n",stream->render.hostBuffer, stream->render.hostBufferSize));
+
+ stream->render.pPin->fnEventHandler = PaPinRenderEventHandler_WaveCyclic;
+ stream->render.pPin->fnSubmitHandler = PaPinRenderSubmitHandler_WaveCyclic;
+ }
+ break;
+ case Type_kWaveRT:
+ {
+ const DWORD dwTotalSize = 2 * stream->render.framesPerBuffer * stream->render.bytesPerFrame;
+ DWORD dwRequestedSize = dwTotalSize;
+ BOOL bCallMemoryBarrier = FALSE;
+ ULONG hwFifoLatency = 0;
+ ULONG dummy;
+ result = PinGetBuffer(stream->render.pPin, (void**)&stream->render.hostBuffer, &dwRequestedSize, &bCallMemoryBarrier);
+ if (!result)
+ {
+ PA_DEBUG(("Output buffer start = %p, size = %u, membarrier = %u\n", stream->render.hostBuffer, dwRequestedSize, bCallMemoryBarrier));
+ if (dwRequestedSize != dwTotalSize)
+ {
+ PA_DEBUG(("Buffer length changed by driver from %u to %u !\n", dwTotalSize, dwRequestedSize));
+ /* Recalculate to what the driver has given us */
+ stream->render.framesPerBuffer = dwRequestedSize / (2 * stream->render.bytesPerFrame);
+ }
+ stream->render.hostBufferSize = dwRequestedSize;
+
+ if (stream->render.pPin->pinKsSubType == SubType_kPolled)
+ {
+ stream->render.pPin->fnEventHandler = PaPinRenderEventHandler_WaveRTPolled;
+ stream->render.pPin->fnSubmitHandler = PaPinRenderSubmitHandler_WaveRTPolled;
+ }
+ else
+ {
+ stream->render.pPin->fnEventHandler = PaPinRenderEventHandler_WaveRTEvent;
+ stream->render.pPin->fnSubmitHandler = PaPinRenderSubmitHandler_WaveRTEvent;
+ }
+
+ stream->render.pPin->fnMemBarrier = bCallMemoryBarrier ? MemoryBarrierWrite : MemoryBarrierDummy;
+ }
+ else
+ {
+ PA_DEBUG(("Failed to get output buffer (with notification)\n"));
+ PaWinWDM_SetLastErrorInfo(paUnanticipatedHostError, "Failed to get output buffer (with notification)");
+ result = paUnanticipatedHostError;
+ goto error;
+ }
+
+ /* Get latency */
+ result = PinGetHwLatency(stream->render.pPin, &hwFifoLatency, &dummy, &dummy);
+ if (result == paNoError)
+ {
+ stream->render.pPin->hwLatency = hwFifoLatency;
+
+ /* Add HW latency into total output latency */
+ stream->streamRepresentation.streamInfo.outputLatency += ((hwFifoLatency / stream->render.bytesPerFrame) / sampleRate);
+ }
+ else
+ {
+ PA_DEBUG(("Failed to get size of FIFO hardware buffer (is set to zero)\n"));
+ stream->render.pPin->hwLatency = 0;
+ }
+ }
+ break;
+ default:
+ /* Undefined wave type!! */
+ assert(0);
+ result = paInternalError;
+ PaWinWDM_SetLastErrorInfo(result, "Wave type %u ??", stream->capture.pPin->parentFilter->devInfo.streamingType);
+ goto error;
+ }
+ }
+ else
+ {
+ stream->render.hostBuffer = 0;
+ }
- stream->streamRepresentation.streamInfo.inputLatency =
- ((double)stream->framesPerHostIBuffer) / sampleRate;
- stream->streamRepresentation.streamInfo.outputLatency =
- ((double)stream->framesPerHostOBuffer) / sampleRate;
stream->streamRepresentation.streamInfo.sampleRate = sampleRate;
- PA_DEBUG(("BytesPerInputFrame = %d\n",stream->bytesPerInputFrame));
- PA_DEBUG(("BytesPerOutputFrame = %d\n",stream->bytesPerOutputFrame));
+ PA_DEBUG(("BytesPerInputFrame = %d\n",stream->capture.bytesPerFrame));
+ PA_DEBUG(("BytesPerOutputFrame = %d\n",stream->render.bytesPerFrame));
- /* Allocate all the buffers for host I/O */
- size = 2 * (stream->framesPerHostIBuffer*stream->bytesPerInputFrame + stream->framesPerHostOBuffer*stream->bytesPerOutputFrame);
- PA_DEBUG(("Buffer size = %d\n",size));
- stream->hostBuffer = (char*)PaUtil_AllocateMemory(size);
- PA_DEBUG(("Buffer allocated\n"));
- if( !stream->hostBuffer )
+ /* memset(stream->hostBuffer,0,size); */
+
+ /* Abort */
+ stream->eventAbort = CreateEvent(NULL, TRUE, FALSE, NULL);
+ if (stream->eventAbort == 0)
+ {
+ result = paInsufficientMemory;
+ goto error;
+ }
+ stream->eventStreamStart[0] = CreateEvent(NULL, TRUE, FALSE, NULL);
+ if (stream->eventStreamStart[0] == 0)
+ {
+ result = paInsufficientMemory;
+ goto error;
+ }
+ stream->eventStreamStart[1] = CreateEvent(NULL, TRUE, FALSE, NULL);
+ if (stream->eventStreamStart[1] == 0)
{
- PA_DEBUG(("Cannot allocate host buffer!\n"));
result = paInsufficientMemory;
goto error;
}
- PA_DEBUG(("Buffer start = %p\n",stream->hostBuffer));
- /* memset(stream->hostBuffer,0,size); */
- /* Set up the packets */
- stream->events[0] = CreateEvent(NULL, FALSE, FALSE, NULL);
- ResetEvent(stream->events[0]); /* Record buffer 1 */
- stream->events[1] = CreateEvent(NULL, FALSE, FALSE, NULL);
- ResetEvent(stream->events[1]); /* Record buffer 2 */
- stream->events[2] = CreateEvent(NULL, FALSE, FALSE, NULL);
- ResetEvent(stream->events[2]); /* Play buffer 1 */
- stream->events[3] = CreateEvent(NULL, FALSE, FALSE, NULL);
- ResetEvent(stream->events[3]); /* Play buffer 2 */
- stream->events[4] = CreateEvent(NULL, FALSE, FALSE, NULL);
- ResetEvent(stream->events[4]); /* Abort event */
if(stream->userInputChannels > 0)
{
- DATAPACKET *p = &(stream->packets[0]);
- p->Signal.hEvent = stream->events[0];
- p->Header.Data = stream->hostBuffer;
- p->Header.FrameExtent = stream->framesPerHostIBuffer*stream->bytesPerInputFrame;
- p->Header.DataUsed = 0;
- p->Header.Size = sizeof(p->Header);
- p->Header.PresentationTime.Numerator = 1;
- p->Header.PresentationTime.Denominator = 1;
+ const unsigned bufferSizeInBytes = stream->capture.framesPerBuffer * stream->capture.bytesPerFrame;
+ const unsigned ringBufferFrameSize = NextPowerOf2( 1024 + 2 * max(stream->capture.framesPerBuffer, stream->render.framesPerBuffer) );
- p = &(stream->packets[1]);
- p->Signal.hEvent = stream->events[1];
- p->Header.Data = stream->hostBuffer + stream->framesPerHostIBuffer*stream->bytesPerInputFrame;
- p->Header.FrameExtent = stream->framesPerHostIBuffer*stream->bytesPerInputFrame;
- p->Header.DataUsed = 0;
- p->Header.Size = sizeof(p->Header);
- p->Header.PresentationTime.Numerator = 1;
- p->Header.PresentationTime.Denominator = 1;
+ stream->capture.events = (HANDLE*)PaUtil_GroupAllocateMemory(stream->allocGroup, stream->capture.noOfPackets * sizeof(HANDLE));
+ if (stream->capture.events == NULL)
+ {
+ result = paInsufficientMemory;
+ goto error;
+ }
+
+ stream->capture.packets = (DATAPACKET*)PaUtil_GroupAllocateMemory(stream->allocGroup, stream->capture.noOfPackets * sizeof(DATAPACKET));
+ if (stream->capture.packets == NULL)
+ {
+ result = paInsufficientMemory;
+ goto error;
+ }
+
+ switch(stream->capture.pPin->parentFilter->devInfo.streamingType)
+ {
+ case Type_kWaveCyclic:
+ {
+ /* WaveCyclic case */
+ unsigned i;
+ for (i = 0; i < stream->capture.noOfPackets; ++i)
+ {
+ /* Set up the packets */
+ DATAPACKET *p = stream->capture.packets + i;
+
+ /* Record event */
+ stream->capture.events[i] = CreateEvent(NULL, TRUE, FALSE, NULL);
+
+ p->Signal.hEvent = stream->capture.events[i];
+ p->Header.Data = stream->capture.hostBuffer + (i*bufferSizeInBytes);
+ p->Header.FrameExtent = bufferSizeInBytes;
+ p->Header.DataUsed = 0;
+ p->Header.Size = sizeof(p->Header);
+ p->Header.PresentationTime.Numerator = 1;
+ p->Header.PresentationTime.Denominator = 1;
+ }
+ }
+ break;
+ case Type_kWaveRT:
+ {
+ /* Set up the "packets" */
+ DATAPACKET *p = stream->capture.packets + 0;
+
+ /* Record event: WaveRT has a single event for 2 notification per buffer */
+ stream->capture.events[0] = CreateEvent(NULL, FALSE, FALSE, NULL);
+
+ p->Header.Data = stream->capture.hostBuffer;
+ p->Header.FrameExtent = bufferSizeInBytes;
+ p->Header.DataUsed = 0;
+ p->Header.Size = sizeof(p->Header);
+ p->Header.PresentationTime.Numerator = 1;
+ p->Header.PresentationTime.Denominator = 1;
+
+ ++p;
+ p->Header.Data = stream->capture.hostBuffer + bufferSizeInBytes;
+ p->Header.FrameExtent = bufferSizeInBytes;
+ p->Header.DataUsed = 0;
+ p->Header.Size = sizeof(p->Header);
+ p->Header.PresentationTime.Numerator = 1;
+ p->Header.PresentationTime.Denominator = 1;
+
+ if (stream->capture.pPin->pinKsSubType == SubType_kNotification)
+ {
+ result = PinRegisterNotificationHandle(stream->capture.pPin, stream->capture.events[0]);
+
+ if (result != paNoError)
+ {
+ PA_DEBUG(("Failed to register capture notification handle\n"));
+ PaWinWDM_SetLastErrorInfo(paUnanticipatedHostError, "Failed to register capture notification handle");
+ result = paUnanticipatedHostError;
+ goto error;
+ }
+ }
+
+ result = PinRegisterPositionRegister(stream->capture.pPin);
+
+ if (result != paNoError)
+ {
+ PA_DEBUG(("Failed to register capture position register, using PinGetAudioPositionViaIOCTL\n"));
+ stream->capture.pPin->fnAudioPosition = PinGetAudioPositionViaIOCTL;
+ }
+ else
+ {
+ stream->capture.pPin->fnAudioPosition = PinGetAudioPositionDirect;
+ }
+ }
+ break;
+ default:
+ /* Undefined wave type!! */
+ assert(0);
+ result = paInternalError;
+ PaWinWDM_SetLastErrorInfo(result, "Wave type %u ??", stream->capture.pPin->parentFilter->devInfo.streamingType);
+ goto error;
+ }
+
+ /* Setup the input ring buffer here */
+ stream->ringBufferData = (char*)PaUtil_GroupAllocateMemory(stream->allocGroup, ringBufferFrameSize * stream->capture.bytesPerFrame);
+ if (stream->ringBufferData == NULL)
+ {
+ result = paInsufficientMemory;
+ goto error;
+ }
+ PaUtil_InitializeRingBuffer(&stream->ringBuffer, stream->capture.bytesPerFrame, ringBufferFrameSize, stream->ringBufferData);
}
if(stream->userOutputChannels > 0)
{
- DATAPACKET *p = &(stream->packets[2]);
- p->Signal.hEvent = stream->events[2];
- p->Header.Data = stream->hostBuffer + 2*stream->framesPerHostIBuffer*stream->bytesPerInputFrame;
- p->Header.FrameExtent = stream->framesPerHostOBuffer*stream->bytesPerOutputFrame;
- p->Header.DataUsed = stream->framesPerHostOBuffer*stream->bytesPerOutputFrame;
- p->Header.Size = sizeof(p->Header);
- p->Header.PresentationTime.Numerator = 1;
- p->Header.PresentationTime.Denominator = 1;
-
- p = &(stream->packets[3]);
- p->Signal.hEvent = stream->events[3];
- p->Header.Data = stream->hostBuffer + 2*stream->framesPerHostIBuffer*stream->bytesPerInputFrame + stream->framesPerHostOBuffer*stream->bytesPerOutputFrame;
- p->Header.FrameExtent = stream->framesPerHostOBuffer*stream->bytesPerOutputFrame;
- p->Header.DataUsed = stream->framesPerHostOBuffer*stream->bytesPerOutputFrame;
- p->Header.Size = sizeof(p->Header);
- p->Header.PresentationTime.Numerator = 1;
- p->Header.PresentationTime.Denominator = 1;
+ const unsigned bufferSizeInBytes = stream->render.framesPerBuffer * stream->render.bytesPerFrame;
+
+ stream->render.events = (HANDLE*)PaUtil_GroupAllocateMemory(stream->allocGroup, stream->render.noOfPackets * sizeof(HANDLE));
+ if (stream->render.events == NULL)
+ {
+ result = paInsufficientMemory;
+ goto error;
+ }
+
+ stream->render.packets = (DATAPACKET*)PaUtil_GroupAllocateMemory(stream->allocGroup, stream->render.noOfPackets * sizeof(DATAPACKET));
+ if (stream->render.packets == NULL)
+ {
+ result = paInsufficientMemory;
+ goto error;
+ }
+
+ switch(stream->render.pPin->parentFilter->devInfo.streamingType)
+ {
+ case Type_kWaveCyclic:
+ {
+ /* WaveCyclic case */
+ unsigned i;
+ for (i = 0; i < stream->render.noOfPackets; ++i)
+ {
+ /* Set up the packets */
+ DATAPACKET *p = stream->render.packets + i;
+
+ /* Playback event */
+ stream->render.events[i] = CreateEvent(NULL, TRUE, FALSE, NULL);
+
+ /* In this case, we just use the packets as ptr to the device buffer */
+ p->Signal.hEvent = stream->render.events[i];
+ p->Header.Data = stream->render.hostBuffer + (i*bufferSizeInBytes);
+ p->Header.FrameExtent = bufferSizeInBytes;
+ p->Header.DataUsed = bufferSizeInBytes;
+ p->Header.Size = sizeof(p->Header);
+ p->Header.PresentationTime.Numerator = 1;
+ p->Header.PresentationTime.Denominator = 1;
+ }
+ }
+ break;
+ case Type_kWaveRT:
+ {
+ /* WaveRT case */
+
+ /* Set up the "packets" */
+ DATAPACKET *p = stream->render.packets;
+
+ /* The only playback event */
+ stream->render.events[0] = CreateEvent(NULL, FALSE, FALSE, NULL);
+
+ /* In this case, we just use the packets as ptr to the device buffer */
+ p->Header.Data = stream->render.hostBuffer;
+ p->Header.FrameExtent = stream->render.framesPerBuffer*stream->render.bytesPerFrame;
+ p->Header.DataUsed = stream->render.framesPerBuffer*stream->render.bytesPerFrame;
+ p->Header.Size = sizeof(p->Header);
+ p->Header.PresentationTime.Numerator = 1;
+ p->Header.PresentationTime.Denominator = 1;
+
+ ++p;
+ p->Header.Data = stream->render.hostBuffer + stream->render.framesPerBuffer*stream->render.bytesPerFrame;
+ p->Header.FrameExtent = stream->render.framesPerBuffer*stream->render.bytesPerFrame;
+ p->Header.DataUsed = stream->render.framesPerBuffer*stream->render.bytesPerFrame;
+ p->Header.Size = sizeof(p->Header);
+ p->Header.PresentationTime.Numerator = 1;
+ p->Header.PresentationTime.Denominator = 1;
+
+ if (stream->render.pPin->pinKsSubType == SubType_kNotification)
+ {
+ result = PinRegisterNotificationHandle(stream->render.pPin, stream->render.events[0]);
+
+ if (result != paNoError)
+ {
+ PA_DEBUG(("Failed to register rendering notification handle\n"));
+ PaWinWDM_SetLastErrorInfo(paUnanticipatedHostError, "Failed to register rendering notification handle");
+ result = paUnanticipatedHostError;
+ goto error;
+ }
+ }
+
+ result = PinRegisterPositionRegister(stream->render.pPin);
+
+ if (result != paNoError)
+ {
+ PA_DEBUG(("Failed to register rendering position register, using PinGetAudioPositionViaIOCTL\n"));
+ stream->render.pPin->fnAudioPosition = PinGetAudioPositionViaIOCTL;
+ }
+ else
+ {
+ stream->render.pPin->fnAudioPosition = PinGetAudioPositionDirect;
+ }
+ }
+ break;
+ default:
+ /* Undefined wave type!! */
+ assert(0);
+ result = paInternalError;
+ PaWinWDM_SetLastErrorInfo(result, "Wave type %u ??", stream->capture.pPin->parentFilter->devInfo.streamingType);
+ goto error;
+ }
}
stream->streamStarted = 0;
@@ -2565,45 +5085,93 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi,
stream->streamFlags = streamFlags;
stream->oldProcessPriority = REALTIME_PRIORITY_CLASS;
+ /* Increase ref count on filters in use, so that a CommitDeviceInfos won't delete them */
+ if (stream->capture.pPin != 0)
+ {
+ FilterAddRef(stream->capture.pPin->parentFilter);
+ }
+ if (stream->render.pPin != 0)
+ {
+ FilterAddRef(stream->render.pPin->parentFilter);
+ }
+
+ /* Ok, now update our host API specific stream info */
+ if (stream->userInputChannels)
+ {
+ PaWinWdmDeviceInfo *pDeviceInfo = (PaWinWdmDeviceInfo*)wdmHostApi->inheritedHostApiRep.deviceInfos[inputParameters->device];
+
+ stream->hostApiStreamInfo.input.device = Pa_HostApiDeviceIndexToDeviceIndex(Pa_HostApiTypeIdToHostApiIndex(paWDMKS), inputParameters->device);
+ stream->hostApiStreamInfo.input.channels = stream->deviceInputChannels;
+ stream->hostApiStreamInfo.input.muxNodeId = -1;
+ if (stream->capture.pPin->inputs)
+ {
+ stream->hostApiStreamInfo.input.muxNodeId = stream->capture.pPin->inputs[pDeviceInfo->muxPosition]->muxNodeId;
+ }
+ stream->hostApiStreamInfo.input.endpointPinId = pDeviceInfo->endpointPinId;
+ stream->hostApiStreamInfo.input.framesPerHostBuffer = stream->capture.framesPerBuffer;
+ stream->hostApiStreamInfo.input.streamingSubType = stream->capture.pPin->pinKsSubType;
+ }
+ else
+ {
+ stream->hostApiStreamInfo.input.device = paNoDevice;
+ }
+ if (stream->userOutputChannels)
+ {
+ stream->hostApiStreamInfo.output.device = Pa_HostApiDeviceIndexToDeviceIndex(Pa_HostApiTypeIdToHostApiIndex(paWDMKS), outputParameters->device);
+ stream->hostApiStreamInfo.output.channels = stream->deviceOutputChannels;
+ stream->hostApiStreamInfo.output.framesPerHostBuffer = stream->render.framesPerBuffer;
+ stream->hostApiStreamInfo.output.endpointPinId = stream->render.pPin->endpointPinId;
+ stream->hostApiStreamInfo.output.streamingSubType = stream->render.pPin->pinKsSubType;
+ }
+ else
+ {
+ stream->hostApiStreamInfo.output.device = paNoDevice;
+ }
+ /*stream->streamRepresentation.streamInfo.hostApiTypeId = paWDMKS;
+ stream->streamRepresentation.streamInfo.hostApiSpecificStreamInfo = &stream->hostApiStreamInfo;*/
+ stream->streamRepresentation.streamInfo.structVersion = 2;
+
*s = (PaStream*)stream;
PA_LOGL_;
return result;
+occupied:
+ /* Ok, someone else is hogging the pin, bail out */
+ assert (result == paDeviceUnavailable);
+ PaWinWDM_SetLastErrorInfo(result, "Device is occupied");
+
error:
- size = 5;
- while(size--)
+ PaUtil_TerminateBufferProcessor( &stream->bufferProcessor );
+
+ CloseStreamEvents(stream);
+
+ if (stream->allocGroup)
{
- if(stream->events[size] != NULL)
- {
- CloseHandle(stream->events[size]);
- stream->events[size] = NULL;
- }
+ PaUtil_FreeAllAllocations(stream->allocGroup);
+ PaUtil_DestroyAllocationGroup(stream->allocGroup);
+ stream->allocGroup = 0;
}
- if(stream->hostBuffer)
- PaUtil_FreeMemory( stream->hostBuffer );
- if(stream->playbackPin)
- PinClose(stream->playbackPin);
- if(stream->recordingPin)
- PinClose(stream->recordingPin);
+ if(stream->render.pPin)
+ PinClose(stream->render.pPin);
+ if(stream->capture.pPin)
+ PinClose(stream->capture.pPin);
- if( stream )
- PaUtil_FreeMemory( stream );
+ PaUtil_FreeMemory( stream );
PA_LOGL_;
return result;
}
/*
- When CloseStream() is called, the multi-api layer ensures that
- the stream has already been stopped or aborted.
+When CloseStream() is called, the multi-api layer ensures that
+the stream has already been stopped or aborted.
*/
static PaError CloseStream( PaStream* s )
{
PaError result = paNoError;
PaWinWdmStream *stream = (PaWinWdmStream*)s;
- int size;
PA_LOGE_;
@@ -2612,22 +5180,33 @@ static PaError CloseStream( PaStream* s )
PaUtil_TerminateBufferProcessor( &stream->bufferProcessor );
PaUtil_TerminateStreamRepresentation( &stream->streamRepresentation );
- size = 5;
- while(size--)
- {
- if(stream->events[size] != NULL)
- {
- CloseHandle(stream->events[size]);
- stream->events[size] = NULL;
- }
- }
- if(stream->hostBuffer)
- PaUtil_FreeMemory( stream->hostBuffer );
- if(stream->playbackPin)
- PinClose(stream->playbackPin);
- if(stream->recordingPin)
- PinClose(stream->recordingPin);
+ CloseStreamEvents(stream);
+
+ if (stream->allocGroup)
+ {
+ PaUtil_FreeAllAllocations(stream->allocGroup);
+ PaUtil_DestroyAllocationGroup(stream->allocGroup);
+ stream->allocGroup = 0;
+ }
+
+ if(stream->render.pPin)
+ {
+ PinClose(stream->render.pPin);
+ }
+ if(stream->capture.pPin)
+ {
+ PinClose(stream->capture.pPin);
+ }
+
+ if (stream->render.pPin)
+ {
+ FilterFree(stream->render.pPin->parentFilter);
+ }
+ if (stream->capture.pPin)
+ {
+ FilterFree(stream->capture.pPin->parentFilter);
+ }
PaUtil_FreeMemory( stream );
@@ -2638,25 +5217,57 @@ static PaError CloseStream( PaStream* s )
/*
Write the supplied packet to the pin
Asynchronous
-Should return false on success
+Should return paNoError on success
*/
-static BOOL PinWrite(HANDLE h, DATAPACKET* p)
+static PaError PinWrite(HANDLE h, DATAPACKET* p)
{
+ PaError result = paNoError;
unsigned long cbReturned = 0;
- return DeviceIoControl(h,IOCTL_KS_WRITE_STREAM,NULL,0,
- &p->Header,p->Header.Size,&cbReturned,&p->Signal);
+ BOOL fRes = DeviceIoControl(h,
+ IOCTL_KS_WRITE_STREAM,
+ NULL,
+ 0,
+ &p->Header,
+ p->Header.Size,
+ &cbReturned,
+ &p->Signal);
+ if (!fRes)
+ {
+ unsigned long error = GetLastError();
+ if (error != ERROR_IO_PENDING)
+ {
+ result = paInternalError;
+ }
+ }
+ return result;
}
/*
Read to the supplied packet from the pin
Asynchronous
-Should return false on success
+Should return paNoError on success
*/
-static BOOL PinRead(HANDLE h, DATAPACKET* p)
+static PaError PinRead(HANDLE h, DATAPACKET* p)
{
+ PaError result = paNoError;
unsigned long cbReturned = 0;
- return DeviceIoControl(h,IOCTL_KS_READ_STREAM,NULL,0,
- &p->Header,p->Header.Size,&cbReturned,&p->Signal);
+ BOOL fRes = DeviceIoControl(h,
+ IOCTL_KS_READ_STREAM,
+ NULL,
+ 0,
+ &p->Header,
+ p->Header.Size,
+ &cbReturned,
+ &p->Signal);
+ if (!fRes)
+ {
+ unsigned long error = GetLastError();
+ if (error != ERROR_IO_PENDING)
+ {
+ result = paInternalError;
+ }
+ }
+ return result;
}
/*
@@ -2722,365 +5333,763 @@ static void DuplicateFirstChannelInt32(void* buffer, int channels, int samples)
}
}
-static DWORD WINAPI ProcessingThread(LPVOID pParam)
+/*
+Increase the priority of the calling thread to RT
+*/
+static HANDLE BumpThreadPriority()
+{
+ HANDLE hThread = GetCurrentThread();
+ DWORD dwTask = 0;
+ HANDLE hAVRT = NULL;
+
+ /* If we have access to AVRT.DLL (Vista and later), use it */
+ if (FunctionAvSetMmThreadCharacteristics != NULL)
+ {
+ hAVRT = FunctionAvSetMmThreadCharacteristics("Pro Audio", &dwTask);
+ if (hAVRT != NULL && hAVRT != INVALID_HANDLE_VALUE)
+ {
+ BOOL bret = FunctionAvSetMmThreadPriority(hAVRT, PA_AVRT_PRIORITY_CRITICAL);
+ if (!bret)
+ {
+ PA_DEBUG(("Set mm thread prio to critical failed!\n"));
+ }
+ else
+ {
+ return hAVRT;
+ }
+ }
+ else
+ {
+ PA_DEBUG(("Set mm thread characteristic to 'Pro Audio' failed, reverting to SetThreadPriority\n"));
+ }
+ }
+
+ /* For XP and earlier, or if AvSetMmThreadCharacteristics fails (MMCSS disabled ?) */
+ if (timeBeginPeriod(1) != TIMERR_NOERROR) {
+ PA_DEBUG(("timeBeginPeriod(1) failed!\n"));
+ }
+
+ if (!SetThreadPriority(hThread, THREAD_PRIORITY_TIME_CRITICAL)) {
+ PA_DEBUG(("SetThreadPriority failed!\n"));
+ }
+
+ return hAVRT;
+}
+
+/*
+Decrease the priority of the calling thread to normal
+*/
+static void DropThreadPriority(HANDLE hAVRT)
+{
+ HANDLE hThread = GetCurrentThread();
+
+ if (hAVRT != NULL)
+ {
+ FunctionAvSetMmThreadPriority(hAVRT, PA_AVRT_PRIORITY_NORMAL);
+ FunctionAvRevertMmThreadCharacteristics(hAVRT);
+ return;
+ }
+
+ SetThreadPriority(hThread, THREAD_PRIORITY_NORMAL);
+ timeEndPeriod(1);
+}
+
+static PaError PreparePinForStart(PaWinWdmPin* pin)
{
- PaWinWdmStream *stream = (PaWinWdmStream*)pParam;
- PaStreamCallbackTimeInfo ti;
- int cbResult = paContinue;
- int inbuf = 0;
- int outbuf = 0;
- int pending = 0;
PaError result;
- unsigned long wait;
- unsigned long eventSignaled;
- int fillPlaybuf = 0;
- int emptyRecordbuf = 0;
- int framesProcessed;
- unsigned long timeout;
- int i;
- int doChannelCopy;
- int priming = 0;
- PaStreamCallbackFlags underover = 0;
+ result = PinSetState(pin, KSSTATE_ACQUIRE);
+ if (result != paNoError)
+ {
+ goto error;
+ }
+ result = PinSetState(pin, KSSTATE_PAUSE);
+ if (result != paNoError)
+ {
+ goto error;
+ }
+ return result;
+
+error:
+ PinSetState(pin, KSSTATE_STOP);
+ return result;
+}
+
+static PaError PreparePinsForStart(PaProcessThreadInfo* pInfo)
+{
+ PaError result = paNoError;
+ /* Submit buffers */
+ if (pInfo->stream->capture.pPin)
+ {
+ if ((result = PreparePinForStart(pInfo->stream->capture.pPin)) != paNoError)
+ {
+ goto error;
+ }
+
+ if (pInfo->stream->capture.pPin->parentFilter->devInfo.streamingType == Type_kWaveCyclic)
+ {
+ unsigned i;
+ for(i=0; i < pInfo->stream->capture.noOfPackets; ++i)
+ {
+ if ((result = PinRead(pInfo->stream->capture.pPin->handle, pInfo->stream->capture.packets + i)) != paNoError)
+ {
+ goto error;
+ }
+ ++pInfo->pending;
+ }
+ }
+ else
+ {
+ pInfo->pending = 2;
+ }
+ }
+
+ if(pInfo->stream->render.pPin)
+ {
+ if ((result = PreparePinForStart(pInfo->stream->render.pPin)) != paNoError)
+ {
+ goto error;
+ }
+
+ pInfo->priming += pInfo->stream->render.noOfPackets;
+ ++pInfo->pending;
+ SetEvent(pInfo->stream->render.events[0]);
+ if (pInfo->stream->render.pPin->parentFilter->devInfo.streamingType == Type_kWaveCyclic)
+ {
+ unsigned i;
+ for(i=1; i < pInfo->stream->render.noOfPackets; ++i)
+ {
+ SetEvent(pInfo->stream->render.events[i]);
+ ++pInfo->pending;
+ }
+ }
+ }
+
+error:
+ PA_DEBUG(("PreparePinsForStart = %d\n", result));
+ return result;
+}
+
+static PaError StartPin(PaWinWdmPin* pin)
+{
+ return PinSetState(pin, KSSTATE_RUN);
+}
+
+static PaError StartPins(PaProcessThreadInfo* pInfo)
+{
+ PaError result = paNoError;
+ /* Start the pins as synced as possible */
+ if (pInfo->stream->capture.pPin)
+ {
+ result = StartPin(pInfo->stream->capture.pPin);
+ }
+ if(pInfo->stream->render.pPin)
+ {
+ result = StartPin(pInfo->stream->render.pPin);
+ }
+ PA_DEBUG(("StartPins = %d\n", result));
+ return result;
+}
+
+
+static PaError StopPin(PaWinWdmPin* pin)
+{
+ PinSetState(pin, KSSTATE_PAUSE);
+ PinSetState(pin, KSSTATE_STOP);
+ return paNoError;
+}
+
+
+static PaError StopPins(PaProcessThreadInfo* pInfo)
+{
+ PaError result = paNoError;
+ if(pInfo->stream->render.pPin)
+ {
+ StopPin(pInfo->stream->render.pPin);
+ }
+ if(pInfo->stream->capture.pPin)
+ {
+ StopPin(pInfo->stream->capture.pPin);
+ }
+ return result;
+}
+
+typedef void (*TSetInputFrameCount)(PaUtilBufferProcessor*, unsigned long);
+typedef void (*TSetInputChannel)(PaUtilBufferProcessor*, unsigned int, void *, unsigned int);
+static const TSetInputFrameCount fnSetInputFrameCount[2] = { PaUtil_SetInputFrameCount, PaUtil_Set2ndInputFrameCount };
+static const TSetInputChannel fnSetInputChannel[2] = { PaUtil_SetInputChannel, PaUtil_Set2ndInputChannel };
+
+static PaError PaDoProcessing(PaProcessThreadInfo* pInfo)
+{
+ PaError result = paNoError;
+ int i, framesProcessed = 0, doChannelCopy = 0;
+ ring_buffer_size_t inputFramesAvailable = PaUtil_GetRingBufferReadAvailable(&pInfo->stream->ringBuffer);
+
+ /* Do necessary buffer processing (which will invoke user callback if necessary) */
+ if (pInfo->cbResult == paContinue &&
+ (pInfo->renderHead != pInfo->renderTail || inputFramesAvailable))
+ {
+ unsigned processFullDuplex = pInfo->stream->capture.pPin && pInfo->stream->render.pPin && (!pInfo->priming);
+
+ PA_HP_TRACE((pInfo->stream->hLog, "DoProcessing: InputFrames=%u", inputFramesAvailable));
+
+ PaUtil_BeginCpuLoadMeasurement( &pInfo->stream->cpuLoadMeasurer );
+
+ pInfo->ti.currentTime = PaUtil_GetTime();
+
+ PaUtil_BeginBufferProcessing(&pInfo->stream->bufferProcessor, &pInfo->ti, pInfo->underover);
+ pInfo->underover = 0; /* Reset the (under|over)flow status */
+
+ if (pInfo->renderTail != pInfo->renderHead)
+ {
+ DATAPACKET* packet = pInfo->renderPackets[pInfo->renderTail & cPacketsArrayMask].packet;
+
+ assert(packet != 0);
+ assert(packet->Header.Data != 0);
+
+ PaUtil_SetOutputFrameCount(&pInfo->stream->bufferProcessor, pInfo->stream->render.framesPerBuffer);
+
+ for(i=0;istream->userOutputChannels;i++)
+ {
+ /* Only write the user output channels. Leave the rest blank */
+ PaUtil_SetOutputChannel(&pInfo->stream->bufferProcessor,
+ i,
+ ((unsigned char*)(packet->Header.Data))+(i*pInfo->stream->render.bytesPerSample),
+ pInfo->stream->deviceOutputChannels);
+ }
+
+ /* We will do a copy to the other channels after the data has been written */
+ doChannelCopy = ( pInfo->stream->userOutputChannels == 1 );
+ }
+
+ if (inputFramesAvailable && (!pInfo->stream->userOutputChannels || inputFramesAvailable >= (int)pInfo->stream->render.framesPerBuffer))
+ {
+ unsigned wrapCntr = 0;
+ char* data[2] = {0};
+ ring_buffer_size_t size[2] = {0};
+
+ /* If full-duplex, we just extract output buffer number of frames */
+ if (pInfo->stream->userOutputChannels)
+ {
+ inputFramesAvailable = min(inputFramesAvailable, (int)pInfo->stream->render.framesPerBuffer);
+ }
+
+ inputFramesAvailable = PaUtil_GetRingBufferReadRegions(&pInfo->stream->ringBuffer,
+ inputFramesAvailable,
+ &data[0],
+ &size[0],
+ &data[1],
+ &size[1]);
+
+ for (wrapCntr = 0; wrapCntr < 2; ++wrapCntr)
+ {
+ if (size[wrapCntr] == 0)
+ break;
+
+ fnSetInputFrameCount[wrapCntr](&pInfo->stream->bufferProcessor, size[wrapCntr]);
+ for(i=0;istream->userInputChannels;i++)
+ {
+ /* Only read as many channels as the user wants */
+ fnSetInputChannel[wrapCntr](&pInfo->stream->bufferProcessor,
+ i,
+ ((unsigned char*)(data[wrapCntr]))+(i*pInfo->stream->capture.bytesPerSample),
+ pInfo->stream->deviceInputChannels);
+ }
+ }
+ }
+ else
+ {
+ /* We haven't consumed anything from the ring buffer... */
+ inputFramesAvailable = 0;
+ /* If we have full-duplex, this is at startup, so mark no-input! */
+ if (pInfo->stream->userOutputChannels>0 && pInfo->stream->userInputChannels>0)
+ {
+ PA_HP_TRACE((pInfo->stream->hLog, "Input startup, marking no input."));
+ PaUtil_SetNoInput(&pInfo->stream->bufferProcessor);
+ }
+ }
+
+ if (processFullDuplex) /* full duplex */
+ {
+ /* Only call the EndBufferProcessing function when the total input frames == total output frames */
+ const unsigned long totalInputFrameCount = pInfo->stream->bufferProcessor.hostInputFrameCount[0] + pInfo->stream->bufferProcessor.hostInputFrameCount[1];
+ const unsigned long totalOutputFrameCount = pInfo->stream->bufferProcessor.hostOutputFrameCount[0] + pInfo->stream->bufferProcessor.hostOutputFrameCount[1];
+
+ if(totalInputFrameCount == totalOutputFrameCount && totalOutputFrameCount != 0)
+ {
+ framesProcessed = PaUtil_EndBufferProcessing(&pInfo->stream->bufferProcessor, &pInfo->cbResult);
+ }
+ else
+ {
+ framesProcessed = 0;
+ }
+ }
+ else
+ {
+ framesProcessed = PaUtil_EndBufferProcessing(&pInfo->stream->bufferProcessor, &pInfo->cbResult);
+ }
+
+ PA_HP_TRACE((pInfo->stream->hLog, "Frames processed: %u %s", framesProcessed, (pInfo->priming ? "(priming)":"")));
+
+ if( doChannelCopy )
+ {
+ DATAPACKET* packet = pInfo->renderPackets[pInfo->renderTail & cPacketsArrayMask].packet;
+ /* Copy the first output channel to the other channels */
+ switch (pInfo->stream->render.bytesPerSample)
+ {
+ case 2:
+ DuplicateFirstChannelInt16(packet->Header.Data, pInfo->stream->deviceOutputChannels, pInfo->stream->render.framesPerBuffer);
+ break;
+ case 3:
+ DuplicateFirstChannelInt24(packet->Header.Data, pInfo->stream->deviceOutputChannels, pInfo->stream->render.framesPerBuffer);
+ break;
+ case 4:
+ DuplicateFirstChannelInt32(packet->Header.Data, pInfo->stream->deviceOutputChannels, pInfo->stream->render.framesPerBuffer);
+ break;
+ default:
+ assert(0); /* Unsupported format! */
+ break;
+ }
+ }
+ PaUtil_EndCpuLoadMeasurement( &pInfo->stream->cpuLoadMeasurer, framesProcessed );
+
+ if (inputFramesAvailable)
+ {
+ PaUtil_AdvanceRingBufferReadIndex(&pInfo->stream->ringBuffer, inputFramesAvailable);
+ }
+
+ if (pInfo->renderTail != pInfo->renderHead)
+ {
+ if (!pInfo->stream->streamStop)
+ {
+ result = pInfo->stream->render.pPin->fnSubmitHandler(pInfo, pInfo->renderTail);
+ if (result != paNoError)
+ {
+ PA_HP_TRACE((pInfo->stream->hLog, "Capture submit handler failed with result %d", result));
+ return result;
+ }
+ }
+ pInfo->renderTail++;
+ if (!pInfo->pinsStarted && pInfo->priming == 0)
+ {
+ /* We start the pins here to allow "prime time" */
+ if ((result = StartPins(pInfo)) == paNoError)
+ {
+ PA_HP_TRACE((pInfo->stream->hLog, "Starting pins!"));
+ pInfo->pinsStarted = 1;
+ }
+ }
+ }
+ }
+
+ return result;
+}
+
+static VOID CALLBACK TimerAPCWaveRTPolledMode(
+ LPVOID lpArgToCompletionRoutine,
+ DWORD dwTimerLowValue,
+ DWORD dwTimerHighValue)
+{
+ HANDLE* pHandles = (HANDLE*)lpArgToCompletionRoutine;
+ if (pHandles[0]) SetEvent(pHandles[0]);
+ if (pHandles[1]) SetEvent(pHandles[1]);
+}
+
+static DWORD GetCurrentTimeInMillisecs()
+{
+ return timeGetTime();
+}
+
+PA_THREAD_FUNC ProcessingThread(void* pParam)
+{
+ PaError result = paNoError;
+ HANDLE hAVRT = NULL;
+ HANDLE hTimer = NULL;
+ HANDLE *handleArray = NULL;
+ HANDLE timerEventHandles[2] = {0};
+ unsigned noOfHandles = 0;
+ unsigned captureEvents = 0;
+ unsigned renderEvents = 0;
+ unsigned timerPeriod = 0;
+ DWORD timeStamp[2] = {0};
+
+ PaProcessThreadInfo info;
+ memset(&info, 0, sizeof(PaProcessThreadInfo));
+ info.stream = (PaWinWdmStream*)pParam;
+
+ info.stream->threadResult = paNoError;
PA_LOGE_;
- ti.inputBufferAdcTime = 0.0;
- ti.currentTime = 0.0;
- ti.outputBufferDacTime = 0.0;
+ info.ti.inputBufferAdcTime = 0.0;
+ info.ti.currentTime = 0.0;
+ info.ti.outputBufferDacTime = 0.0;
- /* Get double buffering going */
+ PA_DEBUG(("In buffer len: %.3f ms\n",(2000*info.stream->capture.framesPerBuffer) / info.stream->streamRepresentation.streamInfo.sampleRate));
+ PA_DEBUG(("Out buffer len: %.3f ms\n",(2000*info.stream->render.framesPerBuffer) / info.stream->streamRepresentation.streamInfo.sampleRate));
+ info.timeout = (DWORD)max(
+ (2000*info.stream->render.framesPerBuffer/info.stream->streamRepresentation.streamInfo.sampleRate + 0.5),
+ (2000*info.stream->capture.framesPerBuffer/info.stream->streamRepresentation.streamInfo.sampleRate + 0.5));
+ info.timeout = max(info.timeout*8, 100);
+ timerPeriod = info.timeout;
+ PA_DEBUG(("Timeout = %ld ms\n",info.timeout));
- /* Submit buffers */
- if(stream->playbackPin)
+ /* Allocate handle array */
+ handleArray = (HANDLE*)PaUtil_AllocateMemory((info.stream->capture.noOfPackets + info.stream->render.noOfPackets + 1) * sizeof(HANDLE));
+
+ /* Setup handle array for WFMO */
+ if (info.stream->capture.pPin != 0)
{
- result = PinSetState(stream->playbackPin, KSSTATE_RUN);
-
- PA_DEBUG(("play state run = %d;",(int)result));
- SetEvent(stream->events[outbuf+2]);
- outbuf = (outbuf+1)&1;
- SetEvent(stream->events[outbuf+2]);
- outbuf = (outbuf+1)&1;
- pending += 2;
- priming += 4;
- }
- if(stream->recordingPin)
- {
- result = PinSetState(stream->recordingPin, KSSTATE_RUN);
-
- PA_DEBUG(("recording state run = %d;",(int)result));
- PinRead(stream->recordingPin->handle,&stream->packets[inbuf]);
- inbuf = (inbuf+1)&1; /* Increment and wrap */
- PinRead(stream->recordingPin->handle,&stream->packets[inbuf]);
- inbuf = (inbuf+1)&1; /* Increment and wrap */
- /* FIXME - do error checking */
- pending += 2;
- }
- PA_DEBUG(("Out buffer len:%f\n",(2000*stream->framesPerHostOBuffer) / stream->streamRepresentation.streamInfo.sampleRate));
- PA_DEBUG(("In buffer len:%f\n",(2000*stream->framesPerHostIBuffer) / stream->streamRepresentation.streamInfo.sampleRate));
- timeout = max(
- ((2000*(DWORD)stream->framesPerHostOBuffer) / (DWORD)stream->streamRepresentation.streamInfo.sampleRate),
- ((2000*(DWORD)stream->framesPerHostIBuffer) / (DWORD)stream->streamRepresentation.streamInfo.sampleRate));
- timeout = max(timeout,1);
- PA_DEBUG(("Timeout = %ld\n",timeout));
-
- while(!stream->streamAbort)
- {
- fillPlaybuf = 0;
- emptyRecordbuf = 0;
-
- /* Wait for next input or output buffer to be finished with*/
- assert(pending>0);
-
- if(stream->streamStop)
+ handleArray[noOfHandles++] = info.stream->capture.events[0];
+ if (info.stream->capture.pPin->parentFilter->devInfo.streamingType == Type_kWaveCyclic)
{
- PA_DEBUG(("ss1:pending=%d ",pending));
+ unsigned i;
+ for(i=1; i < info.stream->capture.noOfPackets; ++i)
+ {
+ handleArray[noOfHandles++] = info.stream->capture.events[i];
+ }
}
- wait = WaitForMultipleObjects(5, stream->events, FALSE, 0);
- if( wait == WAIT_TIMEOUT )
+ captureEvents = noOfHandles;
+ renderEvents = noOfHandles;
+ }
+
+ if (info.stream->render.pPin != 0)
+ {
+ handleArray[noOfHandles++] = info.stream->render.events[0];
+ if (info.stream->render.pPin->parentFilter->devInfo.streamingType == Type_kWaveCyclic)
{
- /* No (under|over)flow has ocurred */
- wait = WaitForMultipleObjects(5, stream->events, FALSE, timeout);
- eventSignaled = wait - WAIT_OBJECT_0;
+ unsigned i;
+ for(i=1; i < info.stream->render.noOfPackets; ++i)
+ {
+ handleArray[noOfHandles++] = info.stream->render.events[i];
+ }
+ }
+ renderEvents = noOfHandles;
+ }
+ handleArray[noOfHandles++] = info.stream->eventAbort;
+ assert(noOfHandles <= (info.stream->capture.noOfPackets + info.stream->render.noOfPackets + 1));
+
+ /* Prepare render and capture pins */
+ if ((result = PreparePinsForStart(&info)) != paNoError)
+ {
+ PA_DEBUG(("Failed to prepare device(s)!\n"));
+ goto error;
+ }
+
+ /* Init high speed logger */
+ if (PaUtil_InitializeHighSpeedLog(&info.stream->hLog, 1000000) != paNoError)
+ {
+ PA_DEBUG(("Failed to init high speed logger!\n"));
+ goto error;
+ }
+
+ /* Heighten priority here */
+ hAVRT = BumpThreadPriority();
+
+ /* If input only, we start the pins immediately */
+ if (info.stream->render.pPin == 0)
+ {
+ if ((result = StartPins(&info)) != paNoError)
+ {
+ PA_DEBUG(("Failed to start device(s)!\n"));
+ goto error;
+ }
+ info.pinsStarted = 1;
+ }
+
+ /* Handle WaveRT polled mode */
+ {
+ const unsigned fs = (unsigned)info.stream->streamRepresentation.streamInfo.sampleRate;
+ if (info.stream->capture.pPin != 0 && info.stream->capture.pPin->pinKsSubType == SubType_kPolled)
+ {
+ timerEventHandles[0] = info.stream->capture.events[0];
+ timerPeriod = min(timerPeriod, (1000*info.stream->capture.framesPerBuffer)/fs);
+ }
+
+ if (info.stream->render.pPin != 0 && info.stream->render.pPin->pinKsSubType == SubType_kPolled)
+ {
+ timerEventHandles[1] = info.stream->render.events[0];
+ timerPeriod = min(timerPeriod, (1000*info.stream->render.framesPerBuffer)/fs);
+ }
+
+ if (timerEventHandles[0] || timerEventHandles[1])
+ {
+ LARGE_INTEGER dueTime = {0};
+
+ timerPeriod=max(timerPeriod/5,1);
+ PA_DEBUG(("Timer event handles=0x%04X,0x%04X period=%u ms", timerEventHandles[0], timerEventHandles[1], timerPeriod));
+ hTimer = CreateWaitableTimer(0, FALSE, NULL);
+ if (hTimer == NULL)
+ {
+ result = paUnanticipatedHostError;
+ goto error;
+ }
+ /* invoke first timeout immediately */
+ if (!SetWaitableTimer(hTimer, &dueTime, timerPeriod, TimerAPCWaveRTPolledMode, timerEventHandles, FALSE))
+ {
+ result = paUnanticipatedHostError;
+ goto error;
+ }
+ PA_DEBUG(("Waitable timer started, period = %u ms\n", timerPeriod));
+ }
+ }
+
+ /* Mark stream as active */
+ info.stream->streamActive = 1;
+ info.stream->threadResult = paNoError;
+
+ /* Up and running... */
+ SetEvent(info.stream->eventStreamStart[StreamStart_kOk]);
+
+ /* Take timestamp here */
+ timeStamp[0] = timeStamp[1] = GetCurrentTimeInMillisecs();
+
+ while(!info.stream->streamAbort)
+ {
+ unsigned doProcessing = 1;
+ unsigned wait = WaitForMultipleObjects(noOfHandles, handleArray, FALSE, 0);
+ unsigned eventSignalled = wait - WAIT_OBJECT_0;
+ DWORD dwCurrentTime = 0;
+
+ if (wait == WAIT_FAILED)
+ {
+ PA_DEBUG(("Wait failed = %ld! \n",wait));
+ break;
+ }
+ if (wait == WAIT_TIMEOUT)
+ {
+ wait = WaitForMultipleObjectsEx(noOfHandles, handleArray, FALSE, 50, TRUE);
+ eventSignalled = wait - WAIT_OBJECT_0;
}
else
{
- eventSignaled = wait - WAIT_OBJECT_0;
- if( eventSignaled < 2 )
+ if (eventSignalled < captureEvents)
{
- underover |= paInputOverflow;
- PA_DEBUG(("Input overflow\n"));
+ if (PaUtil_GetRingBufferWriteAvailable(&info.stream->ringBuffer) == 0)
+ {
+ PA_HP_TRACE((info.stream->hLog, "!!!!! Input overflow !!!!!"));
+ info.underover |= paInputOverflow;
+ }
}
- else if(( eventSignaled < 4 )&&(!priming))
+ else if (eventSignalled < renderEvents)
{
- underover |= paOutputUnderflow;
- PA_DEBUG(("Output underflow\n"));
+ if (!info.priming && info.renderHead - info.renderTail > 1)
+ {
+ PA_HP_TRACE((info.stream->hLog, "!!!!! Output underflow !!!!!"));
+ info.underover |= paOutputUnderflow;
+ }
}
}
- if(stream->streamStop)
+ /* Get event time */
+ dwCurrentTime = GetCurrentTimeInMillisecs();
+
+ /* Since we can mix capture/render devices between WaveCyclic, WaveRT polled and WaveRT notification (3x3 combinations),
+ we can't rely on the timeout of WFMO to check for device timeouts, we need to keep tally. */
+ if (info.stream->capture.pPin && (dwCurrentTime - timeStamp[0]) >= info.timeout)
{
- PA_DEBUG(("ss2:wait=%ld",wait));
- }
- if(wait == WAIT_FAILED)
- {
- PA_DEBUG(("Wait fail = %ld! ",wait));
+ PA_DEBUG(("Timeout for capture device (%u ms)!", info.timeout, (dwCurrentTime - timeStamp[0])));
+ result = paTimedOut;
break;
}
- if(wait == WAIT_TIMEOUT)
+ if (info.stream->render.pPin && (dwCurrentTime - timeStamp[1]) >= info.timeout)
{
+ PA_DEBUG(("Timeout for render device (%u ms)!", info.timeout, (dwCurrentTime - timeStamp[1])));
+ result = paTimedOut;
+ break;
+ }
+
+ if (wait == WAIT_IO_COMPLETION)
+ {
+ /* Waitable timer has fired! */
+ PA_HP_TRACE((info.stream->hLog, "WAIT_IO_COMPLETION"));
continue;
}
- if(eventSignaled < 2)
- { /* Recording input buffer has been filled */
- if(stream->playbackPin)
- {
- /* First check if also the next playback buffer has been signaled */
- wait = WaitForSingleObject(stream->events[outbuf+2],0);
- if(wait == WAIT_OBJECT_0)
- {
- /* Yes, so do both buffers at same time */
- fillPlaybuf = 1;
- pending--;
- /* Was this an underflow situation? */
- if( underover )
- underover |= paOutputUnderflow; /* Yes! */
- }
- }
- emptyRecordbuf = 1;
- pending--;
- }
- else if(eventSignaled < 4)
- { /* Playback output buffer has been emptied */
- if(stream->recordingPin)
- {
- /* First check if also the next recording buffer has been signaled */
- wait = WaitForSingleObject(stream->events[inbuf],0);
- if(wait == WAIT_OBJECT_0)
- { /* Yes, so do both buffers at same time */
- emptyRecordbuf = 1;
- pending--;
- /* Was this an overflow situation? */
- if( underover )
- underover |= paInputOverflow; /* Yes! */
- }
- }
- fillPlaybuf = 1;
- pending--;
+ if (wait == WAIT_TIMEOUT)
+ {
+ continue;
}
else
{
- /* Abort event! */
- assert(stream->streamAbort); /* Should have been set */
- PA_DEBUG(("ABORTING "));
- break;
- }
- ResetEvent(stream->events[eventSignaled]);
-
- if(stream->streamStop)
- {
- PA_DEBUG(("Stream stop! pending=%d",pending));
- cbResult = paComplete; /* Stop, but play remaining buffers */
- }
-
- /* Do necessary buffer processing (which will invoke user callback if necessary */
- doChannelCopy = 0;
- if(cbResult==paContinue)
- {
- PaUtil_BeginCpuLoadMeasurement( &stream->cpuLoadMeasurer );
- if((stream->bufferProcessor.hostInputFrameCount[0] + stream->bufferProcessor.hostInputFrameCount[1]) ==
- (stream->bufferProcessor.hostOutputFrameCount[0] + stream->bufferProcessor.hostOutputFrameCount[1]) )
- PaUtil_BeginBufferProcessing(&stream->bufferProcessor,&ti,underover);
- underover = 0; /* Reset the (under|over)flow status */
- if(fillPlaybuf)
+ if (eventSignalled < captureEvents)
{
- PaUtil_SetOutputFrameCount(&stream->bufferProcessor,0);
- if( stream->userOutputChannels == 1 )
+ if (info.stream->capture.pPin->fnEventHandler(&info, eventSignalled) == paNoError)
{
- /* Write the single user channel to the first interleaved block */
- PaUtil_SetOutputChannel(&stream->bufferProcessor,0,stream->packets[outbuf+2].Header.Data,stream->deviceOutputChannels);
- /* We will do a copy to the other channels after the data has been written */
- doChannelCopy = 1;
- }
- else
- {
- for(i=0;iuserOutputChannels;i++)
+ timeStamp[0] = dwCurrentTime;
+
+ /* Since we use the ring buffer, we can submit the buffers directly */
+ if (!info.stream->streamStop)
{
- /* Only write the user output channels. Leave the rest blank */
- PaUtil_SetOutputChannel(&stream->bufferProcessor,i,((unsigned char*)(stream->packets[outbuf+2].Header.Data))+(i*stream->outputSampleSize),stream->deviceOutputChannels);
+ result = info.stream->capture.pPin->fnSubmitHandler(&info, info.captureTail);
+ if (result != paNoError)
+ {
+ PA_HP_TRACE((info.stream->hLog, "Capture submit handler failed with result %d", result));
+ break;
+ }
+ }
+ ++info.captureTail;
+ /* If full-duplex, let _only_ render event trigger processing. We still need the stream stop
+ handling working, so let that be processed anyways... */
+ if (info.stream->userOutputChannels > 0)
+ {
+ doProcessing = 0;
}
}
}
- if(emptyRecordbuf)
+ else if (eventSignalled < renderEvents)
{
- PaUtil_SetInputFrameCount(&stream->bufferProcessor,stream->packets[inbuf].Header.DataUsed/stream->bytesPerInputFrame);
- for(i=0;iuserInputChannels;i++)
- {
- /* Only read as many channels as the user wants */
- PaUtil_SetInputChannel(&stream->bufferProcessor,i,((unsigned char*)(stream->packets[inbuf].Header.Data))+(i*stream->inputSampleSize),stream->deviceInputChannels);
- }
+ timeStamp[1] = dwCurrentTime;
+ eventSignalled -= captureEvents;
+ info.stream->render.pPin->fnEventHandler(&info, eventSignalled);
}
-
- if (stream->recordingPin && stream->playbackPin) /* full duplex */
+ else
{
- /* Only call the EndBufferProcessing function when the total input frames == total output frames */
+ assert(info.stream->streamAbort);
+ PA_HP_TRACE((info.stream->hLog, "Stream abort!"));
+ continue;
+ }
+ }
- if((stream->bufferProcessor.hostInputFrameCount[0] + stream->bufferProcessor.hostInputFrameCount[1]) ==
- (stream->bufferProcessor.hostOutputFrameCount[0] + stream->bufferProcessor.hostOutputFrameCount[1]) )
- {
- framesProcessed = PaUtil_EndBufferProcessing(&stream->bufferProcessor,&cbResult);
- }
- else
- {
- framesProcessed = 0;
- }
- }
- else
+ /* Handle processing */
+ if (doProcessing)
+ {
+ result = PaDoProcessing(&info);
+ if (result != paNoError)
{
- framesProcessed = PaUtil_EndBufferProcessing(&stream->bufferProcessor,&cbResult);
+ PA_HP_TRACE((info.stream->hLog, "PaDoProcessing failed!"));
+ break;
}
+ }
- if( doChannelCopy )
- {
- /* Copy the first output channel to the other channels */
- switch(stream->outputSampleSize)
- {
- case 2:
- DuplicateFirstChannelInt16(stream->packets[outbuf+2].Header.Data,stream->deviceOutputChannels,stream->framesPerHostOBuffer);
- break;
- case 3:
- DuplicateFirstChannelInt24(stream->packets[outbuf+2].Header.Data,stream->deviceOutputChannels,stream->framesPerHostOBuffer);
- break;
- case 4:
- DuplicateFirstChannelInt32(stream->packets[outbuf+2].Header.Data,stream->deviceOutputChannels,stream->framesPerHostOBuffer);
- break;
- default:
- assert(0); /* Unsupported format! */
- break;
- }
- }
- PaUtil_EndCpuLoadMeasurement( &stream->cpuLoadMeasurer, framesProcessed );
- }
- else
+ if(info.stream->streamStop && info.cbResult != paComplete)
{
- fillPlaybuf = 0;
- emptyRecordbuf = 0;
+ PA_HP_TRACE((info.stream->hLog, "Stream stop! pending=%d",info.pending));
+ info.cbResult = paComplete; /* Stop, but play remaining buffers */
}
-
- /*
- if(cbResult != paContinue)
+
+ if(info.pending<=0)
{
- PA_DEBUG(("cbResult=%d, pending=%d:",cbResult,pending));
- }
- */
- /* Submit buffers */
- if((fillPlaybuf)&&(cbResult!=paAbort))
- {
- if(!PinWrite(stream->playbackPin->handle,&stream->packets[outbuf+2]))
- outbuf = (outbuf+1)&1; /* Increment and wrap */
- pending++;
- if( priming )
- priming--; /* Have to prime twice */
- }
- if((emptyRecordbuf)&&(cbResult==paContinue))
- {
- stream->packets[inbuf].Header.DataUsed = 0; /* Reset for reuse */
- PinRead(stream->recordingPin->handle,&stream->packets[inbuf]);
- inbuf = (inbuf+1)&1; /* Increment and wrap */
- pending++;
- }
- if(pending==0)
- {
- PA_DEBUG(("pending==0 finished...;"));
+ PA_HP_TRACE((info.stream->hLog, "pending==0 finished..."));
break;
}
- if((!stream->playbackPin)&&(cbResult!=paContinue))
+ if((!info.stream->render.pPin)&&(info.cbResult!=paContinue))
{
- PA_DEBUG(("record only cbResult=%d...;",cbResult));
+ PA_HP_TRACE((info.stream->hLog, "record only cbResult=%d...",info.cbResult));
break;
}
}
- PA_DEBUG(("Finished thread"));
+ PA_DEBUG(("Finished processing loop\n"));
- /* Finished, either normally or aborted */
- if(stream->playbackPin)
+ info.stream->threadResult = result;
+ goto bailout;
+
+error:
+ PA_DEBUG(("Error starting processing thread\n"));
+ /* Set the "error" event together with result */
+ info.stream->threadResult = result;
+ SetEvent(info.stream->eventStreamStart[StreamStart_kFailed]);
+
+bailout:
+ if (hTimer)
{
- result = PinSetState(stream->playbackPin, KSSTATE_PAUSE);
- result = PinSetState(stream->playbackPin, KSSTATE_STOP);
- }
- if(stream->recordingPin)
- {
- result = PinSetState(stream->recordingPin, KSSTATE_PAUSE);
- result = PinSetState(stream->recordingPin, KSSTATE_STOP);
+ PA_DEBUG(("Waitable timer stopped\n", timerPeriod));
+ CancelWaitableTimer(hTimer);
+ CloseHandle(hTimer);
+ hTimer = 0;
}
- stream->streamActive = 0;
-
- if((!stream->streamStop)&&(!stream->streamAbort))
+ if (info.pinsStarted)
{
- /* Invoke the user stream finished callback */
- /* Only do it from here if not being stopped/aborted by user */
- if( stream->streamRepresentation.streamFinishedCallback != 0 )
- stream->streamRepresentation.streamFinishedCallback( stream->streamRepresentation.userData );
+ StopPins(&info);
}
- stream->streamStop = 0;
- stream->streamAbort = 0;
- /* Reset process priority if necessary */
- if(stream->oldProcessPriority != REALTIME_PRIORITY_CLASS)
+ /* Lower prio here */
+ DropThreadPriority(hAVRT);
+
+ if (handleArray != NULL)
{
- SetPriorityClass(GetCurrentProcess(),stream->oldProcessPriority);
- stream->oldProcessPriority = REALTIME_PRIORITY_CLASS;
+ PaUtil_FreeMemory(handleArray);
}
+#if PA_TRACE_REALTIME_EVENTS
+ if (info.stream->hLog)
+ {
+ PA_DEBUG(("Dumping highspeed trace...\n"));
+ PaUtil_DumpHighSpeedLog(info.stream->hLog, "hp_trace.log");
+ PaUtil_DiscardHighSpeedLog(info.stream->hLog);
+ info.stream->hLog = 0;
+ }
+#endif
+ info.stream->streamActive = 0;
+
+ if((!info.stream->streamStop)&&(!info.stream->streamAbort))
+ {
+ /* Invoke the user stream finished callback */
+ /* Only do it from here if not being stopped/aborted by user */
+ if( info.stream->streamRepresentation.streamFinishedCallback != 0 )
+ info.stream->streamRepresentation.streamFinishedCallback( info.stream->streamRepresentation.userData );
+ }
+ info.stream->streamStop = 0;
+ info.stream->streamAbort = 0;
+
PA_LOGL_;
- EXIT_THREAD;
return 0;
}
+
static PaError StartStream( PaStream *s )
{
PaError result = paNoError;
PaWinWdmStream *stream = (PaWinWdmStream*)s;
DWORD dwID;
- BOOL ret;
- int size;
PA_LOGE_;
stream->streamStop = 0;
stream->streamAbort = 0;
- size = 5;
- while(size--)
- {
- if(stream->events[size] != NULL)
- {
- ResetEvent(stream->events[size]);
- }
- }
+
+ ResetStreamEvents(stream);
PaUtil_ResetBufferProcessor( &stream->bufferProcessor );
stream->oldProcessPriority = GetPriorityClass(GetCurrentProcess());
/* Uncomment the following line to enable dynamic boosting of the process
- * priority to real time for best low latency support
- * Disabled by default because RT processes can easily block the OS */
+ * priority to real time for best low latency support
+ * Disabled by default because RT processes can easily block the OS */
/*ret = SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS);
- PA_DEBUG(("Class ret = %d;",ret));*/
+ PA_DEBUG(("Class ret = %d;",ret));*/
- stream->streamStarted = 1;
- stream->streamThread = (HANDLE)_beginthreadex(NULL, 0, ProcessingThread, stream, 0, &dwID);
+ stream->streamThread = CREATE_THREAD_FUNCTION (NULL, 0, ProcessingThread, stream, CREATE_SUSPENDED, &dwID);
if(stream->streamThread == NULL)
{
- stream->streamStarted = 0;
result = paInsufficientMemory;
goto end;
}
- ret = SetThreadPriority(stream->streamThread,THREAD_PRIORITY_TIME_CRITICAL);
- PA_DEBUG(("Priority ret = %d;",ret));
- /* Make the stream active */
- stream->streamActive = 1;
+ ResumeThread(stream->streamThread);
+
+ switch (WaitForMultipleObjects(2, stream->eventStreamStart, FALSE, 5000))
+ {
+ case WAIT_OBJECT_0 + StreamStart_kOk:
+ PA_DEBUG(("Processing thread started!\n"));
+ result = paNoError;
+ /* streamActive is set in processing thread */
+ stream->streamStarted = 1;
+ break;
+ case WAIT_OBJECT_0 + StreamStart_kFailed:
+ PA_DEBUG(("Processing thread start failed! (result=%d)\n", stream->threadResult));
+ result = stream->threadResult;
+ /* Wait for the stream to really exit */
+ WaitForSingleObject(stream->streamThread, 200);
+ CloseHandle(stream->streamThread);
+ stream->streamThread = 0;
+ break;
+ case WAIT_TIMEOUT:
+ default:
+ result = paTimedOut;
+ PaWinWDM_SetLastErrorInfo(result, "Failed to start processing thread (timeout)!");
+ break;
+ }
end:
PA_LOGL_;
@@ -3098,29 +6107,39 @@ static PaError StopStream( PaStream *s )
if(stream->streamActive)
{
+ DWORD dwExitCode;
doCb = 1;
stream->streamStop = 1;
- while(stream->streamActive)
+ if (GetExitCodeThread(stream->streamThread, &dwExitCode) && dwExitCode == STILL_ACTIVE)
{
- PA_DEBUG(("W."));
- Sleep(10); /* Let thread sleep for 10 msec */
+ if (WaitForSingleObject(stream->streamThread, INFINITE) != WAIT_OBJECT_0)
+ {
+ PA_DEBUG(("StopStream: stream thread terminated\n"));
+ TerminateThread(stream->streamThread, -1);
+ result = paTimedOut;
+ }
+ }
+ else
+ {
+ PA_DEBUG(("StopStream: GECT says not active, but streamActive is not false ??"));
+ result = paUnanticipatedHostError;
+ PaWinWDM_SetLastErrorInfo(result, "StopStream: GECT says not active, but streamActive = %d", stream->streamActive);
+ }
+ }
+ else
+ {
+ if (stream->threadResult != paNoError)
+ {
+ PA_DEBUG(("StopStream: Stream not active (%d)\n", stream->threadResult));
+ result = stream->threadResult;
+ stream->threadResult = paNoError;
}
}
- PA_DEBUG(("Terminating thread"));
- if(stream->streamStarted && stream->streamThread)
- {
- TerminateThread(stream->streamThread,0);
- stream->streamThread = NULL;
- }
-
+ CloseHandle(stream->streamThread);
+ stream->streamThread = 0;
stream->streamStarted = 0;
-
- if(stream->oldProcessPriority != REALTIME_PRIORITY_CLASS)
- {
- SetPriorityClass(GetCurrentProcess(),stream->oldProcessPriority);
- stream->oldProcessPriority = REALTIME_PRIORITY_CLASS;
- }
+ stream->streamActive = 0;
if(doCb)
{
@@ -3128,7 +6147,7 @@ static PaError StopStream( PaStream *s )
/* This means it should be safe for the called function */
/* to invoke e.g. StartStream */
if( stream->streamRepresentation.streamFinishedCallback != 0 )
- stream->streamRepresentation.streamFinishedCallback( stream->streamRepresentation.userData );
+ stream->streamRepresentation.streamFinishedCallback( stream->streamRepresentation.userData );
}
PA_LOGL_;
@@ -3147,27 +6166,20 @@ static PaError AbortStream( PaStream *s )
{
doCb = 1;
stream->streamAbort = 1;
- SetEvent(stream->events[4]); /* Signal immediately */
- while(stream->streamActive)
+ SetEvent(stream->eventAbort); /* Signal immediately */
+ if (WaitForSingleObject(stream->streamThread, 10000) != WAIT_OBJECT_0)
{
- Sleep(10);
+ TerminateThread(stream->streamThread, -1);
+ result = paTimedOut;
+
+ PA_DEBUG(("AbortStream: stream thread terminated\n"));
}
+ assert(!stream->streamActive);
}
-
- if(stream->streamStarted && stream->streamThread)
- {
- TerminateThread(stream->streamThread,0);
- stream->streamThread = NULL;
- }
-
+ CloseHandle(stream->streamThread);
+ stream->streamThread = NULL;
stream->streamStarted = 0;
- if(stream->oldProcessPriority != REALTIME_PRIORITY_CLASS)
- {
- SetPriorityClass(GetCurrentProcess(),stream->oldProcessPriority);
- stream->oldProcessPriority = REALTIME_PRIORITY_CLASS;
- }
-
if(doCb)
{
/* Do user callback now after all state has been reset */
@@ -3236,13 +6248,32 @@ static double GetStreamCpuLoad( PaStream* s )
/*
- As separate stream interfaces are used for blocking and callback
- streams, the following functions can be guaranteed to only be called
- for blocking streams.
+As separate stream interfaces are used for blocking and callback
+streams, the following functions can be guaranteed to only be called
+for blocking streams.
*/
static PaError ReadStream( PaStream* s,
- void *buffer,
+ void *buffer,
+ unsigned long frames )
+{
+ PaWinWdmStream *stream = (PaWinWdmStream*)s;
+
+ PA_LOGE_;
+
+ /* suppress unused variable warnings */
+ (void) buffer;
+ (void) frames;
+ (void) stream;
+
+ /* IMPLEMENT ME, see portaudio.h for required behavior*/
+ PA_LOGL_;
+ return paInternalError;
+}
+
+
+static PaError WriteStream( PaStream* s,
+ const void *buffer,
unsigned long frames )
{
PaWinWdmStream *stream = (PaWinWdmStream*)s;
@@ -3256,26 +6287,7 @@ static PaError ReadStream( PaStream* s,
/* IMPLEMENT ME, see portaudio.h for required behavior*/
PA_LOGL_;
- return paNoError;
-}
-
-
-static PaError WriteStream( PaStream* s,
- const void *buffer,
- unsigned long frames )
-{
- PaWinWdmStream *stream = (PaWinWdmStream*)s;
-
- PA_LOGE_;
-
- /* suppress unused variable warnings */
- (void) buffer;
- (void) frames;
- (void) stream;
-
- /* IMPLEMENT ME, see portaudio.h for required behavior*/
- PA_LOGL_;
- return paNoError;
+ return paInternalError;
}
@@ -3305,4 +6317,296 @@ static signed long GetStreamWriteAvailable( PaStream* s )
/* IMPLEMENT ME, see portaudio.h for required behavior*/
PA_LOGL_;
return 0;
-}
\ No newline at end of file
+}
+
+/***************************************************************************************/
+/* Event and submit handlers for WaveCyclic */
+/***************************************************************************************/
+
+static PaError PaPinCaptureEventHandler_WaveCyclic(PaProcessThreadInfo* pInfo, unsigned eventIndex)
+{
+ ring_buffer_size_t frameCount;
+ DATAPACKET* packet = pInfo->stream->capture.packets + eventIndex;
+
+ assert( eventIndex < pInfo->stream->capture.noOfPackets );
+
+ if (packet->Header.DataUsed == 0)
+ {
+ PA_HP_TRACE((pInfo->stream->hLog, ">>> Capture bogus event: idx=%u (DataUsed=%u)", eventIndex, packet->Header.DataUsed));
+
+ /* Bogus event, reset! This is to handle the behavior of this USB mic: http://shop.xtz.se/measurement-system/microphone-to-dirac-live-room-correction-suite
+ on startup of streaming, where it erroneously sets the event without the corresponding buffer being filled (DataUsed == 0) */
+ ResetEvent(packet->Signal.hEvent);
+ return -1;
+ }
+
+ pInfo->capturePackets[pInfo->captureHead & cPacketsArrayMask].packet = packet;
+
+ frameCount = PaUtil_WriteRingBuffer(&pInfo->stream->ringBuffer, packet->Header.Data, pInfo->stream->capture.framesPerBuffer);
+
+ PA_HP_TRACE((pInfo->stream->hLog, ">>> Capture event: idx=%u (frames=%u)", eventIndex, frameCount));
+ ++pInfo->captureHead;
+ --pInfo->pending;
+ return paNoError;
+}
+
+static PaError PaPinCaptureSubmitHandler_WaveCyclic(PaProcessThreadInfo* pInfo, unsigned eventIndex)
+{
+ PaError result = paNoError;
+ DATAPACKET* packet = pInfo->capturePackets[pInfo->captureTail & cPacketsArrayMask].packet;
+ pInfo->capturePackets[pInfo->captureTail & cPacketsArrayMask].packet = 0;
+ assert(packet != 0);
+ PA_HP_TRACE((pInfo->stream->hLog, "Capture submit: %u", eventIndex));
+ packet->Header.DataUsed = 0; /* Reset for reuse */
+ ResetEvent(packet->Signal.hEvent);
+ result = PinRead(pInfo->stream->capture.pPin->handle, packet);
+ ++pInfo->pending;
+ return result;
+}
+
+static PaError PaPinRenderEventHandler_WaveCyclic(PaProcessThreadInfo* pInfo, unsigned eventIndex)
+{
+ assert( eventIndex < pInfo->stream->render.noOfPackets );
+
+ pInfo->renderPackets[pInfo->renderHead & cPacketsArrayMask].packet = pInfo->stream->render.packets + eventIndex;
+ PA_HP_TRACE((pInfo->stream->hLog, "<<< Render event : idx=%u head=%u", eventIndex, pInfo->renderHead));
+ ++pInfo->renderHead;
+ --pInfo->pending;
+ return paNoError;
+}
+
+static PaError PaPinRenderSubmitHandler_WaveCyclic(PaProcessThreadInfo* pInfo, unsigned eventIndex)
+{
+ PaError result = paNoError;
+ DATAPACKET* packet = pInfo->renderPackets[pInfo->renderTail & cPacketsArrayMask].packet;
+ pInfo->renderPackets[pInfo->renderTail & cPacketsArrayMask].packet = 0;
+ assert(packet != 0);
+
+ PA_HP_TRACE((pInfo->stream->hLog, "Render submit : %u idx=%u", pInfo->renderTail, (unsigned)(packet - pInfo->stream->render.packets)));
+ ResetEvent(packet->Signal.hEvent);
+ result = PinWrite(pInfo->stream->render.pPin->handle, packet);
+ /* Reset event, just in case we have an analogous situation to capture (see PaPinCaptureSubmitHandler_WaveCyclic) */
+ ++pInfo->pending;
+ if (pInfo->priming)
+ {
+ --pInfo->priming;
+ }
+ return result;
+}
+
+/***************************************************************************************/
+/* Event and submit handlers for WaveRT */
+/***************************************************************************************/
+
+static PaError PaPinCaptureEventHandler_WaveRTEvent(PaProcessThreadInfo* pInfo, unsigned eventIndex)
+{
+ unsigned long pos;
+ unsigned realInBuf;
+ unsigned frameCount;
+ PaWinWdmIOInfo* pCapture = &pInfo->stream->capture;
+ const unsigned halfInputBuffer = pCapture->hostBufferSize >> 1;
+ PaWinWdmPin* pin = pCapture->pPin;
+ DATAPACKET* packet = 0;
+
+ /* Get hold of current ADC position */
+ pin->fnAudioPosition(pin, &pos);
+ /* Wrap it (robi: why not use hw latency compensation here ?? because pos then gets _way_ off from
+ where it should be, i.e. at beginning or half buffer position. Why? No idea.) */
+
+ pos %= pCapture->hostBufferSize;
+ /* Then realInBuf will point to "other" half of double buffer */
+ realInBuf = pos < halfInputBuffer ? 1U : 0U;
+
+ packet = pInfo->stream->capture.packets + realInBuf;
+
+ /* Call barrier (or dummy) */
+ pin->fnMemBarrier();
+
+ /* Put it in queue */
+ frameCount = PaUtil_WriteRingBuffer(&pInfo->stream->ringBuffer, packet->Header.Data, pCapture->framesPerBuffer);
+
+ pInfo->capturePackets[pInfo->captureHead & cPacketsArrayMask].packet = packet;
+
+ PA_HP_TRACE((pInfo->stream->hLog, "Capture event (WaveRT): idx=%u head=%u (pos = %4.1lf%%, frames=%u)", realInBuf, pInfo->captureHead, (pos * 100.0 / pCapture->hostBufferSize), frameCount));
+
+ ++pInfo->captureHead;
+ --pInfo->pending;
+
+ return paNoError;
+}
+
+static PaError PaPinCaptureEventHandler_WaveRTPolled(PaProcessThreadInfo* pInfo, unsigned eventIndex)
+{
+ unsigned long pos;
+ unsigned bytesToRead;
+ PaWinWdmIOInfo* pCapture = &pInfo->stream->capture;
+ const unsigned halfInputBuffer = pCapture->hostBufferSize>>1;
+ PaWinWdmPin* pin = pInfo->stream->capture.pPin;
+
+ /* Get hold of current ADC position */
+ pin->fnAudioPosition(pin, &pos);
+ /* Wrap it (robi: why not use hw latency compensation here ?? because pos then gets _way_ off from
+ where it should be, i.e. at beginning or half buffer position. Why? No idea.) */
+ /* Compensate for HW FIFO to get to last read buffer position */
+ pos += pin->hwLatency;
+ pos %= pCapture->hostBufferSize;
+ /* Need to align position on frame boundary */
+ pos &= ~(pCapture->bytesPerFrame - 1);
+
+ /* Call barrier (or dummy) */
+ pin->fnMemBarrier();
+
+ /* Put it in "queue" */
+ bytesToRead = (pCapture->hostBufferSize + pos - pCapture->lastPosition) % pCapture->hostBufferSize;
+ if (bytesToRead > 0)
+ {
+ unsigned frameCount = PaUtil_WriteRingBuffer(&pInfo->stream->ringBuffer,
+ pCapture->hostBuffer + pCapture->lastPosition,
+ bytesToRead / pCapture->bytesPerFrame);
+
+ pCapture->lastPosition = (pCapture->lastPosition + frameCount * pCapture->bytesPerFrame) % pCapture->hostBufferSize;
+
+ PA_HP_TRACE((pInfo->stream->hLog, "Capture event (WaveRTPolled): pos = %4.1lf%%, framesRead=%u", (pos * 100.0 / pCapture->hostBufferSize), frameCount));
+ ++pInfo->captureHead;
+ --pInfo->pending;
+ }
+ return paNoError;
+}
+
+static PaError PaPinCaptureSubmitHandler_WaveRTEvent(PaProcessThreadInfo* pInfo, unsigned eventIndex)
+{
+ pInfo->capturePackets[pInfo->captureTail & cPacketsArrayMask].packet = 0;
+ ++pInfo->pending;
+ return paNoError;
+}
+
+static PaError PaPinCaptureSubmitHandler_WaveRTPolled(PaProcessThreadInfo* pInfo, unsigned eventIndex)
+{
+ pInfo->capturePackets[pInfo->captureTail & cPacketsArrayMask].packet = 0;
+ ++pInfo->pending;
+ return paNoError;
+}
+
+static PaError PaPinRenderEventHandler_WaveRTEvent(PaProcessThreadInfo* pInfo, unsigned eventIndex)
+{
+ unsigned long pos;
+ unsigned realOutBuf;
+ PaWinWdmIOInfo* pRender = &pInfo->stream->render;
+ const unsigned halfOutputBuffer = pRender->hostBufferSize >> 1;
+ PaWinWdmPin* pin = pInfo->stream->render.pPin;
+ PaIOPacket* ioPacket = &pInfo->renderPackets[pInfo->renderHead & cPacketsArrayMask];
+
+ /* Get hold of current DAC position */
+ pin->fnAudioPosition(pin, &pos);
+ /* Compensate for HW FIFO to get to last read buffer position */
+ pos += pin->hwLatency;
+ /* Wrap it */
+ pos %= pRender->hostBufferSize;
+ /* And align it, not sure its really needed though */
+ pos &= ~(pRender->bytesPerFrame - 1);
+ /* Then realOutBuf will point to "other" half of double buffer */
+ realOutBuf = pos < halfOutputBuffer ? 1U : 0U;
+
+ if (pInfo->priming)
+ {
+ realOutBuf = pInfo->renderHead & 0x1;
+ }
+ ioPacket->packet = pInfo->stream->render.packets + realOutBuf;
+ ioPacket->startByte = realOutBuf * halfOutputBuffer;
+ ioPacket->lengthBytes = halfOutputBuffer;
+
+ PA_HP_TRACE((pInfo->stream->hLog, "Render event (WaveRT) : idx=%u head=%u (pos = %4.1lf%%)", realOutBuf, pInfo->renderHead, (pos * 100.0 / pRender->hostBufferSize) ));
+
+ ++pInfo->renderHead;
+ --pInfo->pending;
+ return paNoError;
+}
+
+static PaError PaPinRenderEventHandler_WaveRTPolled(PaProcessThreadInfo* pInfo, unsigned eventIndex)
+{
+ unsigned long pos;
+ unsigned realOutBuf;
+ unsigned bytesToWrite;
+
+ PaWinWdmIOInfo* pRender = &pInfo->stream->render;
+ const unsigned halfOutputBuffer = pRender->hostBufferSize >> 1;
+ PaWinWdmPin* pin = pInfo->stream->render.pPin;
+ PaIOPacket* ioPacket = &pInfo->renderPackets[pInfo->renderHead & cPacketsArrayMask];
+
+ /* Get hold of current DAC position */
+ pin->fnAudioPosition(pin, &pos);
+ /* Compensate for HW FIFO to get to last read buffer position */
+ pos += pin->hwLatency;
+ /* Wrap it */
+ pos %= pRender->hostBufferSize;
+ /* And align it, not sure its really needed though */
+ pos &= ~(pRender->bytesPerFrame - 1);
+
+ if (pInfo->priming)
+ {
+ realOutBuf = pInfo->renderHead & 0x1;
+ ioPacket->packet = pInfo->stream->render.packets + realOutBuf;
+ ioPacket->startByte = realOutBuf * halfOutputBuffer;
+ ioPacket->lengthBytes = halfOutputBuffer;
+ ++pInfo->renderHead;
+ --pInfo->pending;
+ }
+ else
+ {
+ bytesToWrite = (pRender->hostBufferSize + pos - pRender->lastPosition) % pRender->hostBufferSize;
+ ++pRender->pollCntr;
+ if (bytesToWrite >= halfOutputBuffer)
+ {
+ realOutBuf = (pos < halfOutputBuffer) ? 1U : 0U;
+ ioPacket->packet = pInfo->stream->render.packets + realOutBuf;
+ pRender->lastPosition = realOutBuf ? 0U : halfOutputBuffer;
+ ioPacket->startByte = realOutBuf * halfOutputBuffer;
+ ioPacket->lengthBytes = halfOutputBuffer;
+ ++pInfo->renderHead;
+ --pInfo->pending;
+ PA_HP_TRACE((pInfo->stream->hLog, "Render event (WaveRTPolled) : idx=%u head=%u (pos = %4.1lf%%, cnt=%u)", realOutBuf, pInfo->renderHead, (pos * 100.0 / pRender->hostBufferSize), pRender->pollCntr));
+ pRender->pollCntr = 0;
+ }
+ }
+ return paNoError;
+}
+
+static PaError PaPinRenderSubmitHandler_WaveRTEvent(PaProcessThreadInfo* pInfo, unsigned eventIndex)
+{
+ PaWinWdmPin* pin = pInfo->stream->render.pPin;
+ pInfo->renderPackets[pInfo->renderTail & cPacketsArrayMask].packet = 0;
+ /* Call barrier (if needed) */
+ pin->fnMemBarrier();
+ PA_HP_TRACE((pInfo->stream->hLog, "Render submit (WaveRT) : submit=%u", pInfo->renderTail));
+ ++pInfo->pending;
+ if (pInfo->priming)
+ {
+ --pInfo->priming;
+ if (pInfo->priming)
+ {
+ PA_HP_TRACE((pInfo->stream->hLog, "Setting WaveRT event for priming (2)"));
+ SetEvent(pInfo->stream->render.events[0]);
+ }
+ }
+ return paNoError;
+}
+
+static PaError PaPinRenderSubmitHandler_WaveRTPolled(PaProcessThreadInfo* pInfo, unsigned eventIndex)
+{
+ PaWinWdmPin* pin = pInfo->stream->render.pPin;
+ pInfo->renderPackets[pInfo->renderTail & cPacketsArrayMask].packet = 0;
+ /* Call barrier (if needed) */
+ pin->fnMemBarrier();
+ PA_HP_TRACE((pInfo->stream->hLog, "Render submit (WaveRTPolled) : submit=%u", pInfo->renderTail));
+ ++pInfo->pending;
+ if (pInfo->priming)
+ {
+ --pInfo->priming;
+ if (pInfo->priming)
+ {
+ PA_HP_TRACE((pInfo->stream->hLog, "Setting WaveRT event for priming (2)"));
+ SetEvent(pInfo->stream->render.events[0]);
+ }
+ }
+ return paNoError;
+}
diff --git a/3rdparty/portaudio/src/hostapi/wdmks/readme.txt b/3rdparty/portaudio/src/hostapi/wdmks/readme.txt
index 2a366f237..b3faf3385 100644
--- a/3rdparty/portaudio/src/hostapi/wdmks/readme.txt
+++ b/3rdparty/portaudio/src/hostapi/wdmks/readme.txt
@@ -3,12 +3,15 @@ Notes about WDM-KS host API
Status history
--------------
+16th January 2011:
+Added support for WaveRT device API (Vista and later) for even lesser
+latency support.
+
10th November 2005:
Made following changes:
* OpenStream: Try all PaSampleFormats internally if the the chosen
format is not supported natively. This fixed several problems
- with soundcards that soundcards that did not take kindly to
- using 24-bit 3-byte formats.
+ with soundcards that did not take kindly to using 24-bit 3-byte formats.
* OpenStream: Make the minimum framesPerHostIBuffer (and framesPerHostOBuffer)
the default frameSize for the playback/recording pin.
* ProcessingThread: Added a switch to only call PaUtil_EndBufferProcessing
@@ -71,7 +74,7 @@ In PortAudio terms, this means having a stream Open on a WDMKS device.
Usage
-----
To add the WDMKS backend to your program which is already using
-PortAudio, you must undefine PA_NO_WDMKS from your build file,
+PortAudio, you must define PA_USE_WDMKS=1 in your build file,
and include the pa_win_wdmks\pa_win_wdmks.c into your build.
The file should compile in both C and C++.
You will need a DirectX SDK installed on your system for the
@@ -79,4 +82,4 @@ ks.h and ksmedia.h header files.
You will need to link to the system "setupapi" library.
Note that if you use MinGW, you will get more warnings from
the DX header files when using GCC(C), and still a few warnings
-with G++(CPP).
\ No newline at end of file
+with G++(CPP).
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ae57e9c94..dc302264d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -79,9 +79,6 @@ if(common_libs)
add_subdirectory(common/src/x86emitter)
endif(common_libs)
-# make tools
-add_subdirectory(tools)
-
# make pcsx2
if(EXISTS "${PROJECT_SOURCE_DIR}/pcsx2" AND pcsx2_core)
add_subdirectory(pcsx2)
@@ -100,5 +97,5 @@ if(PACKAGE_MODE)
INSTALL(FILES "${PROJECT_SOURCE_DIR}/linux_various/pcsx2.xpm" DESTINATION "${CMAKE_INSTALL_PREFIX}/share/pixmaps")
INSTALL(FILES "${PROJECT_SOURCE_DIR}/bin/docs/PCSX2_FAQ_0.9.8.pdf" DESTINATION "${CMAKE_INSTALL_PREFIX}/share/doc/pcsx2")
INSTALL(FILES "${PROJECT_SOURCE_DIR}/bin/docs/PCSX2_Readme_0.9.8.pdf" DESTINATION "${CMAKE_INSTALL_PREFIX}/share/doc/pcsx2")
- INSTALL(FILES "${PROJECT_SOURCE_DIR}/bin/docs/pcsx2.man" DESTINATION "${CMAKE_INSTALL_PREFIX}/share/man/man1/")
+ INSTALL(FILES "${PROJECT_SOURCE_DIR}/bin/docs/pcsx2.1" DESTINATION "${CMAKE_INSTALL_PREFIX}/share/man/man1/")
endif(PACKAGE_MODE)
diff --git a/COPYING.GPLv2 b/COPYING.GPLv2
new file mode 100644
index 000000000..d159169d1
--- /dev/null
+++ b/COPYING.GPLv2
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ 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.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ , 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/COPYING.GPLv3 b/COPYING.GPLv3
new file mode 100644
index 000000000..94a9ed024
--- /dev/null
+++ b/COPYING.GPLv3
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ 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 3 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, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/COPYING.LGPLv2.1 b/COPYING.LGPLv2.1
new file mode 100644
index 000000000..4362b4915
--- /dev/null
+++ b/COPYING.LGPLv2.1
@@ -0,0 +1,502 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This library 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 Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ , 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/COPYING.LGPLv3 b/COPYING.LGPLv3
new file mode 100644
index 000000000..65c5ca88a
--- /dev/null
+++ b/COPYING.LGPLv3
@@ -0,0 +1,165 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff --git a/bin/GameIndex.dbf b/bin/GameIndex.dbf
index c86f951c8..00ae3f18e 100644
--- a/bin/GameIndex.dbf
+++ b/bin/GameIndex.dbf
@@ -83,6 +83,10 @@
---------------------------------------------
-- Game List
---------------------------------------------
+Serial = PBPX-95201
+Name = Underwater Unit
+Region = NTSC-K
+---------------------------------------------
Serial = PBPX-95503
Name = Gran Turismo 3 - A-Spec [PS2 Bundle]
Region = NTSC-U
@@ -11854,6 +11858,20 @@ Serial = SCAJ-30011
Name = God of War II
Region = NTSC-E
---------------------------------------------
+Serial = SCKA-10006
+Name = Come on Baby
+Region = NTSC-K
+---------------------------------------------
+Serial = SCKA-20004
+Name = Sly Cooper and the Thievius Raccoonus
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
+Serial = SCKA-20008
+Name = Tales of Destiny 2
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
Serial = SCKA-20009
Name = R-Type Final
Region = NTSC-K
@@ -11864,16 +11882,53 @@ Serial = SCKA-20010
Name = Jak II
Region = NTSC-K
---------------------------------------------
+Serial = SCKA-20011
+Name = Ratchet and Clank 2
+Region = NTSC-K
+---------------------------------------------
Serial = SCKA-20012
Name = Ark the Lad - jeongryeongui Hwanghon
Region = NTSC-K
---------------------------------------------
+Serial = SCKA-20014
+Name = Dark Claud 2
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
+Serial = SCKA-20015
+Name = Time Crisis 3
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
+Serial = SCKA-20016
+Name = Soul Calibur 2
+Region = NTSC-K
+Compat = 5
+vuClampMode = 2 //SPS(Spikey Polygon Syndrome) solution
+---------------------------------------------
+Serial = SCKA-20018
+Name = The Getaway
+Region = NTSC-K
+---------------------------------------------
+Serial = SCKA-20019
+Name = Siren
+Region = NTSC-K
+---------------------------------------------
Serial = SCKA-20020
Name = SOCOM II - U.S. Navy SEALs
Region = NTSC-K
Compat = 5
VIF1StallHack = 1 //HUD
---------------------------------------------
+Serial = SCKA-20022
+Name = Gran Turismo 4 Prologue
+Region = NTSC-K
+---------------------------------------------
+Serial = SCKA-20023
+Name = Fatal Frame 2
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
Serial = SCKA-20025
Name = Katamari Damacy
Region = NTSC-K
@@ -11883,6 +11938,11 @@ Serial = SCKA-20026
Name = Gungrave O.D.
Region = NTSC-K
---------------------------------------------
+Serial = SCKA-20027
+Name = Ghost in the Shell - Stand Alone Complex
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
Serial = SCKA-20028
Name = Ico [PlayStation2 Big Hit Series]
Region = NTSC-K
@@ -11915,6 +11975,10 @@ Serial = SCKA-20038
Name = Time Crisis - Crisis Zone
Region = NTSC-K
---------------------------------------------
+Serial = SCKA-20039
+Name = Tekken Nina Williams In Death By Degree
+Region = NTSC-K
+---------------------------------------------
Serial = SCKA-20040
Name = Jak 3
Region = NTSC-K
@@ -11923,6 +11987,15 @@ Serial = SCKA-20043
Name = Magna Carta
Region = NTSC-K
---------------------------------------------
+Serial = SCKA-20044
+Name = Sly Cooper 2 Band of Thieves
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
+Serial = SCKA-20047
+Name = Armored Core Nine Breaker
+Region = NTSC-K
+---------------------------------------------
Serial = SCKA-20048
Name = Killzone
Region = NTSC-K
@@ -11935,12 +12008,18 @@ eeClampMode = 1
Serial = SCKA-20050
Name = Tales of Legendia
Region = NTSC-K
+Compat = 5
---------------------------------------------
Serial = SCKA-20051
Name = Minna Daisuki Katamari Damacy
Region = NTSC-K
SkipMPEGHack = 1
---------------------------------------------
+Serial = SCKA-20052
+Name = Genji
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
Serial = SCKA-20053
Name = SOCOM II - U.S. Navy SEALs [PlayStation 2 Big Hit Series]
Region = NTSC-K
@@ -11966,6 +12045,7 @@ Region = NTSC-K
Serial = SCKA-20059
Name = Soul Calibur III
Region = NTSC-K
+Compat = 5
---------------------------------------------
Serial = SCKA-20060
Name = Ratchet - Deadlocked
@@ -11974,15 +12054,25 @@ Region = NTSC-K
Serial = SCKA-20061
Name = Wanda to Kyozou (Shadow of the Colossus)
Region = NTSC-K
+Compat = 5
---------------------------------------------
Serial = SCKA-20062
Name = Ape Escape 3
Region = NTSC-K
---------------------------------------------
+Serial = SCKA-20063
+Name = Sly Cooper 3 Honor Among Thieves
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
Serial = SCKA-20064
Name = SOCOM 3 - U.S. Navy SEALs
Region = NTSC-K
---------------------------------------------
+Serial = SCKA-20069
+Name = Siren 2
+Region = NTSC-K
+---------------------------------------------
Serial = SCKA-20070
Name = Ace Combat Zero - The Belkan War
Region = NTSC-K
@@ -12022,10 +12112,19 @@ Serial = SCKA-20087
Name = Shin Onimusha - Dawn of Dreams [Disc2of2]
Region = NTSC-K
---------------------------------------------
+Serial = SCKA-20090
+Name = God Hand
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
Serial = SCKA-20092
Name = K-1 World Grand Prix 2006
Region = NTSC-K
---------------------------------------------
+Serial = SCKA-20096
+Name = Barnyard
+Region = NTSC-K
+---------------------------------------------
Serial = SCKA-20099
Name = Persona 3
Region = NTSC-K
@@ -12053,10 +12152,34 @@ Serial = SCKA-20117
Name = Super Robot Taisen OG - Original Generations Gaiden
Region = NTSC-K
---------------------------------------------
+Serial = SCKA-20120
+Name = Ratchet and Clank
+Region = NTSC-K
+---------------------------------------------
+Serial = SCKA-20132
+Name = Shin Megami Tensei - Persona 4
+Region = NTSC-K
+Compat = 5
+VuClipFlagHack = 1
+---------------------------------------------
Serial = SCKA-24008
Name = SOCOM - U.S. Navy SEALs
Region = NTSC-K
---------------------------------------------
+Serial = SCKA-30001
+Name = Gran Turismo 4
+Region = NTSC-K
+---------------------------------------------
+Serial = SCKA-30002
+Name = God of War
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
+Serial = SCKA-30006
+Name = God of War 2
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
Serial = SCPS-11001
Name = I.Q. Remix
Region = NTSC-J
@@ -13229,10 +13352,51 @@ Serial = SCPS-55903
Name = Gran Turismo - Concept 2002 Tokyo-Geneva
Region = NTSC-J
---------------------------------------------
+Serial = SCPS-56001
+Name = Ico
+Region = NTSC-K
+Compat = 5
+eeClampMode = 2 // Otherwise freezes in various spots, check full intro
+vuClampMode = 1 // Otherwise camera gets stuck off the player in various spots.
+---------------------------------------------
+Serial = SCPS-56002
+Name = Tekken Tag Tournament
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
+Serial = SCPS-56005
+Name = Gran Turismo Concept 2002 Tokyo-Seoul
+Region = NTSC-K
+---------------------------------------------
+Serial = SCPS-56006
+Name = Tekken 4
+Region = NTSC-K
+Compat = 5
+[patches = 35B4028B]
+ comment=patches by Shadow Lady
+ //IPU BUSY! fix...
+ patch=0,EE,00290b24,word,24200001
+ patch=0,EE,00290d24,word,00000000
+[/patches]
+---------------------------------------------
+Serial = SCPS-56008
+Name = Fatal Frame
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
Serial = SCPS-56011
Name = U - Underwater Unit
Region = NTSC-J
---------------------------------------------
+Serial = SCPS-56012
+Name = Raw Danger
+Region = NTSC-K
+---------------------------------------------
+Serial = SCPS-56014
+Name = Gungrave
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
Serial = SCPS-56015
Name = Ninja Assault
Region = NTSC-J
@@ -13491,6 +13655,10 @@ Serial = SLAJ-35003
Name = Sakura Taisen - Atsuki Chishioni Ni
Region = NTSC-Unk
---------------------------------------------
+Serial = SLKA-15003
+Name = Shikigami no Shiro II
+Region = NTSC-K
+---------------------------------------------
Serial = SLKA-15004
Name = Gunbird - Premium Package
Region = NTSC-J
@@ -13500,10 +13668,37 @@ Name = Strikers 1945 III
Region = NTSC-J
Compat = 5
---------------------------------------------
+Serial = SLKA-15007
+Name = GrowLanser2
+Region = NTSC-K
+Compat = 5
+OPHFLagHack = 1
+---------------------------------------------
Serial = SLKA-15008
Name = Choro Q HG2
Region = NTSC-E-F-G
---------------------------------------------
+Serial = SLKA-15021
+Name = GrowLanser3
+Region = NTSC-K
+Compat = 5
+OPHFLagHack = 1
+---------------------------------------------
+Serial = SLKA-15032
+Name = Gradius V
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
+Serial = SLKA-25012
+Name = Davil May Cry 2 Dante
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
+Serial = SLKA-25013
+Name = Davil May Cry 2 Lucia
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
Serial = SLKA-25015
Name = Evolution Skateboarding
Region = NTSC-K
@@ -13511,11 +13706,21 @@ Region = NTSC-K
Serial = SLKA-25021
Name = Shinobi
Region = NTSC-M3
+Compat = 5
+---------------------------------------------
+Serial = SLKA-25024
+Name = Lilo & Stitch Experiment
+Region = NTSC-K
---------------------------------------------
Serial = SLKA-25026
Name = Chaos Legion
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25033
+Name = Gregory Horror Show
+Region = NTSC-K
+Compat = 1
+---------------------------------------------
Serial = SLKA-25035
Name = Mobile Suit Gundam - Lost War Chronicles
Region = NTSC-K
@@ -13524,14 +13729,37 @@ Serial = SLKA-25038
Name = Gun Survivor 4 - Biohazard - Heroes Never Die
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25041
+Name = Armored Core 3 Silent Line
+Region = NTSC-K
+---------------------------------------------
+Serial = SLKA-25042
+Name = Tamamayu Monogatari 2 Horobi no Mushi
+Region = NTSC-K
+---------------------------------------------
Serial = SLKA-25043
Name = Virtua Fighter 4 - Evolution
Region = NTSC-K
+Compat = 5
+---------------------------------------------
+Serial = SLKA-25046
+Name = Dragonball Z
+Region = NTSC-K
+---------------------------------------------
+Serial = SLKA-25048
+Name = Makai Senki Disgaea
+Region = NTSC-K
+Compat = 5
---------------------------------------------
Serial = SLKA-25049
Name = Metal Slug 3
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25051
+Name = Clock Tower 3
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
Serial = SLKA-25052
Name = Air Ranger 2 - Rescue Helicopter
Region = NTSC-K
@@ -13540,18 +13768,51 @@ Serial = SLKA-25060
Name = I.Q. Remix+ - Intelligent Qube
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25062
+Name = Dragonball Z 2
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
Serial = SLKA-25063
Name = Kaido Battle
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25064
+Name = Tenchu 3 Wrath of Heaven
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
+Serial = SLKA-25066
+Name = Zone of The Enders 2nd Runner SE
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
+Serial = SLKA-25067
+Name = Unlimited Saga
+Region = NTSC-K
+---------------------------------------------
Serial = SLKA-25070
Name = Guity Gear XX Reload - The Midnight Carnival
Region = NTSC-J-K
---------------------------------------------
+Serial = SLKA-25071
+Name = Tantei Jinguji Saburo 8 Inocent Black
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
Serial = SLKA-25077
Name = Culdicept II - Expansion
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25081
+Name = SD Gundam G Generation Neo
+Region = NTSC-K
+---------------------------------------------
+Serial = SLKA-25082
+Name = Castlevania Lament of Innocence
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
Serial = SLKA-25087
Name = FIFA Soccer 2004
Region = NTSC-J
@@ -13561,6 +13822,19 @@ Serial = SLKA-25091
Name = Hanjuku Hero vs. 3D
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25092
+Name = Onimusha Buraiden
+Region = NTSC-K
+---------------------------------------------
+Serial = SLKA-25093
+Name = Onimusha 3 Demon Siege
+Region = NTSC-K
+---------------------------------------------
+Serial = SLKA-25100
+Name = Dragon Quest V Dragon Quarter
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
Serial = SLKA-25103
Name = Neon Genesis Evangelion 2
Region = NTSC-K
@@ -13569,6 +13843,10 @@ Serial = SLKA-25112
Name = King of Fighters 2001, The
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25115
+Name = Rockman X7
+Region = NTSC-K
+---------------------------------------------
Serial = SLKA-25125
Name = SNK vs. Capcom - Chaos
Region = NTSC-K
@@ -13581,6 +13859,10 @@ Serial = SLKA-25131
Name = Project Altered Beast
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25132
+Name = Mobile Suit Gundam Encounters in Space
+Region = NTSC-K
+---------------------------------------------
Serial = SLKA-25133
Name = AirForce Delta Strike
Region = NTSC-K
@@ -13590,6 +13872,11 @@ Serial = SLKA-25134
Name = NBA Street v3
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25135
+Name = Kunoichi
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
Serial = SLKA-25139
Name = Fu-un Shinsengumi
Region = NTSC-K
@@ -13597,6 +13884,12 @@ Region = NTSC-K
Serial = SLKA-25144
Name = Final Fantasy X-2
Region = NTSC-K
+Compat = 5
+---------------------------------------------
+Serial = SLKA-25149
+Name = Silent Hill 4 The Room
+Region = NTSC-K
+Compat = 5
---------------------------------------------
Serial = SLKA-25150
Name = Bujingai
@@ -13610,6 +13903,10 @@ Serial = SLKA-25153
Name = Winning Eleven 10 - Liveware Edition
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25159
+Name = Astro Boy
+Region = NTSC-K
+---------------------------------------------
Serial = SLKA-25160
Name = Shin Megami Tensei III - Nocturne Maniax
Region = NTSC-K
@@ -13629,10 +13926,27 @@ Serial = SLKA-25167
Name = King of Fighters XI, The
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25170
+Name = SD Gundam G Generation Seed
+Region = NTSC-K
+---------------------------------------------
+Serial = SLKA-25171
+Name = Guon
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
Serial = SLKA-25175
Name = Transformers
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25181
+Name = Energy Airforce Aim Strike
+Region = NTSC-K
+---------------------------------------------
+Serial = SLKA-25182
+Name = Hajime no Ippo2 Victorious Road
+Region = NTSC-K
+---------------------------------------------
Serial = SLKA-25183
Name = Street Fighter - Anniversary Collection
Region = NTSC-K
@@ -13641,14 +13955,28 @@ Serial = SLKA-25186
Name = King of Fighters, The - Maximum Impact [Limited Edition]
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25198
+Name = Tenchu Kurenai
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
Serial = SLKA-25199
Name = Kengo 3
Region = NTSC-K
+Compat = 5
---------------------------------------------
Serial = SLKA-25200
Name = SSX 3 [PlayStation 2 - Big Hit Series]
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25201
+Name = Armored Core Nexus Evolution DISC1
+Region = NTSC-K
+---------------------------------------------
+Serial = SLKA-25202
+Name = Armored Core Nexus Revolution DISC2
+Region = NTSC-K
+---------------------------------------------
Serial = SLKA-25204
Name = Showdown - Legends of Wrestling
Region = NTSC-K
@@ -13660,6 +13988,7 @@ Region = NTSC-K
Serial = SLKA-25207
Name = Sakura Taisen V - Episode 0 - Samurai Girl of Wild
Region = NTSC-K
+Compat = 5
---------------------------------------------
Serial = SLKA-25208
Name = From TV Animation - One Piece - Round the Land!
@@ -13668,6 +13997,7 @@ Region = NTSC-K
Serial = SLKA-25213
Name = Berserk
Region = NTSC-K
+Compat = 5
---------------------------------------------
Serial = SLKA-25214
Name = Final Fantasy X - International [PlayStation 2 - Big Hit Series]
@@ -13690,10 +14020,38 @@ Serial = SLKA-25218
Name = Hitman - Contracts
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25219
+Name = Monster Hunter G
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
+Serial = SLKA-25221
+Name = Busin Zero
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
+Serial = SLKA-25222
+Name = Rockman X8
+Region = NTSC-K
+---------------------------------------------
Serial = SLKA-25224
Name = Detective Saburou Jinguji 9 - Kind of Blue
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25225
+Name = Dororo
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
+Serial = SLKA-25227
+Name = Neo Contra
+Region = NTSC-K
+---------------------------------------------
+Serial = SLKA-25232
+Name = Naruto Naruthimetto Hero International
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
Serial = SLKA-25233
Name = Sonic - Mega Collection Plus
Region = NTSC-K
@@ -13706,6 +14064,10 @@ Serial = SLKA-25244
Name = WWE SmackDown! vs. Raw
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25246
+Name = Bard's Tale
+Region = NTSC-K
+---------------------------------------------
Serial = SLKA-25249
Name = Ys - The Ark of Napishtim [with Guide Book]
Region = NTSC-K
@@ -13718,6 +14080,12 @@ Serial = SLKA-25252
Name = Forgotten Realms - Demon Stone
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25254
+Name = Digimon Rumble Arena 2
+Region = NTSC-K
+Compat = 5
+FpuCompareHack = 1
+---------------------------------------------
Serial = SLKA-25255
Name = Mobile Suit Gundam - Seed - Never Ending Tomorrow
Region = NTSC-K
@@ -13726,6 +14094,11 @@ Serial = SLKA-25257
Name = Fu-un Bakumatsu Den
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25258
+Name = The Story of the Hero Yoshitsune
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
Serial = SLKA-25259
Name = Swords of Destiny
Region = NTSC-K
@@ -13775,6 +14148,7 @@ Region = NTSC-K
Serial = SLKA-25284
Name = Sakura Taisen 3
Region = NTSC-K
+Compat = 1
---------------------------------------------
Serial = SLKA-25287
Name = Metal Slug 4&5
@@ -13811,12 +14185,30 @@ Region = NTSC-K
Serial = SLKA-25300
Name = Digital Devil Saga [Special Package]
Region = NTSC-J-K
+Compat = 5
EETimingHack = 1
---------------------------------------------
+Serial = SLKA-25301
+Name = Digital Devil Saga - Avatar Tuner 2
+Region = NTSC-K
+Compat = 5
+EETimingHack = 1
+---------------------------------------------
+Serial = SLKA-25307
+Name = Dragonball Z Sparking
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
Serial = SLKA-25311
Name = Marvel Nemesis - Rise of the Imperfects
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25313
+Name = Naruto - Uzumaki Chronicles
+Region = NTSC-K
+Compat = 5
+OPHFLagHack = 1
+---------------------------------------------
Serial = SLKA-25317
Name = Shin Sangoku Musou 3 [PlayStation 2 - Big Hit Series]
Region = NTSC-K
@@ -13839,6 +14231,12 @@ Serial = SLKA-25323
Name = SSX On Tour
Region = NTSC-J-K
---------------------------------------------
+Serial = SLKA-25328
+Name = Castlevania - Curse of Dakness
+Region = NTSC-K
+Compat = 5
+vuClampMode = 0 //SPS with microVU
+---------------------------------------------
Serial = SLKA-25329
Name = Shin Sangoku Musou 4 - Moushouden
Region = NTSC-K
@@ -13859,6 +14257,10 @@ Serial = SLKA-25342
Name = Ryu ga Gotoku
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25351
+Name = One Piece Pirates Carnival
+Region = NTSC-K
+---------------------------------------------
Serial = SLKA-25352
Name = Full Metal Alchemist - Dream Carnival
Region = NTSC-K
@@ -13866,19 +14268,35 @@ Region = NTSC-K
Serial = SLKA-25353
Name = Metal Gear Solid 3 - Subsistance [Limited Edition] [Disc1of2]
Region = NTSC-K
+Compat = 5
---------------------------------------------
Serial = SLKA-25354
Name = Metal Gear Solid 3 - Subsistance [Limited Edition] [Disc2of2]
Region = NTSC-K
+Compat = 5
---------------------------------------------
Serial = SLKA-25359
Name = Winning Eleven 9 - Liveware Edition
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25361
+Name = Keroro Gunsou MeroMero Battle Royale Z
+Region = NTSC-K
+---------------------------------------------
Serial = SLKA-25364
Name = Mobile Suit Gundam - Climax U.C.
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25365
+Name = WWE Smack Down Vs RAW 2008
+Region = NTSC-K
+---------------------------------------------
+Serial = SLKA-25366
+Name = Naruto - Uzumaki Chronicles 2
+Region = NTSC-K
+Compat = 5
+OPHFLagHack = 1
+---------------------------------------------
Serial = SLKA-25375
Name = Transformers - The Game
Region = NTSC-K
@@ -13887,13 +14305,20 @@ Serial = SLKA-25381
Name = Winning Eleven 10
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25384
+Name = Blazing Souls
+Region = NTSC-K
+---------------------------------------------
Serial = SLKA-25388
Name = One Piece - Grand Adventure
Region = NTSC-K
+Compat = 5
---------------------------------------------
Serial = SLKA-25389
Name = Shinobido Imashime
Region = NTSC-K
+Compat = 5
+eeClampMode = 3 //Otherwise freezes in some spot
---------------------------------------------
Serial = SLKA-25390
Name = Shin Sangoku Musou 4 - Empires
@@ -13903,6 +14328,11 @@ Serial = SLKA-25396
Name = FIFA '07
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25397
+Name = Dragon Ball Z Sparking NEO
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
Serial = SLKA-25406
Name = King of Fighters, The - Maximum Impact - Regulation A
Region = NTSC-K
@@ -13910,6 +14340,7 @@ Region = NTSC-K
Serial = SLKA-25407
Name = DragonBall Z - Sparkling! Meteor
Region = NTSC-K
+Compat = 5
---------------------------------------------
Serial = SLKA-25413
Name = SD Gundam G - Generation Spirits
@@ -13924,9 +14355,37 @@ Serial = SLKA-25424
Name = SNK Arcade Classics Vol.1
Region = NTSC-K
---------------------------------------------
+Serial = SLKA-25443
+Name = Musou Orochi Maou Sairin
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
+Serial = SLKA-25477
+Name = World Soccer Winning Eleven 2011
+Region = NTSC-K
+---------------------------------------------
+Serial = SLKA-25480
+Name = World Soccer Winning Eleven 2012
+Region = NTSC-K
+---------------------------------------------
+Serial = SLKA-35001
+Name = Metal Gear Solid 2 Substance
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
Serial = SLKA-35003
Name = Sakura Taisen - Atsuki Chishioni
Region = NTSC-K
+Compat = 5
+---------------------------------------------
+Serial = SLKA-35004
+Name = Sakura Wars 5 So Long My Love
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
+Serial = SLKA-35005
+Name = Shin Sangoku Musou 5 Special
+Region = NTSC-K
---------------------------------------------
Serial = SLPM-55005
Name = Mana Khemia 2: Ochita Gakuen to Renkinjutsushi Tachi
@@ -16510,6 +16969,19 @@ Name = Fantasy Zone Complete Collection
Region = NTSC-J
Compat = 5
---------------------------------------------
+Serial = SLPM-64504
+Name = Maximo
+Region = NTSC-K
+---------------------------------------------
+Serial = SLPM-64522
+Name = La Pucelle
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
+Serial = SLPM-64523
+Name = Marvel Vs Capcom 2
+Region = NTSC-K
+---------------------------------------------
Serial = SLPM-64525
Name = Guilty Gear X Plus "By Your Side"
Region = NTSC-K
@@ -23603,23 +24075,72 @@ Serial = SLPM-67015
Name = School Days LxH
Region = NTSC-J
---------------------------------------------
+Serial = SLPM-67502
+Name = Devil May Cry
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
+Serial = SLPM-67507
+Name = Onimusha Warlords
+Region = NTSC-K
+---------------------------------------------
+Serial = SLPM-67508
+Name = Gitaroo Man
+Region = NTSC-K
+Compat = 5
+eeRoundMode = 1
+vuRoundMode = 3
+---------------------------------------------
Serial = SLPM-67513
Name = Final Fantasy X International
Region = NTSC-K
IPUWaitHack = 1
---------------------------------------------
+Serial = SLPM-67514
+Name = Kessen
+Region = NTSC-K
+---------------------------------------------
+Serial = SLPM-67518
+Name = Onimusha 2 Samurai's Destiny
+Region = NTSC-K
+---------------------------------------------
+Serial = SLPM-67524
+Name = Armored Core 3
+Region = NTSC-K
+---------------------------------------------
Serial = SLPM-67528
Name = Hajime no Ippo - Victorious Boxers [Championship Edition]
Region = NTSC-K
---------------------------------------------
+Serial = SLPM-67529
+Name = Gun Survivor 3 Dino Crisis
+Region = NTSC-K
+---------------------------------------------
+Serial = SLPM-67531
+Name = Kessen 2
+Region = NTSC-K
+---------------------------------------------
Serial = SLPM-67535
Name = Memories Of
Region = NTSC-J-K
---------------------------------------------
+Serial = SLPM-67536
+Name = Senkaiden Hoshin Engi
+Region = NTSC-K
+---------------------------------------------
+Serial = SLPM-67540
+Name = Auto Modellista
+Region = NTSC-K
+Compat = 5
+---------------------------------------------
Serial = SLPM-67546
Name = Lord of the Rings - The Two Towers
Region = NTSC-K
---------------------------------------------
+Serial = SLPM-64549
+Name = Shikigami no Shiro
+Region = NTSC-K
+---------------------------------------------
Serial = SLPM-67552
Name = Tomak - Save the Earth Again [Complete Edition]
Region = NTSC-K
diff --git a/bin/Langs/cs_CZ/pcsx2_Iconized.mo b/bin/Langs/cs_CZ/pcsx2_Iconized.mo
index 7db2fc6f1..c13a7a98f 100644
Binary files a/bin/Langs/cs_CZ/pcsx2_Iconized.mo and b/bin/Langs/cs_CZ/pcsx2_Iconized.mo differ
diff --git a/bin/Langs/cs_CZ/pcsx2_Main.mo b/bin/Langs/cs_CZ/pcsx2_Main.mo
index 475afad40..814a7d52d 100644
Binary files a/bin/Langs/cs_CZ/pcsx2_Main.mo and b/bin/Langs/cs_CZ/pcsx2_Main.mo differ
diff --git a/bin/Langs/de_DE/pcsx2_Iconized.mo b/bin/Langs/de_DE/pcsx2_Iconized.mo
index 41a61b64b..f2a44c628 100644
Binary files a/bin/Langs/de_DE/pcsx2_Iconized.mo and b/bin/Langs/de_DE/pcsx2_Iconized.mo differ
diff --git a/bin/Langs/de_DE/pcsx2_Main.mo b/bin/Langs/de_DE/pcsx2_Main.mo
index fdf3d48b0..1d8548b26 100644
Binary files a/bin/Langs/de_DE/pcsx2_Main.mo and b/bin/Langs/de_DE/pcsx2_Main.mo differ
diff --git a/bin/Langs/es_ES/pcsx2_Iconized.mo b/bin/Langs/es_ES/pcsx2_Iconized.mo
index f731c10b8..3157aac2d 100644
Binary files a/bin/Langs/es_ES/pcsx2_Iconized.mo and b/bin/Langs/es_ES/pcsx2_Iconized.mo differ
diff --git a/bin/Langs/es_ES/pcsx2_Main.mo b/bin/Langs/es_ES/pcsx2_Main.mo
index a4e25775d..b8028dd33 100644
Binary files a/bin/Langs/es_ES/pcsx2_Main.mo and b/bin/Langs/es_ES/pcsx2_Main.mo differ
diff --git a/bin/Langs/fr_FR/pcsx2_Iconized.mo b/bin/Langs/fr_FR/pcsx2_Iconized.mo
new file mode 100644
index 000000000..49c71291d
Binary files /dev/null and b/bin/Langs/fr_FR/pcsx2_Iconized.mo differ
diff --git a/bin/Langs/fr_FR/pcsx2_Main.mo b/bin/Langs/fr_FR/pcsx2_Main.mo
new file mode 100644
index 000000000..21fe742d8
Binary files /dev/null and b/bin/Langs/fr_FR/pcsx2_Main.mo differ
diff --git a/bin/Langs/hu_HU/pcsx2_Iconized.mo b/bin/Langs/hu_HU/pcsx2_Iconized.mo
index dcfaf137c..ec6b9eb12 100644
Binary files a/bin/Langs/hu_HU/pcsx2_Iconized.mo and b/bin/Langs/hu_HU/pcsx2_Iconized.mo differ
diff --git a/bin/Langs/hu_HU/pcsx2_Main.mo b/bin/Langs/hu_HU/pcsx2_Main.mo
index 6cca21468..856e40ed4 100644
Binary files a/bin/Langs/hu_HU/pcsx2_Main.mo and b/bin/Langs/hu_HU/pcsx2_Main.mo differ
diff --git a/bin/Langs/id_ID/pcsx2_Iconized.mo b/bin/Langs/id_ID/pcsx2_Iconized.mo
new file mode 100644
index 000000000..84b6c7c37
Binary files /dev/null and b/bin/Langs/id_ID/pcsx2_Iconized.mo differ
diff --git a/bin/Langs/id_ID/pcsx2_Main.mo b/bin/Langs/id_ID/pcsx2_Main.mo
new file mode 100644
index 000000000..da3828c7e
Binary files /dev/null and b/bin/Langs/id_ID/pcsx2_Main.mo differ
diff --git a/bin/Langs/it_IT/pcsx2_Iconized.mo b/bin/Langs/it_IT/pcsx2_Iconized.mo
index f745945f3..32ba4ff62 100644
Binary files a/bin/Langs/it_IT/pcsx2_Iconized.mo and b/bin/Langs/it_IT/pcsx2_Iconized.mo differ
diff --git a/bin/Langs/it_IT/pcsx2_Main.mo b/bin/Langs/it_IT/pcsx2_Main.mo
index 639fb543c..5ba3801e2 100644
Binary files a/bin/Langs/it_IT/pcsx2_Main.mo and b/bin/Langs/it_IT/pcsx2_Main.mo differ
diff --git a/bin/Langs/ja_JP/pcsx2_Iconized.mo b/bin/Langs/ja_JP/pcsx2_Iconized.mo
index 8745d3b70..e6e74785e 100644
Binary files a/bin/Langs/ja_JP/pcsx2_Iconized.mo and b/bin/Langs/ja_JP/pcsx2_Iconized.mo differ
diff --git a/bin/Langs/ja_JP/pcsx2_Main.mo b/bin/Langs/ja_JP/pcsx2_Main.mo
index acada50ca..779557a93 100644
Binary files a/bin/Langs/ja_JP/pcsx2_Main.mo and b/bin/Langs/ja_JP/pcsx2_Main.mo differ
diff --git a/bin/Langs/pl_PL/pcsx2_Iconized.mo b/bin/Langs/pl_PL/pcsx2_Iconized.mo
index bad1d66ee..ae76d26c6 100644
Binary files a/bin/Langs/pl_PL/pcsx2_Iconized.mo and b/bin/Langs/pl_PL/pcsx2_Iconized.mo differ
diff --git a/bin/Langs/pl_PL/pcsx2_Main.mo b/bin/Langs/pl_PL/pcsx2_Main.mo
index 2cc793e51..2fe77aed9 100644
Binary files a/bin/Langs/pl_PL/pcsx2_Main.mo and b/bin/Langs/pl_PL/pcsx2_Main.mo differ
diff --git a/bin/Langs/pt_BR/pcsx2_Iconized.mo b/bin/Langs/pt_BR/pcsx2_Iconized.mo
index d01940b0b..6e2d964a6 100644
Binary files a/bin/Langs/pt_BR/pcsx2_Iconized.mo and b/bin/Langs/pt_BR/pcsx2_Iconized.mo differ
diff --git a/bin/Langs/pt_BR/pcsx2_Main.mo b/bin/Langs/pt_BR/pcsx2_Main.mo
index a36982368..10330af68 100644
Binary files a/bin/Langs/pt_BR/pcsx2_Main.mo and b/bin/Langs/pt_BR/pcsx2_Main.mo differ
diff --git a/bin/Langs/ru_RU/pcsx2_Iconized.mo b/bin/Langs/ru_RU/pcsx2_Iconized.mo
index 4d560e15e..a8f7165f3 100644
Binary files a/bin/Langs/ru_RU/pcsx2_Iconized.mo and b/bin/Langs/ru_RU/pcsx2_Iconized.mo differ
diff --git a/bin/Langs/ru_RU/pcsx2_Main.mo b/bin/Langs/ru_RU/pcsx2_Main.mo
index 949c856b8..4ff2a15f7 100644
Binary files a/bin/Langs/ru_RU/pcsx2_Main.mo and b/bin/Langs/ru_RU/pcsx2_Main.mo differ
diff --git a/bin/Langs/sv_SE/pcsx2_Iconized.mo b/bin/Langs/sv_SE/pcsx2_Iconized.mo
index 16dd84d2f..4b6eab052 100644
Binary files a/bin/Langs/sv_SE/pcsx2_Iconized.mo and b/bin/Langs/sv_SE/pcsx2_Iconized.mo differ
diff --git a/bin/Langs/sv_SE/pcsx2_Main.mo b/bin/Langs/sv_SE/pcsx2_Main.mo
index e2629ce03..a4f64e16c 100644
Binary files a/bin/Langs/sv_SE/pcsx2_Main.mo and b/bin/Langs/sv_SE/pcsx2_Main.mo differ
diff --git a/bin/Langs/tr_TR/pcsx2_Iconized.mo b/bin/Langs/tr_TR/pcsx2_Iconized.mo
index 12f4b5acb..cbb07870c 100644
Binary files a/bin/Langs/tr_TR/pcsx2_Iconized.mo and b/bin/Langs/tr_TR/pcsx2_Iconized.mo differ
diff --git a/bin/Langs/tr_TR/pcsx2_Main.mo b/bin/Langs/tr_TR/pcsx2_Main.mo
index 1d31f0c81..cf1e44131 100644
Binary files a/bin/Langs/tr_TR/pcsx2_Main.mo and b/bin/Langs/tr_TR/pcsx2_Main.mo differ
diff --git a/bin/Langs/zh_CN/pcsx2_Iconized.mo b/bin/Langs/zh_CN/pcsx2_Iconized.mo
index f0fd61b3a..665fc2632 100644
Binary files a/bin/Langs/zh_CN/pcsx2_Iconized.mo and b/bin/Langs/zh_CN/pcsx2_Iconized.mo differ
diff --git a/bin/Langs/zh_CN/pcsx2_Main.mo b/bin/Langs/zh_CN/pcsx2_Main.mo
index 5ea65f5a2..b5061363b 100644
Binary files a/bin/Langs/zh_CN/pcsx2_Main.mo and b/bin/Langs/zh_CN/pcsx2_Main.mo differ
diff --git a/bin/Langs/zh_TW/pcsx2_Iconized.mo b/bin/Langs/zh_TW/pcsx2_Iconized.mo
index 6511ed323..74bd81527 100644
Binary files a/bin/Langs/zh_TW/pcsx2_Iconized.mo and b/bin/Langs/zh_TW/pcsx2_Iconized.mo differ
diff --git a/bin/Langs/zh_TW/pcsx2_Main.mo b/bin/Langs/zh_TW/pcsx2_Main.mo
index 7b4147090..49af0ba0f 100644
Binary files a/bin/Langs/zh_TW/pcsx2_Main.mo and b/bin/Langs/zh_TW/pcsx2_Main.mo differ
diff --git a/bin/docs/pcsx2.man b/bin/docs/pcsx2.1
similarity index 74%
rename from bin/docs/pcsx2.man
rename to bin/docs/pcsx2.1
index 3e4c2bf3a..6cdc1102d 100644
--- a/bin/docs/pcsx2.man
+++ b/bin/docs/pcsx2.1
@@ -125,4 +125,21 @@ http://forums.pcsx2.net
.SH "COPYRIGHT NOTICE"
Copyright \(co 2002-2010 PCSX2 Dev Team
-Permission is granted to copy and distribute this manual under the terms of the GNU Free Documentation License.
+This is free documentation; 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 3 of
+the License, or (at your option) any later version.
+
+The GNU General Public License's references to "object code"
+and "executables" are to be interpreted as the output of any
+document formatting or typesetting system, including
+intermediate and printed output.
+
+This manual 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 manual; if not, see
+.
diff --git a/bin/launch_pcsx2_linux.sh b/bin/launch_pcsx2_linux.sh
index f46f3cc1b..afdd7a516 100755
--- a/bin/launch_pcsx2_linux.sh
+++ b/bin/launch_pcsx2_linux.sh
@@ -1,5 +1,19 @@
#!/bin/sh -e
+# PCSX2 - PS2 Emulator for PCs
+# Copyright (C) 2002-2011 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.
+#
+# PCSX2 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 PCSX2.
+# If not, see .
+
# This script is a small wrapper to the PCSX2 exectuable. The purpose is to
# launch PCSX2 from the same repository every times.
# Rationale: There is no guarantee on the directory when PCSX2 is launched from a shortcut.
diff --git a/build.sh b/build.sh
index 326aeccf8..0417898d6 100755
--- a/build.sh
+++ b/build.sh
@@ -1,5 +1,19 @@
#!/bin/sh
+# PCSX2 - PS2 Emulator for PCs
+# Copyright (C) 2002-2011 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.
+#
+# PCSX2 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 PCSX2.
+# If not, see .
+
flags=""
args="$@"
clean_build=false
@@ -54,7 +68,8 @@ if [ $clean_build = true ]; then
echo "Doing a clean build."
make clean 2>&1 | tee -a ../install_log.txt
fi
-make 2>&1 | tee -a ../install_log.txt
+CORE=`grep -w -c processor /proc/cpuinfo`
+make -j $CORE 2>&1 | tee -a ../install_log.txt
make install 2>&1 | tee -a ../install_log.txt
-cd ..
\ No newline at end of file
+cd ..
diff --git a/cmake/BuildParameters.cmake b/cmake/BuildParameters.cmake
index 48693b257..794891e58 100644
--- a/cmake/BuildParameters.cmake
+++ b/cmake/BuildParameters.cmake
@@ -8,6 +8,7 @@
# Use soundtouch internal lib: -DFORCE_INTERNAL_SOUNDTOUCH=TRUE
# Use zlib internal lib: -DFORCE_INTERNAL_ZLIB=TRUE
# Use sdl1.3 internal lib: -DFORCE_INTERNAL_SDL=TRUE # Not supported yet
+# Use GLSL API(else NVIDIA_CG): -DGLSL_API=TRUE
### GCC optimization options
# control C flags : -DUSER_CMAKE_C_FLAGS="cflags"
@@ -183,3 +184,10 @@ if(PACKAGE_MODE)
# Compile all source codes with these 2 defines
add_definitions(-DPLUGIN_DIR_COMPILATION=${PLUGIN_DIR} -DGAMEINDEX_DIR_COMPILATION=${GAMEINDEX_DIR})
endif(PACKAGE_MODE)
+
+#-------------------------------------------------------------------------------
+# Select nvidia cg shader api by default
+#-------------------------------------------------------------------------------
+if(NOT DEFINED GLSL_API)
+ set(GLSL_API FALSE)
+endif(NOT DEFINED GLSL_API)
diff --git a/cmake/FindSparseHash_NEW.cmake b/cmake/FindSparseHash_NEW.cmake
new file mode 100644
index 000000000..070999f7d
--- /dev/null
+++ b/cmake/FindSparseHash_NEW.cmake
@@ -0,0 +1,18 @@
+# Try to find SparseHash
+# Once done, this will define
+#
+# SPARSEHASE_NEW_FOUND - system has SparseHash
+# SPARSEHASE_NEW_INCLUDE_DIR - the SparseHash include directories
+
+if(SPARSEHASE_NEW_INCLUDE_DIR)
+ set(SPARSEHASE_NEW_FIND_QUIETLY TRUE)
+endif(SPARSEHASE_NEW_INCLUDE_DIR)
+
+find_path(SPARSEHASE_NEW_INCLUDE_DIR sparsehash/internal/densehashtable.h)
+
+# handle the QUIETLY and REQUIRED arguments and set SPARSEHASE_NEW_FOUND to TRUE if
+# all listed variables are TRUE
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(SparseHash_new DEFAULT_MSG SPARSEHASE_NEW_INCLUDE_DIR)
+
+mark_as_advanced(SPARSEHASE_NEW_INCLUDE_DIR)
diff --git a/cmake/SearchForStuff.cmake b/cmake/SearchForStuff.cmake
index 052729964..b63401f72 100644
--- a/cmake/SearchForStuff.cmake
+++ b/cmake/SearchForStuff.cmake
@@ -53,7 +53,10 @@ if(NOT FORCE_INTERNAL_ZLIB)
endif(NOT FORCE_INTERNAL_ZLIB)
## Use pcsx2 package to find module
-include(FindCg)
+## Include cg because of zzogl-cg
+#if(NOT GLSL_API)
+ include(FindCg)
+#endif(NOT GLSL_API)
include(FindGlew)
include(FindLibc)
include(FindPortAudio)
@@ -61,6 +64,7 @@ if(NOT FORCE_INTERNAL_SOUNDTOUCH)
include(FindSoundTouch)
endif(NOT FORCE_INTERNAL_SOUNDTOUCH)
include(FindSparseHash)
+include(FindSparseHash_NEW)
# Note for include_directory: The order is important to avoid a mess between include file from your system and the one of pcsx2
# If you include first 3rdparty, all 3rdpary include will have a higer priority...
@@ -166,6 +170,11 @@ endif(SOUNDTOUCH_FOUND AND NOT projectSoundTouch)
if(SPARSEHASH_FOUND)
include_directories(${SPARSEHASH_INCLUDE_DIR})
endif(SPARSEHASH_FOUND)
+if(SPARSEHASH_NEW_FOUND)
+ include_directories(${SPARSEHASH_NEW_INCLUDE_DIR})
+ # allow to build parts that depend on sparsehash
+ set(SPARSEHASH_FOUND TRUE)
+endif(SPARSEHASH_NEW_FOUND)
# Wx
if(wxWidgets_FOUND)
diff --git a/cmake/SelectPcsx2Plugins.cmake b/cmake/SelectPcsx2Plugins.cmake
index b5e35e0f3..f0b6e95ee 100644
--- a/cmake/SelectPcsx2Plugins.cmake
+++ b/cmake/SelectPcsx2Plugins.cmake
@@ -6,11 +6,15 @@ set(msg_dep_pcsx2 "check these libraries -> wxWidgets (>=2.8.10), gtk2 (>=
set(msg_dep_cdvdiso "check these libraries -> bzip2 (>=1.0.5), gtk2 (>=2.16)")
set(msg_dep_zerogs "check these libraries -> glew (>=1.5), opengl, X11, nvidia-cg-toolkit (>=2.1)")
set(msg_dep_gsdx "check these libraries -> opengl, X11, pcsx2 SDL")
-set(msg_dep_zzogl "check these libraries -> glew (>=1.5), jpeg (>=6.2), opengl, X11, nvidia-cg-toolkit (>=2.1), pcsx2 common libs")
set(msg_dep_onepad "check these libraries -> sdl (>=1.2)")
set(msg_dep_zeropad "check these libraries -> sdl (>=1.2)")
set(msg_dep_spu2x "check these libraries -> soundtouch (>=1.5), alsa, portaudio (>=1.9), pcsx2 common libs")
set(msg_dep_zerospu2 "check these libraries -> soundtouch (>=1.5), alsa")
+if(GLSP_API)
+ set(msg_dep_zzogl "check these libraries -> glew (>=1.5), jpeg (>=6.2), opengl, X11, pcsx2 common libs")
+else(GLSP_API)
+ set(msg_dep_zzogl "check these libraries -> glew (>=1.5), jpeg (>=6.2), opengl, X11, nvidia-cg-toolkit (>=2.1), pcsx2 common libs")
+endif(GLSP_API)
#-------------------------------------------------------------------------------
# Pcsx2 core & common libs
@@ -153,17 +157,17 @@ endif(GLEW_FOUND AND OPENGL_FOUND AND X11_FOUND AND CG_FOUND)
# requires: -GLEW
# -OpenGL
# -X11
-# -CG
+# -CG (only with cg build
# -JPEG
# -common_libs
#---------------------------------------
-if(GLEW_FOUND AND OPENGL_FOUND AND X11_FOUND AND CG_FOUND AND JPEG_FOUND AND common_libs)
+if((GLEW_FOUND AND OPENGL_FOUND AND X11_FOUND AND JPEG_FOUND AND common_libs) AND (CG_FOUND OR GLSL_API))
set(zzogl TRUE)
-else(GLEW_FOUND AND OPENGL_FOUND AND X11_FOUND AND CG_FOUND AND JPEG_FOUND AND common_libs)
+else((GLEW_FOUND AND OPENGL_FOUND AND X11_FOUND AND JPEG_FOUND AND common_libs) AND (CG_FOUND OR GLSL_API))
set(zzogl FALSE)
message(STATUS "Skip build of zzogl: miss some dependencies")
message(STATUS "${msg_dep_zzogl}")
-endif(GLEW_FOUND AND OPENGL_FOUND AND X11_FOUND AND CG_FOUND AND JPEG_FOUND AND common_libs)
+endif((GLEW_FOUND AND OPENGL_FOUND AND X11_FOUND AND JPEG_FOUND AND common_libs) AND (CG_FOUND OR GLSL_API))
#---------------------------------------
#---------------------------------------
@@ -188,20 +192,6 @@ else(SDL_FOUND)
endif(SDL_FOUND)
#---------------------------------------
-#---------------------------------------
-# zeropad
-#---------------------------------------
-# requires: -SDL
-#---------------------------------------
-if(SDL_FOUND)
- set(zeropad TRUE)
-else(SDL_FOUND)
- set(zeropad FALSE)
- message(STATUS "Skip build of zeropad: miss some dependencies")
- message(STATUS "${msg_dep_zeropad}")
-endif(SDL_FOUND)
-#---------------------------------------
-
#---------------------------------------
# SPU2null
#---------------------------------------
@@ -235,7 +225,10 @@ endif(ALSA_FOUND AND PORTAUDIO_FOUND AND SOUNDTOUCH_FOUND AND common_libs)
# -PortAudio
#---------------------------------------
if(SOUNDTOUCH_FOUND AND ALSA_FOUND)
- set(zerospu2 TRUE)
+ set(zerospu2 TRUE)
+ # Comment the next line, if you want to compile zerospu2
+ set(zerospu2 FALSE)
+ message(STATUS "Don't build zerospu2. It is super-seeded by spu2x")
else(SOUNDTOUCH_FOUND AND ALSA_FOUND)
set(zerospu2 FALSE)
message(STATUS "Skip build of zerospu2: miss some dependencies")
diff --git a/common/include/Utilities/HashMap.h b/common/include/Utilities/HashMap.h
index 91500026e..6d2a0ca32 100644
--- a/common/include/Utilities/HashMap.h
+++ b/common/include/Utilities/HashMap.h
@@ -15,10 +15,18 @@
#pragma once
+// They move include file in version 2.0.2 of google sparsehash...
+#ifdef SPARSEHASH_NEW_INCLUDE_DIR
+#include
+#include
+#include
+#include
+#else
#include
#include
#include
#include
+#endif
#include
@@ -594,8 +602,8 @@ public:
HashMap( const Key& emptyKey, const Key& deletedKey, int initialCapacity=33 ) :
google::dense_hash_map( initialCapacity )
{
- set_empty_key( emptyKey );
- set_deleted_key( deletedKey );
+ this->set_empty_key( emptyKey );
+ this->set_deleted_key( deletedKey );
}
///
@@ -608,7 +616,7 @@ public:
///
bool TryGetValue( const Key& key, T& outval ) const
{
- const_iterator iter( find(key) );
+ const_iterator iter( this->find(key) );
if( iter != end() )
{
outval = iter->second;
diff --git a/common/include/x86emitter/x86emitter.h b/common/include/x86emitter/x86emitter.h
index cf09e8acd..2de3d3a88 100644
--- a/common/include/x86emitter/x86emitter.h
+++ b/common/include/x86emitter/x86emitter.h
@@ -57,8 +57,10 @@
// insisting on "mov eax, immaddr; call eax". Likewise, GCC fails to optimize it also, unless
// the typecast is explicitly inlined. These macros account for these problems.
//
+// But it turns out that MSVC is quite capable of optimising important code out of existance
+// if we use these macros in our PGO builds, so it's better just to live with the inefficient call.
-#ifdef _MSC_VER
+#ifdef _MSC_HAS_FIXED_INLINE_ASM_PGO
# define CallAddress( ptr ) \
__asm{ call offset ptr }
diff --git a/common/src/Utilities/CMakeLists.txt b/common/src/Utilities/CMakeLists.txt
index b5d9040d3..68fb33fc5 100644
--- a/common/src/Utilities/CMakeLists.txt
+++ b/common/src/Utilities/CMakeLists.txt
@@ -20,6 +20,10 @@ set(CommonFlags
-pipe
-Wunused-variable)
+if (SPARSEHASH_NEW_FOUND)
+ set(CommonFlags "${CommonFlags} -DSPARSEHASH_NEW_INCLUDE_DIR ")
+endif (SPARSEHASH_NEW_FOUND)
+
# set warning flags
set(DebugFlags
-g
diff --git a/common/src/Utilities/Linux/LnxHostSys.cpp b/common/src/Utilities/Linux/LnxHostSys.cpp
index c2804862b..7f49e326a 100644
--- a/common/src/Utilities/Linux/LnxHostSys.cpp
+++ b/common/src/Utilities/Linux/LnxHostSys.cpp
@@ -22,6 +22,7 @@
#include
#include
#include
+#include
extern void SignalExit(int sig);
diff --git a/common/src/Utilities/Linux/LnxMisc.cpp b/common/src/Utilities/Linux/LnxMisc.cpp
index f2e11f442..4059bb14e 100644
--- a/common/src/Utilities/Linux/LnxMisc.cpp
+++ b/common/src/Utilities/Linux/LnxMisc.cpp
@@ -17,6 +17,7 @@
#include
#include
+#include
#include
#include
diff --git a/common/src/Utilities/Linux/LnxThreads.cpp b/common/src/Utilities/Linux/LnxThreads.cpp
index c5c990805..c3921caac 100644
--- a/common/src/Utilities/Linux/LnxThreads.cpp
+++ b/common/src/Utilities/Linux/LnxThreads.cpp
@@ -17,6 +17,7 @@
#include "../PrecompiledHeader.h"
#include "PersistentThread.h"
#include
+#include
// We wont need this until we actually have this more then just stubbed out, so I'm commenting this out
// to remove an unneeded dependency.
diff --git a/common/src/Utilities/Windows/WinHostSys.cpp b/common/src/Utilities/Windows/WinHostSys.cpp
index 965e6ae28..82b936e1f 100644
--- a/common/src/Utilities/Windows/WinHostSys.cpp
+++ b/common/src/Utilities/Windows/WinHostSys.cpp
@@ -19,8 +19,7 @@
#include
-
-int SysPageFaultExceptionFilter( EXCEPTION_POINTERS* eps )
+static int DoSysPageFaultExceptionFilter( EXCEPTION_POINTERS* eps )
{
if( eps->ExceptionRecord->ExceptionCode != EXCEPTION_ACCESS_VIOLATION )
return EXCEPTION_CONTINUE_SEARCH;
@@ -33,6 +32,21 @@ int SysPageFaultExceptionFilter( EXCEPTION_POINTERS* eps )
return Source_PageFault->WasHandled() ? EXCEPTION_CONTINUE_EXECUTION : EXCEPTION_CONTINUE_SEARCH;
}
+int SysPageFaultExceptionFilter( EXCEPTION_POINTERS* eps )
+{
+ // Prevent recursive exception filtering by catching the exception from the filter here.
+ // In the event that the filter causes an access violation (happened during shutdown
+ // because Source_PageFault was deallocated), this will allow the debugger to catch the
+ // exception.
+ // TODO: find a reliable way to debug the filter itself, I've come up with a few ways that
+ // work but I don't fully understand why some do and some don't.
+ __try {
+ return DoSysPageFaultExceptionFilter(eps);
+ } __except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
+ return EXCEPTION_CONTINUE_SEARCH;
+ }
+}
+
void _platform_InstallSignalHandler()
{
// NOP on Win32 systems -- we use __try{} __except{} instead.
diff --git a/debian-unstable-upstream/control b/debian-unstable-upstream/control
index 7f5afa787..b33dfba21 100644
--- a/debian-unstable-upstream/control
+++ b/debian-unstable-upstream/control
@@ -6,18 +6,12 @@ Maintainer: Gregory Hainaut
Build-Depends: cmake (>= 2.8),
debhelper (>= 7.0.50),
dpkg-dev (>= 1.15.7),
- gcc-multilib [amd64],
- g++-multilib [amd64],
- ia32-libs-dev [amd64],
- lib32asound2-dev [amd64],
- lib32bz2-dev [amd64],
- lib32z1-dev (>= 1:1.2.3.3) [amd64],
libasound2-dev,
libbz2-dev,
libgl1-mesa-dev,
# Future GSdx version will need glew1.6. Only Oneiric have it...
# libglew1.6-dev,
- libglew1.5-dev,
+ libglew-dev (>= 1.6)| libglew1.5-dev,
libglu1-mesa-dev,
libgtk2.0-dev (>= 2.16),
libjpeg-dev,
@@ -28,7 +22,8 @@ Build-Depends: cmake (>= 2.8),
libwxgtk2.8-dev,
libx11-dev,
locales | locales-all,
- nvidia-cg-toolkit (>= 3),
+# package was split in precise to allow multiarch support
+ libcg, nvidia-cg-toolkit (>= 3),
portaudio19-dev,
zlib1g-dev (>= 1:1.2.3.3)
Standards-Version: 3.9.2
@@ -54,7 +49,7 @@ Package: pcsx2-plugins-unstable
Architecture: i386
# manually add nvidia-cg-toolkit for zzogl (cg pacakge does not provide symbol or shlibs files)
Depends: ${shlibs:Depends}, ${misc:Depends},
- nvidia-cg-toolkit-pcsx2 | nvidia-cg-toolkit (>= 2.1)
+ libcg | nvidia-cg-toolkit (>= 2.1)
Recommends: pcsx2-unstable (>= ${binary:Version}),
Conflicts: pcsx2-plugins,
pcsx2-data-unstable
diff --git a/linux_various/detect_missing_file_in_cmake.sh b/linux_various/detect_missing_file_in_cmake.sh
index c4807b386..a46141b24 100755
--- a/linux_various/detect_missing_file_in_cmake.sh
+++ b/linux_various/detect_missing_file_in_cmake.sh
@@ -1,5 +1,19 @@
#!/bin/sh
+# PCSX2 - PS2 Emulator for PCs
+# Copyright (C) 2002-2011 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.
+#
+# PCSX2 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 PCSX2.
+# If not, see .
+
# Script default parameter
MAX_DEPTH=1
DIR=$PWD
diff --git a/linux_various/hex2h.pl b/linux_various/hex2h.pl
new file mode 100755
index 000000000..1370d4524
--- /dev/null
+++ b/linux_various/hex2h.pl
@@ -0,0 +1,97 @@
+#!/usr/bin/perl
+
+# PCSX2 - PS2 Emulator for PCs
+# Copyright (C) 2002-2011 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.
+#
+# PCSX2 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 PCSX2.
+# If not, see .
+
+# This basic script convert an jpeg/png image to a .h include file
+# compatible with PCSX2 gui
+
+use File::Basename;
+use strict;
+use warnings;
+
+sub ascii_to_hex ($)
+{
+ (my $str = shift) =~ s/(.|\n)/sprintf("%02lx", ord $1)/eg;
+ return $str;
+}
+
+sub get_wx_ext ($)
+{
+ my $ext = shift;
+
+ my $result = "BAD_FORMAT";
+ if ($ext =~ /png/i) {
+ $result = "wxBITMAP_TYPE_PNG";
+ } elsif ($ext =~ /jpe?g/i) {
+ $result = "wxBITMAP_TYPE_JPEG";
+ } else {
+ print "ERROR: bad format $ext\n";
+ }
+
+ return $result;
+}
+
+my $input=$ARGV[0];
+my $output=$ARGV[1] . ".h" ;
+
+my($filename, $directories, $suffix) = fileparse($input);
+my ($name, $ext) = split(/\./,$filename);
+
+my $wx_img_class = "res_$name";
+my $wx_img_extension = get_wx_ext($ext);
+my $filesize = -s $input;
+
+### Collect binary data
+my $lenght = 1;
+my $binary = "\t\t";
+my $data;
+my $byte;
+
+open(IN,"$input");
+binmode IN;
+while (($byte = read IN, $data, 1) != 0) {
+ my $hex = ascii_to_hex($data);
+ $binary .= "0x$hex";
+ if ($lenght % 17 == 0 && $lenght > 1) {
+ # End of line
+ $binary .= ",\n\t\t";
+ } elsif ($filesize == $lenght) {
+ # End of file
+ $binary .= "\n";
+ } else {
+ $binary .= ",";
+ }
+ $lenght++;
+}
+close(IN);
+
+open(OUT,">$output");
+### Print the header
+print OUT "#pragma once\n\n";
+print OUT "#include \"Pcsx2Types.h\"\n";
+print OUT "#include \n\n";
+print OUT "class $wx_img_class\n{\n";
+print OUT "public:\n";
+print OUT "\tstatic const uint Length = $filesize;\n";
+print OUT "\tstatic const u8 Data[Length];\n";
+print OUT "\tstatic wxBitmapType GetFormat() { return $wx_img_extension; }\n};\n\n";
+print OUT "const u8 ${wx_img_class}::Data[Length] =\n{\n";
+
+### Print the array
+print OUT $binary;
+print OUT "};\n";
+
+close(OUT);
+
diff --git a/locales/cs_CZ/pcsx2_Iconized.po b/locales/cs_CZ/pcsx2_Iconized.po
index 6f291f397..736a9b26b 100644
--- a/locales/cs_CZ/pcsx2_Iconized.po
+++ b/locales/cs_CZ/pcsx2_Iconized.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.9\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-09-28 20:27+0200\n"
+"POT-Creation-Date: 2012-04-07 11:42+0200\n"
"PO-Revision-Date: 2011-10-03 09:15+0100\n"
"Last-Translator: Zbyněk Schwarz \n"
"Language-Team: Zbyněk Schwarz\n"
@@ -23,35 +23,58 @@ msgstr ""
#: common/src/Utilities/Exceptions.cpp:254
msgid "!Notice:VirtualMemoryMap"
-msgstr "Není dostatek virtuální paměti, nebo potřebná mapování virtuální paměti již byly vyhrazeny jinými procesy, službami, nebo DLL."
+msgstr ""
+"Není dostatek virtuální paměti, nebo potřebná mapování virtuální paměti již "
+"byly vyhrazeny jinými procesy, službami, nebo DLL."
-#: pcsx2/CDVD/CDVD.cpp:385
+#: pcsx2/CDVD/CDVD.cpp:389
msgid "!Notice:PsxDisc"
-msgstr "Herní disky Playstation nejsou PCSX2 podporovány. Pokud chcete emulovat hry PSX, pak si budete muset stáhnout PSX emulátor, jako ePSXe nebo PCSX."
+msgstr ""
+"Herní disky Playstation nejsou PCSX2 podporovány. Pokud chcete emulovat hry "
+"PSX, pak si budete muset stáhnout PSX emulátor, jako ePSXe nebo PCSX."
#: pcsx2/System.cpp:114
msgid "!Notice:Recompiler:VirtualMemoryAlloc"
-msgstr "Tento rekompilátor nemohl vyhradit přilehlou paměť potřebnou pro vnitřní vyrovnávací paměti. Tato chyba může být způsobena nízkými zdroji virtuální paměti, jako např. vypnutý nebo malý stránkovací soubor, nebo jiným programem náročným na paměť. Můžete také zkusit snížit výchozí velikost vyrovnávací paměti pro všechny rekompilátory PCSX2, naleznete v Nastavení Hostitele."
+msgstr ""
+"Tento rekompilátor nemohl vyhradit přilehlou paměť potřebnou pro vnitřní "
+"vyrovnávací paměti. Tato chyba může být způsobena nízkými zdroji virtuální "
+"paměti, jako např. vypnutý nebo malý stránkovací soubor, nebo jiným "
+"programem náročným na paměť. Můžete také zkusit snížit výchozí velikost "
+"vyrovnávací paměti pro všechny rekompilátory PCSX2, naleznete v Nastavení "
+"Hostitele."
#: pcsx2/System.cpp:348
msgid "!Notice:EmuCore::MemoryForVM"
-msgstr "PCSX2 nemůže přidělit paměť potřebnou pro virtuální stroj PS2. Zavřete některé úlohy na pozadí náročné na paměť a zkuste to znovu."
+msgstr ""
+"PCSX2 nemůže přidělit paměť potřebnou pro virtuální stroj PS2. Zavřete "
+"některé úlohy na pozadí náročné na paměť a zkuste to znovu."
#: pcsx2/gui/AppInit.cpp:43
msgid "!Notice:Startup:NoSSE2"
-msgstr "Varování: Váš počítač nepodporuje SSE2, která je vyžadována většinou rekompilátorů PCSX2 a zásuvných modulů. Vaše volby budou omezené a emulace bude *velmi* pomalá."
+msgstr ""
+"Varování: Váš počítač nepodporuje SSE2, která je vyžadována většinou "
+"rekompilátorů PCSX2 a zásuvných modulů. Vaše volby budou omezené a emulace "
+"bude *velmi* pomalá."
#: pcsx2/gui/AppInit.cpp:162
msgid "!Notice:RecompilerInit:Header"
-msgstr "Varování: Některé z nastavených rekompilátorů PS2 nelze spustit a byly zakázány:"
+msgstr ""
+"Varování: Některé z nastavených rekompilátorů PS2 nelze spustit a byly "
+"zakázány:"
#: pcsx2/gui/AppInit.cpp:211
msgid "!Notice:RecompilerInit:Footer"
-msgstr "Poznámka: Rekompilátory nejsou potřeba ke spuštění PCSX2, nicméně normálně výrazně zlepšují rychlost emulace. Možná budete muset ruřne rekompilátory znovu zapnout, pokud vyřešíte chyby."
+msgstr ""
+"Poznámka: Rekompilátory nejsou potřeba ke spuštění PCSX2, nicméně normálně "
+"výrazně zlepšují rychlost emulace. Možná budete muset ruřne rekompilátory "
+"znovu zapnout, pokud vyřešíte chyby."
#: pcsx2/gui/AppMain.cpp:546
msgid "!Notice:BiosDumpRequired"
-msgstr "PCSX2 vyžaduje ke spuštění BIOS PS2. Z právních důvodů *musíte* BIOS získat ze skutečného PS2, které vlastníte (půjčení se nepočítá). Podívejte se prosím na Nejčastější Otázky a Průvodce pro další instrukce."
+msgstr ""
+"PCSX2 vyžaduje ke spuštění BIOS PS2. Z právních důvodů *musíte* BIOS získat "
+"ze skutečného PS2, které vlastníte (půjčení se nepočítá). Podívejte se "
+"prosím na Nejčastější Otázky a Průvodce pro další instrukce."
#: pcsx2/gui/AppMain.cpp:629
msgid "!Notice Error:Thread Deadlock Actions"
@@ -61,23 +84,40 @@ msgstr ""
#: pcsx2/gui/AppUserMode.cpp:57
msgid "!Notice:PortableModeRights"
-msgstr "Ujistěte se prosím, že tyto adresáře jsou vytvořeny a že Váš uživatelský účet má udělená oprávnění k zápisu do těchto adresářů -- nebo znovu spusťte PCSX2 jako správce (administrátorské oprávnění), což by mělo udělit PCSX2 schopnost samo si potřebné adresáře vytvořit. Pokud nemáte na tomto počítači správcovská oprávnění, pak budete muset přepnout do režimu Uživatelských Dokumentů (klikněte na tlačítko níže)."
+msgstr ""
+"Ujistěte se prosím, že tyto adresáře jsou vytvořeny a že Váš uživatelský "
+"účet má udělená oprávnění k zápisu do těchto adresářů -- nebo znovu spusťte "
+"PCSX2 jako správce (administrátorské oprávnění), což by mělo udělit PCSX2 "
+"schopnost samo si potřebné adresáře vytvořit. Pokud nemáte na tomto počítači "
+"správcovská oprávnění, pak budete muset přepnout do režimu Uživatelských "
+"Dokumentů (klikněte na tlačítko níže)."
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:181
msgid "!ContextTip:ChangingNTFS"
-msgstr "Komprese NTFS může být kdykoliv ručně změněna použitím vlastností souboru z Průzkumníku Windows."
+msgstr ""
+"Komprese NTFS může být kdykoliv ručně změněna použitím vlastností souboru z "
+"Průzkumníku Windows."
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:49
msgid "!ContextTip:Folders:Settings"
-msgstr "Do tohoto adresáře PCSX2 ukládá Vaše nastavení, zahrnující i nastavení vytvořená většinou zásuvných modulů (některé starší moduly nemusí tuto hodnotu respektovat)."
+msgstr ""
+"Do tohoto adresáře PCSX2 ukládá Vaše nastavení, zahrnující i nastavení "
+"vytvořená většinou zásuvných modulů (některé starší moduly nemusí tuto "
+"hodnotu respektovat)."
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:54
msgid "!Panel:Folders:Settings"
-msgstr "Můžete také zde dobrovolně zadat umístění Vašeho nastavení PCSX2. Pokud umístění obsahuje existující nastavení PCSX2, bude Vám dána možnost je importovat nebo přepsat."
+msgstr ""
+"Můžete také zde dobrovolně zadat umístění Vašeho nastavení PCSX2. Pokud "
+"umístění obsahuje existující nastavení PCSX2, bude Vám dána možnost je "
+"importovat nebo přepsat."
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:94
msgid "!Wizard:Welcome"
-msgstr "Tento průvodce Vám pomůže skrz nastavení zásuvných modulů, paměťových karet a BIOSu. Je doporučeno, pokud je toto poprvé co instalujete %s, si prohlédnout 'Přečti mě' a průvodce nastavením."
+msgstr ""
+"Tento průvodce Vám pomůže skrz nastavení zásuvných modulů, paměťových karet "
+"a BIOSu. Je doporučeno, pokud je toto poprvé co instalujete %s, si "
+"prohlédnout 'Přečti mě' a průvodce nastavením."
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:140
msgid "!Wizard:Bios:Tutorial"
@@ -89,34 +129,50 @@ msgstr ""
#: pcsx2/gui/Dialogs/ImportSettingsDialog.cpp:31
msgid "!Notice:ImportExistingSettings"
msgstr ""
-"Existující nastavení %s byly nalezeny v určeném adresáři nastavení. Chtěli byste tyto nastavení importovat nebo je přepsat výchozími hodnotami %s?\n"
+"Existující nastavení %s byly nalezeny v určeném adresáři nastavení. Chtěli "
+"byste tyto nastavení importovat nebo je přepsat výchozími hodnotami %s?\n"
"\n"
"(nebo stiskněte Zrušit pro vybrání jiného adresáře nastavení)"
#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:30
msgid "!Panel:Mcd:NtfsCompress"
-msgstr "Komprimace NTFS je zabudovaná, rychlá a naprosto spolehlivá a většinou komprimuje paměťové karty velmi dobře (tato volba je vysoce doporučená)."
+msgstr ""
+"Komprimace NTFS je zabudovaná, rychlá a naprosto spolehlivá a většinou "
+"komprimuje paměťové karty velmi dobře (tato volba je vysoce doporučená)."
#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:41
msgid "!Panel:Mcd:EnableEjection"
-msgstr "Zabraňuje poškození paměťové karty tím, že donutí hry reindexovat obsah karty po načtení uloženého stavu. Nemusí být kompatibilní se všemi hrami (Guitar Hero)."
+msgstr ""
+"Zabraňuje poškození paměťové karty tím, že donutí hry reindexovat obsah "
+"karty po načtení uloženého stavu. Nemusí být kompatibilní se všemi hrami "
+"(Guitar Hero)."
#: pcsx2/gui/Dialogs/StuckThreadDialog.cpp:33
msgid "!Panel:StuckThread:Heading"
-msgstr "Vlákno '%s' neodpovídá. Mohlo uváznout, nebo prostě běží *velmi* pomalu."
+msgstr ""
+"Vlákno '%s' neodpovídá. Mohlo uváznout, nebo prostě běží *velmi* pomalu."
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:38
msgid "!Panel:HasHacksOverrides"
-msgstr "Varování! Spouštíte PCSX2 s volbami příkazového řádku, které potlačují Vaše uložená nastavení. Tyto volby příkazového řádku se nebudou odrážet v dialogovém okně Nastavení a budou zrušeny, pokud zde použijete jakékoli změny."
+msgstr ""
+"Varování! Spouštíte PCSX2 s volbami příkazového řádku, které potlačují Vaše "
+"uložená nastavení. Tyto volby příkazového řádku se nebudou odrážet v "
+"dialogovém okně Nastavení a budou zrušeny, pokud zde použijete jakékoli "
+"změny."
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:58
msgid "!Panel:HasPluginsOverrides"
-msgstr "Varování! Spouštíte PCSX2 s volbami příkazového řádku, které potlačují Vaše uložená nastavení zásuvných modulů a/nebo adresářů. Tyto volby příkazového řádku se nebudou odrážet v dialogovém okně Nastavení a budou zrušeny, když zde použijete jakékoli změny nastavení."
+msgstr ""
+"Varování! Spouštíte PCSX2 s volbami příkazového řádku, které potlačují Vaše "
+"uložená nastavení zásuvných modulů a/nebo adresářů. Tyto volby příkazového "
+"řádku se nebudou odrážet v dialogovém okně Nastavení a budou zrušeny, když "
+"zde použijete jakékoli změny nastavení."
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:135
msgid "!Notice:Tooltip:Presets:Slider"
msgstr ""
-"Předvolby použijí hacky rychlosti, některá nastavení rekompilátoru a některé opravy her známé tím, že zvyšují rychlost.\n"
+"Předvolby použijí hacky rychlosti, některá nastavení rekompilátoru a některé "
+"opravy her známé tím, že zvyšují rychlost.\n"
"Známé důležité opravy budou použity automaticky.\n"
"\n"
"Informace o předvolbách:\n"
@@ -128,21 +184,28 @@ msgstr ""
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:149
msgid "!Notice:Tooltip:Presets:Checkbox"
msgstr ""
-"Předvolby použijí hacky rychlosti, některá nastavení rekompilátoru a některé opravy her známé tím, že zvyšují rychlost.\n"
+"Předvolby použijí hacky rychlosti, některá nastavení rekompilátoru a některé "
+"opravy her známé tím, že zvyšují rychlost.\n"
"Známé důležité opravy budou použity automaticky.\n"
"\n"
-" --> Odškrtněte pro ruční změnu nastavení (se současnými předvolbami jako základ)"
+" --> Odškrtněte pro ruční změnu nastavení (se současnými předvolbami jako "
+"základ)"
#: pcsx2/gui/IsoDropTarget.cpp:28
msgid "!Notice:ConfirmSysReset"
-msgstr "Tato činnost resetuje existující stav virtuálního stroje PS2; veškerý současný postup bude ztracen. Jste si jisti?"
+msgstr ""
+"Tato činnost resetuje existující stav virtuálního stroje PS2; veškerý "
+"současný postup bude ztracen. Jste si jisti?"
#: pcsx2/gui/MainMenuClicks.cpp:106
msgid "!Notice:DeleteSettings"
msgstr ""
-"Tento příkaz vyčistí nastavení %s a umožňuje Vám znovu spustit Průvodce Prvním Spuštěním. Po této operaci budete muset ručně restartovat %s.\n"
+"Tento příkaz vyčistí nastavení %s a umožňuje Vám znovu spustit Průvodce "
+"Prvním Spuštěním. Po této operaci budete muset ručně restartovat %s.\n"
"\n"
-"VAROVÁNÍ!! Kliknutím na OK smažete *VŠECHNA* nastavení pro %s a přinutíte tuto aplikaci uzavřít, čímž ztratíte jakýkoli postup emulace. Jste si naprosto jisti?\n"
+"VAROVÁNÍ!! Kliknutím na OK smažete *VŠECHNA* nastavení pro %s a přinutíte "
+"tuto aplikaci uzavřít, čímž ztratíte jakýkoli postup emulace. Jste si "
+"naprosto jisti?\n"
"\n"
"(poznámka: nastavení zásuvných modulů nejsou ovlivněna)"
@@ -154,7 +217,9 @@ msgstr ""
#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:138
msgid "!Notice:BIOS:InvalidSelection"
-msgstr "Prosím zvolte platný BIOS. Pokud nejste schopni provést platnou volbu, pak stiskněte Zrušit pro zavření Konfiguračního panelu."
+msgstr ""
+"Prosím zvolte platný BIOS. Pokud nejste schopni provést platnou volbu, pak "
+"stiskněte Zrušit pro zavření Konfiguračního panelu."
#: pcsx2/gui/Panels/CpuPanel.cpp:111
msgid "!Panel:EE/IOP:Heading"
@@ -170,37 +235,59 @@ msgstr "Zadaná cesta/adresář neexistuje. Chtěli byste je vytvořit?"
#: pcsx2/gui/Panels/DirPickerPanel.cpp:158
msgid "!ContextTip:DirPicker:UseDefault"
-msgstr "Je-li zaškrtnuto, tento adresář bude automaticky odrážet výchozí asociaci se současným nastavením uživatelského režimu PCSX2."
+msgstr ""
+"Je-li zaškrtnuto, tento adresář bude automaticky odrážet výchozí asociaci se "
+"současným nastavením uživatelského režimu PCSX2."
#: pcsx2/gui/Panels/GSWindowPanel.cpp:55
msgid "!ContextTip:Window:Zoom"
msgstr ""
"Přiblížení = 100: Celý obraz bude umístěn do okna bez jakéhokoliv oříznutí.\n"
"Nad/Pod 100: Přiblížení/Oddálení\n"
-"0: Automaticky přibližovat, dokud černé čáry nezmizí (poměr stran je zachován, část obrazu bude mimo obrazovku).\n"
-"POZNÁMKA: Některé hry vykreslují vlastní černé čáry, které pomocí '0' nebudou odstraněny.\n"
+"0: Automaticky přibližovat, dokud černé čáry nezmizí (poměr stran je "
+"zachován, část obrazu bude mimo obrazovku).\n"
+"POZNÁMKA: Některé hry vykreslují vlastní černé čáry, které pomocí '0' "
+"nebudou odstraněny.\n"
"\n"
-"Klávesnice: CTRL + PLUS: Přiblížení, CTRL + MÍNUS: Oddálení, CTRL + HVĚZDIČKA: Přepínání 100/0."
+"Klávesnice: CTRL + PLUS: Přiblížení, CTRL + MÍNUS: Oddálení, CTRL + "
+"HVĚZDIČKA: Přepínání 100/0."
#: pcsx2/gui/Panels/GSWindowPanel.cpp:63
msgid "!ContextTip:Window:Vsync"
-msgstr "Vsynch odstraňuje trhání obrazovky, ale má velký vliv na výkon. Většinou se toto týká režimu celé obrazovky a nemusí fungovat se všemi zásuvnými moduly GS."
+msgstr ""
+"Vsynch odstraňuje trhání obrazovky, ale má velký vliv na výkon. Většinou se "
+"toto týká režimu celé obrazovky a nemusí fungovat se všemi zásuvnými moduly "
+"GS."
#: pcsx2/gui/Panels/GSWindowPanel.cpp:68
msgid "!ContextTip:Window:ManagedVsync"
-msgstr "Povolí Vsynch když snímkovací frekvence je přesně na plné rychlosti. Pokud spadne pod tuto hodnotu, Vsynch je zakázána k zabránění dalších penalizací výkonu. Poznámka: Toto nyní správně funguje pouze s GSdx jako zásuvný modul GS a nastaveným na použití hardwarového vykreslování DX10/11. Jakýkoli jiný modul nebo režim vykreslování toto bude ignorovat, nebo vytvoří černý snímek, který blikne, kdykoliv je režim přepnut. Také vyžaduje povolenou Vsynch."
+msgstr ""
+"Povolí Vsynch když snímkovací frekvence je přesně na plné rychlosti. Pokud "
+"spadne pod tuto hodnotu, Vsynch je zakázána k zabránění dalších penalizací "
+"výkonu. Poznámka: Toto nyní správně funguje pouze s GSdx jako zásuvný modul "
+"GS a nastaveným na použití hardwarového vykreslování DX10/11. Jakýkoli jiný "
+"modul nebo režim vykreslování toto bude ignorovat, nebo vytvoří černý "
+"snímek, který blikne, kdykoliv je režim přepnut. Také vyžaduje povolenou "
+"Vsynch."
#: pcsx2/gui/Panels/GSWindowPanel.cpp:76
msgid "!ContextTip:Window:HideMouse"
-msgstr "Zašrktněte toto pro vynucení zneviditelnění kurzoru myši uvnitř okna GS; užitečné, jestli myš používáte jako hlavní kontrolní zařízení pro hraní. Standardně je myš schována po 2 vteřinách nečinnosti."
+msgstr ""
+"Zašrktněte toto pro vynucení zneviditelnění kurzoru myši uvnitř okna GS; "
+"užitečné, jestli myš používáte jako hlavní kontrolní zařízení pro hraní. "
+"Standardně je myš schována po 2 vteřinách nečinnosti."
#: pcsx2/gui/Panels/GSWindowPanel.cpp:82
msgid "!ContextTip:Window:Fullscreen"
-msgstr "Povolí automatické přepnutí režimu na celou obrazovku, při spuštění nebo obnově emulace. Stále můžete přepnout na celou obrazovku pomocí alt-enter."
+msgstr ""
+"Povolí automatické přepnutí režimu na celou obrazovku, při spuštění nebo "
+"obnově emulace. Stále můžete přepnout na celou obrazovku pomocí alt-enter."
#: pcsx2/gui/Panels/GSWindowPanel.cpp:93
msgid "!ContextTip:Window:HideGS"
-msgstr "Úplně zavře často velké a rozměrné okno GS při stisku ESC nebo pozastavení emulátoru."
+msgstr ""
+"Úplně zavře často velké a rozměrné okno GS při stisku ESC nebo pozastavení "
+"emulátoru."
#: pcsx2/gui/Panels/GameFixesPanel.cpp:67
msgid "!ContextTip:Gamefixes:EE Timing Hack"
@@ -235,16 +322,21 @@ msgstr ""
msgid "!Panel:Gamefixes:Compat Warning"
msgstr ""
"Opravy her můžou obejít špatnou emulaci v některých hrách.\n"
-"Můžou ale také způsobit problémy s kompatibilitou a výkonem, takže nejsou doporučeny.\n"
+"Můžou ale také způsobit problémy s kompatibilitou a výkonem, takže nejsou "
+"doporučeny.\n"
"Opravy her jsou použity automaticky, takže zde nic nemusíte nastavovat."
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:720
msgid "!Notice:Mcd:Delete"
-msgstr "Chystáte se smazat formátovanou paměťovou kartu '%s'. Všechna data na kartě budou ztracena! Jste si naprosto a zcela jisti?"
+msgstr ""
+"Chystáte se smazat formátovanou paměťovou kartu '%s'. Všechna data na kartě "
+"budou ztracena! Jste si naprosto a zcela jisti?"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:758
msgid "!Notice:Mcd:CantDuplicate"
-msgstr "Selhání: Kopírování je povoleno pouze na prázdnou pozici PS2 nebo do systému souborů."
+msgstr ""
+"Selhání: Kopírování je povoleno pouze na prázdnou pozici PS2 nebo do systému "
+"souborů."
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:801
msgid "!Notice:Mcd:Copy Failed"
@@ -252,23 +344,38 @@ msgstr "Selhání: Cílová paměťová karta '%s' se používá."
#: pcsx2/gui/Panels/MiscPanelStuff.cpp:35
msgid "!Panel:Usermode:Explained"
-msgstr "Prosím vyberte níže Vaši upřednostňované výchozí umístění pro dokumenty uživatelské úrovně PCSX2 (zahrnující paměťové karty, snímky obrazovky, nastavení a uložené stavy). Tyto umístění adresářů mohou být kdykoli potlačena použitím panelu Hlavního Nastavení."
+msgstr ""
+"Prosím vyberte níže Vaši upřednostňované výchozí umístění pro dokumenty "
+"uživatelské úrovně PCSX2 (zahrnující paměťové karty, snímky obrazovky, "
+"nastavení a uložené stavy). Tyto umístění adresářů mohou být kdykoli "
+"potlačena použitím panelu Hlavního Nastavení."
#: pcsx2/gui/Panels/MiscPanelStuff.cpp:41
msgid "!Panel:Usermode:Warning"
-msgstr "Prosím vyberte níže Vaši upřednostňované výchozí umístění pro dokumenty uživatelské úrovně PCSX2 (zahrnující paměťové karty, snímky obrazovky, nastavení a uložené stavy). Tato volba ovlivňuje pouze Standardní Cesty, které jsou nastaveny, aby používali výchozí hodnoty instalace."
+msgstr ""
+"Prosím vyberte níže Vaši upřednostňované výchozí umístění pro dokumenty "
+"uživatelské úrovně PCSX2 (zahrnující paměťové karty, snímky obrazovky, "
+"nastavení a uložené stavy). Tato volba ovlivňuje pouze Standardní Cesty, "
+"které jsou nastaveny, aby používali výchozí hodnoty instalace."
#: pcsx2/gui/Panels/PathsPanel.cpp:40
msgid "!ContextTip:Folders:Savestates"
-msgstr "Do tohoto adresáře PCSX2 ukládá uložené stavy, které jsou zaznamenány buď použitím menu/panelů nástrojů, nebo stisknutím F1/F3 (uložit/nahrát)."
+msgstr ""
+"Do tohoto adresáře PCSX2 ukládá uložené stavy, které jsou zaznamenány buď "
+"použitím menu/panelů nástrojů, nebo stisknutím F1/F3 (uložit/nahrát)."
#: pcsx2/gui/Panels/PathsPanel.cpp:50
msgid "!ContextTip:Folders:Snapshots"
-msgstr "Toto je adresář, kde PCSX2 ukládá snímky obrazovky. Vlastní formát a styl snímku se může měnit v závislosti na používaném zásuvném modulu GS."
+msgstr ""
+"Toto je adresář, kde PCSX2 ukládá snímky obrazovky. Vlastní formát a styl "
+"snímku se může měnit v závislosti na používaném zásuvném modulu GS."
#: pcsx2/gui/Panels/PathsPanel.cpp:60
msgid "!ContextTip:Folders:Logs"
-msgstr "Toto je adresář, kde PCSX2 ukládá své soubory se záznamem a diagnostické výpisy. Většina zásuvných modulů bude také používat tento adresář, ale některé starší ho můžou ignorovat."
+msgstr ""
+"Toto je adresář, kde PCSX2 ukládá své soubory se záznamem a diagnostické "
+"výpisy. Většina zásuvných modulů bude také používat tento adresář, ale "
+"některé starší ho můžou ignorovat."
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:242
msgid "!Notice:PluginSelector:ConfirmShutdown"
@@ -276,19 +383,28 @@ msgstr "Varování! Změna zásuvných modulů vyžaduje"
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:457
msgid "!Notice:PluginSelector:ApplyFailed"
-msgstr "Všechny zásuvné moduly musí mít platný výběr pro %s ke spuštění. Pokud nemůžete provést výběr kvůli chybějícímu modulu nebo nedokončené instalaci %s, pak stiskněte Zrušit pro uzavření panelu Nastavení."
+msgstr ""
+"Všechny zásuvné moduly musí mít platný výběr pro %s ke spuštění. Pokud "
+"nemůžete provést výběr kvůli chybějícímu modulu nebo nedokončené instalaci "
+"%s, pak stiskněte Zrušit pro uzavření panelu Nastavení."
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:27
msgid "!Panel:Speedhacks:EECycleX1"
-msgstr "Výchozí množství cyklů. Toto se blíže shoduje se skutečnou rychlostí opravdového EmotionEngine PS2."
+msgstr ""
+"Výchozí množství cyklů. Toto se blíže shoduje se skutečnou rychlostí "
+"opravdového EmotionEngine PS2."
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:32
msgid "!Panel:Speedhacks:EECycleX2"
-msgstr "Sníží množství cyklů EE asi o 33%. Mírné zrychlení ve většině her s vysokou kompatibilitou."
+msgstr ""
+"Sníží množství cyklů EE asi o 33%. Mírné zrychlení ve většině her s vysokou "
+"kompatibilitou."
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:37
msgid "!Panel:Speedhacks:EECycleX3"
-msgstr "Sníží množství cyklů EE asi o 50%. Průměrné zrychlení, ale *způsobí* zadrhování zvuku ve spoustě FMV."
+msgstr ""
+"Sníží množství cyklů EE asi o 50%. Průměrné zrychlení, ale *způsobí* "
+"zadrhování zvuku ve spoustě FMV."
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:54
msgid "!Panel:Speedhacks:VUCycleStealOff"
@@ -296,78 +412,129 @@ msgstr "Zakáže krádež cyklů VJ. Nejkompatibilnější nastavení"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:59
msgid "!Panel:Speedhacks:VUCycleSteal1"
-msgstr "Mírná krádež cyklů VJ. Nižší kompatibilita, ale jisté zrychlení ve většině her."
+msgstr ""
+"Mírná krádež cyklů VJ. Nižší kompatibilita, ale jisté zrychlení ve většině "
+"her."
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:64
msgid "!Panel:Speedhacks:VUCycleSteal2"
-msgstr "Průměrná krádež cyklů VJ. Ještě nižší kompatibilita, ale výrazné zrychlení v některých hrách."
+msgstr ""
+"Průměrná krádež cyklů VJ. Ještě nižší kompatibilita, ale výrazné zrychlení v "
+"některých hrách."
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:70
msgid "!Panel:Speedhacks:VUCycleSteal3"
-msgstr "Maximální krádež cyklů VJ. Užitečnost je omezená protože toto způsobuje blikání grafiky nebo zpomalení ve většině her. "
+msgstr ""
+"Maximální krádež cyklů VJ. Užitečnost je omezená protože toto způsobuje "
+"blikání grafiky nebo zpomalení ve většině her. "
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:97
msgid "!Panel:Speedhacks:Overview"
-msgstr "Hacky Rychlosti většinou zlepšují rychlost emulace, ale můžou způsobovat chyby, špatný zvuk a špatné údaje o SZS. Když máte problémy s emulací, tento panel zakažte nejdříve."
+msgstr ""
+"Hacky Rychlosti většinou zlepšují rychlost emulace, ale můžou způsobovat "
+"chyby, špatný zvuk a špatné údaje o SZS. Když máte problémy s emulací, tento "
+"panel zakažte nejdříve."
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:129
msgid "!ContextTip:Speedhacks:EECycleRate Slider"
-msgstr "Nastavením vyšších hodnot na tomto šoupátku účinně sníží rychlost hodin jádra R5900 procesoru EmotionEngine a typicky přináší velké zrychlení hrám, které nemohou využívat plný potenciál skutečného hardwaru PS2. "
+msgstr ""
+"Nastavením vyšších hodnot na tomto šoupátku účinně sníží rychlost hodin "
+"jádra R5900 procesoru EmotionEngine a typicky přináší velké zrychlení hrám, "
+"které nemohou využívat plný potenciál skutečného hardwaru PS2. "
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:150
msgid "!ContextTip:Speedhacks:VUCycleStealing Slider"
-msgstr "Toto šoupátko kontroluje množství cyklů, které VJ ukradne od EmotionEngine. Vyšší hodnoty zvyšují počet ukradených cyklů od EE pro každý mikroprogram, který VJ spustí."
+msgstr ""
+"Toto šoupátko kontroluje množství cyklů, které VJ ukradne od EmotionEngine. "
+"Vyšší hodnoty zvyšují počet ukradených cyklů od EE pro každý mikroprogram, "
+"který VJ spustí."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:172
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "!ContextTip:Speedhacks:vuFlagHack"
-msgstr "Aktualizuje Příznaky Stavu pouze v blocích, které je budou číst, místo neustále. Toto je většinou bezpečné a Super VJ dělá standardně něco podobného."
+msgstr ""
+"Aktualizuje Příznaky Stavu pouze v blocích, které je budou číst, místo "
+"neustále. Toto je většinou bezpečné a Super VJ dělá standardně něco "
+"podobného."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:177
-msgid "!ContextTip:Speedhacks:vuBlockHack"
-msgstr "Předpokládá, že daleko v budoucnosti bloky nebudou potřebovat staré příznaky dat instancí. Toto by mělo být celkem bezpečné. Není známo, jestli toto nějakou hru poškozuje..."
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:182
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:174
msgid "!ContextTip:Speedhacks:vuThread"
-msgstr "Spouští VJ1 na svém vlastním vlákně (pouze mikroVJ1). Na počítačích s 3 a více jádry většinou zrychlení. Toto je pro většinu her bezpečné, ale některé jsou nekompatibilní a mohou se zaseknout. V případě her omezených GS může dojít ke zpomalení (zvláště na počítačích s dvoujádrovým procesorem)."
+msgstr ""
+"Spouští VJ1 na svém vlastním vlákně (pouze mikroVJ1). Na počítačích s 3 a "
+"více jádry většinou zrychlení. Toto je pro většinu her bezpečné, ale některé "
+"jsou nekompatibilní a mohou se zaseknout. V případě her omezených GS může "
+"dojít ke zpomalení (zvláště na počítačích s dvoujádrovým procesorem)."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:203
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:195
msgid "!ContextTip:Speedhacks:INTC"
-msgstr "Tento hack funguje nejlépe v hrách, které používají stavy KPŘE registru pro čekání na vsynch, což hlavně zahrnuje ne-3D rpg hry. Ty, co tuto metodu v synch nepoužívají z tohoto hacku nedostanou žádné nebo malé zrychlení."
+msgstr ""
+"Tento hack funguje nejlépe v hrách, které používají stavy KPŘE registru pro "
+"čekání na vsynch, což hlavně zahrnuje ne-3D rpg hry. Ty, co tuto metodu v "
+"synch nepoužívají z tohoto hacku nedostanou žádné nebo malé zrychlení."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:208
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
msgid "!ContextTip:Speedhacks:BIFC0"
-msgstr "Má za cíl hlavně čekací smyčku EE na adrese 0x81FC0 v kernelu, tento hack se pokusí zjistit smyčky, jejichž těla mají zaručeně za následek stejný stav stroje pro každé opakování doku naplánovaná událost nespustí emulaci další jednotky. Po prvním opakováním takovýchto smyček, pokročíme do doby další události nebo konce pracovního intervalu procesoru, co nastane dříve."
+msgstr ""
+"Má za cíl hlavně čekací smyčku EE na adrese 0x81FC0 v kernelu, tento hack se "
+"pokusí zjistit smyčky, jejichž těla mají zaručeně za následek stejný stav "
+"stroje pro každé opakování doku naplánovaná událost nespustí emulaci další "
+"jednotky. Po prvním opakováním takovýchto smyček, pokročíme do doby další "
+"události nebo konce pracovního intervalu procesoru, co nastane dříve."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:215
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:207
msgid "!ContextTip:Speedhacks:fastCDVD"
-msgstr "Zkontrolujte seznam kompatibility HDLoadera pro hry, známé, že s tímto mají problémy. (často označené jako vyžadující 'mode 1' nebo 'slow DVD'"
+msgstr ""
+"Zkontrolujte seznam kompatibility HDLoadera pro hry, známé, že s tímto mají "
+"problémy. (často označené jako vyžadující 'mode 1' nebo 'slow DVD'"
#: pcsx2/gui/Panels/VideoPanel.cpp:37
msgid "!ContextTip:Framelimiter:Disable"
-msgstr "Nezapomeňte, že když je omezení snímků vypnuté, nebudou ani také dostupné režimy Turbo a ZpomalenýPohyb."
+msgstr ""
+"Nezapomeňte, že když je omezení snímků vypnuté, nebudou ani také dostupné "
+"režimy Turbo a ZpomalenýPohyb."
-#: pcsx2/gui/Panels/VideoPanel.cpp:223
+#: pcsx2/gui/Panels/VideoPanel.cpp:227
msgid "!Panel:Frameskip:Heading"
-msgstr "Upozornění: Kvůli hardwarovému designu PS2 je přesné přeskakování snímků nemožné. Zapnutím tohoto způsobí vážné grafické chyby v některých hrách."
-
-#: pcsx2/gui/Panels/VideoPanel.cpp:302
-msgid "!ContextTip:GS:SyncMTGS"
-msgstr "Zapněte toto, pokud si myslíte, že synch vlákna VVGS způsobuje pády a grafické problémy."
+msgstr ""
+"Upozornění: Kvůli hardwarovému designu PS2 je přesné přeskakování snímků "
+"nemožné. Zapnutím tohoto způsobí vážné grafické chyby v některých hrách."
#: pcsx2/gui/Panels/VideoPanel.cpp:306
+msgid "!ContextTip:GS:SyncMTGS"
+msgstr ""
+"Zapněte toto, pokud si myslíte, že synch vlákna VVGS způsobuje pády a "
+"grafické problémy."
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:310
msgid "!ContextTip:GS:DisableOutput"
msgstr ""
-"Odstraní jakýkoli šum výkonnostního testu způsobený vláknem VVGS nebo časem zpracování grafického procesoru. Tato volba se nejlépe používá spolu s uloženými stavy: uložte stav v ideální scéně, zapněte tuto volbu, a znovu načtěte uložený stav.\n"
+"Odstraní jakýkoli šum výkonnostního testu způsobený vláknem VVGS nebo časem "
+"zpracování grafického procesoru. Tato volba se nejlépe používá spolu s "
+"uloženými stavy: uložte stav v ideální scéně, zapněte tuto volbu, a znovu "
+"načtěte uložený stav.\n"
"\n"
-"Varování: Tato volba může být zapnuta za běhu ale typicky nemůže být takto vypnuta (obraz bude většinou poškozený)"
+"Varování: Tato volba může být zapnuta za běhu ale typicky nemůže být takto "
+"vypnuta (obraz bude většinou poškozený)"
#: pcsx2/vtlb.cpp:710
msgid "!Notice:HostVmReserve"
-msgstr "Váš systém má příliš nízké virtuální zdroje, aby mohl být PCSX2 spuštěn. To může být způsobeno malým nebo vypnutým stránkovacím souborem, nebo jinými programy, které jsou náročné na zdroje."
+msgstr ""
+"Váš systém má příliš nízké virtuální zdroje, aby mohl být PCSX2 spuštěn. To "
+"může být způsobeno malým nebo vypnutým stránkovacím souborem, nebo jinými "
+"programy, které jsou náročné na zdroje."
#: pcsx2/x86/sVU_zerorec.cpp:363
msgid "!Notice:superVU:VirtualMemoryAlloc"
-msgstr "Došla Paměť (tak trochu): Rekompilátor SuperVJ nemohl vyhradit určitý vyžadovaný rozsah paměti a nebude dostupný k použití. To není kritická chyba, protože rek sVU je zastaralý a stejně byste místo něj měli používat mVU :)."
+msgstr ""
+"Došla Paměť (tak trochu): Rekompilátor SuperVJ nemohl vyhradit určitý "
+"vyžadovaný rozsah paměti a nebude dostupný k použití. To není kritická "
+"chyba, protože rek sVU je zastaralý a stejně byste místo něj měli používat "
+"mVU :)."
+
+#~ msgid "!ContextTip:Speedhacks:vuBlockHack"
+#~ msgstr ""
+#~ "Předpokládá, že daleko v budoucnosti bloky nebudou potřebovat staré "
+#~ "příznaky dat instancí. Toto by mělo být celkem bezpečné. Není známo, "
+#~ "jestli toto nějakou hru poškozuje..."
#~ msgid "No reason given."
#~ msgstr "Bez udání důvodu."
diff --git a/locales/cs_CZ/pcsx2_Main.po b/locales/cs_CZ/pcsx2_Main.po
index 8a6a640b8..a6f5e0303 100644
--- a/locales/cs_CZ/pcsx2_Main.po
+++ b/locales/cs_CZ/pcsx2_Main.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.9\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-09-28 20:27+0200\n"
+"POT-Creation-Date: 2012-02-28 12:20+0100\n"
"PO-Revision-Date: 2011-09-29 13:05+0100\n"
"Last-Translator: Zbyněk Schwarz \n"
"Language-Team: Zbyněk Schwarz\n"
@@ -38,8 +38,14 @@ msgid "Oh noes! Out of memory!"
msgstr "Ale ne! Došla paměť!"
#: common/src/Utilities/Exceptions.cpp:234
-msgid "Virtual memory mapping failure! Your system may have conflicting device drivers, services, or may simply have insufficient memory or resources to meet PCSX2's lofty needs."
-msgstr "Selhání mapování virtuální paměti! Váš systém může mít konfliktní ovladače zařízení, služby, nebo má prostě nedostatečnou paměť nebo zdroje, pro splnění vysokých nároků PCSX2."
+msgid ""
+"Virtual memory mapping failure! Your system may have conflicting device "
+"drivers, services, or may simply have insufficient memory or resources to "
+"meet PCSX2's lofty needs."
+msgstr ""
+"Selhání mapování virtuální paměti! Váš systém může mít konfliktní ovladače "
+"zařízení, služby, nebo má prostě nedostatečnou paměť nebo zdroje, pro "
+"splnění vysokých nároků PCSX2."
#: common/src/Utilities/Exceptions.cpp:309
msgid "Path: "
@@ -58,12 +64,20 @@ msgid "File not found."
msgstr "Soubor nenalezen."
#: common/src/Utilities/Exceptions.cpp:373
-msgid "Permission denied while trying to open file, likely due to insufficient user account rights."
-msgstr "Oprávnění zamítnuto při pokusu o otevření souboru, pravděpodobně kvůli nedostatečným uživatelským oprávněním."
+msgid ""
+"Permission denied while trying to open file, likely due to insufficient user "
+"account rights."
+msgstr ""
+"Oprávnění zamítnuto při pokusu o otevření souboru, pravděpodobně kvůli "
+"nedostatečným uživatelským oprávněním."
#: common/src/Utilities/Exceptions.cpp:393
-msgid "Unexpected end of file or stream encountered. File is probably truncated or corrupted."
-msgstr "Objeven nečekaný konec souboru nebo proudu. Soubor je pravděpodobně zkrácen nebo poškozen."
+msgid ""
+"Unexpected end of file or stream encountered. File is probably truncated or "
+"corrupted."
+msgstr ""
+"Objeven nečekaný konec souboru nebo proudu. Soubor je pravděpodobně zkrácen "
+"nebo poškozen."
#: common/src/Utilities/ThreadTools.cpp:41
msgid "Threading activity: start, detach, sync, deletion, etc."
@@ -79,7 +93,8 @@ msgstr "Čekám na úkol..."
#: common/src/Utilities/wxAppWithHelpers.cpp:36
msgid "Includes idle event processing and some other uncommon event usages."
-msgstr "Zahrnuje zpracování nečinné události a další neobyčejné používání událostí."
+msgstr ""
+"Zahrnuje zpracování nečinné události a další neobyčejné používání událostí."
#: pcsx2/CDVD/IsoFileFormats.cpp:416
msgid "Unrecognized ISO image file format"
@@ -90,26 +105,42 @@ msgid "Cannot load ELF binary image. The file may be corrupt or incomplete."
msgstr "Nelze načíst binární obraz ELF. Soubor může být poškozen nebo neúplný."
#: pcsx2/Elfheader.cpp:268
-msgid "If loading from an ISO image, this error may be caused by an unsupported ISO image type or a bug in PCSX2 ISO image support."
-msgstr "Pokud načítáte z obrazu ISO, tato chyba mohla být způsobena nepodporovaným typem obrazu ISO nebo chyba PCSX2 v podpoře obrazů ISO."
+msgid ""
+"If loading from an ISO image, this error may be caused by an unsupported ISO "
+"image type or a bug in PCSX2 ISO image support."
+msgstr ""
+"Pokud načítáte z obrazu ISO, tato chyba mohla být způsobena nepodporovaným "
+"typem obrazu ISO nebo chyba PCSX2 v podpoře obrazů ISO."
#: pcsx2/MTGS.cpp:859
-msgid "The MTGS thread has become unresponsive while waiting for the GS plugin to open."
-msgstr "Vlákno VVGS přestalo odpovídat při čekání na otevření zásuvného modulu GS."
+msgid ""
+"The MTGS thread has become unresponsive while waiting for the GS plugin to "
+"open."
+msgstr ""
+"Vlákno VVGS přestalo odpovídat při čekání na otevření zásuvného modulu GS."
#: pcsx2/PluginManager.cpp:709
-msgid "The savestate cannot be loaded, as it appears to be corrupt or incomplete."
+msgid ""
+"The savestate cannot be loaded, as it appears to be corrupt or incomplete."
msgstr "Uložený stav nelze načíst, protože vypadá poškozený nebo neúplný"
#: pcsx2/PluginManager.cpp:719
#, c-format
-msgid "%s plugin failed to open. Your computer may have insufficient resources, or incompatible hardware/drivers."
-msgstr "Zásuvný modul %s nelze otevřít. Váš počítač může mít nedostatečné zdroje, nebo nekompatibilní hardware/ovladače."
+msgid ""
+"%s plugin failed to open. Your computer may have insufficient resources, or "
+"incompatible hardware/drivers."
+msgstr ""
+"Zásuvný modul %s nelze otevřít. Váš počítač může mít nedostatečné zdroje, "
+"nebo nekompatibilní hardware/ovladače."
#: pcsx2/PluginManager.cpp:726
#, c-format
-msgid "%s plugin failed to initialize. Your system may have insufficient memory or resources needed."
-msgstr "Zásuvný modul %s nelze spustit. Váš systém možná nemá dostatečnou paměť nebo potřebné zdroje."
+msgid ""
+"%s plugin failed to initialize. Your system may have insufficient memory or "
+"resources needed."
+msgstr ""
+"Zásuvný modul %s nelze spustit. Váš systém možná nemá dostatečnou paměť nebo "
+"potřebné zdroje."
#: pcsx2/PluginManager.cpp:832
#, c-format
@@ -123,21 +154,36 @@ msgstr "Nastavený soubor zásuvného modulu %s není platná dynamická knihovn
#: pcsx2/PluginManager.cpp:854
#, c-format
-msgid "The configured %s plugin is not a PCSX2 plugin, or is for an older unsupported version of PCSX2."
-msgstr "Nastavený zásuvný modul %s není platný modul PCSX2, nebo je pro starší nepodporovanou verzi PCSX2."
+msgid ""
+"The configured %s plugin is not a PCSX2 plugin, or is for an older "
+"unsupported version of PCSX2."
+msgstr ""
+"Nastavený zásuvný modul %s není platný modul PCSX2, nebo je pro starší "
+"nepodporovanou verzi PCSX2."
#: pcsx2/PluginManager.cpp:879
-msgid "The plugin reports that your hardware or software/drivers are not supported."
-msgstr "Zásuvný modul hlásí, že Váš hardware nebo software/ovladače nejsou podporovány."
+msgid ""
+"The plugin reports that your hardware or software/drivers are not supported."
+msgstr ""
+"Zásuvný modul hlásí, že Váš hardware nebo software/ovladače nejsou "
+"podporovány."
#: pcsx2/PluginManager.cpp:900
-msgid "Configured plugin is not a PCSX2 plugin, or is for an older unsupported version of PCSX2."
-msgstr "Nastavený zásuvný modul není modul PCSX2. nebo je pro starší nepodporovanou verzi PCSX2."
+msgid ""
+"Configured plugin is not a PCSX2 plugin, or is for an older unsupported "
+"version of PCSX2."
+msgstr ""
+"Nastavený zásuvný modul není modul PCSX2. nebo je pro starší nepodporovanou "
+"verzi PCSX2."
#: pcsx2/PluginManager.cpp:926
#, c-format
-msgid "Configured %s plugin is not a valid PCSX2 plugin, or is for an older unsupported version of PCSX2."
-msgstr "Nastavený zásuvný modul %s není platný modul PCSX2, nebo je pro starší nepodporovanou verzi PCSX2."
+msgid ""
+"Configured %s plugin is not a valid PCSX2 plugin, or is for an older "
+"unsupported version of PCSX2."
+msgstr ""
+"Nastavený zásuvný modul %s není platný modul PCSX2, nebo je pro starší "
+"nepodporovanou verzi PCSX2."
#: pcsx2/PluginManager.cpp:1355
msgid "Internal Memorycard Plugin failed to initialize."
@@ -147,7 +193,7 @@ msgstr "Vnitřní zásuvný modul Paměťové Karty nelze spustit."
msgid "Unloaded Plugin"
msgstr "Uvolněný Zásuvný Modul"
-#: pcsx2/SaveState.cpp:339
+#: pcsx2/SaveState.cpp:342
msgid "Cannot load savestate. It is of an unknown or unsupported version."
msgstr "Nelze načíst uložený stav. Je neznámé nebo nepodporované verze."
@@ -156,8 +202,12 @@ msgid "Dumps detailed information for PS2 executables (ELFs)."
msgstr "Vypíše detailní informace pro spustitelné soubory PS2 (ELF)."
#: pcsx2/SourceLog.cpp:101
-msgid "Logs manual protection, split blocks, and other things that might impact performance."
-msgstr "Zaznamená ruční ochranu, rozdělené bloky, a jiné věci, které můžou mít vliv na výkon."
+msgid ""
+"Logs manual protection, split blocks, and other things that might impact "
+"performance."
+msgstr ""
+"Zaznamená ruční ochranu, rozdělené bloky, a jiné věci, které můžou mít vliv "
+"na výkon."
#: pcsx2/SourceLog.cpp:106
msgid "Shows the game developer's logging text (EE processor)"
@@ -177,10 +227,10 @@ msgstr "Aktivita SYSCALL a DECI2"
#: pcsx2/SourceLog.cpp:151
msgid "Direct memory accesses to unknown or unmapped EE memory space."
-msgstr "Přístupy přímé paměti do neznámého nebo nezmapovaného paměťového místa EE."
+msgstr ""
+"Přístupy přímé paměti do neznámého nebo nezmapovaného paměťového místa EE."
-#: pcsx2/SourceLog.cpp:157
-#: pcsx2/SourceLog.cpp:276
+#: pcsx2/SourceLog.cpp:157 pcsx2/SourceLog.cpp:276
msgid "Disasm of executing core instructions (excluding COPs and CACHE)."
msgstr "Rozložení spouštění instrukcí jádra (mimo COP a CACHE)"
@@ -201,16 +251,19 @@ msgid "Execution of EE cache instructions."
msgstr "Spuštění instrukcí vyrovnávací paměti EE."
#: pcsx2/SourceLog.cpp:187
-msgid "All known hardware register accesses (very slow!); not including sub filter options below."
-msgstr "Všechny známé přístupy hardwarového registru (velmi pomalé!); nezahrnuje možnosti pod filtru níže."
+msgid ""
+"All known hardware register accesses (very slow!); not including sub filter "
+"options below."
+msgstr ""
+"Všechny známé přístupy hardwarového registru (velmi pomalé!); nezahrnuje "
+"možnosti pod filtru níže."
-#: pcsx2/SourceLog.cpp:193
-#: pcsx2/SourceLog.cpp:294
+#: pcsx2/SourceLog.cpp:193 pcsx2/SourceLog.cpp:294
msgid "Logs only unknown, unmapped, or unimplemented register accesses."
-msgstr "Zaznamená pouze neznámé, nezmapované, nebo nezavedené přístupy registru."
+msgstr ""
+"Zaznamená pouze neznámé, nezmapované, nebo nezavedené přístupy registru."
-#: pcsx2/SourceLog.cpp:199
-#: pcsx2/SourceLog.cpp:300
+#: pcsx2/SourceLog.cpp:199 pcsx2/SourceLog.cpp:300
msgid "Logs only DMA-related registers."
msgstr "Zaznamená pouze registry vztahující se k DMA."
@@ -236,7 +289,8 @@ msgstr "MFIFO aktivita Schratchpadu."
#: pcsx2/SourceLog.cpp:235
msgid "Actual data transfer logs, bus right arbitration, stalls, etc."
-msgstr "Skutečné záznamy přenosu dat, arbitráž oprávnění sběrnice, zahlcení, atd."
+msgstr ""
+"Skutečné záznamy přenosu dat, arbitráž oprávnění sběrnice, zahlcení, atd."
#: pcsx2/SourceLog.cpp:241
msgid "Tracks all EE counters events and some counter register activity."
@@ -256,15 +310,19 @@ msgstr "Aktivita SYSCALL a IRX"
#: pcsx2/SourceLog.cpp:270
msgid "Direct memory accesses to unknown or unmapped IOP memory space."
-msgstr "Přímé vstupy paměti do neznámého nebo nezmapovaného prostoru paměti IOP."
+msgstr ""
+"Přímé vstupy paměti do neznámého nebo nezmapovaného prostoru paměti IOP."
#: pcsx2/SourceLog.cpp:282
msgid "Disasm of the IOP's GPU co-processor instructions."
msgstr "Rozložení instrukcí koprocesoru IOP z GPU."
#: pcsx2/SourceLog.cpp:288
-msgid "All known hardware register accesses, not including the sub-filters below."
-msgstr "Všechny známé přístupy hardwarového registru, nezahrnuje možnosti pod filtru níže."
+msgid ""
+"All known hardware register accesses, not including the sub-filters below."
+msgstr ""
+"Všechny známé přístupy hardwarového registru, nezahrnuje možnosti pod filtru "
+"níže."
#: pcsx2/SourceLog.cpp:306
msgid "Memorycard reads, writes, erases, terminators, and other processing."
@@ -280,48 +338,50 @@ msgstr "Skutečné zpracování události DMA a záznamy přenosu dat."
#: pcsx2/SourceLog.cpp:324
msgid "Tracks all IOP counters events and some counter register activity."
-msgstr "Sleduje všechny události čítače IOP a některé aktivity registru čítače."
+msgstr ""
+"Sleduje všechny události čítače IOP a některé aktivity registru čítače."
#: pcsx2/SourceLog.cpp:330
msgid "Detailed logging of CDVD hardware."
msgstr "Detailní záznam hardwaru CDVD."
-#: pcsx2/System.h:206
-#: pcsx2/System.h:207
-#: pcsx2/System.h:208
+#: pcsx2/System.h:206 pcsx2/System.h:207 pcsx2/System.h:208
msgid "PCSX2 Message"
msgstr "Zpráva PCSX2"
#: pcsx2/ZipTools/thread_gzip.cpp:82
-msgid "The savestate was not properly saved. The temporary file was created successfully but could not be moved to its final resting place."
-msgstr "Uložený stav nebyl správně uložen. Dočasný soubor byl úspěšně vytvořen ale nemohl být přesunut do svého posledního místa odpočinku."
+msgid ""
+"The savestate was not properly saved. The temporary file was created "
+"successfully but could not be moved to its final resting place."
+msgstr ""
+"Uložený stav nebyl správně uložen. Dočasný soubor byl úspěšně vytvořen ale "
+"nemohl být přesunut do svého posledního místa odpočinku."
-#: pcsx2/gui/AppConfig.cpp:837
+#: pcsx2/gui/AppConfig.cpp:842
msgid "Safest"
msgstr "Nejbezpečnější"
-#: pcsx2/gui/AppConfig.cpp:838
+#: pcsx2/gui/AppConfig.cpp:843
msgid "Safe (faster)"
msgstr "Bezpečné (rychlejší)"
-#: pcsx2/gui/AppConfig.cpp:839
+#: pcsx2/gui/AppConfig.cpp:844
msgid "Balanced"
msgstr "Vyrovnaný"
-#: pcsx2/gui/AppConfig.cpp:840
+#: pcsx2/gui/AppConfig.cpp:845
msgid "Aggressive"
msgstr "Agresivní"
-#: pcsx2/gui/AppConfig.cpp:841
+#: pcsx2/gui/AppConfig.cpp:846
msgid "Aggressive plus"
msgstr "Agresivní plus"
-#: pcsx2/gui/AppConfig.cpp:842
+#: pcsx2/gui/AppConfig.cpp:847
msgid "Mostly Harmful"
msgstr "Většinou Škodlivý"
-#: pcsx2/gui/AppConfig.cpp:999
-#: pcsx2/gui/AppConfig.cpp:1005
+#: pcsx2/gui/AppConfig.cpp:1007 pcsx2/gui/AppConfig.cpp:1013
msgid "Failed to overwrite existing settings file; permission was denied."
msgstr "Nelze přepsat existující soubor nastavení; oprávnění bylo zamítnuto."
@@ -334,8 +394,12 @@ msgid "PCSX2 - SSE2 Recommended"
msgstr "PCSX2 - SSE2 Doporučeno"
#: pcsx2/gui/AppInit.cpp:71
-msgid "SSE extensions are not available. PCSX2 requires a cpu that supports the SSE instruction set."
-msgstr "Rozšíření SSE nejsou dostupná. PCSX2 vyžaduje procesor, který podporuje instrukční sadu SSE."
+msgid ""
+"SSE extensions are not available. PCSX2 requires a cpu that supports the "
+"SSE instruction set."
+msgstr ""
+"Rozšíření SSE nejsou dostupná. PCSX2 vyžaduje procesor, který podporuje "
+"instrukční sadu SSE."
#: pcsx2/gui/AppInit.cpp:154
msgid "PCSX2 Recompiler Error(s)"
@@ -345,8 +409,7 @@ msgstr "Chyba/y Rekompilátoru PCSX2"
msgid "All options are for the current session only and will not be saved.\n"
msgstr "Všechny volby jsou pouze pro současnou relaci a nebudou uloženy.\n"
-#: pcsx2/gui/AppInit.cpp:237
-#: pcsx2/gui/AppMain.cpp:299
+#: pcsx2/gui/AppInit.cpp:237 pcsx2/gui/AppMain.cpp:299
msgid "IsoFile"
msgstr "Soubor ISO"
@@ -376,7 +439,8 @@ msgstr "spustí obraz ELF"
#: pcsx2/gui/AppInit.cpp:245
msgid "boots an empty dvd tray; use to enter the PS2 system menu"
-msgstr "zavede prázdnou mechaniku dvd; použijte pro vstup do systémového menu PS2"
+msgstr ""
+"zavede prázdnou mechaniku dvd; použijte pro vstup do systémového menu PS2"
#: pcsx2/gui/AppInit.cpp:246
msgid "boots from the CDVD plugin (overrides IsoFile parameter)"
@@ -409,7 +473,8 @@ msgstr "donutí %s spustit Průvodce Prvním Spuštěním"
#: pcsx2/gui/AppInit.cpp:255
msgid "enables portable mode operation (requires admin/root access)"
-msgstr "povolí operace přenosného režimu (vyžaduje administrátorský/kořenový přístup)"
+msgstr ""
+"povolí operace přenosného režimu (vyžaduje administrátorský/kořenový přístup)"
#: pcsx2/gui/AppInit.cpp:259
#, c-format
@@ -424,23 +489,26 @@ msgstr "Chyba Potlačení Zásuvného Modulu - %s"
#: pcsx2/gui/AppInit.cpp:310
#, c-format
msgid ""
-"%s Plugin Override Error! The following file does not exist or is not a valid %s plugin:\n"
+"%s Plugin Override Error! The following file does not exist or is not a "
+"valid %s plugin:\n"
"\n"
msgstr ""
-"Chyba Potlačení Zásuvného Modulu %s! Následující soubor neexistuje nebo není platný modul %s:\n"
+"Chyba Potlačení Zásuvného Modulu %s! Následující soubor neexistuje nebo není "
+"platný modul %s:\n"
"\n"
#: pcsx2/gui/AppInit.cpp:317
#, c-format
msgid "Press OK to use the default configured plugin, or Cancel to close %s."
-msgstr "Stiskněte OK pro použití výchozího nastaveného zásuvného modulu, nebo Zrušit pro zavření %s."
+msgstr ""
+"Stiskněte OK pro použití výchozího nastaveného zásuvného modulu, nebo Zrušit "
+"pro zavření %s."
#: pcsx2/gui/AppInit.cpp:496
msgid "PCSX2 Error: Hardware Deficiency"
msgstr "Chyba PCSX2: Hardwarová Vada"
-#: pcsx2/gui/AppInit.cpp:496
-#: pcsx2/gui/AppInit.cpp:508
+#: pcsx2/gui/AppInit.cpp:496 pcsx2/gui/AppInit.cpp:508
#, c-format
msgid "Press OK to close %s."
msgstr "Stiskněte OK pro uzavření %s."
@@ -528,10 +596,12 @@ msgstr ""
"\n"
"Stiskněte Ok pro přechod na Panel Nastavení Zásuvných Modulů."
-#: pcsx2/gui/AppMain.cpp:140
-#: pcsx2/gui/AppMain.cpp:154
-msgid "Warning! System plugins have not been loaded. PCSX2 may be inoperable."
-msgstr "Varování! Systémové zásuvné moduly nebyly načteny. PCSX2 může být nepoužitelný."
+#: pcsx2/gui/AppMain.cpp:140 pcsx2/gui/AppMain.cpp:154
+msgid ""
+"Warning! System plugins have not been loaded. PCSX2 may be inoperable."
+msgstr ""
+"Varování! Systémové zásuvné moduly nebyly načteny. PCSX2 může být "
+"nepoužitelný."
#: pcsx2/gui/AppMain.cpp:309
#, c-format
@@ -580,8 +650,12 @@ msgid "Portable mode error - %s"
msgstr "Chyba přenosného režimu - %s"
#: pcsx2/gui/AppUserMode.cpp:157
-msgid "PCSX2 has been installed as a portable application but cannot run due to the following errors:"
-msgstr "PCSX2 byl nainstalován jako přenosná aplikace, ale nemůže být spuštěn kvůli následujícím chybám:"
+msgid ""
+"PCSX2 has been installed as a portable application but cannot run due to the "
+"following errors:"
+msgstr ""
+"PCSX2 byl nainstalován jako přenosná aplikace, ale nemůže být spuštěn kvůli "
+"následujícím chybám:"
#: pcsx2/gui/AppUserMode.cpp:165
msgid "Switch to User Documents Mode"
@@ -593,8 +667,12 @@ msgid "%s is switching to local install mode."
msgstr "%s se přepíná do režimu místní instalace."
#: pcsx2/gui/AppUserMode.cpp:179
-msgid "Try to remove the file called \"portable.ini\" from your installation directory manually."
-msgstr "Zkuste odstranit soubor nazvaný \"portable.ini\" z Vašeho instalačního adresáře ručně. "
+msgid ""
+"Try to remove the file called \"portable.ini\" from your installation "
+"directory manually."
+msgstr ""
+"Zkuste odstranit soubor nazvaný \"portable.ini\" z Vašeho instalačního "
+"adresáře ručně. "
#: pcsx2/gui/ApplyState.h:55
msgid "Cannot apply new settings, one of the settings is invalid."
@@ -616,8 +694,7 @@ msgstr "Malé"
msgid "It's what I use (the programmer guy)."
msgstr "To, co používám já (programátor)."
-#: pcsx2/gui/ConsoleLogger.cpp:415
-#: pcsx2/gui/Panels/CpuPanel.cpp:38
+#: pcsx2/gui/ConsoleLogger.cpp:415 pcsx2/gui/Panels/CpuPanel.cpp:38
msgid "Normal"
msgstr "Normální"
@@ -646,8 +723,12 @@ msgid "Light theme"
msgstr "Světlý vzhled"
#: pcsx2/gui/ConsoleLogger.cpp:424
-msgid "Classic black color scheme for people who enjoy having text seared into their optic nerves."
-msgstr "Klasický vzhled černé barvy pro lidi, kteří mají rádi text vypálen do jejich optických nervů."
+msgid ""
+"Classic black color scheme for people who enjoy having text seared into "
+"their optic nerves."
+msgstr ""
+"Klasický vzhled černé barvy pro lidi, kteří mají rádi text vypálen do jejich "
+"optických nervů."
#: pcsx2/gui/ConsoleLogger.cpp:424
msgid "Dark theme"
@@ -658,8 +739,10 @@ msgid "Always on Top"
msgstr "Vždy Nahoře"
#: pcsx2/gui/ConsoleLogger.cpp:428
-msgid "When checked the log window will be visible over other foreground windows."
-msgstr "Při zaškrtnutí bude okno záznamu viditelné nad ostatními okny v popředí."
+msgid ""
+"When checked the log window will be visible over other foreground windows."
+msgstr ""
+"Při zaškrtnutí bude okno záznamu viditelné nad ostatními okny v popředí."
#: pcsx2/gui/ConsoleLogger.cpp:430
msgid "&Save..."
@@ -677,8 +760,7 @@ msgstr "&Vyčistit"
msgid "Clear the log window contents"
msgstr "Vyčistit obsah okna se záznamem"
-#: pcsx2/gui/ConsoleLogger.cpp:433
-#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:280
+#: pcsx2/gui/ConsoleLogger.cpp:433 pcsx2/gui/Dialogs/SysConfigDialog.cpp:280
msgid "Appearance"
msgstr "Vzhled"
@@ -800,12 +882,20 @@ msgid "Do not show this dialog again."
msgstr "Už toto dialogové okno nezobrazovat."
#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:199
-msgid "Disables this popup and whatever response you select here will be automatically used from now on."
-msgstr "Zakáže toto vyskakovací okno a jakákoliv odpověď, kterou zde vyberete bude, odteď automaticky použita."
+msgid ""
+"Disables this popup and whatever response you select here will be "
+"automatically used from now on."
+msgstr ""
+"Zakáže toto vyskakovací okno a jakákoliv odpověď, kterou zde vyberete bude, "
+"odteď automaticky použita."
#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:201
-msgid "The popup will not be shown again. This setting can be undone from the settings panels."
-msgstr "Vyskakující okno už se znovu nezobrazí. Toto nastavení může být zrušeno z panelů nastavení."
+msgid ""
+"The popup will not be shown again. This setting can be undone from the "
+"settings panels."
+msgstr ""
+"Vyskakující okno už se znovu nezobrazí. Toto nastavení může být zrušeno z "
+"panelů nastavení."
#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:247
#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:292
@@ -862,12 +952,20 @@ msgid "8 MB [most compatible]"
msgstr "8 MB [nejvíce kompatibilní]"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:195
-msgid "This is the standard Sony-provisioned size, and is supported by all games and BIOS versions."
-msgstr "Toto je standardní velikost dodávaná Sony a je podporována všemi hrami a verzemi BIOS."
+msgid ""
+"This is the standard Sony-provisioned size, and is supported by all games "
+"and BIOS versions."
+msgstr ""
+"Toto je standardní velikost dodávaná Sony a je podporována všemi hrami a "
+"verzemi BIOS."
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:196
-msgid "Always use this option if you want the safest and surest memory card behavior."
-msgstr "Používejte tuto volbu vždy, když chcete nejbezpečnější a nejjistější chování paměťové karty."
+msgid ""
+"Always use this option if you want the safest and surest memory card "
+"behavior."
+msgstr ""
+"Používejte tuto volbu vždy, když chcete nejbezpečnější a nejjistější chování "
+"paměťové karty."
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:199
msgid "16 MB"
@@ -875,8 +973,11 @@ msgstr "16 MB"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:199
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:203
-msgid "A typical size for 3rd-party memory cards which should work with most games."
-msgstr "Typická velikost pro paměťové karty 3. strany, která by měla fungovat ve většině her."
+msgid ""
+"A typical size for 3rd-party memory cards which should work with most games."
+msgstr ""
+"Typická velikost pro paměťové karty 3. strany, která by měla fungovat ve "
+"většině her."
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:200
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:204
@@ -892,12 +993,20 @@ msgid "64 MB"
msgstr "64 MB"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:207
-msgid "Low compatibility warning: Yes it's very big, but may not work with many games."
-msgstr "Varování nízké kompatibility: Ano, je velmi velká, ale nefunguje ve spoustě hrách."
+msgid ""
+"Low compatibility warning: Yes it's very big, but may not work with many "
+"games."
+msgstr ""
+"Varování nízké kompatibility: Ano, je velmi velká, ale nefunguje ve spoustě "
+"hrách."
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:208
-msgid "Use at your own risk. Erratic memory card behavior is possible (though unlikely)."
-msgstr "Používejte na vlastní riziko. Je možné nestálé chování paměťové karty (i když nepravděpodobné)."
+msgid ""
+"Use at your own risk. Erratic memory card behavior is possible (though "
+"unlikely)."
+msgstr ""
+"Používejte na vlastní riziko. Je možné nestálé chování paměťové karty (i "
+"když nepravděpodobné)."
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:47
#, c-format
@@ -976,7 +1085,8 @@ msgid ""
"Note: Duplicate/Rename/Create/Delete will NOT be reverted with 'Cancel'."
msgstr ""
"\n"
-"Poznámka: Kopírovat/Přejmenovat/Vytvořit/Smazat NEBUDE tlačítkem 'Zrušit' přerušeno."
+"Poznámka: Kopírovat/Přejmenovat/Vytvořit/Smazat NEBUDE tlačítkem 'Zrušit' "
+"přerušeno."
#: pcsx2/gui/Dialogs/PickUserModeDialog.cpp:24
msgid "PCSX2 First Time configuration"
@@ -985,7 +1095,8 @@ msgstr "Prvotní nastavení PCSX2"
#: pcsx2/gui/Dialogs/PickUserModeDialog.cpp:29
#, c-format
msgid "%s is starting from a new or unknown folder and needs to be configured."
-msgstr "%s je spouštěn z nového nebo neznámého adresáře a potřebuje být nastaven."
+msgstr ""
+"%s je spouštěn z nového nebo neznámého adresáře a potřebuje být nastaven."
#: pcsx2/gui/Dialogs/StuckThreadDialog.cpp:28
msgid "PCSX2 Thread is not responding"
@@ -1075,8 +1186,7 @@ msgstr "Ukončit Aplikaci"
msgid "GS Output is Disabled!"
msgstr "Výstup GS je Zakázán!"
-#: pcsx2/gui/GlobalCommands.cpp:387
-#: pcsx2/gui/MainFrame.cpp:414
+#: pcsx2/gui/GlobalCommands.cpp:387 pcsx2/gui/MainFrame.cpp:414
msgid "Save state"
msgstr "Uložit stav"
@@ -1084,8 +1194,7 @@ msgstr "Uložit stav"
msgid "Saves the virtual machine state to the current slot."
msgstr "Uloží stav virtuálního stroje do současné pozice."
-#: pcsx2/gui/GlobalCommands.cpp:393
-#: pcsx2/gui/MainFrame.cpp:413
+#: pcsx2/gui/GlobalCommands.cpp:393 pcsx2/gui/MainFrame.cpp:413
msgid "Load state"
msgstr "Nahrát stav"
@@ -1123,11 +1232,12 @@ msgstr "Chyba Přetáhnutí"
#: pcsx2/gui/IsoDropTarget.cpp:58
#, c-format
-msgid "It is an error to drop multiple files onto a %s window. One at a time please, thank you."
+msgid ""
+"It is an error to drop multiple files onto a %s window. One at a time "
+"please, thank you."
msgstr "Je chyba přetahovat mnoho souborů do okna %s. "
-#: pcsx2/gui/IsoDropTarget.cpp:89
-#: pcsx2/gui/MainMenuClicks.cpp:342
+#: pcsx2/gui/IsoDropTarget.cpp:89 pcsx2/gui/MainMenuClicks.cpp:342
msgid "Confirm PS2 Reset"
msgstr "Potvrdit Resetování PS2"
@@ -1150,8 +1260,7 @@ msgstr "Přetáhli jste následující obraz ISO do %s:"
msgid "Slot %d"
msgstr "Pozice %d"
-#: pcsx2/gui/MainFrame.cpp:44
-#: pcsx2/gui/Saveslots.cpp:150
+#: pcsx2/gui/MainFrame.cpp:44 pcsx2/gui/Saveslots.cpp:150
msgid "Backup"
msgstr "Záloha"
@@ -1197,8 +1306,7 @@ msgstr "%s %d.%d.%d %s"
msgid "(modded)"
msgstr "(pozměněno)"
-#: pcsx2/gui/MainFrame.cpp:399
-#: pcsx2/gui/MainFrame.cpp:401
+#: pcsx2/gui/MainFrame.cpp:399 pcsx2/gui/MainFrame.cpp:401
#: pcsx2/gui/MainFrame.cpp:407
msgid "Initializing..."
msgstr "Zavádím..."
@@ -1292,8 +1400,7 @@ msgstr "&Paměťové karty"
msgid "&Plugin/BIOS Selector"
msgstr "&Výběr Zásuvných Modulů/BIOSu"
-#: pcsx2/gui/MainFrame.cpp:460
-#: pcsx2/gui/Panels/GameDatabasePanel.cpp:346
+#: pcsx2/gui/MainFrame.cpp:460 pcsx2/gui/Panels/GameDatabasePanel.cpp:346
msgid "Game Database Editor"
msgstr "Editor Databáze Her"
@@ -1412,10 +1519,10 @@ msgstr "Zavést CDVD (rychle)"
#: pcsx2/gui/MainFrame.cpp:642
msgid "Use fast boot to skip PS2 startup and splash screens"
-msgstr "Použít rychlé zavedení pro přeskočení spouštěcích a úvodních obrazovek PS2"
+msgstr ""
+"Použít rychlé zavedení pro přeskočení spouštěcích a úvodních obrazovek PS2"
-#: pcsx2/gui/MainFrame.cpp:703
-#: pcsx2/gui/MainFrame.cpp:738
+#: pcsx2/gui/MainFrame.cpp:703 pcsx2/gui/MainFrame.cpp:738
msgid "No plugin loaded"
msgstr "Nejsou načteny žádné zásuvné moduly"
@@ -1424,8 +1531,12 @@ msgid "Core GS Settings..."
msgstr "Nastavení Jádra GS..."
#: pcsx2/gui/MainFrame.cpp:709
-msgid "Modify hardware emulation settings regulated by the PCSX2 core virtual machine."
-msgstr "Změnit nastavení emulace hardwaru, regulované jádrem virtuálního stroje PCSX2."
+msgid ""
+"Modify hardware emulation settings regulated by the PCSX2 core virtual "
+"machine."
+msgstr ""
+"Změnit nastavení emulace hardwaru, regulované jádrem virtuálního stroje "
+"PCSX2."
#: pcsx2/gui/MainFrame.cpp:711
msgid "Window Settings..."
@@ -1456,8 +1567,7 @@ msgstr "Potvrdit změnu obrazu ISO"
msgid "Do you want to swap discs or boot the new image (via system reset)?"
msgstr "Chcete vyměnit disky nebo zavést nový obraz (přes reset systému)?"
-#: pcsx2/gui/MainMenuClicks.cpp:148
-#: pcsx2/gui/MainMenuClicks.cpp:194
+#: pcsx2/gui/MainMenuClicks.cpp:148 pcsx2/gui/MainMenuClicks.cpp:194
msgid "Swap Disc"
msgstr "Vyměnit Disk"
@@ -1489,8 +1599,7 @@ msgstr "Obrazy Disku (%s)"
msgid "Blockdumps (%s)"
msgstr "Výpisy bloků (%s)"
-#: pcsx2/gui/MainMenuClicks.cpp:270
-#: pcsx2/gui/MainMenuClicks.cpp:291
+#: pcsx2/gui/MainMenuClicks.cpp:270 pcsx2/gui/MainMenuClicks.cpp:291
msgid "All Files (*.*)"
msgstr "Všechny soubory (*.*)"
@@ -1511,8 +1620,12 @@ msgid "An error occurred while trying to open the file:"
msgstr "Vyskytla se chyba při pokusu o otevření souboru:"
#: pcsx2/gui/MainMenuClicks.cpp:319
-msgid "Error: The configured ISO file does not exist. Click OK to select a new ISO source for CDVD."
-msgstr "Chyba: Nastavený soubor ISO neexistuje. Klikněte na OK pro vybrání nového zdroje ISO pro CDVD."
+msgid ""
+"Error: The configured ISO file does not exist. Click OK to select a new ISO "
+"source for CDVD."
+msgstr ""
+"Chyba: Nastavený soubor ISO neexistuje. Klikněte na OK pro vybrání nového "
+"zdroje ISO pro CDVD."
#: pcsx2/gui/MainMenuClicks.cpp:390
msgid ""
@@ -1577,8 +1690,12 @@ msgid "Select folder with PS2 BIOS roms"
msgstr "Vyberte adresář s romy BIOSu PS2"
#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:111
-msgid "Click the Browse button to select a different folder where PCSX2 will look for PS2 BIOS roms."
-msgstr "Klikněte na tlačítko Procházet pro vybrání jiného adresáře, kde bude PCSX2 hledat romy BIOSu PS2."
+msgid ""
+"Click the Browse button to select a different folder where PCSX2 will look "
+"for PS2 BIOS roms."
+msgstr ""
+"Klikněte na tlačítko Procházet pro vybrání jiného adresáře, kde bude PCSX2 "
+"hledat romy BIOSu PS2."
#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:113
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:156
@@ -1622,8 +1739,7 @@ msgstr "Žádný"
msgid "EE/FPU Advanced Recompiler Options"
msgstr "EE/MKO Pokročilé Možnosti Rekompilátoru"
-#: pcsx2/gui/Panels/CpuPanel.cpp:87
-#: pcsx2/gui/Panels/CpuPanel.cpp:102
+#: pcsx2/gui/Panels/CpuPanel.cpp:87 pcsx2/gui/Panels/CpuPanel.cpp:102
msgid "Extra + Preserve Sign"
msgstr "Extra + Zachovat Znaménko"
@@ -1639,8 +1755,7 @@ msgstr "VJ0 / VJ1 Pokročilé Volby Rekompilátoru"
msgid "Extra"
msgstr "Extra"
-#: pcsx2/gui/Panels/CpuPanel.cpp:117
-#: pcsx2/gui/Panels/CpuPanel.cpp:126
+#: pcsx2/gui/Panels/CpuPanel.cpp:117 pcsx2/gui/Panels/CpuPanel.cpp:126
#: pcsx2/gui/Panels/CpuPanel.cpp:184
msgid "Interpreter"
msgstr "Převaděč"
@@ -1649,22 +1764,27 @@ msgstr "Převaděč"
msgid "Quite possibly the slowest thing in the universe."
msgstr "Dost možná ta nejpomalejší věc ve vesmíru."
-#: pcsx2/gui/Panels/CpuPanel.cpp:120
-#: pcsx2/gui/Panels/CpuPanel.cpp:129
+#: pcsx2/gui/Panels/CpuPanel.cpp:120 pcsx2/gui/Panels/CpuPanel.cpp:129
msgid "Recompiler"
msgstr "Rekompilátor"
#: pcsx2/gui/Panels/CpuPanel.cpp:121
-msgid "Performs just-in-time binary translation of 64-bit MIPS-IV machine code to x86."
-msgstr "Provádí binární překlad 'za běhu' 64 bitového strojového kódu MIPS-IV do x86."
+msgid ""
+"Performs just-in-time binary translation of 64-bit MIPS-IV machine code to "
+"x86."
+msgstr ""
+"Provádí binární překlad 'za běhu' 64 bitového strojového kódu MIPS-IV do x86."
#: pcsx2/gui/Panels/CpuPanel.cpp:127
msgid "Pretty slow; provided for diagnostic purposes only."
msgstr "Pěkně pomalý; poskytnutý pouze pro diagnostické účely."
#: pcsx2/gui/Panels/CpuPanel.cpp:130
-msgid "Performs just-in-time binary translation of 32-bit MIPS-I machine code to x86."
-msgstr "Provádí binární překlad 'za běhu' 32 bitového strojového kódu MIPS-I do x86."
+msgid ""
+"Performs just-in-time binary translation of 32-bit MIPS-I machine code to "
+"x86."
+msgstr ""
+"Provádí binární překlad 'za běhu' 32 bitového strojového kódu MIPS-I do x86."
#: pcsx2/gui/Panels/CpuPanel.cpp:154
msgid "Enable EE Cache (Slower)"
@@ -1674,31 +1794,40 @@ msgstr "Povolit Vyr. Paměť EE (Pomalejší)"
msgid "Interpreter only; provided for diagnostic"
msgstr "Pouze převaděč; pro diagnostické účely"
-#: pcsx2/gui/Panels/CpuPanel.cpp:170
-#: pcsx2/gui/Panels/CpuPanel.cpp:223
+#: pcsx2/gui/Panels/CpuPanel.cpp:170 pcsx2/gui/Panels/CpuPanel.cpp:223
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:110
msgid "Restore Defaults"
msgstr "Obnovit Výchozí"
#: pcsx2/gui/Panels/CpuPanel.cpp:185
-msgid "Vector Unit Interpreter. Slow and not very compatible. Only use for diagnostics."
-msgstr "Převaděč Vektorové Jednotky. Pomalý a ne moc kompatibilní. Používaný pouze pro diagnostiku."
+msgid ""
+"Vector Unit Interpreter. Slow and not very compatible. Only use for "
+"diagnostics."
+msgstr ""
+"Převaděč Vektorové Jednotky. Pomalý a ne moc kompatibilní. Používaný pouze "
+"pro diagnostiku."
#: pcsx2/gui/Panels/CpuPanel.cpp:187
msgid "microVU Recompiler"
msgstr "Rekompilátor mikroVJ"
#: pcsx2/gui/Panels/CpuPanel.cpp:188
-msgid "New Vector Unit recompiler with much improved compatibility. Recommended."
-msgstr "Nový rekompilátor Vektorové Jednotky s mnohem lepší kompatibilitou. Doporučeno."
+msgid ""
+"New Vector Unit recompiler with much improved compatibility. Recommended."
+msgstr ""
+"Nový rekompilátor Vektorové Jednotky s mnohem lepší kompatibilitou. "
+"Doporučeno."
#: pcsx2/gui/Panels/CpuPanel.cpp:190
msgid "superVU Recompiler [legacy]"
msgstr "Rekompilátor superVJ [zastaralé]"
#: pcsx2/gui/Panels/CpuPanel.cpp:191
-msgid "Useful for diagnosing bugs or clamping issues in the new mVU recompiler."
-msgstr "Užitečné pro zjišťování chyb nebo problémů s upnutím v novém mVJ rekompilátoru."
+msgid ""
+"Useful for diagnosing bugs or clamping issues in the new mVU recompiler."
+msgstr ""
+"Užitečné pro zjišťování chyb nebo problémů s upnutím v novém mVJ "
+"rekompilátoru."
#: pcsx2/gui/Panels/DirPickerPanel.cpp:64
msgid "Path does not exist"
@@ -1759,7 +1888,9 @@ msgstr "Čekat na Vsynch při obnově"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:51
msgid "Dynamically toggle Vsync depending on frame rate (read tooltip!)"
-msgstr "Dynamicky přepínat Vsynch v závislosti na snímkové frekvenci (přečtěte si popisek!)"
+msgstr ""
+"Dynamicky přepínat Vsynch v závislosti na snímkové frekvenci (přečtěte si "
+"popisek!)"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:52
msgid "Double-click toggles fullscreen mode"
@@ -1778,8 +1909,12 @@ msgid "Zoom:"
msgstr "Přiblížení:"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:196
-msgid "Invalid window dimensions specified: Size cannot contain non-numeric digits! >_<"
-msgstr "Zadány neplatné rozměry okna: Velikost nemůže obsahovat nečíselné číslice! >_<"
+msgid ""
+"Invalid window dimensions specified: Size cannot contain non-numeric digits! "
+">_<"
+msgstr ""
+"Zadány neplatné rozměry okna: Velikost nemůže obsahovat nečíselné číslice! "
+">_<"
#: pcsx2/gui/Panels/GameDatabasePanel.cpp:334
msgid "Search"
@@ -1808,7 +1943,8 @@ msgstr ""
#: pcsx2/gui/Panels/GameFixesPanel.cpp:42
msgid "VU Clip Flag Hack - For Persona games (SuperVU recompiler only!)"
-msgstr "Hack Příznaku Sevření VJ - Pro hry Persona (pouze rekompilátor superVJ)"
+msgstr ""
+"Hack Příznaku Sevření VJ - Pro hry Persona (pouze rekompilátor superVJ)"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:46
msgid "FPU Compare Hack - For Digimon Rumble Arena 2."
@@ -1835,12 +1971,17 @@ msgid "EE timing hack - Multi purpose hack. Try if all else fails."
msgstr "Hack časování EE - Víceúčelový hack. Zkuste, pokud vše ostatní selže."
#: pcsx2/gui/Panels/GameFixesPanel.cpp:75
-msgid "Skip MPEG hack - Skips videos/FMVs in games to avoid game hanging/freezes."
-msgstr "Hack přeskočení MPEG - Přeskočí videa/FMV v hrách k zabránění zaseknutí/zamrznutí her."
+msgid ""
+"Skip MPEG hack - Skips videos/FMVs in games to avoid game hanging/freezes."
+msgstr ""
+"Hack přeskočení MPEG - Přeskočí videa/FMV v hrách k zabránění zaseknutí/"
+"zamrznutí her."
#: pcsx2/gui/Panels/GameFixesPanel.cpp:79
msgid "OPH Flag hack - Try if your game freezes showing the same frame."
-msgstr "Hack Příznaku OPH - Zkuste, pokud se Vaše hra zasekne a zobrazuje stejný snímek."
+msgstr ""
+"Hack Příznaku OPH - Zkuste, pokud se Vaše hra zasekne a zobrazuje stejný "
+"snímek."
#: pcsx2/gui/Panels/GameFixesPanel.cpp:88
msgid "Ignore DMAC writes when it is busy."
@@ -1863,20 +2004,31 @@ msgid "Enable manual game fixes [Not recommended]"
msgstr "Povolit ruční záplaty her [Nedoporučeno]"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:127
-msgid "The safest way to make sure that all game fixes are completely disabled."
-msgstr "Nejbezpečnější způsob, jak se ujistit, že všechny záplaty her jsou úplně vypnuté."
+msgid ""
+"The safest way to make sure that all game fixes are completely disabled."
+msgstr ""
+"Nejbezpečnější způsob, jak se ujistit, že všechny záplaty her jsou úplně "
+"vypnuté."
#: pcsx2/gui/Panels/LogOptionsPanels.cpp:249
msgid "Enable Trace Logging"
msgstr "Povolit Záznam Sledování"
#: pcsx2/gui/Panels/LogOptionsPanels.cpp:250
-msgid "Trace logs are all written to emulog.txt. Toggle trace logging at any time using F10."
-msgstr "Záznamy sledování jsou všechny zapisovány do emulog.txt. Přepnout záznam sledování můžete kdykoli použitím F10."
+msgid ""
+"Trace logs are all written to emulog.txt. Toggle trace logging at any time "
+"using F10."
+msgstr ""
+"Záznamy sledování jsou všechny zapisovány do emulog.txt. Přepnout záznam "
+"sledování můžete kdykoli použitím F10."
#: pcsx2/gui/Panels/LogOptionsPanels.cpp:251
-msgid "Warning: Enabling trace logs is typically very slow, and is a leading cause of 'What happened to my FPS?' problems. :)"
-msgstr "Varování: Zapnutí sledování záznamu je obyčejně velmi pomalé, a je to hlavní důvod v problémech s 'Co se stalo s mými SZS?'. :)"
+msgid ""
+"Warning: Enabling trace logs is typically very slow, and is a leading cause "
+"of 'What happened to my FPS?' problems. :)"
+msgstr ""
+"Varování: Zapnutí sledování záznamu je obyčejně velmi pomalé, a je to hlavní "
+"důvod v problémech s 'Co se stalo s mými SZS?'. :)"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:151
msgid "Select folder with PS2 memory cards"
@@ -1936,7 +2088,8 @@ msgstr "Smazat"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:545
msgid "Permanently delete this memory card from disk (all contents are lost)"
-msgstr "Natrvalo smazat tuto paměťovou kartu z disku (veškerý obsah bude ztracen)"
+msgstr ""
+"Natrvalo smazat tuto paměťovou kartu z disku (veškerý obsah bude ztracen)"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:547
msgid "Create a new memory card and assign it to this Port."
@@ -2113,8 +2266,12 @@ msgid "Custom folder:"
msgstr "Vlastní adresář:"
#: pcsx2/gui/Panels/MiscPanelStuff.cpp:57
-msgid "This setting may require administration privileges from your operating system, depending on how your system is configured."
-msgstr "Toto nastavení může vyžadovat administrátorské výsady od Vašeho operačního systému, v závislosti na tom, jak je Váš systém nastaven."
+msgid ""
+"This setting may require administration privileges from your operating "
+"system, depending on how your system is configured."
+msgstr ""
+"Toto nastavení může vyžadovat administrátorské výsady od Vašeho operačního "
+"systému, v závislosti na tom, jak je Váš systém nastaven."
#: pcsx2/gui/Panels/MiscPanelStuff.cpp:66
#, c-format
@@ -2183,7 +2340,9 @@ msgstr "Nastavit..."
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:379
msgid "Click the Browse button to select a different folder for PCSX2 plugins."
-msgstr "Klikněte na tlačítko Procházet k vybrání jiného adresáře pro zásuvné moduly PCSX2."
+msgstr ""
+"Klikněte na tlačítko Procházet k vybrání jiného adresáře pro zásuvné moduly "
+"PCSX2."
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:481
#, c-format
@@ -2212,12 +2371,19 @@ msgid "Enable speedhacks"
msgstr "Povolit hacky rychlosti"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:102
-msgid "A safe and easy way to make sure that all speedhacks are completely disabled."
-msgstr "Bezpečný a jednoduchý způsob, jak se ujistit, že všechny hacky rychlosti jsou úplně zakázané."
+msgid ""
+"A safe and easy way to make sure that all speedhacks are completely disabled."
+msgstr ""
+"Bezpečný a jednoduchý způsob, jak se ujistit, že všechny hacky rychlosti "
+"jsou úplně zakázané."
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:111
-msgid "Resets all speedhack options to their defaults, which consequently turns them all OFF."
-msgstr "Resetuje všechny volby hacků rychlosti na jejich výchozí hodnoty, což následně všechny VYPNE."
+msgid ""
+"Resets all speedhack options to their defaults, which consequently turns "
+"them all OFF."
+msgstr ""
+"Resetuje všechny volby hacků rychlosti na jejich výchozí hodnoty, což "
+"následně všechny VYPNE."
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:120
msgid "EE Cyclerate [Not Recommended]"
@@ -2236,50 +2402,56 @@ msgid "mVU Flag Hack"
msgstr "Hack Příznaku mVJ"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:164
-msgid "Good Speedup and High Compatibility; may cause bad graphics... [Recommended]"
-msgstr "Dobré Zrychlení a Vysoká Kompatibilita; může způsobit grafické chyby... [Doporučeno]"
+msgid ""
+"Good Speedup and High Compatibility; may cause bad graphics... [Recommended]"
+msgstr ""
+"Dobré Zrychlení a Vysoká Kompatibilita; může způsobit grafické chyby... "
+"[Doporučeno]"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:166
-msgid "mVU Block Hack"
-msgstr "Hack Bloku mVJ"
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
-msgid "Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
-msgstr "Dobré Zrychlení a Vysoká Kompatibilita; může způsobit grafické chyby, SŠP, atd..."
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "MTVU (Multi-Threaded microVU1)"
msgstr "VVVJ (Vícevláknová mikroVJ1)"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:170
-msgid "Good Speedup and High Compatibility; may cause hanging... [Recommended if 3+ cores]"
-msgstr "Dobré Zrychlení a Vysoká Kompatibilita; může způsobit zaseknutí... [Doporučeno při 3+ více jádrech]"
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
+msgid ""
+"Good Speedup and High Compatibility; may cause hanging... [Recommended if 3+ "
+"cores]"
+msgstr ""
+"Dobré Zrychlení a Vysoká Kompatibilita; může způsobit zaseknutí... "
+"[Doporučeno při 3+ více jádrech]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:183
msgid "Other Hacks"
msgstr "Jiné Hacky"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:193
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:185
msgid "Enable INTC Spin Detection"
msgstr "Povolit Zjišťování Otáčení KPŘE"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:194
-msgid "Huge speedup for some games, with almost no compatibility side effects. [Recommended]"
-msgstr "Velké zrychlení v některých hrách bez jakýchkoliv vedlejších účinků na kompatibilitu. [Doporučeno]"
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:186
+msgid ""
+"Huge speedup for some games, with almost no compatibility side effects. "
+"[Recommended]"
+msgstr ""
+"Velké zrychlení v některých hrách bez jakýchkoliv vedlejších účinků na "
+"kompatibilitu. [Doporučeno]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:196
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:188
msgid "Enable Wait Loop Detection"
msgstr "Povolit Zjištění Čekací Smyčky"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:197
-msgid "Moderate speedup for some games, with no known side effects. [Recommended]"
-msgstr "Mírné zrychlení v některých hrách bez žádných známých vedlejších účinků. [Doporučeno]"
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:189
+msgid ""
+"Moderate speedup for some games, with no known side effects. [Recommended]"
+msgstr ""
+"Mírné zrychlení v některých hrách bez žádných známých vedlejších účinků. "
+"[Doporučeno]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:199
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
msgid "Enable fast CDVD"
msgstr "Zapnout rychlé CDVD"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:192
msgid "Fast disc access, less loading times. [Not Recommended]"
msgstr "Rychlý přístup k disku, menší doba nahrávání. [Nedoporučeno]"
@@ -2292,8 +2464,12 @@ msgid "Select folder containing PCSX2 visual themes"
msgstr "Vyberte adresář obsahující grafické vzhledy PCSX2"
#: pcsx2/gui/Panels/ThemeSelectorPanel.cpp:45
-msgid "Click the Browse button to select a different folder containing PCSX2 visual themes."
-msgstr "Klikněte na tlačítko Procházet pro vybrání jiného adresáře obsahující grafické vzhledy PCSX2."
+msgid ""
+"Click the Browse button to select a different folder containing PCSX2 visual "
+"themes."
+msgstr ""
+"Klikněte na tlačítko Procházet pro vybrání jiného adresáře obsahující "
+"grafické vzhledy PCSX2."
#: pcsx2/gui/Panels/ThemeSelectorPanel.cpp:49
msgid "Select a visual theme:"
@@ -2304,8 +2480,11 @@ msgid "Disable Framelimiting"
msgstr "Vypnout Omezování Snímků"
#: pcsx2/gui/Panels/VideoPanel.cpp:35
-msgid "Useful for running benchmarks. Toggle this option in-game by pressing F4."
-msgstr "Užitečné pro spuštění zatěžovacích testů. Tuto možnost přepínáte ve hře stiskem F4."
+msgid ""
+"Useful for running benchmarks. Toggle this option in-game by pressing F4."
+msgstr ""
+"Užitečné pro spuštění zatěžovacích testů. Tuto možnost přepínáte ve hře "
+"stiskem F4."
#: pcsx2/gui/Panels/VideoPanel.cpp:61
msgid "Base Framerate Adjust:"
@@ -2323,8 +2502,7 @@ msgstr "Turbo Úprava:"
msgid "NTSC Framerate:"
msgstr "Frekvence Snímků NTSC:"
-#: pcsx2/gui/Panels/VideoPanel.cpp:91
-#: pcsx2/gui/Panels/VideoPanel.cpp:97
+#: pcsx2/gui/Panels/VideoPanel.cpp:91 pcsx2/gui/Panels/VideoPanel.cpp:97
msgid "FPS"
msgstr "SZS"
@@ -2332,94 +2510,132 @@ msgstr "SZS"
msgid "PAL Framerate:"
msgstr "Frekvence Snímků PAL:"
-#: pcsx2/gui/Panels/VideoPanel.cpp:162
-msgid "Error while parsing either NTSC or PAL framerate settings. Settings must be valid floating point numerics."
-msgstr "Chyba při analýze nastavení snímkovací frekvence NTSC nebo PAL. Nastavení musí být platná čísla s plovoucí čárkou."
+#: pcsx2/gui/Panels/VideoPanel.cpp:166
+msgid ""
+"Error while parsing either NTSC or PAL framerate settings. Settings must be "
+"valid floating point numerics."
+msgstr ""
+"Chyba při analýze nastavení snímkovací frekvence NTSC nebo PAL. Nastavení "
+"musí být platná čísla s plovoucí čárkou."
-#: pcsx2/gui/Panels/VideoPanel.cpp:180
+#: pcsx2/gui/Panels/VideoPanel.cpp:184
msgid "Disabled [default]"
msgstr "Vypnuto [výchozí]"
-#: pcsx2/gui/Panels/VideoPanel.cpp:184
+#: pcsx2/gui/Panels/VideoPanel.cpp:188
msgid "Skip when on Turbo only (TAB to enable)"
msgstr "Přeskočit pouze když je použito Turbo (TAB pro zapnutí)"
-#: pcsx2/gui/Panels/VideoPanel.cpp:188
+#: pcsx2/gui/Panels/VideoPanel.cpp:192
msgid "Constant skipping"
msgstr "Neustálé přeskakování"
-#: pcsx2/gui/Panels/VideoPanel.cpp:190
-msgid "Normal and Turbo limit rates skip frames. Slow motion mode will still disable frameskipping."
-msgstr "Normální a Turbo omezují množství přeskočených snímků. Režim zpomaleného pohybu přesto vypne přeskakování snímků."
+#: pcsx2/gui/Panels/VideoPanel.cpp:194
+msgid ""
+"Normal and Turbo limit rates skip frames. Slow motion mode will still "
+"disable frameskipping."
+msgstr ""
+"Normální a Turbo omezují množství přeskočených snímků. Režim zpomaleného "
+"pohybu přesto vypne přeskakování snímků."
-#: pcsx2/gui/Panels/VideoPanel.cpp:213
+#: pcsx2/gui/Panels/VideoPanel.cpp:217
msgid "Frames to Draw"
msgstr "Snímky na Vykreslení"
-#: pcsx2/gui/Panels/VideoPanel.cpp:218
+#: pcsx2/gui/Panels/VideoPanel.cpp:222
msgid "Frames to Skip"
msgstr "Snímky na Přeskočení"
-#: pcsx2/gui/Panels/VideoPanel.cpp:294
+#: pcsx2/gui/Panels/VideoPanel.cpp:298
msgid "Use Synchronized MTGS"
msgstr "Použít Synchronizovaný VVGS"
-#: pcsx2/gui/Panels/VideoPanel.cpp:295
-msgid "For troubleshooting potential bugs in the MTGS only, as it is potentially very slow."
-msgstr "Pouze pro řešení možných chyb v VVGS, protože je toto potenciálně velmi pomalé."
+#: pcsx2/gui/Panels/VideoPanel.cpp:299
+msgid ""
+"For troubleshooting potential bugs in the MTGS only, as it is potentially "
+"very slow."
+msgstr ""
+"Pouze pro řešení možných chyb v VVGS, protože je toto potenciálně velmi "
+"pomalé."
-#: pcsx2/gui/Panels/VideoPanel.cpp:298
+#: pcsx2/gui/Panels/VideoPanel.cpp:302
msgid "Disable all GS output"
msgstr "Zakázat všechen výstup GS"
-#: pcsx2/gui/Panels/VideoPanel.cpp:299
-msgid "Completely disables all GS plugin activity; ideal for benchmarking EEcore components."
-msgstr "Úplně zakáže jakoukoli aktivitu zásuvného modulu GS; ideální pro měření výkonu hlavních součástí EE."
+#: pcsx2/gui/Panels/VideoPanel.cpp:303
+msgid ""
+"Completely disables all GS plugin activity; ideal for benchmarking EEcore "
+"components."
+msgstr ""
+"Úplně zakáže jakoukoli aktivitu zásuvného modulu GS; ideální pro měření "
+"výkonu hlavních součástí EE."
-#: pcsx2/gui/Panels/VideoPanel.cpp:316
+#: pcsx2/gui/Panels/VideoPanel.cpp:320
msgid "Frame Skipping"
msgstr "Přeskakování Snímků"
-#: pcsx2/gui/Panels/VideoPanel.cpp:319
+#: pcsx2/gui/Panels/VideoPanel.cpp:323
msgid "Framelimiter"
msgstr "Omezovač Snímků"
#: pcsx2/gui/SysState.cpp:283
-msgid "Cannot load this savestate. The state is from an incompatible edition of PCSX2 that is either newer than this version, or is no longer supported."
-msgstr "Nelze načíst tento uložený stav. Stav je z nekompatibilní edice PCSX2, která je buď novější než tato, nebo už není podporována."
+msgid ""
+"Cannot load this savestate. The state is from an incompatible edition of "
+"PCSX2 that is either newer than this version, or is no longer supported."
+msgstr ""
+"Nelze načíst tento uložený stav. Stav je z nekompatibilní edice PCSX2, která "
+"je buď novější než tato, nebo už není podporována."
#: pcsx2/gui/SysState.cpp:290
-msgid "Cannot load this savestate. The state is an unsupported version, likely created by a newer edition of PCSX2."
-msgstr "Nelze načíst tento uložený stav. Stav je z nepodporované verze, pravděpodobně vytvořen novou edicí PCSX2."
+msgid ""
+"Cannot load this savestate. The state is an unsupported version, likely "
+"created by a newer edition of PCSX2."
+msgstr ""
+"Nelze načíst tento uložený stav. Stav je z nepodporované verze, "
+"pravděpodobně vytvořen novou edicí PCSX2."
#: pcsx2/gui/SysState.cpp:326
msgid "There is no active virtual machine state to download or save."
msgstr "Neexistuje žádný stav virtuálního stroje k načtení nebo uložení."
#: pcsx2/gui/SysState.cpp:520
-msgid "This savestate cannot be loaded because it is not a valid gzip archive. It may have been created by an older unsupported version of PCSX2, or it may be corrupted."
-msgstr "Uložený stav nemůže být nahrán, protože to není platný archiv gzip. Mohl být vytvořen starší nepodporovanou verzí PCSX2 nebo může být poškozen."
+msgid ""
+"This savestate cannot be loaded because it is not a valid gzip archive. It "
+"may have been created by an older unsupported version of PCSX2, or it may be "
+"corrupted."
+msgstr ""
+"Uložený stav nemůže být nahrán, protože to není platný archiv gzip. Mohl být "
+"vytvořen starší nepodporovanou verzí PCSX2 nebo může být poškozen."
#: pcsx2/gui/SysState.cpp:579
msgid "This file is not a valid PCSX2 savestate. See the logfile for details."
-msgstr "Tento soubor není platný uložený stav PCSX2. Podívejte se na soubor se záznamem pro podrobnosti."
+msgstr ""
+"Tento soubor není platný uložený stav PCSX2. Podívejte se na soubor se "
+"záznamem pro podrobnosti."
#: pcsx2/gui/SysState.cpp:598
-msgid "This savestate cannot be loaded due to missing critical components. See the log file for details."
-msgstr "Uložený stav nemůže být nahrán kvůli chybějícím důležitým součástem. Prohlédněte si záznam pro podrobnosti."
+msgid ""
+"This savestate cannot be loaded due to missing critical components. See the "
+"log file for details."
+msgstr ""
+"Uložený stav nemůže být nahrán kvůli chybějícím důležitým součástem. "
+"Prohlédněte si záznam pro podrobnosti."
#: pcsx2/gui/i18n.cpp:63
msgid " (default)"
msgstr " (výchozí)"
-#: pcsx2/ps2/BiosTools.cpp:83
-#: pcsx2/ps2/BiosTools.cpp:151
+#: pcsx2/ps2/BiosTools.cpp:83 pcsx2/ps2/BiosTools.cpp:151
msgid "The selected BIOS file is not a valid PS2 BIOS. Please re-configure."
msgstr "Vybraný soubor BIOSu není platný BIOS PS2. Prosím nastavte znovu."
#: pcsx2/ps2/BiosTools.cpp:244
-msgid "The PS2 BIOS could not be loaded. The BIOS has not been configured, or the configuration has been corrupted. Please re-configure."
-msgstr "BIOS PS2 nemohl nýt načten. BIOS nebyl nastaven nebo bylo nastavení poškozeno. Nastavte prosím znovu."
+msgid ""
+"The PS2 BIOS could not be loaded. The BIOS has not been configured, or the "
+"configuration has been corrupted. Please re-configure."
+msgstr ""
+"BIOS PS2 nemohl nýt načten. BIOS nebyl nastaven nebo bylo nastavení "
+"poškozeno. Nastavte prosím znovu."
#: pcsx2/ps2/BiosTools.cpp:251
msgid "The configured BIOS file does not exist. Please re-configure."
@@ -2427,13 +2643,30 @@ msgstr "Nastavený soubor BIOSu neexistuje. Prosím nastavte znovu."
#: pcsx2/x86/ix86-32/iR5900-32.cpp:578
#, c-format
-msgid "%s Extensions not found. The R5900-32 recompiler requires a host CPU with MMX, SSE, and SSE2 extensions."
-msgstr "Rozšíření %s nenalezeno. Rekompilátor R5900-32 potřebuje hostitelský procesor s rozšířením MMX, SSE, a SSE2."
+msgid ""
+"%s Extensions not found. The R5900-32 recompiler requires a host CPU with "
+"MMX, SSE, and SSE2 extensions."
+msgstr ""
+"Rozšíření %s nenalezeno. Rekompilátor R5900-32 potřebuje hostitelský "
+"procesor s rozšířením MMX, SSE, a SSE2."
#: pcsx2/x86/microVU.cpp:28
#, c-format
-msgid "%s Extensions not found. microVU requires a host CPU with MMX, SSE, and SSE2 extensions."
-msgstr "Rozšíření %s nenalezeno. mikroVJ vyžaduje, aby hostitelský procesor měl rozšíření MMX, SSE, a SSE2."
+msgid ""
+"%s Extensions not found. microVU requires a host CPU with MMX, SSE, and "
+"SSE2 extensions."
+msgstr ""
+"Rozšíření %s nenalezeno. mikroVJ vyžaduje, aby hostitelský procesor měl "
+"rozšíření MMX, SSE, a SSE2."
+
+#~ msgid "mVU Block Hack"
+#~ msgstr "Hack Bloku mVJ"
+
+#~ msgid ""
+#~ "Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
+#~ msgstr ""
+#~ "Dobré Zrychlení a Vysoká Kompatibilita; může způsobit grafické chyby, "
+#~ "SŠP, atd..."
#~ msgid "ISO mounting failed: PCSX2 is unable to identify the ISO image type."
#~ msgstr "Připojení ISO selhalo: PCSX2 nedokáže rozpoznat typ obrazu ISO."
diff --git a/locales/de_DE/pcsx2_Iconized.po b/locales/de_DE/pcsx2_Iconized.po
index 415638139..81ee6a88d 100644
--- a/locales/de_DE/pcsx2_Iconized.po
+++ b/locales/de_DE/pcsx2_Iconized.po
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-09-28 20:27+0200\n"
+"POT-Creation-Date: 2012-04-07 11:42+0200\n"
"PO-Revision-Date: 2011-04-09 01:11+0100\n"
"Last-Translator: \n"
"Language-Team: PCSX2\n"
@@ -24,7 +24,7 @@ msgstr ""
"Es steht nicht genügend virtueller Speicher zur Verfügung bzw. der Speicher "
"wird von anderen Programmen / DLLs belegt."
-#: pcsx2/CDVD/CDVD.cpp:385
+#: pcsx2/CDVD/CDVD.cpp:389
msgid "!Notice:PsxDisc"
msgstr "PlayStation 1 (PSX) Spiele werden von PCSX2 noch nicht unterstützt!"
@@ -361,28 +361,24 @@ msgstr ""
"\"Stiehlt\" der PS2 CPU einige Zyklen bei jeder VU Programmausführung. "
"Geschwindigkeitsgewinn bei reduzierter Kompatibilität."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:172
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "!ContextTip:Speedhacks:vuFlagHack"
msgstr "Lässt einige VU Statusflags aus. Sicher."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:177
-msgid "!ContextTip:Speedhacks:vuBlockHack"
-msgstr "Kann die Geschwindigkeit leicht erhöhen. In FFX kontraproduktiv!"
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:182
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:174
#, fuzzy
msgid "!ContextTip:Speedhacks:vuThread"
msgstr "Funktioniert nicht mit Gran Turismo 4 oder Tekken 5."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:203
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:195
msgid "!ContextTip:Speedhacks:INTC"
msgstr "Kann gefahrlos aktiviert werden."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:208
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
msgid "!ContextTip:Speedhacks:BIFC0"
msgstr "Kann gefahrlos aktiviert werden."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:215
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:207
msgid "!ContextTip:Speedhacks:fastCDVD"
msgstr ""
"Einige Spiele erwarten ein standardkonformes (langsam lesendes) DVD "
@@ -394,17 +390,17 @@ msgstr ""
"Deaktiviert den Framelimiter. Das Spiel läuft so schnell wie es dein Rechner "
"ermöglicht."
-#: pcsx2/gui/Panels/VideoPanel.cpp:223
+#: pcsx2/gui/Panels/VideoPanel.cpp:227
msgid "!Panel:Frameskip:Heading"
msgstr ""
"Aufgrund des spezifischen Designs der PS2 ist ein akkurates Frameskipping "
"nicht möglich. Versuche die Werte anzupassen oder benutze Speedhacks."
-#: pcsx2/gui/Panels/VideoPanel.cpp:302
+#: pcsx2/gui/Panels/VideoPanel.cpp:306
msgid "!ContextTip:GS:SyncMTGS"
msgstr "Nur für das Debugging aktivieren. Sehr langsam."
-#: pcsx2/gui/Panels/VideoPanel.cpp:306
+#: pcsx2/gui/Panels/VideoPanel.cpp:310
msgid "!ContextTip:GS:DisableOutput"
msgstr ""
"Entfernt störende Faktoren von der Grafikkarte oder Treiberproblemen. Nur "
@@ -422,6 +418,9 @@ msgstr ""
"Der SuperVU Recompiler konnte nicht genügend virtuellen Speicher allokieren. "
"Versuche es mit microVU!"
+#~ msgid "!ContextTip:Speedhacks:vuBlockHack"
+#~ msgstr "Kann die Geschwindigkeit leicht erhöhen. In FFX kontraproduktiv!"
+
#~ msgid "No reason given."
#~ msgstr "Kein Grund angegeben."
diff --git a/locales/de_DE/pcsx2_Main.po b/locales/de_DE/pcsx2_Main.po
index 0952644c6..6b224a343 100644
--- a/locales/de_DE/pcsx2_Main.po
+++ b/locales/de_DE/pcsx2_Main.po
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-09-28 20:27+0200\n"
+"POT-Creation-Date: 2012-02-28 12:20+0100\n"
"PO-Revision-Date: 2011-04-09 01:44+0100\n"
"Last-Translator: \n"
"Language-Team: PCSX2\n"
@@ -185,7 +185,7 @@ msgstr "Internes Memory Card Plugin konnte nicht Initialisiert werden."
msgid "Unloaded Plugin"
msgstr "Plugin entladen"
-#: pcsx2/SaveState.cpp:339
+#: pcsx2/SaveState.cpp:342
msgid "Cannot load savestate. It is of an unknown or unsupported version."
msgstr ""
"Kann Savestate nicht laden. Er ist von einer unbekannten, nicht "
@@ -340,31 +340,31 @@ msgstr ""
"Der Savestate wurde nicht korrekt gespeichert. Die temporäre Datei konnte "
"zwar erstellt, aber nicht an den finalen Platz kopiert werden."
-#: pcsx2/gui/AppConfig.cpp:837
+#: pcsx2/gui/AppConfig.cpp:842
msgid "Safest"
msgstr "Sicher"
-#: pcsx2/gui/AppConfig.cpp:838
+#: pcsx2/gui/AppConfig.cpp:843
msgid "Safe (faster)"
msgstr "Sicher (schneller)"
-#: pcsx2/gui/AppConfig.cpp:839
+#: pcsx2/gui/AppConfig.cpp:844
msgid "Balanced"
msgstr "Ausbalanciert"
-#: pcsx2/gui/AppConfig.cpp:840
+#: pcsx2/gui/AppConfig.cpp:845
msgid "Aggressive"
msgstr "Aggressiv"
-#: pcsx2/gui/AppConfig.cpp:841
+#: pcsx2/gui/AppConfig.cpp:846
msgid "Aggressive plus"
msgstr "Aggressiv Plus"
-#: pcsx2/gui/AppConfig.cpp:842
+#: pcsx2/gui/AppConfig.cpp:847
msgid "Mostly Harmful"
msgstr "Maximum"
-#: pcsx2/gui/AppConfig.cpp:999 pcsx2/gui/AppConfig.cpp:1005
+#: pcsx2/gui/AppConfig.cpp:1007 pcsx2/gui/AppConfig.cpp:1013
msgid "Failed to overwrite existing settings file; permission was denied."
msgstr ""
"Konnte existierende Konfigurationsdatei nicht überschreiben. Zugriff "
@@ -2374,35 +2374,25 @@ msgid ""
msgstr "Guter FPS Anstieg, gute Kompatibilität [empfohlen]"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:166
-msgid "mVU Block Hack"
-msgstr "mVU Block Hack"
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
-#, fuzzy
-msgid ""
-"Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
-msgstr "Guter FPS Anstieg, gute Kompatibilität [empfohlen]"
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "MTVU (Multi-Threaded microVU1)"
msgstr ""
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:170
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
#, fuzzy
msgid ""
"Good Speedup and High Compatibility; may cause hanging... [Recommended if 3+ "
"cores]"
msgstr "Guter FPS Anstieg, gute Kompatibilität [empfohlen]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:183
msgid "Other Hacks"
msgstr "Andere Hacks"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:193
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:185
msgid "Enable INTC Spin Detection"
msgstr "Aktiviere INTC Warteschleifenerkennung"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:194
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:186
msgid ""
"Huge speedup for some games, with almost no compatibility side effects. "
"[Recommended]"
@@ -2410,20 +2400,20 @@ msgstr ""
"Gute Geschwindigkeitsverbesserung, fast keine "
"Kompatibilitätseinschränkungen. [empfohlen]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:196
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:188
msgid "Enable Wait Loop Detection"
msgstr "Aktiviere erkennen von Warteschleifen"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:197
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:189
msgid ""
"Moderate speedup for some games, with no known side effects. [Recommended]"
msgstr "Leichte Geschwindigkeitsverbesserung in einigen Spielen [empfohlen]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:199
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
msgid "Enable fast CDVD"
msgstr "Aktiviere schnelles CDVD"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:192
msgid "Fast disc access, less loading times. [Not Recommended]"
msgstr "Schnellerer Diskzugriff, kürzere Ladezeiten [nicht empfohlen]"
@@ -2481,53 +2471,53 @@ msgstr "FPS"
msgid "PAL Framerate:"
msgstr "PAL Bildwiederholrate"
-#: pcsx2/gui/Panels/VideoPanel.cpp:162
+#: pcsx2/gui/Panels/VideoPanel.cpp:166
msgid ""
"Error while parsing either NTSC or PAL framerate settings. Settings must be "
"valid floating point numerics."
msgstr "Fehler beim Einlesen der NTSC oder PAL Framerateeinstellungen."
-#: pcsx2/gui/Panels/VideoPanel.cpp:180
+#: pcsx2/gui/Panels/VideoPanel.cpp:184
msgid "Disabled [default]"
msgstr "Deaktiviert [standard]"
-#: pcsx2/gui/Panels/VideoPanel.cpp:184
+#: pcsx2/gui/Panels/VideoPanel.cpp:188
msgid "Skip when on Turbo only (TAB to enable)"
msgstr "Skipping nur im Turbomodus"
-#: pcsx2/gui/Panels/VideoPanel.cpp:188
+#: pcsx2/gui/Panels/VideoPanel.cpp:192
msgid "Constant skipping"
msgstr "Konstantes Skipping"
-#: pcsx2/gui/Panels/VideoPanel.cpp:190
+#: pcsx2/gui/Panels/VideoPanel.cpp:194
msgid ""
"Normal and Turbo limit rates skip frames. Slow motion mode will still "
"disable frameskipping."
msgstr "Normal und Turbo werden Bilder auslassen, Slow motion nicht."
-#: pcsx2/gui/Panels/VideoPanel.cpp:213
+#: pcsx2/gui/Panels/VideoPanel.cpp:217
msgid "Frames to Draw"
msgstr "Bilder darstellen"
-#: pcsx2/gui/Panels/VideoPanel.cpp:218
+#: pcsx2/gui/Panels/VideoPanel.cpp:222
msgid "Frames to Skip"
msgstr "Bilder auslassen"
-#: pcsx2/gui/Panels/VideoPanel.cpp:294
+#: pcsx2/gui/Panels/VideoPanel.cpp:298
msgid "Use Synchronized MTGS"
msgstr "Benutze synchrones MTGS"
-#: pcsx2/gui/Panels/VideoPanel.cpp:295
+#: pcsx2/gui/Panels/VideoPanel.cpp:299
msgid ""
"For troubleshooting potential bugs in the MTGS only, as it is potentially "
"very slow."
msgstr "Um eventualle Fehler im MTGS Thread zu debuggen. Sehr langsam!"
-#: pcsx2/gui/Panels/VideoPanel.cpp:298
+#: pcsx2/gui/Panels/VideoPanel.cpp:302
msgid "Disable all GS output"
msgstr "Deaktiviere GS Ausgabe"
-#: pcsx2/gui/Panels/VideoPanel.cpp:299
+#: pcsx2/gui/Panels/VideoPanel.cpp:303
msgid ""
"Completely disables all GS plugin activity; ideal for benchmarking EEcore "
"components."
@@ -2535,11 +2525,11 @@ msgstr ""
"Deaktiviert alle GS Plugin Aktivitäten. Ideal um den Emulatorkern zu "
"Benchmarken."
-#: pcsx2/gui/Panels/VideoPanel.cpp:316
+#: pcsx2/gui/Panels/VideoPanel.cpp:320
msgid "Frame Skipping"
msgstr "Bilder auslassen (skipping)"
-#: pcsx2/gui/Panels/VideoPanel.cpp:319
+#: pcsx2/gui/Panels/VideoPanel.cpp:323
msgid "Framelimiter"
msgstr "FPS Limitierung"
@@ -2626,6 +2616,14 @@ msgstr ""
"%s Erweiterungen nicht gefunden. MicroVU benötigt einen Prozessor mit MMX, "
"SSE und SSE2 Erweiterungen."
+#~ msgid "mVU Block Hack"
+#~ msgstr "mVU Block Hack"
+
+#, fuzzy
+#~ msgid ""
+#~ "Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
+#~ msgstr "Guter FPS Anstieg, gute Kompatibilität [empfohlen]"
+
#~ msgid "!ContextTip:ChangingNTFS"
#~ msgstr ""
#~ "Die NTFS Komprimierung kann jederzeit via Windows Explorer geändert "
diff --git a/locales/es_ES/pcsx2_Iconized.po b/locales/es_ES/pcsx2_Iconized.po
index fe734f293..ecd8851b1 100644
--- a/locales/es_ES/pcsx2_Iconized.po
+++ b/locales/es_ES/pcsx2_Iconized.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.7\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-10-05 20:13+0200\n"
+"POT-Creation-Date: 2012-04-07 11:42+0200\n"
"PO-Revision-Date: 2011-09-28 21:51+0100\n"
"Last-Translator: Víctor González \n"
"Language-Team: \n"
@@ -31,7 +31,7 @@ msgstr ""
"memoria virtual necesarias ya las han reservado otros procesos, servicios o "
"DLLs."
-#: pcsx2/CDVD/CDVD.cpp:385
+#: pcsx2/CDVD/CDVD.cpp:389
msgid "!Notice:PsxDisc"
msgstr ""
"PCSX2 no admite discos de juego de PlayStation 1. Si quieres emular juegos "
@@ -496,7 +496,7 @@ msgstr ""
"EmotionEngine. Un valor alto aumenta el número de ciclos robados del EE a "
"cada microprograma del VU que utiliza el juego."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:172
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "!ContextTip:Speedhacks:vuFlagHack"
msgstr ""
"Actualiza las etiquetas de estado sólo en los bloques que podrán leerse, en "
@@ -504,15 +504,7 @@ msgstr ""
"Generalmente es la opción más segura, y Super VU ya hace algo parecido de "
"forma predeterminada."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:177
-msgid "!ContextTip:Speedhacks:vuBlockHack"
-msgstr ""
-"Asume que en lo profundo de los bloques futuros no necesitarán estos datos "
-"de instancia antiguos.\n"
-"Debería ser una opción muy segura. No se sabe si dañará la emulación de "
-"algún juego..."
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:182
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:174
msgid "!ContextTip:Speedhacks:vuThread"
msgstr ""
"Ejecuta VU1 en un hilo dedicado (sólo microVU1). Suele aumentar la velocidad "
@@ -522,7 +514,7 @@ msgstr ""
"En el caso de los juegos limitados por GS, podría ralentizarlos (sobre todo "
"en CPUs de doble núcleo)."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:203
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:195
msgid "!ContextTip:Speedhacks:INTC"
msgstr ""
"Este arreglo funciona mejor en juegos que utilizan el registro de estado "
@@ -530,7 +522,7 @@ msgstr ""
"RPGs que no son 3D. Los juegos que no utilizan este método de sincronía "
"vertical no recibirán aumentos de velocidad con este arreglo."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:208
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
msgid "!ContextTip:Speedhacks:BIFC0"
msgstr ""
"Al apuntar directamente al bucle de espera del EE en la dirección 0x81FC0 "
@@ -540,7 +532,7 @@ msgstr ""
"bucles, aumentamos el tiempo del siguiente evento o el final del espacio de "
"tiempo del procesador, en función de lo que llegue primero."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:215
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:207
msgid "!ContextTip:Speedhacks:fastCDVD"
msgstr ""
"Comprueba las listas de compatibilidad del HDLoader para saber qué juegos "
@@ -553,20 +545,20 @@ msgstr ""
"Observa que al desactivar la limitación de fotogramas, los modos Turbo y "
"Velocidad lenta no estarán disponibles."
-#: pcsx2/gui/Panels/VideoPanel.cpp:223
+#: pcsx2/gui/Panels/VideoPanel.cpp:227
msgid "!Panel:Frameskip:Heading"
msgstr ""
"Aviso: Debido al diseño del hardware de PS2, es imposible hacer un salto de "
"fotogramas preciso.\n"
"Activarlo causará serios fallos visuales en varios juegos."
-#: pcsx2/gui/Panels/VideoPanel.cpp:302
+#: pcsx2/gui/Panels/VideoPanel.cpp:306
msgid "!ContextTip:GS:SyncMTGS"
msgstr ""
"Activa esta opción si crees que la sincronía de hilos MTGS provoca caídas o "
"fallos gráficos."
-#: pcsx2/gui/Panels/VideoPanel.cpp:306
+#: pcsx2/gui/Panels/VideoPanel.cpp:310
msgid "!ContextTip:GS:DisableOutput"
msgstr ""
"Elimina cualquier ruido de benchmark provocado por el hilo MTGS o la "
@@ -591,3 +583,10 @@ msgstr ""
"los rangos de memoria concretos que son necesarios, y no podrá ser "
"utilizado. Este no es un error crítico, ya que el recompilador SuperVU es "
"obsoleto, y deberías utilizar en su lugar microVU."
+
+#~ msgid "!ContextTip:Speedhacks:vuBlockHack"
+#~ msgstr ""
+#~ "Asume que en lo profundo de los bloques futuros no necesitarán estos "
+#~ "datos de instancia antiguos.\n"
+#~ "Debería ser una opción muy segura. No se sabe si dañará la emulación de "
+#~ "algún juego..."
diff --git a/locales/es_ES/pcsx2_Main.po b/locales/es_ES/pcsx2_Main.po
index ac6e23240..082be0981 100644
--- a/locales/es_ES/pcsx2_Main.po
+++ b/locales/es_ES/pcsx2_Main.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.7\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-10-05 20:13+0200\n"
+"POT-Creation-Date: 2012-02-28 12:20+0100\n"
"PO-Revision-Date: 2011-09-28 21:53+0100\n"
"Last-Translator: Víctor González \n"
"Language-Team: \n"
@@ -204,7 +204,7 @@ msgstr "El plugin interno de Memory Cards no se ha iniciado."
msgid "Unloaded Plugin"
msgstr "Plugin no cargado"
-#: pcsx2/SaveState.cpp:339
+#: pcsx2/SaveState.cpp:342
msgid "Cannot load savestate. It is of an unknown or unsupported version."
msgstr ""
"No se ha podido cargar el guardado rápido. Es una versión desconocida o no "
@@ -386,31 +386,31 @@ msgstr ""
"El guardado rápido no se guardó correctamente. El archivo temporal ha sido "
"creado con éxito, pero no se pudo trasladar a su destino final."
-#: pcsx2/gui/AppConfig.cpp:837
+#: pcsx2/gui/AppConfig.cpp:842
msgid "Safest"
msgstr "Lo más seguro"
-#: pcsx2/gui/AppConfig.cpp:838
+#: pcsx2/gui/AppConfig.cpp:843
msgid "Safe (faster)"
msgstr "Seguro (más rápido)"
-#: pcsx2/gui/AppConfig.cpp:839
+#: pcsx2/gui/AppConfig.cpp:844
msgid "Balanced"
msgstr "Equilibrado"
-#: pcsx2/gui/AppConfig.cpp:840
+#: pcsx2/gui/AppConfig.cpp:845
msgid "Aggressive"
msgstr "Agresivo"
-#: pcsx2/gui/AppConfig.cpp:841
+#: pcsx2/gui/AppConfig.cpp:846
msgid "Aggressive plus"
msgstr "Muy agresivo"
-#: pcsx2/gui/AppConfig.cpp:842
+#: pcsx2/gui/AppConfig.cpp:847
msgid "Mostly Harmful"
msgstr "Muy peligroso"
-#: pcsx2/gui/AppConfig.cpp:999 pcsx2/gui/AppConfig.cpp:1005
+#: pcsx2/gui/AppConfig.cpp:1007 pcsx2/gui/AppConfig.cpp:1013
msgid "Failed to overwrite existing settings file; permission was denied."
msgstr ""
"Error al sobrescribir el archivo de configuración ya existente, se ha "
@@ -2468,21 +2468,10 @@ msgstr ""
"(Recomendado)"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:166
-msgid "mVU Block Hack"
-msgstr "Arreglo de bloqueo mVU"
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
-msgid ""
-"Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
-msgstr ""
-"Buena subida y alta compatibilidad; puede crear gráficos dañados, SPS, "
-"etcétera..."
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "MTVU (Multi-Threaded microVU1)"
msgstr "MTVU (microVU1 multihilos)"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:170
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
msgid ""
"Good Speedup and High Compatibility; may cause hanging... [Recommended if 3+ "
"cores]"
@@ -2490,15 +2479,15 @@ msgstr ""
"Buena subida y alta compatibilidad; puede provocar cuelgues... (Recomendado "
"si tienes 3 o más núcleos de CPU)"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:183
msgid "Other Hacks"
msgstr "Otros arreglos"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:193
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:185
msgid "Enable INTC Spin Detection"
msgstr "Activar detección de giro INTC"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:194
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:186
msgid ""
"Huge speedup for some games, with almost no compatibility side effects. "
"[Recommended]"
@@ -2506,22 +2495,22 @@ msgstr ""
"Subida enorme de velocidad en algunos juegos, sin prácticamente ningún "
"efecto secundario de compatibilidad (Recomendado)"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:196
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:188
msgid "Enable Wait Loop Detection"
msgstr "Activar detección de parada de bucles"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:197
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:189
msgid ""
"Moderate speedup for some games, with no known side effects. [Recommended]"
msgstr ""
"Subida moderada en algunos juegos, sin efectos secundarios conocidos. "
"(Recomendado)"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:199
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
msgid "Enable fast CDVD"
msgstr "Activar CDVD rápido"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:192
msgid "Fast disc access, less loading times. [Not Recommended]"
msgstr ""
"Accede al disco más rápidamente, reduciendo los tiempos de carga. (No "
@@ -2582,7 +2571,7 @@ msgstr "FPS (Fotogramas por segundo)"
msgid "PAL Framerate:"
msgstr "Velocidad de fotogramas PAL:"
-#: pcsx2/gui/Panels/VideoPanel.cpp:162
+#: pcsx2/gui/Panels/VideoPanel.cpp:166
msgid ""
"Error while parsing either NTSC or PAL framerate settings. Settings must be "
"valid floating point numerics."
@@ -2590,19 +2579,19 @@ msgstr ""
"Error al analizar la configuración de la velocidad de fotogramas PAL o "
"NTSC. La configuración debe ser un valor numeral entero."
-#: pcsx2/gui/Panels/VideoPanel.cpp:180
+#: pcsx2/gui/Panels/VideoPanel.cpp:184
msgid "Disabled [default]"
msgstr "Desactivado [por defecto]"
-#: pcsx2/gui/Panels/VideoPanel.cpp:184
+#: pcsx2/gui/Panels/VideoPanel.cpp:188
msgid "Skip when on Turbo only (TAB to enable)"
msgstr "Saltar sólo con el turbo activado (Activar pulsando TAB)"
-#: pcsx2/gui/Panels/VideoPanel.cpp:188
+#: pcsx2/gui/Panels/VideoPanel.cpp:192
msgid "Constant skipping"
msgstr "Salto constante"
-#: pcsx2/gui/Panels/VideoPanel.cpp:190
+#: pcsx2/gui/Panels/VideoPanel.cpp:194
msgid ""
"Normal and Turbo limit rates skip frames. Slow motion mode will still "
"disable frameskipping."
@@ -2610,19 +2599,19 @@ msgstr ""
"Normal y Turbo limitan la velocidad de salto de fotogramas. El modo de "
"velocidad lenta desactivará el salto de fotogramas."
-#: pcsx2/gui/Panels/VideoPanel.cpp:213
+#: pcsx2/gui/Panels/VideoPanel.cpp:217
msgid "Frames to Draw"
msgstr "Fotogramas a mostrar"
-#: pcsx2/gui/Panels/VideoPanel.cpp:218
+#: pcsx2/gui/Panels/VideoPanel.cpp:222
msgid "Frames to Skip"
msgstr "Fotogramas a saltar"
-#: pcsx2/gui/Panels/VideoPanel.cpp:294
+#: pcsx2/gui/Panels/VideoPanel.cpp:298
msgid "Use Synchronized MTGS"
msgstr "Utilizar GS multinúcleo sincronizado"
-#: pcsx2/gui/Panels/VideoPanel.cpp:295
+#: pcsx2/gui/Panels/VideoPanel.cpp:299
msgid ""
"For troubleshooting potential bugs in the MTGS only, as it is potentially "
"very slow."
@@ -2630,11 +2619,11 @@ msgstr ""
"Usar sólo para evitar posibles fallos en el MTGS; ya que probablemente "
"funcione muy lento."
-#: pcsx2/gui/Panels/VideoPanel.cpp:298
+#: pcsx2/gui/Panels/VideoPanel.cpp:302
msgid "Disable all GS output"
msgstr "Desactivar toda la salida de GS"
-#: pcsx2/gui/Panels/VideoPanel.cpp:299
+#: pcsx2/gui/Panels/VideoPanel.cpp:303
msgid ""
"Completely disables all GS plugin activity; ideal for benchmarking EEcore "
"components."
@@ -2642,11 +2631,11 @@ msgstr ""
"Desactiva por completo toda actividad del plugin GS; ideal para probar "
"componentes de EEcore."
-#: pcsx2/gui/Panels/VideoPanel.cpp:316
+#: pcsx2/gui/Panels/VideoPanel.cpp:320
msgid "Frame Skipping"
msgstr "Saltar fotogramas"
-#: pcsx2/gui/Panels/VideoPanel.cpp:319
+#: pcsx2/gui/Panels/VideoPanel.cpp:323
msgid "Framelimiter"
msgstr "Limitador de fotogramas"
@@ -2734,3 +2723,12 @@ msgid ""
msgstr ""
"Extensiones %s no encontradas. La microVU necesita de una CPU anfitriona "
"con extensiones MMX, SSE y SSE2."
+
+#~ msgid "mVU Block Hack"
+#~ msgstr "Arreglo de bloqueo mVU"
+
+#~ msgid ""
+#~ "Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
+#~ msgstr ""
+#~ "Buena subida y alta compatibilidad; puede crear gráficos dañados, SPS, "
+#~ "etcétera..."
diff --git a/locales/fr_FR/pcsx2_Iconized.po b/locales/fr_FR/pcsx2_Iconized.po
new file mode 100644
index 000000000..15aa76a84
--- /dev/null
+++ b/locales/fr_FR/pcsx2_Iconized.po
@@ -0,0 +1,593 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR PCSX2 Dev Team
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PCSX2 0.9.9\n"
+"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
+"POT-Creation-Date: 2012-04-07 11:42+0200\n"
+"PO-Revision-Date: 2012-03-08 11:33-0000\n"
+"Last-Translator: goldeng \n"
+"Language-Team: goldeng \n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-KeywordsList: pxE;pxEt\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Poedit-Basepath: trunk\\\n"
+"X-Poedit-Language: French\n"
+"X-Poedit-Country: France\n"
+"X-Poedit-SearchPath-0: pcsx2\n"
+"X-Poedit-SearchPath-1: common\n"
+
+#: common/src/Utilities/Exceptions.cpp:254
+msgid "!Notice:VirtualMemoryMap"
+msgstr ""
+"La mémoire virtuelle disponible est insuffisante, ou l'espace-mémoire a déjà "
+"été réservé par d'autres processus, services ou DLL."
+
+#: pcsx2/CDVD/CDVD.cpp:389
+msgid "!Notice:PsxDisc"
+msgstr ""
+"L'émulation des jeux Playstation1 n'est pas supportée par PCSX2. Si vous "
+"voulez émuler des jeux PSX, veuillez télécharger un émulateur PS1 dédié (par "
+"exemple, ePSXe ou PCSX) !"
+
+#: pcsx2/System.cpp:114
+msgid "!Notice:Recompiler:VirtualMemoryAlloc"
+msgstr ""
+"Le recompiler n'a pas été en mesure d'allouer la mémoire virtuelle "
+"nécessaire. Cette erreur peut être causée par une insuffisance en "
+"ressources, notamment du fait qu'un autre programme utilise trop d'espace. "
+"Vous pouvez également essayer de réduire la taille du cache par défaut "
+"allouée au recompiler PCSX2."
+
+#: pcsx2/System.cpp:348
+msgid "!Notice:EmuCore::MemoryForVM"
+msgstr ""
+"PCSX2 est incapable d'affecter les ressources en mémoire requises pour "
+"l'émulation d'une machine virtuelle PS2. Mettez fin aux processus en cours "
+"qui nécessitent beaucoup de mémoire (CTRL + ALT + Suppr) puis réessayez."
+
+#: pcsx2/gui/AppInit.cpp:43
+msgid "!Notice:Startup:NoSSE2"
+msgstr ""
+"Attention ! Votre ordinateur ne prend pas en charge les instructions de type "
+"SSE2, nécessaires pour la prise en charge d'un grand nombre de plugins et du "
+"recompiler PCSX2 : vos options seront limitées et l'émulation (très) lente."
+
+#: pcsx2/gui/AppInit.cpp:162
+msgid "!Notice:RecompilerInit:Header"
+msgstr ""
+"Attention ! Certaines fonctions du recompiler PCSX2 n'ont pas pu être "
+"initialisées et ont, par conséquent, été désactivées :"
+
+#: pcsx2/gui/AppInit.cpp:211
+msgid "!Notice:RecompilerInit:Footer"
+msgstr ""
+"Attention : le recompiler n'est pas indispensable au fonctionnement de "
+"l'émulateur, il permet néanmoins d'améliorer sensisblement les performances "
+"globales. Si vous êtes parvenus à résoudre des problèmes en désactivant le "
+"recompiler, vous devrez le réactiver manuellement."
+
+#: pcsx2/gui/AppMain.cpp:546
+msgid "!Notice:BiosDumpRequired"
+msgstr ""
+" \n"
+"\n"
+"PCSX2 nécessite un BIOS PS2 valide. D'un point de vue légal, vous DEVEZ "
+"obtenir votre BIOS \n"
+"à partir de votre propre PS2 (emprunter une console ne satisfait pas ces "
+"exigences).\n"
+"Veuillez consulter la FAQ ou les guides disponibles pour plus de "
+"renseignements."
+
+#: pcsx2/gui/AppMain.cpp:629
+msgid "!Notice Error:Thread Deadlock Actions"
+msgstr ""
+"Cliquez sur Ignorer pour attendre jusqu'à ce que le processus réponde.\n"
+"Cliquez Annuler pour mettre fin au processus.\n"
+"Cliquez sur Terminer pour fermer immédiatement PCSX2."
+
+#: pcsx2/gui/AppUserMode.cpp:57
+msgid "!Notice:PortableModeRights"
+msgstr ""
+"Merci de vous assurer que les dossiers spécifiés sont présents et que votre "
+"compte d'utilisateur possède les permissions d'écriture - ou redémarrer "
+"PCSX2 en tant qu'administrateur du système, ce qui devrait garantir au "
+"programme la capacité à créer ses propres dossiers. Si vous ne disposez pas "
+"d'un accès au compte administrateur, vous aurez besoin de faire appel au "
+"mode User Documents (cliquez sur le bouton ci-dessous)."
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:181
+msgid "!ContextTip:ChangingNTFS"
+msgstr ""
+"La compression NTFS peut être modifiée manuellement depuis l'explorateur "
+"Windows (clic droit sur le fichier, puis \"Propriétés\")."
+
+#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:49
+msgid "!ContextTip:Folders:Settings"
+msgstr ""
+"Ce dossier contient les paramètres relatifs à PCSX2, y compris ceux créés "
+"par les plugins externes (sauf s'ils sont dépassés techniquement)."
+
+#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:54
+msgid "!Panel:Folders:Settings"
+msgstr ""
+"Vous pouvez spécifier un chemin d'accès pour les paramètres PCSX2. Si un "
+"fichier de paramétrage existe déjà dans le dossier choisi, vous aurez la "
+"possibilité de les importer ou de les écraser."
+
+#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:94
+msgid "!Wizard:Welcome"
+msgstr ""
+"Cette aide à la configuration vous permettra de paramétrer les plugins, les "
+"cartes mémoire et le BIOS. Il est recommandé à tout utilisateur de "
+"l'utiliser, mais également de prendre connaissance du Lisez-moi et des "
+"guides de configuration traduits dans votre langue (FR : goldeng)."
+
+#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:140
+msgid "!Wizard:Bios:Tutorial"
+msgstr ""
+"PCSX2 nécessite l'utilisation d'une copie LÉGALE d'un BIOS PS2 pour que "
+"l'émulation des jeux fonctionne.\n"
+"Vous ne pouvez pas avoir recours à une copie obtenue auprès d'un ami ou "
+"grâce à internet.\n"
+"Vous devez faire un dump du BIOS de VOTRE console Playstation 2."
+
+#: pcsx2/gui/Dialogs/ImportSettingsDialog.cpp:31
+msgid "!Notice:ImportExistingSettings"
+msgstr ""
+"Un historique de paramètres PCSX2 a été trouvé dans le dossier de "
+"configuration. Voulez-vous que le logiciel importe ces données ou les "
+"remplace avec les valeurs par défaut ?\n"
+"\n"
+"(ou appuyez sur le bouton Annuler pour modifier le dossier d'installation)"
+
+#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:30
+msgid "!Panel:Mcd:NtfsCompress"
+msgstr ""
+"La compression NTFS est sûre et rapide : c'est le format le plus adapté pour "
+"les cartes mémoires !"
+
+#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:41
+msgid "!Panel:Mcd:EnableEjection"
+msgstr ""
+"Permet d'éviter d'endommager la carte mémoire (fichiers corrompus) en "
+"obligeant les jeux à ré-indexer le contenu présent sur la carte.\n"
+"Cette option peut être incompatible avec certains jeux (Guitar Hero, par "
+"exemple) !"
+
+#: pcsx2/gui/Dialogs/StuckThreadDialog.cpp:33
+msgid "!Panel:StuckThread:Heading"
+msgstr ""
+"Le processus '%s' ne répond pas. Il est peut-être bloqué ou s'exécute d'une "
+"manière anormalement lente."
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:38
+msgid "!Panel:HasHacksOverrides"
+msgstr ""
+"Attention ! Les lignes de commande se substituent aux paramètres établis.\n"
+"Ces commandes ne sont pas disponibles dans la fenêtre de configuration des "
+"paramètres habituels, \n"
+"et seront désactivées si vous cliquez sur le bouton Appliquer."
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:58
+msgid "!Panel:HasPluginsOverrides"
+msgstr ""
+"Attention ! Les lignes de commande se substituent aux paramètres plugins "
+"établis.\n"
+"Ces commandes ne sont pas disponibles dans la fenêtre de configuration des "
+"paramètres habituels, \n"
+"et seront désactivées si vous cliquez sur le bouton Appliquer."
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:135
+msgid "!Notice:Tooltip:Presets:Slider"
+msgstr ""
+"Les préréglages appliquent des speedhacks, des options spécifiques du "
+"recompiler et des patchs spécifiques à certains jeux afin d'en améliorer les "
+"performances.\n"
+"Toute correction disponible à un problème connu sera automatiquement "
+"appliquée.\n"
+"\n"
+"Informations :\n"
+"1 - Le mode d'émulation le plus stable, mais aussi le plus lent.\n"
+"3 --> Une tentative d'équilibre entre compatibilité et performances.\n"
+"4 - Utilisation de certains speedhacks.\n"
+"5 - Utilisation d'un si grand nombre de speedhacks que les performances s'en "
+"ressentiront sûrement."
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:149
+msgid "!Notice:Tooltip:Presets:Checkbox"
+msgstr ""
+"Les préréglages appliquent des speedhacks, des options spécifiques du "
+"recompiler et des patchs particuliers à certains jeux afin d'en améliorer "
+"les performances. Toute correction disponible à un problème connu sera "
+"automatiquement appliquée.\n"
+"--> Décochez la case si vous désirez modifier les paramètres manuellement "
+"(en utilisant les préréglages actuels comme base)"
+
+#: pcsx2/gui/IsoDropTarget.cpp:28
+msgid "!Notice:ConfirmSysReset"
+msgstr ""
+"Une telle opération entraînera la réinitialisation complète de la machine "
+"virtuelle PS2 : toutes les données en cours seront perdues.\n"
+"Êtes-vous sûr de vouloir réaliser cette opération ?"
+
+#: pcsx2/gui/MainMenuClicks.cpp:106
+msgid "!Notice:DeleteSettings"
+msgstr ""
+"Cette opération vise à supprimer les paramètres de %s et à relancer "
+"l'assistant de première configuration. \n"
+"%s doit être relancé manuellement après que l'opération ait été réalisée "
+"avec succès. \n"
+"\n"
+" ATTENTION ! Cliquez sur OK pour supprimer TOUS les paramètres de %s et "
+"forcer la fermeture de l'application, provoquant la perte de toutes les "
+"données en cours d'exécution.\n"
+"Êtes-vous sûr de vouloir procéder à cette manipulation ?\n"
+"PS. Les paramètres des plugins individuels ne seront pas affectés."
+
+#: pcsx2/gui/MemoryCardFile.cpp:78
+msgid "!Notice:Mcd:HasBeenDisabled"
+msgstr ""
+"La carte mémoire présente dans le lecteur %d a été automatiquement "
+"désactivée. Vous pouvez corriger ce problème\n"
+"et relancer la carte mémoire à l'aide du menu principal (Configuration -> "
+"Cartes mémoire)."
+
+#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:138
+msgid "!Notice:BIOS:InvalidSelection"
+msgstr ""
+"Veuillez choisir un BIOS valide. Si vous ne possédez pas un tel fichier, "
+"cliquez sur Annuler pour fermer le panneau de configuration."
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:111
+msgid "!Panel:EE/IOP:Heading"
+msgstr ""
+"Rappel : La plupart des jeux fonctionneront correctement à l'aide du "
+"paramétrage par défaut."
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:178
+msgid "!Panel:VUs:Heading"
+msgstr ""
+"Rappel : La plupart des jeux fonctionneront correctement à l'aide du "
+"paramétrage par défaut."
+
+#: pcsx2/gui/Panels/DirPickerPanel.cpp:69
+msgid "!Notice:DirPicker:CreatePath"
+msgstr ""
+"Le chemin d'accès ou le dossier spécifiés n'existent pas. Voulez-vous le "
+"créer ?"
+
+#: pcsx2/gui/Panels/DirPickerPanel.cpp:158
+msgid "!ContextTip:DirPicker:UseDefault"
+msgstr ""
+"Erreur ! Impossible de copier la carte mémoire dans le lecteur %u. Ce "
+"dernier est en cours d'utilisation."
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:55
+msgid "!ContextTip:Window:Zoom"
+msgstr ""
+"Zoom = 100 : les éléments graphiques occupent tout l'écran.\n"
+"+/- 100 : augmente ou réduit le zoom.\n"
+"0 : zoom automatique qui supprime les bordures noires.\n"
+"\n"
+"Attention : certains jeux utilisent volontairement les bordures noires, "
+"celles-ci ne seront pas supprimées avec la valeur 0 !\n"
+"\n"
+"Raccourcis clavier : CTRL + Plus (augmente le zoom) ; CTRL + Moins (diminue "
+"le zoom) ; CTRL + * (intevertit les valeurs 100 et 0)"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:63
+msgid "!ContextTip:Window:Vsync"
+msgstr ""
+"La synchronisation verticale permet d'éliminer les secousses (tremblements) "
+"de l'écran, mais occasionne également des pertes en termes de performances. "
+"Il vaut mieux ne l'utiliser qu'en mode plein-écran.\n"
+"\n"
+"Attention : Certains plugins vidéo ne fonctionnent pas avec cette option !"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:68
+msgid "!ContextTip:Window:ManagedVsync"
+msgstr ""
+"Active la Vsync (synchronisation verticale) lorsque la framerate atteint sa "
+"vitesse maximum. Si cette dernière venait à diminuer, la Vsync se "
+"désactivera automatiquement.\n"
+"\n"
+"Attention : En l'état actuel, cette option ne fonctionne qu'avec le plugin "
+"GSdx dans sa configuration DX10/11 (hardware) ! Tout autre plugin ou mode de "
+"rendu occasionnera l'affichage d'un fond noir à la place des éléments "
+"graphiques du jeu.\n"
+"De plus, cette option nécessite que la Vsync soit activée sur votre PC."
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:76
+msgid "!ContextTip:Window:HideMouse"
+msgstr ""
+"Cochez cette case pour obliger le curseur de la souris à ne pas apparaître "
+"dans la fenêtre de jeu.\n"
+"Cette option est utile si vous utilisez la souris comme contrôleur principal "
+"pour les jeux.\n"
+"Par défaut, le curseur s'efface automatiquement après deux secondes "
+"d'inactivité."
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:82
+msgid "!ContextTip:Window:Fullscreen"
+msgstr ""
+"Lorsque cette option est activée, le jeu se lance automatiquement en mode "
+"plein-écran (au démarrage ou après une pause).\n"
+"Vous pouvez néanmoins modifier le mode d'affichage en jeu grâce à la "
+"combinaison de touches ALT + Entrée."
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:93
+msgid "!ContextTip:Window:HideGS"
+msgstr ""
+"Ferme complètement la fenêtre de jeu lorsque la touche ESC ou la fonction "
+"Pause est utilisée."
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:67
+msgid "!ContextTip:Gamefixes:EE Timing Hack"
+msgstr ""
+"Les jeux suivants nécessitent l'utilisation du hack :\n"
+"* Shin Mega Tensei : Digital Devil Saga (cinématiques, crashs)\n"
+"* SSX (bugs graphiques, crashs)\n"
+"* Resident Evil : Dead Aim (textures)"
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:80
+msgid "!ContextTip:Gamefixes:OPH Flag hack"
+msgstr ""
+"Les jeux suivants nécessitent l'utilisation du hack :\n"
+"* Bleach : Blade Battlers\n"
+"* Growlanser II : The Sense of Justice\n"
+"* Growlanser III : The Dual Darkness\n"
+"* Wizardry"
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:89
+msgid "!ContextTip:Gamefixes:DMA Busy hack"
+msgstr ""
+"Les jeu suivant nécessite l'utilisation du hack :\n"
+"* Mana Khemia : Alchemists of Al-Revis (sortir du campus)"
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:96
+msgid "!ContextTip:Gamefixes:VIF1 FIFO hack"
+msgstr ""
+"Les jeux suivants nécessitent l'utilisation du hack:\n"
+"* Test Drive Unlimited\n"
+"* Transformers"
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:119
+msgid "!Panel:Gamefixes:Compat Warning"
+msgstr ""
+"Les patchs peuvent corriger des problèmes liés à l'émulation de titres "
+"spécifiques.\n"
+"Néanmoins, ils peuvent aussi avoir un impact sur la compatibilité ou les "
+"performances globales.\n"
+"\n"
+"Il est conseillé de préférer l'option \"Patchs automatiques\" disponible "
+"dans le menu \"Système\" de l'émulateur plutôt que d'utiliser celle-ci.\n"
+"(\"Patchs automatiques\" : utilise uniquement le patch associé au jeu émulé)"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:720
+msgid "!Notice:Mcd:Delete"
+msgstr ""
+"Vous êtes sur le point de supprimer la carte mémoire du lecteur %u. Toutes "
+"les données présentes sur la carte seront perdues !\n"
+"Êtes-vous sûr de réaliser cette manipulation ?"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:758
+msgid "!Notice:Mcd:CantDuplicate"
+msgstr ""
+"Erreur : Le port-PS2 concerné est occupé par un autre service, empêchant la "
+"copie."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:801
+msgid "!Notice:Mcd:Copy Failed"
+msgstr ""
+"Erreur : Impossible de copier la carte mémoire du lecteur %u. Les données "
+"concernées sont en cours d'utilisation."
+
+#: pcsx2/gui/Panels/MiscPanelStuff.cpp:35
+msgid "!Panel:Usermode:Explained"
+msgstr ""
+"Veuillez sélectionner le répertoire par défaut des fichiers utilisateur "
+"PCSX2 (cartes mémoire, screenshots, paramètres d'affichage, etc...). Ce "
+"réglage pourra être modifié plus tard via le panneau de configuration."
+
+#: pcsx2/gui/Panels/MiscPanelStuff.cpp:41
+msgid "!Panel:Usermode:Warning"
+msgstr ""
+"Vous pouvez modifier le répertoire par défaut du fichier utilisateu PCSX2 "
+"(cartes mémoire, paramètres d'affichage, etc...). Cette option prévaut sur "
+"tous les autres chemins d'accès spécifiés auparavant."
+
+#: pcsx2/gui/Panels/PathsPanel.cpp:40
+msgid "!ContextTip:Folders:Savestates"
+msgstr ""
+"Ce dossier contient les sauvegardes PCSX2. Vous pouvez enregistrer votre "
+"partie en utilisant le menu ou en pressant les touches F1/F3 (sauver/"
+"charger)."
+
+#: pcsx2/gui/Panels/PathsPanel.cpp:50
+msgid "!ContextTip:Folders:Snapshots"
+msgstr ""
+"Ce dossier contient les screenshots que vous avez pris lors de l'émulation "
+"d'un jeu via PCSX2. Le format de l'image et sa qualité dépendent grandement "
+"du plugin vidéo GS utilisé."
+
+#: pcsx2/gui/Panels/PathsPanel.cpp:60
+msgid "!ContextTip:Folders:Logs"
+msgstr ""
+"Ce dossier contient les rapports de diagnostique. La plupart des plugins "
+"utilisent également le dossier ci-dessous pour enregistrer leurs rapports "
+"d'erreurs."
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:242
+msgid "!Notice:PluginSelector:ConfirmShutdown"
+msgstr ""
+"Attention ! Il est conseillé de réinitialiser complètement l'émulateur PS2 "
+"après avoir remplacé un plugin. PCSX2 va maintenant tenter de réaliser une "
+"sauvegarde puis de restaurer la session, mais vous pourriez perdre les "
+"données en cours si le programme échoue (incompatibilité des plugins).\n"
+"\n"
+"Êtes-vous sûr de vouloir appliquer ces paramètres ?"
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:457
+msgid "!Notice:PluginSelector:ApplyFailed"
+msgstr ""
+"Votre ordinateur ne dispose pas des ressources nécessaires pour lancer "
+"l'émulateur. Essayez de libérer de l'espace-mémoire."
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:27
+msgid "!Panel:Speedhacks:EECycleX1"
+msgstr ""
+"1 - Cyclerate par défaut : la vitesse d'émulation est équivalente à celle "
+"d'une véritable console Playstation 2."
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:32
+msgid "!Panel:Speedhacks:EECycleX2"
+msgstr ""
+"2 - Diminue l'EE Cyclerate d'envion 33% : amélioration sensible des "
+"performances et compatibilité élevée."
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:37
+msgid "!Panel:Speedhacks:EECycleX3"
+msgstr ""
+"3 - Diminue l'EE Cyclerate d'environ 50% : amélioration modérée des "
+"performances, mais le son de certaines cinématiques sera insupportable."
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:54
+msgid "!Panel:Speedhacks:VUCycleStealOff"
+msgstr ""
+"0 - Désactive le VU Cycle Stealing : compatibilité maximale, évidemment !"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:59
+msgid "!Panel:Speedhacks:VUCycleSteal1"
+msgstr ""
+"1 - VU Cycle Stealing léger : faible compatibilité mais une amélioration "
+"sensible des performances pour certains jeux."
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:64
+msgid "!Panel:Speedhacks:VUCycleSteal2"
+msgstr ""
+"2 - VU Cycle Stealing modéré : très faible compatibilité, mais une "
+"amélioration significative des performances pour certains jeux."
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:70
+msgid "!Panel:Speedhacks:VUCycleSteal3"
+msgstr ""
+"3 - VU Cycle Stealing maximal : relativement inutile puisqu'il engendre des "
+"ralentissements et des bugs graphiques dans la plupart des jeux."
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:97
+msgid "!Panel:Speedhacks:Overview"
+msgstr ""
+"Les speedhacks améliorent généralement les performances mais peuvent "
+"également générer des bugs, empêcher l'émulation du son et fausser la mesure "
+"des FPS. Si vous rencontrez des soucis lors de l'émulation d'un jeu, cette "
+"option est la première à désactiver."
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:129
+msgid "!ContextTip:Speedhacks:EECycleRate Slider"
+msgstr ""
+"Les valeurs définissent la vitesse de l'horlogue du CPU core R5900 de "
+"l'EmotionEngine, et entraînent une amélioration des performances conséquente "
+"pour les jeux incapables d'utiliser tout le potentiel des composants de la "
+"Playstation 2."
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:150
+msgid "!ContextTip:Speedhacks:VUCycleStealing Slider"
+msgstr ""
+"Les valeurs définissent le nombre de cycles que le Vector Unit \"emprunte\" "
+"au système EmotionEngine. Une valeur élevée augmente le nombre emprunté à "
+"l'EE pour chaque microprogramme VU que le jeu utilise."
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
+msgid "!ContextTip:Speedhacks:vuFlagHack"
+msgstr ""
+"Met à jour les Status Flags uniquement pour les blocs qui les liront, plutôt "
+"qu'ils ne soient lus en permanence. Cette option n'occasionne aucun problème "
+"en général, et le Super VU fait la même chose par défaut."
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:174
+msgid "!ContextTip:Speedhacks:vuThread"
+msgstr ""
+"Transfère le VU 1 dans un processus individuel (microVU1 seulement). En "
+"général, cela permet une amélioration des performances sur les processeurs 3 "
+"coeurs ou plus.\n"
+"La plupart des jeux supportent bien l'opération, mais certains d'entre eux "
+"pourraient tout de même planter.\n"
+"De plus, les processeurs dual-core souffriront de ralentissements "
+"conséquents."
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:195
+msgid "!ContextTip:Speedhacks:INTC"
+msgstr ""
+"Ce hack fonctionne mieux avec les jeux utilisant le registre INTC Status "
+"dans l'attente d'une synchronisation verticale, notamment dans les RPG en "
+"2D. Les jeux qui n'utilisent pas cette méthode connaîtront une légère "
+"amélioration des performances."
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
+msgid "!ContextTip:Speedhacks:BIFC0"
+msgstr "Vise surtout l'EE idle loop à l'adresse 0x81FC0 du kernel."
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:207
+msgid "!ContextTip:Speedhacks:fastCDVD"
+msgstr ""
+"Vérifie les listes de compatibilité du HDLoader pour les jeux qui "
+"rencontrent habituellement des problèmes avec lui (le plus souvent, "
+"repérables par l'indication \"mode 1\" ou \"slow DVD\")."
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:37
+msgid "!ContextTip:Framelimiter:Disable"
+msgstr ""
+"Si le Famelimiting est désactivé, les modes Turbo et Slow Motion ne seront "
+"plus disponibles."
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:227
+msgid "!Panel:Frameskip:Heading"
+msgstr ""
+"Attention : L'hardware de la PS2 rend impossible un saut de frames cohérent. "
+"L'activation de cette option pourrait entraîner des bugs graphiques "
+"conséquents dans certains jeux."
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:306
+msgid "!ContextTip:GS:SyncMTGS"
+msgstr ""
+"Activez cette option si vous pensez que le processus SyncMTGS cause des bugs "
+"graphiques ou crashs récurents."
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:310
+msgid "!ContextTip:GS:DisableOutput"
+msgstr ""
+"Supprime les problèmes de benchmark liés au processus MTGS ou à une "
+"surexploitation du GPU. Cette option est plus efficace losqu'elle est "
+"utilisée avec une sauvegarde : réalisez votre sauvegarde au moment propice, "
+"activez cette option puis chargez à nouveau la partie.\n"
+"\n"
+"Attention : Cette option peut être activée alors que le jeu a été mis en "
+"pause, mais entraînera des bugs graphiques si elle est ensuite désactivée au "
+"cours de la même partie."
+
+#: pcsx2/vtlb.cpp:710
+msgid "!Notice:HostVmReserve"
+msgstr ""
+"Votre système manque de ressources pour exécuter l'émulateur PCSX2. Cela "
+"peut être dû à un autre programme qui occupe trop d'espace-mémoire."
+
+#: pcsx2/x86/sVU_zerorec.cpp:363
+msgid "!Notice:superVU:VirtualMemoryAlloc"
+msgstr ""
+"Out of Memory (ou presque) : le SuperVU recompiler n'est pas parvu à allouer "
+"suffisamment de mémoire virtuelle, ce qui rend impossible son utilisation. "
+"Ceci n'est pas une erreur critique, puisque le SVU recompiler est obsolète "
+"et que vous devriez utiliser Microvu ! :p"
+
+#~ msgid "!ContextTip:Speedhacks:vuBlockHack"
+#~ msgstr ""
+#~ "Prévoit à l'avance que les futurs blocs n'auront pas besoin des anciennes "
+#~ "données. L'option présente peu de risques et jusque là, aucun jeu n'a "
+#~ "connu de bugs par sa faute."
diff --git a/locales/fr_FR/pcsx2_Main.po b/locales/fr_FR/pcsx2_Main.po
new file mode 100644
index 000000000..09e18e141
--- /dev/null
+++ b/locales/fr_FR/pcsx2_Main.po
@@ -0,0 +1,2708 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR PCSX2 Dev Team
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PCSX2 0.9.9\n"
+"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
+"POT-Creation-Date: 2012-03-10 20:38+0100\n"
+"PO-Revision-Date: 2012-03-08 11:42-0000\n"
+"Last-Translator: goldeng \n"
+"Language-Team: goldeng \n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-KeywordsList: _;pxL;_d;pxDt;_t;pxLt\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Poedit-Basepath: trunk\\\n"
+"X-Poedit-Language: French\n"
+"X-Poedit-Country: France\n"
+"X-Poedit-SearchPath-0: pcsx2\n"
+"X-Poedit-SearchPath-1: common\n"
+
+#: common/include/Utilities/Exceptions.h:187
+msgid "No reason given."
+msgstr "Erreur critique."
+
+#: common/include/Utilities/Exceptions.h:226
+msgid "Parse error"
+msgstr "Parse error"
+
+#: common/include/Utilities/Exceptions.h:250
+msgid "Your machine's hardware is incapable of running PCSX2. Sorry dood."
+msgstr ""
+"Le matériel de votre ordinateur rend impossible le fonctionnement de PCSX2. "
+"Bien essayé !"
+
+#: common/src/Utilities/Exceptions.cpp:219
+msgid "Oh noes! Out of memory!"
+msgstr "Oups ! Surcharge de la mémoire !"
+
+#: common/src/Utilities/Exceptions.cpp:234
+msgid ""
+"Virtual memory mapping failure! Your system may have conflicting device "
+"drivers, services, or may simply have insufficient memory or resources to "
+"meet PCSX2's lofty needs."
+msgstr ""
+"Echec du mappage de la mémoire virtuelle ! Votre système a dû entrer en "
+"conflit avec un driver, un autre service ou peut être la victime d'une "
+"insuffisance en ressources disponibles."
+
+#: common/src/Utilities/Exceptions.cpp:309
+msgid "Path: "
+msgstr "Chemin d'accès :"
+
+#: common/src/Utilities/Exceptions.cpp:313
+msgid "[Unnamed or unknown]"
+msgstr "[Inconnu]"
+
+#: common/src/Utilities/Exceptions.cpp:333
+msgid "A file could not be created."
+msgstr "Un fichier n'a pas pu être créé."
+
+#: common/src/Utilities/Exceptions.cpp:353
+msgid "File not found."
+msgstr "Fichier introuvable."
+
+#: common/src/Utilities/Exceptions.cpp:373
+msgid ""
+"Permission denied while trying to open file, likely due to insufficient user "
+"account rights."
+msgstr ""
+"Vous ne disposez pas des droits suffisants pour ouvrir ce fichier (mauvais "
+"compte d'utilisateur ?)."
+
+#: common/src/Utilities/Exceptions.cpp:393
+msgid ""
+"Unexpected end of file or stream encountered. File is probably truncated or "
+"corrupted."
+msgstr "L'opération a échoué. Le fichier est sans doute corrompu ou modifié."
+
+#: common/src/Utilities/ThreadTools.cpp:41
+msgid "Threading activity: start, detach, sync, deletion, etc."
+msgstr ""
+"Activité du processus : démarrage, synchronisation, suppression, etc..."
+
+#: common/src/Utilities/ThreadingDialogs.cpp:30
+msgid "Waiting for tasks..."
+msgstr "Veuillez patienter..."
+
+#: common/src/Utilities/ThreadingDialogs.cpp:41
+msgid "Waiting for task..."
+msgstr "Veuillez patienter..."
+
+#: common/src/Utilities/wxAppWithHelpers.cpp:36
+msgid "Includes idle event processing and some other uncommon event usages."
+msgstr "Inclue certains évènements d'usage peu commun."
+
+#: pcsx2/CDVD/IsoFileFormats.cpp:416
+msgid "Unrecognized ISO image file format"
+msgstr "Format du fichier ISO non reconnu."
+
+#: pcsx2/Elfheader.cpp:266
+msgid "Cannot load ELF binary image. The file may be corrupt or incomplete."
+msgstr ""
+"Impossible de charger l'image binaire ELF. Le fichier est sans doute "
+"corrompu ou incomplet."
+
+#: pcsx2/Elfheader.cpp:268
+msgid ""
+"If loading from an ISO image, this error may be caused by an unsupported ISO "
+"image type or a bug in PCSX2 ISO image support."
+msgstr ""
+"Si cette erreur se produit à la suite du montage d'une image ISO, c'est que "
+"le format utilisé ne semble pas être pris en charge par PCSX2."
+
+#: pcsx2/MTGS.cpp:859
+msgid ""
+"The MTGS thread has become unresponsive while waiting for the GS plugin to "
+"open."
+msgstr ""
+"Le processus MTGS ne répondait plus alors qu'il patientait jusqu'au "
+"démarrage du plugin GS."
+
+#: pcsx2/PluginManager.cpp:709
+msgid ""
+"The savestate cannot be loaded, as it appears to be corrupt or incomplete."
+msgstr ""
+"La sauvegarde ne peut pas être chargée, elle est sans doute corrompue ou "
+"incomplète."
+
+#: pcsx2/PluginManager.cpp:719
+#, c-format
+msgid ""
+"%s plugin failed to open. Your computer may have insufficient resources, or "
+"incompatible hardware/drivers."
+msgstr ""
+"Le plugin %s n'a pas pu être ouvert. Votre ordinateur ne dispose pas de "
+"ressources en mémoire suffisantes, ou le plugin est incompatible avec votre "
+"matériel."
+
+#: pcsx2/PluginManager.cpp:726
+#, c-format
+msgid ""
+"%s plugin failed to initialize. Your system may have insufficient memory or "
+"resources needed."
+msgstr ""
+"Le plugin %s n'a pas pu s'initialiser. Votre système ne semble pas disposer "
+"de ressources en mémoire suffisantes."
+
+#: pcsx2/PluginManager.cpp:832
+#, c-format
+msgid "The configured %s plugin file was not found"
+msgstr "Le fichier de configuration du plugin %s est introuvable"
+
+#: pcsx2/PluginManager.cpp:836
+#, c-format
+msgid "The configured %s plugin file is not a valid dynamic library"
+msgstr ""
+"Le fichier de configuration du plugin %s n'utilise pas une librairie "
+"dynamique valide."
+
+#: pcsx2/PluginManager.cpp:854
+#, c-format
+msgid ""
+"The configured %s plugin is not a PCSX2 plugin, or is for an older "
+"unsupported version of PCSX2."
+msgstr ""
+"Le plugin %s n'est pas un plugin PCSX2, ou la version utilisée est trop "
+"ancienne."
+
+#: pcsx2/PluginManager.cpp:879
+msgid ""
+"The plugin reports that your hardware or software/drivers are not supported."
+msgstr ""
+"Le plugin indique que votre matériel ou les drivers utilisés ne sont pas "
+"supportés."
+
+#: pcsx2/PluginManager.cpp:900
+msgid ""
+"Configured plugin is not a PCSX2 plugin, or is for an older unsupported "
+"version of PCSX2."
+msgstr ""
+"Le plugin configuré n'est pas un plugin PCSX2, ou la version utilisée est "
+"trop ancienne."
+
+#: pcsx2/PluginManager.cpp:926
+#, c-format
+msgid ""
+"Configured %s plugin is not a valid PCSX2 plugin, or is for an older "
+"unsupported version of PCSX2."
+msgstr ""
+"Le plugin %s n'est pas un plugin PCSX2, ou la version utilisée est trop "
+"ancienne."
+
+#: pcsx2/PluginManager.cpp:1355
+msgid "Internal Memorycard Plugin failed to initialize."
+msgstr "Le plugin de la Memory Card interne n'a pas pu s'initialiser."
+
+#: pcsx2/PluginManager.cpp:1752
+msgid "Unloaded Plugin"
+msgstr "Plugin non-chargé."
+
+#: pcsx2/SaveState.cpp:342
+msgid "Cannot load savestate. It is of an unknown or unsupported version."
+msgstr ""
+"Impossible de charger la sauvegarde. Elle n'est pas supportée par cette "
+"version du logiciel."
+
+#: pcsx2/SourceLog.cpp:96
+msgid "Dumps detailed information for PS2 executables (ELFs)."
+msgstr "Infomations détaillées des exécutables PS2 (ELF)."
+
+#: pcsx2/SourceLog.cpp:101
+msgid ""
+"Logs manual protection, split blocks, and other things that might impact "
+"performance."
+msgstr ""
+"Protection manuelle des rapports et autres opérations qui peuvent avoir un "
+"impact sur les performances générales."
+
+#: pcsx2/SourceLog.cpp:106
+msgid "Shows the game developer's logging text (EE processor)"
+msgstr "Affiche le rapport textuel des développeurs du jeu (EE processor)"
+
+#: pcsx2/SourceLog.cpp:111
+msgid "Shows the game developer's logging text (IOP processor)"
+msgstr "Affiche le rapport textuel des développeurs du jeu (IOP processor)"
+
+#: pcsx2/SourceLog.cpp:116
+msgid "Shows DECI2 debugging logs (EE processor)"
+msgstr "Affiche les rapports du debogueur DECI2 (EE processor)"
+
+#: pcsx2/SourceLog.cpp:145
+msgid "SYSCALL and DECI2 activity."
+msgstr "Activités SYSCALL et DECI2."
+
+#: pcsx2/SourceLog.cpp:151
+msgid "Direct memory accesses to unknown or unmapped EE memory space."
+msgstr ""
+"Accès direct de la mémoire vers un espace mémoire EE inconnu ou non-mappé."
+
+#: pcsx2/SourceLog.cpp:157 pcsx2/SourceLog.cpp:276
+msgid "Disasm of executing core instructions (excluding COPs and CACHE)."
+msgstr ""
+"/DISASM de l'exécution des instructions de type core (à l'exception des "
+"fonctions COP et CACHE)."
+
+#: pcsx2/SourceLog.cpp:163
+msgid "Disasm of COP0 instructions (MMU, cpu and dma status, etc)."
+msgstr "/DISASM des instructions COP0 (MMU, cpu et statut du dma, etc...)."
+
+#: pcsx2/SourceLog.cpp:169
+msgid "Disasm of the EE's floating point unit (FPU) only."
+msgstr "/DISASM du FPU (Floating Point Unit) EE uniquement."
+
+#: pcsx2/SourceLog.cpp:175
+msgid "Disasm of the EE's VU0macro co-processor instructions."
+msgstr "/DISASM des instructions du co-processeur Vu0macro EE."
+
+#: pcsx2/SourceLog.cpp:181
+msgid "Execution of EE cache instructions."
+msgstr "Exécution des instructions EE en cache."
+
+#: pcsx2/SourceLog.cpp:187
+msgid ""
+"All known hardware register accesses (very slow!); not including sub filter "
+"options below."
+msgstr ""
+"Accès à tous les registres hardware connu (très lent !) : n'inclue pas les "
+"filtres ci-dessous."
+
+#: pcsx2/SourceLog.cpp:193 pcsx2/SourceLog.cpp:294
+msgid "Logs only unknown, unmapped, or unimplemented register accesses."
+msgstr ""
+"Seulement les rapports inconnus, ignorant les non-mappés ou non-implémentés "
+"dans le registre."
+
+#: pcsx2/SourceLog.cpp:199 pcsx2/SourceLog.cpp:300
+msgid "Logs only DMA-related registers."
+msgstr "Seulement les rapports liés au DMA dans les registres."
+
+#: pcsx2/SourceLog.cpp:205
+msgid "IPU activity: hardware registers, decoding operations, DMA status, etc."
+msgstr ""
+"Activité IPU : registres hardware, décodage des variables, statut du DMA, "
+"etc..."
+
+#: pcsx2/SourceLog.cpp:211
+msgid "All GIFtag parse activity; path index, tag type, etc."
+msgstr "Toutes les activités du GIFtag : path index, tag type, etc..."
+
+#: pcsx2/SourceLog.cpp:217
+msgid "All VIFcode processing; command, tag style, interrupts."
+msgstr "Tous les processus du VIFcode : command, tag style, interrupts."
+
+#: pcsx2/SourceLog.cpp:223
+msgid "All processing involved in Path3 Masking"
+msgstr "Toutes les opérations impliquées dans le Path3 Masking"
+
+#: pcsx2/SourceLog.cpp:229
+msgid "Scratchpad's MFIFO activity."
+msgstr "Bloc-note de l'activité MFIFO."
+
+#: pcsx2/SourceLog.cpp:235
+msgid "Actual data transfer logs, bus right arbitration, stalls, etc."
+msgstr ""
+"Données réelles des transferts de rapports, vrai arbitrage du bus, stalls, "
+"etc..."
+
+#: pcsx2/SourceLog.cpp:241
+msgid "Tracks all EE counters events and some counter register activity."
+msgstr "Piste tous les évènements EE et d'autres activités liées au registre."
+
+#: pcsx2/SourceLog.cpp:247
+msgid "Dumps various VIF and VIFcode processing data."
+msgstr "Dump les données des processus VIF et VIFcode."
+
+#: pcsx2/SourceLog.cpp:253
+msgid "Dumps various GIF and GIFtag parsing data."
+msgstr "Dump les données GIF et GIFtag."
+
+#: pcsx2/SourceLog.cpp:264
+msgid "SYSCALL and IRX activity."
+msgstr "Activités SYSCALL et IRX."
+
+#: pcsx2/SourceLog.cpp:270
+msgid "Direct memory accesses to unknown or unmapped IOP memory space."
+msgstr ""
+"Accès direct de la mémoire à un espace mémoire IOP inconnu ou non-mappé."
+
+#: pcsx2/SourceLog.cpp:282
+msgid "Disasm of the IOP's GPU co-processor instructions."
+msgstr "/DISASM des instructions du co-processeur GPU IOP."
+
+#: pcsx2/SourceLog.cpp:288
+msgid ""
+"All known hardware register accesses, not including the sub-filters below."
+msgstr ""
+"Accès à tous les registres hardware connus, à l'exception des filtres ci-"
+"dessous."
+
+#: pcsx2/SourceLog.cpp:306
+msgid "Memorycard reads, writes, erases, terminators, and other processing."
+msgstr ""
+"Lecture, écriture, écrasement, suppression et autres fonctions relatives aux "
+"cartes mémoire."
+
+#: pcsx2/SourceLog.cpp:312
+msgid "Gamepad activity on the SIO."
+msgstr "Activité du joystick sur le SIO."
+
+#: pcsx2/SourceLog.cpp:318
+msgid "Actual DMA event processing and data transfer logs."
+msgstr ""
+"Processus réel des évènements DMA et données relatives au transfert des "
+"rapports."
+
+#: pcsx2/SourceLog.cpp:324
+msgid "Tracks all IOP counters events and some counter register activity."
+msgstr "Piste tous les évènements IOP et d'autres activités liées au registre."
+
+#: pcsx2/SourceLog.cpp:330
+msgid "Detailed logging of CDVD hardware."
+msgstr "Rapport détaillé de l'hardware CDVD."
+
+#: pcsx2/System.h:206 pcsx2/System.h:207 pcsx2/System.h:208
+msgid "PCSX2 Message"
+msgstr "Message PCSX2"
+
+#: pcsx2/ZipTools/thread_gzip.cpp:82
+msgid ""
+"The savestate was not properly saved. The temporary file was created "
+"successfully but could not be moved to its final resting place."
+msgstr ""
+"Le processus de sauvegarde ne s'est pas déroulé comme prévu. Un fichier "
+"temporaire a été créé avec succès mais n'a pas pu être acheminé vers le "
+"dossier choisi."
+
+#: pcsx2/gui/AppConfig.cpp:842
+msgid "Safest"
+msgstr "Le plus sûr"
+
+#: pcsx2/gui/AppConfig.cpp:843
+msgid "Safe (faster)"
+msgstr "Sûr (rapide)"
+
+#: pcsx2/gui/AppConfig.cpp:844
+msgid "Balanced"
+msgstr "Equilibré"
+
+#: pcsx2/gui/AppConfig.cpp:845
+msgid "Aggressive"
+msgstr "Efficace"
+
+#: pcsx2/gui/AppConfig.cpp:846
+msgid "Aggressive plus"
+msgstr "Efficace (+)"
+
+#: pcsx2/gui/AppConfig.cpp:847
+msgid "Mostly Harmful"
+msgstr "Nuisible"
+
+#: pcsx2/gui/AppConfig.cpp:1007 pcsx2/gui/AppConfig.cpp:1013
+msgid "Failed to overwrite existing settings file; permission was denied."
+msgstr ""
+"Erreur lors de l'écrasement des paramètres pré-existants : autorisation "
+"refusée."
+
+#: pcsx2/gui/AppCorePlugins.cpp:404
+msgid "Loading PS2 system plugins..."
+msgstr "Plugins du système en cours de chargement..."
+
+#: pcsx2/gui/AppInit.cpp:41
+msgid "PCSX2 - SSE2 Recommended"
+msgstr "PCSX2 - SSE2 Recommandé"
+
+#: pcsx2/gui/AppInit.cpp:71
+msgid ""
+"SSE extensions are not available. PCSX2 requires a cpu that supports the "
+"SSE instruction set."
+msgstr ""
+"Les extensions SSE ne sont pas disponibles. PCSX2 requiert un CPU qui "
+"supporte les instructions SSE."
+
+#: pcsx2/gui/AppInit.cpp:154
+msgid "PCSX2 Recompiler Error(s)"
+msgstr "Erreurs(s) du PCSX2 Recompiler"
+
+#: pcsx2/gui/AppInit.cpp:227
+msgid "All options are for the current session only and will not be saved.\n"
+msgstr ""
+"Les paramètres ne concernent que la session actuelle et ne seront pas "
+"sauvegardés.\n"
+
+#: pcsx2/gui/AppInit.cpp:237 pcsx2/gui/AppMain.cpp:299
+msgid "IsoFile"
+msgstr "IsoFile"
+
+#: pcsx2/gui/AppInit.cpp:238
+msgid "displays this list of command line options"
+msgstr "affiche la liste des commandes"
+
+#: pcsx2/gui/AppInit.cpp:239
+msgid "forces the program log/console to be visible"
+msgstr "oblige le rapport ou la console du programme à s'afficher"
+
+#: pcsx2/gui/AppInit.cpp:240
+msgid "use fullscreen GS mode"
+msgstr "utilise le mode plein-écran GS"
+
+#: pcsx2/gui/AppInit.cpp:241
+msgid "use windowed GS mode"
+msgstr "utilise le mode fenêtré GS"
+
+#: pcsx2/gui/AppInit.cpp:243
+msgid "disables display of the gui while running games"
+msgstr "désactive l'affichage du GUI lorsqu'un jeu est lancé"
+
+#: pcsx2/gui/AppInit.cpp:244
+msgid "executes an ELF image"
+msgstr "exécute un fichier ELF"
+
+#: pcsx2/gui/AppInit.cpp:245
+msgid "boots an empty dvd tray; use to enter the PS2 system menu"
+msgstr ""
+"démarre à partir d'un DVD vierge : à utiliser pour accéder directement au "
+"menu système de la PS2"
+
+#: pcsx2/gui/AppInit.cpp:246
+msgid "boots from the CDVD plugin (overrides IsoFile parameter)"
+msgstr "démarre depuis le plugin CDVD (remplace les paramètres IsoFile)"
+
+#: pcsx2/gui/AppInit.cpp:248
+msgid "disables all speedhacks"
+msgstr "désactive tous les speedhacks"
+
+#: pcsx2/gui/AppInit.cpp:249
+msgid "use the specified comma or pipe-delimited list of gamefixes."
+msgstr "utilisent les patchs sélectionnés dans la liste."
+
+#: pcsx2/gui/AppInit.cpp:250
+msgid "disables fast booting"
+msgstr "désactive le démarrage rapide"
+
+#: pcsx2/gui/AppInit.cpp:252
+msgid "changes the configuration file path"
+msgstr "modifie le chemin d'accès au fichier de configuration"
+
+#: pcsx2/gui/AppInit.cpp:253
+msgid "specifies the PCSX2 configuration file to use"
+msgstr "spécifie le fichier de configuration PCSX2 à utiliser"
+
+#: pcsx2/gui/AppInit.cpp:254
+#, c-format
+msgid "forces %s to start the First-time Wizard"
+msgstr "oblige %s à démarrer l'assistant de première configuration"
+
+#: pcsx2/gui/AppInit.cpp:255
+msgid "enables portable mode operation (requires admin/root access)"
+msgstr "active le mode portable (requiert les droits d'un administrateur)"
+
+#: pcsx2/gui/AppInit.cpp:259
+#, c-format
+msgid "specify the file to use as the %s plugin"
+msgstr "spécifie que le fichier doit être utilisé comme le plugin %s"
+
+#: pcsx2/gui/AppInit.cpp:307
+#, c-format
+msgid "Plugin Override Error - %s"
+msgstr "Erreur ! Surcharge du plugin - %s"
+
+#: pcsx2/gui/AppInit.cpp:310
+#, c-format
+msgid ""
+"%s Plugin Override Error! The following file does not exist or is not a "
+"valid %s plugin:\n"
+"\n"
+msgstr ""
+"Erreur ! Surcharge du plugin : le fichier n'existe pas ou n'est pas un "
+"plugin %s valide :\n"
+"\n"
+
+#: pcsx2/gui/AppInit.cpp:317
+#, c-format
+msgid "Press OK to use the default configured plugin, or Cancel to close %s."
+msgstr ""
+"Cliquez sur OK pour utiliser la configuration par défaut, ou sur Annuler "
+"pour fermer %s."
+
+#: pcsx2/gui/AppInit.cpp:496
+msgid "PCSX2 Error: Hardware Deficiency"
+msgstr "Erreur PCSX2 : Hardware."
+
+#: pcsx2/gui/AppInit.cpp:496 pcsx2/gui/AppInit.cpp:508
+#, c-format
+msgid "Press OK to close %s."
+msgstr "Cliquez sur OK pour fermer %s."
+
+#: pcsx2/gui/AppInit.cpp:509
+#, c-format
+msgid "%s Critical Error"
+msgstr "Erreur critique de %s !"
+
+#: pcsx2/gui/AppInit.cpp:679
+msgid "OK"
+msgstr "OK"
+
+#: pcsx2/gui/AppInit.cpp:680
+msgid "&OK"
+msgstr "&OK"
+
+#: pcsx2/gui/AppInit.cpp:681
+msgid "Cancel"
+msgstr "Annuler"
+
+#: pcsx2/gui/AppInit.cpp:682
+msgid "&Cancel"
+msgstr "&Annuler"
+
+#: pcsx2/gui/AppInit.cpp:683
+msgid "&Apply"
+msgstr "&Appliquer"
+
+#: pcsx2/gui/AppInit.cpp:684
+msgid "&Next >"
+msgstr "&Suivant >"
+
+#: pcsx2/gui/AppInit.cpp:685
+msgid "< &Back"
+msgstr "< &Précédent"
+
+#: pcsx2/gui/AppInit.cpp:686
+msgid "&Back"
+msgstr "&Retour"
+
+#: pcsx2/gui/AppInit.cpp:687
+msgid "&Finish"
+msgstr "&Terminer"
+
+#: pcsx2/gui/AppInit.cpp:688
+msgid "&Yes"
+msgstr "&Oui"
+
+#: pcsx2/gui/AppInit.cpp:689
+msgid "&No"
+msgstr "&Non"
+
+#: pcsx2/gui/AppInit.cpp:690
+msgid "Browse"
+msgstr "Parcourir"
+
+#: pcsx2/gui/AppInit.cpp:691
+msgid "&Save"
+msgstr "&Enregistrer"
+
+#: pcsx2/gui/AppInit.cpp:692
+msgid "Save &As..."
+msgstr "Enregistrer &sous..."
+
+#: pcsx2/gui/AppInit.cpp:693
+msgid "&Help"
+msgstr "&Aide"
+
+#: pcsx2/gui/AppInit.cpp:694
+msgid "&Home"
+msgstr "&Accueil"
+
+#: pcsx2/gui/AppInit.cpp:696
+msgid "Show about dialog"
+msgstr "Ouvre une boîte de dialogue (qui vaut le coup)."
+
+#: pcsx2/gui/AppMain.cpp:87
+msgid ""
+"\n"
+"\n"
+"Press Ok to go to the Plugin Configuration Panel."
+msgstr ""
+"\n"
+"\n"
+"Cliquez sur OK pour accéder au panel de configuration des plugins."
+
+#: pcsx2/gui/AppMain.cpp:140 pcsx2/gui/AppMain.cpp:154
+msgid ""
+"Warning! System plugins have not been loaded. PCSX2 may be inoperable."
+msgstr ""
+"ATTENTION ! Le système des plugins n'a pas été chargé. PCSX2 ne peut pas "
+"être utilisé."
+
+#: pcsx2/gui/AppMain.cpp:309
+#, c-format
+msgid "%s Commandline Options"
+msgstr "Options de commande de %s"
+
+#: pcsx2/gui/AppMain.cpp:573
+msgid "PS2 BIOS Error"
+msgstr "Erreur ! BIOS PS2"
+
+#: pcsx2/gui/AppMain.cpp:574
+msgid "Press Ok to go to the BIOS Configuration Panel."
+msgstr "Cliquez sur OK pour accéder au panel de configuration du BIOS."
+
+#: pcsx2/gui/AppMain.cpp:626
+msgid "PCSX2 Unresponsive Thread"
+msgstr "Le processus PCSX2 ne répond pas"
+
+#: pcsx2/gui/AppMain.cpp:636
+msgid "Terminate"
+msgstr "Terminer"
+
+#: pcsx2/gui/AppMain.cpp:963
+msgid "Executing PS2 Virtual Machine..."
+msgstr "Exécution de la machine virtuelle PS2..."
+
+#: pcsx2/gui/AppRes.cpp:72
+msgid "Browse for an Iso that is not in your recent history."
+msgstr "Trouve un ISO qui n'apparaît pas dans l'historique récent."
+
+#: pcsx2/gui/AppRes.cpp:72
+msgid "Browse..."
+msgstr "Parcourir..."
+
+#: pcsx2/gui/AppUserMode.cpp:99
+msgid "The following folders exist, but are not writable:"
+msgstr ""
+"Les dossiers suivants existent mais la permission d'écriture est refusée :"
+
+#: pcsx2/gui/AppUserMode.cpp:104
+msgid "The following folders are missing and cannot be created:"
+msgstr "Les dossiers suivants sont absents et ne peuvent pas être créés :"
+
+#: pcsx2/gui/AppUserMode.cpp:144
+#, c-format
+msgid "Portable mode error - %s"
+msgstr "Erreur ! Mode portable %s -"
+
+#: pcsx2/gui/AppUserMode.cpp:157
+msgid ""
+"PCSX2 has been installed as a portable application but cannot run due to the "
+"following errors:"
+msgstr ""
+"PCSX2 a été installée comme une application portable mais ne peut pas se "
+"lancer à cause des erreurs suivantes :"
+
+#: pcsx2/gui/AppUserMode.cpp:165
+msgid "Switch to User Documents Mode"
+msgstr "Utiliser le mode User Documents"
+
+#: pcsx2/gui/AppUserMode.cpp:178
+#, c-format
+msgid "%s is switching to local install mode."
+msgstr "%s utilise à présent le mode d'installation local"
+
+#: pcsx2/gui/AppUserMode.cpp:179
+msgid ""
+"Try to remove the file called \"portable.ini\" from your installation "
+"directory manually."
+msgstr ""
+"Essayez d'effacer manuellement le fichier \"portable.ini\" du répertoire "
+"d'installation."
+
+#: pcsx2/gui/ApplyState.h:55
+msgid "Cannot apply new settings, one of the settings is invalid."
+msgstr ""
+"Impossible d'appliquer les nouveaux paramètres, l'un d'entre eux n'est pas "
+"valide."
+
+#: pcsx2/gui/ConsoleLogger.cpp:120
+msgid "Save log question"
+msgstr "Sauvegarder le log"
+
+#: pcsx2/gui/ConsoleLogger.cpp:413
+msgid "Fits a lot of log in a microcosmically small area."
+msgstr "Regroupe un nombre important de logs dans un espace réduit."
+
+#: pcsx2/gui/ConsoleLogger.cpp:413
+msgid "Small"
+msgstr "Petit"
+
+#: pcsx2/gui/ConsoleLogger.cpp:415
+msgid "It's what I use (the programmer guy)."
+msgstr "C'est ce que j'utilise (le mec qui programme)."
+
+#: pcsx2/gui/ConsoleLogger.cpp:415 pcsx2/gui/Panels/CpuPanel.cpp:38
+msgid "Normal"
+msgstr "Normal"
+
+#: pcsx2/gui/ConsoleLogger.cpp:417
+msgid "Its nice and readable."
+msgstr "C'est sympa et lisible."
+
+#: pcsx2/gui/ConsoleLogger.cpp:417
+msgid "Large"
+msgstr "Moyen"
+
+#: pcsx2/gui/ConsoleLogger.cpp:419
+msgid "Huge"
+msgstr "Grand"
+
+#: pcsx2/gui/ConsoleLogger.cpp:419
+msgid "In case you have a really high res display."
+msgstr "Au cas où vous utiliseriez une résolution d'écran VRAIMENT élevée."
+
+#: pcsx2/gui/ConsoleLogger.cpp:423
+msgid "Default soft-tone color scheme."
+msgstr "Thème par défaut."
+
+#: pcsx2/gui/ConsoleLogger.cpp:423
+msgid "Light theme"
+msgstr "Thème \"Light\""
+
+#: pcsx2/gui/ConsoleLogger.cpp:424
+msgid ""
+"Classic black color scheme for people who enjoy having text seared into "
+"their optic nerves."
+msgstr "Thème \"Classic black\""
+
+#: pcsx2/gui/ConsoleLogger.cpp:424
+msgid "Dark theme"
+msgstr "Thème \"Dark\""
+
+#: pcsx2/gui/ConsoleLogger.cpp:427
+msgid "Always on Top"
+msgstr "Toujours au-dessus"
+
+#: pcsx2/gui/ConsoleLogger.cpp:428
+msgid ""
+"When checked the log window will be visible over other foreground windows."
+msgstr ""
+"Une fois cochée, la fenêtre de dialogue restera toujours par-dessus les "
+"autres fenêtres."
+
+#: pcsx2/gui/ConsoleLogger.cpp:430
+msgid "&Save..."
+msgstr "&Enregistrer..."
+
+#: pcsx2/gui/ConsoleLogger.cpp:430
+msgid "Save log contents to file"
+msgstr "Sauvegarder le contenu du log dans un fichier"
+
+#: pcsx2/gui/ConsoleLogger.cpp:431
+msgid "C&lear"
+msgstr "N&ettoyer"
+
+#: pcsx2/gui/ConsoleLogger.cpp:431
+msgid "Clear the log window contents"
+msgstr "Nettoyer le contenu du log dans la fenêtre"
+
+#: pcsx2/gui/ConsoleLogger.cpp:433 pcsx2/gui/Dialogs/SysConfigDialog.cpp:280
+msgid "Appearance"
+msgstr "Apparence"
+
+#: pcsx2/gui/ConsoleLogger.cpp:435
+msgid "&Close"
+msgstr "&Fermer"
+
+#: pcsx2/gui/ConsoleLogger.cpp:435
+msgid "Close this log window; contents are preserved"
+msgstr "Fermer la fenêtre du log : le contenu sera préservé"
+
+#: pcsx2/gui/ConsoleLogger.cpp:439
+msgid "Dev/Verbose"
+msgstr "Dev / Impression"
+
+#: pcsx2/gui/ConsoleLogger.cpp:439
+msgid "Shows PCSX2 developer logs"
+msgstr "Affiche les logs des développeurs de PCSX2"
+
+#: pcsx2/gui/ConsoleLogger.cpp:440
+msgid "CDVD reads"
+msgstr "Lecture CDVD"
+
+#: pcsx2/gui/ConsoleLogger.cpp:440
+msgid "Shows disk read activity"
+msgstr "Affiche l'activité de la lecture du disque"
+
+#: pcsx2/gui/ConsoleLogger.cpp:457
+msgid "Enable all"
+msgstr "Tout activer"
+
+#: pcsx2/gui/ConsoleLogger.cpp:457
+msgid "Enables all log source filters."
+msgstr "Activer tous les filtres source du log."
+
+#: pcsx2/gui/ConsoleLogger.cpp:458
+msgid "Disable all"
+msgstr "Tout désactiver"
+
+#: pcsx2/gui/ConsoleLogger.cpp:458
+msgid "Disables all log source filters."
+msgstr "Désactiver tous les filtres source du log."
+
+#: pcsx2/gui/ConsoleLogger.cpp:460
+msgid "&Log"
+msgstr "&Rapport"
+
+#: pcsx2/gui/ConsoleLogger.cpp:461
+msgid "&Sources"
+msgstr "&Sources"
+
+#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:35
+#, c-format
+msgid "About %s"
+msgstr "En savoir plus sur %s !"
+
+#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:55
+msgid "Betatesting"
+msgstr "Beta-test"
+
+#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:55
+msgid "Previous versions"
+msgstr "Versions précédentes"
+
+#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:55
+msgid "Webmasters"
+msgstr "Webmestres"
+
+#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:66
+msgid "Plugin Specialists"
+msgstr "Spécialistes plugins"
+
+#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:66
+msgid "Special thanks to"
+msgstr "Remerciements particuliers à"
+
+#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:82
+msgid "Developers"
+msgstr "Développeurs :"
+
+#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:84
+msgid "Contributors"
+msgstr "Ils ont contribué :"
+
+#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:98
+msgid "A Playstation 2 Emulator"
+msgstr "Un émulateur Playstation 2"
+
+#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:102
+msgid "PCSX2 Official Website and Forums"
+msgstr "Site internet/forums officiels PCSX2"
+
+#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:106
+msgid "PCSX2 Official Svn Repository at Googlecode"
+msgstr "Répertoire Svn officiel PCSX2 (sur Googlecode)"
+
+#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:110
+msgid "I've seen enough"
+msgstr "C'est bon, j'ai compris !"
+
+#: pcsx2/gui/Dialogs/AssertionDialog.cpp:23
+msgid "Assertion Failure - "
+msgstr "Assertion Failure -"
+
+#: pcsx2/gui/Dialogs/BaseConfigurationDialog.cpp:193
+msgid "Saves a snapshot of this settings panel to a PNG file."
+msgstr "Sauvegarder une image d'écran des paramètres (fichier PNG)."
+
+#: pcsx2/gui/Dialogs/BaseConfigurationDialog.cpp:308
+msgid "Save dialog screenshots to..."
+msgstr "Sauvegarder les images vers..."
+
+#: pcsx2/gui/Dialogs/BiosSelectorDialog.cpp:31
+msgid "BIOS Selector"
+msgstr "Choix du BIOS"
+
+#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:193
+msgid "Do not show this dialog again."
+msgstr "Ne plus montrer cette fenêtre."
+
+#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:199
+msgid ""
+"Disables this popup and whatever response you select here will be "
+"automatically used from now on."
+msgstr "Désactive cette fenêtre et se rappellera de la réponse choisie ici."
+
+#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:201
+msgid ""
+"The popup will not be shown again. This setting can be undone from the "
+"settings panels."
+msgstr ""
+"Cette fenêtre ne s'affichera plus à l'avenir. Les paramètres peuvent être "
+"réinitialisés à partir du panel concerné."
+
+#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:247
+#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:292
+msgid "Ignore"
+msgstr "Ignorer"
+
+#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:278
+msgid "Reset"
+msgstr "Réinitialiser"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:40
+msgid "Create a new memory card"
+msgstr "Créer une nouvelle carte mémoire"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:59
+#: pcsx2/gui/Panels/DirPickerPanel.cpp:74
+#: pcsx2/gui/Panels/DirPickerPanel.cpp:273
+msgid "Create"
+msgstr "Créer"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:71
+msgid "New memory card:"
+msgstr "Nouvelle carte mémoire :"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:72
+msgid "At folder: "
+msgstr "Dans le dossier :"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:75
+msgid "Select file name: "
+msgstr "Nom du fichier :"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:149
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:855
+#, c-format
+msgid "Error (%s)"
+msgstr "Erreur (%s)"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:150
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:164
+msgid "Create memory card"
+msgstr "Créer une carte mémoire"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:163
+msgid "Error: The memory card could not be created."
+msgstr "Erreur ! La carte mémoire n'a pas pu être créée."
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:177
+msgid "Use NTFS compression when creating this card."
+msgstr "Utiliser une compression NTFS pour créer la carte."
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:195
+msgid "8 MB [most compatible]"
+msgstr "8 MB [la plus compatible]"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:195
+msgid ""
+"This is the standard Sony-provisioned size, and is supported by all games "
+"and BIOS versions."
+msgstr ""
+"Il s'agit de la taille standard prévue par Sony, et elle est supportée par "
+"tous les jeux (ainsi que tous les BIOS existants)."
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:196
+msgid ""
+"Always use this option if you want the safest and surest memory card "
+"behavior."
+msgstr ""
+"Toujours utiliser cette option pour être sûr d'éviter les sauvegardes "
+"corrompues."
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:199
+msgid "16 MB"
+msgstr "16 MB"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:199
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:203
+msgid ""
+"A typical size for 3rd-party memory cards which should work with most games."
+msgstr ""
+"Le format classique des cartes mémoires non-officielles, qui devraient "
+"marcher avec la plupart des jeux."
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:200
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:204
+msgid "16 and 32 MB cards have roughly the same compatibility factor."
+msgstr ""
+"Les cartes mémoire de 16 et 32 MB possèdent des facteurs de compatibilité "
+"similaires."
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:203
+msgid "32 MB"
+msgstr "32 MB"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:207
+msgid "64 MB"
+msgstr "64 MB"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:207
+msgid ""
+"Low compatibility warning: Yes it's very big, but may not work with many "
+"games."
+msgstr ""
+"Attention ! La compatibilité est réduite : certes, c'est très gros, mais la "
+"plupart des jeux ne marcheront pas avec."
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:208
+msgid ""
+"Use at your own risk. Erratic memory card behavior is possible (though "
+"unlikely)."
+msgstr ""
+"A vos risques et périls. La carte mémoire pourrait rencontrer des erreurs "
+"critiques."
+
+#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:47
+#, c-format
+msgid "Select a folder for %s settings"
+msgstr "Sélectionner un dossier pour les paramètres de %s"
+
+#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:47
+msgid "Settings"
+msgstr "Paramètres"
+
+#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:81
+msgid "Language selector"
+msgstr "Choix de la langue"
+
+#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:84
+msgid ""
+"Change the language only if you need to.\n"
+"The system default should be fine for most operating systems."
+msgstr ""
+"Ne changez la langue que si vous en avez réellement besoin.\n"
+"Le système par défaut fonctionne bien, la plupart du temps."
+
+#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:90
+msgid "Welcome to PCSX2!"
+msgstr "Bienvenue dans PCSX2 !"
+
+#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:104
+msgid "Configuration Guides (online)"
+msgstr "Guides de configuration (online)"
+
+#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:108
+msgid "Readme / FAQ (Offline/PDF)"
+msgstr "Lisez-moi / FAQ (offline - fichier PDF)"
+
+#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:117
+#, c-format
+msgid "%s First Time Configuration"
+msgstr "Première configuration de %s"
+
+#: pcsx2/gui/Dialogs/GameDatabaseDialog.cpp:24
+#, c-format
+msgid "Game database - %s"
+msgstr "Base de données - %s"
+
+#: pcsx2/gui/Dialogs/ImportSettingsDialog.cpp:24
+msgid "Import Existing Settings?"
+msgstr "Importer les paramètres existants ?"
+
+#: pcsx2/gui/Dialogs/ImportSettingsDialog.cpp:39
+msgid "Import"
+msgstr "Importer"
+
+#: pcsx2/gui/Dialogs/ImportSettingsDialog.cpp:40
+msgid "Overwrite"
+msgstr "Ecraser"
+
+#: pcsx2/gui/Dialogs/LogOptionsDialog.cpp:27
+msgid "Trace Logging"
+msgstr "Rapport automatique"
+
+#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:40
+msgid "Auto-eject memory cards when loading savestates"
+msgstr ""
+"Éjecter automatiquement les cartes mémoire lorsqu'une sauvegarde virtuelle "
+"est chargée"
+
+#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:96
+msgid "MemoryCard Manager"
+msgstr "Gestionnaire de cartes mémoire"
+
+#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:112
+msgid "Drag cards to or from PS2-ports"
+msgstr "Lecture des cartes mémoire vers / depuis les ports PS2"
+
+#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:113
+msgid ""
+"\n"
+"Note: Duplicate/Rename/Create/Delete will NOT be reverted with 'Cancel'."
+msgstr ""
+"\n"
+"PS. Les fonctions disponibles ne peuvent PAS être annulées gâce au bouton "
+"\"Annuler\"."
+
+#: pcsx2/gui/Dialogs/PickUserModeDialog.cpp:24
+msgid "PCSX2 First Time configuration"
+msgstr "Première configuration de PCSX2"
+
+#: pcsx2/gui/Dialogs/PickUserModeDialog.cpp:29
+#, c-format
+msgid "%s is starting from a new or unknown folder and needs to be configured."
+msgstr "%s est lancé depuis un nouveau dossier et nécessite d'être configuré."
+
+#: pcsx2/gui/Dialogs/StuckThreadDialog.cpp:28
+msgid "PCSX2 Thread is not responding"
+msgstr "Le programme PCSX2 ne répond pas"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:36
+msgid "Config Overrides Warning"
+msgstr "Attention ! Configuration écrasée !"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:56
+msgid "Components Overrides Warning"
+msgstr "Attention ! Composants remplacés !"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:147
+msgid "Preset:"
+msgstr "Préréglage :"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:228
+#, c-format
+msgid "Emulation Settings - %s"
+msgstr "Paramètres d'émulation - %s"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:237
+msgid "EE/IOP"
+msgstr "EE/IOP"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:238
+msgid "VUs"
+msgstr "VUs"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:239
+msgid "GS"
+msgstr "GS"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:240
+msgid "GS Window"
+msgstr "Mode fenêtré (GS)"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:241
+msgid "Speedhacks"
+msgstr "Speedhacks"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:242
+msgid "Game Fixes"
+msgstr "Patchs"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:253
+#, c-format
+msgid "Components Selectors - %s"
+msgstr "Gestionnaire de composants - %s"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:260
+msgid "Plugins"
+msgstr "Plugins"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:261
+msgid "BIOS"
+msgstr "BIOS"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:262
+msgid "Folders"
+msgstr "Dossiers"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:273
+#, c-format
+msgid "Appearance/Themes - %s"
+msgstr "Apparence / Thèmes - %s"
+
+#: pcsx2/gui/ExecutorThread.cpp:40
+msgid "Logs events as they are passed to the PS2 virtual machine."
+msgstr ""
+"Enregistre les évènements comme s'ils se déroulaient sur une vraie PS2."
+
+#: pcsx2/gui/ExecutorThread.cpp:430
+msgid "Press Cancel to attempt to cancel the action."
+msgstr "Cliquez sur Annuler pour essayer d'interrompre l'opération en cours."
+
+#: pcsx2/gui/ExecutorThread.cpp:431
+#, c-format
+msgid "Press Terminate to kill %s immediately."
+msgstr "Appuyez sur Terminer pour mettre immédiatement fin à %s."
+
+#: pcsx2/gui/ExecutorThread.cpp:434
+msgid "Terminate App"
+msgstr "Terminer l'application"
+
+#: pcsx2/gui/FrameForGS.cpp:384
+msgid "GS Output is Disabled!"
+msgstr "La sortie GS est désactivée !"
+
+#: pcsx2/gui/GlobalCommands.cpp:387 pcsx2/gui/MainFrame.cpp:414
+msgid "Save state"
+msgstr "Sauvegarder"
+
+#: pcsx2/gui/GlobalCommands.cpp:388
+msgid "Saves the virtual machine state to the current slot."
+msgstr ""
+"Sauvegarder les paramètres de la machine virtuelle vers l'emplacement actuel."
+
+#: pcsx2/gui/GlobalCommands.cpp:393 pcsx2/gui/MainFrame.cpp:413
+msgid "Load state"
+msgstr "Charger"
+
+#: pcsx2/gui/GlobalCommands.cpp:394
+msgid "Loads a virtual machine state from the current slot."
+msgstr ""
+"Charger les paramètres de la machine virtuelle vers l'emplacement actuel."
+
+#: pcsx2/gui/GlobalCommands.cpp:399
+msgid "Load State Backup"
+msgstr "Charger le backup."
+
+#: pcsx2/gui/GlobalCommands.cpp:400
+msgid "Loads virtual machine state backup for current slot."
+msgstr "Charger le backup de la machine vituelle sur l'emplacement actuel."
+
+#: pcsx2/gui/GlobalCommands.cpp:405
+msgid "Cycle to next slot"
+msgstr "Passer à l'emplacement suivant"
+
+#: pcsx2/gui/GlobalCommands.cpp:406
+msgid "Cycles the current save slot in +1 fashion!"
+msgstr "On passe au slot suivant !"
+
+#: pcsx2/gui/GlobalCommands.cpp:411
+msgid "Cycle to prev slot"
+msgstr "Passer à l'emplacement précédent"
+
+#: pcsx2/gui/GlobalCommands.cpp:412
+msgid "Cycles the current save slot in -1 fashion!"
+msgstr "On passe au slot précédent !"
+
+#: pcsx2/gui/IsoDropTarget.cpp:57
+msgid "Drag and Drop Error"
+msgstr "Erreur du glisser-déposer !"
+
+#: pcsx2/gui/IsoDropTarget.cpp:58
+#, c-format
+msgid ""
+"It is an error to drop multiple files onto a %s window. One at a time "
+"please, thank you."
+msgstr ""
+"Vous ne pouvez pas glisser plusieurs fichiers à la fois vers une fenêtre %s. "
+"Un seul à la fois, merci."
+
+#: pcsx2/gui/IsoDropTarget.cpp:89 pcsx2/gui/MainMenuClicks.cpp:342
+msgid "Confirm PS2 Reset"
+msgstr "Confirmer la réinitialisation de la PS2"
+
+#: pcsx2/gui/IsoDropTarget.cpp:91
+#, c-format
+msgid ""
+"You have dropped the following ELF binary into %s:\n"
+"\n"
+msgstr ""
+"Vous avez déposé le fichier ELF dans %s:\n"
+"\n"
+
+#: pcsx2/gui/IsoDropTarget.cpp:135
+#, c-format
+msgid "You have dropped the following ISO image into %s:"
+msgstr "Vous avez déposé l'image ISO dans %s :"
+
+#: pcsx2/gui/MainFrame.cpp:38
+#, c-format
+msgid "Slot %d"
+msgstr "Emplacement %d"
+
+#: pcsx2/gui/MainFrame.cpp:44 pcsx2/gui/Saveslots.cpp:150
+msgid "Backup"
+msgstr "Backup"
+
+#: pcsx2/gui/MainFrame.cpp:324
+msgid "Show Console"
+msgstr "Afficher la console"
+
+#: pcsx2/gui/MainFrame.cpp:325
+msgid "Console to Stdio"
+msgstr "Console vers Stdio"
+
+#: pcsx2/gui/MainFrame.cpp:338
+msgid "&System"
+msgstr "&Système"
+
+#: pcsx2/gui/MainFrame.cpp:339
+msgid "CD&VD"
+msgstr "CD/DVD"
+
+#: pcsx2/gui/MainFrame.cpp:340
+msgid "&Config"
+msgstr "&Configuration"
+
+#: pcsx2/gui/MainFrame.cpp:341
+msgid "&Misc"
+msgstr "&Autres"
+
+#: pcsx2/gui/MainFrame.cpp:343
+msgid "&Debug"
+msgstr "&Debogueur"
+
+#: pcsx2/gui/MainFrame.cpp:355
+#, c-format
+msgid "%s %d.%d.%d.%d%s (svn) %s"
+msgstr "%s %d.%d.%d.%d%s (svn) %s"
+
+#: pcsx2/gui/MainFrame.cpp:361
+#, c-format
+msgid "%s %d.%d.%d %s"
+msgstr "%s %d.%d.%d %s"
+
+#: pcsx2/gui/MainFrame.cpp:362
+msgid "(modded)"
+msgstr "(modded)"
+
+#: pcsx2/gui/MainFrame.cpp:399 pcsx2/gui/MainFrame.cpp:401
+#: pcsx2/gui/MainFrame.cpp:407
+msgid "Initializing..."
+msgstr "Initialisation en cours..."
+
+#: pcsx2/gui/MainFrame.cpp:403
+msgid "Run ELF..."
+msgstr "Démarrage du ELF..."
+
+#: pcsx2/gui/MainFrame.cpp:404
+msgid "For running raw PS2 binaries directly"
+msgstr "Pour lancer directement des fichiers exécutables binaires."
+
+#: pcsx2/gui/MainFrame.cpp:416
+msgid "Backup before save"
+msgstr "Faire un backup avant de sauvegarder"
+
+#: pcsx2/gui/MainFrame.cpp:421
+msgid "Automatic Gamefixes"
+msgstr "Patchs automatiques"
+
+#: pcsx2/gui/MainFrame.cpp:422
+msgid "Automatically applies needed Gamefixes to known problematic games"
+msgstr "Applique automatiquement les patchs associés à certains jeux."
+
+#: pcsx2/gui/MainFrame.cpp:424
+msgid "Enable Cheats"
+msgstr "Activer les codes de triche"
+
+#: pcsx2/gui/MainFrame.cpp:427
+msgid "Enable Host Filesystem"
+msgstr "Activer le Host Filesystem"
+
+#: pcsx2/gui/MainFrame.cpp:432
+msgid "Shutdown"
+msgstr "Éteindre le jeu"
+
+#: pcsx2/gui/MainFrame.cpp:433
+msgid "Wipes all internal VM states and shuts down plugins."
+msgstr "Coupe toutes les opérations en cours et réinitialise les plugins."
+
+#: pcsx2/gui/MainFrame.cpp:435
+msgid "Exit"
+msgstr "Quitter"
+
+#: pcsx2/gui/MainFrame.cpp:436
+#, c-format
+msgid "Closing %s may be hazardous to your health"
+msgstr "Fermer %s est dangereux pour la santé !"
+
+#: pcsx2/gui/MainFrame.cpp:443
+msgid "Iso Selector"
+msgstr "Choisir un ISO"
+
+#: pcsx2/gui/MainFrame.cpp:444
+msgid "Plugin Menu"
+msgstr "Gestionnaire de plugins"
+
+#: pcsx2/gui/MainFrame.cpp:447
+msgid "Iso"
+msgstr "ISO"
+
+#: pcsx2/gui/MainFrame.cpp:447
+msgid "Makes the specified ISO image the CDVD source."
+msgstr "Utilise l'image ISO choisie comme un disque PS2."
+
+#: pcsx2/gui/MainFrame.cpp:448
+msgid "Plugin"
+msgstr "Plugin"
+
+#: pcsx2/gui/MainFrame.cpp:448
+msgid "Uses an external plugin as the CDVD source."
+msgstr "Utilise un plugin externe en tant que CDVD-source."
+
+#: pcsx2/gui/MainFrame.cpp:449
+msgid "No disc"
+msgstr "Pas de disque"
+
+#: pcsx2/gui/MainFrame.cpp:449
+msgid "Use this to boot into your virtual PS2's BIOS configuration."
+msgstr "Permet la configuration du BIOS de votre PS2 virtuelle."
+
+#: pcsx2/gui/MainFrame.cpp:457
+msgid "Emulation &Settings"
+msgstr "Paramètres &d'émulation"
+
+#: pcsx2/gui/MainFrame.cpp:458
+msgid "&Memory cards"
+msgstr "&Cartes mémoire"
+
+#: pcsx2/gui/MainFrame.cpp:459
+msgid "&Plugin/BIOS Selector"
+msgstr "&Choix des Plugins/BIOS"
+
+#: pcsx2/gui/MainFrame.cpp:460 pcsx2/gui/Panels/GameDatabasePanel.cpp:346
+msgid "Game Database Editor"
+msgstr "Editeur de base de données"
+
+#: pcsx2/gui/MainFrame.cpp:466
+msgid "&Video (GS)"
+msgstr "&Vidéo (GS)"
+
+#: pcsx2/gui/MainFrame.cpp:467
+msgid "&Audio (SPU2)"
+msgstr "&Son (SPU2)"
+
+#: pcsx2/gui/MainFrame.cpp:468
+msgid "&Controllers (PAD)"
+msgstr "&Contrôleurs (PAD)"
+
+#: pcsx2/gui/MainFrame.cpp:469
+msgid "Dev9"
+msgstr "Dev9"
+
+#: pcsx2/gui/MainFrame.cpp:470
+msgid "USB"
+msgstr "USB"
+
+#: pcsx2/gui/MainFrame.cpp:471
+msgid "Firewire"
+msgstr "Sans-fil"
+
+#: pcsx2/gui/MainFrame.cpp:477
+msgid "Multitap 1"
+msgstr "Multitap 1"
+
+#: pcsx2/gui/MainFrame.cpp:478
+msgid "Multitap 2"
+msgstr "Multitap 2"
+
+#: pcsx2/gui/MainFrame.cpp:481
+msgid "Clear all settings..."
+msgstr "Effacer tous les paramètres..."
+
+#: pcsx2/gui/MainFrame.cpp:482
+#, c-format
+msgid "Clears all %s settings and re-runs the startup wizard."
+msgstr ""
+"Efface tous les paramètres de %s et relance l'assistant de première "
+"configuration."
+
+#: pcsx2/gui/MainFrame.cpp:504
+msgid "About..."
+msgstr "À propos de..."
+
+#: pcsx2/gui/MainFrame.cpp:508
+msgid "Logging..."
+msgstr "Connexion en cours..."
+
+#: pcsx2/gui/MainFrame.cpp:585
+msgid "Pause"
+msgstr "Pause"
+
+#: pcsx2/gui/MainFrame.cpp:586
+msgid "Safely pauses emulation and preserves the PS2 state."
+msgstr "Met l'émulation en pause et préserve son bon fonctionnement."
+
+#: pcsx2/gui/MainFrame.cpp:593
+msgid "Resume"
+msgstr "Reprendre le jeu"
+
+#: pcsx2/gui/MainFrame.cpp:594
+msgid "Resumes the suspended emulation state."
+msgstr "Relance l'émulation là où elle s'était arrêtée."
+
+#: pcsx2/gui/MainFrame.cpp:598
+msgid "Pause/Resume"
+msgstr "Pause / Reprendre"
+
+#: pcsx2/gui/MainFrame.cpp:599
+msgid "No emulation state is active; cannot suspend or resume."
+msgstr ""
+"Aucune émulation en cours : impossible d'interrompre ou de reprendre "
+"l'activité."
+
+#: pcsx2/gui/MainFrame.cpp:608
+msgid "Restart"
+msgstr "Redémarrer"
+
+#: pcsx2/gui/MainFrame.cpp:609
+msgid "Simulates hardware reset of the PS2 virtual machine."
+msgstr "Simule une réinitilisation de la PS2 virtuelle."
+
+#: pcsx2/gui/MainFrame.cpp:614
+msgid "No emulation state is active; boot something first."
+msgstr "Pas d'émulation en cours : lancez quelque chose, d'abord !"
+
+#: pcsx2/gui/MainFrame.cpp:622
+msgid "Reboot CDVD (full)"
+msgstr "Relancer le CDVD (complet)"
+
+#: pcsx2/gui/MainFrame.cpp:623
+msgid "Hard reset of the active VM."
+msgstr "Redémarrage intégral du système d'émulation."
+
+#: pcsx2/gui/MainFrame.cpp:627
+msgid "Boot CDVD (full)"
+msgstr "Démarrer le CDVD (complet)"
+
+#: pcsx2/gui/MainFrame.cpp:628
+msgid "Boot the VM using the current DVD or Iso source media"
+msgstr "Démarre le système à partir du DVD ou de l'ISO source."
+
+#: pcsx2/gui/MainFrame.cpp:636
+msgid "Reboot CDVD (fast)"
+msgstr "Relancer le CDVD (rapide)"
+
+#: pcsx2/gui/MainFrame.cpp:637
+msgid "Reboot using fast BOOT (skips splash screens)"
+msgstr "Redémarrage rapide du système d'émulation (saute les logos PS2/Sony)."
+
+#: pcsx2/gui/MainFrame.cpp:641
+msgid "Boot CDVD (fast)"
+msgstr "Démarrer le CDVD (rapide)"
+
+#: pcsx2/gui/MainFrame.cpp:642
+msgid "Use fast boot to skip PS2 startup and splash screens"
+msgstr "Démarre le système en sautant les logos PS2/Sony."
+
+#: pcsx2/gui/MainFrame.cpp:703 pcsx2/gui/MainFrame.cpp:738
+msgid "No plugin loaded"
+msgstr "Aucun plugin chargé"
+
+#: pcsx2/gui/MainFrame.cpp:708
+msgid "Core GS Settings..."
+msgstr "Paramètres du Core GS..."
+
+#: pcsx2/gui/MainFrame.cpp:709
+msgid ""
+"Modify hardware emulation settings regulated by the PCSX2 core virtual "
+"machine."
+msgstr "Modifie les paramètres d'émulation hardware gérés par PCSX2."
+
+#: pcsx2/gui/MainFrame.cpp:711
+msgid "Window Settings..."
+msgstr "Paramètres du mode fenêtré..."
+
+#: pcsx2/gui/MainFrame.cpp:712
+msgid "Modify window and appearance options, including aspect ratio."
+msgstr "Modifie la fenêtre et l'apparence, notamment l'aspect ratio."
+
+#: pcsx2/gui/MainFrame.cpp:719
+msgid "Plugin Settings..."
+msgstr "Paramètres du plugin..."
+
+#: pcsx2/gui/MainFrame.cpp:720
+#, c-format
+msgid "Opens the %s plugin's advanced settings dialog."
+msgstr "Ouvre la fenêtre de configuration avancée du plugin %s."
+
+#: pcsx2/gui/MainMenuClicks.cpp:112
+msgid "Reset all settings?"
+msgstr "Réinitialiser tous les paramètres ?"
+
+#: pcsx2/gui/MainMenuClicks.cpp:140
+msgid "Confirm ISO image change"
+msgstr "Confirmer le changement d'image ISO"
+
+#: pcsx2/gui/MainMenuClicks.cpp:146
+msgid "Do you want to swap discs or boot the new image (via system reset)?"
+msgstr ""
+"Voulez-vous changer de disque ou lancer une nouvelle image-disque "
+"(réinitilisation du système) ?"
+
+#: pcsx2/gui/MainMenuClicks.cpp:148 pcsx2/gui/MainMenuClicks.cpp:194
+msgid "Swap Disc"
+msgstr "Changer de disque"
+
+#: pcsx2/gui/MainMenuClicks.cpp:184
+msgid "Confirm CDVD source change"
+msgstr "Confirmer le changement de CDVD"
+
+#: pcsx2/gui/MainMenuClicks.cpp:187
+#, c-format
+msgid "You've selected to switch the CDVD source from %s to %s."
+msgstr "Vous avez choisi de changer le CDVD %s pour %s."
+
+#: pcsx2/gui/MainMenuClicks.cpp:191
+msgid "Do you want to swap discs or boot the new image (system reset)?"
+msgstr ""
+"Voulez-vous changer de disque ou démarrer une nouvelle image-disque "
+"(réinitilisation du système) ?"
+
+#: pcsx2/gui/MainMenuClicks.cpp:261
+#, c-format
+msgid "All Supported (%s)"
+msgstr "Tous les fichiers supportés (%s)"
+
+#: pcsx2/gui/MainMenuClicks.cpp:264
+#, c-format
+msgid "Disc Images (%s)"
+msgstr "Images disque (%s)"
+
+#: pcsx2/gui/MainMenuClicks.cpp:267
+#, c-format
+msgid "Blockdumps (%s)"
+msgstr "Blockdumps (%s)"
+
+#: pcsx2/gui/MainMenuClicks.cpp:270 pcsx2/gui/MainMenuClicks.cpp:291
+msgid "All Files (*.*)"
+msgstr "Tous les fichiers (*.*)"
+
+#: pcsx2/gui/MainMenuClicks.cpp:273
+msgid "Select CDVD source iso..."
+msgstr "Choisir un ISO..."
+
+#: pcsx2/gui/MainMenuClicks.cpp:290
+msgid "Select ELF file..."
+msgstr "Choisir un fichier ELF..."
+
+#: pcsx2/gui/MainMenuClicks.cpp:316
+msgid "ISO file not found!"
+msgstr "Fichier ISO introuvable !"
+
+#: pcsx2/gui/MainMenuClicks.cpp:318
+msgid "An error occurred while trying to open the file:"
+msgstr "Une erreur s'est produite alors que le fichier tentait d'être ouvert :"
+
+#: pcsx2/gui/MainMenuClicks.cpp:319
+msgid ""
+"Error: The configured ISO file does not exist. Click OK to select a new ISO "
+"source for CDVD."
+msgstr ""
+"Erreur ! Le fichier ISO configuré n'existe pas. Cliquez sur OK pour choisir "
+"un autre ISO."
+
+#: pcsx2/gui/MainMenuClicks.cpp:390
+msgid ""
+"You have selected the following ISO image into PCSX2:\n"
+"\n"
+msgstr ""
+"Vous avez choisi l'image ISO suivante : \n"
+"\n"
+
+#: pcsx2/gui/MemoryCardFile.cpp:183
+#, c-format
+msgid ""
+"Could not create a memory card: \n"
+"\n"
+"%s\n"
+"\n"
+msgstr ""
+"Impossible de créer une carte mémoire : \n"
+"\n"
+"%s\n"
+"\n"
+
+#: pcsx2/gui/MemoryCardFile.cpp:201
+#, c-format
+msgid ""
+"Access denied to memory card: \n"
+"\n"
+"%s\n"
+"\n"
+msgstr ""
+"Accès à la carte mémoire refusé : \n"
+"\n"
+"%s\n"
+"\n"
+
+#: pcsx2/gui/MemoryCardFile.cpp:525
+msgid "File name empty or too short"
+msgstr "Nom du fichier absent ou trop court"
+
+#: pcsx2/gui/MemoryCardFile.cpp:530
+msgid "File name outside of required directory"
+msgstr "Nom du fichier extérieur au dossier"
+
+#: pcsx2/gui/MemoryCardFile.cpp:536
+msgid "File name already exists"
+msgstr "Nom du fichier déjà existant"
+
+#: pcsx2/gui/MemoryCardFile.cpp:543
+msgid "The Operating-System prevents this file from being created"
+msgstr "Votre système empêche la création du fichier"
+
+#: pcsx2/gui/Panels/BaseApplicableConfigPanel.cpp:103
+msgid "Cannot apply settings..."
+msgstr "Impossible d'appliquer les paramètres..."
+
+#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:103
+msgid "BIOS Search Path:"
+msgstr "Chemin du BIOS :"
+
+#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:104
+msgid "Select folder with PS2 BIOS roms"
+msgstr "Choisir le fichier où se trouvent les BIOS PS2"
+
+#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:111
+msgid ""
+"Click the Browse button to select a different folder where PCSX2 will look "
+"for PS2 BIOS roms."
+msgstr ""
+"Cliquez sur le bouton Parcourir pour sélectionner un dossier différent."
+
+#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:113
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:156
+#: pcsx2/gui/Panels/ThemeSelectorPanel.cpp:47
+msgid "Refresh list"
+msgstr "Rafraîchir la liste"
+
+#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:115
+msgid "Select a BIOS rom:"
+msgstr "Sélectionner un BIOS :"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:24
+msgid "Round Mode"
+msgstr "Round Mode"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:25
+msgid "Clamping Mode"
+msgstr "Clamping Mode"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:29
+msgid "Nearest"
+msgstr "Réaliste"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:30
+msgid "Negative"
+msgstr "Négatif"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:31
+msgid "Positive"
+msgstr "Positif"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:32
+msgid "Chop / Zero"
+msgstr "Chop / Zéro"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:37
+msgid "None"
+msgstr "Aucun"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:85
+msgid "EE/FPU Advanced Recompiler Options"
+msgstr "Options EE/FPU Advanced Recompiler"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:87 pcsx2/gui/Panels/CpuPanel.cpp:102
+msgid "Extra + Preserve Sign"
+msgstr "Extra + Preserve Sign"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:88
+msgid "Full"
+msgstr "Complet"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:99
+msgid "VU0 / VU1 Advanced Recompiler Options"
+msgstr "Options VU0 / VU1 Advanced Recompiler"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:101
+msgid "Extra"
+msgstr "Extra"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:117 pcsx2/gui/Panels/CpuPanel.cpp:126
+#: pcsx2/gui/Panels/CpuPanel.cpp:184
+msgid "Interpreter"
+msgstr "Interpreter"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:118
+msgid "Quite possibly the slowest thing in the universe."
+msgstr "Peut-être la chose la plus lente de tout l'univers."
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:120 pcsx2/gui/Panels/CpuPanel.cpp:129
+msgid "Recompiler"
+msgstr "Recompiler"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:121
+msgid ""
+"Performs just-in-time binary translation of 64-bit MIPS-IV machine code to "
+"x86."
+msgstr ""
+"Réalise une traduction en temps réel d'un code 64-bit MPIS-IV vers un x86."
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:127
+msgid "Pretty slow; provided for diagnostic purposes only."
+msgstr "Relativement lent : à utiliser uniquement à des fins de diagnostique."
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:130
+msgid ""
+"Performs just-in-time binary translation of 32-bit MIPS-I machine code to "
+"x86."
+msgstr ""
+"Réalise une traduction en temps réel d'un code 32-bit MIPS-I vers un x86."
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:154
+msgid "Enable EE Cache (Slower)"
+msgstr "Activer l'EE Cache (plus lent)"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:154
+msgid "Interpreter only; provided for diagnostic"
+msgstr "Seulement pour l'usage de l'interpreter, à des fins de diagnostique"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:170 pcsx2/gui/Panels/CpuPanel.cpp:223
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:110
+msgid "Restore Defaults"
+msgstr "Réinitialiser les paramètres"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:185
+msgid ""
+"Vector Unit Interpreter. Slow and not very compatible. Only use for "
+"diagnostics."
+msgstr ""
+"Vector Unit Interpreter. Lent et rarement compatible. A n'utiliser que pour "
+"des diagnostiques."
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:187
+msgid "microVU Recompiler"
+msgstr "microVU Recompiler"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:188
+msgid ""
+"New Vector Unit recompiler with much improved compatibility. Recommended."
+msgstr ""
+"Nouveau Vector Unit recompiler qui bénéficie d'une compatibilité améliorée. "
+"Recommandé."
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:190
+msgid "superVU Recompiler [legacy]"
+msgstr "superVU Recompiler"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:191
+msgid ""
+"Useful for diagnosing bugs or clamping issues in the new mVU recompiler."
+msgstr ""
+"Utile pour diagnostiquer les bugs ou les plantages du nouveau mVU recompiler."
+
+#: pcsx2/gui/Panels/DirPickerPanel.cpp:64
+msgid "Path does not exist"
+msgstr "Le chemin d'accès n'existe pas"
+
+#: pcsx2/gui/Panels/DirPickerPanel.cpp:156
+msgid "Use default setting"
+msgstr "Utiliser les paramètres par défaut"
+
+#: pcsx2/gui/Panels/DirPickerPanel.cpp:176
+msgid "Open in Explorer"
+msgstr "Afficher dans l'explorateur"
+
+#: pcsx2/gui/Panels/DirPickerPanel.cpp:177
+msgid "Open an explorer window to this folder."
+msgstr "Ouvrir ce dossier dans l'explorateur Windows."
+
+#: pcsx2/gui/Panels/DirPickerPanel.cpp:268
+msgid "Create folder?"
+msgstr "Créer un dossier ?"
+
+#: pcsx2/gui/Panels/DirPickerPanel.cpp:269
+#, c-format
+msgid "A configured folder does not exist. Should %s try to create it?"
+msgstr ""
+"Aucun dossier correspondant trouvé. Voulez-vous que %s essaye d'en créer un ?"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:30
+msgid "Fit to Window/Screen"
+msgstr "Window/Screen"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:31
+msgid "Standard (4:3)"
+msgstr "Format classique (4/3)"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:32
+msgid "Widescreen (16:9)"
+msgstr "Format large (16/9)"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:46
+msgid "Disable window resize border"
+msgstr "Désactiver la bordure de redimensionnement"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:47
+msgid "Always hide mouse cursor"
+msgstr "Toujours cacher le curseur de la souris"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:48
+msgid "Hide window when paused"
+msgstr "Cacher la fenêtre lorsque le jeu est en pause"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:49
+msgid "Default to fullscreen mode on open"
+msgstr "Lancer le plein-écran par défaut"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:50
+msgid "Wait for Vsync on refresh"
+msgstr "Attendre le rafraîchissement Vsync (synchronisation verticale)"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:51
+msgid "Dynamically toggle Vsync depending on frame rate (read tooltip!)"
+msgstr "Bascule Vsync dynamique basée sur la frame rate (lisez le tooltip !)"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:52
+msgid "Double-click toggles fullscreen mode"
+msgstr "Un double-clic pemet de basculer vers le mode plein-écran"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:110
+msgid "Aspect Ratio:"
+msgstr "Résolution d'affichage :"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:112
+msgid "Custom Window Size:"
+msgstr "Taille de la fenêtre :"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:115
+msgid "Zoom:"
+msgstr "Zoom :"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:196
+msgid ""
+"Invalid window dimensions specified: Size cannot contain non-numeric digits! "
+">_<"
+msgstr ""
+"Dimensions de la fenêtre invalides : une résolution ne peut pas contenir "
+"autre chose que des chiffres, banane !"
+
+#: pcsx2/gui/Panels/GameDatabasePanel.cpp:334
+msgid "Search"
+msgstr "Rechercher"
+
+#: pcsx2/gui/Panels/GameDatabasePanel.cpp:368
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:25
+msgid "Gamefixes"
+msgstr "Patchs"
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:38
+msgid "VU Add Hack - Fixes Tri-Ace games boot crash."
+msgstr "VU Add Hack - Corrige le cash au lancement d'un jeu Tri-Ace."
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:39
+msgid ""
+"Games that need this hack to boot:\n"
+" * Star Ocean 3\n"
+" * Radiata Stories\n"
+" * Valkyrie Profile 2"
+msgstr ""
+"Les jeux suivants nécessitent l'utilisation du hack :\n"
+"* Star Ocean 3\n"
+"* Radiata Stories\n"
+"* Valkyrie Profile 2"
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:42
+msgid "VU Clip Flag Hack - For Persona games (SuperVU recompiler only!)"
+msgstr ""
+"VU Clip Flag Hack - Pour tous les jeux Persona (seulement avec le SuperVU "
+"recompiler !)"
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:46
+msgid "FPU Compare Hack - For Digimon Rumble Arena 2."
+msgstr "FPU Compare Hack - Pour le jeu Digimon Rumble Arena 2."
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:50
+msgid "FPU Multiply Hack - For Tales of Destiny."
+msgstr "FPU Multiply Hack - Pour le jeu Tales of Destiny."
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:54
+msgid "FPU Negative Div Hack - For Gundam games."
+msgstr "FPU Negative Div Hack - Pour tous les jeux de la série Gundam."
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:58
+msgid "VU XGkick Hack - For Erementar Gerad."
+msgstr "VU XGkick Hack - Pour le jeu Erementar Gerad."
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:62
+msgid "FFX videos fix - Fixes bad graphics overlay in FFX videos."
+msgstr ""
+"FFX video fix - Corrige les bugs graphiques liés à certaines vidéos du jeu "
+"FFX."
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:66
+msgid "EE timing hack - Multi purpose hack. Try if all else fails."
+msgstr ""
+"EE timing hack - Un peu de tout. Essayez-le si aucun autre hack ne corrige "
+"votre problème."
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:75
+msgid ""
+"Skip MPEG hack - Skips videos/FMVs in games to avoid game hanging/freezes."
+msgstr ""
+"Skip MPEG hack - Saute les vidéos/cinématiques des jeux afin d'éviter qu'ils "
+"ne plantent."
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:79
+msgid "OPH Flag hack - Try if your game freezes showing the same frame."
+msgstr ""
+"OPH Flag hack - Essayez-le si votre jeu bloque toujours au même endroit."
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:88
+msgid "Ignore DMAC writes when it is busy."
+msgstr "Ignorer l'écriture DMAC lorsqu'elle est occupée."
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:95
+msgid "Simulate VIF1 FIFO read ahead. Fixes slow loading games."
+msgstr "Simuler la lecture VIF1 FIFO (permet d'accélérer les chargements)."
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:103
+msgid "Delay VIF1 Stalls (VIF1 FIFO) - For SOCOM 2 HUD."
+msgstr "Retarder VIF1 FIFO - Utile au HUD de SOCOM2."
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:107
+msgid "Ignore Bus Direction on Path3 Transfer - Used for Hotwheels"
+msgstr ""
+"Ignorer le Bus Direction sur le Path3 Transfer - Utile pour le jeu Hot Wheels"
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:118
+msgid "Enable manual game fixes [Not recommended]"
+msgstr "Activer les patchs manuellement [Non-recommandé]"
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:127
+msgid ""
+"The safest way to make sure that all game fixes are completely disabled."
+msgstr ""
+"La meilleure méthode pour s'assurer que tous les patchs ont été désactivés."
+
+#: pcsx2/gui/Panels/LogOptionsPanels.cpp:249
+msgid "Enable Trace Logging"
+msgstr "Activer les rapports automatiques"
+
+#: pcsx2/gui/Panels/LogOptionsPanels.cpp:250
+msgid ""
+"Trace logs are all written to emulog.txt. Toggle trace logging at any time "
+"using F10."
+msgstr ""
+"Les rapports automatiques seront enregistrés dans le fichier emulog.txt. "
+"Vous pouvez les consulter à tout moment en pressant la touche F10."
+
+#: pcsx2/gui/Panels/LogOptionsPanels.cpp:251
+msgid ""
+"Warning: Enabling trace logs is typically very slow, and is a leading cause "
+"of 'What happened to my FPS?' problems. :)"
+msgstr ""
+"Attention ! Activer les rapports automatiques ralentira beaucoup l'émulation "
+"et reste l'une des principales réponses à la question : \"Où sont passés mes "
+"FPS !?\" :p"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:151
+msgid "Select folder with PS2 memory cards"
+msgstr "Choisir le dossier des cartes mémoire PS2"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:448
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:533
+msgid "Eject"
+msgstr "Éjecter"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:449
+msgid "Duplicate ..."
+msgstr "Dupliquer ..."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:450
+msgid "Rename ..."
+msgstr "Renommer ..."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:451
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:515
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:542
+msgid "Create ..."
+msgstr "Créer ..."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:463
+msgid "Card: "
+msgstr "Carte :"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:516
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:549
+msgid "Create a new memory card."
+msgstr "Créer une nouvelle carte mémoire."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:529
+msgid "Rename this memory card ..."
+msgstr "Renommer cette carte mémoire ..."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:533
+msgid "Insert ..."
+msgstr "Insérer ..."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:534
+msgid "Eject the card from this port"
+msgstr "Éjecter la carte de son lecteur."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:534
+msgid "Insert this card to a port ..."
+msgstr "Insérer la carte dans un lecteur ..."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:538
+msgid "Create a duplicate of this memory card ..."
+msgstr "Dupliquer le contenu de cette carte mémoire ..."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:542
+msgid "Delete"
+msgstr "Effacer"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:545
+msgid "Permanently delete this memory card from disk (all contents are lost)"
+msgstr ""
+"Effacer la carte mémoire du disque (toutes les données seront "
+"irrémédiablement perdues)."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:547
+msgid "Create a new memory card and assign it to this Port."
+msgstr "Créer une nouvelle carte mémoire et l'assigner à ce lecteur."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:726
+msgid "Delete memory file?"
+msgstr "Effacer le fichier mémoire ?"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:750
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:762
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:769
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:783
+msgid "Duplicate memory card"
+msgstr "Dupliquer la carte mémoire"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:750
+msgid "Failed: Can only duplicate an existing card."
+msgstr "Échec : seule une carte déjà existante peut être dupliquée."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:769
+msgid ""
+"Select a name for the duplicate\n"
+"( '.ps2' will be added automatically)"
+msgstr ""
+"Choisir un nom pour la copie \n"
+"(le format '.ps2' sera automatiquement ajouté)"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:782
+#, c-format
+msgid "Failed: %s"
+msgstr "Échec : %s"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:808
+msgid "Copy failed!"
+msgstr "La copie a échoué ! (bad trip)"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:816
+#, c-format
+msgid "Memory card '%s' duplicated to '%s'."
+msgstr "Carte mémoire '%s' dupliquée sous le nom '%s'."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:820
+msgid "Success"
+msgstr "Opération réalisée avec succès !"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:841
+#, c-format
+msgid ""
+"Select a new name for the memory card '%s'\n"
+"( '.ps2' will be added automatically)"
+msgstr ""
+"Choisissez un nouveau nom pour la carte mémoire '%s'\n"
+"(le format '.ps2' sera automatiquement ajouté à sa suite)"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:844
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:856
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:872
+msgid "Rename memory card"
+msgstr "Renommer la carte mémoire"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:872
+msgid "Error: Rename could not be completed.\n"
+msgstr "Erreur : impossible à renommer.\n"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:962
+#: pcsx2/gui/Panels/MemoryCardListView.cpp:139
+#, c-format
+msgid "Port-%u / Multitap-%u--Port-1"
+msgstr "Port-%u / Multitap-%u--Port-1"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:963
+#: pcsx2/gui/Panels/MemoryCardListView.cpp:140
+#, c-format
+msgid " Multitap-%u--Port-%u"
+msgstr " Multitap-%u--Port-%u"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:988
+msgid "Empty"
+msgstr "Vide"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:994
+#, c-format
+msgid "Select a target port for '%s'"
+msgstr "Assignez un lecteur pour '%s'"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:995
+msgid "Insert card"
+msgstr "Insérer la carte"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1055
+msgid "Eject card"
+msgstr "Éjecter la carte"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1055
+msgid "Insert card ..."
+msgstr "Insérer la carte ..."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1056
+msgid "Duplicate card ..."
+msgstr "Dupliquer la carte ..."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1057
+msgid "Rename card ..."
+msgstr "Renommer la carte ..."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1058
+msgid "Delete card"
+msgstr "Effacer la carte"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1061
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1065
+msgid "Create a new card ..."
+msgstr "Créer une nouvelle carte ..."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1069
+msgid "Refresh List"
+msgstr "Rafraîchir la liste"
+
+#: pcsx2/gui/Panels/MemoryCardListView.cpp:105
+msgid "PS2 Port"
+msgstr "Port PS2"
+
+#: pcsx2/gui/Panels/MemoryCardListView.cpp:107
+msgid "Card (file) name"
+msgstr "Nom de la carte"
+
+#: pcsx2/gui/Panels/MemoryCardListView.cpp:108
+msgid "Card size"
+msgstr "Taille"
+
+#: pcsx2/gui/Panels/MemoryCardListView.cpp:109
+msgid "Formatted"
+msgstr "Formatée ?"
+
+#: pcsx2/gui/Panels/MemoryCardListView.cpp:110
+msgid "Last Modified"
+msgstr "Dernière modification"
+
+#: pcsx2/gui/Panels/MemoryCardListView.cpp:111
+msgid "Created on"
+msgstr "Créée le"
+
+#: pcsx2/gui/Panels/MemoryCardListView.cpp:156
+msgid "No"
+msgstr "Non"
+
+#: pcsx2/gui/Panels/MemoryCardListView.cpp:156
+msgid "Yes"
+msgstr "Oui"
+
+#: pcsx2/gui/Panels/MemoryCardListView.cpp:169
+msgid "[-- Unused cards --]"
+msgstr "[-- Cartes inutilisées --]"
+
+#: pcsx2/gui/Panels/MemoryCardListView.cpp:171
+msgid "[-- No unused cards --]"
+msgstr "[-- Pas de carte inutilisée --]"
+
+#: pcsx2/gui/Panels/MiscPanelStuff.cpp:33
+msgid "Usermode Selection"
+msgstr "Sélection du mode d'utilisateur"
+
+#: pcsx2/gui/Panels/MiscPanelStuff.cpp:50
+msgid "User Documents (recommended)"
+msgstr "User Documents (recommandé)"
+
+#: pcsx2/gui/Panels/MiscPanelStuff.cpp:51
+msgid "Location: "
+msgstr "Destination :"
+
+#: pcsx2/gui/Panels/MiscPanelStuff.cpp:55
+msgid "Custom folder:"
+msgstr "Dossier :"
+
+#: pcsx2/gui/Panels/MiscPanelStuff.cpp:57
+msgid ""
+"This setting may require administration privileges from your operating "
+"system, depending on how your system is configured."
+msgstr "Ce paramètre peut nécessiter les droits d'un compte administrateur."
+
+#: pcsx2/gui/Panels/MiscPanelStuff.cpp:66
+#, c-format
+msgid "Select a document root for %s"
+msgstr "Choisir la racine du document pour %s"
+
+#: pcsx2/gui/Panels/MiscPanelStuff.cpp:124
+msgid "Apply"
+msgstr "Appliquer"
+
+#: pcsx2/gui/Panels/MiscPanelStuff.cpp:125
+msgid "Make this language my default right now!"
+msgstr "Cette langue deviendra celle par défaut !"
+
+#: pcsx2/gui/Panels/PathsPanel.cpp:38
+msgid "Savestates:"
+msgstr "Sauvegardes :"
+
+#: pcsx2/gui/Panels/PathsPanel.cpp:39
+msgid "Select folder for Savestates"
+msgstr "Choisir un dossier pour les sauvegardes"
+
+#: pcsx2/gui/Panels/PathsPanel.cpp:48
+msgid "Snapshots:"
+msgstr "Screenshots :"
+
+#: pcsx2/gui/Panels/PathsPanel.cpp:49
+msgid "Select a folder for Snapshots"
+msgstr "Choisir un dossier pour les screenshots"
+
+#: pcsx2/gui/Panels/PathsPanel.cpp:58
+msgid "Logs/Dumps:"
+msgstr "Rapports / Dumps :"
+
+#: pcsx2/gui/Panels/PathsPanel.cpp:59
+msgid "Select a folder for logs/dumps"
+msgstr "Choisir un dossier pour les rapports / dumps"
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:230
+msgid "Applying settings..."
+msgstr "Mise à jour des paramètres..."
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:240
+msgid "Shutdown PS2 virtual machine?"
+msgstr "Éteindre la machine virtuelle PS2 ?"
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:321
+msgid "I'm givin' her all she's got, Captain!"
+msgstr "\"I'm giving her all she's got, Captain!\" (cf. Star Trek)"
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:323
+msgid "Enumerating available plugins..."
+msgstr "Mise à jour de la liste des plugins disponibles..."
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:356
+msgid "Plugins Search Path:"
+msgstr "Chemin d'accès des plugins :"
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:357
+msgid "Select a folder with PCSX2 plugins"
+msgstr "Choisir le dossier où se trouvent les plugins PCSX2"
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:370
+msgid "Configure..."
+msgstr "Configurer"
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:379
+msgid "Click the Browse button to select a different folder for PCSX2 plugins."
+msgstr ""
+"Cliquez sur le bouton Parcourir pour choisir un dossier de plugins différent."
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:481
+#, c-format
+msgid "Please select a valid plugin for the %s."
+msgstr "Veuillez sélectionner un plugin valide pour le %s."
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:519
+#, c-format
+msgid ""
+"The selected %s plugin failed to load.\n"
+"\n"
+"Reason: %s\n"
+"\n"
+msgstr ""
+"Le plugin %s sélectionné n'a pas pu être chargé.\n"
+"\n"
+"Explication : %s\n"
+"\n"
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:730
+msgid "Completing tasks..."
+msgstr "Exécution des tâches..."
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:96
+msgid "Enable speedhacks"
+msgstr "Activer les speedhacks"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:102
+msgid ""
+"A safe and easy way to make sure that all speedhacks are completely disabled."
+msgstr ""
+"La manière la plus simple de s'assurer que les speedhacks ont été "
+"complètement désactivés."
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:111
+msgid ""
+"Resets all speedhack options to their defaults, which consequently turns "
+"them all OFF."
+msgstr ""
+"Réinitialise les options des speedhacks à leurs valeurs par défaut (à noter "
+"que cette opération les désactivera tous)."
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:120
+msgid "EE Cyclerate [Not Recommended]"
+msgstr "EmotionEngine (EE) Cyclerate [Non recommandé]"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:141
+msgid "VU Cycle Stealing [Not Recommended]"
+msgstr "VectorUnit (VU) Cycle Stealing [Non recommandé]"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:161
+msgid "microVU Hacks"
+msgstr "microVU Hacks"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:163
+msgid "mVU Flag Hack"
+msgstr "mVU Flag Hack"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:164
+msgid ""
+"Good Speedup and High Compatibility; may cause bad graphics... [Recommended]"
+msgstr ""
+"Amélioration sensible des performances et compatibilité élevée, mais "
+"pourrait causer quelques bugs graphiques... [Recommandé]"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:166
+msgid "MTVU (Multi-Threaded microVU1)"
+msgstr "MTVU (Multi-Threaded microVU1)"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
+msgid ""
+"Good Speedup and High Compatibility; may cause hanging... [Recommended if 3+ "
+"cores]"
+msgstr ""
+"Bonnes performances et compatibilité élevée, mais pourrait occasionner des "
+"\"tremblements\" à l'écran... [Recommandé pour Proc. 3/+ coeurs]"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:183
+msgid "Other Hacks"
+msgstr "Autres Hacks"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:185
+msgid "Enable INTC Spin Detection"
+msgstr "Active l'INTC Spin Detection"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:186
+msgid ""
+"Huge speedup for some games, with almost no compatibility side effects. "
+"[Recommended]"
+msgstr ""
+"Augmente les FPS de manière considérable sur certains jeux et n'a pas "
+"d'impact sur la compatibilité générale. [Recommandé]"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:188
+msgid "Enable Wait Loop Detection"
+msgstr "Activer la Wait Loop Detection"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:189
+msgid ""
+"Moderate speedup for some games, with no known side effects. [Recommended]"
+msgstr ""
+"Amélioration modérée des performances sur certains jeux, et aucun effet "
+"pervers connu. [Recommandé]"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
+msgid "Enable fast CDVD"
+msgstr "Activer l'accès rapide aux CDVD"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:192
+msgid "Fast disc access, less loading times. [Not Recommended]"
+msgstr "Réduit les temps de chargement. [Non recommandé]"
+
+#: pcsx2/gui/Panels/ThemeSelectorPanel.cpp:37
+msgid "Themes Search Path:"
+msgstr "Chemin d'accès des thèmes :"
+
+#: pcsx2/gui/Panels/ThemeSelectorPanel.cpp:38
+msgid "Select folder containing PCSX2 visual themes"
+msgstr "Choisir le dossier qui contient les thèmes visuels PCSX2"
+
+#: pcsx2/gui/Panels/ThemeSelectorPanel.cpp:45
+msgid ""
+"Click the Browse button to select a different folder containing PCSX2 visual "
+"themes."
+msgstr ""
+"Cliquez sur le bouton Parcourir pour choisir un dossier de thèmes visuels "
+"PCSX2 différent."
+
+#: pcsx2/gui/Panels/ThemeSelectorPanel.cpp:49
+msgid "Select a visual theme:"
+msgstr "Sélectionner un thème :"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:34
+msgid "Disable Framelimiting"
+msgstr "Désactiver le Framelimiting (limite le nombre de frames)"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:35
+msgid ""
+"Useful for running benchmarks. Toggle this option in-game by pressing F4."
+msgstr ""
+"Utile pour les benchmarks. On peut utiliser cette option en jeu grâce à la "
+"touche F4."
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:61
+msgid "Base Framerate Adjust:"
+msgstr "Ajustement de la Framerate de base :"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:67
+msgid "Slow Motion Adjust:"
+msgstr "Ajustement de la Slow Motion :"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:73
+msgid "Turbo Adjust:"
+msgstr "Ajustement du Turbo :"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:88
+msgid "NTSC Framerate:"
+msgstr "Framerate en mode NTSC :"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:91 pcsx2/gui/Panels/VideoPanel.cpp:97
+msgid "FPS"
+msgstr "FPS (IPS)"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:94
+msgid "PAL Framerate:"
+msgstr "Framerate en mode PAL :"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:166
+msgid ""
+"Error while parsing either NTSC or PAL framerate settings. Settings must be "
+"valid floating point numerics."
+msgstr ""
+"Erreur de lecture des paramètres de la framerate NTSC ou PAL : les valeurs "
+"sont fausses."
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:184
+msgid "Disabled [default]"
+msgstr "Désactivé [défaut]"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:188
+msgid "Skip when on Turbo only (TAB to enable)"
+msgstr "Activé lorsque le Turbo est actif (appuyez sur TAB)"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:192
+msgid "Constant skipping"
+msgstr "Saut de frames permanent"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:194
+msgid ""
+"Normal and Turbo limit rates skip frames. Slow motion mode will still "
+"disable frameskipping."
+msgstr ""
+"Les modes Normal et Turbo permettent de sauter des frames. Le mode Slow "
+"motion désactivera le saut de frames."
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:217
+msgid "Frames to Draw"
+msgstr "frames à afficher"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:222
+msgid "Frames to Skip"
+msgstr "frames à ignorer"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:298
+msgid "Use Synchronized MTGS"
+msgstr "Utiliser la MTGS synchonisé"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:299
+msgid ""
+"For troubleshooting potential bugs in the MTGS only, as it is potentially "
+"very slow."
+msgstr "Permet d'enrayer des bugs potentiels liés au MTGS."
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:302
+msgid "Disable all GS output"
+msgstr "Désactive toute sortie GS"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:303
+msgid ""
+"Completely disables all GS plugin activity; ideal for benchmarking EEcore "
+"components."
+msgstr ""
+"Désactive complètement l'affichage vidéo : idéal pour un benchmark des "
+"composants EEcore."
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:320
+msgid "Frame Skipping"
+msgstr "Saut de frames"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:323
+msgid "Framelimiter"
+msgstr "Framelimiter"
+
+#: pcsx2/gui/SysState.cpp:283
+msgid ""
+"Cannot load this savestate. The state is from an incompatible edition of "
+"PCSX2 that is either newer than this version, or is no longer supported."
+msgstr ""
+"Impossible de charger cette sauvegarde. L'emplacement provient d'une version "
+"de PCSX2 incompatible (trop ancienne, ou nouvelle)."
+
+#: pcsx2/gui/SysState.cpp:290
+msgid ""
+"Cannot load this savestate. The state is an unsupported version, likely "
+"created by a newer edition of PCSX2."
+msgstr ""
+"Impossible de charger cette sauvegarde. L'emplacement n'est pas supporté car "
+"il a sûrement été créé à partir d'une version de PCSX2 non-gérée."
+
+#: pcsx2/gui/SysState.cpp:326
+msgid "There is no active virtual machine state to download or save."
+msgstr "Il n'y a pas d'emplacement à télécharger ou à sauvegarder."
+
+#: pcsx2/gui/SysState.cpp:520
+msgid ""
+"This savestate cannot be loaded because it is not a valid gzip archive. It "
+"may have been created by an older unsupported version of PCSX2, or it may be "
+"corrupted."
+msgstr ""
+"La sauvegarde ne peut pas être chargée car elle ne fait pas l'objet d'une "
+"archive gzip valide. Elle a peut-être été créée à partir d'une version de "
+"PCSX2 antérieure, ou bien elle est corrompue."
+
+#: pcsx2/gui/SysState.cpp:579
+msgid "This file is not a valid PCSX2 savestate. See the logfile for details."
+msgstr ""
+"Le fichier n'est pas une sauvegarde PCSX2 valide. Référez-vous aux rapports "
+"pour plus de détails."
+
+#: pcsx2/gui/SysState.cpp:598
+msgid ""
+"This savestate cannot be loaded due to missing critical components. See the "
+"log file for details."
+msgstr ""
+"La sauvegarde n'a pas pu être chargée du fait de l'absence de composants "
+"indispensables. Référez-vous aux rapports pour plus de détails."
+
+#: pcsx2/gui/i18n.cpp:63
+msgid " (default)"
+msgstr "(défaut)"
+
+#: pcsx2/ps2/BiosTools.cpp:83 pcsx2/ps2/BiosTools.cpp:151
+msgid "The selected BIOS file is not a valid PS2 BIOS. Please re-configure."
+msgstr ""
+"Le fichier BIOS n'est pas un BIOS PS2 valide. Merci de le reconfigurer."
+
+#: pcsx2/ps2/BiosTools.cpp:244
+msgid ""
+"The PS2 BIOS could not be loaded. The BIOS has not been configured, or the "
+"configuration has been corrupted. Please re-configure."
+msgstr ""
+"Le BIOS PS2 n'a pas pu être chargé. Le BIOS n'a pas été configuré, ou ses "
+"paramètres ne sont pas validés. Merci de le reconfigurer."
+
+#: pcsx2/ps2/BiosTools.cpp:251
+msgid "The configured BIOS file does not exist. Please re-configure."
+msgstr "Le fichier de configuation du BIOS n'existe pas. Merci d'en créer un."
+
+#: pcsx2/x86/ix86-32/iR5900-32.cpp:578
+#, c-format
+msgid ""
+"%s Extensions not found. The R5900-32 recompiler requires a host CPU with "
+"MMX, SSE, and SSE2 extensions."
+msgstr ""
+"%s extensions n'ont pas été trouvées. Le R5900-32 recompiler nécessite un "
+"CPU qui gère les extensions MMX, SSE et SSE2."
+
+#: pcsx2/x86/microVU.cpp:28
+#, c-format
+msgid ""
+"%s Extensions not found. microVU requires a host CPU with MMX, SSE, and "
+"SSE2 extensions."
+msgstr ""
+"%s extensions non trouvées. microVU nécessite un CPU qui gère les extensions "
+"MMX, SSE et SSE2."
+
+#~ msgid "mVU Block Hack"
+#~ msgstr "mVU Block Hack"
+
+#~ msgid ""
+#~ "Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
+#~ msgstr ""
+#~ "Amélioration sensible des performances et compatibilité élevée, mais "
+#~ "pourrait causer quelques bugs graphiques, SPS, etc..."
diff --git a/locales/hu_HU/pcsx2_Iconized.po b/locales/hu_HU/pcsx2_Iconized.po
index 0b18f2ec3..b1328567b 100644
--- a/locales/hu_HU/pcsx2_Iconized.po
+++ b/locales/hu_HU/pcsx2_Iconized.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.8\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-09-28 20:27+0200\n"
+"POT-Creation-Date: 2012-04-07 11:42+0200\n"
"PO-Revision-Date: 2011-04-17 17:56+0100\n"
"Last-Translator: Delirious \n"
"Language-Team: Delirious \n"
@@ -24,7 +24,7 @@ msgstr ""
"Nincs elegendő szabad virtuális memória, vagy a szükséges virtuális memória "
"kiosztás más folyamatok, szolgáltatások vagy DLL-ek számára van fenntartva."
-#: pcsx2/CDVD/CDVD.cpp:385
+#: pcsx2/CDVD/CDVD.cpp:389
msgid "!Notice:PsxDisc"
msgstr ""
"A PlayStation játék lemezeket nem támogatja a PCSX2. Ha PSX játékokat akarsz "
@@ -471,26 +471,19 @@ msgstr ""
"elvesz az EmotionEngine elől. Magasabb érték növeli az EE elől elvett és a "
"játék által futtatott összes mikroprogram számára átadott ciklusok számát."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:172
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "!ContextTip:Speedhacks:vuFlagHack"
msgstr ""
"Az állapot jelzőket csak azokon a blokkokon frissíti amelyek olvassák "
"azokat. Legtöbbször ez biztonságos és a Super VU is valami hasonlót végez "
"alapértelmezettként."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:177
-msgid "!ContextTip:Speedhacks:vuBlockHack"
-msgstr ""
-"Elfogadva, hogy a távoli jövőbeni blokkoknak nem lesz szükségük a régi "
-"jelzőre utaló adatokra. Ez meglehetősen biztonságos lehet. Nem ismeretes, "
-"hogy valamelyik játék kifagyását okozná..."
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:182
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:174
#, fuzzy
msgid "!ContextTip:Speedhacks:vuThread"
msgstr "Nem működik a Gran Turismo 4 vagy Tekken 5 esetén."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:203
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:195
msgid "!ContextTip:Speedhacks:INTC"
msgstr ""
"Ez a hack működik legjobban azoknál a játékoknál, amelyek használják az INTC "
@@ -499,7 +492,7 @@ msgstr ""
"eljárást használják a függőleges szinkronhoz csak csekély, vagy semmilyen "
"gyorsulás nem észlelhető a hack használatával."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:208
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
msgid "!ContextTip:Speedhacks:BIFC0"
msgstr ""
"Elsődlegesen megcélozva az EE üresjárati hurkot a 0x81FC0 címzésen a "
@@ -510,7 +503,7 @@ msgstr ""
"előrehozhatjuk a következő eseményt vagy a processzor időszeletének végét, "
"bármelyik is következik előbb."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:215
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:207
msgid "!ContextTip:Speedhacks:fastCDVD"
msgstr ""
"Ellenőrizd a HDLoader kompatibilitási listát a problémás játékok végett. "
@@ -522,20 +515,20 @@ msgstr ""
"Nem árt tudni, ha a képkocka korlátozás ki van kapcsolva, a turbó és "
"lassított mód sem érhető el."
-#: pcsx2/gui/Panels/VideoPanel.cpp:223
+#: pcsx2/gui/Panels/VideoPanel.cpp:227
msgid "!Panel:Frameskip:Heading"
msgstr ""
"Megjegyzés: A PS2 hardver összetételének köszönhetően a pontos képkocka "
"kihagyás nem lehetséges. Használata számos grafikai hibát okoz néhány "
"játékban."
-#: pcsx2/gui/Panels/VideoPanel.cpp:302
+#: pcsx2/gui/Panels/VideoPanel.cpp:306
msgid "!ContextTip:GS:SyncMTGS"
msgstr ""
"Kapcsold ezt be, ha úgy gondolod az MTGS folyamatág szinkron okozza a "
"fagyást vagy grafikai hibákat."
-#: pcsx2/gui/Panels/VideoPanel.cpp:306
+#: pcsx2/gui/Panels/VideoPanel.cpp:310
msgid "!ContextTip:GS:DisableOutput"
msgstr ""
"Eltávolít bármely teszt zajt, amit az MTGS folyamatág vagy az általános GPU "
@@ -561,6 +554,12 @@ msgstr ""
"azt. Ez nem kritikus hiba, amióta az sVU rec elavult és bármikor használható "
"helyette a microVU. :)"
+#~ msgid "!ContextTip:Speedhacks:vuBlockHack"
+#~ msgstr ""
+#~ "Elfogadva, hogy a távoli jövőbeni blokkoknak nem lesz szükségük a régi "
+#~ "jelzőre utaló adatokra. Ez meglehetősen biztonságos lehet. Nem ismeretes, "
+#~ "hogy valamelyik játék kifagyását okozná..."
+
#~ msgid "No reason given."
#~ msgstr "Nincs meghatározott ok."
diff --git a/locales/hu_HU/pcsx2_Main.po b/locales/hu_HU/pcsx2_Main.po
index 2906516f7..51dbca791 100644
--- a/locales/hu_HU/pcsx2_Main.po
+++ b/locales/hu_HU/pcsx2_Main.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.8\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-09-28 20:27+0200\n"
+"POT-Creation-Date: 2012-02-28 12:20+0100\n"
"PO-Revision-Date: 2011-04-17 16:35+0100\n"
"Last-Translator: Delirious \n"
"Language-Team: Delirious \n"
@@ -195,7 +195,7 @@ msgstr "Belső memória kártya plugin iniciálása sikertelen."
msgid "Unloaded Plugin"
msgstr "Betöltetlen plugin"
-#: pcsx2/SaveState.cpp:339
+#: pcsx2/SaveState.cpp:342
msgid "Cannot load savestate. It is of an unknown or unsupported version."
msgstr ""
"A mentett állás nem tölthető be. Ez egy ismeretlen vagy nem támogatott "
@@ -350,31 +350,31 @@ msgstr ""
"A mentett állás nem megfelelően van elmentve. Az ideiglenes fájl sikeresen "
"létre lett hozva, de nem került át a végső helyére."
-#: pcsx2/gui/AppConfig.cpp:837
+#: pcsx2/gui/AppConfig.cpp:842
msgid "Safest"
msgstr "Legbiztonságosabb"
-#: pcsx2/gui/AppConfig.cpp:838
+#: pcsx2/gui/AppConfig.cpp:843
msgid "Safe (faster)"
msgstr "Biztonságos (gyorsabb)"
-#: pcsx2/gui/AppConfig.cpp:839
+#: pcsx2/gui/AppConfig.cpp:844
msgid "Balanced"
msgstr "Kiegyensúlyozott"
-#: pcsx2/gui/AppConfig.cpp:840
+#: pcsx2/gui/AppConfig.cpp:845
msgid "Aggressive"
msgstr "Agresszív"
-#: pcsx2/gui/AppConfig.cpp:841
+#: pcsx2/gui/AppConfig.cpp:846
msgid "Aggressive plus"
msgstr "Agresszív plusz"
-#: pcsx2/gui/AppConfig.cpp:842
+#: pcsx2/gui/AppConfig.cpp:847
msgid "Mostly Harmful"
msgstr "Legártalmasabb"
-#: pcsx2/gui/AppConfig.cpp:999 pcsx2/gui/AppConfig.cpp:1005
+#: pcsx2/gui/AppConfig.cpp:1007 pcsx2/gui/AppConfig.cpp:1013
msgid "Failed to overwrite existing settings file; permission was denied."
msgstr "A meglévő beállítás fájl felülírása sikertelen; hozzáférés megtagadva."
@@ -2426,22 +2426,10 @@ msgstr ""
"stb... [Ajánlott]"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:166
-msgid "mVU Block Hack"
-msgstr "mVU blokk hack"
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
-#, fuzzy
-msgid ""
-"Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
-msgstr ""
-"Látványos gyorsulás és magas kompatibilitás; grafikai hibákat okozhat, SPS, "
-"stb..."
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "MTVU (Multi-Threaded microVU1)"
msgstr ""
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:170
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
#, fuzzy
msgid ""
"Good Speedup and High Compatibility; may cause hanging... [Recommended if 3+ "
@@ -2450,15 +2438,15 @@ msgstr ""
"Látványos gyorsulás és magas kompatibilitás; grafikai hibákat okozhat, SPS, "
"stb... [Ajánlott]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:183
msgid "Other Hacks"
msgstr "Egyéb hackek"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:193
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:185
msgid "Enable INTC Spin Detection"
msgstr "INTC pörgés észlelés használata"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:194
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:186
msgid ""
"Huge speedup for some games, with almost no compatibility side effects. "
"[Recommended]"
@@ -2466,22 +2454,22 @@ msgstr ""
"Nagymértékű gyorsulás néhány játék esetében, többnyire nincs kompatibilitási "
"mellékhatás. [Ajánlott]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:196
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:188
msgid "Enable Wait Loop Detection"
msgstr "Hurok észlelésre várakozás használata"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:197
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:189
msgid ""
"Moderate speedup for some games, with no known side effects. [Recommended]"
msgstr ""
"Enyhe sebesség növekedés néhány játéknál, nincs ismert mellékhatás. "
"[Ajánlott]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:199
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
msgid "Enable fast CDVD"
msgstr "Gyors CDVD használata"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:192
msgid "Fast disc access, less loading times. [Not Recommended]"
msgstr "Gyors lemez hozzáférés, kevesebb betöltési idő. [Nem ajánlott]"
@@ -2540,7 +2528,7 @@ msgstr "FPS"
msgid "PAL Framerate:"
msgstr "PAL képfrissítés:"
-#: pcsx2/gui/Panels/VideoPanel.cpp:162
+#: pcsx2/gui/Panels/VideoPanel.cpp:166
msgid ""
"Error while parsing either NTSC or PAL framerate settings. Settings must be "
"valid floating point numerics."
@@ -2548,19 +2536,19 @@ msgstr ""
"Hiba vagy az NTSC vagy PAL képfrissítési beállítások elemzésekor. A "
"beállításoknak érvényes lebegőpontos számoknak kell lenniük."
-#: pcsx2/gui/Panels/VideoPanel.cpp:180
+#: pcsx2/gui/Panels/VideoPanel.cpp:184
msgid "Disabled [default]"
msgstr "Kikapcsolva [alap]"
-#: pcsx2/gui/Panels/VideoPanel.cpp:184
+#: pcsx2/gui/Panels/VideoPanel.cpp:188
msgid "Skip when on Turbo only (TAB to enable)"
msgstr "Csak bekapcsolt Turbó esetén (TAB a használathoz)"
-#: pcsx2/gui/Panels/VideoPanel.cpp:188
+#: pcsx2/gui/Panels/VideoPanel.cpp:192
msgid "Constant skipping"
msgstr "Változatlan kihagyás"
-#: pcsx2/gui/Panels/VideoPanel.cpp:190
+#: pcsx2/gui/Panels/VideoPanel.cpp:194
msgid ""
"Normal and Turbo limit rates skip frames. Slow motion mode will still "
"disable frameskipping."
@@ -2568,19 +2556,19 @@ msgstr ""
"Normál és turbó korlátozza a kihagyandó képkockák számát. A lassított mód "
"is kikapcsolja a képkocka kihagyást."
-#: pcsx2/gui/Panels/VideoPanel.cpp:213
+#: pcsx2/gui/Panels/VideoPanel.cpp:217
msgid "Frames to Draw"
msgstr "Megjelenítendő képkockák"
-#: pcsx2/gui/Panels/VideoPanel.cpp:218
+#: pcsx2/gui/Panels/VideoPanel.cpp:222
msgid "Frames to Skip"
msgstr "Kihagyandó képkockák"
-#: pcsx2/gui/Panels/VideoPanel.cpp:294
+#: pcsx2/gui/Panels/VideoPanel.cpp:298
msgid "Use Synchronized MTGS"
msgstr "Szinkronizált MTGS használata"
-#: pcsx2/gui/Panels/VideoPanel.cpp:295
+#: pcsx2/gui/Panels/VideoPanel.cpp:299
msgid ""
"For troubleshooting potential bugs in the MTGS only, as it is potentially "
"very slow."
@@ -2588,11 +2576,11 @@ msgstr ""
"Lehetséges hibák keresése csupán az MTGS-ben, mivel potenciálisan nagyon "
"lassú."
-#: pcsx2/gui/Panels/VideoPanel.cpp:298
+#: pcsx2/gui/Panels/VideoPanel.cpp:302
msgid "Disable all GS output"
msgstr "Minden GS kimenet kikapcsolása"
-#: pcsx2/gui/Panels/VideoPanel.cpp:299
+#: pcsx2/gui/Panels/VideoPanel.cpp:303
msgid ""
"Completely disables all GS plugin activity; ideal for benchmarking EEcore "
"components."
@@ -2600,11 +2588,11 @@ msgstr ""
"Teljesen leállít minden GS plugin tevékenységet; ideális az EEcore "
"összetevők tesztelése esetén."
-#: pcsx2/gui/Panels/VideoPanel.cpp:316
+#: pcsx2/gui/Panels/VideoPanel.cpp:320
msgid "Frame Skipping"
msgstr "Képkocka kihagyás"
-#: pcsx2/gui/Panels/VideoPanel.cpp:319
+#: pcsx2/gui/Panels/VideoPanel.cpp:323
msgid "Framelimiter"
msgstr "Képkocka korlátozó"
@@ -2690,6 +2678,16 @@ msgstr ""
"%s kiterjesztés nem található. A microVU működéséhez szükséges egy MMX, SSE "
"és SSE2 utasításkészletet támogató processzor."
+#~ msgid "mVU Block Hack"
+#~ msgstr "mVU blokk hack"
+
+#, fuzzy
+#~ msgid ""
+#~ "Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
+#~ msgstr ""
+#~ "Látványos gyorsulás és magas kompatibilitás; grafikai hibákat okozhat, "
+#~ "SPS, stb..."
+
#~ msgid "ISO mounting failed: PCSX2 is unable to identify the ISO image type."
#~ msgstr ""
#~ "ISO csatolása sikertelen: PCSX2 képtelen azonosítani az ISO képfájl "
diff --git a/locales/id_ID/pcsx2_Iconized.po b/locales/id_ID/pcsx2_Iconized.po
new file mode 100644
index 000000000..0e22b13a6
--- /dev/null
+++ b/locales/id_ID/pcsx2_Iconized.po
@@ -0,0 +1,328 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR PCSX2_Dev_Team
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PCSX2 0.9.8 r4560\n"
+"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
+"POT-Creation-Date: 2012-04-07 11:42+0200\n"
+"PO-Revision-Date: 2012-01-13 16:56+0700\n"
+"Last-Translator: \n"
+"Language-Team: ikazu \n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-KeywordsList: pxE\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Poedit-Basepath: trunk\\\n"
+"X-Poedit-Language: Indonesian\n"
+"X-Poedit-Country: INDONESIA\n"
+"X-Poedit-SearchPath-0: pcsx2\n"
+"X-Poedit-SearchPath-1: common\n"
+
+#: common/src/Utilities/Exceptions.cpp:254
+msgid "!Notice:VirtualMemoryMap"
+msgstr "!Pemberitahuan:MapVirtualMemory"
+
+#: pcsx2/CDVD/CDVD.cpp:389
+msgid "!Notice:PsxDisc"
+msgstr "!Pemberitahuan:DiscPsx"
+
+#: pcsx2/System.cpp:114
+msgid "!Notice:Recompiler:VirtualMemoryAlloc"
+msgstr "!Pemberitahuan:Recompiler:AlokasiMemoriVirtual"
+
+#: pcsx2/System.cpp:348
+msgid "!Notice:EmuCore::MemoryForVM"
+msgstr "!Pemberitahuan:CoreEmu::MemoriUntukMesinVirtual"
+
+#: pcsx2/gui/AppInit.cpp:43
+msgid "!Notice:Startup:NoSSE2"
+msgstr "!Pemberitahuan:Startup:NoSSE2"
+
+#: pcsx2/gui/AppInit.cpp:162
+msgid "!Notice:RecompilerInit:Header"
+msgstr "!Pemberitahuan:InitRecompiler:Header"
+
+#: pcsx2/gui/AppInit.cpp:211
+msgid "!Notice:RecompilerInit:Footer"
+msgstr "!Pemberitahuan:InitRecompiler:Footer"
+
+#: pcsx2/gui/AppMain.cpp:546
+msgid "!Notice:BiosDumpRequired"
+msgstr "!Pemberitahuan:DumpBiosDiperlukan"
+
+#: pcsx2/gui/AppMain.cpp:629
+msgid "!Notice Error:Thread Deadlock Actions"
+msgstr "!Pemberitahuan Eror:Aksi Deadlock Pada Trit"
+
+#: pcsx2/gui/AppUserMode.cpp:57
+msgid "!Notice:PortableModeRights"
+msgstr "!Pemberitahuan:KekuasaanModePortable"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:181
+msgid "!ContextTip:ChangingNTFS"
+msgstr ""
+
+#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:49
+#, fuzzy
+msgid "!ContextTip:Folders:Settings"
+msgstr "!Panel:Folders:Pengaturan"
+
+#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:54
+msgid "!Panel:Folders:Settings"
+msgstr "!Panel:Folders:Pengaturan"
+
+#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:94
+msgid "!Wizard:Welcome"
+msgstr "!Wizard:Selamat Datang"
+
+#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:140
+msgid "!Wizard:Bios:Tutorial"
+msgstr "!Wizard:Bios:Tutorial"
+
+#: pcsx2/gui/Dialogs/ImportSettingsDialog.cpp:31
+msgid "!Notice:ImportExistingSettings"
+msgstr "!Pemberitahuan:ImporPengaturanYangAda"
+
+#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:30
+msgid "!Panel:Mcd:NtfsCompress"
+msgstr "!Panel:Mcd:NtfsCompress"
+
+#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:41
+msgid "!Panel:Mcd:EnableEjection"
+msgstr "!Panel:Mcd:AkifkanEjection"
+
+#: pcsx2/gui/Dialogs/StuckThreadDialog.cpp:33
+msgid "!Panel:StuckThread:Heading"
+msgstr "!Panel:TritSangkut:Heading"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:38
+#, fuzzy
+msgid "!Panel:HasHacksOverrides"
+msgstr "!Panel:Speedhacks:PenampakanSebagian"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:58
+msgid "!Panel:HasPluginsOverrides"
+msgstr ""
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:135
+msgid "!Notice:Tooltip:Presets:Slider"
+msgstr ""
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:149
+msgid "!Notice:Tooltip:Presets:Checkbox"
+msgstr ""
+
+#: pcsx2/gui/IsoDropTarget.cpp:28
+msgid "!Notice:ConfirmSysReset"
+msgstr "!Pemberitahuan:KonfirmasiResetSistem"
+
+#: pcsx2/gui/MainMenuClicks.cpp:106
+msgid "!Notice:DeleteSettings"
+msgstr "!Pemberitahuan:HapusPengaturan"
+
+#: pcsx2/gui/MemoryCardFile.cpp:78
+msgid "!Notice:Mcd:HasBeenDisabled"
+msgstr "!Pemberitahuan:Mcd:TelahDiNonaktifkan"
+
+#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:138
+msgid "!Notice:BIOS:InvalidSelection"
+msgstr "!Pemberitahuan:BIOS:PilihanTidakValid"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:111
+msgid "!Panel:EE/IOP:Heading"
+msgstr "!Panel:EE/IOP:Heading"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:178
+msgid "!Panel:VUs:Heading"
+msgstr "!Panel:VUs:Heading"
+
+#: pcsx2/gui/Panels/DirPickerPanel.cpp:69
+msgid "!Notice:DirPicker:CreatePath"
+msgstr "!Pemberitahuan:PilihanDirektori:BuatLokasi"
+
+#: pcsx2/gui/Panels/DirPickerPanel.cpp:158
+#, fuzzy
+msgid "!ContextTip:DirPicker:UseDefault"
+msgstr "!Pemberitahuan:PilihanDirektori:BuatLokasi"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:55
+msgid "!ContextTip:Window:Zoom"
+msgstr ""
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:63
+msgid "!ContextTip:Window:Vsync"
+msgstr ""
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:68
+msgid "!ContextTip:Window:ManagedVsync"
+msgstr ""
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:76
+msgid "!ContextTip:Window:HideMouse"
+msgstr ""
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:82
+msgid "!ContextTip:Window:Fullscreen"
+msgstr ""
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:93
+msgid "!ContextTip:Window:HideGS"
+msgstr ""
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:67
+msgid "!ContextTip:Gamefixes:EE Timing Hack"
+msgstr ""
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:80
+msgid "!ContextTip:Gamefixes:OPH Flag hack"
+msgstr ""
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:89
+msgid "!ContextTip:Gamefixes:DMA Busy hack"
+msgstr ""
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:96
+msgid "!ContextTip:Gamefixes:VIF1 FIFO hack"
+msgstr ""
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:119
+msgid "!Panel:Gamefixes:Compat Warning"
+msgstr "!Panel:PerbaikanPermainan:Peringatan Compat"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:720
+msgid "!Notice:Mcd:Delete"
+msgstr "!Pemberitahuan:Mcd:Hapus"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:758
+msgid "!Notice:Mcd:CantDuplicate"
+msgstr "!Pemberitahuan:Mcd:TidakBisaDuplikat"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:801
+msgid "!Notice:Mcd:Copy Failed"
+msgstr "!Pemberitahuan:Mcd:Salin Gagal"
+
+#: pcsx2/gui/Panels/MiscPanelStuff.cpp:35
+msgid "!Panel:Usermode:Explained"
+msgstr "!Panel:Modepengguna:Terjelaskan"
+
+#: pcsx2/gui/Panels/MiscPanelStuff.cpp:41
+msgid "!Panel:Usermode:Warning"
+msgstr "!Panel:Modepengguna:Peringatan"
+
+#: pcsx2/gui/Panels/PathsPanel.cpp:40
+#, fuzzy
+msgid "!ContextTip:Folders:Savestates"
+msgstr "!Panel:Folders:Pengaturan"
+
+#: pcsx2/gui/Panels/PathsPanel.cpp:50
+msgid "!ContextTip:Folders:Snapshots"
+msgstr ""
+
+#: pcsx2/gui/Panels/PathsPanel.cpp:60
+msgid "!ContextTip:Folders:Logs"
+msgstr ""
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:242
+msgid "!Notice:PluginSelector:ConfirmShutdown"
+msgstr "!Pemberitahuan:PilihanPlugin:KonfirmasiMatikan"
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:457
+msgid "!Notice:PluginSelector:ApplyFailed"
+msgstr "!Pemberitahuan:PilihanPlugin:GagalTerapkan"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:27
+#, fuzzy
+msgid "!Panel:Speedhacks:EECycleX1"
+msgstr "!Panel:Speedhacks:PenampakanSebagian"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:32
+#, fuzzy
+msgid "!Panel:Speedhacks:EECycleX2"
+msgstr "!Panel:Speedhacks:PenampakanSebagian"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:37
+#, fuzzy
+msgid "!Panel:Speedhacks:EECycleX3"
+msgstr "!Panel:Speedhacks:PenampakanSebagian"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:54
+#, fuzzy
+msgid "!Panel:Speedhacks:VUCycleStealOff"
+msgstr "!Panel:Speedhacks:PenampakanSebagian"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:59
+#, fuzzy
+msgid "!Panel:Speedhacks:VUCycleSteal1"
+msgstr "!Panel:Speedhacks:PenampakanSebagian"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:64
+#, fuzzy
+msgid "!Panel:Speedhacks:VUCycleSteal2"
+msgstr "!Panel:Speedhacks:PenampakanSebagian"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:70
+#, fuzzy
+msgid "!Panel:Speedhacks:VUCycleSteal3"
+msgstr "!Panel:Speedhacks:PenampakanSebagian"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:97
+msgid "!Panel:Speedhacks:Overview"
+msgstr "!Panel:Speedhacks:PenampakanSebagian"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:129
+msgid "!ContextTip:Speedhacks:EECycleRate Slider"
+msgstr ""
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:150
+msgid "!ContextTip:Speedhacks:VUCycleStealing Slider"
+msgstr ""
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
+msgid "!ContextTip:Speedhacks:vuFlagHack"
+msgstr ""
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:174
+#, fuzzy
+msgid "!ContextTip:Speedhacks:vuThread"
+msgstr "!Panel:Speedhacks:PenampakanSebagian"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:195
+msgid "!ContextTip:Speedhacks:INTC"
+msgstr ""
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
+msgid "!ContextTip:Speedhacks:BIFC0"
+msgstr ""
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:207
+msgid "!ContextTip:Speedhacks:fastCDVD"
+msgstr ""
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:37
+msgid "!ContextTip:Framelimiter:Disable"
+msgstr ""
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:227
+msgid "!Panel:Frameskip:Heading"
+msgstr "!Panel:Frameskip:Heading"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:306
+msgid "!ContextTip:GS:SyncMTGS"
+msgstr ""
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:310
+msgid "!ContextTip:GS:DisableOutput"
+msgstr ""
+
+#: pcsx2/vtlb.cpp:710
+msgid "!Notice:HostVmReserve"
+msgstr "!Pemberitahuan:HostVmReserve"
+
+#: pcsx2/x86/sVU_zerorec.cpp:363
+msgid "!Notice:superVU:VirtualMemoryAlloc"
+msgstr "!Pemberitahuan:superVU:AlokasiMemoriVirtual"
diff --git a/locales/id_ID/pcsx2_Main.po b/locales/id_ID/pcsx2_Main.po
new file mode 100644
index 000000000..361f60ba3
--- /dev/null
+++ b/locales/id_ID/pcsx2_Main.po
@@ -0,0 +1,2665 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR PCSX2_Dev_Team
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PCSX2 0.9.8 r4560\n"
+"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
+"POT-Creation-Date: 2012-02-28 12:25+0100\n"
+"PO-Revision-Date: 2012-01-06 21:54+0700\n"
+"Last-Translator: \n"
+"Language-Team: ikazu \n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-KeywordsList: _;pxL\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Poedit-Basepath: trunk\\\n"
+"X-Poedit-Language: Indonesian\n"
+"X-Poedit-Country: INDONESIA\n"
+"X-Poedit-SearchPath-0: pcsx2\n"
+"X-Poedit-SearchPath-1: common\n"
+
+#: common/include/Utilities/Exceptions.h:187
+msgid "No reason given."
+msgstr ""
+
+#: common/include/Utilities/Exceptions.h:226
+msgid "Parse error"
+msgstr "Unpacking gagal"
+
+#: common/include/Utilities/Exceptions.h:250
+msgid "Your machine's hardware is incapable of running PCSX2. Sorry dood."
+msgstr "Hardware Anda tidak mampu menjalnkan PCSX2. Sorry sobat."
+
+#: common/src/Utilities/Exceptions.cpp:219
+msgid "Oh noes! Out of memory!"
+msgstr "Oh tidak! Memori tidak mencukupi!"
+
+#: common/src/Utilities/Exceptions.cpp:234
+msgid ""
+"Virtual memory mapping failure! Your system may have conflicting device "
+"drivers, services, or may simply have insufficient memory or resources to "
+"meet PCSX2's lofty needs."
+msgstr ""
+"Mapping virtual memori gagal! Sistem anda mungkin telah mengkonflik device "
+"drivers, services, atau bisa jadi kekurangan memori dan sumber daya lainnya "
+"untuk memenuhi kebutuhan PCSX2 yang berat."
+
+#: common/src/Utilities/Exceptions.cpp:309
+msgid "Path: "
+msgstr "Lokasi:"
+
+#: common/src/Utilities/Exceptions.cpp:313
+msgid "[Unnamed or unknown]"
+msgstr "[Tidak bernama atau tidak dikenal]"
+
+#: common/src/Utilities/Exceptions.cpp:333
+msgid "A file could not be created."
+msgstr "Sebuah file tidak dapat dibuat."
+
+#: common/src/Utilities/Exceptions.cpp:353
+msgid "File not found."
+msgstr "File tidak ketemu."
+
+#: common/src/Utilities/Exceptions.cpp:373
+msgid ""
+"Permission denied while trying to open file, likely due to insufficient user "
+"account rights."
+msgstr ""
+"Izin tertolak ketika membuka file, kemungkinan dikarenakan kurangnya kuasa "
+"pengguna akun komputer."
+
+#: common/src/Utilities/Exceptions.cpp:393
+msgid ""
+"Unexpected end of file or stream encountered. File is probably truncated or "
+"corrupted."
+msgstr "Eror yang tidak disangka terjadi. File mungkin rusak atau korup."
+
+#: common/src/Utilities/ThreadTools.cpp:41
+msgid "Threading activity: start, detach, sync, deletion, etc."
+msgstr ""
+
+#: common/src/Utilities/ThreadingDialogs.cpp:30
+msgid "Waiting for tasks..."
+msgstr "Sedang menunggu beberapa tugas..."
+
+#: common/src/Utilities/ThreadingDialogs.cpp:41
+msgid "Waiting for task..."
+msgstr "Sedang menunggu tugas..."
+
+#: common/src/Utilities/wxAppWithHelpers.cpp:36
+msgid "Includes idle event processing and some other uncommon event usages."
+msgstr ""
+
+#: pcsx2/CDVD/IsoFileFormats.cpp:416
+msgid "Unrecognized ISO image file format"
+msgstr "File format ISO tak dikenal"
+
+#: pcsx2/Elfheader.cpp:266
+msgid "Cannot load ELF binary image. The file may be corrupt or incomplete."
+msgstr "Load file image ELF gagal. File mungkin korup atau tidak utuh."
+
+#: pcsx2/Elfheader.cpp:268
+msgid ""
+"If loading from an ISO image, this error may be caused by an unsupported ISO "
+"image type or a bug in PCSX2 ISO image support."
+msgstr ""
+"Bila menjalankan dari file ISO, kegagalan ini mungkin disebabkan oleh jenis "
+"file ISO yang tidak didukung oleh PCSX2 atau sebuah bug pada pembacaan file "
+"ISO PCSX2 sendiri."
+
+#: pcsx2/MTGS.cpp:859
+msgid ""
+"The MTGS thread has become unresponsive while waiting for the GS plugin to "
+"open."
+msgstr ""
+
+#: pcsx2/PluginManager.cpp:709
+msgid ""
+"The savestate cannot be loaded, as it appears to be corrupt or incomplete."
+msgstr ""
+"Savestate yang terpilih tidak mau diload, kelihatannya korup atau tidak utuh."
+
+#: pcsx2/PluginManager.cpp:719
+#, c-format
+msgid ""
+"%s plugin failed to open. Your computer may have insufficient resources, or "
+"incompatible hardware/drivers."
+msgstr ""
+"plugin %s gagal untuk dibuka. Komputer Anda mungkin kekurangan media, atau "
+"perangkat keras/drivers yang tidak cocok."
+
+#: pcsx2/PluginManager.cpp:726
+#, c-format
+msgid ""
+"%s plugin failed to initialize. Your system may have insufficient memory or "
+"resources needed."
+msgstr ""
+"plugin %s gagal untuk dijalankan. Sistem anda mungkin kekurangan memori "
+"atau media lain dibutuhkan."
+
+#: pcsx2/PluginManager.cpp:832
+#, c-format
+msgid "The configured %s plugin file was not found"
+msgstr "File %s yang telah dikonfigurasi tidak ditemukan"
+
+#: pcsx2/PluginManager.cpp:836
+#, c-format
+msgid "The configured %s plugin file is not a valid dynamic library"
+msgstr ""
+"File plugin %s yang telah dikonfigurasi bukanlah sebuah file dll yg valid"
+
+#: pcsx2/PluginManager.cpp:854
+#, c-format
+msgid ""
+"The configured %s plugin is not a PCSX2 plugin, or is for an older "
+"unsupported version of PCSX2."
+msgstr ""
+"File plugin %s bukanlah sebuah plugin PCSX2, atau merupakan plugin lama yang "
+"tidak didukung PCSX2."
+
+#: pcsx2/PluginManager.cpp:879
+msgid ""
+"The plugin reports that your hardware or software/drivers are not supported."
+msgstr ""
+"Plugin tersebut menyatakan perangkat keras atau perangkat lunak/drivers Anda "
+"tidak didukung."
+
+#: pcsx2/PluginManager.cpp:900
+msgid ""
+"Configured plugin is not a PCSX2 plugin, or is for an older unsupported "
+"version of PCSX2."
+msgstr ""
+"Plugin yang telah dikonfigurasi bukanlah sebuah plugin PCSX2, atau merupakan "
+"plugin lama yang tidak dukung PCSX2."
+
+#: pcsx2/PluginManager.cpp:926
+#, c-format
+msgid ""
+"Configured %s plugin is not a valid PCSX2 plugin, or is for an older "
+"unsupported version of PCSX2."
+msgstr ""
+"Plugin %s bukanlah sebuah plugin PCSX2 yg valid, atau merupakan plugin lama "
+"yang tidak didukung PCSX2."
+
+#: pcsx2/PluginManager.cpp:1355
+msgid "Internal Memorycard Plugin failed to initialize."
+msgstr ""
+
+#: pcsx2/PluginManager.cpp:1752
+msgid "Unloaded Plugin"
+msgstr "Plugin yang jalam"
+
+#: pcsx2/SaveState.cpp:342
+msgid "Cannot load savestate. It is of an unknown or unsupported version."
+msgstr ""
+"Tidak bisa meng-load savestate. Savestate tersebut tidak dikenal atau tidak "
+"didukung."
+
+#: pcsx2/SourceLog.cpp:96
+msgid "Dumps detailed information for PS2 executables (ELFs)."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:101
+msgid ""
+"Logs manual protection, split blocks, and other things that might impact "
+"performance."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:106
+msgid "Shows the game developer's logging text (EE processor)"
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:111
+msgid "Shows the game developer's logging text (IOP processor)"
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:116
+msgid "Shows DECI2 debugging logs (EE processor)"
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:145
+msgid "SYSCALL and DECI2 activity."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:151
+msgid "Direct memory accesses to unknown or unmapped EE memory space."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:157 pcsx2/SourceLog.cpp:276
+msgid "Disasm of executing core instructions (excluding COPs and CACHE)."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:163
+msgid "Disasm of COP0 instructions (MMU, cpu and dma status, etc)."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:169
+msgid "Disasm of the EE's floating point unit (FPU) only."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:175
+msgid "Disasm of the EE's VU0macro co-processor instructions."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:181
+msgid "Execution of EE cache instructions."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:187
+msgid ""
+"All known hardware register accesses (very slow!); not including sub filter "
+"options below."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:193 pcsx2/SourceLog.cpp:294
+msgid "Logs only unknown, unmapped, or unimplemented register accesses."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:199 pcsx2/SourceLog.cpp:300
+msgid "Logs only DMA-related registers."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:205
+msgid "IPU activity: hardware registers, decoding operations, DMA status, etc."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:211
+msgid "All GIFtag parse activity; path index, tag type, etc."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:217
+msgid "All VIFcode processing; command, tag style, interrupts."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:223
+msgid "All processing involved in Path3 Masking"
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:229
+msgid "Scratchpad's MFIFO activity."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:235
+msgid "Actual data transfer logs, bus right arbitration, stalls, etc."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:241
+msgid "Tracks all EE counters events and some counter register activity."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:247
+msgid "Dumps various VIF and VIFcode processing data."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:253
+msgid "Dumps various GIF and GIFtag parsing data."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:264
+msgid "SYSCALL and IRX activity."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:270
+msgid "Direct memory accesses to unknown or unmapped IOP memory space."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:282
+msgid "Disasm of the IOP's GPU co-processor instructions."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:288
+msgid ""
+"All known hardware register accesses, not including the sub-filters below."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:306
+msgid "Memorycard reads, writes, erases, terminators, and other processing."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:312
+msgid "Gamepad activity on the SIO."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:318
+msgid "Actual DMA event processing and data transfer logs."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:324
+msgid "Tracks all IOP counters events and some counter register activity."
+msgstr ""
+
+#: pcsx2/SourceLog.cpp:330
+msgid "Detailed logging of CDVD hardware."
+msgstr ""
+
+#: pcsx2/System.h:206 pcsx2/System.h:207 pcsx2/System.h:208
+msgid "PCSX2 Message"
+msgstr "Pesan PCSX2"
+
+#: pcsx2/ZipTools/thread_gzip.cpp:82
+msgid ""
+"The savestate was not properly saved. The temporary file was created "
+"successfully but could not be moved to its final resting place."
+msgstr ""
+"Savestate tersebut tidak di-save dengan baik. File sementara telah dibuat "
+"namun tidak dapat dipindah ke tempat peristirahatan akhir."
+
+#: pcsx2/gui/AppConfig.cpp:842
+msgid "Safest"
+msgstr ""
+
+#: pcsx2/gui/AppConfig.cpp:843
+msgid "Safe (faster)"
+msgstr ""
+
+#: pcsx2/gui/AppConfig.cpp:844
+msgid "Balanced"
+msgstr ""
+
+#: pcsx2/gui/AppConfig.cpp:845
+msgid "Aggressive"
+msgstr ""
+
+#: pcsx2/gui/AppConfig.cpp:846
+msgid "Aggressive plus"
+msgstr ""
+
+#: pcsx2/gui/AppConfig.cpp:847
+msgid "Mostly Harmful"
+msgstr ""
+
+#: pcsx2/gui/AppConfig.cpp:1007 pcsx2/gui/AppConfig.cpp:1013
+msgid "Failed to overwrite existing settings file; permission was denied."
+msgstr "Gagal untuk menulis ulang pengaturan lama; izin ditolak."
+
+#: pcsx2/gui/AppCorePlugins.cpp:404
+msgid "Loading PS2 system plugins..."
+msgstr "Sedang meng-load sistem plugin PS2..."
+
+#: pcsx2/gui/AppInit.cpp:41
+msgid "PCSX2 - SSE2 Recommended"
+msgstr "PCSX2 - direkomendasikan SSE2"
+
+#: pcsx2/gui/AppInit.cpp:71
+msgid ""
+"SSE extensions are not available. PCSX2 requires a cpu that supports the "
+"SSE instruction set."
+msgstr ""
+"Ekstensi SSE tidak terdaftar. PCSX2 memerlukan sebuah cpu yang mendukung "
+"instruksi SSE."
+
+#: pcsx2/gui/AppInit.cpp:154
+msgid "PCSX2 Recompiler Error(s)"
+msgstr "Eror Recompiler PCSX2 "
+
+#: pcsx2/gui/AppInit.cpp:227
+msgid "All options are for the current session only and will not be saved.\n"
+msgstr "Semua opsi adalah untuk sesi kini saja dan tidak akan disimpan.\n"
+
+#: pcsx2/gui/AppInit.cpp:237 pcsx2/gui/AppMain.cpp:299
+msgid "IsoFile"
+msgstr "FileIso"
+
+#: pcsx2/gui/AppInit.cpp:238
+msgid "displays this list of command line options"
+msgstr "menampilkan beberapa opsi command-line"
+
+#: pcsx2/gui/AppInit.cpp:239
+msgid "forces the program log/console to be visible"
+msgstr "memaksa log program/console menjadi tampak"
+
+#: pcsx2/gui/AppInit.cpp:240
+msgid "use fullscreen GS mode"
+msgstr "menggunakan mode fullscreen GS"
+
+#: pcsx2/gui/AppInit.cpp:241
+msgid "use windowed GS mode"
+msgstr "menggunakan mode windowed GS"
+
+#: pcsx2/gui/AppInit.cpp:243
+msgid "disables display of the gui while running games"
+msgstr "menghilangkan tampilan gui ketika game sedang jalan"
+
+#: pcsx2/gui/AppInit.cpp:244
+msgid "executes an ELF image"
+msgstr "eksekusi sebuah file ELF"
+
+#: pcsx2/gui/AppInit.cpp:245
+msgid "boots an empty dvd tray; use to enter the PS2 system menu"
+msgstr ""
+"menalankan sebuah dvd kosong; berguna untuk masuk kedalam menu sistem PS2"
+
+#: pcsx2/gui/AppInit.cpp:246
+msgid "boots from the CDVD plugin (overrides IsoFile parameter)"
+msgstr "menjalankan plugin CDVD (menggantikan parameter FileIso)"
+
+#: pcsx2/gui/AppInit.cpp:248
+msgid "disables all speedhacks"
+msgstr "menghilangkan semua speedhacks"
+
+#: pcsx2/gui/AppInit.cpp:249
+msgid "use the specified comma or pipe-delimited list of gamefixes."
+msgstr ""
+"menggunakan koma yang telah dispesifikkan atau daftar gamefixes yang telah "
+"dibatasi."
+
+#: pcsx2/gui/AppInit.cpp:250
+msgid "disables fast booting"
+msgstr "menonaktifkan fast booting"
+
+#: pcsx2/gui/AppInit.cpp:252
+msgid "changes the configuration file path"
+msgstr "mengubah lokasi konfigurasi file"
+
+#: pcsx2/gui/AppInit.cpp:253
+msgid "specifies the PCSX2 configuration file to use"
+msgstr "memasukkan file konfigurasi untuk digunakan PCSX2"
+
+#: pcsx2/gui/AppInit.cpp:254
+#, c-format
+msgid "forces %s to start the First-time Wizard"
+msgstr "memaksa %s untuk menjalankan tampilan First-time"
+
+#: pcsx2/gui/AppInit.cpp:255
+msgid "enables portable mode operation (requires admin/root access)"
+msgstr "mengaktifkan mode operasi portable (membutuhkan admin/akses root)"
+
+#: pcsx2/gui/AppInit.cpp:259
+#, c-format
+msgid "specify the file to use as the %s plugin"
+msgstr "memasukkan file yang digunakan sebagai plugin %s"
+
+#: pcsx2/gui/AppInit.cpp:307
+#, c-format
+msgid "Plugin Override Error - %s"
+msgstr "Eror pada saat penulisan ulang plugin - %s"
+
+#: pcsx2/gui/AppInit.cpp:310
+#, c-format
+msgid ""
+"%s Plugin Override Error! The following file does not exist or is not a "
+"valid %s plugin:\n"
+"\n"
+msgstr ""
+"%s Eror pada saat penulisan ulang plugin! File tersebut tidak terdaftar "
+"atau bukan plugin %s yang valid:\n"
+
+#: pcsx2/gui/AppInit.cpp:317
+#, c-format
+msgid "Press OK to use the default configured plugin, or Cancel to close %s."
+msgstr ""
+"Klik OK untuk menjalankan plugin biasa yang telah dikonfigurasi, atau Batal "
+"untuk menutup %s."
+
+#: pcsx2/gui/AppInit.cpp:496
+msgid "PCSX2 Error: Hardware Deficiency"
+msgstr "Eror PCSX2: Defisiensi Perangkat Keras"
+
+#: pcsx2/gui/AppInit.cpp:496 pcsx2/gui/AppInit.cpp:508
+#, c-format
+msgid "Press OK to close %s."
+msgstr "Klik OK untuk menutup %s."
+
+#: pcsx2/gui/AppInit.cpp:509
+#, c-format
+msgid "%s Critical Error"
+msgstr "Eror berat pada %s"
+
+#: pcsx2/gui/AppInit.cpp:679
+msgid "OK"
+msgstr "OK"
+
+#: pcsx2/gui/AppInit.cpp:680
+msgid "&OK"
+msgstr "&OK"
+
+#: pcsx2/gui/AppInit.cpp:681
+msgid "Cancel"
+msgstr "Batal"
+
+#: pcsx2/gui/AppInit.cpp:682
+msgid "&Cancel"
+msgstr "&Batal"
+
+#: pcsx2/gui/AppInit.cpp:683
+msgid "&Apply"
+msgstr "&Terapkan"
+
+#: pcsx2/gui/AppInit.cpp:684
+msgid "&Next >"
+msgstr "&Lanjut >"
+
+#: pcsx2/gui/AppInit.cpp:685
+msgid "< &Back"
+msgstr "< &Kembali"
+
+#: pcsx2/gui/AppInit.cpp:686
+msgid "&Back"
+msgstr "&Kembali"
+
+#: pcsx2/gui/AppInit.cpp:687
+msgid "&Finish"
+msgstr "&Mengakhiri"
+
+#: pcsx2/gui/AppInit.cpp:688
+msgid "&Yes"
+msgstr "&Ya"
+
+#: pcsx2/gui/AppInit.cpp:689
+msgid "&No"
+msgstr "&Tidak"
+
+#: pcsx2/gui/AppInit.cpp:690
+msgid "Browse"
+msgstr "Cari"
+
+#: pcsx2/gui/AppInit.cpp:691
+msgid "&Save"
+msgstr "&Save"
+
+#: pcsx2/gui/AppInit.cpp:692
+msgid "Save &As..."
+msgstr "Save &Sebagai..."
+
+#: pcsx2/gui/AppInit.cpp:693
+msgid "&Help"
+msgstr "&Bantuan"
+
+#: pcsx2/gui/AppInit.cpp:694
+msgid "&Home"
+msgstr "&Rumah"
+
+#: pcsx2/gui/AppInit.cpp:696
+msgid "Show about dialog"
+msgstr "Tampilkan mengenai dialog"
+
+#: pcsx2/gui/AppMain.cpp:87
+msgid ""
+"\n"
+"\n"
+"Press Ok to go to the Plugin Configuration Panel."
+msgstr ""
+"\n"
+"\n"
+"Klik Ok untuk memasuki Panel Konfigurasi Plugin."
+
+#: pcsx2/gui/AppMain.cpp:140 pcsx2/gui/AppMain.cpp:154
+msgid ""
+"Warning! System plugins have not been loaded. PCSX2 may be inoperable."
+msgstr ""
+"Peringatan! Sistem plugin belum dijalankan. PCSX2 mungkin tidak dapat "
+"beroperasi."
+
+#: pcsx2/gui/AppMain.cpp:309
+#, c-format
+msgid "%s Commandline Options"
+msgstr "%s Opsi Commandline"
+
+#: pcsx2/gui/AppMain.cpp:573
+msgid "PS2 BIOS Error"
+msgstr "Eror BIOS PS2"
+
+#: pcsx2/gui/AppMain.cpp:574
+msgid "Press Ok to go to the BIOS Configuration Panel."
+msgstr "Klik Ok untuk memasuki Panel Konfigurasi BIOS."
+
+#: pcsx2/gui/AppMain.cpp:626
+msgid "PCSX2 Unresponsive Thread"
+msgstr "PCSX2 Tidak Respon"
+
+#: pcsx2/gui/AppMain.cpp:636
+msgid "Terminate"
+msgstr "Gagalkan"
+
+#: pcsx2/gui/AppMain.cpp:963
+msgid "Executing PS2 Virtual Machine..."
+msgstr "Sedang meng-eksekusi Mesin Virtual PS2..."
+
+#: pcsx2/gui/AppRes.cpp:72
+msgid "Browse for an Iso that is not in your recent history."
+msgstr "Cari sebuah Iso yang tidak terdaftar dalam riwayat akhir Anda."
+
+#: pcsx2/gui/AppRes.cpp:72
+msgid "Browse..."
+msgstr "Cari..."
+
+#: pcsx2/gui/AppUserMode.cpp:99
+msgid "The following folders exist, but are not writable:"
+msgstr "Folders berikut ada, tetapi tidak dapat diubah:"
+
+#: pcsx2/gui/AppUserMode.cpp:104
+msgid "The following folders are missing and cannot be created:"
+msgstr "Folder folder berikut hilang dan tidak dapat dibuat:"
+
+#: pcsx2/gui/AppUserMode.cpp:144
+#, c-format
+msgid "Portable mode error - %s"
+msgstr "Mode portable eror - %s"
+
+#: pcsx2/gui/AppUserMode.cpp:157
+msgid ""
+"PCSX2 has been installed as a portable application but cannot run due to the "
+"following errors:"
+msgstr ""
+"PCSX2 telah diinstal sebagai aplikasi portable namun tidak jalan dikarena "
+"eror berikut:"
+
+#: pcsx2/gui/AppUserMode.cpp:165
+msgid "Switch to User Documents Mode"
+msgstr "Beralih ke Mode User Documents"
+
+#: pcsx2/gui/AppUserMode.cpp:178
+#, c-format
+msgid "%s is switching to local install mode."
+msgstr "&s sedang beralih ke mode instalasi lokal."
+
+#: pcsx2/gui/AppUserMode.cpp:179
+msgid ""
+"Try to remove the file called \"portable.ini\" from your installation "
+"directory manually."
+msgstr ""
+"Coba hapus file \"portable.ini\" dari direktori instalasi Anda secara manual."
+
+#: pcsx2/gui/ApplyState.h:55
+msgid "Cannot apply new settings, one of the settings is invalid."
+msgstr ""
+"Gagal menjalankan pengaturan baru, salah satu dari aturan tersebut tidak "
+"valid."
+
+#: pcsx2/gui/ConsoleLogger.cpp:120
+msgid "Save log question"
+msgstr "Simpan pertanyaan log"
+
+#: pcsx2/gui/ConsoleLogger.cpp:413
+msgid "Fits a lot of log in a microcosmically small area."
+msgstr ""
+
+#: pcsx2/gui/ConsoleLogger.cpp:413
+msgid "Small"
+msgstr "Kecil"
+
+#: pcsx2/gui/ConsoleLogger.cpp:415
+msgid "It's what I use (the programmer guy)."
+msgstr ""
+
+#: pcsx2/gui/ConsoleLogger.cpp:415 pcsx2/gui/Panels/CpuPanel.cpp:38
+msgid "Normal"
+msgstr "Normal"
+
+#: pcsx2/gui/ConsoleLogger.cpp:417
+msgid "Its nice and readable."
+msgstr ""
+
+#: pcsx2/gui/ConsoleLogger.cpp:417
+msgid "Large"
+msgstr "Besar"
+
+#: pcsx2/gui/ConsoleLogger.cpp:419
+msgid "Huge"
+msgstr "Sangat Besar"
+
+#: pcsx2/gui/ConsoleLogger.cpp:419
+msgid "In case you have a really high res display."
+msgstr ""
+
+#: pcsx2/gui/ConsoleLogger.cpp:423
+msgid "Default soft-tone color scheme."
+msgstr ""
+
+#: pcsx2/gui/ConsoleLogger.cpp:423
+msgid "Light theme"
+msgstr "Tema terang"
+
+#: pcsx2/gui/ConsoleLogger.cpp:424
+msgid ""
+"Classic black color scheme for people who enjoy having text seared into "
+"their optic nerves."
+msgstr ""
+
+#: pcsx2/gui/ConsoleLogger.cpp:424
+msgid "Dark theme"
+msgstr "Tema gelap"
+
+#: pcsx2/gui/ConsoleLogger.cpp:427
+msgid "Always on Top"
+msgstr "Selalu di Atas"
+
+#: pcsx2/gui/ConsoleLogger.cpp:428
+msgid ""
+"When checked the log window will be visible over other foreground windows."
+msgstr ""
+
+#: pcsx2/gui/ConsoleLogger.cpp:430
+msgid "&Save..."
+msgstr "&Save..."
+
+#: pcsx2/gui/ConsoleLogger.cpp:430
+msgid "Save log contents to file"
+msgstr "Simpan konten log ke file"
+
+#: pcsx2/gui/ConsoleLogger.cpp:431
+msgid "C&lear"
+msgstr "C&lear"
+
+#: pcsx2/gui/ConsoleLogger.cpp:431
+msgid "Clear the log window contents"
+msgstr "Hapus konten log window"
+
+#: pcsx2/gui/ConsoleLogger.cpp:433 pcsx2/gui/Dialogs/SysConfigDialog.cpp:280
+msgid "Appearance"
+msgstr "Tampilan"
+
+#: pcsx2/gui/ConsoleLogger.cpp:435
+msgid "&Close"
+msgstr "&Tutup"
+
+#: pcsx2/gui/ConsoleLogger.cpp:435
+msgid "Close this log window; contents are preserved"
+msgstr "Tutup window log ini; konten terjaga"
+
+#: pcsx2/gui/ConsoleLogger.cpp:439
+msgid "Dev/Verbose"
+msgstr "Dev/Verbose"
+
+#: pcsx2/gui/ConsoleLogger.cpp:439
+msgid "Shows PCSX2 developer logs"
+msgstr "Tampilkan log log pengembang PCSX2"
+
+#: pcsx2/gui/ConsoleLogger.cpp:440
+msgid "CDVD reads"
+msgstr "CDVD membaca"
+
+#: pcsx2/gui/ConsoleLogger.cpp:440
+msgid "Shows disk read activity"
+msgstr "Tampilkan aktivitas pembacaan disk"
+
+#: pcsx2/gui/ConsoleLogger.cpp:457
+msgid "Enable all"
+msgstr "Aktifkan semua"
+
+#: pcsx2/gui/ConsoleLogger.cpp:457
+msgid "Enables all log source filters."
+msgstr "Aktifkan semua sumber filtrasi log."
+
+#: pcsx2/gui/ConsoleLogger.cpp:458
+msgid "Disable all"
+msgstr "Nonaktifkan seluruhnya"
+
+#: pcsx2/gui/ConsoleLogger.cpp:458
+msgid "Disables all log source filters."
+msgstr "Nonaktifkan seluruh sumber filtrasi log."
+
+#: pcsx2/gui/ConsoleLogger.cpp:460
+msgid "&Log"
+msgstr "&Log"
+
+#: pcsx2/gui/ConsoleLogger.cpp:461
+msgid "&Sources"
+msgstr "&Sumbersumber"
+
+#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:35
+#, c-format
+msgid "About %s"
+msgstr "Tentang %s"
+
+#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:55
+msgid "Betatesting"
+msgstr "Betatesting"
+
+#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:55
+msgid "Previous versions"
+msgstr "Versi sebelumnya"
+
+#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:55
+msgid "Webmasters"
+msgstr "Webmasters"
+
+#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:66
+msgid "Plugin Specialists"
+msgstr "Para spesialis Plugin"
+
+#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:66
+msgid "Special thanks to"
+msgstr "Terima kasih khusus untuk"
+
+#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:82
+msgid "Developers"
+msgstr "Para pengembang"
+
+#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:84
+msgid "Contributors"
+msgstr "Para kontribusi"
+
+#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:98
+msgid "A Playstation 2 Emulator"
+msgstr "Sebuah Emulator Playstation 2"
+
+#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:102
+msgid "PCSX2 Official Website and Forums"
+msgstr "Situs Resmi dan Forums PCSX2 "
+
+#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:106
+msgid "PCSX2 Official Svn Repository at Googlecode"
+msgstr "Repository Svn Resmi PCSX2 di Googlecode"
+
+#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:110
+msgid "I've seen enough"
+msgstr "Saya telah cukup melihat"
+
+#: pcsx2/gui/Dialogs/AssertionDialog.cpp:23
+msgid "Assertion Failure - "
+msgstr "Pernyataan Gagal -"
+
+#: pcsx2/gui/Dialogs/BaseConfigurationDialog.cpp:193
+msgid "Saves a snapshot of this settings panel to a PNG file."
+msgstr "Simpan screenshot dari pengaturan ini ke sebuah file PNG."
+
+#: pcsx2/gui/Dialogs/BaseConfigurationDialog.cpp:308
+msgid "Save dialog screenshots to..."
+msgstr "Simpan screenshot dialog ke..."
+
+#: pcsx2/gui/Dialogs/BiosSelectorDialog.cpp:31
+msgid "BIOS Selector"
+msgstr "Pemilih BIOS"
+
+#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:193
+msgid "Do not show this dialog again."
+msgstr "Jangan tampilkan dialog ini lagi."
+
+#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:199
+msgid ""
+"Disables this popup and whatever response you select here will be "
+"automatically used from now on."
+msgstr ""
+"Nonaktifkan popup ini dan respon apapun yang kamu pilih disini akan otomatis "
+"digunakan mulai dari sekarang."
+
+#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:201
+msgid ""
+"The popup will not be shown again. This setting can be undone from the "
+"settings panels."
+msgstr ""
+"Popup ini tidak akan ditampilkan lagi. Pengaturan ini dapat dinonaktifkan "
+"dari panel Pengaturan."
+
+#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:247
+#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:292
+msgid "Ignore"
+msgstr "Biarkan"
+
+#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:278
+msgid "Reset"
+msgstr "Reset"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:40
+msgid "Create a new memory card"
+msgstr "Buat sebuah memory card baru"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:59
+#: pcsx2/gui/Panels/DirPickerPanel.cpp:74
+#: pcsx2/gui/Panels/DirPickerPanel.cpp:273
+msgid "Create"
+msgstr "Buat"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:71
+msgid "New memory card:"
+msgstr "Memory card baru:"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:72
+msgid "At folder: "
+msgstr "Pada folder:"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:75
+msgid "Select file name: "
+msgstr "Pilih nama file:"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:149
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:855
+#, c-format
+msgid "Error (%s)"
+msgstr "Eror (%s)"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:150
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:164
+msgid "Create memory card"
+msgstr "Buat memory card"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:163
+msgid "Error: The memory card could not be created."
+msgstr "Eror: Memory card tersebut tidak dapat dibuat."
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:177
+msgid "Use NTFS compression when creating this card."
+msgstr "Gunakan kompresi NTFS ketika membuat card ini."
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:195
+msgid "8 MB [most compatible]"
+msgstr "8 MB [paling cocok]"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:195
+msgid ""
+"This is the standard Sony-provisioned size, and is supported by all games "
+"and BIOS versions."
+msgstr ""
+"Ini adalah standar ukuran Sony, dan didukung oleh semua permainan dan versi "
+"BIOS."
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:196
+msgid ""
+"Always use this option if you want the safest and surest memory card "
+"behavior."
+msgstr ""
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:199
+msgid "16 MB"
+msgstr "16 MB"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:199
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:203
+msgid ""
+"A typical size for 3rd-party memory cards which should work with most games."
+msgstr ""
+"Sebuah memori card yang seharusnya jalan untuk sebagian besar permainan."
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:200
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:204
+msgid "16 and 32 MB cards have roughly the same compatibility factor."
+msgstr ""
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:203
+msgid "32 MB"
+msgstr "32 MB"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:207
+msgid "64 MB"
+msgstr "64 MB"
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:207
+msgid ""
+"Low compatibility warning: Yes it's very big, but may not work with many "
+"games."
+msgstr ""
+"Peringatan kompatibilitas rendah: Sangat besar, namun tidak jalan untuk "
+"sebagian besar permainan."
+
+#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:208
+msgid ""
+"Use at your own risk. Erratic memory card behavior is possible (though "
+"unlikely)."
+msgstr ""
+
+#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:47
+#, c-format
+msgid "Select a folder for %s settings"
+msgstr "Pilih sebuah folder untuk pengaturan %s"
+
+#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:47
+msgid "Settings"
+msgstr "Pengaturan"
+
+#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:81
+msgid "Language selector"
+msgstr "Pilihan Bahasa"
+
+#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:84
+msgid ""
+"Change the language only if you need to.\n"
+"The system default should be fine for most operating systems."
+msgstr ""
+"Ubah bahasa ketika Anda benar benar perlu.\n"
+"Sistem biasa seharusnya cukup untuk sebagian besar sistem operasi."
+
+#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:90
+msgid "Welcome to PCSX2!"
+msgstr "Selamat datang ke PCSX2!"
+
+#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:104
+msgid "Configuration Guides (online)"
+msgstr "Petunjuk Konfigurasi (online)"
+
+#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:108
+msgid "Readme / FAQ (Offline/PDF)"
+msgstr "Readme / FAQ (Offline/PDF)"
+
+#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:117
+#, c-format
+msgid "%s First Time Configuration"
+msgstr "%s Konfigurasi Pertama Kali"
+
+#: pcsx2/gui/Dialogs/GameDatabaseDialog.cpp:24
+#, c-format
+msgid "Game database - %s"
+msgstr "Database permainan - %s"
+
+#: pcsx2/gui/Dialogs/ImportSettingsDialog.cpp:24
+msgid "Import Existing Settings?"
+msgstr "Impor Pengaturan yang sudah ada?"
+
+#: pcsx2/gui/Dialogs/ImportSettingsDialog.cpp:39
+msgid "Import"
+msgstr "Impor"
+
+#: pcsx2/gui/Dialogs/ImportSettingsDialog.cpp:40
+msgid "Overwrite"
+msgstr "Buat ulang"
+
+#: pcsx2/gui/Dialogs/LogOptionsDialog.cpp:27
+msgid "Trace Logging"
+msgstr "Jajak Logging"
+
+#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:40
+msgid "Auto-eject memory cards when loading savestates"
+msgstr "Otomatis mengeluarkan memory cards ketika meng-load savestate"
+
+#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:96
+msgid "MemoryCard Manager"
+msgstr "Manager MemoryCard"
+
+#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:112
+msgid "Drag cards to or from PS2-ports"
+msgstr "Tarik cards ke PS2-ports atau dari PS2-ports"
+
+#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:113
+msgid ""
+"\n"
+"Note: Duplicate/Rename/Create/Delete will NOT be reverted with 'Cancel'."
+msgstr ""
+"\n"
+"Catatan: Gandakan/Ganti Nama/Buat/Hapus TIDAK akan dikembalikan ulang dengan "
+"'Batal'."
+
+#: pcsx2/gui/Dialogs/PickUserModeDialog.cpp:24
+msgid "PCSX2 First Time configuration"
+msgstr "PCSX2 Konfigurasi Pertama kali"
+
+#: pcsx2/gui/Dialogs/PickUserModeDialog.cpp:29
+#, c-format
+msgid "%s is starting from a new or unknown folder and needs to be configured."
+msgstr ""
+"%s sedang memulai dari sebuah folder baru atau tidak dikenal dan perlu "
+"dikonfigurasi."
+
+#: pcsx2/gui/Dialogs/StuckThreadDialog.cpp:28
+msgid "PCSX2 Thread is not responding"
+msgstr "Trit PCSX2 tidak merespon"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:36
+msgid "Config Overrides Warning"
+msgstr "Peringatan Penggantian Konfigurasi"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:56
+msgid "Components Overrides Warning"
+msgstr "Peringatan Perubahan Komponen"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:147
+msgid "Preset:"
+msgstr "Kini:"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:228
+#, c-format
+msgid "Emulation Settings - %s"
+msgstr "Pengaturan Emulasi - %s"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:237
+msgid "EE/IOP"
+msgstr "EE/IOP"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:238
+msgid "VUs"
+msgstr "VUs"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:239
+msgid "GS"
+msgstr "GS"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:240
+msgid "GS Window"
+msgstr "Tampilan GS"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:241
+msgid "Speedhacks"
+msgstr "Speedhacks"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:242
+msgid "Game Fixes"
+msgstr "Perbaikan untuk Permainan"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:253
+#, c-format
+msgid "Components Selectors - %s"
+msgstr "Pemilihan Komponen - %s"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:260
+msgid "Plugins"
+msgstr "Plugins"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:261
+msgid "BIOS"
+msgstr "BIOS"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:262
+msgid "Folders"
+msgstr "Folder Folder"
+
+#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:273
+#, c-format
+msgid "Appearance/Themes - %s"
+msgstr "Tampilan/Tema - %s"
+
+#: pcsx2/gui/ExecutorThread.cpp:40
+#, fuzzy
+msgid "Logs events as they are passed to the PS2 virtual machine."
+msgstr "Simulasi reset perangkat keras mesin virtual PS2."
+
+#: pcsx2/gui/ExecutorThread.cpp:430
+msgid "Press Cancel to attempt to cancel the action."
+msgstr "Klik Batal untuk menggagalkan aksi tersebut."
+
+#: pcsx2/gui/ExecutorThread.cpp:431
+#, c-format
+msgid "Press Terminate to kill %s immediately."
+msgstr "Pilih Gagalkan untuk membunuh %s secara langsung."
+
+#: pcsx2/gui/ExecutorThread.cpp:434
+msgid "Terminate App"
+msgstr "Gagalkan Aplikasi"
+
+#: pcsx2/gui/FrameForGS.cpp:384
+msgid "GS Output is Disabled!"
+msgstr "Output GS ternonaktifkan!"
+
+#: pcsx2/gui/GlobalCommands.cpp:387 pcsx2/gui/MainFrame.cpp:414
+msgid "Save state"
+msgstr "Save state"
+
+#: pcsx2/gui/GlobalCommands.cpp:388
+msgid "Saves the virtual machine state to the current slot."
+msgstr "Simpan kondisi mesin virtual ke slot yang terpilih."
+
+#: pcsx2/gui/GlobalCommands.cpp:393 pcsx2/gui/MainFrame.cpp:413
+msgid "Load state"
+msgstr "Load state"
+
+#: pcsx2/gui/GlobalCommands.cpp:394
+msgid "Loads a virtual machine state from the current slot."
+msgstr "Jalankan sebuah kondisi mesin virtual dari slot yang terpilih."
+
+#: pcsx2/gui/GlobalCommands.cpp:399
+msgid "Load State Backup"
+msgstr "Backup Load State"
+
+#: pcsx2/gui/GlobalCommands.cpp:400
+msgid "Loads virtual machine state backup for current slot."
+msgstr "Jalankan backup kondisi mesin virtual untuk slot yang terpilih."
+
+#: pcsx2/gui/GlobalCommands.cpp:405
+msgid "Cycle to next slot"
+msgstr "Lanjut ke slot berikutnya"
+
+#: pcsx2/gui/GlobalCommands.cpp:406
+msgid "Cycles the current save slot in +1 fashion!"
+msgstr "Maju save slot sekarang ke +1!"
+
+#: pcsx2/gui/GlobalCommands.cpp:411
+msgid "Cycle to prev slot"
+msgstr "Mundur ke slot sebelumnya"
+
+#: pcsx2/gui/GlobalCommands.cpp:412
+msgid "Cycles the current save slot in -1 fashion!"
+msgstr "Mundur save slot kini ke dalam -1!"
+
+#: pcsx2/gui/IsoDropTarget.cpp:57
+msgid "Drag and Drop Error"
+msgstr "Eror pada Tarik dan Lepas"
+
+#: pcsx2/gui/IsoDropTarget.cpp:58
+#, c-format
+msgid ""
+"It is an error to drop multiple files onto a %s window. One at a time "
+"please, thank you."
+msgstr ""
+"Eror terjadi ketika menjatuhkan lebih dari satu file ke window %s. Satu file "
+"sekali, terima kasih."
+
+#: pcsx2/gui/IsoDropTarget.cpp:89 pcsx2/gui/MainMenuClicks.cpp:342
+msgid "Confirm PS2 Reset"
+msgstr "Konfirmasi Reset PS2"
+
+#: pcsx2/gui/IsoDropTarget.cpp:91
+#, c-format
+msgid ""
+"You have dropped the following ELF binary into %s:\n"
+"\n"
+msgstr ""
+"Anda telah menjatuhkan binari ELF berikut kedalam %s:\n"
+"\n"
+
+#: pcsx2/gui/IsoDropTarget.cpp:135
+#, c-format
+msgid "You have dropped the following ISO image into %s:"
+msgstr "Anda telah menjatuhkan file ISO berikut ke dalam %s:"
+
+#: pcsx2/gui/MainFrame.cpp:38
+#, c-format
+msgid "Slot %d"
+msgstr "Slot %d"
+
+#: pcsx2/gui/MainFrame.cpp:44 pcsx2/gui/Saveslots.cpp:150
+msgid "Backup"
+msgstr "Backup"
+
+#: pcsx2/gui/MainFrame.cpp:324
+msgid "Show Console"
+msgstr "Tampilkan Console"
+
+#: pcsx2/gui/MainFrame.cpp:325
+msgid "Console to Stdio"
+msgstr "Konsol ke Stdio"
+
+#: pcsx2/gui/MainFrame.cpp:338
+msgid "&System"
+msgstr "&Sistem"
+
+#: pcsx2/gui/MainFrame.cpp:339
+msgid "CD&VD"
+msgstr "CD&VD"
+
+#: pcsx2/gui/MainFrame.cpp:340
+msgid "&Config"
+msgstr "&Konfigurasi"
+
+#: pcsx2/gui/MainFrame.cpp:341
+msgid "&Misc"
+msgstr "&Lainnya"
+
+#: pcsx2/gui/MainFrame.cpp:343
+msgid "&Debug"
+msgstr "&Debug"
+
+#: pcsx2/gui/MainFrame.cpp:355
+#, c-format
+msgid "%s %d.%d.%d.%d%s (svn) %s"
+msgstr "%s %d.%d.%d.%d%s (svn) %s"
+
+#: pcsx2/gui/MainFrame.cpp:361
+#, c-format
+msgid "%s %d.%d.%d %s"
+msgstr "%s %d.%d.%d %s"
+
+#: pcsx2/gui/MainFrame.cpp:362
+msgid "(modded)"
+msgstr "(termodifikasi)"
+
+#: pcsx2/gui/MainFrame.cpp:399 pcsx2/gui/MainFrame.cpp:401
+#: pcsx2/gui/MainFrame.cpp:407
+msgid "Initializing..."
+msgstr "Sedang menyiapkan..."
+
+#: pcsx2/gui/MainFrame.cpp:403
+msgid "Run ELF..."
+msgstr "Jalankan ELF..."
+
+#: pcsx2/gui/MainFrame.cpp:404
+msgid "For running raw PS2 binaries directly"
+msgstr "Untuk menjalankan binari PS2 yang mentah"
+
+#: pcsx2/gui/MainFrame.cpp:416
+msgid "Backup before save"
+msgstr "Backup sebelum simpan"
+
+#: pcsx2/gui/MainFrame.cpp:421
+msgid "Automatic Gamefixes"
+msgstr "Perbaikan Permainan Otomatis"
+
+#: pcsx2/gui/MainFrame.cpp:422
+msgid "Automatically applies needed Gamefixes to known problematic games"
+msgstr "Secara otomatis menerapkan Perbaikan untuk permainan yang bermasalah"
+
+#: pcsx2/gui/MainFrame.cpp:424
+msgid "Enable Cheats"
+msgstr "Aktifkan Cheats"
+
+#: pcsx2/gui/MainFrame.cpp:427
+msgid "Enable Host Filesystem"
+msgstr "Aktifkan Filesystem Host"
+
+#: pcsx2/gui/MainFrame.cpp:432
+msgid "Shutdown"
+msgstr "Matikan"
+
+#: pcsx2/gui/MainFrame.cpp:433
+msgid "Wipes all internal VM states and shuts down plugins."
+msgstr "Hapus semua kondisi internal VM dan matikan seluruh plugin."
+
+#: pcsx2/gui/MainFrame.cpp:435
+msgid "Exit"
+msgstr "Keluar"
+
+#: pcsx2/gui/MainFrame.cpp:436
+#, c-format
+msgid "Closing %s may be hazardous to your health"
+msgstr "Menutup %s mungkin berbahaya bagi kesehatan Anda"
+
+#: pcsx2/gui/MainFrame.cpp:443
+msgid "Iso Selector"
+msgstr "Pilih Iso"
+
+#: pcsx2/gui/MainFrame.cpp:444
+msgid "Plugin Menu"
+msgstr "Menu Plugin"
+
+#: pcsx2/gui/MainFrame.cpp:447
+msgid "Iso"
+msgstr "Iso"
+
+#: pcsx2/gui/MainFrame.cpp:447
+msgid "Makes the specified ISO image the CDVD source."
+msgstr "Menetapkan file ISO yang terpilih sebagai sumber CDVD."
+
+#: pcsx2/gui/MainFrame.cpp:448
+msgid "Plugin"
+msgstr "Plugin"
+
+#: pcsx2/gui/MainFrame.cpp:448
+msgid "Uses an external plugin as the CDVD source."
+msgstr "Menggunakan sebuah plugin eksternal sebagai sumber CDVD."
+
+#: pcsx2/gui/MainFrame.cpp:449
+msgid "No disc"
+msgstr "Tanpa disc"
+
+#: pcsx2/gui/MainFrame.cpp:449
+msgid "Use this to boot into your virtual PS2's BIOS configuration."
+msgstr "Gunakan ini untuk masuk kedalam konfigurasi BIOS PS2 virtual Anda."
+
+#: pcsx2/gui/MainFrame.cpp:457
+msgid "Emulation &Settings"
+msgstr "Emulasi &Pengaturan"
+
+#: pcsx2/gui/MainFrame.cpp:458
+msgid "&Memory cards"
+msgstr "&Memory card"
+
+#: pcsx2/gui/MainFrame.cpp:459
+msgid "&Plugin/BIOS Selector"
+msgstr "&Pemilih Plugin/BIOS"
+
+#: pcsx2/gui/MainFrame.cpp:460 pcsx2/gui/Panels/GameDatabasePanel.cpp:346
+msgid "Game Database Editor"
+msgstr "Editor Database Game"
+
+#: pcsx2/gui/MainFrame.cpp:466
+msgid "&Video (GS)"
+msgstr "&Video (GS)"
+
+#: pcsx2/gui/MainFrame.cpp:467
+msgid "&Audio (SPU2)"
+msgstr "&Suara (SPU2)"
+
+#: pcsx2/gui/MainFrame.cpp:468
+msgid "&Controllers (PAD)"
+msgstr "&Controllers (PAD)"
+
+#: pcsx2/gui/MainFrame.cpp:469
+msgid "Dev9"
+msgstr "Dev9"
+
+#: pcsx2/gui/MainFrame.cpp:470
+msgid "USB"
+msgstr "USB"
+
+#: pcsx2/gui/MainFrame.cpp:471
+msgid "Firewire"
+msgstr "Firewire"
+
+#: pcsx2/gui/MainFrame.cpp:477
+msgid "Multitap 1"
+msgstr "Multitap 1"
+
+#: pcsx2/gui/MainFrame.cpp:478
+msgid "Multitap 2"
+msgstr "Multitap 2"
+
+#: pcsx2/gui/MainFrame.cpp:481
+msgid "Clear all settings..."
+msgstr "Hapus semua pengaturan..."
+
+#: pcsx2/gui/MainFrame.cpp:482
+#, c-format
+msgid "Clears all %s settings and re-runs the startup wizard."
+msgstr "Hapus semua pengaturan %s dan jalankan ulang tampilan mula mula."
+
+#: pcsx2/gui/MainFrame.cpp:504
+msgid "About..."
+msgstr "Tentang..."
+
+#: pcsx2/gui/MainFrame.cpp:508
+msgid "Logging..."
+msgstr "Logging..."
+
+#: pcsx2/gui/MainFrame.cpp:585
+msgid "Pause"
+msgstr "Pause"
+
+#: pcsx2/gui/MainFrame.cpp:586
+msgid "Safely pauses emulation and preserves the PS2 state."
+msgstr ""
+"Dengan aman menghentikan emulasi dan menjaga tetap kondisi PS2 yang sedang "
+"jalan."
+
+#: pcsx2/gui/MainFrame.cpp:593
+msgid "Resume"
+msgstr "Lanjut"
+
+#: pcsx2/gui/MainFrame.cpp:594
+msgid "Resumes the suspended emulation state."
+msgstr "Melanjutkan kembali kondisi emulasi yang terhenti tadi."
+
+#: pcsx2/gui/MainFrame.cpp:598
+msgid "Pause/Resume"
+msgstr "Pause/Lanjut"
+
+#: pcsx2/gui/MainFrame.cpp:599
+msgid "No emulation state is active; cannot suspend or resume."
+msgstr "Tidak ada kondisi yang aktif; tidak bisa berhenti maupun lanjut."
+
+#: pcsx2/gui/MainFrame.cpp:608
+msgid "Restart"
+msgstr "Restart"
+
+#: pcsx2/gui/MainFrame.cpp:609
+msgid "Simulates hardware reset of the PS2 virtual machine."
+msgstr "Simulasi reset perangkat keras mesin virtual PS2."
+
+#: pcsx2/gui/MainFrame.cpp:614
+msgid "No emulation state is active; boot something first."
+msgstr ""
+"Tidak ada kondisi emulasi yang aktif; jalankan sesuatu terlebih dahulu."
+
+#: pcsx2/gui/MainFrame.cpp:622
+msgid "Reboot CDVD (full)"
+msgstr "Jalankan ulang CDVD (full)"
+
+#: pcsx2/gui/MainFrame.cpp:623
+msgid "Hard reset of the active VM."
+msgstr "Hard reset dari mesin virtual yang aktif."
+
+#: pcsx2/gui/MainFrame.cpp:627
+msgid "Boot CDVD (full)"
+msgstr "Jalankan CDVD (full)"
+
+#: pcsx2/gui/MainFrame.cpp:628
+msgid "Boot the VM using the current DVD or Iso source media"
+msgstr ""
+"Jalankan mesin virtual menggunakan DVD yang sekarang atau sumber media Iso"
+
+#: pcsx2/gui/MainFrame.cpp:636
+msgid "Reboot CDVD (fast)"
+msgstr "Jalankan ulang CDVD (cepat)"
+
+#: pcsx2/gui/MainFrame.cpp:637
+msgid "Reboot using fast BOOT (skips splash screens)"
+msgstr "Menjalankan ulang menggunakan BOOT cepat (melewati layar splash)"
+
+#: pcsx2/gui/MainFrame.cpp:641
+msgid "Boot CDVD (fast)"
+msgstr "Jalankan CDVD (cepat)"
+
+#: pcsx2/gui/MainFrame.cpp:642
+msgid "Use fast boot to skip PS2 startup and splash screens"
+msgstr "Meggunakan fast boot untuk melewati awalan PS2 dan layar splash"
+
+#: pcsx2/gui/MainFrame.cpp:703 pcsx2/gui/MainFrame.cpp:738
+msgid "No plugin loaded"
+msgstr "Tak ada plugin yang dijalankan"
+
+#: pcsx2/gui/MainFrame.cpp:708
+msgid "Core GS Settings..."
+msgstr "Pengaturan Inti GS"
+
+#: pcsx2/gui/MainFrame.cpp:709
+msgid ""
+"Modify hardware emulation settings regulated by the PCSX2 core virtual "
+"machine."
+msgstr ""
+"Memodifikasi pengaturan emulasi perangkat keras yang diatur inti mesin "
+"virtual PCSX2."
+
+#: pcsx2/gui/MainFrame.cpp:711
+msgid "Window Settings..."
+msgstr "Pengaturan Window"
+
+#: pcsx2/gui/MainFrame.cpp:712
+msgid "Modify window and appearance options, including aspect ratio."
+msgstr "Memodifikasi window dan opsi tampilan, termasuk aspect ratio."
+
+#: pcsx2/gui/MainFrame.cpp:719
+msgid "Plugin Settings..."
+msgstr "Pengaturan Plugin"
+
+#: pcsx2/gui/MainFrame.cpp:720
+#, c-format
+msgid "Opens the %s plugin's advanced settings dialog."
+msgstr "Membuka plugin %s bagian kompleks."
+
+#: pcsx2/gui/MainMenuClicks.cpp:112
+msgid "Reset all settings?"
+msgstr "Reset semua konfigurasi ?"
+
+#: pcsx2/gui/MainMenuClicks.cpp:140
+msgid "Confirm ISO image change"
+msgstr "Konfirmasi ganti ISO"
+
+#: pcsx2/gui/MainMenuClicks.cpp:146
+msgid "Do you want to swap discs or boot the new image (via system reset)?"
+msgstr ""
+"Apakah Anda ingin tukar disc atau menjalankan file image baru (melalui reset "
+"sistem)?"
+
+#: pcsx2/gui/MainMenuClicks.cpp:148 pcsx2/gui/MainMenuClicks.cpp:194
+msgid "Swap Disc"
+msgstr "Ganti Disc"
+
+#: pcsx2/gui/MainMenuClicks.cpp:184
+msgid "Confirm CDVD source change"
+msgstr "Konfirmasi penggantian sumber CDVD"
+
+#: pcsx2/gui/MainMenuClicks.cpp:187
+#, c-format
+msgid "You've selected to switch the CDVD source from %s to %s."
+msgstr "Anda telah memilih untuk menukar sumber CDVD dari %s menjadi %s."
+
+#: pcsx2/gui/MainMenuClicks.cpp:191
+msgid "Do you want to swap discs or boot the new image (system reset)?"
+msgstr ""
+"Apa anda ingin tukar disc atau ingin menjalankan file image baru (reset "
+"sistem)?"
+
+#: pcsx2/gui/MainMenuClicks.cpp:261
+#, c-format
+msgid "All Supported (%s)"
+msgstr "Semua Didukung (%s)"
+
+#: pcsx2/gui/MainMenuClicks.cpp:264
+#, c-format
+msgid "Disc Images (%s)"
+msgstr "Images Disc (%s)"
+
+#: pcsx2/gui/MainMenuClicks.cpp:267
+#, c-format
+msgid "Blockdumps (%s)"
+msgstr "Blockdumps (%s)"
+
+#: pcsx2/gui/MainMenuClicks.cpp:270 pcsx2/gui/MainMenuClicks.cpp:291
+msgid "All Files (*.*)"
+msgstr "Semua File (*.*)"
+
+#: pcsx2/gui/MainMenuClicks.cpp:273
+msgid "Select CDVD source iso..."
+msgstr "Pilih sumber iso CDVD"
+
+#: pcsx2/gui/MainMenuClicks.cpp:290
+msgid "Select ELF file..."
+msgstr "Pilih file ELF"
+
+#: pcsx2/gui/MainMenuClicks.cpp:316
+msgid "ISO file not found!"
+msgstr "File ISO tidak ditemukan!"
+
+#: pcsx2/gui/MainMenuClicks.cpp:318
+msgid "An error occurred while trying to open the file:"
+msgstr "Eror ketika mencoba membuka file:"
+
+#: pcsx2/gui/MainMenuClicks.cpp:319
+msgid ""
+"Error: The configured ISO file does not exist. Click OK to select a new ISO "
+"source for CDVD."
+msgstr ""
+"Eror: File ISO yang dikonfigurasikan tidak ada. Klik OK untuk memilih sebuah "
+"sumber ISO baru untuk CDVD"
+
+#: pcsx2/gui/MainMenuClicks.cpp:390
+msgid ""
+"You have selected the following ISO image into PCSX2:\n"
+"\n"
+msgstr ""
+"Anda telah memilih ISO berikut kedalam PCSX2:\n"
+"\n"
+
+#: pcsx2/gui/MemoryCardFile.cpp:183
+#, c-format
+msgid ""
+"Could not create a memory card: \n"
+"\n"
+"%s\n"
+"\n"
+msgstr ""
+"Memoy card gagal dibuat: \n"
+"\n"
+"%s\n"
+"\n"
+
+#: pcsx2/gui/MemoryCardFile.cpp:201
+#, c-format
+msgid ""
+"Access denied to memory card: \n"
+"\n"
+"%s\n"
+"\n"
+msgstr ""
+"Akses ditolak untuk memory card: \n"
+"\n"
+"%s\n"
+"\n"
+
+#: pcsx2/gui/MemoryCardFile.cpp:525
+msgid "File name empty or too short"
+msgstr "Nama file kosong atau terlalu singkat"
+
+#: pcsx2/gui/MemoryCardFile.cpp:530
+msgid "File name outside of required directory"
+msgstr "Nama file diluar direktori yang dibutuhkan"
+
+#: pcsx2/gui/MemoryCardFile.cpp:536
+msgid "File name already exists"
+msgstr "Nama file telah ada"
+
+#: pcsx2/gui/MemoryCardFile.cpp:543
+msgid "The Operating-System prevents this file from being created"
+msgstr "Sistem-Operasi menghalangi pembuatan file ini"
+
+#: pcsx2/gui/Panels/BaseApplicableConfigPanel.cpp:103
+msgid "Cannot apply settings..."
+msgstr "Gagal menerapkan pengaturan..."
+
+#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:103
+msgid "BIOS Search Path:"
+msgstr "Lokasi Pencarian BIOS:"
+
+#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:104
+msgid "Select folder with PS2 BIOS roms"
+msgstr "Pilih folder yang memuat rom BIOS PS2"
+
+#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:111
+msgid ""
+"Click the Browse button to select a different folder where PCSX2 will look "
+"for PS2 BIOS roms."
+msgstr ""
+"Klik tombol Cari untuk memilih sebuah folder lain dimana PCSX2 akan mencari "
+"BIOS PS2."
+
+#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:113
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:156
+#: pcsx2/gui/Panels/ThemeSelectorPanel.cpp:47
+msgid "Refresh list"
+msgstr "Refresh daftar"
+
+#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:115
+msgid "Select a BIOS rom:"
+msgstr "Pilih sebuah rom BIOS:"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:24
+msgid "Round Mode"
+msgstr "Mode Round"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:25
+msgid "Clamping Mode"
+msgstr "Mode Clamping"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:29
+msgid "Nearest"
+msgstr "Terdekat"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:30
+msgid "Negative"
+msgstr "Negatif"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:31
+msgid "Positive"
+msgstr "Positif"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:32
+msgid "Chop / Zero"
+msgstr "Nol / Terpotong"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:37
+msgid "None"
+msgstr "Tidak ada"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:85
+msgid "EE/FPU Advanced Recompiler Options"
+msgstr "Pengaturan Kompleks Recompiler EE/FPU"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:87 pcsx2/gui/Panels/CpuPanel.cpp:102
+msgid "Extra + Preserve Sign"
+msgstr "Extra + Preserve Sign"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:88
+msgid "Full"
+msgstr "Full"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:99
+msgid "VU0 / VU1 Advanced Recompiler Options"
+msgstr "Pengaturan Kompleks Recompiler VU0 / VU1"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:101
+msgid "Extra"
+msgstr "Extra"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:117 pcsx2/gui/Panels/CpuPanel.cpp:126
+#: pcsx2/gui/Panels/CpuPanel.cpp:184
+msgid "Interpreter"
+msgstr "Interpreter"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:118
+msgid "Quite possibly the slowest thing in the universe."
+msgstr "Kemungkinan besar paling lambat di dunia."
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:120 pcsx2/gui/Panels/CpuPanel.cpp:129
+msgid "Recompiler"
+msgstr "Recompiler"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:121
+msgid ""
+"Performs just-in-time binary translation of 64-bit MIPS-IV machine code to "
+"x86."
+msgstr ""
+"Menjalankan translasi binari just-in-time dari kode mesin 64-bit MIPS-IV ke "
+"x86."
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:127
+msgid "Pretty slow; provided for diagnostic purposes only."
+msgstr "Cukup lambat; digunakan untuk tujuan diagnosa saja."
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:130
+msgid ""
+"Performs just-in-time binary translation of 32-bit MIPS-I machine code to "
+"x86."
+msgstr ""
+"Menjalankan translasi binari just-in-time dari kode mesin 32-bit MIPS-IV ke "
+"x86."
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:154
+#, fuzzy
+msgid "Enable EE Cache (Slower)"
+msgstr "Aktifkan EE Cache - Interpreter Saja! (Lebih lambat)"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:154
+#, fuzzy
+msgid "Interpreter only; provided for diagnostic"
+msgstr "Cukup lambat; digunakan untuk tujuan diagnosa saja."
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:170 pcsx2/gui/Panels/CpuPanel.cpp:223
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:110
+msgid "Restore Defaults"
+msgstr "Restorasi Awal"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:185
+msgid ""
+"Vector Unit Interpreter. Slow and not very compatible. Only use for "
+"diagnostics."
+msgstr ""
+"Unit Vektor Interpreter. Lambat dan kompatibilitas rendah. Digunakan untuk "
+"diagnosa."
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:187
+msgid "microVU Recompiler"
+msgstr "Recompiler microVU"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:188
+msgid ""
+"New Vector Unit recompiler with much improved compatibility. Recommended."
+msgstr ""
+"Recompiler Unit Vektor baru dengan kompatibilitas yang meningkat. "
+"Direkomendasikan."
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:190
+msgid "superVU Recompiler [legacy]"
+msgstr "Recompiler superVU [legacy]"
+
+#: pcsx2/gui/Panels/CpuPanel.cpp:191
+msgid ""
+"Useful for diagnosing bugs or clamping issues in the new mVU recompiler."
+msgstr ""
+"Berguna untuk diagnosa bug atau permasalahan terkait jepitan dalam "
+"recompiler baru mVU."
+
+#: pcsx2/gui/Panels/DirPickerPanel.cpp:64
+msgid "Path does not exist"
+msgstr "Lokasi tidak ada"
+
+#: pcsx2/gui/Panels/DirPickerPanel.cpp:156
+msgid "Use default setting"
+msgstr "Gunakan lokasi umum"
+
+#: pcsx2/gui/Panels/DirPickerPanel.cpp:176
+msgid "Open in Explorer"
+msgstr "Buka dalam Explorer"
+
+#: pcsx2/gui/Panels/DirPickerPanel.cpp:177
+msgid "Open an explorer window to this folder."
+msgstr "Buka tampilan explorer folder ini."
+
+#: pcsx2/gui/Panels/DirPickerPanel.cpp:268
+msgid "Create folder?"
+msgstr "Buat folder?"
+
+#: pcsx2/gui/Panels/DirPickerPanel.cpp:269
+#, c-format
+msgid "A configured folder does not exist. Should %s try to create it?"
+msgstr ""
+"Sebuah folder yang dikonfigurasi tidak ada. Perlukah %s mencoba membuatnya?"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:30
+msgid "Fit to Window/Screen"
+msgstr "Fit to Window/Screen"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:31
+msgid "Standard (4:3)"
+msgstr "Standard (4:3)"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:32
+msgid "Widescreen (16:9)"
+msgstr "Widescreen (16:9)"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:46
+msgid "Disable window resize border"
+msgstr "Nonaktifkan perbatasan layar"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:47
+msgid "Always hide mouse cursor"
+msgstr "Selalu menyembunyikan kursor mouse"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:48
+msgid "Hide window when paused"
+msgstr "Sembunyikan window ketika dipause"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:49
+msgid "Default to fullscreen mode on open"
+msgstr "Buat ke mode fullscreen ketika dibuka"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:50
+msgid "Wait for Vsync on refresh"
+msgstr "Tunggu Vsync ketika refresh"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:51
+msgid "Dynamically toggle Vsync depending on frame rate (read tooltip!)"
+msgstr ""
+"Secara dinamis mengatur Vsync tergantung dari frame rate (baca keterangan!)"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:52
+msgid "Double-click toggles fullscreen mode"
+msgstr "Klik dua kali akan membuat mode fullscreen"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:110
+msgid "Aspect Ratio:"
+msgstr "Aspect Ratio:"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:112
+msgid "Custom Window Size:"
+msgstr "Ukuran Layar Buatan:"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:115
+msgid "Zoom:"
+msgstr "Perbesar:"
+
+#: pcsx2/gui/Panels/GSWindowPanel.cpp:196
+msgid ""
+"Invalid window dimensions specified: Size cannot contain non-numeric digits! "
+">_<"
+msgstr ""
+"Terdeteksi pemasukan dimensi layar yang tidak valid: Ukuran tidak boleh "
+"memuat bilangan non-angka! >_<"
+
+#: pcsx2/gui/Panels/GameDatabasePanel.cpp:334
+msgid "Search"
+msgstr "Cari"
+
+#: pcsx2/gui/Panels/GameDatabasePanel.cpp:368
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:25
+msgid "Gamefixes"
+msgstr "Perbaikan Permainan"
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:38
+msgid "VU Add Hack - Fixes Tri-Ace games boot crash."
+msgstr "VU Add Hack - Memperbaiki permainan Tri-Ace sewaktu booting gagal."
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:39
+msgid ""
+"Games that need this hack to boot:\n"
+" * Star Ocean 3\n"
+" * Radiata Stories\n"
+" * Valkyrie Profile 2"
+msgstr ""
+"Permainan yang membutuhkan perbaikan ini untuk bisa jalan:\n"
+" * Star Ocean 3\n"
+" * Radiata Stories\n"
+" * Valkyrie Profile 2"
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:42
+msgid "VU Clip Flag Hack - For Persona games (SuperVU recompiler only!)"
+msgstr "VU Clip Flag Hack - Untuk permainan Persona (recompiler SuperVU saja!)"
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:46
+msgid "FPU Compare Hack - For Digimon Rumble Arena 2."
+msgstr "FPU Compare Hack - Untuk Digimon Rumble Arena 2."
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:50
+msgid "FPU Multiply Hack - For Tales of Destiny."
+msgstr "FPU Multiply Hack - Untuk Tales of Destiny."
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:54
+msgid "FPU Negative Div Hack - For Gundam games."
+msgstr "FPU Negative Div Hack - Untuk permainan Gundam."
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:58
+msgid "VU XGkick Hack - For Erementar Gerad."
+msgstr "VU XGkick Hack - Untuk Erementar Gerad."
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:62
+msgid "FFX videos fix - Fixes bad graphics overlay in FFX videos."
+msgstr "FFX videos fix - Memperbaiki hamparan grafis pada video FFX."
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:66
+msgid "EE timing hack - Multi purpose hack. Try if all else fails."
+msgstr ""
+"EE timing hack - Perbaikan multifungsional. Coba bila semua perbaikan gagal."
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:75
+msgid ""
+"Skip MPEG hack - Skips videos/FMVs in games to avoid game hanging/freezes."
+msgstr ""
+"Skip MPEG hack - Melewati video/FMV di permainan untuk menghindari permainan "
+"nge-hang/nge-freeze."
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:79
+msgid "OPH Flag hack - Try if your game freezes showing the same frame."
+msgstr ""
+"OPH Flag hack - Dicoba apabila permainan Anda freeze namun menampilkan frame "
+"yang sama."
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:88
+msgid "Ignore DMAC writes when it is busy."
+msgstr "Lupakan pembuatan DMAC ketika sedang sibuk."
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:95
+msgid "Simulate VIF1 FIFO read ahead. Fixes slow loading games."
+msgstr ""
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:103
+msgid "Delay VIF1 Stalls (VIF1 FIFO) - For SOCOM 2 HUD."
+msgstr ""
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:107
+msgid "Ignore Bus Direction on Path3 Transfer - Used for Hotwheels"
+msgstr ""
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:118
+msgid "Enable manual game fixes [Not recommended]"
+msgstr "Aktifkan perbaikan permainan secara manual [Tidak direkomendasikan]"
+
+#: pcsx2/gui/Panels/GameFixesPanel.cpp:127
+msgid ""
+"The safest way to make sure that all game fixes are completely disabled."
+msgstr ""
+"Hal paling aman untuk memastikan semua perbaikan permainan sepenuhnya "
+"ternonaktifkan."
+
+#: pcsx2/gui/Panels/LogOptionsPanels.cpp:249
+msgid "Enable Trace Logging"
+msgstr "Aktifkan Trace Logging"
+
+#: pcsx2/gui/Panels/LogOptionsPanels.cpp:250
+msgid ""
+"Trace logs are all written to emulog.txt. Toggle trace logging at any time "
+"using F10."
+msgstr ""
+"Log Penjajakan tertulis semua pada emulog.txt. Jalankan trace logging kapan "
+"saja menggunakan F10."
+
+#: pcsx2/gui/Panels/LogOptionsPanels.cpp:251
+msgid ""
+"Warning: Enabling trace logs is typically very slow, and is a leading cause "
+"of 'What happened to my FPS?' problems. :)"
+msgstr ""
+"Peringatan: Mengaktifkan trace logs umumnya sangat lambat, dan merupakan "
+"penyebab utama masalah 'Apa yang terjadi dengan FPS saya?' :)"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:151
+msgid "Select folder with PS2 memory cards"
+msgstr "Pilih folder yang memuat memory card PS2"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:448
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:533
+msgid "Eject"
+msgstr "Eject"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:449
+msgid "Duplicate ..."
+msgstr "Gandakan ..."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:450
+msgid "Rename ..."
+msgstr "Ganti Nama ..."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:451
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:515
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:542
+msgid "Create ..."
+msgstr "Buat ..."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:463
+msgid "Card: "
+msgstr "Card:"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:516
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:549
+msgid "Create a new memory card."
+msgstr "Buat sebuah memory card baru."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:529
+msgid "Rename this memory card ..."
+msgstr "Ganti nama memory card ini ..."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:533
+msgid "Insert ..."
+msgstr "Masukkan ..."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:534
+msgid "Eject the card from this port"
+msgstr "Eject card dari port ini"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:534
+msgid "Insert this card to a port ..."
+msgstr "Masukkan card ini ke port ..."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:538
+msgid "Create a duplicate of this memory card ..."
+msgstr "Buat duplikat dari memory card ini ..."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:542
+msgid "Delete"
+msgstr "Hapus"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:545
+msgid "Permanently delete this memory card from disk (all contents are lost)"
+msgstr ""
+"Hapus memory card ini dari disk secara permanen (semua konten akan hilang)"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:547
+msgid "Create a new memory card and assign it to this Port."
+msgstr "Buat sebuah memory card baru dan hubungkan ke Port ini."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:726
+msgid "Delete memory file?"
+msgstr "Hapus file memory?"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:750
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:762
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:769
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:783
+msgid "Duplicate memory card"
+msgstr "Gandakan memory card"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:750
+msgid "Failed: Can only duplicate an existing card."
+msgstr "Gagal: Hanya dapat menduplikat sebuah card yang telah ada."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:769
+msgid ""
+"Select a name for the duplicate\n"
+"( '.ps2' will be added automatically)"
+msgstr ""
+"Pilihlah sebuah nama untuk duplikat\n"
+"( '.ps2' akan ditambahkan secara otomatis)"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:782
+#, c-format
+msgid "Failed: %s"
+msgstr "Gagal: %s"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:808
+msgid "Copy failed!"
+msgstr "Salin gagal!"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:816
+#, c-format
+msgid "Memory card '%s' duplicated to '%s'."
+msgstr "Memory card '%s' telah diduplikat menjadi '%s'."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:820
+msgid "Success"
+msgstr "Sukses"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:841
+#, c-format
+msgid ""
+"Select a new name for the memory card '%s'\n"
+"( '.ps2' will be added automatically)"
+msgstr ""
+"Pilih sebuah nama baru untuk memory card '%s'\n"
+"( '.ps2' akan ditambahkan secara otomatis)"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:844
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:856
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:872
+msgid "Rename memory card"
+msgstr "Ganti Nama memory card"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:872
+msgid "Error: Rename could not be completed.\n"
+msgstr "Eror: Penggantian nama tidak dilaksanakan.\n"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:962
+#: pcsx2/gui/Panels/MemoryCardListView.cpp:139
+#, c-format
+msgid "Port-%u / Multitap-%u--Port-1"
+msgstr "Port-%u / Multitap-%u--Port-1"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:963
+#: pcsx2/gui/Panels/MemoryCardListView.cpp:140
+#, c-format
+msgid " Multitap-%u--Port-%u"
+msgstr " Multitap-%u--Port-%u"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:988
+msgid "Empty"
+msgstr "Kosong"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:994
+#, c-format
+msgid "Select a target port for '%s'"
+msgstr "Pilihlah port tujuan untuk '%s'"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:995
+msgid "Insert card"
+msgstr "Masukkan card"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1055
+msgid "Eject card"
+msgstr "Eject card"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1055
+msgid "Insert card ..."
+msgstr "Masukkan card ..."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1056
+msgid "Duplicate card ..."
+msgstr "Gandakan card ..."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1057
+msgid "Rename card ..."
+msgstr "Ganti Nama card ..."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1058
+msgid "Delete card"
+msgstr "Hapus card"
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1061
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1065
+msgid "Create a new card ..."
+msgstr "Buat sebuah card baru ..."
+
+#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1069
+msgid "Refresh List"
+msgstr "Refresh daftar"
+
+#: pcsx2/gui/Panels/MemoryCardListView.cpp:105
+msgid "PS2 Port"
+msgstr "Port PS2"
+
+#: pcsx2/gui/Panels/MemoryCardListView.cpp:107
+msgid "Card (file) name"
+msgstr "Card nama (file)"
+
+#: pcsx2/gui/Panels/MemoryCardListView.cpp:108
+msgid "Card size"
+msgstr "Ukuran kartu"
+
+#: pcsx2/gui/Panels/MemoryCardListView.cpp:109
+msgid "Formatted"
+msgstr "Telah diformat"
+
+#: pcsx2/gui/Panels/MemoryCardListView.cpp:110
+msgid "Last Modified"
+msgstr "Terakhir Diubah"
+
+#: pcsx2/gui/Panels/MemoryCardListView.cpp:111
+msgid "Created on"
+msgstr "Dibuat pada"
+
+#: pcsx2/gui/Panels/MemoryCardListView.cpp:156
+msgid "No"
+msgstr "Tidak"
+
+#: pcsx2/gui/Panels/MemoryCardListView.cpp:156
+msgid "Yes"
+msgstr "Ya"
+
+#: pcsx2/gui/Panels/MemoryCardListView.cpp:169
+msgid "[-- Unused cards --]"
+msgstr "[-- Card yang tidak dipakai --]"
+
+#: pcsx2/gui/Panels/MemoryCardListView.cpp:171
+msgid "[-- No unused cards --]"
+msgstr "[-- Tiada card yang tidak terpakai --]"
+
+#: pcsx2/gui/Panels/MiscPanelStuff.cpp:33
+msgid "Usermode Selection"
+msgstr "Pilihan mode User"
+
+#: pcsx2/gui/Panels/MiscPanelStuff.cpp:50
+msgid "User Documents (recommended)"
+msgstr "User Documents (direkomendasikan)"
+
+#: pcsx2/gui/Panels/MiscPanelStuff.cpp:51
+msgid "Location: "
+msgstr "Lokasi:"
+
+#: pcsx2/gui/Panels/MiscPanelStuff.cpp:55
+msgid "Custom folder:"
+msgstr "Folder pilihan:"
+
+#: pcsx2/gui/Panels/MiscPanelStuff.cpp:57
+msgid ""
+"This setting may require administration privileges from your operating "
+"system, depending on how your system is configured."
+msgstr ""
+"Aturan ini mungkin memerlukan akses admin dari sistem operasi anda, "
+"tergantung dari bagaimana sistem anda terkonfigurasi."
+
+#: pcsx2/gui/Panels/MiscPanelStuff.cpp:66
+#, c-format
+msgid "Select a document root for %s"
+msgstr "Pilih sebuah root dokumen untuk %s"
+
+#: pcsx2/gui/Panels/MiscPanelStuff.cpp:124
+msgid "Apply"
+msgstr "Terapkan"
+
+#: pcsx2/gui/Panels/MiscPanelStuff.cpp:125
+msgid "Make this language my default right now!"
+msgstr "Jadikan bahasa ini sebagai bahasa saya sekarang juga!"
+
+#: pcsx2/gui/Panels/PathsPanel.cpp:38
+msgid "Savestates:"
+msgstr "Savestate:"
+
+#: pcsx2/gui/Panels/PathsPanel.cpp:39
+msgid "Select folder for Savestates"
+msgstr "Pilih folder untuk Savestate"
+
+#: pcsx2/gui/Panels/PathsPanel.cpp:48
+msgid "Snapshots:"
+msgstr "Snapshot:"
+
+#: pcsx2/gui/Panels/PathsPanel.cpp:49
+msgid "Select a folder for Snapshots"
+msgstr "Pilih sebuah folder untuk Snapshot"
+
+#: pcsx2/gui/Panels/PathsPanel.cpp:58
+msgid "Logs/Dumps:"
+msgstr "Logs/Dumps:"
+
+#: pcsx2/gui/Panels/PathsPanel.cpp:59
+msgid "Select a folder for logs/dumps"
+msgstr "Pilih sebuah fodler untuk logs/dumps"
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:230
+msgid "Applying settings..."
+msgstr "Sedang menerapkan aturan"
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:240
+msgid "Shutdown PS2 virtual machine?"
+msgstr "Matikan mesin virtual PS2?"
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:321
+msgid "I'm givin' her all she's got, Captain!"
+msgstr "Saya hanya memberikan dia apa yang dia miliki, Kapten!"
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:323
+msgid "Enumerating available plugins..."
+msgstr "Menghitung plugin yang tersedia"
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:356
+msgid "Plugins Search Path:"
+msgstr "Lokasi Pencarian Plugin"
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:357
+msgid "Select a folder with PCSX2 plugins"
+msgstr "Pilih sebuah folder dengan plugin PCSX2"
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:370
+msgid "Configure..."
+msgstr "Konfigurasi..."
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:379
+msgid "Click the Browse button to select a different folder for PCSX2 plugins."
+msgstr ""
+"Klik tombol Cari untuk memilih sebuah folder yang berbeda untuk plugin PCSX2."
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:481
+#, c-format
+msgid "Please select a valid plugin for the %s."
+msgstr "Silakan memilih sebuah plugin yang valid untuk %s."
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:519
+#, c-format
+msgid ""
+"The selected %s plugin failed to load.\n"
+"\n"
+"Reason: %s\n"
+"\n"
+msgstr ""
+"Plugin %s yang terpilih gagal jalan.\n"
+"\n"
+"Alasan: %s\n"
+"\n"
+
+#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:730
+msgid "Completing tasks..."
+msgstr "Menyelesaikan tugas..."
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:96
+msgid "Enable speedhacks"
+msgstr "Aktifkan speedhacks"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:102
+msgid ""
+"A safe and easy way to make sure that all speedhacks are completely disabled."
+msgstr "Sebuah hal untuk memastikan semua speedhacks ternonaktifkan."
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:111
+msgid ""
+"Resets all speedhack options to their defaults, which consequently turns "
+"them all OFF."
+msgstr ""
+"Mereset ulang semua opsi speedhack ke awal, yang akan menonaktifkan mereka."
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:120
+msgid "EE Cyclerate [Not Recommended]"
+msgstr "EE Cyclerate [Tidak Direkomendasikan]"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:141
+msgid "VU Cycle Stealing [Not Recommended]"
+msgstr "VU Cycle Stealing [Tidak Direkomendasikan]"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:161
+msgid "microVU Hacks"
+msgstr "microVU Hacks"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:163
+msgid "mVU Flag Hack"
+msgstr "mVU Flag Hack"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:164
+#, fuzzy
+msgid ""
+"Good Speedup and High Compatibility; may cause bad graphics... [Recommended]"
+msgstr ""
+"Peningkatan kecepatan dan Kompatibilitas Tinggi; bisa menyebabkan grafis "
+"sampah, SPS, dll... [Direkomendasikan]"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:166
+msgid "MTVU (Multi-Threaded microVU1)"
+msgstr ""
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
+#, fuzzy
+msgid ""
+"Good Speedup and High Compatibility; may cause hanging... [Recommended if 3+ "
+"cores]"
+msgstr ""
+"Peningkatan kecepatan dan Kompatibilitas Tinggi; bisa menyebabkan grafis "
+"sampah, SPS, dll... [Direkomendasikan]"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:183
+msgid "Other Hacks"
+msgstr "Hacks lainnya"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:185
+msgid "Enable INTC Spin Detection"
+msgstr "Enable INTC Spin Detection"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:186
+msgid ""
+"Huge speedup for some games, with almost no compatibility side effects. "
+"[Recommended]"
+msgstr ""
+"Peningkatan besar kecepatan untuk beberapa permainan, tanpa ada efek samping "
+"terhadap kompatibilitas. [Direkomendasikan]"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:188
+msgid "Enable Wait Loop Detection"
+msgstr "Enable Wait Loop Detection"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:189
+msgid ""
+"Moderate speedup for some games, with no known side effects. [Recommended]"
+msgstr ""
+"Penambahan sedang kecepatan untuk beberapa permainan, tanpa ada efek samping "
+"yang diketahui. [Direkomendasikan]"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
+msgid "Enable fast CDVD"
+msgstr "Enable fast CDVD"
+
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:192
+msgid "Fast disc access, less loading times. [Not Recommended]"
+msgstr ""
+"Akses disc lebih cepat, waktu loading berkurang. {Tidak Direkomendasikan]"
+
+#: pcsx2/gui/Panels/ThemeSelectorPanel.cpp:37
+msgid "Themes Search Path:"
+msgstr "Lokasi Pencarian Tema:"
+
+#: pcsx2/gui/Panels/ThemeSelectorPanel.cpp:38
+msgid "Select folder containing PCSX2 visual themes"
+msgstr "Pilih folder yang memuat tema visual PCSX2"
+
+#: pcsx2/gui/Panels/ThemeSelectorPanel.cpp:45
+msgid ""
+"Click the Browse button to select a different folder containing PCSX2 visual "
+"themes."
+msgstr ""
+"Klik tombol Cari untuk memilih folder lain yang memuat tema visual PCSX2."
+
+#: pcsx2/gui/Panels/ThemeSelectorPanel.cpp:49
+msgid "Select a visual theme:"
+msgstr "Pilih sebuah tema visual:"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:34
+msgid "Disable Framelimiting"
+msgstr "Disable Framelimiting"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:35
+msgid ""
+"Useful for running benchmarks. Toggle this option in-game by pressing F4."
+msgstr ""
+"Berguna untuk menjalankan benchmark. Aktifkan opsi ini di permainan dengan "
+"menekan F4."
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:61
+msgid "Base Framerate Adjust:"
+msgstr "Base Framerate Adjust:"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:67
+msgid "Slow Motion Adjust:"
+msgstr "Slow Motion Adjust:"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:73
+msgid "Turbo Adjust:"
+msgstr "Turbo Adjust:"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:88
+msgid "NTSC Framerate:"
+msgstr "NTSC Framerate:"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:91 pcsx2/gui/Panels/VideoPanel.cpp:97
+msgid "FPS"
+msgstr "FPS"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:94
+msgid "PAL Framerate:"
+msgstr "PAL Framerate:"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:166
+msgid ""
+"Error while parsing either NTSC or PAL framerate settings. Settings must be "
+"valid floating point numerics."
+msgstr ""
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:184
+msgid "Disabled [default]"
+msgstr "Nonaktif [umum]"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:188
+msgid "Skip when on Turbo only (TAB to enable)"
+msgstr "Frameskip bila hanya mode Turbo (TAB untuk mengaktifkan)"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:192
+msgid "Constant skipping"
+msgstr "Constant skipping"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:194
+msgid ""
+"Normal and Turbo limit rates skip frames. Slow motion mode will still "
+"disable frameskipping."
+msgstr ""
+"Normal dan Turbo membatasi skip frame. Mode Slow Motion masih menonaktifkan "
+"frameskipping."
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:217
+msgid "Frames to Draw"
+msgstr "Frames to Draw"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:222
+msgid "Frames to Skip"
+msgstr "Frames to Skip"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:298
+msgid "Use Synchronized MTGS"
+msgstr "Gunakan MTGS yang tersinkronisasi"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:299
+msgid ""
+"For troubleshooting potential bugs in the MTGS only, as it is potentially "
+"very slow."
+msgstr ""
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:302
+msgid "Disable all GS output"
+msgstr "Nonaktifkan semua output GS"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:303
+msgid ""
+"Completely disables all GS plugin activity; ideal for benchmarking EEcore "
+"components."
+msgstr ""
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:320
+msgid "Frame Skipping"
+msgstr "Frame Skipping"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:323
+msgid "Framelimiter"
+msgstr "Framelimiter"
+
+#: pcsx2/gui/SysState.cpp:283
+msgid ""
+"Cannot load this savestate. The state is from an incompatible edition of "
+"PCSX2 that is either newer than this version, or is no longer supported."
+msgstr ""
+"Gagal me-load savestate ini. Savestate tersebut berasal dari versi PCSX2 "
+"yang tidak cocok dimana versi tersebut mungkin lebih baru, ataupun tidak "
+"didukung lagi."
+
+#: pcsx2/gui/SysState.cpp:290
+msgid ""
+"Cannot load this savestate. The state is an unsupported version, likely "
+"created by a newer edition of PCSX2."
+msgstr ""
+"Gagal me-load savestate ini. Savestate ini adalah versi yang tidak didukung, "
+"kemungkinan besar dibuat oleh PCSX2 yang lebih baru."
+
+#: pcsx2/gui/SysState.cpp:326
+msgid "There is no active virtual machine state to download or save."
+msgstr "Tidak ada mesin virtual yang sedang aktif untuk unduh maupun simpan."
+
+#: pcsx2/gui/SysState.cpp:520
+msgid ""
+"This savestate cannot be loaded because it is not a valid gzip archive. It "
+"may have been created by an older unsupported version of PCSX2, or it may be "
+"corrupted."
+msgstr ""
+"Savestate ini tidak dapat di-load karena bukan merupakan gzip yang valid. "
+"File tersebut mungkin telah dibuat oleh versi PCSX2 yang tua, ataupun korup."
+
+#: pcsx2/gui/SysState.cpp:579
+msgid "This file is not a valid PCSX2 savestate. See the logfile for details."
+msgstr ""
+"File ini bukanlah savestate PCSX2 yang valid. Lihat file log untuk lebih "
+"lanjut."
+
+#: pcsx2/gui/SysState.cpp:598
+msgid ""
+"This savestate cannot be loaded due to missing critical components. See the "
+"log file for details."
+msgstr ""
+"Savestate ini tidak dapat di-load berhubung hilangnya komponen penting. "
+"Lihat file log untuk lebih lanjut."
+
+#: pcsx2/gui/i18n.cpp:63
+msgid " (default)"
+msgstr ""
+
+#: pcsx2/ps2/BiosTools.cpp:83 pcsx2/ps2/BiosTools.cpp:151
+msgid "The selected BIOS file is not a valid PS2 BIOS. Please re-configure."
+msgstr ""
+"File BIOS yang dipilih bukanlah BIOS PS2 yang valid. Silakan ulang "
+"konfigurasi."
+
+#: pcsx2/ps2/BiosTools.cpp:244
+msgid ""
+"The PS2 BIOS could not be loaded. The BIOS has not been configured, or the "
+"configuration has been corrupted. Please re-configure."
+msgstr ""
+"BIOS PS2 gagal dijalankan. BIOS belum dikonfigurasi, atau hasil konfigurasi "
+"korup. Silakan ulang konfigurasi."
+
+#: pcsx2/ps2/BiosTools.cpp:251
+msgid "The configured BIOS file does not exist. Please re-configure."
+msgstr "File BIOS yang dikonfigurasi tidak wujud. Silakan ulang konfigurasi."
+
+#: pcsx2/x86/ix86-32/iR5900-32.cpp:578
+#, c-format
+msgid ""
+"%s Extensions not found. The R5900-32 recompiler requires a host CPU with "
+"MMX, SSE, and SSE2 extensions."
+msgstr ""
+"Ekstensi %s tidak ditemukan. Recompiler R5900-32 membutuhkan sebuah komputer "
+"hosti dengan ekstensi MMX, SSE, dan SSE2."
+
+#: pcsx2/x86/microVU.cpp:28
+#, c-format
+msgid ""
+"%s Extensions not found. microVU requires a host CPU with MMX, SSE, and "
+"SSE2 extensions."
+msgstr ""
+"Ekstensi %s tidak ditemukan. microVU membutuhkan sebuah komputer hosti "
+"dengan ekstensi MMX, SSE, dan SSE2."
+
+#~ msgid "mVU Block Hack"
+#~ msgstr "mVU Block Hack"
+
+#~ msgid ""
+#~ "Good Speedup and High Compatibility; may cause garbage graphics, SPS, "
+#~ "etc..."
+#~ msgstr ""
+#~ "Peningkatan kecepatan dan Kompatibilitas Tinggi; bisa menyebabkan grafis "
+#~ "sampah, SPS, dll... [Direkomendasikan]"
diff --git a/locales/it_IT/pcsx2_Iconized.po b/locales/it_IT/pcsx2_Iconized.po
index 33eccdca6..82343a8a7 100644
--- a/locales/it_IT/pcsx2_Iconized.po
+++ b/locales/it_IT/pcsx2_Iconized.po
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.9\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-11-16 20:16+0100\n"
+"POT-Creation-Date: 2012-04-07 11:42+0200\n"
"PO-Revision-Date: 2011-10-05 21:01+0100\n"
"Last-Translator: Leucos\n"
"Language-Team: \n"
@@ -26,7 +26,7 @@ msgstr ""
"Non c'è abbastanza memoria virtuale disponibile o gli spazi della memoria "
"virtuale necessari sono già stati riservati ad altri processi, servizi o DLL."
-#: pcsx2/CDVD/CDVD.cpp:385
+#: pcsx2/CDVD/CDVD.cpp:389
msgid "!Notice:PsxDisc"
msgstr ""
"I dischi di gioco per PlayStation non sono supportati in PCSX2. Se desideri "
@@ -508,7 +508,7 @@ msgstr ""
"Valori più alti aumentano il numero di cicli 'rubati' dall'EE per ogni "
"microprogramma VU eseguito dal gioco."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:172
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "!ContextTip:Speedhacks:vuFlagHack"
msgstr ""
"Aggiorna le Flag di stato solo nei blocchi che le leggeranno, invece che "
@@ -516,15 +516,7 @@ msgstr ""
"per la maggior parte dei casi e superVU fa qualcosa del genere in maniera "
"predefinita."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:177
-msgid "!ContextTip:Speedhacks:vuBlockHack"
-msgstr ""
-"Prevede che nel futuro prossimo i blocchi non avranno bisogno della vecchia "
-"Flag 'instance data'. \n"
-"Questo dovrebbe essere abbastanza sicuro. Non si sa se crea problemi in "
-"qualche gioco..."
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:182
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:174
msgid "!ContextTip:Speedhacks:vuThread"
msgstr ""
"Esegue la VU1 in un thread separato (solo la microVU1). Generalmente si "
@@ -534,7 +526,7 @@ msgstr ""
"Si possono invece verificare dei rallentamenti (specialmente con CPU dual-"
"core) nel caso di giochi limitati dal thread GS ."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:203
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:195
msgid "!ContextTip:Speedhacks:INTC"
msgstr ""
"Questo hack funziona al meglio nei giochi che utilizzano il registro di "
@@ -542,7 +534,7 @@ msgstr ""
"3D. I giochi che non utilizzano questo metodo di sincronia verticale "
"otterranno un aumento di velocità minimo se non nullo."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:208
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
msgid "!ContextTip:Speedhacks:BIFC0"
msgstr ""
"L'obiettivo principale è l'idle loop (ciclo per inattività) dell'EE "
@@ -553,7 +545,7 @@ msgstr ""
"successivo o alla fine del tempo riservato al processore, qualunque venga "
"prima."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:215
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:207
msgid "!ContextTip:Speedhacks:fastCDVD"
msgstr ""
"Controlla la lista compatibilità di HDLoader per sapere quali giochi creano "
@@ -566,20 +558,20 @@ msgstr ""
"Nota che quando il Limitatore Fotogrammi è disattivato anche le modalità "
"Turbo e Rallentatore non saranno più disponibili."
-#: pcsx2/gui/Panels/VideoPanel.cpp:223
+#: pcsx2/gui/Panels/VideoPanel.cpp:227
msgid "!Panel:Frameskip:Heading"
msgstr ""
"Avviso: a causa del design hardware della PS2, un salto dei fotogrammi "
"preciso non è possibile. La sua attivazione può causare gravi errori grafici "
"in alcuni giochi."
-#: pcsx2/gui/Panels/VideoPanel.cpp:302
+#: pcsx2/gui/Panels/VideoPanel.cpp:306
msgid "!ContextTip:GS:SyncMTGS"
msgstr ""
"Attiva questa opzione se pensi che la perdita di sincrona del thread MTGS "
"sia la causa di crash o problemi grafici."
-#: pcsx2/gui/Panels/VideoPanel.cpp:306
+#: pcsx2/gui/Panels/VideoPanel.cpp:310
msgid "!ContextTip:GS:DisableOutput"
msgstr ""
"Nei benchmark, permette di rimuovere ogni interferenza causata dal thread "
@@ -605,3 +597,10 @@ msgstr ""
"riservare il range di memoria specifico richiesto, non sarà quindi "
"disponibile all'utilizzo. Questo non è un errore critico, dato che il "
"ricompilatore sVU è obsoleto e in ogni caso dovresti utilizzare microVU. :)"
+
+#~ msgid "!ContextTip:Speedhacks:vuBlockHack"
+#~ msgstr ""
+#~ "Prevede che nel futuro prossimo i blocchi non avranno bisogno della "
+#~ "vecchia Flag 'instance data'. \n"
+#~ "Questo dovrebbe essere abbastanza sicuro. Non si sa se crea problemi in "
+#~ "qualche gioco..."
diff --git a/locales/it_IT/pcsx2_Main.po b/locales/it_IT/pcsx2_Main.po
index d54c931eb..d6e664ec7 100644
--- a/locales/it_IT/pcsx2_Main.po
+++ b/locales/it_IT/pcsx2_Main.po
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.9\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-11-16 20:15+0100\n"
+"POT-Creation-Date: 2012-02-28 12:20+0100\n"
"PO-Revision-Date: 2011-10-05 21:01+0100\n"
"Last-Translator: Leucos\n"
"Language-Team: \n"
@@ -200,7 +200,7 @@ msgstr "Non è stato possibile inizializzare il plugin interno Memory Card."
msgid "Unloaded Plugin"
msgstr "Plugin Scaricato"
-#: pcsx2/SaveState.cpp:339
+#: pcsx2/SaveState.cpp:342
msgid "Cannot load savestate. It is of an unknown or unsupported version."
msgstr ""
"Impossibile caricare il salvataggio di stato. Appartiene ad una versione "
@@ -378,31 +378,31 @@ msgstr ""
"temporaneo è stato creato con successo ma non è stato possibile spostarlo "
"nel suo ultimo luogo di riposo."
-#: pcsx2/gui/AppConfig.cpp:837
+#: pcsx2/gui/AppConfig.cpp:842
msgid "Safest"
msgstr "Sicura +"
-#: pcsx2/gui/AppConfig.cpp:838
+#: pcsx2/gui/AppConfig.cpp:843
msgid "Safe (faster)"
msgstr "Sicura (più veloce)"
-#: pcsx2/gui/AppConfig.cpp:839
+#: pcsx2/gui/AppConfig.cpp:844
msgid "Balanced"
msgstr "Bilanciata"
-#: pcsx2/gui/AppConfig.cpp:840
+#: pcsx2/gui/AppConfig.cpp:845
msgid "Aggressive"
msgstr "Aggressiva"
-#: pcsx2/gui/AppConfig.cpp:841
+#: pcsx2/gui/AppConfig.cpp:846
msgid "Aggressive plus"
msgstr "Aggressiva +"
-#: pcsx2/gui/AppConfig.cpp:842
+#: pcsx2/gui/AppConfig.cpp:847
msgid "Mostly Harmful"
msgstr "Quasi dannosa"
-#: pcsx2/gui/AppConfig.cpp:999 pcsx2/gui/AppConfig.cpp:1005
+#: pcsx2/gui/AppConfig.cpp:1007 pcsx2/gui/AppConfig.cpp:1013
msgid "Failed to overwrite existing settings file; permission was denied."
msgstr ""
"Sovrascrittura del file impostazioni esistente fallita: permesso negato."
@@ -2467,21 +2467,10 @@ msgstr ""
"grafica... [consigliato]"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:166
-msgid "mVU Block Hack"
-msgstr "microVU Block Hack"
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
-msgid ""
-"Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
-msgstr ""
-"Buon aumento di velocità ed alta compatibilità. Può causare problemi nella "
-"grafica, SPS, ecc..."
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "MTVU (Multi-Threaded microVU1)"
msgstr "MTVU (microVU1 multi-threaded)"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:170
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
msgid ""
"Good Speedup and High Compatibility; may cause hanging... [Recommended if 3+ "
"cores]"
@@ -2489,15 +2478,15 @@ msgstr ""
"Buon aumento di velocità ed alta compatibilità. Può causare blocchi nei "
"giochi... [consigliato, solo se possiedi 3 o più core]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:183
msgid "Other Hacks"
msgstr "Altri Hack"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:193
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:185
msgid "Enable INTC Spin Detection"
msgstr "Attiva rilevamento Spin INTC (INTC Spin Detection)"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:194
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:186
msgid ""
"Huge speedup for some games, with almost no compatibility side effects. "
"[Recommended]"
@@ -2505,22 +2494,22 @@ msgstr ""
"Grande aumento di velocità per alcuni giochi, con quasi nessun effetto "
"negativo sulla compatibilità. [consigliato]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:196
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:188
msgid "Enable Wait Loop Detection"
msgstr "Attiva rilevamento ciclo d'inattività (Wait Loop Detection)"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:197
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:189
msgid ""
"Moderate speedup for some games, with no known side effects. [Recommended]"
msgstr ""
"Aumento di velocità moderato per alcuni giochi, nessun effetto collaterale "
"noto. [consigliato]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:199
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
msgid "Enable fast CDVD"
msgstr "Attiva CDVD veloce (fast CDVD)"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:192
msgid "Fast disc access, less loading times. [Not Recommended]"
msgstr ""
"Accesso rapido al disco, tempi di caricamento inferiori. [non consigliato]"
@@ -2580,7 +2569,7 @@ msgstr "FPS"
msgid "PAL Framerate:"
msgstr "Frequenza fotogrammi PAL:"
-#: pcsx2/gui/Panels/VideoPanel.cpp:162
+#: pcsx2/gui/Panels/VideoPanel.cpp:166
msgid ""
"Error while parsing either NTSC or PAL framerate settings. Settings must be "
"valid floating point numerics."
@@ -2588,19 +2577,19 @@ msgstr ""
"Errore nell'interpretazione dell'impostazione della frequenza dei fotogrammi "
"PAL o NTSC. L'impostazione deve avere un valore numerico con virgola valido."
-#: pcsx2/gui/Panels/VideoPanel.cpp:180
+#: pcsx2/gui/Panels/VideoPanel.cpp:184
msgid "Disabled [default]"
msgstr "Disattivato [predefinito]"
-#: pcsx2/gui/Panels/VideoPanel.cpp:184
+#: pcsx2/gui/Panels/VideoPanel.cpp:188
msgid "Skip when on Turbo only (TAB to enable)"
msgstr "Salta solo in modalità Turbo (TAB per attivare)"
-#: pcsx2/gui/Panels/VideoPanel.cpp:188
+#: pcsx2/gui/Panels/VideoPanel.cpp:192
msgid "Constant skipping"
msgstr "Salto costante"
-#: pcsx2/gui/Panels/VideoPanel.cpp:190
+#: pcsx2/gui/Panels/VideoPanel.cpp:194
msgid ""
"Normal and Turbo limit rates skip frames. Slow motion mode will still "
"disable frameskipping."
@@ -2608,19 +2597,19 @@ msgstr ""
"In modalità Normale e Turbo i fotogrammi saranno saltati. Nella modalità\n"
"Rallentatore il salto dei fotogrammi sarà comunque disattivato."
-#: pcsx2/gui/Panels/VideoPanel.cpp:213
+#: pcsx2/gui/Panels/VideoPanel.cpp:217
msgid "Frames to Draw"
msgstr "Fotogrammi da disegnare"
-#: pcsx2/gui/Panels/VideoPanel.cpp:218
+#: pcsx2/gui/Panels/VideoPanel.cpp:222
msgid "Frames to Skip"
msgstr "Fotogrammi da saltare"
-#: pcsx2/gui/Panels/VideoPanel.cpp:294
+#: pcsx2/gui/Panels/VideoPanel.cpp:298
msgid "Use Synchronized MTGS"
msgstr "Utilizza MTGS (Multi Threaded GS) sincronizzato"
-#: pcsx2/gui/Panels/VideoPanel.cpp:295
+#: pcsx2/gui/Panels/VideoPanel.cpp:299
msgid ""
"For troubleshooting potential bugs in the MTGS only, as it is potentially "
"very slow."
@@ -2628,11 +2617,11 @@ msgstr ""
"Solo per rilevare eventuali bug nel MTGS, dato che potenzialmente è molto "
"lento."
-#: pcsx2/gui/Panels/VideoPanel.cpp:298
+#: pcsx2/gui/Panels/VideoPanel.cpp:302
msgid "Disable all GS output"
msgstr "Disabilita tutto l'output GS"
-#: pcsx2/gui/Panels/VideoPanel.cpp:299
+#: pcsx2/gui/Panels/VideoPanel.cpp:303
msgid ""
"Completely disables all GS plugin activity; ideal for benchmarking EEcore "
"components."
@@ -2640,11 +2629,11 @@ msgstr ""
"Disattiva completamente l'attività del plugin GS; ideale per fare un "
"benchmark dei componenti EEcore."
-#: pcsx2/gui/Panels/VideoPanel.cpp:316
+#: pcsx2/gui/Panels/VideoPanel.cpp:320
msgid "Frame Skipping"
msgstr "Salto Fotogrammi"
-#: pcsx2/gui/Panels/VideoPanel.cpp:319
+#: pcsx2/gui/Panels/VideoPanel.cpp:323
msgid "Framelimiter"
msgstr "Limitatore Fotogrammi"
@@ -2734,3 +2723,12 @@ msgid ""
msgstr ""
"Estensioni %s non trovate. microVU richiede una CPU del sistema host con "
"estensioni MMX, SSE ed SSE2."
+
+#~ msgid "mVU Block Hack"
+#~ msgstr "microVU Block Hack"
+
+#~ msgid ""
+#~ "Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
+#~ msgstr ""
+#~ "Buon aumento di velocità ed alta compatibilità. Può causare problemi "
+#~ "nella grafica, SPS, ecc..."
diff --git a/locales/ja_JP/pcsx2_Iconized.po b/locales/ja_JP/pcsx2_Iconized.po
index fdfbb3759..c37488047 100644
--- a/locales/ja_JP/pcsx2_Iconized.po
+++ b/locales/ja_JP/pcsx2_Iconized.po
@@ -1,21 +1,21 @@
# SOME DESCRIPTIVE TITLE.
-# Copyright (C) 2011 PCSX2_Dev_Team
-# This file is distributed under the same license as the PCSX2 package.
+# Copyright (C) YEAR PCSX2 Dev Team
+# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR , YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.9\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-09-28 20:27+0200\n"
-"PO-Revision-Date: 2011-04-30 10:48+0900\n"
-"Last-Translator: oreore\n"
-"Language-Team: \n"
+"POT-Creation-Date: 2012-04-07 11:42+0200\n"
+"PO-Revision-Date: 2012-03-05 08:12+0900\n"
+"Last-Translator: DeltaHF\n"
+"Language-Team: DeltaHF\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-KeywordsList: pxE\n"
+"X-Poedit-KeywordsList: pxE;pxEt\n"
"X-Poedit-SourceCharset: utf-8\n"
"X-Poedit-Basepath: trunk\\\n"
"X-Poedit-Language: Japanese\n"
@@ -26,621 +26,521 @@ msgstr ""
#: common/src/Utilities/Exceptions.cpp:254
msgid "!Notice:VirtualMemoryMap"
msgstr ""
-"十分な仮想メモリがありません。もしくは他のプロセスやDLLによって予約済みです。"
+"仮想メモリが不足しているか、必要な仮想メモリは既に他のプロセス、サービス、DLL"
+"に割り当てられています。"
-#: pcsx2/CDVD/CDVD.cpp:385
+#: pcsx2/CDVD/CDVD.cpp:389
msgid "!Notice:PsxDisc"
msgstr ""
-"PCSX2 は Playstation のゲームをサポートしていません。プレイしたい場合は "
-"ePSXe や PCSX などのPS1エミュレータを入手して下さい。"
+"プレイステーション1のディスクはPCSX2でサポートされていません。 \n"
+"ePSXeやPCSX等のPS1専用のエミュレータをお使い下さい。"
#: pcsx2/System.cpp:114
msgid "!Notice:Recompiler:VirtualMemoryAlloc"
msgstr ""
-"リコンパイラは連続したメモリの予約に失敗しました。このエラーは仮想メモリの不"
-"足か無効になっている、\n"
-"別プログラムが専有中などの原因で発生します。\n"
-"Hostの設定で全てのPCSX2リコンパイラのキャッシュサイズを減らすことができます。"
+"このリコンパイラは内部キャッシュ用の連続メモリを確保する事ができませんでし"
+"た。このエラーは仮想メモリの\n"
+"リソースが不足していると発生します。スワップファイルが小さすぎるか、無効にさ"
+"れている場合や他のプログラムが\n"
+"メモリの多くを消費している時に発生します。ホスト設定でPCSX2のリコンパイラのデ"
+"フォルトキャッシュサイズを\n"
+"で小さく設定する事で問題を解決できる事があります。"
#: pcsx2/System.cpp:348
msgid "!Notice:EmuCore::MemoryForVM"
msgstr ""
-"PCSX2はPS2仮想マシンに必要なメモリを割り当てることが出来ませんでした。\n"
-"メモリを占有している他のタスクを終了してもう一度やり直してください。"
+"PCSX2はPS2バーチャルマシンに必要なメモリーを割り当てる事ができませんでし"
+"た。 \n"
+"バックグラウンドタスクを終了させ、メモリーを解放してから再試行して下さい。"
#: pcsx2/gui/AppInit.cpp:43
msgid "!Notice:Startup:NoSSE2"
msgstr ""
-"警告:お使いのコンピュータは多くのPCSX2リコンパイラやプラグインが必要とする"
-"SSE2をサポートしていません。\n"
-"設定は制限され、エミュレーションの速度が*非常に*遅くなります。"
+"警告: お使いのCPUはPCSX2のリコンパイラやプラグインが必要とするSSE2を"
+"サポートしていません。 \n"
+"選択できるオプションが限られ、エミュレーション速度は*非常に*遅くなります。"
#: pcsx2/gui/AppInit.cpp:162
msgid "!Notice:RecompilerInit:Header"
-msgstr "警告: あるPS2リコンパイラが初期化が失敗で、無効にされました:"
+msgstr ""
+"警告: 設定されたいくつかのPS2リコンパイラが初期化に失敗し、無効にされまし"
+"た。"
#: pcsx2/gui/AppInit.cpp:211
msgid "!Notice:RecompilerInit:Footer"
msgstr ""
-"インフォ: PCSX2が動作するにはリコンパイラが必要ではありません、しかしなが"
-"ら、\n"
-"リコンパイラはかなりエミュレーション速度を上げます。\n"
-"エラーを解決したら、上に記載されたリコンパイラ手動で再有効にしなければならな"
-"いかもしれません。"
+"メモ:PCSX2の実行にリコンパイラは必要ではありませんが、エミュレーション速度を"
+"大幅に改善します。\n"
+"エラーを解決した後に、上記リストのリコンパイラを手動で有効化しなおす必要があ"
+"るかもしれません。"
#: pcsx2/gui/AppMain.cpp:546
msgid "!Notice:BiosDumpRequired"
msgstr ""
-"PCSX2が動作するにはPS2 BIOSが必要です。 著作権法律上の理由によってあなた\n"
-"自身が所有している実際のPS2ユニットからBIOSをダンプしなければなりません。\n"
-"(借物ではいけません)。 ダンプするのやり方ならFAQとガイドを参照してくださ"
-"い。"
+"PCSX2を実行するにはPS2のBIOSが必要です。あなた自身が所有する(借物はダメです)"
+"PS2の実機から \n"
+"「合法的に」手に入れて下さい。詳しい吸出し方法はFAQやガイドを参照して下さい。"
#: pcsx2/gui/AppMain.cpp:629
msgid "!Notice Error:Thread Deadlock Actions"
msgstr ""
-"「無視」スレッドが反応するまで待機する。\n"
-"「キャンセル」 スレッドを取り消すのを試行する。\n"
-"「終止」 すぐにPCSX2を終了します'。"
+"[無視] スレッドの応答を待ちます。\n"
+"[キャンセル] スレッドのキャンセルを試行します。\n"
+"[終了] PCSX2をただちに終了させます。"
#: pcsx2/gui/AppUserMode.cpp:57
msgid "!Notice:PortableModeRights"
msgstr ""
-"これらのフォルダーがもはや作成されていて、ユーザアカウントはフォルダーに書き"
-"込み権限があることをチェックしてください。\n"
-"あるいは、管理者権限でPCSX2を再運行してみてください。こうすればPCSX2自体に必"
-"要なフォルダーを作成する権限を与えられます。\n"
-"もしこのコンピュータで管理者権限を持っていないというなら、ユーザ・ドキュメン"
-"ト・モードに切り替わってください。\n"
-"(以下のボタンをクリックするとモードが切り替われる)"
+"これらのフォルダが作成され、使用中のユーザアカウントに書き込み権限がある事を"
+"確認して下さい。 \n"
+"また、PCSX2を上位権限(管理者)で再度起動すると、PCSX2が必要なフォルダを自動的"
+"に作成されます。\n"
+"このマシンでの上位権限が無い場合、ユーザドキュメントモードに切り替える必要が"
+"あります\n"
+"(下のボタンをクリック)"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:181
msgid "!ContextTip:ChangingNTFS"
msgstr ""
-"NTFS 圧縮の設定は、Windowsのエクスプローラーでファイルのプロパティを開くこと"
-"でいつでも変更できます。"
+"NTFS圧縮はウィンドウズエクスプローラのファイルプロパティから手動でいつでも設"
+"定変更できます。"
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:49
msgid "!ContextTip:Folders:Settings"
msgstr ""
-"このフォルダはプラグインを含む PCSX2 のほとんどの設定ファイルを保存するフォル"
-"ダです。\n"
-"(一部の古いプラグインはこの設定を利用しない可能性があります)"
+"このフォルダにはPCSX2とプラグインが生成した設定が保存されています\n"
+"(古いプラグインはこの値を使用しない事があります)"
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:54
msgid "!Panel:Folders:Settings"
msgstr ""
-"ここでPCSX2の設定ファイルの場所を指定することができます。\n"
-"既存の設定がすでにあった場合、インポートするか上書きするか選択することができ"
-"ます。"
+"PCSX2の設定を保存するディレクトリを任意に指定する事ができます。指定先のディレ"
+"クトリに\n"
+"PCSX2設定が既にある場合はインポート又は上書きをするオプションが表示されます。"
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:94
msgid "!Wizard:Welcome"
msgstr ""
-"このウィザードではプラグイン、メモリーカード、BIOSの設定の手助けします。 ま"
-"た、初めて PCSX2 をインストールされる場合は以下の Readme や構成ガイドを一読す"
-"ることをおすすめします。"
+"このウィザードではプラグイン、メモリーカード、BIOSの初期設定を行います。\n"
+"%sを初めてインストールした方はReadmeと設定ガイドを始めにお読み下さい。"
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:140
msgid "!Wizard:Bios:Tutorial"
msgstr ""
-"PCSX2 でゲームをプレイするためには *合法な* PS2 の BIOS のコピーが必要です。"
-"友人やインターネットを通じてコピーして使用しないでください。あなたは*自分の* "
-"Playstation 2 コンソールから BIOS をダンプしなければなりません。"
+"PCSX2を実行するには「合法的」に入手したPS2 BIOSが必要です。 \n"
+"友人やインターネットから入手したものは使用してはいけません。 \n"
+"「あなた自身が所有する」プレイステーション2本体からBIOSをダンプして下さい。"
#: pcsx2/gui/Dialogs/ImportSettingsDialog.cpp:31
msgid "!Notice:ImportExistingSettings"
msgstr ""
-"指定したフォルダに既に %s の設定ファイルがあります。\n"
-"これらの設定をインポートするか、%s の初期値で上書きしてください。\n"
-"\n"
-"(別のフォルダを選択したい場合にはキャンセルを押します)"
+"設定フォルダに既存の%s設定が見つかりました。\n"
+"この設定をインポート、又は%sのデフォルト値で上書きしますか?\n"
+"(若しくはキャンセルを押して、別の設定フォルダを選択して下さい)"
#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:30
msgid "!Panel:Mcd:NtfsCompress"
msgstr ""
-"NTFS 圧縮はビルドインで高速かつ完璧な信頼性があり、多くの場合で高い圧縮率を誇"
-"ります (このオプションを強く推奨します)。"
+"NTFS圧縮は内蔵された機能で完全な信頼が置ける高速な圧縮方法です。\n"
+"メモリーカードの圧縮に優れています。(このオプションは強くお勧めします)"
#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:41
msgid "!Panel:Mcd:EnableEjection"
msgstr ""
-"メモリーカードの破損を防ぐために、ステートセーブを読み込んだ後に強制的にメモ"
-"リーカードの着脱を行います。ただしいくつかのゲームで互換性が失われます(ギター"
-"ヒーローなど)。"
+"セーブステートをロードした際にメモリーカードデータの再インデックスをゲームに"
+"強制する事によって、\n"
+"メモリーカードデータの破壊を回避します。全てのゲームに互換性があるわけではあ"
+"りません(ギターヒーロー)。"
#: pcsx2/gui/Dialogs/StuckThreadDialog.cpp:33
msgid "!Panel:StuckThread:Heading"
msgstr ""
-"スレッド「%s」は応じていません。デッドロックしているかもしれないか、ただもの"
-"凄く遅くて執行しているかもしれません。"
+"%sスレッドの応答がありません。デッドロック状態か \n"
+"「非常に低速」で動作している可能性があります。"
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:38
msgid "!Panel:HasHacksOverrides"
msgstr ""
-"警告!コマンドラインオプションを使用して PCSX2 の設定上書きして実行していま"
-"す。コマンドラインオプションは設定ダイアログには反映されず、設定を変更しても"
-"無効になります。"
+"警告:通常の設定を無効化するコマンドラインでPCSX2を実行しています。コマンドラ"
+"インで変更されたオプションは設定ダイアログに反映されず、ここで設定を変更して"
+"も無効化されます。"
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:58
msgid "!Panel:HasPluginsOverrides"
msgstr ""
-"警告!コマンドラインオプションを使用して PCSX2 のプラグイン設定上書きして実行"
-"しています。コマンドラインオプションは設定ダイアログには反映されず、設定を変"
-"更しても無効になります。"
+"警告:通常のプラグイン・フォルダー設定を無効化するコマンドラインでPCSX2を実行"
+"しています。コマンドラインで変更されたオプションは設定ダイアログに反映され"
+"ず、ここで設定を変更しても無効化されます。"
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:135
msgid "!Notice:Tooltip:Presets:Slider"
msgstr ""
-"プリセットを有効にするといくつかのSpeedhack、コンパイラオプション、既知の "
-"Gamefix を適用して速度を向上させます。\n"
-"既知の重要な Gamefix は自動で有効になります。\n"
+"プリセットは各種スピードハック、リコンパイラ設定及び速度を向上させるゲーム修"
+"正を適用させます。\n"
+"既知のゲーム修正は自動的に適用されます。\n"
"\n"
-"プリセットの内容\n"
-"1 - 最も精密にエミュレーションを行います。\n"
-"3 --> 互換性とスピードのバランスを取ってエミュレーションを行います。\n"
-"4 - より積極的に hack を行います。\n"
-"6 - hack のしすぎで多くの場合は速度の低下が起きてしまいます。"
+"プリセットについて:\n"
+"1 - 最も高精度なエミュレーションですが、最も低速です。\n"
+"3 --> 速度と互換性のバランス型。\n"
+"4 - 能動的なハックを付け足します。\n"
+"6 - ハック数が多すぎてほとんどのゲームでは遅くなります。"
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:149
msgid "!Notice:Tooltip:Presets:Checkbox"
msgstr ""
-"プリセットを有効にするといくつかのSpeedhack、コンパイラオプション、既知の "
-"Gamefix を適用して速度を向上させます。\n"
-"既知の重要な Gamefix は自動で有効になります。\n"
+"プリセットは各種スピードハック、リコンパイラ設定及び速度を向上させるゲーム修"
+"正を適用させます。\n"
+"既知のゲーム修正は自動的に適用されます。\n"
"\n"
-"-->チェックを外すと、手動で(現在のプリセットを元にして)設定することができま"
-"す。"
+"チェックをはずすと現在のプリセットを基に手動で設定を変更できます。"
#: pcsx2/gui/IsoDropTarget.cpp:28
msgid "!Notice:ConfirmSysReset"
msgstr ""
-"この操作はPS2仮想マシンをリセットするため、現在作業中のデータは失われます。よ"
-"ろしいですか?"
+"この操作は既存するPS2の仮想マシンステートをリセットします。\n"
+"進行中の全ての作業が失われます。本当にリセットしてもよろしいですか?"
#: pcsx2/gui/MainMenuClicks.cpp:106
msgid "!Notice:DeleteSettings"
msgstr ""
-"このコマンドは %s の設定を全て消去してスタートアップウィザードからやり直しま"
-"す。この操作のあと手動で %s を再起動する必要があります。\n"
+"この操作は%sの設定を全て削除してリセットします。\n"
+"次回起動時に初期設定ウィザードを再実行させる事ができます。\n"
+" この操作を実行した後に手動で%sを再起動する必要があります。\n"
"\n"
-"警告!! OK を押すと %s の設定は*全て*消えてしまい、強制的にアプリケーションが"
-"終了し、エミュレーション中のデータも失われます。本当にいいですか?\n"
+"警告: OKをクリックすると%s設定を「全て削除」します。\n"
+"プログラムは強制終了し、進行中のエミュレーション作業は失われます。\n"
+"本当によろしいですか?\n"
"\n"
-"(注:プラグインの設定は残ります)"
+"(注意: プラグインの設定に影響はありません)"
#: pcsx2/gui/MemoryCardFile.cpp:78
msgid "!Notice:Mcd:HasBeenDisabled"
msgstr ""
-"PS2-スロット%dは自動的に無効にされました。問題を修正したら、 いつでも、\n"
-"コンフィグを利用して再可能にすることができます。\n"
-"(メインメニューからコンフィグ⇒メモリカード)"
+"PS2スロット[%d]は自動的に無効にされました。この問題を解決するには\n"
+"メインメニューから [設定→メモリーカード] で再度有効化して下さい。"
#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:138
msgid "!Notice:BIOS:InvalidSelection"
msgstr ""
-"有効な BIOS を指定してください。もし有効なものを用意できないのであればキャン"
-"セルを押してウィザードを閉じてください。"
+"有効なBIOSイメージファイルを選択して下さい。\n"
+"選択できない場合はキャンセルを押して設定パネルを閉じてください。"
#: pcsx2/gui/Panels/CpuPanel.cpp:111
msgid "!Panel:EE/IOP:Heading"
-msgstr "注意: ほとんどのゲームはデフォルト設定のままで構いません。"
+msgstr "メモ: ほとんどのゲームはデフォルトオプションのままで動作します。"
#: pcsx2/gui/Panels/CpuPanel.cpp:178
msgid "!Panel:VUs:Heading"
-msgstr "注意: ほとんどのゲームはデフォルト設定のままで構いません。"
+msgstr "メモ: ほとんどのゲームはデフォルトオプションのままで動作します。"
#: pcsx2/gui/Panels/DirPickerPanel.cpp:69
msgid "!Notice:DirPicker:CreatePath"
-msgstr ""
-"指定されたパスやフォルダーは存在していません。 それを作成してよろしいでしょう"
-"か?"
+msgstr "指定されたディレクトリは存在しません。作成しますか?"
#: pcsx2/gui/Panels/DirPickerPanel.cpp:158
msgid "!ContextTip:DirPicker:UseDefault"
msgstr ""
-"チェックをすると、このフォルダをPCSX2の現在のユーザーモードのデフォルト設定が"
-"自動的に反映されます。"
+"チェックを入れるとこのフォルダは現在のPCSX2のユーザモード設定に関するデフォル"
+"トを自動的に反映されます。"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:55
-#, fuzzy
msgid "!ContextTip:Window:Zoom"
msgstr ""
-"VSYNC を同期させるとティアリング現象を解消できますが、パフォーマンスに重大な"
-"問題が発生します。\n"
-"通常はフルスクリーンモードでのみ使用します。また一部の GS プラグインでは機能"
-"しない可能性があります。"
+"ズーム=100 : 映像を出力をクロッピング(トリミング)せず画面に合わせて伸縮しま"
+"す。\n"
+"基本値100以上はズームイン、以下はズームアウト。値0 : 自動ズームインで黒い枠"
+"を消します(アスペクト比を保ちますが、多少外にでる事があります)。\n"
+"メモ:一部のゲームでは黒枠を描画する事があり、「値を0」に設定しても消えませ"
+"ん。\n"
+"\n"
+"ショートカットキー: [CTRL] + [+]でズームイン、[CTRL] + [-]でズームアウト、"
+"[CTRL] + [*]でズーム値100/0切り替え(+-*はテンキーを使用)"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:63
msgid "!ContextTip:Window:Vsync"
msgstr ""
-"VSYNC を同期させるとティアリング現象を解消できますが、パフォーマンスに重大な"
-"問題が発生します。\n"
-"通常はフルスクリーンモードでのみ使用します。また一部の GS プラグインでは機能"
-"しない可能性があります。"
+"Vsync (垂直同期)は画面の水平な乱れ(テアリング)を除去しますが、パフォーマ"
+"ンスに悪影響します。\n"
+"フルスクリーン時に適用され、全てのGSプラグインで動作しない事があります。"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:68
msgid "!ContextTip:Window:ManagedVsync"
msgstr ""
-"フレームレートが最速の時に VSYNC を有効にします。最速でない場合は速度の低下を"
-"防ぐために無効にします。\n"
-"注意:現時点ではDX10/11ハードウェアレンダリングで GSdx を使用している時のみ動"
-"作します。\n"
-"他のプラグインやレンダリングモードでは無視されるか、黒いフレームが挿入され点"
-"滅が起こります。\n"
-"またVSYNCと同期する設定を有効にする必要があります。"
+"フレームレートがフルスピードに達している時は自動で垂直同期を有効にし、スピー"
+"ドが落ちるとパフォーマンスを保全する為に自動で無効になります。\n"
+"メモ:現時点ではGSdxプラグインをDX 10/11のハードウェア設定にしている場合のみ"
+"正常に動作します。他のプラグインやレンダリングモードで使うと\n"
+"認識しなかったり垂直同期の有効無効が切り替わる際に黒画面になったりします。垂"
+"直同期も有効にしなければなりません。"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:76
msgid "!ContextTip:Window:HideMouse"
msgstr ""
-"GS ウィンドウ上でマウスを強制的に非表示にします。マウス操作がメインのゲームで"
-"有効にすると便利です。\n"
-"デフォルトでは操作をしないで2秒経過するとマウスを自動で非表示にします。"
+"映像出力画面内に入ったマウスポインタを非表示にします。\n"
+"マウスをゲームで主にコントローラとして利用している時に便利です。\n"
+"デフォルトでマウスは2秒間動作が無いと自動的に隠れます。"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:82
msgid "!ContextTip:Window:Fullscreen"
msgstr ""
-"ゲームを始めた時や再開した時に自動的にフルスクリーンになります。\n"
-"フルスクリーンにはAlt+Enterキーでいつでも切り替えができます。"
+"エミュレーション実行時とレジュームする時に自動でフルスクリーンにする機能を有"
+"効にします。[ALT] + [Enter]のショートカットでいつでも切り替える事ができます。"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:93
msgid "!ContextTip:Window:HideGS"
-msgstr "ESC を押したりしてゲームを一時停止した時にGSウィンドウを閉じます。"
+msgstr ""
+"ESCを押すか、エミューレータをポーズした時にGSウィンドウを非表示にする機能で"
+"す。\n"
+"大きな画面だったりして作業の邪魔になりやすいので、このオプションは便利です。"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:67
msgid "!ContextTip:Gamefixes:EE Timing Hack"
msgstr ""
-"以下のゲームに効果があります。\n"
-" * デジタルデビルサーガ (FMVでのクラッシュの問題)\n"
-" * SSX (グラフィックの不具合やクラッシュの問題)\n"
-" * バイオハザード ガンサバイバー4 (テクスチャの問題)"
+"以下のゲームに役立ちます:\n"
+" * デジタルデビルサーガ(ゲーム内ムービーとクラッシュを修正します)\n"
+" * SSX(グラフィックとクラッシュを修正します)\n"
+" * ガンサバイバー4 バイオハザードヒーローズネバーダイ(グラフィックがおかし"
+"くなります)"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:80
msgid "!ContextTip:Gamefixes:OPH Flag hack"
msgstr ""
-"以下のゲームに効果があります。\n"
-" * BLEACH~ブレイド・バトラーズ~\n"
-" * グローランサー2&3\n"
-" * Wizardry"
+"以下のゲームに役立ちます:\n"
+" * ブリーチブレイドバトラーズ\n"
+" * グローランサー3作\n"
+" * ウィザードリィ"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:89
msgid "!ContextTip:Gamefixes:DMA Busy hack"
msgstr ""
-"以下のゲームに効果があります。\n"
-" * マナケミア~学園の錬金術士たち~"
+"以下のゲームに役立ちます:\n"
+" * マナケミア~学園の錬金術士たち~\n"
+" * メタルサーガ"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:96
-#, fuzzy
msgid "!ContextTip:Gamefixes:VIF1 FIFO hack"
-msgstr ""
-"以下のゲームに効果があります。\n"
-" * BLEACH~ブレイド・バトラーズ~\n"
-" * グローランサー2&3\n"
-" * Wizardry"
+msgstr "ContextTip String Not Found"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:119
msgid "!Panel:Gamefixes:Compat Warning"
msgstr ""
-"Gamefix は一部タイトルのエミュレーションの不具合を回避することができます。し"
-"かし互換性やパフォーマンスの問題を引き起こす可能性があります。\n"
+"ゲーム修正はいくつかのゲームタイトルでの不正なエミュレーションを補正します"
+"が、\n"
+"互換性やパフォーマンスに悪影響を引き起こすことがあります。\n"
"\n"
-"ここの設定は無効のままで、代わりに自動Gamefixを有効にする事を推奨します。\n"
-"(自動Gamefix とはテスト済みの特定のゲームにのみ、特定の修正を適用するという機"
-"能です)"
+"以下の項目を空欄のままにし、[自動ゲーム修正]を有効にする事を推奨します。\n"
+"([自動ゲーム修正]は特定のゲームに対し選択的にテスト済みの修正を適用させます)"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:720
msgid "!Notice:Mcd:Delete"
msgstr ""
-"あなたはフォーマット済みメモリーカード '%s' を削除しようとしています。この"
-"カード内のデータは全て失われます!本当によろしいですか?"
+"フォーマットされたメモリーカード[%s]を削除しようとしています。\n"
+"メモリーカードのデータは全て失われます。本当に削除してもよろしいですか?"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:758
msgid "!Notice:Mcd:CantDuplicate"
msgstr ""
-"失敗エラー: 複写は空のPS2-ポートに、または、ファイルシステムに書き込むしかで"
-"きません。"
+"複製に失敗しました。複製は空PS2ポート又はファイルシステムに対してのみ許可され"
+"ています。"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:801
msgid "!Notice:Mcd:Copy Failed"
-msgstr "失敗エラー: 目的地メモリカード%sは使用中です。"
+msgstr "コピーに失敗しました。コピー先のメモリーカード[%s]は使用中です。"
#: pcsx2/gui/Panels/MiscPanelStuff.cpp:35
msgid "!Panel:Usermode:Explained"
msgstr ""
-"以下のPCSX2ユーザレベルドキュメントのデフォルト・フォルダー・パスを設置してく"
-"ださい。\n"
-"(メモリカード、スクリーン・ショット、設定、セーブ・ステートを含んで)\n"
-"いつでも、コア設定パネルを利用してこれらのフォルダー・パスをくつがえすことが"
-"できます。"
+"PCSX2がユーザレベルドキュメントを保存するディレクトリを指定して下さい\n"
+"(メモリーカード、スクリーンショット、各種設定、セーブステート)。\n"
+"保存するディレクトリはコア設定パネルでいつでも変更する事ができます。"
#: pcsx2/gui/Panels/MiscPanelStuff.cpp:41
msgid "!Panel:Usermode:Warning"
msgstr ""
-"以下のPCSX2ユーザレベルドキュメントのデフォルト・フォルダー・パスを設置してく"
-"ださい。\n"
-"(メモリカード、スクリーン・ショット、設定、セーブ・ステートを含んで)\n"
-"このオプションはインストール・デフォルト値を使用するように設定された標準のパ"
-"スだけに影響します。"
+"PCSX2がユーザレベルドキュメントを保存するディレクトリを変更する事ができます\n"
+"(メモリーカード、スクリーンショット、各種設定、セーブステート)。\n"
+"インストール時のディレクトリを標準ディレクトリとして指定するものにのみ効果が"
+"あります。"
#: pcsx2/gui/Panels/PathsPanel.cpp:40
msgid "!ContextTip:Folders:Savestates"
msgstr ""
-"このフォルダは PCSX2 のステートセーブの保存場所です。\n"
-"メニューまたはツールバーを使うか、F1/F3(セーブ/ロード)キーで操作します。"
+"PCSX2のセーブステートはこのフォルダに保存されます。\n"
+"メインメニューのシステムから、又は「F1(セーブ)」と「F3(ロード)」の\n"
+"ショートカットキーでステート操作を行う事ができます。"
#: pcsx2/gui/Panels/PathsPanel.cpp:50
msgid "!ContextTip:Folders:Snapshots"
msgstr ""
-"このフォルダは PCSX2 のスナップショットの保存場所です。ご使用の GS プラグイン"
-"によってはサイズや形式が違うかもしれません。"
+"PCSX2で保存されたスクリーンショットはこのフォルダに保存されます。\n"
+"実際のスクリーンショットのイメージ形式とスタイルは使用しているGSプラグイン"
+"にって変わります。"
#: pcsx2/gui/Panels/PathsPanel.cpp:60
msgid "!ContextTip:Folders:Logs"
msgstr ""
-"このフォルダは PCSX2 のログとダンプデータの保存場所です。一部の古いプラグイン"
-"はこの設定を利用しない可能性があります。"
+"PCSX2のログ及びダンプファイルはこのフォルダに保存されます。\n"
+"プラグインは通常この設定を利用しますが、古いものはこの限りではありません。"
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:242
msgid "!Notice:PluginSelector:ConfirmShutdown"
msgstr ""
-"警告! プラグインを変えるのはPS2仮想機械の完全な停止して、リセットを必要とし"
-"ます。\n"
-"PCSX2は、状態をセーブして、リロードするのを試みるが、新たに選択されたプラグイ"
-"ンが両立しないなら、\n"
-"リロードは失敗するかもしれません。そうならば、現在の進行ステートはなくなって"
-"しまいます。\n"
+"警告:プラグインの変更はPS2仮想マシンの完全なシャットダウンとリセットが必要で"
+"す。\n"
+"PCSX2はステートセーブを行い、変更されたプラグインでステートの復帰を試行します"
+"が、\n"
+"互換性が無かった場合は復帰に失敗し、進行中の作業が失われる可能性がありま"
+"す。\n"
"\n"
-"それでも現在設定を適用してもよろしいですか?"
+"本当に設定を適用してもよろしいですか?"
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:457
msgid "!Notice:PluginSelector:ApplyFailed"
msgstr ""
-"%sが正常動作するため、すべてのプラグイン有効な選択をしなければなりません。\n"
-"プラグインの不具合や%sが不完全なインストールの場合なら、キャンセル・ボタンを"
-"押すと、コンフィグ・パネルが閉まります。"
+"%sを実行するには有効なプラグインを全てについて選択していなければいけませ"
+"ん。\n"
+"プラグインが無かったり、不完全な%sのインストールで、有効な選択ができない場合"
+"は\n"
+"キャンセルを押して設定パネルを閉じて下さい。"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:27
msgid "!Panel:Speedhacks:EECycleX1"
msgstr ""
-"1 - 通常のサイクルレート。これは実機のPS2の EmotionEngine の速度に近いもので"
-"す。"
+"1 - [デフォルト] PS2実機のEEと同サイクル数(ほぼ同速度)でエミュレーションし"
+"ます。"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:32
msgid "!Panel:Speedhacks:EECycleX2"
msgstr ""
-"2 - EEのサイクルレートを約33%低下。多くのゲームで互換性を維持したままある程度"
-"のスピードアップ出来ます。"
+"2 - EEのサイクルレートを33%低下させます。そこそこ速度上昇、互換性も高いです。"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:37
msgid "!Panel:Speedhacks:EECycleX3"
msgstr ""
-"2 - EEのサイクルレートを約50%低下。中々の高速化が期待できますが *恐らく* FMV"
-"で音声の途切れる原因にもなります。"
+"3 - EEのサイクルレートを50%低下させます。大きく速度上昇、そこそこ互換性が"
+"損なわれます。ゲーム内ムービーのオーディオが乱れる事があります。"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:54
msgid "!Panel:Speedhacks:VUCycleStealOff"
-msgstr "0 - VU サイクルスティーリング無効。最も互換性の高い設定!"
+msgstr "0 - VU Cycle Stealingを無効にします。最も互換性があります。"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:59
msgid "!Panel:Speedhacks:VUCycleSteal1"
-msgstr ""
-"1 - 少しだけVU サイクルスティーリング実行。互換性は下がりますがほとんどのゲームで若干の"
-"高速化します。"
+msgstr "1 - 穏やかな設定です。そこそこ速度上昇、互換性が少し損なわれます。"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:64
msgid "!Panel:Speedhacks:VUCycleSteal2"
-msgstr ""
-"2 - 適度にVU サイクルスティーリング実行。より互換性は下がりますがいくつかのゲームで大幅"
-"に高速化します。"
+msgstr "2 - 適度な設定です。大きく速度上昇、そこそこ互換性が損なわれます。"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:70
msgid "!Panel:Speedhacks:VUCycleSteal3"
msgstr ""
-"3 - 限界までVU サイクルスティーリング実行。画面のちらつきが発生し多くのゲームで速度の低"
-"下かが起こるため有用性は限定的。"
+"3 - 最大限の設定です。利用価値は低く、ほとんどのゲームでは画面のチラつき、速"
+"度低下等が発生します。"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:97
msgid "!Panel:Speedhacks:Overview"
msgstr ""
-"Speedhack はエミュレーション速度を向上させる事ができますが、不具合やサウンド"
-"の問題、FPS値の異常を引き起こす可能性があります。エミュレーションに不具合が発"
-"生した場合は無効にしてください。"
+"スピードハックはエミュレーション速度を向上させますが、不具合、オーディオの乱"
+"れや不正確なFPSを表示する事があります。\n"
+"エミュレーションについて問題が発生した時は、まずはこのパネルの設定を無効にし"
+"てみて下さい。"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:129
msgid "!ContextTip:Speedhacks:EECycleRate Slider"
msgstr ""
-"このスライドバーを上げるとEmotionEngineのR5900コアCPUのクロックを下げる代わり"
-"に大きな高速化を行い、\n"
-"PS2ハードウェアの機能を最大限利用していないゲームの高速化に有用です。"
+"設定値を高くする程EEのR5900 CPUのクロックを低下させます。実機PS2のハード"
+"ウェア能力を\n"
+"最大限に利用できていないゲームに大幅な速度の向上をもたらします。"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:150
msgid "!ContextTip:Speedhacks:VUCycleStealing Slider"
msgstr ""
-"このスライドバーを上げるとEmotionEngineのVUユニットからスティーリングを行いま"
-"す。\n"
-"高い設定にするほどサイクルスティーリングを行う量が増加します。"
+"VUがEEから奪うサイクルを増減させます。高い値ほどVUプログラム数に応じてEEから"
+"奪うサイクルが増加します。"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:172
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "!ContextTip:Speedhacks:vuFlagHack"
msgstr ""
-"常時ではなくブロックされた時のみフラグステータスを更新します。\n"
-"ほとんどの安全であり、SuperVUにも同様の動作をさせます。"
+"常に読み込むのでは無く、読み込まれるブロックのステータスフラグのみをアップ"
+"デートします。\n"
+"ほぼ安全に使う事ができ、Super VUもデフォルトで同じような動作をします。"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:177
-msgid "!ContextTip:Speedhacks:vuBlockHack"
-msgstr ""
-"遠い将来にインスタンスデータの古いフラグを必要としないと仮定しています。\n"
-"かなり安全なはずです。どんなゲームに不具合が起きるかは不明ですが..."
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:182
-#, fuzzy
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:174
msgid "!ContextTip:Speedhacks:vuThread"
-msgstr ""
-"このhackは主に非3D系RPGにある INTC ステータスレジスタを使用しVSYNC待ちをする"
-"ゲームに最適です。\n"
-"効果がなかった場合には使用しないでください。"
+msgstr "ContextTip String Not Found"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:203
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:195
msgid "!ContextTip:Speedhacks:INTC"
msgstr ""
-"このhackは主に非3D系RPGにある INTC ステータスレジスタを使用しVSYNC待ちをする"
-"ゲームに最適です。\n"
-"効果がなかった場合には使用しないでください。"
+"垂直同期を待つ為にINTCステータスレジスタを使用する、主に非3D RPGゲームで使う"
+"と効果が得られます。\n"
+"垂直同期にこの手法を使用しないゲームでは速度アップはあるか無いかぐらいです。"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:208
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
msgid "!ContextTip:Speedhacks:BIFC0"
msgstr ""
-"主にEEのカーネル空間のアドレス 0x81FC0 のアイドルループ処理を対象にしていま"
-"す。\n"
-"このhackは別ユニットによるエミュレーションのイベントトリガまでの間に、状態が"
-"同じである事を検出します。\n"
-"このようなループを1度だけ繰り返したあと、次のイベントかタイムスライスの終りのいずれ"
-"か早いほうに進みます。"
+"カーネルの 0X81FC0 アドレスにあるEEアイドルループを主に監視し、別ユニットのエ"
+"ミュレーションが発動するイベントまで、\n"
+"全ての反復でマシンステートが同一である保証があるループの探知を試みます。検出"
+"ループに対し1度の反復後に次のイベントへ、\n"
+"若しくはプロセッサのタイムスライスの末尾へ、どちらか近いほうへ飛びます。"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:215
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:207
msgid "!ContextTip:Speedhacks:fastCDVD"
msgstr ""
-"この問題を抱えている既知のゲーム用の設定。\n"
-"HDLoader互換性リストを参照してください(主に'MODE 1'や'低速DVD'など)"
+"「HDLoader compatibility list」を参照し、この機能を《使用できない》ゲームを調"
+"べて下さい(mode 1/slow DVDと表記されています)。"
#: pcsx2/gui/Panels/VideoPanel.cpp:37
msgid "!ContextTip:Framelimiter:Disable"
msgstr ""
-"フレームリミットを無効にした場合、スローモーションモードとターボモードは使用"
-"できません。"
+"フレームレート制限が無効になっている場合、ターボ及びスローモーションモードは"
+"使用できません。"
-#: pcsx2/gui/Panels/VideoPanel.cpp:223
+#: pcsx2/gui/Panels/VideoPanel.cpp:227
msgid "!Panel:Frameskip:Heading"
msgstr ""
-"注意!PS2はハードの設計上正確なフレームスキップはできません。よって一部のゲー"
-"ムでは深刻なグラフィックのエラーが発生します。"
-
-#: pcsx2/gui/Panels/VideoPanel.cpp:302
-msgid "!ContextTip:GS:SyncMTGS"
-msgstr ""
-"映像の不具合の原因が MTGS スレッドの同期によるものだと思われる場合有効にして"
-"ください。"
+"メモ:PS2のハードウェア設計により、 \n"
+"正確なフレームスキップは不可能です。 \n"
+"有効にすると、ゲームによってグラフィックの\n"
+"深刻なエラーを発生させる事があります。"
#: pcsx2/gui/Panels/VideoPanel.cpp:306
+msgid "!ContextTip:GS:SyncMTGS"
+msgstr ""
+"クラッシュやグラフィックエラーの発生原因として、\n"
+"MTGSスレッドの同期が疑わしい場合は有効にして下さい。"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:310
msgid "!ContextTip:GS:DisableOutput"
msgstr ""
-"MTGSスレッドかGPUオーバーヘッドによって発生されたベンチマークノイズを除去しま"
-"す。このオプションはステートセーブと併用するのが最良です。; 最適な場面でス"
-"テートセーブを行い、このオプションを有効にしてリロードします。\n"
+"MTGSスレッド又はGPUオーバーヘッドにより発生されるベンチマークノイズを除去しま"
+"す。このオプションはセーブステートと併用して利用する事が適切です。\n"
+"都合のつく所でセーブステートを行い、オプションを有効にした後に、セーブステー"
+"トをロードしてください。\n"
"\n"
-"警告:このオプションはいつでも有効にすることができますが、動作中に無効にでき"
-"ません(映像に悪影響を与えます)。"
+"警告: このオプションはゲーム実行中に有効化できますが、無効化する事はできま"
+"せん(映像出力内容の判別ができなくなります)。"
#: pcsx2/vtlb.cpp:710
msgid "!Notice:HostVmReserve"
msgstr ""
-"システムの仮想記憶リソースは少ないため、PCSX2正常操作が確保できません。これは"
-"スワップファイルが少ない、\n"
-"あるいは無効化されているとか、いくつかのメモリ使用量高いバックグラウンド・タ"
-"スクがあることなどの原因で、\n"
-"仮想記憶リソース少ないによって起こされているかもしれません。 "
+"PCSX2を実行する為の仮想メモリリソースが不足しています。スワップファイルが小さ"
+"すぎるか、\n"
+"無効にされている場合や他のプログラムがメモリの多くを消費している時に発生しま"
+"す。"
#: pcsx2/x86/sVU_zerorec.cpp:363
msgid "!Notice:superVU:VirtualMemoryAlloc"
msgstr ""
-"メモリがたりなかった(似たい状況)。 SuperVU リコンパイラは必要の特定メモリ範囲"
-"を予約できないで、\n"
-"利用不可能になるでしょう。致命的なエラーではありませんが、sVU リコンパイラは"
-"もう廃れたため、\n"
-"お代わりにとにかくmicroVUを使用するべきでしょう。(笑)"
+"メモリー不足(多少):重大なエラーではありません。SuperVUリコンパイラが\n"
+"必要とする特定のメモリ領域を確保する事ができなかったので使用不可となりまし"
+"た。\n"
+"sVU rec は旧式なので、変わりに microVU を使用した方が良いでしょう。 (^-^)"
-#~ msgid "No reason given."
-#~ msgstr "不明な理由"
-
-#~ msgid "Threading activity: start, detach, sync, deletion, etc."
-#~ msgstr "スレッドのアクティビティ; 開始、分離、同期、削除など"
-
-#~ msgid "Includes idle event processing and some other uncommon event usages."
-#~ msgstr "アイドル状態のイベント処理と、いくつかの他の珍しいイベント"
-
-#~ msgid ""
-#~ "The MTGS thread has become unresponsive while waiting for the GS plugin "
-#~ "to open."
-#~ msgstr "GS プラグインを開くまで MTGS スレッドはしなくなる事があります。"
-
-#~ msgid "Internal Memorycard Plugin failed to initialize."
-#~ msgstr "内蔵メモリーカードプラグインの初期化に失敗しました。"
-
-#~ msgid "Safest"
-#~ msgstr "最も安定"
-
-#~ msgid "Safe (faster)"
-#~ msgstr "最も安定(高速)"
-
-#~ msgid "Balanced"
-#~ msgstr "バランス"
-
-#~ msgid "Aggressive"
-#~ msgstr "アグレッシブ"
-
-#~ msgid "Aggressive plus"
-#~ msgstr "アグレッシブ+"
-
-#~ msgid "Mostly Harmful"
-#~ msgstr "害にしかならない"
-
-#~ msgid "Fits a lot of log in a microcosmically small area."
-#~ msgstr "小スペースに大量のログを表示します。"
-
-#~ msgid "It's what I use (the programmer guy)."
-#~ msgstr "それは私(プログラマたち)が使用します。"
-
-#~ msgid "Its nice and readable."
-#~ msgstr "読みやすくてナイスです。"
-
-#~ msgid "In case you have a really high res display."
-#~ msgstr "非常に高い解像度にした場合。"
-
-#~ msgid "Default soft-tone color scheme."
-#~ msgstr "デフォルトのソフトな配色。"
-
-#~ msgid ""
-#~ "Classic black color scheme for people who enjoy having text seared into "
-#~ "their optic nerves."
-#~ msgstr "クラシックな黒い配色。文字を見えやすくしたい場合などに。"
-
-#~ msgid ""
-#~ "When checked the log window will be visible over other foreground windows."
-#~ msgstr "チェックするとログウィンドウを常に手前に表示します。"
-
-#~ msgid ""
-#~ "Always use this option if you want the safest and surest memory card "
-#~ "behavior."
+#~ msgid "!ContextTip:Speedhacks:vuBlockHack"
#~ msgstr ""
-#~ "メモリカードの最も安全で確実な動作を望むなら、このオプションを使用してくだ"
-#~ "さい。"
-
-#~ msgid "16 and 32 MB cards have roughly the same compatibility factor."
-#~ msgstr "16 MB と 32 MB のメモリーカードの互換性は同等程度です。"
-
-#~ msgid ""
-#~ "Use at your own risk. Erratic memory card behavior is possible (though "
-#~ "unlikely)."
-#~ msgstr ""
-#~ "不安定なメモリーカードの使用は自己責任でお願いします(運がよければ大丈夫)。"
-
-#~ msgid "Logs events as they are passed to the PS2 virtual machine."
-#~ msgstr "PS2 仮想マシンに渡されてからイベントを記録します。"
-
-#~ msgid ""
-#~ "Error while parsing either NTSC or PAL framerate settings. Settings must "
-#~ "be valid floating point numerics."
-#~ msgstr ""
-#~ "NTSC または PAL のフレームレートの設定の解析中にエラーが発生しました。有効"
-#~ "な浮動小数点値を入力してください。"
-
-#~ msgid ""
-#~ "For troubleshooting potential bugs in the MTGS only, as it is potentially "
-#~ "very slow."
-#~ msgstr "MTGSに潜在的なバグがあった場合のみ有効に。非常に低速になります。"
-
-#~ msgid ""
-#~ "Completely disables all GS plugin activity; ideal for benchmarking EEcore "
-#~ "components."
-#~ msgstr ""
-#~ "GSプラグインを無効にします。EEコアコンポーネントのベンチマークに最適です。"
+#~ "将来読み込まれるであろうブロックで、古いフラグのインスタンスデータは不必要"
+#~ "と判断します。\n"
+#~ "安全に使えるはずですが、ゲームに不具合を及ぼすかは知られていません。"
diff --git a/locales/ja_JP/pcsx2_Main.po b/locales/ja_JP/pcsx2_Main.po
index e0e6d450b..a0b3e5b5a 100644
--- a/locales/ja_JP/pcsx2_Main.po
+++ b/locales/ja_JP/pcsx2_Main.po
@@ -1,21 +1,21 @@
# SOME DESCRIPTIVE TITLE.
-# Copyright (C) 2011 PCSX2_Dev_Team
-# This file is distributed under the same license as the PCSX2 package.
+# Copyright (C) YEAR PCSX2 Dev Team
+# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR , YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.9\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-09-28 20:27+0200\n"
-"PO-Revision-Date: 2011-04-30 09:01+0900\n"
-"Last-Translator: oreore\n"
-"Language-Team: \n"
+"POT-Creation-Date: 2012-03-10 20:38+0100\n"
+"PO-Revision-Date: 2011-12-17 01:36+0900\n"
+"Last-Translator: DeltaHF\n"
+"Language-Team: DeltaHF\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-KeywordsList: _;pxL\n"
+"X-Poedit-KeywordsList: _;pxL;_d;pxDt;_t;pxLt\n"
"X-Poedit-SourceCharset: utf-8\n"
"X-Poedit-Basepath: trunk\\\n"
"X-Poedit-Language: Japanese\n"
@@ -25,19 +25,19 @@ msgstr ""
#: common/include/Utilities/Exceptions.h:187
msgid "No reason given."
-msgstr "不明な理由"
+msgstr "原因不明なエラー"
#: common/include/Utilities/Exceptions.h:226
msgid "Parse error"
-msgstr "解析エラー"
+msgstr "構文エラー"
#: common/include/Utilities/Exceptions.h:250
msgid "Your machine's hardware is incapable of running PCSX2. Sorry dood."
-msgstr "申し訳ありません。ご使用のPCではPCSX2を実行できません。"
+msgstr "このマシンのハードウェア構成ではPCSX2は実行できません。ごめんなさい。"
#: common/src/Utilities/Exceptions.cpp:219
msgid "Oh noes! Out of memory!"
-msgstr "あわわ!メモリ不足です。"
+msgstr "おっと、メモリー不足です!"
#: common/src/Utilities/Exceptions.cpp:234
msgid ""
@@ -45,83 +45,83 @@ msgid ""
"drivers, services, or may simply have insufficient memory or resources to "
"meet PCSX2's lofty needs."
msgstr ""
-"仮想メモリのマッピングエラーです。デバイスドライバやサービスが競合している"
-"か、単純にPCSX2を実行するためのメモリが不足しています。"
+"仮想メモリマッピングエラー。システムに競合しているドライバやサービス或いは"
+"PCSX2の高レベルな要求に応えられるメモリーやリソースが不足しています。"
#: common/src/Utilities/Exceptions.cpp:309
msgid "Path: "
-msgstr "ファイル名:"
+msgstr "パス:"
#: common/src/Utilities/Exceptions.cpp:313
msgid "[Unnamed or unknown]"
-msgstr "解析エラー"
+msgstr "[不明又は未知]"
#: common/src/Utilities/Exceptions.cpp:333
msgid "A file could not be created."
-msgstr "ファイルを作成できません。"
+msgstr "ファイルを作成できませんでした。"
#: common/src/Utilities/Exceptions.cpp:353
msgid "File not found."
-msgstr "ファイルがありません。"
+msgstr "ファイルが見つかりません。"
#: common/src/Utilities/Exceptions.cpp:373
msgid ""
"Permission denied while trying to open file, likely due to insufficient user "
"account rights."
msgstr ""
-"恐らくユーザアカウントの権限が不足しているため、ファイルを開けませんでした。"
+"ファイルのアクセス権がありません。ユーザーアカウント権限が不足していると思わ"
+"れます。"
#: common/src/Utilities/Exceptions.cpp:393
msgid ""
"Unexpected end of file or stream encountered. File is probably truncated or "
"corrupted."
msgstr ""
-"ファイルやストリームが予期せず終了しました。恐らくファイルが破損しています。"
+"予期しないEOF又はストリームを検出しました。切り詰められているか、破損したファ"
+"イルです。"
#: common/src/Utilities/ThreadTools.cpp:41
msgid "Threading activity: start, detach, sync, deletion, etc."
-msgstr "スレッドのアクティビティ; 開始、分離、同期、削除など"
+msgstr "スレッドアクティビティ:start、detach、sync、deletion、等。"
#: common/src/Utilities/ThreadingDialogs.cpp:30
msgid "Waiting for tasks..."
-msgstr "タスク待機中…"
+msgstr "タスク待機状態..."
#: common/src/Utilities/ThreadingDialogs.cpp:41
msgid "Waiting for task..."
-msgstr "タスク待機中…"
+msgstr "タスク待機状態..."
#: common/src/Utilities/wxAppWithHelpers.cpp:36
msgid "Includes idle event processing and some other uncommon event usages."
-msgstr "アイドル状態のイベント処理と、いくつかの他の珍しいイベント"
+msgstr "アイドルイベント処理及びその他例外イベントを用途に含みます。"
#: pcsx2/CDVD/IsoFileFormats.cpp:416
msgid "Unrecognized ISO image file format"
-msgstr "認識できないISOイメージです。"
+msgstr "認識できないISOイメージファイル形式です。"
#: pcsx2/Elfheader.cpp:266
msgid "Cannot load ELF binary image. The file may be corrupt or incomplete."
-msgstr ""
-"ELFバイナリイメージを読み込めませんでした。ファイルが破損または不完全な可能性"
-"があります。"
+msgstr "ELFバイナリイメージを読み込めません。破損又は不完全なファイルです。"
#: pcsx2/Elfheader.cpp:268
msgid ""
"If loading from an ISO image, this error may be caused by an unsupported ISO "
"image type or a bug in PCSX2 ISO image support."
msgstr ""
-"ISOイメージから読み込んだ場合、このエラーはISOイメージが未サポートか、PCSX2の"
-"ISOイメージ読み込み機能のバグの可能性があります。"
+"ISOイメージから読み込んでいる場合、このエラーはサポートしないISOイメージ形"
+"式、或いはPCSX2側のISOイメージサポートのバグが原因と考えられます。"
#: pcsx2/MTGS.cpp:859
msgid ""
"The MTGS thread has become unresponsive while waiting for the GS plugin to "
"open."
-msgstr "GS プラグインを開くまで MTGS スレッドはしなくなる事があります。"
+msgstr "GSプラグインのロード待機中にMTGSスレッドの応答が停止しました。"
#: pcsx2/PluginManager.cpp:709
msgid ""
"The savestate cannot be loaded, as it appears to be corrupt or incomplete."
-msgstr "データが破損または不完全なため、ステートセーブはロードできません。"
+msgstr "セーブステートをロードできませんでした。破損しているか不完全です。"
#: pcsx2/PluginManager.cpp:719
#, c-format
@@ -129,8 +129,8 @@ msgid ""
"%s plugin failed to open. Your computer may have insufficient resources, or "
"incompatible hardware/drivers."
msgstr ""
-"%s プラグインを開くのに失敗しました。リソース不足か、ハードウェアやデバイスの"
-"競合が原因です。"
+"[%s]プラグインがロードに失敗しました。システムのリソースが不足しているか、互"
+"換性の無いハードウェア又はドライバーがあります。"
#: pcsx2/PluginManager.cpp:726
#, c-format
@@ -138,18 +138,18 @@ msgid ""
"%s plugin failed to initialize. Your system may have insufficient memory or "
"resources needed."
msgstr ""
-"%s プラグインの初期化に失敗しました。ご使用のPCのメモリやリソース不足の可能性"
-"があります。"
+"[%s]プラグインが初期化に失敗しました。システムのメモリー又はリソースが不足し"
+"ています。"
#: pcsx2/PluginManager.cpp:832
#, c-format
msgid "The configured %s plugin file was not found"
-msgstr "設定した %s プラグインが見つかりませんでした。"
+msgstr "設定された[%s]プラグインファイルが見つかりませんでした。"
#: pcsx2/PluginManager.cpp:836
#, c-format
msgid "The configured %s plugin file is not a valid dynamic library"
-msgstr "設定した %s プラグインは有効なダイナミックライブラリではありません。"
+msgstr "設定された[%s]プラグインファイルは無効なDLLです。"
#: pcsx2/PluginManager.cpp:854
#, c-format
@@ -157,23 +157,23 @@ msgid ""
"The configured %s plugin is not a PCSX2 plugin, or is for an older "
"unsupported version of PCSX2."
msgstr ""
-"設定した %s プラグインは有効なPCSX2プラグインではありません。古いバージョン"
-"か、未サポートのプラグインです。"
+"設定された[%s]プラグインはPCSX2のプラグインではないか、サポートされていない古"
+"いバージョンのPCSX2用のプラグインです。"
#: pcsx2/PluginManager.cpp:879
msgid ""
"The plugin reports that your hardware or software/drivers are not supported."
msgstr ""
-"このプラグインはあなたのハードウェア、またはソフトウェア/ドライバでは動作しま"
-"せん。"
+"ハードウェア又はソフトウェア/ドライバーがプラグインではサポートされていませ"
+"ん。"
#: pcsx2/PluginManager.cpp:900
msgid ""
"Configured plugin is not a PCSX2 plugin, or is for an older unsupported "
"version of PCSX2."
msgstr ""
-"Configured plugin is not a PCSX2 plugin, or is for an older unsupported "
-"version of PCSX2."
+"設定されたプラグインはPCSX2のプラグインではないか、サポートされていない古い"
+"バージョンのPCSX2用のプラグインです。"
#: pcsx2/PluginManager.cpp:926
#, c-format
@@ -181,170 +181,170 @@ msgid ""
"Configured %s plugin is not a valid PCSX2 plugin, or is for an older "
"unsupported version of PCSX2."
msgstr ""
-"設定した %s プラグインは有効なPCSX2プラグインではありません。古いバージョン"
-"か、未サポートのプラグインです。"
+"設定された[%s]プラグインはPCSX2のプラグインではないか、サポートされていない古"
+"いバージョンのPCSX2用のプラグインです。"
#: pcsx2/PluginManager.cpp:1355
msgid "Internal Memorycard Plugin failed to initialize."
-msgstr "内蔵メモリーカードプラグインの初期化に失敗しました。"
+msgstr "内部メモリーカードプラグインが初期化に失敗しました。"
#: pcsx2/PluginManager.cpp:1752
msgid "Unloaded Plugin"
-msgstr "プラグインのアンインストール"
+msgstr "プラグインがロードされていません。"
-#: pcsx2/SaveState.cpp:339
+#: pcsx2/SaveState.cpp:342
msgid "Cannot load savestate. It is of an unknown or unsupported version."
msgstr ""
-"ステートセーブを読み込めません。未知のバージョン、または未サポートのデータで"
-"す。"
+"セーブステートをロードできません。未知又はサポートされないバージョンです。"
#: pcsx2/SourceLog.cpp:96
msgid "Dumps detailed information for PS2 executables (ELFs)."
-msgstr "PS2実行 (ELF) ファイルの詳細情報をダンプ表示します。"
+msgstr "PS2実行ファイル(ELF)の詳細情報をダンプします。"
#: pcsx2/SourceLog.cpp:101
msgid ""
"Logs manual protection, split blocks, and other things that might impact "
"performance."
msgstr ""
-"手動プロテクション、分割ブロック、およびパフォーマンスに影響を及ぼす可能性の"
-"ある他のソースについての情報を表示する。"
+"マニュアルプロテクト、ブロック暗号などパフォーマンスに影響する事物のログを取"
+"ります。"
#: pcsx2/SourceLog.cpp:106
msgid "Shows the game developer's logging text (EE processor)"
-msgstr "開発者向けのログ (EEプロセッサ) を表示する。"
+msgstr "ゲーム開発者のロギングテキストを表示(EEプロセッサ)"
#: pcsx2/SourceLog.cpp:111
msgid "Shows the game developer's logging text (IOP processor)"
-msgstr "開発者向けのログ (IOPプロセッサ) を表示する。"
+msgstr "ゲーム開発者のロギングテキストを表示(IOPプロセッサ)"
#: pcsx2/SourceLog.cpp:116
msgid "Shows DECI2 debugging logs (EE processor)"
-msgstr "DECI2 デバッグログ (EEプロセッサ) を表示"
+msgstr "DECI2デバッグログを表示(EEプロセッサ)"
#: pcsx2/SourceLog.cpp:145
msgid "SYSCALL and DECI2 activity."
-msgstr "SYSCALL と DECI2 の動作"
+msgstr "SYSCALLとDECI2のアクティビティ。"
#: pcsx2/SourceLog.cpp:151
msgid "Direct memory accesses to unknown or unmapped EE memory space."
-msgstr ""
-"EE メモリマップの未知の領域、またはマッピングされていないアドレスへのダイレク"
-"トメモリアクセス。"
+msgstr "未知又はマップされていないEEメモリに対するDMA。"
#: pcsx2/SourceLog.cpp:157 pcsx2/SourceLog.cpp:276
msgid "Disasm of executing core instructions (excluding COPs and CACHE)."
-msgstr "コア命令を逆アセンブルする(COPSとキャッシュを除く)。"
+msgstr "実行コア命令ディスアセンブラ(COPやキャッシュ以外)。"
#: pcsx2/SourceLog.cpp:163
msgid "Disasm of COP0 instructions (MMU, cpu and dma status, etc)."
-msgstr "COP 命令を逆アセンブル (MMU、CPU、DMAステータスなど)"
+msgstr "COP0命令のディスアセンブラ(MMU、CPU、DMAステータス等)。"
#: pcsx2/SourceLog.cpp:169
msgid "Disasm of the EE's floating point unit (FPU) only."
-msgstr "EEの浮動小数点演算ユニット (FPU) のみ逆アセンブルする。"
+msgstr "EEの浮動小数点演算装置(FPU)のディスアセンブラ。"
#: pcsx2/SourceLog.cpp:175
msgid "Disasm of the EE's VU0macro co-processor instructions."
-msgstr "EE の VU0 コプロセッサ命令を逆アセンブル"
+msgstr "EEのVU0macro コプロセッサ命令のディスアセンブラ。"
#: pcsx2/SourceLog.cpp:181
msgid "Execution of EE cache instructions."
-msgstr "EE キャッシュ命令を実行。"
+msgstr "EEキャッシュの命令実行。"
#: pcsx2/SourceLog.cpp:187
msgid ""
"All known hardware register accesses (very slow!); not including sub filter "
"options below."
msgstr ""
-"全ての既知ハードウェアレジスタにアクセス(非常に低速!) ; サブフィルタオプショ"
-"ン以降は含まれません。"
+"既知の全てのハードウェアレジスタアクセス(鈍速!)下のサブフィルタオプションは"
+"含まない。"
#: pcsx2/SourceLog.cpp:193 pcsx2/SourceLog.cpp:294
msgid "Logs only unknown, unmapped, or unimplemented register accesses."
-msgstr "未知か、未実装か、レジスタアクセスが実装されていない物のログ。"
+msgstr ""
+"マップされていない、導入されていない、不明なレジスタアクセスのみログをとる。"
#: pcsx2/SourceLog.cpp:199 pcsx2/SourceLog.cpp:300
msgid "Logs only DMA-related registers."
-msgstr "DMA関連のレジスタのみログ。"
+msgstr "DMA関係のレジスタのみログをとる。"
#: pcsx2/SourceLog.cpp:205
msgid "IPU activity: hardware registers, decoding operations, DMA status, etc."
msgstr ""
-"IPUアクティビティ:ハードウェアレジスタ、デコード操作、DMAステータスなど"
+"IPUアクティビティ:ハードウェアレジスタ、デコードオペレーション、DMAステータ"
+"ス等。"
#: pcsx2/SourceLog.cpp:211
msgid "All GIFtag parse activity; path index, tag type, etc."
-msgstr "全ての GIFtag 解析アクティビティ ; パス、インデックス、タグタイプなど"
+msgstr "全てのGIFtag parseアクティビティ(path index、tag type、等)。"
#: pcsx2/SourceLog.cpp:217
msgid "All VIFcode processing; command, tag style, interrupts."
-msgstr "全ての VIFコード処理 ; コマンド、タグスタイル、割り込みなど"
+msgstr "全てのVIFcode プロセシング(command, tag style, interrupts)。"
#: pcsx2/SourceLog.cpp:223
msgid "All processing involved in Path3 Masking"
-msgstr "Path3 マスキング関係する全ての処理"
+msgstr "Path3 Maskingに携わる全てのプロセシング。"
#: pcsx2/SourceLog.cpp:229
msgid "Scratchpad's MFIFO activity."
-msgstr "スクラッチパッドの MFIFO アクティビティ"
+msgstr "Scratchpad's MFIFO アクティビティ。"
#: pcsx2/SourceLog.cpp:235
msgid "Actual data transfer logs, bus right arbitration, stalls, etc."
-msgstr "バス調停権やストールなどの実際のデータ転送ログ"
+msgstr "実データ転送ログ、バス使用権アービトレーション、ストール、等。"
#: pcsx2/SourceLog.cpp:241
msgid "Tracks all EE counters events and some counter register activity."
-msgstr "全ての EE カウンタイベントと、一部カウンタレジスタの動作を追跡"
+msgstr ""
+"EE countersイベント、Counter registerアクティビティをトラッキングする。"
#: pcsx2/SourceLog.cpp:247
msgid "Dumps various VIF and VIFcode processing data."
-msgstr "VIF と VIFコード処理データのダンプ "
+msgstr "VIFとVIFcode プロセシングデータをダンプする。"
#: pcsx2/SourceLog.cpp:253
msgid "Dumps various GIF and GIFtag parsing data."
-msgstr "様々な GIF や GIFtag 解析データのダンプ"
+msgstr "GIFとGIFtag パーシングのデータをダンプする。"
#: pcsx2/SourceLog.cpp:264
msgid "SYSCALL and IRX activity."
-msgstr "SYSCALL と IRX アクティビティ"
+msgstr "SYSCALLとIRXのアクティビティ。"
#: pcsx2/SourceLog.cpp:270
msgid "Direct memory accesses to unknown or unmapped IOP memory space."
-msgstr ""
-"IOP メモリマップの未知の領域、またはマッピングされていないアドレスへのダイレ"
-"クトメモリアクセス。"
+msgstr "未知又はマップされていないIOPメモリに対するDMA。"
#: pcsx2/SourceLog.cpp:282
msgid "Disasm of the IOP's GPU co-processor instructions."
-msgstr "IOP の GPU コプロセッサ命令の逆アセンブル。"
+msgstr "IOPのGPUコプロセッサ命令のディスアセンブラ。"
#: pcsx2/SourceLog.cpp:288
msgid ""
"All known hardware register accesses, not including the sub-filters below."
msgstr ""
-"サブフィルタオプション以降は含めない、全ての既知ハードウェアレジスタにアクセ"
-"ス"
+"既知の全てのハードウェアレジスタアクセス(下のサブフィルタオプションは含まな"
+"い)。"
#: pcsx2/SourceLog.cpp:306
msgid "Memorycard reads, writes, erases, terminators, and other processing."
-msgstr "メモリーカードの読み込み、書き込み、消去、ターミネイトその他の処理"
+msgstr ""
+"メモリーカードの読み込み、書き込み、消去、終止、及びその他プロセシング。"
#: pcsx2/SourceLog.cpp:312
msgid "Gamepad activity on the SIO."
-msgstr "SIO上でゲームパッドの有効化"
+msgstr "SIOにおけるゲームパッドアクティビティ。"
#: pcsx2/SourceLog.cpp:318
msgid "Actual DMA event processing and data transfer logs."
-msgstr "実際の DMA イベント処理とデータ転送ログを表示"
+msgstr "実DMAイベントプロセシングとデータ転送ログ。"
#: pcsx2/SourceLog.cpp:324
msgid "Tracks all IOP counters events and some counter register activity."
-msgstr "全ての IOP カウンタイベントと、一部カウンタレジスタの動作を追跡"
+msgstr ""
+"全てのIOP countersイベントとCounter registerアクティビティのトラッキング。"
#: pcsx2/SourceLog.cpp:330
msgid "Detailed logging of CDVD hardware."
-msgstr "CDVDハードウェアの詳細ログを表示"
+msgstr "CDVDハードウェアの詳細ログ。"
#: pcsx2/System.h:206 pcsx2/System.h:207 pcsx2/System.h:208
msgid "PCSX2 Message"
@@ -355,108 +355,108 @@ msgid ""
"The savestate was not properly saved. The temporary file was created "
"successfully but could not be moved to its final resting place."
msgstr ""
-"ステートセーブを保存できませんでした。一時ファイルは正常に作成されましたが、"
-"データの保存ができませんでした。"
+"セーブステートが正常に保存されませんでした。一時ファイルの作成は成功しました"
+"が保存先に移動できませんでした。"
-#: pcsx2/gui/AppConfig.cpp:837
+#: pcsx2/gui/AppConfig.cpp:842
msgid "Safest"
-msgstr "最も安定"
+msgstr "最も安全"
-#: pcsx2/gui/AppConfig.cpp:838
+#: pcsx2/gui/AppConfig.cpp:843
msgid "Safe (faster)"
-msgstr "最も安定(高速)"
+msgstr "安全(速め)"
-#: pcsx2/gui/AppConfig.cpp:839
+#: pcsx2/gui/AppConfig.cpp:844
msgid "Balanced"
msgstr "バランス"
-#: pcsx2/gui/AppConfig.cpp:840
+#: pcsx2/gui/AppConfig.cpp:845
msgid "Aggressive"
-msgstr "アグレッシブ"
+msgstr "アクティブ"
-#: pcsx2/gui/AppConfig.cpp:841
+#: pcsx2/gui/AppConfig.cpp:846
msgid "Aggressive plus"
-msgstr "アグレッシブ+"
+msgstr "アクティブプラス"
-#: pcsx2/gui/AppConfig.cpp:842
+#: pcsx2/gui/AppConfig.cpp:847
msgid "Mostly Harmful"
-msgstr "害にしかならない"
+msgstr "ほぼ無益"
-#: pcsx2/gui/AppConfig.cpp:999 pcsx2/gui/AppConfig.cpp:1005
+#: pcsx2/gui/AppConfig.cpp:1007 pcsx2/gui/AppConfig.cpp:1013
msgid "Failed to overwrite existing settings file; permission was denied."
-msgstr "設定ファイルの更新に失敗しました。アクセスが拒否されました。"
+msgstr "既存の設定ファイルの上書きに失敗しました。権限がありません。"
#: pcsx2/gui/AppCorePlugins.cpp:404
msgid "Loading PS2 system plugins..."
-msgstr "PS2のシステムプラグインをロード中..."
+msgstr "PS2システムのプラグインをロード中..."
#: pcsx2/gui/AppInit.cpp:41
msgid "PCSX2 - SSE2 Recommended"
-msgstr "PCSX2 - SSE2 を推奨"
+msgstr "PCSX2 - SSE2を推奨します。"
#: pcsx2/gui/AppInit.cpp:71
msgid ""
"SSE extensions are not available. PCSX2 requires a cpu that supports the "
"SSE instruction set."
msgstr ""
-"SSE拡張命令が利用できません。PCSX2はSSE命令セットをサポートするCPUが必要で"
+"SSE拡張命令が存在しません。PCSX2はSSE拡張命令セットをサポートするCPUが必要で"
"す。"
#: pcsx2/gui/AppInit.cpp:154
msgid "PCSX2 Recompiler Error(s)"
-msgstr "PCSX2 リコンパイラ エラー"
+msgstr "PCSX2 リコンパイラエラー"
#: pcsx2/gui/AppInit.cpp:227
msgid "All options are for the current session only and will not be saved.\n"
-msgstr "全てのオプションは現在のセッション中のみ有効で保存はされません。\n"
+msgstr "全てのオプションは現在のセッション中にのみ適用され、保存されません。\n"
#: pcsx2/gui/AppInit.cpp:237 pcsx2/gui/AppMain.cpp:299
msgid "IsoFile"
-msgstr "IsoFile"
+msgstr "ISOファイル"
#: pcsx2/gui/AppInit.cpp:238
msgid "displays this list of command line options"
-msgstr "このリストのコマンドラインオプションを表示する"
+msgstr "このリストのコマンドラインオプションを表示"
#: pcsx2/gui/AppInit.cpp:239
msgid "forces the program log/console to be visible"
-msgstr "ログ/コンソールを強制的に表示"
+msgstr "プログラムログ/コンソールの表示を強制"
#: pcsx2/gui/AppInit.cpp:240
msgid "use fullscreen GS mode"
-msgstr "フルスクリーンGSモードを使用"
+msgstr "GS フルスクリーンモード"
#: pcsx2/gui/AppInit.cpp:241
msgid "use windowed GS mode"
-msgstr "ウィンドウGSモードを使用"
+msgstr "GS ウィンドウモード"
#: pcsx2/gui/AppInit.cpp:243
msgid "disables display of the gui while running games"
-msgstr "ゲーム実行中はGUI表示を無効化"
+msgstr "ゲーム実行中はGUI非表示"
#: pcsx2/gui/AppInit.cpp:244
msgid "executes an ELF image"
-msgstr "ELF イメージを実行"
+msgstr "ELFイメージの実行"
#: pcsx2/gui/AppInit.cpp:245
msgid "boots an empty dvd tray; use to enter the PS2 system menu"
-msgstr "DVD が入っていないまま起動します;PS2システムメニューを開始"
+msgstr "空ディスクドライブ起動。PS2のBIOSのシステムメニューに入れる。"
#: pcsx2/gui/AppInit.cpp:246
msgid "boots from the CDVD plugin (overrides IsoFile parameter)"
-msgstr "CDVD プラグインから起動します(IsoFileパラメータを無視)"
+msgstr "CDVDプラグインから起動する(IsoFileパラメータを無視します)"
#: pcsx2/gui/AppInit.cpp:248
msgid "disables all speedhacks"
-msgstr "全ての Speedhack を無効"
+msgstr "スピードハックを全て無効にする"
#: pcsx2/gui/AppInit.cpp:249
msgid "use the specified comma or pipe-delimited list of gamefixes."
-msgstr "Gamefix をパイプやカンマで区切った範囲で使用する。"
+msgstr "カンマ又はハイフンで仕分けられたゲーム修正リストを使用する。"
#: pcsx2/gui/AppInit.cpp:250
msgid "disables fast booting"
-msgstr "高速起動を無効"
+msgstr "急速起動を無効"
#: pcsx2/gui/AppInit.cpp:252
msgid "changes the configuration file path"
@@ -464,26 +464,26 @@ msgstr "設定ファイルのパスを変更"
#: pcsx2/gui/AppInit.cpp:253
msgid "specifies the PCSX2 configuration file to use"
-msgstr "PCSX2の設定ファイルは以下を使用します。"
+msgstr "PCSX2設定ファイルを指定する"
#: pcsx2/gui/AppInit.cpp:254
#, c-format
msgid "forces %s to start the First-time Wizard"
-msgstr "強制 %s はスタートアップウィザードを実行させます。"
+msgstr "初回設定ウィザードの開始を%sに強制する"
#: pcsx2/gui/AppInit.cpp:255
msgid "enables portable mode operation (requires admin/root access)"
-msgstr "ポータブルモードの操作を有効にする(管理者/rootの権限が必要)。"
+msgstr "ポータブルモード操作を有効化(要:管理者権限/ルート権限)"
#: pcsx2/gui/AppInit.cpp:259
#, c-format
msgid "specify the file to use as the %s plugin"
-msgstr "%s プラグインを使用するように指定する"
+msgstr "[%s]プラグインとして使用するファイルを指定"
#: pcsx2/gui/AppInit.cpp:307
#, c-format
msgid "Plugin Override Error - %s"
-msgstr "プラグインの上書きエラー - %s"
+msgstr "プラグイン上書きエラー - [%s]"
#: pcsx2/gui/AppInit.cpp:310
#, c-format
@@ -492,30 +492,30 @@ msgid ""
"valid %s plugin:\n"
"\n"
msgstr ""
-"%s プラグインの上書きエラー! %s プラグインは存在しないか、有効なプラグインで"
-"はありません。\n"
+"[%s]プラグイン上書きエラー。次のファイルは存在しないか無効な[%s]プラグインで"
+"す:\n"
"\n"
#: pcsx2/gui/AppInit.cpp:317
#, c-format
msgid "Press OK to use the default configured plugin, or Cancel to close %s."
msgstr ""
-"OK を押してデフォルトのプラグインを使用するか、キャンセルを押して%sを閉じてく"
-"ださい。"
+"OKを押してデフォルトプラグインを使用するか、キャンセルを押して%sを閉じて下さ"
+"い。"
#: pcsx2/gui/AppInit.cpp:496
msgid "PCSX2 Error: Hardware Deficiency"
-msgstr "PCSX2 エラー:要求するハードウェアの基準を満たしていません"
+msgstr "PCSX2エラー: ハードウェア構成は最低基準を満たしていません。"
#: pcsx2/gui/AppInit.cpp:496 pcsx2/gui/AppInit.cpp:508
#, c-format
msgid "Press OK to close %s."
-msgstr "OKを押して%sを閉じます。"
+msgstr "OKを押して%sを閉じて下さい。"
#: pcsx2/gui/AppInit.cpp:509
#, c-format
msgid "%s Critical Error"
-msgstr "%s の重大なエラー"
+msgstr "%s 重大なエラー"
#: pcsx2/gui/AppInit.cpp:679
msgid "OK"
@@ -523,7 +523,7 @@ msgstr "OK"
#: pcsx2/gui/AppInit.cpp:680
msgid "&OK"
-msgstr "OK(&O)"
+msgstr "OK"
#: pcsx2/gui/AppInit.cpp:681
msgid "Cancel"
@@ -531,7 +531,7 @@ msgstr "キャンセル"
#: pcsx2/gui/AppInit.cpp:682
msgid "&Cancel"
-msgstr "キャンセル(&C)"
+msgstr "キャンセル"
#: pcsx2/gui/AppInit.cpp:683
msgid "&Apply"
@@ -539,7 +539,7 @@ msgstr "適用(&A)"
#: pcsx2/gui/AppInit.cpp:684
msgid "&Next >"
-msgstr "次へ>(&N)"
+msgstr "次へ(&N)>"
#: pcsx2/gui/AppInit.cpp:685
msgid "< &Back"
@@ -547,19 +547,19 @@ msgstr "<戻る(&B)"
#: pcsx2/gui/AppInit.cpp:686
msgid "&Back"
-msgstr "戻る(&B)"
+msgstr "戻る"
#: pcsx2/gui/AppInit.cpp:687
msgid "&Finish"
-msgstr "完了(&F)"
+msgstr "完了"
#: pcsx2/gui/AppInit.cpp:688
msgid "&Yes"
-msgstr "はい(&Y)"
+msgstr "はい"
#: pcsx2/gui/AppInit.cpp:689
msgid "&No"
-msgstr "いいえ(&N)"
+msgstr "いいえ"
#: pcsx2/gui/AppInit.cpp:690
msgid "Browse"
@@ -567,11 +567,11 @@ msgstr "参照"
#: pcsx2/gui/AppInit.cpp:691
msgid "&Save"
-msgstr "保存(&S)"
+msgstr "セーブ(S)"
#: pcsx2/gui/AppInit.cpp:692
msgid "Save &As..."
-msgstr "名前を付けて保存(&A)..."
+msgstr "名前をつけて保存(&A)..."
#: pcsx2/gui/AppInit.cpp:693
msgid "&Help"
@@ -583,7 +583,7 @@ msgstr "ホーム(&H)"
#: pcsx2/gui/AppInit.cpp:696
msgid "Show about dialog"
-msgstr "アバウトダイアログを表示します"
+msgstr "PCSX2についてを表示する"
#: pcsx2/gui/AppMain.cpp:87
msgid ""
@@ -593,31 +593,31 @@ msgid ""
msgstr ""
"\n"
"\n"
-"OK を押してプラグイン設定パネルを開いてください。"
+"OKを押してプラグイン設定画面に移動します。"
#: pcsx2/gui/AppMain.cpp:140 pcsx2/gui/AppMain.cpp:154
msgid ""
"Warning! System plugins have not been loaded. PCSX2 may be inoperable."
msgstr ""
-"警告!システムプラグインが読み込まれていないため、PCSX2が動作しなくなる可能性"
-"があります。"
+"警告: システムプラグインがロードされませんでした。PCSX2を実行できないかもし"
+"れません。"
#: pcsx2/gui/AppMain.cpp:309
#, c-format
msgid "%s Commandline Options"
-msgstr "%s コマンドラインオプション"
+msgstr "%s コマンドラインオプション"
#: pcsx2/gui/AppMain.cpp:573
msgid "PS2 BIOS Error"
-msgstr "PS2 BIOS エラー"
+msgstr "PS2BIOSエラー"
#: pcsx2/gui/AppMain.cpp:574
msgid "Press Ok to go to the BIOS Configuration Panel."
-msgstr "OK を押してBIOS設定に移動してください。"
+msgstr "OKを押してBIOS設定画面に移動します。"
#: pcsx2/gui/AppMain.cpp:626
msgid "PCSX2 Unresponsive Thread"
-msgstr "PCSX2 スレッドが応答しません"
+msgstr "PCSX2 スレッドの応答がありません"
#: pcsx2/gui/AppMain.cpp:636
msgid "Terminate"
@@ -625,11 +625,11 @@ msgstr "終了"
#: pcsx2/gui/AppMain.cpp:963
msgid "Executing PS2 Virtual Machine..."
-msgstr "PS2仮想マシンを実行します..."
+msgstr "PS2仮想マシン実行中..."
#: pcsx2/gui/AppRes.cpp:72
msgid "Browse for an Iso that is not in your recent history."
-msgstr "最近使ったISOファイルを参照します。"
+msgstr "ISOイメージを参照します。"
#: pcsx2/gui/AppRes.cpp:72
msgid "Browse..."
@@ -637,11 +637,11 @@ msgstr "参照..."
#: pcsx2/gui/AppUserMode.cpp:99
msgid "The following folders exist, but are not writable:"
-msgstr "以下のフォルダは存在していますが、書き込みができません:"
+msgstr "次のフォルダはありましたが、書き込み権限が不足しています:"
#: pcsx2/gui/AppUserMode.cpp:104
msgid "The following folders are missing and cannot be created:"
-msgstr "以下のフォルダは見つからず、作成することができません:"
+msgstr "次のフォルダがありません、作成する事もできません:"
#: pcsx2/gui/AppUserMode.cpp:144
#, c-format
@@ -653,167 +653,170 @@ msgid ""
"PCSX2 has been installed as a portable application but cannot run due to the "
"following errors:"
msgstr ""
-"PCSX2はポータブルモードでインストールされていますが、以下のエラーのため実行す"
-"ることができません:"
+"PCSX2はポータブルアプリケーションとしてインストールされましたが、次に掲げる理"
+"由により実行する事ができません:"
#: pcsx2/gui/AppUserMode.cpp:165
msgid "Switch to User Documents Mode"
-msgstr "ユーザードキュメントモードに切り替え"
+msgstr "ユーザドキュメントモードに切り替える"
#: pcsx2/gui/AppUserMode.cpp:178
#, c-format
msgid "%s is switching to local install mode."
-msgstr "%s をローカルインストールモードに切り替えます。"
+msgstr "%sはローカルインストールモードに切り替ります。"
#: pcsx2/gui/AppUserMode.cpp:179
msgid ""
"Try to remove the file called \"portable.ini\" from your installation "
"directory manually."
-msgstr "\"portable.ini\" というファイルを手動で削除してみてください。"
+msgstr ""
+"インストールした場所から\"portable.ini\"ファイルを手動で除去してみて下さい。"
#: pcsx2/gui/ApplyState.h:55
msgid "Cannot apply new settings, one of the settings is invalid."
-msgstr "設定を適用できません。いくつかの設定が無効です。"
+msgstr "新規の設定を適用する事ができません、無効な設定があります。"
#: pcsx2/gui/ConsoleLogger.cpp:120
msgid "Save log question"
-msgstr "ログの問題を保存"
+msgstr "ログのセーブ"
#: pcsx2/gui/ConsoleLogger.cpp:413
msgid "Fits a lot of log in a microcosmically small area."
-msgstr "小スペースに大量のログを表示します。"
+msgstr "沢山のログを蚤より果てしなく小さなエリアに収められる。"
#: pcsx2/gui/ConsoleLogger.cpp:413
msgid "Small"
-msgstr "小さく"
+msgstr "小"
#: pcsx2/gui/ConsoleLogger.cpp:415
msgid "It's what I use (the programmer guy)."
-msgstr "それは私(プログラマたち)が使用します。"
+msgstr "私が使ってる奴だ(byプログラマの人)。"
#: pcsx2/gui/ConsoleLogger.cpp:415 pcsx2/gui/Panels/CpuPanel.cpp:38
msgid "Normal"
-msgstr "通常"
+msgstr "Normal"
#: pcsx2/gui/ConsoleLogger.cpp:417
msgid "Its nice and readable."
-msgstr "読みやすくてナイスです。"
+msgstr "きれいで読みやすい。"
#: pcsx2/gui/ConsoleLogger.cpp:417
msgid "Large"
-msgstr "大きく"
+msgstr "大"
#: pcsx2/gui/ConsoleLogger.cpp:419
msgid "Huge"
-msgstr "巨大に"
+msgstr "特大"
#: pcsx2/gui/ConsoleLogger.cpp:419
msgid "In case you have a really high res display."
-msgstr "非常に高い解像度にした場合。"
+msgstr "メガ高解像度なディスプレイを持っている人用。"
#: pcsx2/gui/ConsoleLogger.cpp:423
msgid "Default soft-tone color scheme."
-msgstr "デフォルトのソフトな配色。"
+msgstr "デフォルトのソフトトーンカラースキーム。"
#: pcsx2/gui/ConsoleLogger.cpp:423
msgid "Light theme"
-msgstr "明るいテーマ"
+msgstr "ライトテーマ"
#: pcsx2/gui/ConsoleLogger.cpp:424
msgid ""
"Classic black color scheme for people who enjoy having text seared into "
"their optic nerves."
-msgstr "クラシックな黒い配色。文字を見えやすくしたい場合などに。"
+msgstr ""
+"クラシックブラックカラースキーム、テキストを視神経に焼き付けられるのが大好き"
+"な人用。"
#: pcsx2/gui/ConsoleLogger.cpp:424
msgid "Dark theme"
-msgstr "暗いテーマ"
+msgstr "ダークテーマ"
#: pcsx2/gui/ConsoleLogger.cpp:427
msgid "Always on Top"
-msgstr "常に前面に表示"
+msgstr "常に最前面"
#: pcsx2/gui/ConsoleLogger.cpp:428
msgid ""
"When checked the log window will be visible over other foreground windows."
-msgstr "チェックするとログウィンドウを常に手前に表示します。"
+msgstr "チェックを入れるとログウィンドウは最前面に表示されます。"
#: pcsx2/gui/ConsoleLogger.cpp:430
msgid "&Save..."
-msgstr "保存(&S)..."
+msgstr "保存..."
#: pcsx2/gui/ConsoleLogger.cpp:430
msgid "Save log contents to file"
-msgstr "ログの内容を保存"
+msgstr "ログ内容をファイルに保存"
#: pcsx2/gui/ConsoleLogger.cpp:431
msgid "C&lear"
-msgstr "クリア(&L)"
+msgstr "クリア"
#: pcsx2/gui/ConsoleLogger.cpp:431
msgid "Clear the log window contents"
-msgstr "ログウィンドウの内容を消去"
+msgstr "ログウィンドウの内容をクリア"
#: pcsx2/gui/ConsoleLogger.cpp:433 pcsx2/gui/Dialogs/SysConfigDialog.cpp:280
msgid "Appearance"
-msgstr "アピアランス"
+msgstr "外観テーマ"
#: pcsx2/gui/ConsoleLogger.cpp:435
msgid "&Close"
-msgstr "閉じる(&C)"
+msgstr "閉じる"
#: pcsx2/gui/ConsoleLogger.cpp:435
msgid "Close this log window; contents are preserved"
-msgstr "ログウィンドウを閉じます。内容は保持されます。"
+msgstr "ログウィンドウを閉じる(内容は保たれます)。"
#: pcsx2/gui/ConsoleLogger.cpp:439
msgid "Dev/Verbose"
-msgstr "開発用/詳細"
+msgstr "開発者詳細表示"
#: pcsx2/gui/ConsoleLogger.cpp:439
msgid "Shows PCSX2 developer logs"
-msgstr "PCSX2開発者向けログを表示"
+msgstr "PCSX2開発者のログを表示"
#: pcsx2/gui/ConsoleLogger.cpp:440
msgid "CDVD reads"
-msgstr "CDVDのリード"
+msgstr "CDVD読み込み"
#: pcsx2/gui/ConsoleLogger.cpp:440
msgid "Shows disk read activity"
-msgstr "ディスク読み込み動作を表示"
+msgstr "ディスク読み込みアクティビティを表示"
#: pcsx2/gui/ConsoleLogger.cpp:457
msgid "Enable all"
-msgstr "すべてを有効"
+msgstr "全て有効化"
#: pcsx2/gui/ConsoleLogger.cpp:457
msgid "Enables all log source filters."
-msgstr "全てのログソースフィルタを有効"
+msgstr "全てのログソースフィルタを有効にします。"
#: pcsx2/gui/ConsoleLogger.cpp:458
msgid "Disable all"
-msgstr "すべてを無効"
+msgstr "全て無効化"
#: pcsx2/gui/ConsoleLogger.cpp:458
msgid "Disables all log source filters."
-msgstr "全てのログソースフィルタを無効"
+msgstr "全てのログソースフィルタを無効にします。"
#: pcsx2/gui/ConsoleLogger.cpp:460
msgid "&Log"
-msgstr "ログ(&L)"
+msgstr "ログ"
#: pcsx2/gui/ConsoleLogger.cpp:461
msgid "&Sources"
-msgstr "ソース(&S)"
+msgstr "ソース"
#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:35
#, c-format
msgid "About %s"
-msgstr "%s について"
+msgstr "%sについて"
#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:55
msgid "Betatesting"
-msgstr "ベータテスタ"
+msgstr "ベータテスター"
#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:55
msgid "Previous versions"
@@ -825,15 +828,15 @@ msgstr "ウェブマスター"
#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:66
msgid "Plugin Specialists"
-msgstr "プラグインのスペシャリスト"
+msgstr "プラグインスペシャリスト"
#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:66
msgid "Special thanks to"
-msgstr "スペシャルサンクス"
+msgstr "多謝"
#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:82
msgid "Developers"
-msgstr "開発者"
+msgstr "開発陣"
#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:84
msgid "Contributors"
@@ -841,52 +844,53 @@ msgstr "貢献者"
#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:98
msgid "A Playstation 2 Emulator"
-msgstr "Playstation 2 エミュレータ"
+msgstr "プレイステーション2 エミュレータ"
#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:102
msgid "PCSX2 Official Website and Forums"
-msgstr "PCSX2 公式サイト & フォーラム"
+msgstr "PCSX2公式ウェブサイトとフォーラム"
#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:106
msgid "PCSX2 Official Svn Repository at Googlecode"
-msgstr "PCSX2 公式 SVN リポジトリ (Googlecode)"
+msgstr "PCSX2公式SVNレポジトリ - グーグルコード"
#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:110
msgid "I've seen enough"
-msgstr "十分に見たよ"
+msgstr "十分にみました"
#: pcsx2/gui/Dialogs/AssertionDialog.cpp:23
msgid "Assertion Failure - "
-msgstr "アサーションの失敗 -"
+msgstr "表明違反 - "
#: pcsx2/gui/Dialogs/BaseConfigurationDialog.cpp:193
msgid "Saves a snapshot of this settings panel to a PNG file."
-msgstr "この設定画面のスナップショットをPNGファイルで保存"
+msgstr "表示している設定画面のスナップショットをPNG形式で保存します。"
#: pcsx2/gui/Dialogs/BaseConfigurationDialog.cpp:308
msgid "Save dialog screenshots to..."
-msgstr "スナップショットの保存ダイアログ..."
+msgstr "スナップショットを保存する..."
#: pcsx2/gui/Dialogs/BiosSelectorDialog.cpp:31
msgid "BIOS Selector"
-msgstr "BIOS セレクタ"
+msgstr "BIOS選択"
#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:193
msgid "Do not show this dialog again."
-msgstr "再びこのダイアログを表示しない"
+msgstr "今後、このメッセージを表示しない。"
#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:199
msgid ""
"Disables this popup and whatever response you select here will be "
"automatically used from now on."
-msgstr "このポップアップを無効にして、どのような動作にするか指定してください。"
+msgstr ""
+"このポップアップを無効にし、ここで選択したオプションは今後自動的に適用されま"
+"す。"
#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:201
msgid ""
"The popup will not be shown again. This setting can be undone from the "
"settings panels."
-msgstr ""
-"このポップアップは表示されなくなります。この設定は設定パネルで元に戻せます。"
+msgstr "ポップアップは今後表示されません。設定パネルで元に戻す事ができます。"
#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:247
#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:292
@@ -899,7 +903,7 @@ msgstr "リセット"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:40
msgid "Create a new memory card"
-msgstr "メモリカードの新規作成"
+msgstr "メモリーカードを新規作成"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:59
#: pcsx2/gui/Panels/DirPickerPanel.cpp:74
@@ -909,101 +913,100 @@ msgstr "作成"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:71
msgid "New memory card:"
-msgstr "新規メモリカード名:"
+msgstr "新規メモリーカード:"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:72
msgid "At folder: "
-msgstr "フォルダ:"
+msgstr "保存先:"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:75
msgid "Select file name: "
-msgstr "メモリカード名:"
+msgstr "ファイル名:"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:149
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:855
#, c-format
msgid "Error (%s)"
-msgstr "エラーです (%s)"
+msgstr "エラー (%s)"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:150
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:164
msgid "Create memory card"
-msgstr "メモリーカードの新規作成"
+msgstr "メモリーカードの作成"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:163
msgid "Error: The memory card could not be created."
-msgstr "エラー:メモリーカードは作成できませんでした。"
+msgstr "エラー: メモリーカードの作成ができませんでした。"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:177
msgid "Use NTFS compression when creating this card."
-msgstr "このカードにNTFS圧縮を利用する"
+msgstr "NTFS圧縮を利用して作成する。"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:195
msgid "8 MB [most compatible]"
-msgstr "8 MB [最も互換性が高い]"
+msgstr "8MB [最上位の互換性]"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:195
msgid ""
"This is the standard Sony-provisioned size, and is supported by all games "
"and BIOS versions."
-msgstr ""
-"SONY製の標準的なメモリサイズ。全てのゲームとBIOSでサポートされています。"
+msgstr "ソニー純正サイズで全てのゲームとBIOSバージョンでサポートされています。"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:196
msgid ""
"Always use this option if you want the safest and surest memory card "
"behavior."
msgstr ""
-"メモリカードの最も安全で確実な動作を望むなら、このオプションを使用してくださ"
-"い。"
+"最も確実で安全なメモリーカードの挙動を求めるならば、このオプションを必ず選択"
+"して下さい。"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:199
msgid "16 MB"
-msgstr "16 MB"
+msgstr "16MB"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:199
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:203
msgid ""
"A typical size for 3rd-party memory cards which should work with most games."
msgstr ""
-"サードパーティ製の一般的なメモリサイズ。ほとんどのゲームで動作するはずです。"
+"サードパーティー製メモリーカードでよくあるサイズです、ほとんどのゲームで問題"
+"無く動作します。"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:200
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:204
msgid "16 and 32 MB cards have roughly the same compatibility factor."
-msgstr "16 MB と 32 MB のメモリーカードの互換性は同等程度です。"
+msgstr "16MB、32MBカードは同程度の互換性能を有します。"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:203
msgid "32 MB"
-msgstr "32 MB"
+msgstr "32MB"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:207
msgid "64 MB"
-msgstr "64 MB"
+msgstr "64MB"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:207
msgid ""
"Low compatibility warning: Yes it's very big, but may not work with many "
"games."
-msgstr ""
-"低互換性の警告:とても大きいメモリサイズですが、多くのゲームで動作しない可能"
-"性があります。"
+msgstr "互換性警告:確かに大容量ですが、一部のゲームにしか使用できません。"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:208
msgid ""
"Use at your own risk. Erratic memory card behavior is possible (though "
"unlikely)."
msgstr ""
-"不安定なメモリーカードの使用は自己責任でお願いします(運がよければ大丈夫)。"
+"自己責任で使用して下さい。メモリーカードの誤作動は可能性としてあります(ほと"
+"んど無いですが)。"
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:47
#, c-format
msgid "Select a folder for %s settings"
-msgstr "%s の設定用のフォルダを選択"
+msgstr "%s設定の保存先フォルダを指定して下さい"
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:47
msgid "Settings"
-msgstr "設定"
+msgstr "フォルダ設定"
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:81
msgid "Language selector"
@@ -1014,25 +1017,25 @@ msgid ""
"Change the language only if you need to.\n"
"The system default should be fine for most operating systems."
msgstr ""
-"必要であれば言語を変更してください。\n"
-"通常であれば System Default で構いません。"
+"言語の変更が必要な場合は選択して下さい。\n"
+"通常は「System Default」のままでかまいません。"
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:90
msgid "Welcome to PCSX2!"
-msgstr "PCSX2にようこそ!"
+msgstr "PCSX2へようこそ!"
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:104
msgid "Configuration Guides (online)"
-msgstr "構成ガイド(オンライン)"
+msgstr "設定ガイド集(オンライン)"
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:108
msgid "Readme / FAQ (Offline/PDF)"
-msgstr "Readme / FAQ (オフライン/PDF)"
+msgstr "Readme / FAQ (オフライン / PDF)"
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:117
#, c-format
msgid "%s First Time Configuration"
-msgstr "%s スタートアップウィザード"
+msgstr "%s初回起動設定"
#: pcsx2/gui/Dialogs/GameDatabaseDialog.cpp:24
#, c-format
@@ -1041,7 +1044,7 @@ msgstr "ゲームデータベース - %s"
#: pcsx2/gui/Dialogs/ImportSettingsDialog.cpp:24
msgid "Import Existing Settings?"
-msgstr "既存の設定を読み込みますか?"
+msgstr "既存の設定をインポートしますか?"
#: pcsx2/gui/Dialogs/ImportSettingsDialog.cpp:39
msgid "Import"
@@ -1057,15 +1060,15 @@ msgstr "トレースログ"
#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:40
msgid "Auto-eject memory cards when loading savestates"
-msgstr "ステートセーブ読み込み時にメモリカードを自動で取り出す"
+msgstr "セーブステートをロードする時にメモリーカードを自動的に取り出す"
#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:96
msgid "MemoryCard Manager"
-msgstr "メモリカードマネージャ"
+msgstr "メモリーカードマネージャ"
#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:112
msgid "Drag cards to or from PS2-ports"
-msgstr "カードをPS2ポートにドラッグしてください。"
+msgstr "メモリーカードをドラッグ&ドロップで操作できます。"
#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:113
msgid ""
@@ -1073,28 +1076,29 @@ msgid ""
"Note: Duplicate/Rename/Create/Delete will NOT be reverted with 'Cancel'."
msgstr ""
"\n"
-"注意:複製/名称変更/作成/削除はキャンセルで戻せません。"
+"メモ: 複製、名前の変更、作成、削除などの操作は「キャンセル」を押しても復旧し"
+"ません。"
#: pcsx2/gui/Dialogs/PickUserModeDialog.cpp:24
msgid "PCSX2 First Time configuration"
-msgstr "PCSX2 初期設定"
+msgstr "PCSX2初回起動設定"
#: pcsx2/gui/Dialogs/PickUserModeDialog.cpp:29
#, c-format
msgid "%s is starting from a new or unknown folder and needs to be configured."
-msgstr "%s を新規/未知のフォルダで始める場合、設定をする必要があります。"
+msgstr "%sは別の又は未知のフォルダから起動しています、設定する必要があります。"
#: pcsx2/gui/Dialogs/StuckThreadDialog.cpp:28
msgid "PCSX2 Thread is not responding"
-msgstr "PCSX2 スレッドが応答しません。"
+msgstr "PCSX2スレッドの応答がありません。"
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:36
msgid "Config Overrides Warning"
-msgstr "上書きの警告を設定"
+msgstr "通常設定無効化警告"
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:56
msgid "Components Overrides Warning"
-msgstr "コンポーネントの上書き警告"
+msgstr "コンポーネント設定無視状態警告"
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:147
msgid "Preset:"
@@ -1103,7 +1107,7 @@ msgstr "プリセット:"
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:228
#, c-format
msgid "Emulation Settings - %s"
-msgstr "エミュレーション設定 - %s"
+msgstr "エムレーション設定 - %s"
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:237
msgid "EE/IOP"
@@ -1111,7 +1115,7 @@ msgstr "EE/IOP"
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:238
msgid "VUs"
-msgstr "VUs"
+msgstr "VU"
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:239
msgid "GS"
@@ -1119,20 +1123,20 @@ msgstr "GS"
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:240
msgid "GS Window"
-msgstr "GS ウィンドウ"
+msgstr "GSウィンドウ"
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:241
msgid "Speedhacks"
-msgstr "Speedhack"
+msgstr "スピードハック"
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:242
msgid "Game Fixes"
-msgstr "Gamefix"
+msgstr "ゲーム修正"
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:253
#, c-format
msgid "Components Selectors - %s"
-msgstr "コンポーネントの選択 - %s"
+msgstr "コンポーネント選択 - %s"
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:260
msgid "Plugins"
@@ -1144,77 +1148,77 @@ msgstr "BIOS"
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:262
msgid "Folders"
-msgstr "フォルダ"
+msgstr "フォルダ管理"
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:273
#, c-format
msgid "Appearance/Themes - %s"
-msgstr "アピアランス/テーマ - %s"
+msgstr "外観テーマ - %s"
#: pcsx2/gui/ExecutorThread.cpp:40
msgid "Logs events as they are passed to the PS2 virtual machine."
-msgstr "PS2 仮想マシンに渡されてからイベントを記録します。"
+msgstr "PS2仮想マシンに送られるイベントのログ"
#: pcsx2/gui/ExecutorThread.cpp:430
msgid "Press Cancel to attempt to cancel the action."
-msgstr "キャンセルを押して操作をキャンセルします。"
+msgstr "キャンセルを押して現在のこの操作をキャンセルします"
#: pcsx2/gui/ExecutorThread.cpp:431
#, c-format
msgid "Press Terminate to kill %s immediately."
-msgstr "終了を押して%sを終わらせます。"
+msgstr "終了を押して%sを強制終了します。"
#: pcsx2/gui/ExecutorThread.cpp:434
msgid "Terminate App"
-msgstr "終了させるアプリケーション"
+msgstr "アプリケーションの終了"
#: pcsx2/gui/FrameForGS.cpp:384
msgid "GS Output is Disabled!"
-msgstr "GS出力が無効です!"
+msgstr "GS出力は無効です!"
#: pcsx2/gui/GlobalCommands.cpp:387 pcsx2/gui/MainFrame.cpp:414
msgid "Save state"
-msgstr "ステートセーブ"
+msgstr "セーブステート"
#: pcsx2/gui/GlobalCommands.cpp:388
msgid "Saves the virtual machine state to the current slot."
-msgstr "現在のスロットにステートセーブを保存します。"
+msgstr "仮想マシンステートを選択スロットにセーブします"
#: pcsx2/gui/GlobalCommands.cpp:393 pcsx2/gui/MainFrame.cpp:413
msgid "Load state"
-msgstr "ステートロード"
+msgstr "ロードステート"
#: pcsx2/gui/GlobalCommands.cpp:394
msgid "Loads a virtual machine state from the current slot."
-msgstr "現在のスロットからステートセーブを読み込みます。"
+msgstr "仮想マシンステートを選択スロットからロードします。"
#: pcsx2/gui/GlobalCommands.cpp:399
msgid "Load State Backup"
-msgstr "ステートセーブ(バックアップ)をロード"
+msgstr "ロードバックアップステート"
#: pcsx2/gui/GlobalCommands.cpp:400
msgid "Loads virtual machine state backup for current slot."
-msgstr "現在のスロットからバックアップのステートセーブをロードする。"
+msgstr "仮想マシンステートを選択スロットのバックアップからロードします。"
#: pcsx2/gui/GlobalCommands.cpp:405
msgid "Cycle to next slot"
-msgstr "次のスロットへ"
+msgstr "次のスロットへ進む"
#: pcsx2/gui/GlobalCommands.cpp:406
msgid "Cycles the current save slot in +1 fashion!"
-msgstr "ステートセーブの場所を1つ次のスロットへ移します。"
+msgstr "現在のセーブスロットから+1サイクル移動します。"
#: pcsx2/gui/GlobalCommands.cpp:411
msgid "Cycle to prev slot"
-msgstr "前のスロットへ"
+msgstr "前のスロットへ戻る"
#: pcsx2/gui/GlobalCommands.cpp:412
msgid "Cycles the current save slot in -1 fashion!"
-msgstr "ステートセーブの場所を1つ前のスロットへ移します。"
+msgstr "現在のセーブスロットから-1サイクル移動します。"
#: pcsx2/gui/IsoDropTarget.cpp:57
msgid "Drag and Drop Error"
-msgstr "ドラッグ&ドロップエラー"
+msgstr "ドラッグ&ドロップエラー"
#: pcsx2/gui/IsoDropTarget.cpp:58
#, c-format
@@ -1222,12 +1226,12 @@ msgid ""
"It is an error to drop multiple files onto a %s window. One at a time "
"please, thank you."
msgstr ""
-"%s ウィンドウに複数のファイルをドロップすることはできません。1つずつお願いし"
-"ます。"
+"いくつも%sウィンドウにドロップするとエラーになります。1つずつでお願いします"
+"ね。"
#: pcsx2/gui/IsoDropTarget.cpp:89 pcsx2/gui/MainMenuClicks.cpp:342
msgid "Confirm PS2 Reset"
-msgstr "PS2 リセットの確認"
+msgstr "PS2リセット確認"
#: pcsx2/gui/IsoDropTarget.cpp:91
#, c-format
@@ -1235,18 +1239,18 @@ msgid ""
"You have dropped the following ELF binary into %s:\n"
"\n"
msgstr ""
-"以下の ELF バイナリは欠落しています %s\n"
+"次のEFLバイナリを%sにドロップしました:\n"
"\n"
#: pcsx2/gui/IsoDropTarget.cpp:135
#, c-format
msgid "You have dropped the following ISO image into %s:"
-msgstr "ISO イメージ %s は欠落しています。"
+msgstr "次のISOイメージを%sにドロップしました:"
#: pcsx2/gui/MainFrame.cpp:38
#, c-format
msgid "Slot %d"
-msgstr "スロット%d"
+msgstr "スロット %d"
#: pcsx2/gui/MainFrame.cpp:44 pcsx2/gui/Saveslots.cpp:150
msgid "Backup"
@@ -1258,7 +1262,7 @@ msgstr "コンソールを表示"
#: pcsx2/gui/MainFrame.cpp:325
msgid "Console to Stdio"
-msgstr "コンソールはStdioに"
+msgstr "コンソールから標準IOへ"
#: pcsx2/gui/MainFrame.cpp:338
msgid "&System"
@@ -1266,7 +1270,7 @@ msgstr "システム(&S)"
#: pcsx2/gui/MainFrame.cpp:339
msgid "CD&VD"
-msgstr "CDVD(&V)"
+msgstr "CD&VD"
#: pcsx2/gui/MainFrame.cpp:340
msgid "&Config"
@@ -1292,7 +1296,7 @@ msgstr "%s %d.%d.%d %s"
#: pcsx2/gui/MainFrame.cpp:362
msgid "(modded)"
-msgstr "(修正済)"
+msgstr "(改変済)"
#: pcsx2/gui/MainFrame.cpp:399 pcsx2/gui/MainFrame.cpp:401
#: pcsx2/gui/MainFrame.cpp:407
@@ -1301,31 +1305,31 @@ msgstr "初期化中..."
#: pcsx2/gui/MainFrame.cpp:403
msgid "Run ELF..."
-msgstr "ELFファイルを開く..."
+msgstr "ELF実行..."
#: pcsx2/gui/MainFrame.cpp:404
msgid "For running raw PS2 binaries directly"
-msgstr "PS2のrawバイナリを実行します。"
+msgstr "PS2のバイナリを直接実行します"
#: pcsx2/gui/MainFrame.cpp:416
msgid "Backup before save"
-msgstr "バックアップしてからセーブ"
+msgstr "バックアップしてセーブ"
#: pcsx2/gui/MainFrame.cpp:421
msgid "Automatic Gamefixes"
-msgstr "自動Gamefix"
+msgstr "自動ゲーム修正"
#: pcsx2/gui/MainFrame.cpp:422
msgid "Automatically applies needed Gamefixes to known problematic games"
-msgstr "fixが必要なゲームに自動的に適用されます。"
+msgstr "既知のゲーム修正を自動的に適用します"
#: pcsx2/gui/MainFrame.cpp:424
msgid "Enable Cheats"
-msgstr "チートを有効"
+msgstr "チート有効化"
#: pcsx2/gui/MainFrame.cpp:427
msgid "Enable Host Filesystem"
-msgstr "Host Filesystemを有効"
+msgstr "Host Filesystem有効化"
#: pcsx2/gui/MainFrame.cpp:432
msgid "Shutdown"
@@ -1333,7 +1337,7 @@ msgstr "シャットダウン"
#: pcsx2/gui/MainFrame.cpp:433
msgid "Wipes all internal VM states and shuts down plugins."
-msgstr "VMのデータを削除しプラグインを終了して、エミュレーションを終了します。"
+msgstr "内部仮想マシンステートをクリアにしプラグインを終了します。"
#: pcsx2/gui/MainFrame.cpp:435
msgid "Exit"
@@ -1342,11 +1346,11 @@ msgstr "終了"
#: pcsx2/gui/MainFrame.cpp:436
#, c-format
msgid "Closing %s may be hazardous to your health"
-msgstr "%s を終了します。"
+msgstr "%sを閉じる事はあなたの健康を損なうおそれがあります"
#: pcsx2/gui/MainFrame.cpp:443
msgid "Iso Selector"
-msgstr "ISOファイルの選択"
+msgstr "ISO選択"
#: pcsx2/gui/MainFrame.cpp:444
msgid "Plugin Menu"
@@ -1354,55 +1358,55 @@ msgstr "プラグインメニュー"
#: pcsx2/gui/MainFrame.cpp:447
msgid "Iso"
-msgstr "ISOイメージ"
+msgstr "ISO"
#: pcsx2/gui/MainFrame.cpp:447
msgid "Makes the specified ISO image the CDVD source."
-msgstr "CDVDのISOイメージを参照します。"
+msgstr "指定されたISOイメージをCDVDのソースにします。"
#: pcsx2/gui/MainFrame.cpp:448
msgid "Plugin"
-msgstr "プラグイン使用"
+msgstr "プラグイン"
#: pcsx2/gui/MainFrame.cpp:448
msgid "Uses an external plugin as the CDVD source."
-msgstr "外部プラグインを使用してCDVDを参照します。"
+msgstr "CDVDソースに外部プラグインを使用する。"
#: pcsx2/gui/MainFrame.cpp:449
msgid "No disc"
-msgstr "ディスクなし"
+msgstr "ディスク無し"
#: pcsx2/gui/MainFrame.cpp:449
msgid "Use this to boot into your virtual PS2's BIOS configuration."
-msgstr "ディスクなしで起動して、PS2のBIOS設定を行う事ができます。"
+msgstr "PS2のBIOS設定に入る時に使います。"
#: pcsx2/gui/MainFrame.cpp:457
msgid "Emulation &Settings"
-msgstr "エミュレーション&設定"
+msgstr "エミュレーション設定(&S)"
#: pcsx2/gui/MainFrame.cpp:458
msgid "&Memory cards"
-msgstr "メモリカード(&M)"
+msgstr "メモリーカード(&M)"
#: pcsx2/gui/MainFrame.cpp:459
msgid "&Plugin/BIOS Selector"
-msgstr "プラグイン/BIOS (&P)"
+msgstr "プラグイン/BIOS選択(&P)"
#: pcsx2/gui/MainFrame.cpp:460 pcsx2/gui/Panels/GameDatabasePanel.cpp:346
msgid "Game Database Editor"
-msgstr "ゲームデーターベースエディタ"
+msgstr "ゲームデータベース編集"
#: pcsx2/gui/MainFrame.cpp:466
msgid "&Video (GS)"
-msgstr "グラフィックス (GS)(&V)"
+msgstr "ビデオ (GS) (&V)"
#: pcsx2/gui/MainFrame.cpp:467
msgid "&Audio (SPU2)"
-msgstr "サウンド (SPU2)(&A)"
+msgstr "オーディオ (SPU2) (&A)"
#: pcsx2/gui/MainFrame.cpp:468
msgid "&Controllers (PAD)"
-msgstr "コントローラー (PAD)(&C)"
+msgstr "コントローラ (PAD) (&C)"
#: pcsx2/gui/MainFrame.cpp:469
msgid "Dev9"
@@ -1418,122 +1422,121 @@ msgstr "Firewire"
#: pcsx2/gui/MainFrame.cpp:477
msgid "Multitap 1"
-msgstr "マルチタップ 1"
+msgstr "マルチタップ 1"
#: pcsx2/gui/MainFrame.cpp:478
msgid "Multitap 2"
-msgstr "マルチタップ 2"
+msgstr "マルチタップ 2"
#: pcsx2/gui/MainFrame.cpp:481
msgid "Clear all settings..."
-msgstr "全ての設定の初期化..."
+msgstr "全ての設定を初期化..."
#: pcsx2/gui/MainFrame.cpp:482
#, c-format
msgid "Clears all %s settings and re-runs the startup wizard."
-msgstr ""
-"%s の全ての設定を初期化して、スタートアップウィザードからやり直します。"
+msgstr "全ての%s設定を初期化し、次回起動時に初回設定ウィザードを実行します。"
#: pcsx2/gui/MainFrame.cpp:504
msgid "About..."
-msgstr "アバウト..."
+msgstr "PCSX2について"
#: pcsx2/gui/MainFrame.cpp:508
msgid "Logging..."
-msgstr "ロード中..."
+msgstr "ログ開始..."
#: pcsx2/gui/MainFrame.cpp:585
msgid "Pause"
-msgstr "一時停止"
+msgstr "ポーズ"
#: pcsx2/gui/MainFrame.cpp:586
msgid "Safely pauses emulation and preserves the PS2 state."
-msgstr "エミュレーションを安全に一時停止しPS2の状態を保持します。"
+msgstr "エミュレーションを安全に一時停止しPS2ステートを保持します。"
#: pcsx2/gui/MainFrame.cpp:593
msgid "Resume"
-msgstr "再開"
+msgstr "レジューム"
#: pcsx2/gui/MainFrame.cpp:594
msgid "Resumes the suspended emulation state."
-msgstr "エミュレーションを再開します。"
+msgstr "中断されたエミュレーションステートを再開します。"
#: pcsx2/gui/MainFrame.cpp:598
msgid "Pause/Resume"
-msgstr "一時停止/再開"
+msgstr "ポーズ/レジューム"
#: pcsx2/gui/MainFrame.cpp:599
msgid "No emulation state is active; cannot suspend or resume."
-msgstr "エミュレータが実行されていないため、一時停止/再開はできません。"
+msgstr ""
+"アクティブなエミュレーションステートがありません。中断、再開ができません。"
#: pcsx2/gui/MainFrame.cpp:608
msgid "Restart"
-msgstr "再起動"
+msgstr "リスタート"
#: pcsx2/gui/MainFrame.cpp:609
msgid "Simulates hardware reset of the PS2 virtual machine."
-msgstr "エミュレーションハードウェアはPS2仮想マシンをリセットします。"
+msgstr "PS2仮想マシンでハードウェアリセットをシミュレートします。"
#: pcsx2/gui/MainFrame.cpp:614
msgid "No emulation state is active; boot something first."
msgstr ""
-"エミュレーションしていないのでステートセーブはアクティブではありません。まず"
-"何かを起動してください。"
+"アクティブなエミュレーションステートがありません。先に何か起動して下さい。"
#: pcsx2/gui/MainFrame.cpp:622
msgid "Reboot CDVD (full)"
-msgstr "CDVDから再起動"
+msgstr "CDVD再起動 (フル)"
#: pcsx2/gui/MainFrame.cpp:623
msgid "Hard reset of the active VM."
-msgstr "アクティブなVMをハードリセットを行います。"
+msgstr "仮想マシンのハードリセットを行います。"
#: pcsx2/gui/MainFrame.cpp:627
msgid "Boot CDVD (full)"
-msgstr "CDVDから起動"
+msgstr "CDVD起動 (フル)"
#: pcsx2/gui/MainFrame.cpp:628
msgid "Boot the VM using the current DVD or Iso source media"
-msgstr "ISOファイルまたはDVDからVMを起動します。"
+msgstr "仮想マシンをDVD/ISOソースから起動します"
#: pcsx2/gui/MainFrame.cpp:636
msgid "Reboot CDVD (fast)"
-msgstr "CDVDから再起動(高速)"
+msgstr "CDVD再起動 (急速)"
#: pcsx2/gui/MainFrame.cpp:637
msgid "Reboot using fast BOOT (skips splash screens)"
-msgstr ""
-"高速起動でPS2仮想マシンのハードリセットを行います。(PS2のロゴをスキップ)"
+msgstr "急速再起動します (スプラッシュ画面をスキップします)"
#: pcsx2/gui/MainFrame.cpp:641
msgid "Boot CDVD (fast)"
-msgstr "CDVDから起動(高速)"
+msgstr "CDVD起動 (急速)"
#: pcsx2/gui/MainFrame.cpp:642
msgid "Use fast boot to skip PS2 startup and splash screens"
-msgstr "PS2のロゴをスキップして高速起動します。"
+msgstr "急速起動でPS2スタートアップとスプラッシュ画面をスキップします"
#: pcsx2/gui/MainFrame.cpp:703 pcsx2/gui/MainFrame.cpp:738
msgid "No plugin loaded"
-msgstr "プラグインが読み込まれていません。"
+msgstr "プラグインがロードされていません"
#: pcsx2/gui/MainFrame.cpp:708
msgid "Core GS Settings..."
-msgstr "Core GS 設定..."
+msgstr "GSコア設定..."
#: pcsx2/gui/MainFrame.cpp:709
msgid ""
"Modify hardware emulation settings regulated by the PCSX2 core virtual "
"machine."
-msgstr "PCSX2のコア仮想マシンが制御しているエミュレーション設定を変更します。"
+msgstr ""
+"PCSX2コア仮想マシンで制御されるハードウェアエミュレーション設定の変更。"
#: pcsx2/gui/MainFrame.cpp:711
msgid "Window Settings..."
-msgstr "ウィンドウ設定..."
+msgstr "GSウィンドウ設定..."
#: pcsx2/gui/MainFrame.cpp:712
msgid "Modify window and appearance options, including aspect ratio."
-msgstr "アスペクト比を含むウィンドウやアピアランスの設定を変更します。"
+msgstr "アスペクト比など、ウィンドウの外観オプションを変更します。"
#: pcsx2/gui/MainFrame.cpp:719
msgid "Plugin Settings..."
@@ -1542,11 +1545,11 @@ msgstr "プラグイン設定..."
#: pcsx2/gui/MainFrame.cpp:720
#, c-format
msgid "Opens the %s plugin's advanced settings dialog."
-msgstr "%s プラグインの設定ダイアログを開きます。"
+msgstr "%sプラグインの詳細設定を開きます。"
#: pcsx2/gui/MainMenuClicks.cpp:112
msgid "Reset all settings?"
-msgstr "設定を全て初期化しますか?"
+msgstr "全ての設定をリセットしますか?"
#: pcsx2/gui/MainMenuClicks.cpp:140
msgid "Confirm ISO image change"
@@ -1555,30 +1558,32 @@ msgstr "ISOイメージ変更の確認"
#: pcsx2/gui/MainMenuClicks.cpp:146
msgid "Do you want to swap discs or boot the new image (via system reset)?"
msgstr ""
-"ディスクを交換または新しいイメージで起動(システムのリセットを介して)します"
-"か?"
+"ディスクをスワップするか、別のイメージを起動(システムはリセットされます)させ"
+"ますか?"
#: pcsx2/gui/MainMenuClicks.cpp:148 pcsx2/gui/MainMenuClicks.cpp:194
msgid "Swap Disc"
-msgstr "ディスクの交換"
+msgstr "ディスクスワップ"
#: pcsx2/gui/MainMenuClicks.cpp:184
msgid "Confirm CDVD source change"
-msgstr "CDVDソースの変更の確認"
+msgstr "CDVDソースの変更確認"
#: pcsx2/gui/MainMenuClicks.cpp:187
#, c-format
msgid "You've selected to switch the CDVD source from %s to %s."
-msgstr "CDVD のソースを %s から %s に切り替えます。"
+msgstr "CDVDソースを[%s]から[%s]に変更されました。"
#: pcsx2/gui/MainMenuClicks.cpp:191
msgid "Do you want to swap discs or boot the new image (system reset)?"
-msgstr "ディスクを交換または新しいイメージで起動(システムのリセット)しますか?"
+msgstr ""
+"ディスクをスワップするか、別のイメージを起動(システムはリセットされます)させ"
+"ますか?"
#: pcsx2/gui/MainMenuClicks.cpp:261
#, c-format
msgid "All Supported (%s)"
-msgstr "サポートされているファイル (%s)"
+msgstr "全サポート形式 (%s)"
#: pcsx2/gui/MainMenuClicks.cpp:264
#, c-format
@@ -1588,7 +1593,7 @@ msgstr "ディスクイメージ (%s)"
#: pcsx2/gui/MainMenuClicks.cpp:267
#, c-format
msgid "Blockdumps (%s)"
-msgstr "ダンプファイル (%s)"
+msgstr "ブロックダンプ (%s)"
#: pcsx2/gui/MainMenuClicks.cpp:270 pcsx2/gui/MainMenuClicks.cpp:291
msgid "All Files (*.*)"
@@ -1596,34 +1601,34 @@ msgstr "全てのファイル (*.*)"
#: pcsx2/gui/MainMenuClicks.cpp:273
msgid "Select CDVD source iso..."
-msgstr "ISOイメージファイルを選択してください..."
+msgstr "CDVDのISOソースを選択してください..."
#: pcsx2/gui/MainMenuClicks.cpp:290
msgid "Select ELF file..."
-msgstr "ELFファイルを選択..."
+msgstr "EFLファイルを選択して下さい..."
#: pcsx2/gui/MainMenuClicks.cpp:316
msgid "ISO file not found!"
-msgstr "ISOファイルが見つかりませんでした。"
+msgstr "ISOファイルが見つかりません!"
#: pcsx2/gui/MainMenuClicks.cpp:318
msgid "An error occurred while trying to open the file:"
-msgstr "以下のファイルを開く際にエラーが発生しました:"
+msgstr "ファイルを開くときに、エラーが発生しました:"
#: pcsx2/gui/MainMenuClicks.cpp:319
msgid ""
"Error: The configured ISO file does not exist. Click OK to select a new ISO "
"source for CDVD."
msgstr ""
-"エラー:指定したISOファイルがみつかりません。OKを押して新たにISOファイルを指"
-"定してください。"
+"エラー: 指定されたISOファイルがみつかりません。OKをクリックし、CDVDのISOソー"
+"スを選択して下さい。"
#: pcsx2/gui/MainMenuClicks.cpp:390
msgid ""
"You have selected the following ISO image into PCSX2:\n"
"\n"
msgstr ""
-"あなたはPCSX2に以下のISOイメージを指定しています:\n"
+"次のISOイメージが選択されました:\n"
"\n"
#: pcsx2/gui/MemoryCardFile.cpp:183
@@ -1634,7 +1639,7 @@ msgid ""
"%s\n"
"\n"
msgstr ""
-"メモリーカードを作成できませんでした:\n"
+"メモリーカードの作成に失敗しました:\n"
"\n"
"%s\n"
"\n"
@@ -1647,60 +1652,58 @@ msgid ""
"%s\n"
"\n"
msgstr ""
-"メモリカードへのアクセスが拒否されました \n"
-"\n"
+"メモリーカードのアクセスが拒否されました:(このセッションではメモリーカードは"
+"無効となります)\n"
"%s\n"
"\n"
#: pcsx2/gui/MemoryCardFile.cpp:525
msgid "File name empty or too short"
-msgstr "ファイル名が無いか小さすぎます"
+msgstr "ファイル名が無いか短すぎます"
#: pcsx2/gui/MemoryCardFile.cpp:530
msgid "File name outside of required directory"
-msgstr "ファイル名はディレクトリの外にあります"
+msgstr "ファイル名は要求されるディレクトリ外です"
#: pcsx2/gui/MemoryCardFile.cpp:536
msgid "File name already exists"
-msgstr "そのファイル名は既にあります"
+msgstr "同じ名前のファイルが既にあります"
#: pcsx2/gui/MemoryCardFile.cpp:543
msgid "The Operating-System prevents this file from being created"
-msgstr "OSがこのファイルを作ることを阻止しています。"
+msgstr "OSによりこのファイルを作成する事ができません"
#: pcsx2/gui/Panels/BaseApplicableConfigPanel.cpp:103
msgid "Cannot apply settings..."
-msgstr "設定を適用できません..."
+msgstr "設定を適用する事ができません..."
#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:103
msgid "BIOS Search Path:"
-msgstr "BIOS の場所:"
+msgstr "BIOS参照パス:"
#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:104
msgid "Select folder with PS2 BIOS roms"
-msgstr "PS2のBIOSがあるフォルダを選択してください。"
+msgstr "PS2のBIOSがあるフォルダを選択して下さい"
#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:111
msgid ""
"Click the Browse button to select a different folder where PCSX2 will look "
"for PS2 BIOS roms."
-msgstr ""
-"PS2のBIOS romファイルが別の場所にある場合、参照ボタンを押してフォルダを指定し"
-"てください。"
+msgstr "参照を押してPCSX2がBIOS ROMをロードするフォルダを指定して下さい。"
#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:113
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:156
#: pcsx2/gui/Panels/ThemeSelectorPanel.cpp:47
msgid "Refresh list"
-msgstr "リストを更新"
+msgstr "リスト更新"
#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:115
msgid "Select a BIOS rom:"
-msgstr "BIOS を選択してください:"
+msgstr "BIOS ROMを選択して下さい:"
#: pcsx2/gui/Panels/CpuPanel.cpp:24
msgid "Round Mode"
-msgstr "丸めモード"
+msgstr "Round Mode"
#: pcsx2/gui/Panels/CpuPanel.cpp:25
msgid "Clamping Mode"
@@ -1708,52 +1711,52 @@ msgstr "クランプモード"
#: pcsx2/gui/Panels/CpuPanel.cpp:29
msgid "Nearest"
-msgstr "最も近い正規化数に"
+msgstr "Nearest"
#: pcsx2/gui/Panels/CpuPanel.cpp:30
msgid "Negative"
-msgstr "切り捨て"
+msgstr "Negative"
#: pcsx2/gui/Panels/CpuPanel.cpp:31
msgid "Positive"
-msgstr "切り上げ"
+msgstr "Positive"
#: pcsx2/gui/Panels/CpuPanel.cpp:32
msgid "Chop / Zero"
-msgstr "正数切り上げ/負数切り捨て"
+msgstr "Chop / Zero"
#: pcsx2/gui/Panels/CpuPanel.cpp:37
msgid "None"
-msgstr "なし"
+msgstr "無し"
#: pcsx2/gui/Panels/CpuPanel.cpp:85
msgid "EE/FPU Advanced Recompiler Options"
-msgstr "EE/FPU 拡張リコンパイラオプション"
+msgstr "EE/FPU リコンパイラ詳細設定"
#: pcsx2/gui/Panels/CpuPanel.cpp:87 pcsx2/gui/Panels/CpuPanel.cpp:102
msgid "Extra + Preserve Sign"
-msgstr "拡張+予約済み"
+msgstr "Extra + Preserve Sign"
#: pcsx2/gui/Panels/CpuPanel.cpp:88
msgid "Full"
-msgstr "全て"
+msgstr "フル"
#: pcsx2/gui/Panels/CpuPanel.cpp:99
msgid "VU0 / VU1 Advanced Recompiler Options"
-msgstr "VU0 / VU1 拡張リコンパイラオプション"
+msgstr "VU0/VU1 リコンパイラ詳細設定"
#: pcsx2/gui/Panels/CpuPanel.cpp:101
msgid "Extra"
-msgstr "拡張"
+msgstr "Extra"
#: pcsx2/gui/Panels/CpuPanel.cpp:117 pcsx2/gui/Panels/CpuPanel.cpp:126
#: pcsx2/gui/Panels/CpuPanel.cpp:184
msgid "Interpreter"
-msgstr "インタプリタ"
+msgstr "インタープリタ"
#: pcsx2/gui/Panels/CpuPanel.cpp:118
msgid "Quite possibly the slowest thing in the universe."
-msgstr "恐らく最も低速の設定です。"
+msgstr "おそらくこの宇宙の中で一番遅いものです。"
#: pcsx2/gui/Panels/CpuPanel.cpp:120 pcsx2/gui/Panels/CpuPanel.cpp:129
msgid "Recompiler"
@@ -1763,39 +1766,41 @@ msgstr "リコンパイラ"
msgid ""
"Performs just-in-time binary translation of 64-bit MIPS-IV machine code to "
"x86."
-msgstr "64bit MIPS-IVコードをjust-in-timeでx86コードに変換して実行。"
+msgstr ""
+"64-bit MIPS-IV マシンコードを x86 にバイナリトランスレーションする操作を丁度"
+"間に合わせる具合に行う。"
#: pcsx2/gui/Panels/CpuPanel.cpp:127
msgid "Pretty slow; provided for diagnostic purposes only."
-msgstr "非常に遅い。診断用としてのみの用途。"
+msgstr "結構遅い、デバッグ診断用。"
#: pcsx2/gui/Panels/CpuPanel.cpp:130
msgid ""
"Performs just-in-time binary translation of 32-bit MIPS-I machine code to "
"x86."
-msgstr "32bit MIPS-Iコードをjust-in-timeでx86コードに変換して実行。"
+msgstr ""
+"32-bit MIPS-I マシンコードを x86 にバイナリトランスレーションする操作を丁度間"
+"に合わせる具合に行う。"
#: pcsx2/gui/Panels/CpuPanel.cpp:154
-#, fuzzy
msgid "Enable EE Cache (Slower)"
-msgstr "EE キャッシュを有効 - インタプリタのみ(非常に低速)"
+msgstr "EEキャッシュを有効にする(遅くなる)"
#: pcsx2/gui/Panels/CpuPanel.cpp:154
-#, fuzzy
msgid "Interpreter only; provided for diagnostic"
-msgstr "非常に遅い。診断用としてのみの用途。"
+msgstr "インタープリタモード専用、デバッグ用"
#: pcsx2/gui/Panels/CpuPanel.cpp:170 pcsx2/gui/Panels/CpuPanel.cpp:223
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:110
msgid "Restore Defaults"
-msgstr "デフォルト設定に戻す"
+msgstr "デフォルトに戻す"
#: pcsx2/gui/Panels/CpuPanel.cpp:185
msgid ""
"Vector Unit Interpreter. Slow and not very compatible. Only use for "
"diagnostics."
msgstr ""
-"ベクターユニットインタプリタ。遅い上に互換性が非常に低いです。診断用途。"
+"ヴェクターユニットインタープリタ。低速であまり互換性が無い。デバッグ診断用。"
#: pcsx2/gui/Panels/CpuPanel.cpp:187
msgid "microVU Recompiler"
@@ -1804,25 +1809,24 @@ msgstr "microVU リコンパイラ"
#: pcsx2/gui/Panels/CpuPanel.cpp:188
msgid ""
"New Vector Unit recompiler with much improved compatibility. Recommended."
-msgstr ""
-"新しいベクターユニットリコンパイラ。多くの互換性を向上させてある。推奨。"
+msgstr "最新のVUリコンパイラです。互換性が改善されています。お勧め。"
#: pcsx2/gui/Panels/CpuPanel.cpp:190
msgid "superVU Recompiler [legacy]"
-msgstr "superVU リコンパイラ [従来の方式]"
+msgstr "superVU リコンパイラ [legacy]"
#: pcsx2/gui/Panels/CpuPanel.cpp:191
msgid ""
"Useful for diagnosing bugs or clamping issues in the new mVU recompiler."
-msgstr "バグ診断用やクランプの問題用の新しい mVU リコンパイラ。"
+msgstr "microVUにおけるバグの診断やクランプ問題に役立ちます。"
#: pcsx2/gui/Panels/DirPickerPanel.cpp:64
msgid "Path does not exist"
-msgstr "パスが存在しません。"
+msgstr "指定されたパスが見つかりません"
#: pcsx2/gui/Panels/DirPickerPanel.cpp:156
msgid "Use default setting"
-msgstr "デフォルトの設定を使用する"
+msgstr "デフォルト設定を使う"
#: pcsx2/gui/Panels/DirPickerPanel.cpp:176
msgid "Open in Explorer"
@@ -1830,7 +1834,7 @@ msgstr "エクスプローラで開く"
#: pcsx2/gui/Panels/DirPickerPanel.cpp:177
msgid "Open an explorer window to this folder."
-msgstr "フォルダをエクスプローラで開きます"
+msgstr "このフォルダをエクスプローラウィンドウで開きます。"
#: pcsx2/gui/Panels/DirPickerPanel.cpp:268
msgid "Create folder?"
@@ -1839,48 +1843,47 @@ msgstr "フォルダを作成しますか?"
#: pcsx2/gui/Panels/DirPickerPanel.cpp:269
#, c-format
msgid "A configured folder does not exist. Should %s try to create it?"
-msgstr "設定したフォルダは存在しません。%s を作成しますか?"
+msgstr "設定フォルダが見つかりません。%sに作成させますか?"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:30
msgid "Fit to Window/Screen"
-msgstr "ウィンドウ/スクリーンのサイズに合わせる"
+msgstr "ウィンドウに合わせて伸縮"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:31
msgid "Standard (4:3)"
-msgstr "標準 (4:3)"
+msgstr "スタンダード (4:3)"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:32
msgid "Widescreen (16:9)"
-msgstr "ワイドスクリーン (16:9)"
+msgstr "ワイドスクリーン (16:9)"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:46
msgid "Disable window resize border"
-msgstr "ウィンドウのリサイズを無効"
+msgstr "ウィンドウのリサイズを無効にする"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:47
msgid "Always hide mouse cursor"
-msgstr "マウスカーソルを常に隠す"
+msgstr "マウスポインタを非表示にする"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:48
msgid "Hide window when paused"
-msgstr "一時停止した時にウィンドウを隠す"
+msgstr "ポーズ中にウィンドウを隠す"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:49
msgid "Default to fullscreen mode on open"
-msgstr "デフォルトでフルスクリーンで開く"
+msgstr "ゲーム起動時フルスクリーン"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:50
msgid "Wait for Vsync on refresh"
-msgstr "VSYNCと同期する"
+msgstr "垂直同期 (垂直同期信号まで画面の書き換え待機します)"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:51
msgid "Dynamically toggle Vsync depending on frame rate (read tooltip!)"
-msgstr ""
-"フレームレートに応じてVSYNCを動的に切り替え(ツールTipsを読んでください)"
+msgstr "動的垂直同期 (ツールチップを読んでください)"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:52
msgid "Double-click toggles fullscreen mode"
-msgstr "ダブルクリックでフルスクリーンモードに切り替え"
+msgstr "ダブルクリックでフルスクリーン切り替え"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:110
msgid "Aspect Ratio:"
@@ -1888,17 +1891,19 @@ msgstr "アスペクト比:"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:112
msgid "Custom Window Size:"
-msgstr "カスタムウィンドウサイズ:"
+msgstr "ウィンドウサイズ指定:"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:115
msgid "Zoom:"
-msgstr "拡大率:"
+msgstr "ズーム率:"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:196
msgid ""
"Invalid window dimensions specified: Size cannot contain non-numeric digits! "
">_<"
-msgstr "無効なウィンドウサイズ:数字以外はダメです!>_<"
+msgstr ""
+"無効なサイズ指定です:\n"
+"整数以外は入力しないで下さい! >_<"
#: pcsx2/gui/Panels/GameDatabasePanel.cpp:334
msgid "Search"
@@ -1907,11 +1912,11 @@ msgstr "検索"
#: pcsx2/gui/Panels/GameDatabasePanel.cpp:368
#: pcsx2/gui/Panels/GameFixesPanel.cpp:25
msgid "Gamefixes"
-msgstr "Gamefix"
+msgstr "ゲーム修正"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:38
msgid "VU Add Hack - Fixes Tri-Ace games boot crash."
-msgstr "VU 追加Hack - tri-Ace社のゲームの起動時のクラッシュをfix"
+msgstr "VU Add Hack - トライエースブランドゲームの起動クラッシュを修正"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:39
msgid ""
@@ -1920,27 +1925,28 @@ msgid ""
" * Radiata Stories\n"
" * Valkyrie Profile 2"
msgstr ""
-"以下のゲームの起動時に有効にしておく必要があります:\n"
-" * スターオーシャン3\n"
-" * ラジアータ ストーリーズ\n"
-" * ヴァルキリープロファイル2"
+"このハックが必要なゲーム:\n"
+" * スターオーシャン3\n"
+" * ヴァルキュリープロファイル2\n"
+" * ラジアータストーリーズ"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:42
msgid "VU Clip Flag Hack - For Persona games (SuperVU recompiler only!)"
msgstr ""
-"VU Clip Flag の Hack - ペルソナシリーズ用 (SuperVU リコンパイラ使用時のみ)"
+"VU Clip Flag Hack - ペルソナ系のゲーム用(SuperVU リコンパイラ使用の場合の"
+"み)"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:46
msgid "FPU Compare Hack - For Digimon Rumble Arena 2."
-msgstr "FPU Compare Hack - デジモンアリーナ2用"
+msgstr "FPU Compare Hack - デジモンランブルアリーナ2用"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:50
msgid "FPU Multiply Hack - For Tales of Destiny."
-msgstr "FPU Multiply Hack - テイルズ オブ デスティニー用"
+msgstr "FPU Multiply Hack - テイルズオブデスティニー用"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:54
msgid "FPU Negative Div Hack - For Gundam games."
-msgstr "FPU Negative Div Hack - ガンダム作品用(ガンダム無双2のムービーなど)"
+msgstr "FPU Negative Div Hack - ガンダム系ゲーム用"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:58
msgid "VU XGkick Hack - For Erementar Gerad."
@@ -1948,72 +1954,74 @@ msgstr "VU XGkick Hack - エレメンタルジェレイド用"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:62
msgid "FFX videos fix - Fixes bad graphics overlay in FFX videos."
-msgstr "FFX 映像 fix - FFXの映像のオーバーレイの不具合をfix"
+msgstr "FFX videos fix - FFXのムービーを修正します"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:66
msgid "EE timing hack - Multi purpose hack. Try if all else fails."
msgstr ""
-"EE timing hack - 汎用hack 。他のhackで上手く動作しなかった場合に試してくださ"
-"い。"
+"EE timing hack - 汎用ハック。他に手が無い場合はこれを使ってみましょう。"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:75
msgid ""
"Skip MPEG hack - Skips videos/FMVs in games to avoid game hanging/freezes."
msgstr ""
-"MPEG をスキップする hack - 動画をスキップします。FMVでゲームがフリーズやハン"
-"グするのを防ぎます。"
+"Skip MPEG hack - ムービーをスキップします。イントロムービーがフリーズ、ハング"
+"する場合に使って下さい。"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:79
msgid "OPH Flag hack - Try if your game freezes showing the same frame."
-msgstr "OPH Flag hack - 同じフレームでいつもフリーズする場合に試してください。"
+msgstr ""
+"OPH Flag hack - 毎回同じフレーム/シーンでフリーズする時に使ってみて下さい。"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:88
msgid "Ignore DMAC writes when it is busy."
-msgstr "ビジー状態の時にDMACの書き込みを無視"
+msgstr "ビジー状態の時、DMAC書き出しを無視します。"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:95
msgid "Simulate VIF1 FIFO read ahead. Fixes slow loading games."
msgstr ""
+"VIF1 FIFO の先読みをシミュレートします。ロードが遅いゲームを修正します。"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:103
msgid "Delay VIF1 Stalls (VIF1 FIFO) - For SOCOM 2 HUD."
-msgstr ""
+msgstr "VIF1ストールにディレイをかけます (VIF1 FIFO) - SOCOM 2のHUD修正。"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:107
msgid "Ignore Bus Direction on Path3 Transfer - Used for Hotwheels"
-msgstr ""
+msgstr "Path3転送のBus Directionを無視する - Hotwheels用"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:118
msgid "Enable manual game fixes [Not recommended]"
-msgstr "Gamefixを手動で有効化 [非推奨]"
+msgstr "ゲーム修正の手動設定有効化[推奨されません]"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:127
msgid ""
"The safest way to make sure that all game fixes are completely disabled."
-msgstr "全ての Gamefix を無効にするのが一番安定します。"
+msgstr "ゲーム修正が全て無効化されている事を確認する為の最善な方法です。"
#: pcsx2/gui/Panels/LogOptionsPanels.cpp:249
msgid "Enable Trace Logging"
-msgstr "トレースログを有効"
+msgstr "トレースログを有効化"
#: pcsx2/gui/Panels/LogOptionsPanels.cpp:250
msgid ""
"Trace logs are all written to emulog.txt. Toggle trace logging at any time "
"using F10."
msgstr ""
-"トレースログは emulog.txt に保存されます。F10キーでいつでも切り替えられます。"
+"トレースログは全て emulog.txt に書き込まれます。「F10」でいつでも切り替え"
+"られます。"
#: pcsx2/gui/Panels/LogOptionsPanels.cpp:251
msgid ""
"Warning: Enabling trace logs is typically very slow, and is a leading cause "
"of 'What happened to my FPS?' problems. :)"
msgstr ""
-"注意:トレースログを有効にすると非常に遅くなります。「俺のFPSゲーのどこがバ"
-"グってんの?」とかいう時に使います(’▽’)"
+"警告: トレースログを有効にすると遅くなります。「俺のFPSどうなっちまった」現"
+"象に繋がります。 (^-^)"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:151
msgid "Select folder with PS2 memory cards"
-msgstr "PS2メモリカードのファイルがあるフォルダを指定してください。"
+msgstr "PS2メモリーカードが保存されるフォルダを選択して下さい"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:448
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:533
@@ -2022,46 +2030,46 @@ msgstr "取り出し"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:449
msgid "Duplicate ..."
-msgstr "複製..."
+msgstr "複製 ..."
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:450
msgid "Rename ..."
-msgstr "名称変更..."
+msgstr "名前の変更 ..."
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:451
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:515
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:542
msgid "Create ..."
-msgstr "作成..."
+msgstr "作成 ..."
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:463
msgid "Card: "
-msgstr "カード:"
+msgstr "メモリーカード:"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:516
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:549
msgid "Create a new memory card."
-msgstr "メモリカードを新規作成します"
+msgstr "メモリーカードの新規作成をする。"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:529
msgid "Rename this memory card ..."
-msgstr "このメモリカードの名称を変更します..."
+msgstr "メモリーカードの名前を変更 ..."
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:533
msgid "Insert ..."
-msgstr "挿入 ..."
+msgstr "差し込む ..."
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:534
msgid "Eject the card from this port"
-msgstr "以下のポートのカードを取り出します"
+msgstr "ポートからメモリーカードを取り出す"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:534
msgid "Insert this card to a port ..."
-msgstr "このメモリカードを挿入します..."
+msgstr "ポートにメモリーカードを差し込む"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:538
msgid "Create a duplicate of this memory card ..."
-msgstr "このメモリカードの複製を作成します..."
+msgstr "メモリーカードの複製を作成 ..."
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:542
msgid "Delete"
@@ -2069,34 +2077,36 @@ msgstr "削除"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:545
msgid "Permanently delete this memory card from disk (all contents are lost)"
-msgstr "このメモリカードをディスク上から削除します(内容は永久に失われます)"
+msgstr ""
+"このメモリーカードをハードディスクから完全に消去する(全てのデータは失われま"
+"す)"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:547
msgid "Create a new memory card and assign it to this Port."
-msgstr "新しいメモリカードを作成し、このポートに割り当てます。"
+msgstr "メモリーカードを新規作成し、このポートに割り当てる"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:726
msgid "Delete memory file?"
-msgstr "メモリカードを削除しますか?"
+msgstr "メモリーカードファイルを削除しますか?"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:750
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:762
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:769
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:783
msgid "Duplicate memory card"
-msgstr "メモリカードの複製"
+msgstr "メモリーカードの複製"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:750
msgid "Failed: Can only duplicate an existing card."
-msgstr "失敗:既存のカードのみ複製ができます。"
+msgstr "失敗: 複製元のメモリーカードがありません。"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:769
msgid ""
"Select a name for the duplicate\n"
"( '.ps2' will be added automatically)"
msgstr ""
-"新しい名前を付けてください。\n"
-"(拡張子'.ps2' は自動て付けられます)"
+"複製されるメモリーカードに名前を付けて下さい\n"
+"( 「.ps2」 ファイル形式は自動的に付与)"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:782
#, c-format
@@ -2105,12 +2115,12 @@ msgstr "失敗: %s"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:808
msgid "Copy failed!"
-msgstr "コピーが失敗しました!"
+msgstr "コピーに失敗しました!"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:816
#, c-format
msgid "Memory card '%s' duplicated to '%s'."
-msgstr "メモリカード '%s' を '%s' という名前で複製しました。"
+msgstr "メモリーカード '%s' は '%s' に複製されました。"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:820
msgid "Success"
@@ -2122,72 +2132,72 @@ msgid ""
"Select a new name for the memory card '%s'\n"
"( '.ps2' will be added automatically)"
msgstr ""
-"'%s'に新しい名前を付けてください。\n"
-"(拡張子'.ps2' は自動て付けられます)"
+"'%s' メモリーカードに名前を付けて下さい\n"
+"( 「.ps2」 ファイル形式は自動的に付与)"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:844
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:856
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:872
msgid "Rename memory card"
-msgstr "メモリカードの名称変更"
+msgstr "メモリーカードの名前を変更"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:872
msgid "Error: Rename could not be completed.\n"
-msgstr "エラー:名称の変更ができませんでした\n"
+msgstr "エラー:名前の変更を完了できませんでした。\n"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:962
#: pcsx2/gui/Panels/MemoryCardListView.cpp:139
#, c-format
msgid "Port-%u / Multitap-%u--Port-1"
-msgstr "ポート%u / マルチタップ%u--ポート1"
+msgstr "ポート-%u / マルチタップ-%u--ポート-1"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:963
#: pcsx2/gui/Panels/MemoryCardListView.cpp:140
#, c-format
msgid " Multitap-%u--Port-%u"
-msgstr " マルチタップ%u--ポート%u"
+msgstr " マルチタップ-%u--ポート-%u"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:988
msgid "Empty"
-msgstr "なし"
+msgstr "空"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:994
#, c-format
msgid "Select a target port for '%s'"
-msgstr "どのポートに '%s' を挿入しますか?"
+msgstr "'%s' を差し込むポートを指定して下さい"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:995
msgid "Insert card"
-msgstr "カードの挿入"
+msgstr "メモリーカードを差し込む"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1055
msgid "Eject card"
-msgstr "カードの取り出し"
+msgstr "メモリーカードを取り出す"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1055
msgid "Insert card ..."
-msgstr "カードの挿入..."
+msgstr "メモリーカードを差し込む ..."
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1056
msgid "Duplicate card ..."
-msgstr "カードの複製..."
+msgstr "メモリーカードを複製 ..."
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1057
msgid "Rename card ..."
-msgstr "カードの名称変更..."
+msgstr "メモリーカードの名前を変更する ..."
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1058
msgid "Delete card"
-msgstr "カードを削除"
+msgstr "メモリーカードを削除"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1061
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1065
msgid "Create a new card ..."
-msgstr "カードを新規作成..."
+msgstr "メモリーカードを新規作成 ..."
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1069
msgid "Refresh List"
-msgstr "リストを更新"
+msgstr "リスト更新"
#: pcsx2/gui/Panels/MemoryCardListView.cpp:105
msgid "PS2 Port"
@@ -2195,15 +2205,15 @@ msgstr "PS2ポート"
#: pcsx2/gui/Panels/MemoryCardListView.cpp:107
msgid "Card (file) name"
-msgstr "カード(ファイル)名"
+msgstr "カード (ファイル) 名"
#: pcsx2/gui/Panels/MemoryCardListView.cpp:108
msgid "Card size"
-msgstr "容量"
+msgstr "カードサイズ"
#: pcsx2/gui/Panels/MemoryCardListView.cpp:109
msgid "Formatted"
-msgstr "フォーマット済"
+msgstr "フォーマットされた"
#: pcsx2/gui/Panels/MemoryCardListView.cpp:110
msgid "Last Modified"
@@ -2211,7 +2221,7 @@ msgstr "更新日時"
#: pcsx2/gui/Panels/MemoryCardListView.cpp:111
msgid "Created on"
-msgstr "作成日"
+msgstr "作成日時"
#: pcsx2/gui/Panels/MemoryCardListView.cpp:156
msgid "No"
@@ -2223,23 +2233,23 @@ msgstr "はい"
#: pcsx2/gui/Panels/MemoryCardListView.cpp:169
msgid "[-- Unused cards --]"
-msgstr "[-- 未使用のカード --]"
+msgstr "[-- メモリーカードバンク --]"
#: pcsx2/gui/Panels/MemoryCardListView.cpp:171
msgid "[-- No unused cards --]"
-msgstr "[-- 未使用のカードはありません --]"
+msgstr "[-- カードバンクは空です --]"
#: pcsx2/gui/Panels/MiscPanelStuff.cpp:33
msgid "Usermode Selection"
-msgstr "ユーザーモード"
+msgstr "ユーザーモード選択"
#: pcsx2/gui/Panels/MiscPanelStuff.cpp:50
msgid "User Documents (recommended)"
-msgstr "ユーザドキュメント (推奨)"
+msgstr "ユーザードキュメント (推奨)"
#: pcsx2/gui/Panels/MiscPanelStuff.cpp:51
msgid "Location: "
-msgstr "場所:"
+msgstr "フォルダの場所:"
#: pcsx2/gui/Panels/MiscPanelStuff.cpp:55
msgid "Custom folder:"
@@ -2249,14 +2259,12 @@ msgstr "カスタムフォルダ:"
msgid ""
"This setting may require administration privileges from your operating "
"system, depending on how your system is configured."
-msgstr ""
-"この設定は、お使いのシステム構成によっては管理者権限が要求される場合はありま"
-"す。"
+msgstr "この設定はOSの管理者権限が必要な可能性があります。"
#: pcsx2/gui/Panels/MiscPanelStuff.cpp:66
#, c-format
msgid "Select a document root for %s"
-msgstr "%s のドキュメントのルートを選択"
+msgstr "%sを設置するドキュメントのルートを選択して下さい"
#: pcsx2/gui/Panels/MiscPanelStuff.cpp:124
msgid "Apply"
@@ -2264,70 +2272,68 @@ msgstr "適用"
#: pcsx2/gui/Panels/MiscPanelStuff.cpp:125
msgid "Make this language my default right now!"
-msgstr "今すぐあなたのデフォルトの言語を作ろう!"
+msgstr "この言語をデフォルトに設定してくれ!"
#: pcsx2/gui/Panels/PathsPanel.cpp:38
msgid "Savestates:"
-msgstr "ステートセーブの保存先:"
+msgstr "セーブステート:"
#: pcsx2/gui/Panels/PathsPanel.cpp:39
msgid "Select folder for Savestates"
-msgstr "ステートセーブのフォルダを指定してください"
+msgstr "セーブステートの保存先を指定する"
#: pcsx2/gui/Panels/PathsPanel.cpp:48
msgid "Snapshots:"
-msgstr "スナップショットの保存先:"
+msgstr "スクリーンショット:"
#: pcsx2/gui/Panels/PathsPanel.cpp:49
msgid "Select a folder for Snapshots"
-msgstr "スナップショットの保存先フォルダを指定してください"
+msgstr "スクリーンショットの保存先を指定する"
#: pcsx2/gui/Panels/PathsPanel.cpp:58
msgid "Logs/Dumps:"
-msgstr "ログ/ダンプの保存先:"
+msgstr "ログ / ダンプ:"
#: pcsx2/gui/Panels/PathsPanel.cpp:59
msgid "Select a folder for logs/dumps"
-msgstr "ログ/ダンプの保存先フォルダを指定してください"
+msgstr "ログ / ダンプの保存先を指定する"
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:230
msgid "Applying settings..."
-msgstr "設定を適用中..."
+msgstr "設定を適用中 ..."
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:240
msgid "Shutdown PS2 virtual machine?"
-msgstr "PS2仮想マシンを終了させますか?"
+msgstr "PS2仮想マシンをシャットダウンしますか?"
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:321
msgid "I'm givin' her all she's got, Captain!"
-msgstr "I'm givin' her all she's got, Captain!"
+msgstr "全力でやってます、船長!"
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:323
msgid "Enumerating available plugins..."
-msgstr "エミュレート可能なプラグイン..."
+msgstr "利用可能なプラグインをマップ中..."
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:356
msgid "Plugins Search Path:"
-msgstr "プラグインのフォルダパス:"
+msgstr "プラグイン参照パス:"
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:357
msgid "Select a folder with PCSX2 plugins"
-msgstr "PCSX2のプラグインフォルダを指定してください"
+msgstr "PCSX2プラグインフォルダを選択"
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:370
msgid "Configure..."
-msgstr "設定..."
+msgstr "設定する..."
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:379
msgid "Click the Browse button to select a different folder for PCSX2 plugins."
-msgstr ""
-"PCSX2のプラグインが別の場所にある場合、参照ボタンを押してフォルダを指定してく"
-"ださい。"
+msgstr "参照ボタンをクリックしてPCSX2プラグインフォルダを指定して下さい。"
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:481
#, c-format
msgid "Please select a valid plugin for the %s."
-msgstr "%sの有効なプラグインを選択してください。"
+msgstr "%sの有効なプラグインを選択して下さい。"
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:519
#, c-format
@@ -2337,37 +2343,38 @@ msgid ""
"Reason: %s\n"
"\n"
msgstr ""
-"選択した %s プラグインのロードに失敗しました \n"
+"選択された[%s]プラグインはロードに失敗しました。\n"
"\n"
-"原因:%s\n"
+"理由: %s\n"
"\n"
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:730
msgid "Completing tasks..."
-msgstr "タスクの完了中..."
+msgstr "タスク処理中..."
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:96
msgid "Enable speedhacks"
-msgstr "Speedhackを有効"
+msgstr "スピードハック有効化"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:102
msgid ""
"A safe and easy way to make sure that all speedhacks are completely disabled."
-msgstr "全ての Speedhack が無効になっているのが、最も安定かつ簡単な設定です。"
+msgstr "ゲーム修正が全て無効化されている事を確認する為の最善な方法です。"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:111
msgid ""
"Resets all speedhack options to their defaults, which consequently turns "
"them all OFF."
-msgstr "全てのオプションをデフォルトに戻し、SpeedhackをOFFにします。"
+msgstr ""
+"スピードハックを全てデフォルト値にします。結果として全て無効化されます。"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:120
msgid "EE Cyclerate [Not Recommended]"
-msgstr "EE サイクルレートの設定 [非推奨]"
+msgstr "EE Cyclerate [推奨されません]"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:141
msgid "VU Cycle Stealing [Not Recommended]"
-msgstr "VU サイクルスティーリングの設定 [非推奨]"
+msgstr "VU Cycle Stealing [推奨されません]"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:161
msgid "microVU Hacks"
@@ -2378,113 +2385,91 @@ msgid "mVU Flag Hack"
msgstr "mVU Flag Hack"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:164
-#, fuzzy
msgid ""
"Good Speedup and High Compatibility; may cause bad graphics... [Recommended]"
-msgstr ""
-"良いスピードアップと高い互換性があります;映像や音声に多少の出るが出る可能性"
-"がありますが...[推奨]"
+msgstr "速度の向上と高い互換性、グラフィック不具合の可能性有り... [推奨]"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:166
-msgid "mVU Block Hack"
-msgstr "mVU Block Hack"
+msgid "MTVU (Multi-Threaded microVU1)"
+msgstr "MTVU (Multi-Threaded microVU1)"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
-#, fuzzy
-msgid ""
-"Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
-msgstr ""
-"良いスピードアップと高い互換性があります;映像や音声に多少のゴミがデル可能性"
-"がありますが..."
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
-msgid "MTVU (Multi-Threaded microVU1)"
-msgstr ""
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:170
-#, fuzzy
msgid ""
"Good Speedup and High Compatibility; may cause hanging... [Recommended if 3+ "
"cores]"
-msgstr ""
-"良いスピードアップと高い互換性があります;映像や音声に多少の出るが出る可能性"
-"がありますが...[推奨]"
+msgstr "速度の向上と高い互換性、ハングを起こす事があります... [3コア以上推奨]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:183
msgid "Other Hacks"
-msgstr "その他のHack"
+msgstr "その他のハック"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:193
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:185
msgid "Enable INTC Spin Detection"
-msgstr "INTCのSpin検出を有効"
+msgstr "INTC Spin Detection 有効化"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:194
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:186
msgid ""
"Huge speedup for some games, with almost no compatibility side effects. "
"[Recommended]"
-msgstr ""
-"多少の互換性と引き換えに、一部のゲームで大幅なスピードアップを図れます[推奨]"
+msgstr "一部のゲームでは速度が大幅に向上し、互換問題もほぼありません。 [推奨]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:196
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:188
msgid "Enable Wait Loop Detection"
-msgstr "ループ検出を有効"
+msgstr "Wait Loop Detection 有効化"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:197
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:189
msgid ""
"Moderate speedup for some games, with no known side effects. [Recommended]"
-msgstr ""
-"互換性と引き換えに、一部のゲームである程度のスピードアップを図れます[推奨]"
+msgstr "一部のゲームでそこそこの速度向上、互換問題は無いと思われます。 [推奨]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:199
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
msgid "Enable fast CDVD"
-msgstr "CDVDの高速読み込みを有効"
+msgstr "Fast CDVD 有効化"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:192
msgid "Fast disc access, less loading times. [Not Recommended]"
-msgstr "高速でディスクにアクセスしてロード時間を短縮[非推奨]"
+msgstr "高速ディスクアクセスで読み込み時間を現象させます。 [非推奨]"
#: pcsx2/gui/Panels/ThemeSelectorPanel.cpp:37
msgid "Themes Search Path:"
-msgstr "テーマがあるフォルダ:"
+msgstr "テーマ参照パス:"
#: pcsx2/gui/Panels/ThemeSelectorPanel.cpp:38
msgid "Select folder containing PCSX2 visual themes"
-msgstr "PCSX2の視覚テーマがあるフォルダを選択"
+msgstr "PCSX2の視覚テーマがあるフォルダの選択"
#: pcsx2/gui/Panels/ThemeSelectorPanel.cpp:45
msgid ""
"Click the Browse button to select a different folder containing PCSX2 visual "
"themes."
msgstr ""
-"PCSX2の視覚テーマが別の場所にある場合、参照ボタンを押してフォルダを指定してく"
-"ださい。"
+"参照ボタンをクリックしてPCSX2視覚テーマがあるフォルダを指定して下さい。"
#: pcsx2/gui/Panels/ThemeSelectorPanel.cpp:49
msgid "Select a visual theme:"
-msgstr "視覚テーマを選択:"
+msgstr "視覚テーマの選択:"
#: pcsx2/gui/Panels/VideoPanel.cpp:34
msgid "Disable Framelimiting"
-msgstr "フレームリミットを無効"
+msgstr "フレームリミッタ無効化"
#: pcsx2/gui/Panels/VideoPanel.cpp:35
msgid ""
"Useful for running benchmarks. Toggle this option in-game by pressing F4."
msgstr ""
-"ベンチマーク用などで使用してください。このオプションはゲーム中でもF4キーで切"
-"り替えができます。"
+"ベーンチマークをする時に便利です。ゲーム実行中は「F4」で切り替えられます。"
#: pcsx2/gui/Panels/VideoPanel.cpp:61
msgid "Base Framerate Adjust:"
-msgstr "通常のフレームレート:"
+msgstr "基本フレームレート調整:"
#: pcsx2/gui/Panels/VideoPanel.cpp:67
msgid "Slow Motion Adjust:"
-msgstr "スローモーションモードのフレームレート:"
+msgstr "スローモーション調整:"
#: pcsx2/gui/Panels/VideoPanel.cpp:73
msgid "Turbo Adjust:"
-msgstr "ターボモードのフレームレート:"
+msgstr "ターボ調整:"
#: pcsx2/gui/Panels/VideoPanel.cpp:88
msgid "NTSC Framerate:"
@@ -2498,91 +2483,95 @@ msgstr "FPS"
msgid "PAL Framerate:"
msgstr "PAL フレームレート:"
-#: pcsx2/gui/Panels/VideoPanel.cpp:162
+#: pcsx2/gui/Panels/VideoPanel.cpp:166
msgid ""
"Error while parsing either NTSC or PAL framerate settings. Settings must be "
"valid floating point numerics."
msgstr ""
-"NTSC または PAL のフレームレートの設定の解析中にエラーが発生しました。有効な"
-"浮動小数点値を入力してください。"
+"NTSC又はPAL方式のフレームレート設定のパースエラー。設定は有効な浮動小数点数で"
+"なければいけません。"
-#: pcsx2/gui/Panels/VideoPanel.cpp:180
+#: pcsx2/gui/Panels/VideoPanel.cpp:184
msgid "Disabled [default]"
msgstr "無効 [デフォルト]"
-#: pcsx2/gui/Panels/VideoPanel.cpp:184
-msgid "Skip when on Turbo only (TAB to enable)"
-msgstr "ターボの時のみスキップ(Tabキーで有効)"
-
#: pcsx2/gui/Panels/VideoPanel.cpp:188
-msgid "Constant skipping"
-msgstr "常にフレームをスキップする"
+msgid "Skip when on Turbo only (TAB to enable)"
+msgstr "ターボ時のみスキップ (タブキーで有効)"
-#: pcsx2/gui/Panels/VideoPanel.cpp:190
+#: pcsx2/gui/Panels/VideoPanel.cpp:192
+msgid "Constant skipping"
+msgstr "常にスキップ"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:194
msgid ""
"Normal and Turbo limit rates skip frames. Slow motion mode will still "
"disable frameskipping."
msgstr ""
-"通常、ターボモードの場合はフレームスキップを有効にしてください。スローモー"
-"ションモードでは無効にされます。"
+"平常及びターボ時にフレームスキップします。\n"
+"スローモーション時にはフレームスキップは無効になります。"
-#: pcsx2/gui/Panels/VideoPanel.cpp:213
+#: pcsx2/gui/Panels/VideoPanel.cpp:217
msgid "Frames to Draw"
-msgstr "フレーム描写"
+msgstr "描画フレーム数"
-#: pcsx2/gui/Panels/VideoPanel.cpp:218
+#: pcsx2/gui/Panels/VideoPanel.cpp:222
msgid "Frames to Skip"
-msgstr "フレームスキップ"
+msgstr "フレームスキップ数"
-#: pcsx2/gui/Panels/VideoPanel.cpp:294
+#: pcsx2/gui/Panels/VideoPanel.cpp:298
msgid "Use Synchronized MTGS"
-msgstr "MTGSと同期"
+msgstr "MTGS同期を有効化"
-#: pcsx2/gui/Panels/VideoPanel.cpp:295
+#: pcsx2/gui/Panels/VideoPanel.cpp:299
msgid ""
"For troubleshooting potential bugs in the MTGS only, as it is potentially "
"very slow."
-msgstr "MTGSに潜在的なバグがあった場合のみ有効に。非常に低速になります。"
+msgstr ""
+"クラッシュやグラフィックエラーの発生原因として、\n"
+"MTGSスレッドの同期が疑わしい場合は有効にして下さい。"
-#: pcsx2/gui/Panels/VideoPanel.cpp:298
+#: pcsx2/gui/Panels/VideoPanel.cpp:302
msgid "Disable all GS output"
-msgstr "GS出力を無効"
+msgstr "GS出力を無効化"
-#: pcsx2/gui/Panels/VideoPanel.cpp:299
+#: pcsx2/gui/Panels/VideoPanel.cpp:303
msgid ""
"Completely disables all GS plugin activity; ideal for benchmarking EEcore "
"components."
msgstr ""
-"GSプラグインを無効にします。EEコアコンポーネントのベンチマークに最適です。"
+"GSプラグインの動作を完全に無効にします。エモーションエンジンのコンポーネント"
+"自体の処理速度計測とデバッグ目的に最適です。"
-#: pcsx2/gui/Panels/VideoPanel.cpp:316
+#: pcsx2/gui/Panels/VideoPanel.cpp:320
msgid "Frame Skipping"
-msgstr "フレームスキップの設定"
+msgstr "フレームスキップ"
-#: pcsx2/gui/Panels/VideoPanel.cpp:319
+#: pcsx2/gui/Panels/VideoPanel.cpp:323
msgid "Framelimiter"
-msgstr "フレームリミットの設定"
+msgstr "フレームリミッタ"
#: pcsx2/gui/SysState.cpp:283
msgid ""
"Cannot load this savestate. The state is from an incompatible edition of "
"PCSX2 that is either newer than this version, or is no longer supported."
msgstr ""
-"このステートセーブをロードすることができません。新しいバージョンか、またはサ"
-"ポート外となった古いバージョンのPCSX2のデータです。"
+"セーブステートをロードできませんでした。ステートは、互換性の無いPCSX2のもの"
+"で、バージョンが新しいか、サポートされていません。"
#: pcsx2/gui/SysState.cpp:290
msgid ""
"Cannot load this savestate. The state is an unsupported version, likely "
"created by a newer edition of PCSX2."
msgstr ""
-"ステートセーブをロードできません。未サポートのデータです。恐らく新しいバー"
-"ジョンのPCSX2のデータです。"
+"セーブステートをロードできませんでした。ステートは、サポートされていません。"
+"より新しいバージョンのPCSX2で作成されたようです。"
#: pcsx2/gui/SysState.cpp:326
msgid "There is no active virtual machine state to download or save."
msgstr ""
-"仮想マシンが起動していなければステートセーブのセーブ、ロードはできません。"
+"エラー: メモリバッファへダウンロード又保存できるアクティブな仮想マシンステー"
+"トがありません。"
#: pcsx2/gui/SysState.cpp:520
msgid ""
@@ -2590,42 +2579,42 @@ msgid ""
"may have been created by an older unsupported version of PCSX2, or it may be "
"corrupted."
msgstr ""
-"有効なgzipファイルではないため、ステートセーブをロードすることができません。"
-"未サポートのデータ、または破損している可能性もあります。"
+"セーブステートが無効なgzipアーカイブなのでロードできませんでした。旧バージョ"
+"ンのPCSX2で作成されたか、破損したファイルです。"
#: pcsx2/gui/SysState.cpp:579
msgid "This file is not a valid PCSX2 savestate. See the logfile for details."
msgstr ""
-"このファイルは有効なPCSX2クックセーブではありません。詳細はログファイルをを参"
-"照してください。"
+"このファイルは無効なPCSX2のセーブステートです。詳細はログファイルを参照して下"
+"さい。"
#: pcsx2/gui/SysState.cpp:598
msgid ""
"This savestate cannot be loaded due to missing critical components. See the "
"log file for details."
msgstr ""
-"このステートセーブは重要なコンポーネントが見つからないためロードできません。"
-"詳細はログファイルを参照してください。"
+"セーブステートは重要な構成に欠けている為、ロードできませんでした。詳細はログ"
+"ファイルを参照して下さい。"
#: pcsx2/gui/i18n.cpp:63
msgid " (default)"
-msgstr ""
+msgstr "(デフォルト)"
#: pcsx2/ps2/BiosTools.cpp:83 pcsx2/ps2/BiosTools.cpp:151
msgid "The selected BIOS file is not a valid PS2 BIOS. Please re-configure."
-msgstr "指定されたBIOSは有効なPS2 BIOSではありません。設定しなおしてください。"
+msgstr "選択されたBIOSファイルは無効です。再度設定して下さい。"
#: pcsx2/ps2/BiosTools.cpp:244
msgid ""
"The PS2 BIOS could not be loaded. The BIOS has not been configured, or the "
"configuration has been corrupted. Please re-configure."
msgstr ""
-"PS2 BIOSが読み込まれませんでした。BIOSが設定されていないか、破損しています。"
-"設定しなおしてください。"
+"PS2のBIOSをロードできませんでした。設定されてない若しくは設定が破損してます。"
+"再度設定して下さい。"
#: pcsx2/ps2/BiosTools.cpp:251
msgid "The configured BIOS file does not exist. Please re-configure."
-msgstr "設定されたBIOSが見つかりません。設定しなおしてください。"
+msgstr "指定されたBIOSファイルが見つかりません。再度設定して下さい。"
#: pcsx2/x86/ix86-32/iR5900-32.cpp:578
#, c-format
@@ -2633,8 +2622,8 @@ msgid ""
"%s Extensions not found. The R5900-32 recompiler requires a host CPU with "
"MMX, SSE, and SSE2 extensions."
msgstr ""
-"%s 拡張命令が見つかりませんでした。R5900-32 リコンパイラにはMMX, SSE, SSE2 拡"
-"張命令が必要です。"
+"%s 拡張命令がみつかりません。 R5900-32 リコンパイラは MMX、SSE、及びSSE2 拡張"
+"命令を最低限備えたCPUが必要です。"
#: pcsx2/x86/microVU.cpp:28
#, c-format
@@ -2642,213 +2631,12 @@ msgid ""
"%s Extensions not found. microVU requires a host CPU with MMX, SSE, and "
"SSE2 extensions."
msgstr ""
-"%s 拡張命令が見つかりませんでした。microVU にはMMX, SSE, SSE2 拡張命令が必要"
-"です。"
+"%s 拡張命令がみつかりません。 microVUは MMX、SSE、及びSSE2 拡張命令を最低限備"
+"えたCPUが必要です。"
-#~ msgid "!ContextTip:ChangingNTFS"
-#~ msgstr ""
-#~ "NTFS 圧縮の設定は、Windowsのエクスプローラーでファイルのプロパティを開くこ"
-#~ "とでいつでも変更できます。"
+#~ msgid "mVU Block Hack"
+#~ msgstr "mVU Block Hack"
-#~ msgid "!ContextTip:Folders:Settings"
-#~ msgstr ""
-#~ "このフォルダはプラグインを含む PCSX2 のほとんどの設定ファイルを保存する"
-#~ "フォルダです。\n"
-#~ "(一部の古いプラグインはこの設定を利用しない可能性があります)"
-
-#~ msgid "!Panel:HasHacksOverrides"
-#~ msgstr ""
-#~ "警告!コマンドラインオプションを使用して PCSX2 の設定上書きして実行してい"
-#~ "ます。コマンドラインオプションは設定ダイアログには反映されず、設定を変更し"
-#~ "ても無効になります。"
-
-#~ msgid "!Panel:HasPluginsOverrides"
-#~ msgstr ""
-#~ "警告!コマンドラインオプションを使用して PCSX2 のプラグイン設定上書きして"
-#~ "実行しています。コマンドラインオプションは設定ダイアログには反映されず、設"
-#~ "定を変更しても無効になります。"
-
-#~ msgid "!Notice:Tooltip:Presets:Slider"
-#~ msgstr ""
-#~ "プリセットを有効にするといくつかのSpeedhack、コンパイラオプション、既知の "
-#~ "Gamefix を適用して速度を向上させます。\n"
-#~ "既知の重要な Gamefix は自動で有効になります。\n"
-#~ "\n"
-#~ "プリセットの内容\n"
-#~ "1 - 最も精密にエミュレーションを行います。\n"
-#~ "3 --> 互換性とスピードのバランスを取ってエミュレーションを行います。\n"
-#~ "4 - より積極的に hack を行います。\n"
-#~ "6 - hack のしすぎで多くの場合は速度の低下が起きてしまいます。"
-
-#~ msgid "!Notice:Tooltip:Presets:Checkbox"
-#~ msgstr ""
-#~ "プリセットを有効にするといくつかのSpeedhack、コンパイラオプション、既知の "
-#~ "Gamefix を適用して速度を向上させます。\n"
-#~ "既知の重要な Gamefix は自動で有効になります。\n"
-#~ "\n"
-#~ "-->チェックを外すと、手動で(現在のプリセットを元にして)設定することができ"
-#~ "ます。"
-
-#~ msgid "!ContextTip:DirPicker:UseDefault"
-#~ msgstr ""
-#~ "チェックをすると、このフォルダをPCSX2の現在のユーザーモードのデフォルト設"
-#~ "定が自動的に反映されます。"
-
-#~ msgid "!ContextTip:Window:Vsync"
-#~ msgstr ""
-#~ "VSYNC を同期させるとティアリング現象を解消できますが、パフォーマンスに重大"
-#~ "な問題が発生します。\n"
-#~ "通常はフルスクリーンモードでのみ使用します。また一部の GS プラグインでは機"
-#~ "能しない可能性があります。"
-
-#~ msgid "!ContextTip:Window:ManagedVsync"
-#~ msgstr ""
-#~ "フレームレートが最速の時に VSYNC を有効にします。最速でない場合は速度の低"
-#~ "下を防ぐために無効にします。\n"
-#~ "注意:現時点ではDX10/11ハードウェアレンダリングで GSdx を使用している時の"
-#~ "み動作します。\n"
-#~ "他のプラグインやレンダリングモードでは無視されるか、黒いフレームが挿入され"
-#~ "点滅が起こります。\n"
-#~ "またVSYNCと同期する設定を有効にする必要があります。"
-
-#~ msgid "!ContextTip:Window:HideMouse"
-#~ msgstr ""
-#~ "GS ウィンドウ上でマウスを強制的に非表示にします。マウス操作がメインのゲー"
-#~ "ムで有効にすると便利です。\n"
-#~ "デフォルトでは操作をしないで2秒経過するとマウスを自動で非表示にします。"
-
-#~ msgid "!ContextTip:Window:Fullscreen"
-#~ msgstr ""
-#~ "ゲームを始めた時や再開した時に自動的にフルスクリーンになります。\n"
-#~ "フルスクリーンにはAlt+Enterキーでいつでも切り替えができます。"
-
-#~ msgid "!ContextTip:Window:HideGS"
-#~ msgstr "ESC を押したりしてゲームを一時停止した時にGSウィンドウを閉じます。"
-
-#~ msgid "!ContextTip:Gamefixes:EE Timing Hack"
-#~ msgstr ""
-#~ "以下のゲームに効果があります。\n"
-#~ " * デジタルデビルサーガ (FMVでのクラッシュの問題)\n"
-#~ " * SSX (グラフィックの不具合やクラッシュの問題)\n"
-#~ " * バイオハザード ガンサバイバー4 (テクスチャの問題)"
-
-#~ msgid "!ContextTip:Gamefixes:OPH Flag hack"
-#~ msgstr ""
-#~ "以下のゲームに効果があります。\n"
-#~ " * BLEACH~ブレイド・バトラーズ~\n"
-#~ " * グローランサー2&3\n"
-#~ " * Wizardry"
-
-#~ msgid "!ContextTip:Gamefixes:DMA Busy hack"
-#~ msgstr ""
-#~ "以下のゲームに効果があります。\n"
-#~ " * マナケミア~学園の錬金術士たち~"
-
-#~ msgid "!ContextTip:Folders:Savestates"
-#~ msgstr ""
-#~ "このフォルダは PCSX2 のステートセーブの保存場所です。\n"
-#~ "メニューまたはツールバーを使うか、F1/F3(セーブ/ロード)キーで操作します。"
-
-#~ msgid "!ContextTip:Folders:Snapshots"
-#~ msgstr ""
-#~ "このフォルダは PCSX2 のスナップショットの保存場所です。ご使用の GS プラグ"
-#~ "インによってはサイズや形式が違うかもしれません。"
-
-#~ msgid "!ContextTip:Folders:Logs"
-#~ msgstr ""
-#~ "このフォルダは PCSX2 のログとダンプデータの保存場所です。一部の古いプラグ"
-#~ "インはこの設定を利用しない可能性があります。"
-
-#~ msgid "!Panel:Speedhacks:EECycleX1"
-#~ msgstr ""
-#~ "1 - 通常のサイクルレート。これは実機のPS2の EmotionEngine の速度に近いもの"
-#~ "です。"
-
-#~ msgid "!Panel:Speedhacks:EECycleX2"
-#~ msgstr ""
-#~ "2 - EEのサイクルレートを約33%低下。多くのゲームで互換性を維持したままある"
-#~ "程度のスピードアップ出来ます。"
-
-#~ msgid "!Panel:Speedhacks:EECycleX3"
-#~ msgstr ""
-#~ "2 - EEのサイクルレートを約50%低下。中々の高速化が期待できますが *恐らく* "
-#~ "FMVで音声の途切れる原因にもなります。"
-
-#~ msgid "!Panel:Speedhacks:VUCycleStealOff"
-#~ msgstr "0 - VU サイクルスティーリング無効。最も互換性の高い設定!"
-
-#~ msgid "!Panel:Speedhacks:VUCycleSteal1"
-#~ msgstr ""
-#~ "1 - 少しだけVU サイクルスティーリング実行。互換性は下がりますがほとんどのゲームで若"
-#~ "干の高速化します。"
-
-#~ msgid "!Panel:Speedhacks:VUCycleSteal2"
-#~ msgstr ""
-#~ "2 - 適度にVU サイクルスティーリング実行。より互換性は下がりますがいくつかのゲームで"
-#~ "大幅に高速化します。"
-
-#~ msgid "!Panel:Speedhacks:VUCycleSteal3"
-#~ msgstr ""
-#~ "3 - 限界までVU サイクルスティーリング実行。画面のちらつきが発生し多くのゲームで速度"
-#~ "の低下かが起こるため有用性は限定的。"
-
-#~ msgid "!ContextTip:Speedhacks:EECycleRate Slider"
-#~ msgstr ""
-#~ "このスライドバーを上げるとEmotionEngineのR5900コアCPUのクロックを下げる代"
-#~ "わりに大きな高速化を行い、\n"
-#~ "PS2ハードウェアの機能を最大限利用していないゲームの高速化に有用です。"
-
-#~ msgid "!ContextTip:Speedhacks:VUCycleStealing Slider"
-#~ msgstr ""
-#~ "このスライドバーを上げるとEmotionEngineのVUユニットからスティーリングを行"
-#~ "います。\n"
-#~ "高い設定にするほどサイクルスティーリングを行う量が増加します。"
-
-#~ msgid "!ContextTip:Speedhacks:vuFlagHack"
-#~ msgstr ""
-#~ "常時ではなくブロックされた時のみフラグステータスを更新します。\n"
-#~ "ほとんどの安全であり、SuperVUにも同様の動作をさせます。"
-
-#~ msgid "!ContextTip:Speedhacks:vuBlockHack"
-#~ msgstr ""
-#~ "遠い将来にインスタンスデータの古いフラグを必要としないと仮定しています。\n"
-#~ "かなり安全なはずです。どんなゲームに不具合が起きるかは不明ですが..."
-
-#~ msgid "!ContextTip:Speedhacks:INTC"
-#~ msgstr ""
-#~ "このhackは主に非3D系RPGにある INTC ステータスレジスタを使用しVSYNC待ちをす"
-#~ "るゲームに最適です。\n"
-#~ "効果がなかった場合には使用しないでください。"
-
-#~ msgid "!ContextTip:Speedhacks:BIFC0"
-#~ msgstr ""
-#~ "主にEEのカーネル空間のアドレス 0x81FC0 のアイドルループ処理を対象にしてい"
-#~ "ます。\n"
-#~ "このhackは別ユニットによるエミュレーションのイベントトリガまでの間に、状態"
-#~ "が同じである事を検出します。\n"
-#~ "このようなループを1度だけ繰り返したあと、次のイベントかタイムスライスの終りのいず"
-#~ "れか早いほうに進みます。"
-
-#~ msgid "!ContextTip:Speedhacks:fastCDVD"
-#~ msgstr ""
-#~ "この問題を抱えている既知のゲーム用の設定。\n"
-#~ "HDLoader互換性リストを参照してください(主に'MODE 1'や'低速DVD'など)"
-
-#~ msgid "!ContextTip:Framelimiter:Disable"
-#~ msgstr ""
-#~ "フレームリミットを無効にした場合、スローモーションモードとターボモードは使"
-#~ "用できません。"
-
-#~ msgid "!ContextTip:GS:SyncMTGS"
-#~ msgstr ""
-#~ "映像の不具合の原因が MTGS スレッドの同期によるものだと思われる場合有効にし"
-#~ "てください。"
-
-#~ msgid "!ContextTip:GS:DisableOutput"
-#~ msgstr ""
-#~ "MTGSスレッドかGPUオーバーヘッドによって発生されたベンチマークノイズを除去"
-#~ "します。このオプションはステートセーブと併用するのが最良です。; 最適な場"
-#~ "面でステートセーブを行い、このオプションを有効にしてリロードします。\n"
-#~ "\n"
-#~ "警告:このオプションはいつでも有効にすることができますが、動作中に無効にで"
-#~ "きません(映像に悪影響を与えます)。"
+#~ msgid ""
+#~ "Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
+#~ msgstr "速度の向上と高い互換性、グラフィック不具合(SPS等)の可能性有り..."
diff --git a/locales/pl_PL/pcsx2_Iconized.po b/locales/pl_PL/pcsx2_Iconized.po
index 69917d760..6c1df04f5 100644
--- a/locales/pl_PL/pcsx2_Iconized.po
+++ b/locales/pl_PL/pcsx2_Iconized.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.9\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-10-05 20:13+0200\n"
+"POT-Creation-Date: 2012-04-07 11:42+0200\n"
"PO-Revision-Date: 2011-09-28 21:55+0100\n"
"Last-Translator: Miseru99 \n"
"Language-Team: Miseru99 \n"
@@ -30,7 +30,7 @@ msgstr ""
"została\n"
"już zarezerwowana przez inny process, usługę lub DLL."
-#: pcsx2/CDVD/CDVD.cpp:385
+#: pcsx2/CDVD/CDVD.cpp:389
msgid "!Notice:PsxDisc"
msgstr ""
"Gry z Playstation nie są obsługiwane przez PCSX2. Jeśli chcesz emulować gry "
@@ -490,7 +490,7 @@ msgstr ""
"ilość skradzionych cykli używanych na każdy mikroprogram uruchamiany przez "
"grę."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:172
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "!ContextTip:Speedhacks:vuFlagHack"
msgstr ""
"Uaktualnia Flagi Statusu tylko na blokach, które je odczytują zamiast cały "
@@ -498,15 +498,7 @@ msgstr ""
"Jest to bezpieczne w większości przypadków, SuperVU robi coś podobnego w "
"standardzie."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:177
-msgid "!ContextTip:Speedhacks:vuBlockHack"
-msgstr ""
-"Zakłada iż w bardzo dalekiej przyszłości, bloki nie będą potrzebować starych "
-"instancji danych flag.\n"
-"Powinno to być w miarę bezpieczne, nie jest wiadome czy przeszkadza "
-"jakiejkolwiek grze."
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:182
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:174
msgid "!ContextTip:Speedhacks:vuThread"
msgstr ""
"Dodaje osobny wątek dla VU1(działa tylko z microVU1). Najczęściej oznacza to "
@@ -516,7 +508,7 @@ msgstr ""
"Na gry ograniczone wątkiem GS może to mieć odwrotny skutek, szczególnie przy "
"2-rdzeniowych procesorach."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:203
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:195
msgid "!ContextTip:Speedhacks:INTC"
msgstr ""
"Ta łatka działa najlepiej z grami, które używają zapisu stanu INTC do "
@@ -524,7 +516,7 @@ msgstr ""
"głównie wszelkie nie zrobione w 3D RPGi. Inne gry nie będą miały z tego "
"żadnego, lub minimalny pożytek."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:208
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
msgid "!ContextTip:Speedhacks:BIFC0"
msgstr ""
"Ta łatka namierza bezczynne pętle o adresie 0x81FC0 w jądrze EE. Stara się "
@@ -533,7 +525,7 @@ msgstr ""
"odtwarza je\n"
"dopiero gdy to zdarzenie nastąpi."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:215
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:207
msgid "!ContextTip:Speedhacks:fastCDVD"
msgstr ""
"Sprawdź listę kompatybilności HDLoader'a aby zobaczyć które gry mają z tą "
@@ -546,7 +538,7 @@ msgstr ""
"Miej na uwadze, że przy wyłączonym limicie klatek animacji,\n"
"tryby Przyspieszony i Spowolniony nie będą dostępne."
-#: pcsx2/gui/Panels/VideoPanel.cpp:223
+#: pcsx2/gui/Panels/VideoPanel.cpp:227
msgid "!Panel:Frameskip:Heading"
msgstr ""
"Uwaga: Ze względu na architekturę PS2,\n"
@@ -555,13 +547,13 @@ msgstr ""
"Włączenie tej opcji z całą pewnością BĘDZIE\n"
" powodowało masę błędów graficznych w wielu grach."
-#: pcsx2/gui/Panels/VideoPanel.cpp:302
+#: pcsx2/gui/Panels/VideoPanel.cpp:306
msgid "!ContextTip:GS:SyncMTGS"
msgstr ""
"Użyj tej opcji jeśli podejrzewasz, że synchronizacja wątku MTGS\n"
"odpowiada za zawieszanie się lub graficzne błędy w jakiejś grze."
-#: pcsx2/gui/Panels/VideoPanel.cpp:306
+#: pcsx2/gui/Panels/VideoPanel.cpp:310
msgid "!ContextTip:GS:DisableOutput"
msgstr ""
"Usuwa wszelkie nieprawidłowości spowodowane przez wątek MTGS lub GPU. "
@@ -589,3 +581,10 @@ msgstr ""
"ilości pamięci i nie będzie działać. To nie jest błąd krytyczny, gdyż sVU "
"jest zbędny i tak czy siak\n"
"powinieneś użyć rekompilatora microVU.:3"
+
+#~ msgid "!ContextTip:Speedhacks:vuBlockHack"
+#~ msgstr ""
+#~ "Zakłada iż w bardzo dalekiej przyszłości, bloki nie będą potrzebować "
+#~ "starych instancji danych flag.\n"
+#~ "Powinno to być w miarę bezpieczne, nie jest wiadome czy przeszkadza "
+#~ "jakiejkolwiek grze."
diff --git a/locales/pl_PL/pcsx2_Main.po b/locales/pl_PL/pcsx2_Main.po
index 6032ddb11..4209aa7d8 100644
--- a/locales/pl_PL/pcsx2_Main.po
+++ b/locales/pl_PL/pcsx2_Main.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.9\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-10-05 20:13+0200\n"
+"POT-Creation-Date: 2012-02-28 12:20+0100\n"
"PO-Revision-Date: 2011-09-28 22:22+0100\n"
"Last-Translator: Miseru99 \n"
"Language-Team: Miseru99 \n"
@@ -198,7 +198,7 @@ msgstr "Nie udało się uruchomić wbudowanej wtyczki Kart Pamięci."
msgid "Unloaded Plugin"
msgstr "Wtyczka wyłączona"
-#: pcsx2/SaveState.cpp:339
+#: pcsx2/SaveState.cpp:342
msgid "Cannot load savestate. It is of an unknown or unsupported version."
msgstr ""
"Nie można wgrać zapisanej gry. Pochodzi z nieznanej lub nieobsługiwanej "
@@ -366,31 +366,31 @@ msgstr ""
"Ten zapis gry nie został poprawnie zachowany. Tymczasowa kopia została "
"stworzona pomyślnie, lecz nie mogła być przeniesiona we właściwe miejsce."
-#: pcsx2/gui/AppConfig.cpp:837
+#: pcsx2/gui/AppConfig.cpp:842
msgid "Safest"
msgstr "Najbezpieczniejszy"
-#: pcsx2/gui/AppConfig.cpp:838
+#: pcsx2/gui/AppConfig.cpp:843
msgid "Safe (faster)"
msgstr "Bezpieczny (szybszy)"
-#: pcsx2/gui/AppConfig.cpp:839
+#: pcsx2/gui/AppConfig.cpp:844
msgid "Balanced"
msgstr "Zbalansowany"
-#: pcsx2/gui/AppConfig.cpp:840
+#: pcsx2/gui/AppConfig.cpp:845
msgid "Aggressive"
msgstr "Agresywny"
-#: pcsx2/gui/AppConfig.cpp:841
+#: pcsx2/gui/AppConfig.cpp:846
msgid "Aggressive plus"
msgstr "Agresywny Plus"
-#: pcsx2/gui/AppConfig.cpp:842
+#: pcsx2/gui/AppConfig.cpp:847
msgid "Mostly Harmful"
msgstr "Głównie Szkodliwy"
-#: pcsx2/gui/AppConfig.cpp:999 pcsx2/gui/AppConfig.cpp:1005
+#: pcsx2/gui/AppConfig.cpp:1007 pcsx2/gui/AppConfig.cpp:1013
msgid "Failed to overwrite existing settings file; permission was denied."
msgstr "Nie udało się nadpisać istniejącego pliku ustawień; odmowa dostępu."
@@ -2417,21 +2417,10 @@ msgstr ""
"[Zalecane]"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:166
-msgid "mVU Block Hack"
-msgstr "mVU Block Hack"
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
-msgid ""
-"Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
-msgstr ""
-"Dobre przyspieszenie i duża kompatybilność; może powodować błędy grafiki, "
-"SPS, itd..."
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "MTVU (Multi-Threaded microVU1)"
msgstr "MTVU(Wielo-Wątkowe microVU1)"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:170
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
msgid ""
"Good Speedup and High Compatibility; may cause hanging... [Recommended if 3+ "
"cores]"
@@ -2440,15 +2429,15 @@ msgstr ""
"powodować niestabilność...\n"
"[Zalecane dla 3+ rdzeniowych procesorów]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:183
msgid "Other Hacks"
msgstr "Inne Hack'i"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:193
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:185
msgid "Enable INTC Spin Detection"
msgstr "Aktywuj Detekcję Rozruchu INTC"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:194
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:186
msgid ""
"Huge speedup for some games, with almost no compatibility side effects. "
"[Recommended]"
@@ -2456,22 +2445,22 @@ msgstr ""
"Ogrome przyspieszenie w pewnych grach, zwykle nie ma efektów ubocznych. "
"[Zalecane]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:196
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:188
msgid "Enable Wait Loop Detection"
msgstr "Aktywuj Wykrywanie Poczekania na Pętlę"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:197
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:189
msgid ""
"Moderate speedup for some games, with no known side effects. [Recommended]"
msgstr ""
"Średnie przyspieszenie dla niektórych gier, bez znanych efektów ubocznych. "
"[Zalecane]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:199
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
msgid "Enable fast CDVD"
msgstr "Aktywuj szybkie CDVD"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:192
msgid "Fast disc access, less loading times. [Not Recommended]"
msgstr ""
"Szybki dostęp do dysku, mniejsze czasy wgrywania.\n"
@@ -2530,7 +2519,7 @@ msgstr "FPS"
msgid "PAL Framerate:"
msgstr "Ilość klatek systemu PAL:"
-#: pcsx2/gui/Panels/VideoPanel.cpp:162
+#: pcsx2/gui/Panels/VideoPanel.cpp:166
msgid ""
"Error while parsing either NTSC or PAL framerate settings. Settings must be "
"valid floating point numerics."
@@ -2538,19 +2527,19 @@ msgstr ""
"Błąd podczas składania ustawień klatek animacji NTSC lub PAL. Ustawienia "
"muszą zawierać prawidłowe liczby rzeczywiste."
-#: pcsx2/gui/Panels/VideoPanel.cpp:180
+#: pcsx2/gui/Panels/VideoPanel.cpp:184
msgid "Disabled [default]"
msgstr "Wyłączone [standardowo]"
-#: pcsx2/gui/Panels/VideoPanel.cpp:184
+#: pcsx2/gui/Panels/VideoPanel.cpp:188
msgid "Skip when on Turbo only (TAB to enable)"
msgstr "Pomijaj tylko w trybie przyspieszonym (TAB przełącza)"
-#: pcsx2/gui/Panels/VideoPanel.cpp:188
+#: pcsx2/gui/Panels/VideoPanel.cpp:192
msgid "Constant skipping"
msgstr "Stale pomijaj"
-#: pcsx2/gui/Panels/VideoPanel.cpp:190
+#: pcsx2/gui/Panels/VideoPanel.cpp:194
msgid ""
"Normal and Turbo limit rates skip frames. Slow motion mode will still "
"disable frameskipping."
@@ -2558,19 +2547,19 @@ msgstr ""
"Normalny i Przyspieszony limit pomija klatki animacji. Spowolniony nadal "
"wyłącza pomijanie."
-#: pcsx2/gui/Panels/VideoPanel.cpp:213
+#: pcsx2/gui/Panels/VideoPanel.cpp:217
msgid "Frames to Draw"
msgstr "Klatek do Pokazania"
-#: pcsx2/gui/Panels/VideoPanel.cpp:218
+#: pcsx2/gui/Panels/VideoPanel.cpp:222
msgid "Frames to Skip"
msgstr "Klatek do Pominięcia"
-#: pcsx2/gui/Panels/VideoPanel.cpp:294
+#: pcsx2/gui/Panels/VideoPanel.cpp:298
msgid "Use Synchronized MTGS"
msgstr "Użyj Synchronizowanego MTGS"
-#: pcsx2/gui/Panels/VideoPanel.cpp:295
+#: pcsx2/gui/Panels/VideoPanel.cpp:299
msgid ""
"For troubleshooting potential bugs in the MTGS only, as it is potentially "
"very slow."
@@ -2578,11 +2567,11 @@ msgstr ""
"Tylko w celach testowych i wyłapywania potencjalnych błędów w MTGS gdyż jest "
"potencjalnie bardzo wolne."
-#: pcsx2/gui/Panels/VideoPanel.cpp:298
+#: pcsx2/gui/Panels/VideoPanel.cpp:302
msgid "Disable all GS output"
msgstr "Wyłącz całkowicie wyświetlanie obrazu"
-#: pcsx2/gui/Panels/VideoPanel.cpp:299
+#: pcsx2/gui/Panels/VideoPanel.cpp:303
msgid ""
"Completely disables all GS plugin activity; ideal for benchmarking EEcore "
"components."
@@ -2590,11 +2579,11 @@ msgstr ""
"Całkowicie wyłącza całą aktywność silnika graficznego; idealne do testowania "
"componentów EEcore."
-#: pcsx2/gui/Panels/VideoPanel.cpp:316
+#: pcsx2/gui/Panels/VideoPanel.cpp:320
msgid "Frame Skipping"
msgstr "Pomijanie Klatek Animacji"
-#: pcsx2/gui/Panels/VideoPanel.cpp:319
+#: pcsx2/gui/Panels/VideoPanel.cpp:323
msgid "Framelimiter"
msgstr "Limiter Klatek Animacji"
@@ -2682,3 +2671,12 @@ msgid ""
msgstr ""
"Rozszerzenia %s nie znalezione. Recompilator microVU wymaga procesora "
"obsługującego rozszerzenia MMX, SSE oraz SSE2."
+
+#~ msgid "mVU Block Hack"
+#~ msgstr "mVU Block Hack"
+
+#~ msgid ""
+#~ "Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
+#~ msgstr ""
+#~ "Dobre przyspieszenie i duża kompatybilność; może powodować błędy grafiki, "
+#~ "SPS, itd..."
diff --git a/locales/pt_BR/pcsx2_Iconized.po b/locales/pt_BR/pcsx2_Iconized.po
index 4f8706b00..4388add8e 100644
--- a/locales/pt_BR/pcsx2_Iconized.po
+++ b/locales/pt_BR/pcsx2_Iconized.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.7\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-09-28 20:27+0200\n"
+"POT-Creation-Date: 2012-04-07 11:42+0200\n"
"PO-Revision-Date: 2011-09-11 23:09-0300\n"
"Last-Translator: Rafael Ferreira \n"
"Language-Team: \n"
@@ -31,7 +31,7 @@ msgstr ""
"virtual necessários já foram reservados para outros processos, serviços ou "
"DLLs."
-#: pcsx2/CDVD/CDVD.cpp:385
+#: pcsx2/CDVD/CDVD.cpp:389
msgid "!Notice:PsxDisc"
msgstr ""
"Discos de jogos de Playstation não têm suporte no PCSX2. Se você quiser "
@@ -476,21 +476,14 @@ msgstr ""
"EmotionEngine. Maiores valores aumentam o número de ciclos roubados do EE "
"para cada micro-programa VU que o jogo roda."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:172
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "!ContextTip:Speedhacks:vuFlagHack"
msgstr ""
"Atualiza Sinalizadores de Estado somente nos blocos que vão ler eles, ao "
"contrário de de o tempo todo. Isso é seguro na maioria do tempo, e o Super "
"VU faz coisa semelhante por padrão."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:177
-msgid "!ContextTip:Speedhacks:vuBlockHack"
-msgstr ""
-"Presume que num futuro bem distante os blocos não vão precisar dos dados de "
-"instâncias de sinalizadores antigos. Isso pode ser bem seguro. Não se sabe "
-"se isso quebra algum jogo..."
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:182
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:174
msgid "!ContextTip:Speedhacks:vuThread"
msgstr ""
"Executa VU1 em uma thread própria (somente microVU1). Em geral, é uma "
@@ -499,7 +492,7 @@ msgstr ""
"caso de jogos limitados pelo GS, pode ser um atraso (especialmente em CPUs "
"dual core)."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:203
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:195
msgid "!ContextTip:Speedhacks:INTC"
msgstr ""
"Esse hack funciona melhor para jogos que usam o registrador de INTC Status "
@@ -507,7 +500,7 @@ msgstr ""
"Jogos que não usam esse método de vsync vão aproveitar um pouco ou nada de "
"aceleração desse hack."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:208
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
msgid "!ContextTip:Speedhacks:BIFC0"
msgstr ""
"Mirando primariamente o loop ocioso do EE no endereço 0x81Fc0 no kernel, "
@@ -517,7 +510,7 @@ msgstr ""
"avançamos para a vez do evento seguinte ou o fim da fatia de tempo do "
"processador, seja qual for que vier a ocorrer primeiro."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:215
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:207
msgid "!ContextTip:Speedhacks:fastCDVD"
msgstr ""
"Verifica lista de compatibilidade de HDLoader para jogos conhecidos que "
@@ -530,19 +523,19 @@ msgstr ""
"Note que quando o Limitador de Frames está desabilitado, os modos Turbo e "
"Câmera Lenta também não vão estar disponíveis."
-#: pcsx2/gui/Panels/VideoPanel.cpp:223
+#: pcsx2/gui/Panels/VideoPanel.cpp:227
msgid "!Panel:Frameskip:Heading"
msgstr ""
"Nota: Por causa do design do PS2, frame skipping preciso não é possível. "
"Ativar essa opção pode causar sérios erros gráficos em alguns jogos."
-#: pcsx2/gui/Panels/VideoPanel.cpp:302
+#: pcsx2/gui/Panels/VideoPanel.cpp:306
msgid "!ContextTip:GS:SyncMTGS"
msgstr ""
"Habilite isso se você achar que a sincronização da thread MTGS está causando "
"travamentos ou erros gráficos."
-#: pcsx2/gui/Panels/VideoPanel.cpp:306
+#: pcsx2/gui/Panels/VideoPanel.cpp:310
msgid "!ContextTip:GS:DisableOutput"
msgstr ""
"Remove qualquer ruído padrão causado pela sobrecarga da thread MTGS ou da "
@@ -567,6 +560,12 @@ msgstr ""
"erro não é crítico, uma vez que o recompilador sVU está obsoleto, e, ao "
"invés dele, você deveria usar o microVU. :)"
+#~ msgid "!ContextTip:Speedhacks:vuBlockHack"
+#~ msgstr ""
+#~ "Presume que num futuro bem distante os blocos não vão precisar dos dados "
+#~ "de instâncias de sinalizadores antigos. Isso pode ser bem seguro. Não se "
+#~ "sabe se isso quebra algum jogo..."
+
#~ msgid ""
#~ "The MTGS thread has become unresponsive while waiting for the GS plugin "
#~ "to open."
diff --git a/locales/pt_BR/pcsx2_Main.po b/locales/pt_BR/pcsx2_Main.po
index 689525594..ca807db60 100644
--- a/locales/pt_BR/pcsx2_Main.po
+++ b/locales/pt_BR/pcsx2_Main.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.7\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-09-28 20:27+0200\n"
+"POT-Creation-Date: 2012-02-28 12:20+0100\n"
"PO-Revision-Date: 2011-09-11 23:09-0300\n"
"Last-Translator: Rafael Ferreira \n"
"Language-Team: \n"
@@ -202,7 +202,7 @@ msgstr "Plug-in de Cartão de Memória interno falhou em inicializar."
msgid "Unloaded Plugin"
msgstr "Plug-in descarregado"
-#: pcsx2/SaveState.cpp:339
+#: pcsx2/SaveState.cpp:342
msgid "Cannot load savestate. It is of an unknown or unsupported version."
msgstr ""
"Não foi possível carregar o savestate. Ele é de uma versão desconhecida ou "
@@ -382,31 +382,31 @@ msgstr ""
"O savestate não foi armazenado corretamente. O arquivo temporário foi criado "
"com sucesso, mas não pôde ser movido para seu destino de armazenamento."
-#: pcsx2/gui/AppConfig.cpp:837
+#: pcsx2/gui/AppConfig.cpp:842
msgid "Safest"
msgstr "Mais seguro"
-#: pcsx2/gui/AppConfig.cpp:838
+#: pcsx2/gui/AppConfig.cpp:843
msgid "Safe (faster)"
msgstr "Seguro (+ rápido)"
-#: pcsx2/gui/AppConfig.cpp:839
+#: pcsx2/gui/AppConfig.cpp:844
msgid "Balanced"
msgstr "Balanceado"
-#: pcsx2/gui/AppConfig.cpp:840
+#: pcsx2/gui/AppConfig.cpp:845
msgid "Aggressive"
msgstr "Agressivo"
-#: pcsx2/gui/AppConfig.cpp:841
+#: pcsx2/gui/AppConfig.cpp:846
msgid "Aggressive plus"
msgstr "Agressivo plus"
-#: pcsx2/gui/AppConfig.cpp:842
+#: pcsx2/gui/AppConfig.cpp:847
msgid "Mostly Harmful"
msgstr "Prejudicial"
-#: pcsx2/gui/AppConfig.cpp:999 pcsx2/gui/AppConfig.cpp:1005
+#: pcsx2/gui/AppConfig.cpp:1007 pcsx2/gui/AppConfig.cpp:1013
msgid "Failed to overwrite existing settings file; permission was denied."
msgstr ""
"Falha em sobrescrever arquivo de configurações existentes; permissão negada."
@@ -2461,21 +2461,10 @@ msgstr ""
"[Recomendado]"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:166
-msgid "mVU Block Hack"
-msgstr "Hack de Bloco mVU"
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
-msgid ""
-"Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
-msgstr ""
-"Boa Aceleração e Alta Compatibilidade; pode ocasionar gráficos ruins, SPS, "
-"etc."
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "MTVU (Multi-Threaded microVU1)"
msgstr "MTVU (Multi-Threaded microVU1)"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:170
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
msgid ""
"Good Speedup and High Compatibility; may cause hanging... [Recommended if 3+ "
"cores]"
@@ -2483,15 +2472,15 @@ msgstr ""
"Boa Aceleração e Alta Compatibilidade; pode causar travamento... "
"[Recomendado para 3+ núcleos]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:183
msgid "Other Hacks"
msgstr "Outros Hacks"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:193
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:185
msgid "Enable INTC Spin Detection"
msgstr "Habilita Detecção de Rotação INTC"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:194
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:186
msgid ""
"Huge speedup for some games, with almost no compatibility side effects. "
"[Recommended]"
@@ -2499,22 +2488,22 @@ msgstr ""
"Imensa aceleração para alguns jogos, com quase nenhum efeito colateral. "
"[Recomendado]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:196
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:188
msgid "Enable Wait Loop Detection"
msgstr "Habilita Detecção de Loop de Espera"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:197
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:189
msgid ""
"Moderate speedup for some games, with no known side effects. [Recommended]"
msgstr ""
"Moderada aceleração para alguns jogos, com nenhum efeito colateral conhecido "
"[Recomendado]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:199
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
msgid "Enable fast CDVD"
msgstr "Habilita CDVD rápido"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:192
msgid "Fast disc access, less loading times. [Not Recommended]"
msgstr "Acesso rápido ao disco, menor tempo de carregamento. [Não recomendado]"
@@ -2573,7 +2562,7 @@ msgstr "FPS"
msgid "PAL Framerate:"
msgstr "Framerate de PAL:"
-#: pcsx2/gui/Panels/VideoPanel.cpp:162
+#: pcsx2/gui/Panels/VideoPanel.cpp:166
msgid ""
"Error while parsing either NTSC or PAL framerate settings. Settings must be "
"valid floating point numerics."
@@ -2581,19 +2570,19 @@ msgstr ""
"Erro enquanto analisava as configurações de taxas de frame de NTSC ou PAL. "
"As cofigurações devem ser pontos flutuantes numéricos válidos."
-#: pcsx2/gui/Panels/VideoPanel.cpp:180
+#: pcsx2/gui/Panels/VideoPanel.cpp:184
msgid "Disabled [default]"
msgstr "Desabilitado [padrão]"
-#: pcsx2/gui/Panels/VideoPanel.cpp:184
+#: pcsx2/gui/Panels/VideoPanel.cpp:188
msgid "Skip when on Turbo only (TAB to enable)"
msgstr "Pular quando usar Turbo somente (TAB para habilitar)"
-#: pcsx2/gui/Panels/VideoPanel.cpp:188
+#: pcsx2/gui/Panels/VideoPanel.cpp:192
msgid "Constant skipping"
msgstr "Pular constantemente"
-#: pcsx2/gui/Panels/VideoPanel.cpp:190
+#: pcsx2/gui/Panels/VideoPanel.cpp:194
msgid ""
"Normal and Turbo limit rates skip frames. Slow motion mode will still "
"disable frameskipping."
@@ -2601,19 +2590,19 @@ msgstr ""
"Taxa de limites Normal e Turbo aplicam Frame skipping. O modo câmera lenta "
"vai manter desabilitado Frame skipping."
-#: pcsx2/gui/Panels/VideoPanel.cpp:213
+#: pcsx2/gui/Panels/VideoPanel.cpp:217
msgid "Frames to Draw"
msgstr "Frames a Serem Desenhados"
-#: pcsx2/gui/Panels/VideoPanel.cpp:218
+#: pcsx2/gui/Panels/VideoPanel.cpp:222
msgid "Frames to Skip"
msgstr "Frames a Serem Pulados"
-#: pcsx2/gui/Panels/VideoPanel.cpp:294
+#: pcsx2/gui/Panels/VideoPanel.cpp:298
msgid "Use Synchronized MTGS"
msgstr "Usar MTGS Sincronizado"
-#: pcsx2/gui/Panels/VideoPanel.cpp:295
+#: pcsx2/gui/Panels/VideoPanel.cpp:299
msgid ""
"For troubleshooting potential bugs in the MTGS only, as it is potentially "
"very slow."
@@ -2621,11 +2610,11 @@ msgstr ""
"Somente para solucionar problemas de bugs em potencial no MTGS, pois ele é "
"potencialmente muito lento."
-#: pcsx2/gui/Panels/VideoPanel.cpp:298
+#: pcsx2/gui/Panels/VideoPanel.cpp:302
msgid "Disable all GS output"
msgstr "Desabilita toda saída do GS"
-#: pcsx2/gui/Panels/VideoPanel.cpp:299
+#: pcsx2/gui/Panels/VideoPanel.cpp:303
msgid ""
"Completely disables all GS plugin activity; ideal for benchmarking EEcore "
"components."
@@ -2633,11 +2622,11 @@ msgstr ""
"Desabilita completamente toda atividade do plug-in de GS; ideal para avaliar "
"a performance dos componentes do EEcore."
-#: pcsx2/gui/Panels/VideoPanel.cpp:316
+#: pcsx2/gui/Panels/VideoPanel.cpp:320
msgid "Frame Skipping"
msgstr "Frame Skipping"
-#: pcsx2/gui/Panels/VideoPanel.cpp:319
+#: pcsx2/gui/Panels/VideoPanel.cpp:323
msgid "Framelimiter"
msgstr "Limitador de Frames"
@@ -2725,3 +2714,12 @@ msgid ""
msgstr ""
"Extensões %s não encontradas. O microVU requer uma máquina com processador "
"que tenha extensões MMX, SSE e SSE2."
+
+#~ msgid "mVU Block Hack"
+#~ msgstr "Hack de Bloco mVU"
+
+#~ msgid ""
+#~ "Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
+#~ msgstr ""
+#~ "Boa Aceleração e Alta Compatibilidade; pode ocasionar gráficos ruins, "
+#~ "SPS, etc."
diff --git a/locales/ru_RU/pcsx2_Iconized.po b/locales/ru_RU/pcsx2_Iconized.po
index d6b5d4dc5..0526aae8b 100644
--- a/locales/ru_RU/pcsx2_Iconized.po
+++ b/locales/ru_RU/pcsx2_Iconized.po
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.9\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-09-28 20:27+0200\n"
+"POT-Creation-Date: 2012-04-07 11:42+0200\n"
"PO-Revision-Date: 2011-04-25 01:25+0100\n"
"Last-Translator: Bukhartsev Dmitriy \n"
"Language-Team: Kein \n"
@@ -26,7 +26,7 @@ msgstr ""
"В вашей системе недостаточно виртуальной памяти, либо же, доступное адресное "
"пространство уже занято другим процессом, службой или библиотеками."
-#: pcsx2/CDVD/CDVD.cpp:385
+#: pcsx2/CDVD/CDVD.cpp:389
msgid "!Notice:PsxDisc"
msgstr ""
"Эмулятор PCSX2 не поддерживает игры от PlayStation. Если вы желаете "
@@ -467,21 +467,14 @@ msgstr ""
"EmotionEngine. Более высокое значение хака увеличивает количество циклов, "
"которые будут \"позаимствованы\" у EE для обработки микропрограмм VU."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:172
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "!ContextTip:Speedhacks:vuFlagHack"
msgstr ""
"Обновляет флаги состояния только на тех блоках, которые будут читать данные "
"флаги (вместо постоянного обновления всех блоков). Вполне безопасный хак, "
"SuperVU-рекомпилятор делает нечто подобное по-умолчанию."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:177
-msgid "!ContextTip:Speedhacks:vuBlockHack"
-msgstr ""
-"Предугадывает, какие блоки микропрограмм не будут читать данные флагов в "
-"обозримом будущем. Неизвестно, провоцирует ли это какие-либо проблемы в "
-"каких-либо играх, посему, данный хак можно считать безопасным."
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:182
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:174
#, fuzzy
msgid "!ContextTip:Speedhacks:vuThread"
msgstr ""
@@ -489,7 +482,7 @@ msgstr ""
"дополнительных Min/Max-операций при просчете логики. \"Ломает\" Gran Turismo "
"4 и Tekken 5. Возможно что-то еще."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:203
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:195
msgid "!ContextTip:Speedhacks:INTC"
msgstr ""
"Данный хак лучше всего применять для игр которые используют регистрацию "
@@ -497,7 +490,7 @@ msgstr ""
"не использующие 3D. Все остальные игры либо не получат никакого ускорения, "
"либо оно будет чрезвычайно мало."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:208
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
msgid "!ContextTip:Speedhacks:BIFC0"
msgstr ""
"Изначально нацеленный на пустые циклы EE-рекомпилятора по адресу ядра "
@@ -511,7 +504,7 @@ msgstr ""
"событию или\n"
"вообще к концу процессорного интервала."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:215
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:207
msgid "!ContextTip:Speedhacks:fastCDVD"
msgstr ""
"Для получения списка игр, которые испытывают проблемы при использовании "
@@ -522,20 +515,20 @@ msgstr ""
msgid "!ContextTip:Framelimiter:Disable"
msgstr "Отключение лимита кадров отключит так же и Turbo-/Slowmotion-режимы."
-#: pcsx2/gui/Panels/VideoPanel.cpp:223
+#: pcsx2/gui/Panels/VideoPanel.cpp:227
msgid "!Panel:Frameskip:Heading"
msgstr ""
"Примечание: ввиду особенностей архитектуры аппаратной части PS2, аккуратный "
"пропуск кадров невозможен в принципе. Поэтому, его активация может "
"спровоцировать появление графических артефактов в некоторых играх."
-#: pcsx2/gui/Panels/VideoPanel.cpp:302
+#: pcsx2/gui/Panels/VideoPanel.cpp:306
msgid "!ContextTip:GS:SyncMTGS"
msgstr ""
"Включайте данную опцию только в том случае, если вы думаете что "
"синхронизация потоков MTGS приводит к вылетам или графическим артефактам."
-#: pcsx2/gui/Panels/VideoPanel.cpp:306
+#: pcsx2/gui/Panels/VideoPanel.cpp:310
msgid "!ContextTip:GS:DisableOutput"
msgstr ""
"Отключает обработку всех GS-данных, тем самым убирая возможный замедляющий "
@@ -561,6 +554,12 @@ msgstr ""
"стоит расстраиваться, ведь SuperVU устарел и вы всегда можете выбрать "
"\"новый и блестящий\" microVU :P"
+#~ msgid "!ContextTip:Speedhacks:vuBlockHack"
+#~ msgstr ""
+#~ "Предугадывает, какие блоки микропрограмм не будут читать данные флагов в "
+#~ "обозримом будущем. Неизвестно, провоцирует ли это какие-либо проблемы в "
+#~ "каких-либо играх, посему, данный хак можно считать безопасным."
+
#~ msgid "No reason given."
#~ msgstr "Причина неизвестна."
diff --git a/locales/ru_RU/pcsx2_Main.po b/locales/ru_RU/pcsx2_Main.po
index d684b1d01..893a04dc7 100644
--- a/locales/ru_RU/pcsx2_Main.po
+++ b/locales/ru_RU/pcsx2_Main.po
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.9\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-09-28 20:27+0200\n"
+"POT-Creation-Date: 2012-02-28 12:20+0100\n"
"PO-Revision-Date: 2011-04-25 19:40+0100\n"
"Last-Translator: Bukhartsev Dmitriy \n"
"Language-Team: Kein \n"
@@ -197,7 +197,7 @@ msgstr "Ошибка инициализации встроенного плаг
msgid "Unloaded Plugin"
msgstr "Выгруженный плагин"
-#: pcsx2/SaveState.cpp:339
+#: pcsx2/SaveState.cpp:342
msgid "Cannot load savestate. It is of an unknown or unsupported version."
msgstr ""
"Ошибка загрузки быстрого сохранения. Его версия неизвестна или не "
@@ -370,31 +370,31 @@ msgstr ""
"вполне успешно, но по каким-то причинам он не может быть перемещен в пункт "
"назначения."
-#: pcsx2/gui/AppConfig.cpp:837
+#: pcsx2/gui/AppConfig.cpp:842
msgid "Safest"
msgstr "Очень безопасно"
-#: pcsx2/gui/AppConfig.cpp:838
+#: pcsx2/gui/AppConfig.cpp:843
msgid "Safe (faster)"
msgstr "Безопасно (и быстрее)"
-#: pcsx2/gui/AppConfig.cpp:839
+#: pcsx2/gui/AppConfig.cpp:844
msgid "Balanced"
msgstr "Сбалансировано"
-#: pcsx2/gui/AppConfig.cpp:840
+#: pcsx2/gui/AppConfig.cpp:845
msgid "Aggressive"
msgstr "Агрессивно"
-#: pcsx2/gui/AppConfig.cpp:841
+#: pcsx2/gui/AppConfig.cpp:846
msgid "Aggressive plus"
msgstr "Более агрессивно!"
-#: pcsx2/gui/AppConfig.cpp:842
+#: pcsx2/gui/AppConfig.cpp:847
msgid "Mostly Harmful"
msgstr "В большинстве случаев губительно..."
-#: pcsx2/gui/AppConfig.cpp:999 pcsx2/gui/AppConfig.cpp:1005
+#: pcsx2/gui/AppConfig.cpp:1007 pcsx2/gui/AppConfig.cpp:1013
msgid "Failed to overwrite existing settings file; permission was denied."
msgstr "Ошибка прав доступа при перезаписи текущего файла настроек."
@@ -2446,22 +2446,10 @@ msgstr ""
"[рекомендуется]"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:166
-msgid "mVU Block Hack"
-msgstr "mVU Block Hack"
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
-#, fuzzy
-msgid ""
-"Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
-msgstr ""
-"Неплохое ускорение и вполне неплохая совместимость. Возможно появление "
-"графического \"мусора\", черного экрана, выпадающих полигонов и т.п."
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "MTVU (Multi-Threaded microVU1)"
msgstr ""
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:170
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
#, fuzzy
msgid ""
"Good Speedup and High Compatibility; may cause hanging... [Recommended if 3+ "
@@ -2471,15 +2459,15 @@ msgstr ""
"графического \"мусора\", черного экрана, выпадающих полигонов и т.п. "
"[рекомендуется]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:183
msgid "Other Hacks"
msgstr "Другие хаки"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:193
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:185
msgid "Enable INTC Spin Detection"
msgstr "Включить INTC Spin Detection"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:194
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:186
msgid ""
"Huge speedup for some games, with almost no compatibility side effects. "
"[Recommended]"
@@ -2487,22 +2475,22 @@ msgstr ""
"Серьезное повышение производительности и почти без каких-либо побочных "
"эффектов. [рекомендуется]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:196
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:188
msgid "Enable Wait Loop Detection"
msgstr "Включить Wait Loop Detection"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:197
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:189
msgid ""
"Moderate speedup for some games, with no known side effects. [Recommended]"
msgstr ""
"Неплохое ускорение некоторых игр без каких-либо побочных эффектов. "
"[рекомендуется]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:199
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
msgid "Enable fast CDVD"
msgstr "Включить fast CDVD"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:192
msgid "Fast disc access, less loading times. [Not Recommended]"
msgstr "Ускоряет доступ к диску, уменьшает время загрузки. [не рекомендуется]"
@@ -2559,7 +2547,7 @@ msgstr "FPS"
msgid "PAL Framerate:"
msgstr "Лимит кадров для PAL-игр"
-#: pcsx2/gui/Panels/VideoPanel.cpp:162
+#: pcsx2/gui/Panels/VideoPanel.cpp:166
msgid ""
"Error while parsing either NTSC or PAL framerate settings. Settings must be "
"valid floating point numerics."
@@ -2567,19 +2555,19 @@ msgstr ""
"Возникла ошибка при чтении настроек частот кадров или NTSC или PAL. "
"Настройки должны быть действительными числами с плавающей точкой."
-#: pcsx2/gui/Panels/VideoPanel.cpp:180
+#: pcsx2/gui/Panels/VideoPanel.cpp:184
msgid "Disabled [default]"
msgstr "Отключен (по умолчанию)"
-#: pcsx2/gui/Panels/VideoPanel.cpp:184
+#: pcsx2/gui/Panels/VideoPanel.cpp:188
msgid "Skip when on Turbo only (TAB to enable)"
msgstr "Пропускать только в режиме ускорения (TAB для включения)"
-#: pcsx2/gui/Panels/VideoPanel.cpp:188
+#: pcsx2/gui/Panels/VideoPanel.cpp:192
msgid "Constant skipping"
msgstr "Постоянный пропуск"
-#: pcsx2/gui/Panels/VideoPanel.cpp:190
+#: pcsx2/gui/Panels/VideoPanel.cpp:194
msgid ""
"Normal and Turbo limit rates skip frames. Slow motion mode will still "
"disable frameskipping."
@@ -2587,19 +2575,19 @@ msgstr ""
"Normal- и Turbo-режимы позволяют пропуск кадров. Slowmotion-режим отключает "
"любой пропуск кадров."
-#: pcsx2/gui/Panels/VideoPanel.cpp:213
+#: pcsx2/gui/Panels/VideoPanel.cpp:217
msgid "Frames to Draw"
msgstr "кол-во кадров для прорисовки"
-#: pcsx2/gui/Panels/VideoPanel.cpp:218
+#: pcsx2/gui/Panels/VideoPanel.cpp:222
msgid "Frames to Skip"
msgstr "кол-во кадров для пропуска"
-#: pcsx2/gui/Panels/VideoPanel.cpp:294
+#: pcsx2/gui/Panels/VideoPanel.cpp:298
msgid "Use Synchronized MTGS"
msgstr "Использовать синхронизацию MTGS"
-#: pcsx2/gui/Panels/VideoPanel.cpp:295
+#: pcsx2/gui/Panels/VideoPanel.cpp:299
msgid ""
"For troubleshooting potential bugs in the MTGS only, as it is potentially "
"very slow."
@@ -2607,11 +2595,11 @@ msgstr ""
"Только для поиска потенциальных багов и неисправностей в MTGS, так как "
"(потенциально) это слишком медленно"
-#: pcsx2/gui/Panels/VideoPanel.cpp:298
+#: pcsx2/gui/Panels/VideoPanel.cpp:302
msgid "Disable all GS output"
msgstr "Отключить вывод GS-данных."
-#: pcsx2/gui/Panels/VideoPanel.cpp:299
+#: pcsx2/gui/Panels/VideoPanel.cpp:303
msgid ""
"Completely disables all GS plugin activity; ideal for benchmarking EEcore "
"components."
@@ -2619,11 +2607,11 @@ msgstr ""
"Сводит на ноль всю активность GS плагина. Идеально для тестирования "
"компонентов EE ядра."
-#: pcsx2/gui/Panels/VideoPanel.cpp:316
+#: pcsx2/gui/Panels/VideoPanel.cpp:320
msgid "Frame Skipping"
msgstr "Пропуск кадров"
-#: pcsx2/gui/Panels/VideoPanel.cpp:319
+#: pcsx2/gui/Panels/VideoPanel.cpp:323
msgid "Framelimiter"
msgstr "Лимит кадров"
@@ -2711,6 +2699,16 @@ msgstr ""
"Расширение %s не обнаружено. microVU-рекомпилятору необходим процессор с "
"поддержкой инструкций MMX, SSE, и SSE2."
+#~ msgid "mVU Block Hack"
+#~ msgstr "mVU Block Hack"
+
+#, fuzzy
+#~ msgid ""
+#~ "Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
+#~ msgstr ""
+#~ "Неплохое ускорение и вполне неплохая совместимость. Возможно появление "
+#~ "графического \"мусора\", черного экрана, выпадающих полигонов и т.п."
+
#~ msgid "!ContextTip:ChangingNTFS"
#~ msgstr ""
#~ "Режим NTFS-компрессии может быть изменен в любой момент времени через "
diff --git a/locales/sv_SE/pcsx2_Iconized.po b/locales/sv_SE/pcsx2_Iconized.po
index 7559d4a7a..bbd5ea229 100644
--- a/locales/sv_SE/pcsx2_Iconized.po
+++ b/locales/sv_SE/pcsx2_Iconized.po
@@ -4,8 +4,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.9\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-11-16 20:16+0100\n"
-"PO-Revision-Date: 2011-11-16 12:51+0100\n"
+"POT-Creation-Date: 2012-04-07 11:42+0200\n"
+"PO-Revision-Date: 2012-02-28 12:54+0100\n"
"Last-Translator: Georg Ronnert \n"
"Language-Team: \n"
"Language: \n"
@@ -23,41 +23,43 @@ msgstr ""
#: common/src/Utilities/Exceptions.cpp:254
msgid "!Notice:VirtualMemoryMap"
msgstr ""
-"Det finns inte tillräkligt med virtuellt minne tillgängligt, eller så har "
+"Det finns inte tillräckligt med virtuellt minne tillgängligt, eller så har "
"den nödvändiga \n"
-"virtuella minnestilldelningen redan blivit reserverat av andra processer, "
+" virtuella minnestilldelningen redan blivit reserverat av andra processer, "
"tjänster, eller DLL'er."
-#: pcsx2/CDVD/CDVD.cpp:385
+#: pcsx2/CDVD/CDVD.cpp:389
msgid "!Notice:PsxDisc"
msgstr ""
-"Playstation speldiskar stödjes inte av PCSX2. Om Ni vill emulera PSX spel \n"
-"så måste Ni ladda ner en PSX-specifik emulator, såsom ePSXe eller PCSX."
+"PlayStation®One speldiskar stödjes inte av PCSX2. Om Ni vill emulera PSX-"
+"spel \n"
+" får Ni använda en särskild PSX-emulator, såsom ePSXe eller PCSX."
#: pcsx2/System.cpp:114
msgid "!Notice:Recompiler:VirtualMemoryAlloc"
msgstr ""
"Denna omkompilerare var oförmögen att reservera det angränsande minne som "
-"kräves för interna förråd. \n"
-"Detta fel kan ha orsakats av låga VM-resurser, såsom en liten eller "
-"förhindrad bytfil, \n"
-"eller av ett annat program som tar för sig mycket minne. Ni kan annars pröva "
-"minska förvalsförrådsstorleken \n"
-"för alla av PCSX2's omkompilerare, vilket finns under Värdinställningar."
+"krävs för inhemska förråd. \n"
+"Detta fel kan ha orsakats av låga Virtuella Maskin resurser, såsom en liten "
+"eller förhindrad bytfil, \n"
+" eller av ett annat program som tar för sig mycket minne. Ni kan annars "
+"pröva minska förvalsförrådsstorleken \n"
+" för PCSX2's alla omkompilerare, vilket kan göras genom "
+"''Värdinställningar''."
#: pcsx2/System.cpp:348
msgid "!Notice:EmuCore::MemoryForVM"
msgstr ""
-"PCSX2 är oförmögen att tilldela det minne som kräves för PS2-VM. \n"
+"PCSX2 är oförmögen att tilldela det minne som krävs för PS2's Virtuella "
+"Maskin. \n"
"Stäng minneskrävande bakgrundsprogram och försök igen."
#: pcsx2/gui/AppInit.cpp:43
msgid "!Notice:Startup:NoSSE2"
msgstr ""
-"Varning: Er dator stödjer inte SSE2, vilket krävs av många PCSX2 "
+"Varning: Er dator stödjer inte SSE2, vilket krävs för många av PCSX2's "
"omkompilerare och insticksprogram. \n"
-"Era möjligheter kommer att vara begränsade och emuleringen att vara *mycket* "
-"långsam."
+"Era möjligheter kommer vara begränsade och emuleringen blir *mycket* långsam."
#: pcsx2/gui/AppInit.cpp:162
msgid "!Notice:RecompilerInit:Header"
@@ -76,155 +78,155 @@ msgstr ""
#: pcsx2/gui/AppMain.cpp:546
msgid "!Notice:BiosDumpRequired"
msgstr ""
-"PCSX2 kräver PS2-BIOS för att köras. \n"
+"PCSX2 kräver PS2 BIOS för att köras. \n"
"Av juridiska skäl *måste* Ni anskaffa ett BIOS från en faktisk PS2-enhet som "
-"Ni äger (tillåns räknas inte). \n"
-"Konsultera FAQ's och Guider för ytterligare information."
+"Ni äger (tillåns gäller inte). \n"
+"Undersök FAQ'er och Guider för ytterligare information."
#: pcsx2/gui/AppMain.cpp:629
msgid "!Notice Error:Thread Deadlock Actions"
msgstr ""
-"Ignorera' för att fortsätta vänta på trådarna att svara. \n"
-"Avbryt' för att försöka avbryta tråden. \n"
-"Avsluta' för att avsluta PCSX2 omedelebart."
+"''Ignorera'' för att fortsätta vänta på trådarna att svara. \n"
+"''Avbryt'' för att försöka avbryta tråden. \n"
+"''Avsluta'' för att avsluta PCSX2 omedelebart."
#: pcsx2/gui/AppUserMode.cpp:57
msgid "!Notice:PortableModeRights"
msgstr ""
"Försäkra Er om att dessa mappar är skapade och att Er användarbehörighet "
"medger \n"
-"skrivskydd för dem -- eller återkör PCSX2 med upphöjd (administratör) "
+" skrivning för dem -- eller återkör PCSX2 med upphöjd (Administratörs) "
"behörighet, \n"
-"vilket borde medge PCSX2 förmågan att skapa de nödvändiga mapparna självt. \n"
-"Om Ni inte har upphöjd behörighet för denna dator, \n"
-"måste Ni byta till Användar Dokument läge (klicka på knappen nedanför)."
+" vilket borde medge PCSX2 förmågan att skapa de nödvändiga mapparna "
+"självt. \n"
+"Om Ni inte har upphöjd behörighet för Er dator, \n"
+" får Ni byta till AnvändarDokument-läge (klicka på knappen nedanför)."
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:181
msgid "!ContextTip:ChangingNTFS"
msgstr ""
-"NTFS komprimering kan ändras manuellt när som helst genom att använda "
-"filegenskaper hos Windows Explorer."
+"NTFS-komprimering kan ändras manuellt när som helst \n"
+" genom att använda filegenskaper hos Windows Explorer."
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:49
msgid "!ContextTip:Folders:Settings"
msgstr ""
"Detta är mappen där PCSX2 sparar Era inställningar, och då även "
"inställningar skapade \n"
-"av de flesta insticksprogram (gäller måhända dock inte för vissa äldre "
+" av de flesta insticksprogram (gäller måhända dock inte för vissa äldre "
"insticksprogram)."
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:54
msgid "!Panel:Folders:Settings"
msgstr ""
"Ni kan förslagsvis ange en placering för Era PCSX2-inställningar här. Om "
-"placeringen \n"
-"innehåller befintliga PCSX2-inställningar, så kommer Ni erbjudas möjligheten "
-"att importera och överskriva."
+"placeringen innehåller \n"
+" befintliga PCSX2-inställningar kommer Ni ges möjlighet att importera och "
+"överskriva."
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:94
msgid "!Wizard:Welcome"
msgstr ""
-"Denna trollkarl kommer att vägleda Er igenom "
+"Denna trollkarl kommer att hjälpleda Er genom "
"konfigurationsinsticksprogram, \n"
-"minneskort, och BIOS. Ifall detta är första gången Ni installerar %s, \n"
-"så rekommenderas Ni att kolla in Läsmig och konfigurationsvägledningen."
+" minneskort, och BIOS. Ifall detta är första gången Ni installerar %s, \n"
+" Anrådes Ni att undersöka ''Läs mig'' och ''KonfigurationsVägledningen''."
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:140
msgid "!Wizard:Bios:Tutorial"
msgstr ""
-"PCSX2 kräver *lagligt* PS2-BIOS för att köra spel. \n"
-"Ni kan inte använda en kopia anförskaffat från en vän eller genom "
-"Internet. \n"
-"Ni måste dumpa BIOS'et från Er *egna* Playstation 2 konsol."
+"PCSX2 kräver *lagligt* PS2 BIOS för att köra spel. \n"
+"Ni får inte använda en kopia anförskaffat genom en vän eller Internet. \n"
+"Ni måste dumpa BIOS'et från Er *egna* PlayStation®2 konsol."
#: pcsx2/gui/Dialogs/ImportSettingsDialog.cpp:31
msgid "!Notice:ImportExistingSettings"
msgstr ""
-"Befintliga %s inställningar har hittats i "
-"konfigurationsinställningsmappen. \n"
-"Vill Ni importera dessa inställningar och överskriva %s förval med dem? \n"
+"Befintliga %s-inställningar har hittats i "
+"Konfigurationsinställningsmappen. \n"
+"Vill Ni importera dessa inställningar och överskriva %s's förval med dem? \n"
"\n"
-"\n"
-"(eller tryck Avbryt för att välja en annan mapp)"
+"(eller tryck ''Avbryt'' för att välja en annan mapp)"
#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:30
msgid "!Panel:Mcd:NtfsCompress"
msgstr ""
-"NTFS komprimering är inbyggt, snabbt, och helt tillförlitligt; \n"
-"det komprimerar vanligtvis minneskort mycket bra (denna tillämpning "
-"rekommenderas)."
+"NTFS-komprimering är inbyggt, snabbt, och helt tillförlitligt; det "
+"komprimerar \n"
+" vanligtvis minneskort mycket bra (denna tillämpning Anrådes tydligt)."
#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:41
msgid "!Panel:Mcd:EnableEjection"
msgstr ""
"Undviker minneskortsförstörelse genom att tvinga spel att återindexera "
"kortinnehåll \n"
-"efter att ha laddat från sparpunkt. Måhända inte förenligt med alla spel "
-"(Guitar Hero)."
+" efter att ha laddat från sparpunkt. Måhända inte förenligt med alla spel "
+"(''Guitar Hero'')."
#: pcsx2/gui/Dialogs/StuckThreadDialog.cpp:33
msgid "!Panel:StuckThread:Heading"
msgstr ""
-"Tråden '%s' svarar inte. \n"
-"Den kan ha gått i baklås, eller kanske bara kör *väldigt* långsamt."
+"Tråden ''%s'' svarar inte. \n"
+"Den kan ha gått i baklås, eller kör kanske bara *väldigt* långsamt."
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:38
msgid "!Panel:HasHacksOverrides"
msgstr ""
-"Varning! Ni kör PCSX2 med instruktionsmöjligheter som upphäver Era "
-"konfigurationsinställningar. Dessa instruktionsmöjligheter kommer inte "
-"beaktas i Inställningar, och kommer att förhindras om Ni tillämpar några "
-"förändringar här."
+"Varning! Ni tillämpar PCSX2 med åsidosättning av Era "
+"konfigurationsinställningar. \n"
+"Detta åskådliggörs inte i Inställningar, och kommer att förhindras om Ni "
+"tillämpar några förändringar här."
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:58
msgid "!Panel:HasPluginsOverrides"
msgstr ""
-"Varning! Ni kör PCSX2 med instruktionsmöjligheter som upphäver Era insticks- "
-"och/eller mappkonfigurationsinställningar. Dessa instruktionsmöjligheter "
-"kommer inte beaktas i Inställningar, och kommer att förhindras om Ni "
-"tillämpar några förändringar här."
+"Varning! Ni tillämpar PCSX2 med åsidosättning av Era insticks- och/eller "
+"mappkonfigurationsinställningar. \n"
+"Detta åskådliggörs inte i Inställningar, och kommer att förhindras om Ni "
+"tillämpar inställningsförändringar här."
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:135
msgid "!Notice:Tooltip:Presets:Slider"
msgstr ""
-"Förinställningarna tillämpar snabbfixar, några omkompilerarmöjligheter, och "
-"en del spelfixar som till vetskap höjer farten.\n"
-"Spelfixar som till vetskap är viktiga ('Patchar') kommer tillämpas "
-"automatiskt.\n"
+"Förinställningarna tillämpar snabbfixar, några omkompilerarfunktioner, \n"
+" och en del spelfixar som till vetskap ökar farten. \n"
+"Spelfixar som till vetskap är viktiga (''Patchar'') kommer tillämpas "
+"automatiskt. \n"
"\n"
-"Förinställningsinfo:\n"
-"1 - Det riktigaste emuleringen, men också den långsammaste.\n"
-"3 --> Försöker balansera hastighet med förenlighet.\n"
-"4 - Några mer aggresiva fixar.\n"
-"6 - För många fixar kommer förmodligen att sakta ner de flesta spel."
+"Förinställningsinfo: \n"
+" 1 - Det riktigaste emuleringen, men också den långsammaste. \n"
+" 3 --> Försöker balansera hastighet med förenlighet. \n"
+" 4 - Några mer aggresiva fixar. \n"
+" 6 - För många fixar kommer förmodligen att sakta ner de flesta spel."
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:149
msgid "!Notice:Tooltip:Presets:Checkbox"
msgstr ""
-"Förinställningarna tillämpar snabbfixar, några omkompilerarmöjligheter, och "
-"en del spelfixar som till vetskap höjer farten.\n"
-"Spelfixar som till vetskap är viktiga ('Patchar') kommer tillämpas "
-"automatiskt.\n"
+"Förinställningarna tillämpar snabbfixar, några omkompilerarfunktioner, \n"
+" och en del spelfixar som till vetskap höjer farten. \n"
+"Spelfixar som till vetskap är viktiga (''Patchar'') kommer tillämpas "
+"automatiskt. \n"
"\n"
-"--> Avmarkera för att ändra inställningarna manuellt (med nuvarande "
+"--> Avmarkeras för att ändra inställningarna manuellt (med nuvarande "
"inställningar som bas)"
#: pcsx2/gui/IsoDropTarget.cpp:28
msgid "!Notice:ConfirmSysReset"
msgstr ""
-"Detta kommer att återställa det befintliga PS2-VM-tillståndet; \n"
-"alla nuvarande processer kommer at förloras. Är Ni säker?"
+"Detta kommer att återställa det befintliga Virtuella Maskin PS2-"
+"tillståndet; \n"
+" alla nuvarande processer kommer at förloras. Är Ni säker?"
#: pcsx2/gui/MainMenuClicks.cpp:106
msgid "!Notice:DeleteSettings"
msgstr ""
-"Detta kommando rensar %s inställningarna \n"
-"och låter Er att återköra Första-Gången Trollkarlen. \n"
-"Ni måste manuellt återstarta %s efter detta. \n"
+"Detta rensar %s-inställningarna \n"
+" och låter Er att återköra ''Första gången Trollkarlen''. \n"
+"Ni får återstarta %s manuellt efter detta. \n"
"\n"
-"VARNING! Tryck OK för att makulera *ALLA* inställningar för %s \n"
-"och tvångstänga tillämpningen, \n"
-"med följd att alla nuvarande emuleringsprocesser mistes. Är Ni helt säker? \n"
+"VARNING! Tryck ''Vidare'' för att rensa *ALLA* inställningar \n"
+"för %s och tvångstänga programmet, med följd att \n"
+"alla nuvarande emuleringsprocesser mistes. Är Ni helt säker? \n"
"\n"
"(Bemärk: inställningar för insticksprogram påverkas ej)"
@@ -233,46 +235,64 @@ msgid "!Notice:Mcd:HasBeenDisabled"
msgstr ""
"Minneskortet i sockel %d har blivit automatiskt förhindrat. Ni kan åtgärda "
"problemet \n"
-"och återmöjliggöra minneskortet när som helst genom Konfig:Minneskort i "
+" och återmöjliggöra minneskortet när som helst genom Konfig:Minneskort i "
"huvudmenyn."
#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:138
msgid "!Notice:BIOS:InvalidSelection"
msgstr ""
-"Välj ett giltligt BIOS. Om ni är oförmögen att göra ett giltligt val \n"
-"så tryck Avbryt för att stänga Konfigurationspanelen."
+"Välj ett giltligt BIOS. Är Ni oförmögen att göra detta \n"
+" så tryck ''Avbryt'' för att stänga Konfigurationspanelen."
#: pcsx2/gui/Panels/CpuPanel.cpp:111
msgid "!Panel:EE/IOP:Heading"
-msgstr "Bemärk: De flesta spel har det fint med förvalstillämpningarna."
+msgstr ""
+"EE = Emotion Engine = Rörelse Motor \n"
+"IOP = Input Output Processor = In Ut Processor \n"
+"\n"
+"Bemärk: De flesta spel har det fint med förvalssättningarna."
#: pcsx2/gui/Panels/CpuPanel.cpp:178
msgid "!Panel:VUs:Heading"
-msgstr "Bemärk: De flesta spel har det fint med förvalstillämpningarna."
+msgstr ""
+"VM = Virtual Machine = Virtuell Maskin \n"
+"VU = Vector Unit = Vektor Enhet \n"
+"\n"
+"Bemärk: De flesta spel har det fint med förvalssättningarna."
#: pcsx2/gui/Panels/DirPickerPanel.cpp:69
msgid "!Notice:DirPicker:CreatePath"
-msgstr "Den angivna sökvägen/katalogen finnes ej. Vill Ni skapa den?"
+msgstr "Den angivna sökvägen/katalogen finns ej. Vill Ni skapa den?"
#: pcsx2/gui/Panels/DirPickerPanel.cpp:158
msgid "!ContextTip:DirPicker:UseDefault"
msgstr ""
-"När markerad kommer denna mapp att automatiskt begrunda förvalen assosierade "
-"med PCSX2's nuvarande användarinställningar."
+"När markerad kommer denna mapp automatiskt att fungera enligt förvalen "
+"förknippade med PCSX2's nuvarande användarinställningar."
#: pcsx2/gui/Panels/GSWindowPanel.cpp:55
msgid "!ContextTip:Window:Zoom"
msgstr ""
-"Påverkar till vetskap följande spel:\n"
-"* Test Drive Unlimited\n"
-"* Transformers"
+"Zoom = 100.0: Anpassa hela bilden till fönstret utan beskärning. \n"
+"Över/Under 100.0: Zooma in/ut. \n"
+"Bemärk: Zoom-värdet återställs inte automatiskt; det sparas i \n"
+" konfigurationsfilen, och tillämpas nästa gång Ni använder PCSX2. \n"
+"Zoom = 0.0: Automatisk inzoomning tills de svarta räckena \n"
+" är borta (bildkvot bevaras, en del av bilden går utanför fönstret). \n"
+"Bemärk: Vissa spel ritar sina egna svarta räcken \n"
+" vilka inte tas bort med ''0.0''. \n"
+"\n"
+"Tangentbord: \n"
+" ''Ctrl'' + ''NumPad Plus'': Inzoomning \n"
+" ''Ctrl'' + ''NumPad Minus'': Utzoomning \n"
+" ''Ctrl'' + ''NumPad Stjärna'': Växla 100/0"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:63
msgid "!ContextTip:Window:Vsync"
msgstr ""
"Vsync slår ut skärmsönderrivning men har oftast en stor prestationseffekt. \n"
-"Det tillämpas vanligtvis bara i helskärmsläge, och kanske inte fungerar för "
-"alla GS-insticksprogram."
+"Det tillämpas vanligtvis bara i helskärmsläge, \n"
+" och kanske inte fungerar för alla GS-insticksprogram."
#: pcsx2/gui/Panels/GSWindowPanel.cpp:68
msgid "!ContextTip:Window:ManagedVsync"
@@ -282,74 +302,78 @@ msgstr ""
"prestandastraff. \n"
"Bemärk: Detta fungerar för närvarande bara bra med GSdx som GS-"
"insticksprogram, \n"
-"och konfigurationen DX10/11 Hårdvarutolkning. \n"
-"Annat insticksprogram eller annat tolkningsläge kommer antingen att "
-"ignoreras \n"
-"eller producera en svart skärm som blinkar när läget byts. \n"
-"Det kräver även att Vsync tillämpas."
+" och med konfigurationen DX10/11 Hårdvarutolkning. \n"
+"Annat insticksprogram eller tolkningsläge kommer antingen att ignoreras \n"
+" eller alstra en svart skärm som blinkar när läget byts. \n"
+"Det kräver även att Vsync möjliggörs."
#: pcsx2/gui/Panels/GSWindowPanel.cpp:76
msgid "!ContextTip:Window:HideMouse"
msgstr ""
"Markera denna för att tvinga muspekaren att bli osynlig när den är i ett GS-"
"fönster; \n"
-"användbart om man har musen som främsta kontroll-mojäng för spelande. \n"
-"Som förval auto-gömmer sig musen efter 2 sekunders inaktivitet."
+" användbart vid brukande av musen som främsta styrmojäng för spelande. \n"
+"Som förval gömmer sig muspekaren automatiskt efter 2 sekunders stillastående."
#: pcsx2/gui/Panels/GSWindowPanel.cpp:82
msgid "!ContextTip:Window:Fullscreen"
msgstr ""
"Möjliggör automatiskt lägesbyte till fullskärm när emulering statas eller "
"återupptas. \n"
-"Ni kan ännu växla mellan helskärm och fönsterläge genom att trycka Alt + "
-"Enter."
+"Ni kan ännu växla mellan helskärm och fönsterläge genom att trycka ''Alt'' + "
+"''Enter''."
#: pcsx2/gui/Panels/GSWindowPanel.cpp:93
msgid "!ContextTip:Window:HideGS"
msgstr ""
"Stänger helt det ofta stora och omfångsrika GS-fönstret \n"
-"när Ni trycker på Esc eller avbryter emulatorn."
+" när Ni trycker på ''Esc'' eller avbryter emulatorn."
#: pcsx2/gui/Panels/GameFixesPanel.cpp:67
msgid "!ContextTip:Gamefixes:EE Timing Hack"
msgstr ""
-"Påverkar till vetskap följande spel:\n"
-" * Digital Devil Saga (Fixar FMV och brakar)\n"
-" * SSX (Fixar dålig grafik och brakar)\n"
-" * Resident Evil: Dead Aim (Orsakar förvrängda texturer)"
+"Påverkar till vetskap följande spel: \n"
+" * ''Digital Devil Saga'' (fixar FMV och brakar) \n"
+" * ''SSX'' (fixar dålig grafik och brakar) \n"
+" * ''Resident Evil: Dead Aim'' (orsakar förvrängda texturer)"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:80
msgid "!ContextTip:Gamefixes:OPH Flag hack"
msgstr ""
-"Påverkar till vetskap följande spel:\n"
-" * Bleach Blade Battler\n"
-" * Growlanser II & III\n"
-" * Wizardry"
+"Påverkar till vetskap följande spel: \n"
+" * ''Bleach Blade Battler'' \n"
+" * ''Growlanser II & III'' \n"
+" * ''Wizardry''"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:89
msgid "!ContextTip:Gamefixes:DMA Busy hack"
msgstr ""
-"Påverkar till vetskap följande spel:\n"
-" * Mana Khemia 1 (Går \"bortom behörighet\")"
+"Påverkar till vetskap följande spel: \n"
+" * ''Mana Khemia 1'' (går \"bortom behörighet\")"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:96
msgid "!ContextTip:Gamefixes:VIF1 FIFO hack"
msgstr ""
-"Påverkar till vetskap följande spel:\n"
-"* Test Drive Unlimited\n"
-"* Transformers"
+"Påverkar till vetskap följande spel: \n"
+"* ''Test Drive Unlimited'' \n"
+"* ''Transformers''"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:119
msgid "!Panel:Gamefixes:Compat Warning"
msgstr ""
-"Spelfixar kan åtgärda felaktig emulering för vissa spel. \n"
-"De kan dock orsaka förenlighets- eller prestandaproblem för andra spel. \n"
-"Ni får stänga av Spelfixar manuellt när Ni byter spel."
+"Spelfixar kan åtgärda felaktig emulering för vissa titlar. \n"
+"De kan dock orsaka förenlighets- eller prestandaproblem. \n"
+"Ni får stänga av Spelfixar manuellt när Ni byter spel. \n"
+"\n"
+"Det är i allmänhet bättre att förhindra denna tillämpning, och att "
+"möjliggöra ''Automatiska Spelfixar'' i huvudmenyn \n"
+" (''Automatiska'' innebär: använd särskilt utvalda och beprövade lösningar "
+"för särskilda spel)."
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:720
msgid "!Notice:Mcd:Delete"
msgstr ""
-"Ni är på väg att radera det formaterade minneskortet i sockel %u. \n"
+"Ni är på väg att kassera det formaterade minneskortet i sockel %u. \n"
"All data på detta kort kommer att förloras! Är Ni helt säker?"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:758
@@ -367,226 +391,230 @@ msgstr ""
#: pcsx2/gui/Panels/MiscPanelStuff.cpp:35
msgid "!Panel:Usermode:Explained"
msgstr ""
-"Välj Ert föredragna mål för PCSX2 användar-nivå dokument nedanför \n"
-"(inräknar minneskort, skärmbilder, inställningar, och sparpunkter). \n"
+"Välj Ert föredragna mål för PCSX2's Användarnivå Dokument nedanför \n"
+" (innefattar minneskort, skärmbilder, inställningar, och sparpunkter). \n"
"Detta kan ändras när som helst genom Kärninställningspanelen."
#: pcsx2/gui/Panels/MiscPanelStuff.cpp:41
msgid "!Panel:Usermode:Warning"
msgstr ""
-"Ni kan ändra det föredragna förvalsmålet för PCSX2 användar-nivå dokument "
+"Ni kan ändra det föredragna förvalsmålet för PCSX2's Användarnivå Dokument "
"här \n"
-"(inräknar minneskort, skärmbilder, inställningar, coh sparpunkter). \n"
-"Detta påverkar bara Standard Sökvägarna vilka ställs in för att använda "
+" (innefattar minneskort, skärmbilder, inställningar, och sparpunkter). \n"
+"Detta påverkar bara StandardSökvägarna vilka ställs in för att använda "
"installationsförvalsvärdena."
#: pcsx2/gui/Panels/PathsPanel.cpp:40
msgid "!ContextTip:Folders:Savestates"
msgstr ""
-"I denna mapp sparar PCSX2 sparpunkter, vilka är sparade antingen genom "
+"I denna mapp sparar PCSX2 sparpunkter, vilka sparas antingen genom "
"användning \n"
-"av menyer/verktygsrad, eller genom att trycka på F1/F3 (spara/ladda)."
+" av menyer/verktygsrad, eller genom att trycka på ''F1''/''F3'' (spara/"
+"ladda)."
#: pcsx2/gui/Panels/PathsPanel.cpp:50
msgid "!ContextTip:Folders:Snapshots"
msgstr ""
"I denna mapp sparar PCSX2 skärmbilder. Det faktiska skärmbildsformatet och "
"stilen \n"
-"kan variera beroende på vilket GS-insticksprogram som användes."
+" kan variera beroende på vilket GS-insticksprogram som används."
#: pcsx2/gui/Panels/PathsPanel.cpp:60
msgid "!ContextTip:Folders:Logs"
msgstr ""
"I denna mapp sparar PCSX2 sina loggfiler och diagnostiska rapporter. De "
"flesta insticksprogram \n"
-"håller fast vid denna mapp, men dock kan vissa äldre insticksprogram "
+" håller sig till denna mapp, även om vissa äldre insticksprogram kan "
"ignorera den."
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:242
msgid "!Notice:PluginSelector:ConfirmShutdown"
msgstr ""
"Varning! Att byta insticksprogram kräver en full nedstängning och "
-"återställning av PS2-VM. \n"
+"återställning av PS2's Virtuella Maskin. \n"
"PCSX2 kommer att försöka att spara och återställa tillståndet, men om de "
"nyligen valda insticksprogrammen \n"
-"är oförenliga kan detta misslyckas, och alla nuvarande framsteg kommer att "
+" är oförenliga kan detta misslyckas, och alla nuvarande framsteg kommer att "
"förloras. \n"
"\n"
-"\n"
-"Är Ni säker att Ni vill tillämpa inställningarna nu?"
+"Är Ni säker att Ni vill tillämpa ändringarna nu?"
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:457
msgid "!Notice:PluginSelector:ApplyFailed"
msgstr ""
-"Alla insticksprogram måste ha giltliga val för att %s ska kunna köras. \n"
-"Om Ni är oförmögen att göra ett giltligt val till följd av saknade "
-"insticksprogram \n"
-"eller en ofullständig installaion av %s, så tryck Avbryt för att stänga "
+"Alla insticksprogram måste ha giltliga inställningar för att %s ska kunna "
+"köras. \n"
+"Är Ni oförmögen att göra detta till följd av saknade insticksprogram eller "
+"en \n"
+" ofullständig installaion av %s, så tryck ''Avbryt'' för att stänga "
"Konfigurationspanelen."
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:27
msgid "!Panel:Speedhacks:EECycleX1"
msgstr ""
-"1 - Förvals cykelgrad. Detta överensstämmer nästan med den faktiska "
-"hastigheten hos en PS2-RörelseMotor."
+"1 - Förvalscykelgrad. Detta överensstämmer \n"
+"nästan med den faktiska hastigheten \n"
+"för en PS2-EE."
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:32
msgid "!Panel:Speedhacks:EECycleX2"
msgstr ""
-"2 - Minskar EE's cykelgrad med ungefär 33%. Mild uppsnabbning för de flesta "
-"spel med hög förenlighet."
+"2 - Minskar EE's cykelgrad med ungefär 33%. \n"
+"Mild uppsnabbning och hög förenlighet \n"
+"för de flesta spel."
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:37
msgid "!Panel:Speedhacks:EECycleX3"
msgstr ""
-"3 - Minskar EE's cykelgrad med ungefär 50%. Måttfull uppsnabbning, \n"
-"men *kommer* att orsaka stamningsaudio hos många FMV'er."
+"3 - Minskar EE's cykelgrad med ungefär 50%. \n"
+"Måttfull uppsnabbning, men *kommer* att \n"
+"orsaka stamningsljud för många FMV'er."
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:54
msgid "!Panel:Speedhacks:VUCycleStealOff"
-msgstr "0 - Förhndrar VU Cykelstöld. Den mest förenliga inställningen!"
+msgstr ""
+"0 - Förhndrar VU-cykelstöld. \n"
+"Den mest förenliga inställningen!"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:59
msgid "!Panel:Speedhacks:VUCycleSteal1"
msgstr ""
-"1 - Mild VU Cykelstöld. Lägre förenlighet, men en viss uppsnabbning för de "
+"1 - Mild VU-cykelstöld. Lägre förenlighet, men en viss uppsnabbning för de "
"flesta spel."
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:64
msgid "!Panel:Speedhacks:VUCycleSteal2"
msgstr ""
-"2 - Måttfull VU Cykelstöld. Ännu lägre förenlighet, men markant uppsnabbning "
-"hos vissa spel."
+"2 - Måttfull VU-cykelstöld. \n"
+"Ännu lägre förenlighet, men en \n"
+"markant uppsnabbning för vissa spel."
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:70
msgid "!Panel:Speedhacks:VUCycleSteal3"
msgstr ""
-"3 - Maximal VU Cykelstöld. Användningen är begränsad, \n"
-"eftersom detta kommer att orsaka synligt flimrande hos de flesta spel."
+"3 - Maximal VU-cykelstöld. Användningen är \n"
+"begränsad, eftersom detta kommer att orsaka \n"
+"synligt flimrande för de flesta spel."
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:97
msgid "!Panel:Speedhacks:Overview"
msgstr ""
-"Snabbfixar förbättrar vanligtvis emuleringshastighet, men kan orsaka "
-"trassel, bruten audio, \n"
-"och falska FPS avläsningar. När Ni har emuleringsproblem, så förhindra denna "
-"panel först."
+"Snabbfixar förbättrar vanligtvis emuleringshastigheten, men kan orsaka "
+"trassel, brutet ljud, \n"
+" och falska FPS-avläsningar. Förhindra denna panel det första Ni gör vid "
+"emuleringsproblem."
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:129
msgid "!ContextTip:Speedhacks:EECycleRate Slider"
msgstr ""
-"Att sätta ett högre värde för denna glidare minskar verkningsfullt "
-"klockhastigheten hos RörelseMotorns R5900 kärn-CPU, \n"
-"och för oftast en hastghetsökning till spel som misslyckas att nyttja "
-"möjligheterna med PS2's verkliga hårdvara fullt ut."
+"Att sätta ett högre värde genom denna manick minskar \n"
+" verkningsfullt klockhastigheten hos EE'ns R5900 kärn-CPU, \n"
+" och ger oftast en hög hastghetsökning till spel som misslyckas \n"
+" att nyttja möjligheterna med PS2's verkliga hårdvara fullt ut."
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:150
msgid "!ContextTip:Speedhacks:VUCycleStealing Slider"
msgstr ""
-"Denna glidare kontrollerar mängden cykler som VU-enheten stjäl ifrån "
-"RörelseMotorn. \n"
-"Högre värden ökar antalet cykler som stjäls från EE'n för varje VU-"
-"microprogram spelt kör."
+"Denna manick styr mängden cykler som VU-enheten stjäler ifrån EE'n. \n"
+"Högre värden ökar antalet cykler som stjäls från EE'n per VU-microprogram "
+"spelet kör."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:172
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "!ContextTip:Speedhacks:vuFlagHack"
msgstr ""
-"Uppdaterar endast Statusflaggor för block som kommer att läsa dem, istället "
-"för alltid. \n"
-"Detta är för det mesta säkert, och Super-VU gör något liknande som standard."
+"Uppdaterar endast Statusflaggor för block som kommer att läsa dem, \n"
+" istället för alltid. Detta är för det mesta säkert, \n"
+" och Super-VU gör något liknande som standard."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:177
-msgid "!ContextTip:Speedhacks:vuBlockHack"
-msgstr ""
-"Förmodar att väldigt långt in i framtiden så kommer block inte behöva "
-"gammelflagg-instansdata. \n"
-"Detta borde vara rätt säkert. Det är okänt ifall detta har sönder något "
-"spel..."
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:182
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:174
msgid "!ContextTip:Speedhacks:vuThread"
msgstr ""
-"Kör VU1 i dess egna tråd (endast microVU1). I allmänhet en uppsnabbning för "
-"CPU'er med 3 eller fler kärnor.\n"
+"Kör VU1 i dess egna tråd (endast microVU1). \n"
+"I allmänhet en uppsnabbning för CPU'er med 3 eller fler kärnor.\n"
"Detta är säkert för de flesta spel, men en del är oförenliga och kan hänga.\n"
-"Vad gäller GS-begränsade spel, kan en nedbromsning förekomma (särskilt hos "
-"dubbelkärniga CPU'er)."
+"Vad gäller GS-begränsade spel, kan en nedbromsning förekomma \n"
+" (i synnerhet för dubbelkärniga CPU'er)."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:203
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:195
msgid "!ContextTip:Speedhacks:INTC"
msgstr ""
-"Denna fix fungerar bäst för spel som använder INTC-statusregistret för att "
-"invänta Vsync'ar, \n"
-"vilket i första hand omfattar icke-3D-RPG titlar. \n"
-"Spel som inte använder denna Vsync-metod kommer på sin höjd att få en liten "
-"uppsnabbning av denna fix."
+"Denna fix fungerar bäst för spel som använder INTC-statusregistret \n"
+" för att invänta Vsync'ar, vilket främst omfattar icke-3D-RPG titlar. \n"
+"Spel som inte använder denna Vsync-metod \n"
+" kommer på sin höjd att få en liten uppsnabbning."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:208
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
msgid "!ContextTip:Speedhacks:BIFC0"
msgstr ""
-"I första hand inriktat på EE tomgångs-loop hos adress 0x81FC0 i kärnan, "
-"denna fix försöker att \n"
-"upptäcka loopar vars kroppar garanterat resulterar i samma maskintillstånd "
-"för varje upprepning \n"
-"tills en schemaläggd händelse utlöser emulering av en annan enhet. Efter en "
-"enskild upprepning av en sådan loop, \n"
-"avancerar vi till tiden för nästa händelse eller till slutet av processorns "
-"tidskvantum, vilket som än kommer först."
+"Främst inriktat på EE-tomgångsloop hos adress 0x81FC0 i kärnan, försöker "
+"denna fix \n"
+" att upptäcka loopar vars kroppar garanterat medför samma maskintillstånd \n"
+" vid varje upprepning tills en schemalagd händelse utlöser emulering av en "
+"annan enhet. \n"
+"Efter en enskild upprepning av en sådan loop, avancerar Vi till tiden för "
+"nästa händelse \n"
+" eller till slutet av processorns tidskvantum, vilket som än kommer först."
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:215
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:207
msgid "!ContextTip:Speedhacks:fastCDVD"
msgstr ""
-"Kolla HDLaddar-förenlighetslistan för spel som till vetskap kommer till "
+"Undersök HD-laddarförenlighetslistan för spel som till vetskap kommer till "
"fråga \n"
-"med det här (ofta markerat som behövande 'läge 1' eller 'långsam DVD')."
+" med det här (ofta markerat som behövande ''läge 1'' eller ''långsam DVD'')."
#: pcsx2/gui/Panels/VideoPanel.cpp:37
msgid "!ContextTip:Framelimiter:Disable"
msgstr ""
-"Bemärk att när Bildbegränsning är förhindrad så kommer Turbo och SlowMotion "
-"lägena \n"
-"inte att vara tillgängliga heller."
+"Bemärk att när Bildbegränsning är förhindrad så kommer \n"
+" Turbo och SlowMotion lägena inte att vara tillgängliga heller."
-#: pcsx2/gui/Panels/VideoPanel.cpp:223
+#: pcsx2/gui/Panels/VideoPanel.cpp:227
msgid "!Panel:Frameskip:Heading"
msgstr ""
-"Bemärk: Till följd av PS2 hårdvaruutformning så är precist bildöverhoppande "
-"omöjligt. \n"
-"Att tillämpa det kan orsaka rejäla grafikfel hos vissa spel."
+"Bemärk: Till följd av PS2's hårdvaruutformning \n"
+" så är precist bildöverhoppande omöjligt. \n"
+"Att tillämpa det kan orsaka rejäla grafikfel för vissa spel."
-#: pcsx2/gui/Panels/VideoPanel.cpp:302
+#: pcsx2/gui/Panels/VideoPanel.cpp:306
msgid "!ContextTip:GS:SyncMTGS"
msgstr ""
"Tillämpa detta ifall Ni tror att MTGS-trådsync orsakar braker eller grafiska "
"fel."
-#: pcsx2/gui/Panels/VideoPanel.cpp:306
+#: pcsx2/gui/Panels/VideoPanel.cpp:310
msgid "!ContextTip:GS:DisableOutput"
msgstr ""
-"Tar bort allt norm-oljud orsakat av MTGS-trådens eler GPU'ns överdrag. Denna "
-"möjlighet användes bäst i förening med sparpunkter: \n"
-"spara ett tillstånd i en idealisk scen, tillämpa denna möjlighet, och "
-"återladda sparpunkten.\n"
+"Tar bort allt norm-oljud orsakat av MTGS-trådens eler GPU'ns överdrag. \n"
+"Denna tillämpning används bäst i förening med sparpunkter: \n"
+" spara ett tillstånd i en idealisk scen, tillämpa denna funktion, \n"
+" och återladda sedan sparpunkten.\n"
"\n"
-"\n"
-"Varning: Denna tillämpning kan möjliggöras dynamiskt men kan vanligtvis inte "
-"förhindras på samma vis (video blir ofta skräp)."
+"Varning: Denna tillämpning kan möjliggöras dynamiskt \n"
+" men kan vanligtvis inte förhindras på samma vis (video blir ofta skräp)."
#: pcsx2/vtlb.cpp:710
msgid "!Notice:HostVmReserve"
msgstr ""
-"Ert system har för lite VM-resurser för att PCSX2 ska kunna köras. \n"
+"Ert system har för lite virtuella resurser för att PCSX2 ska kunna köras. \n"
"Detta kan ha orsakats av att ha en liten eller förhindrad bytfil, \n"
-"eller av att andra program tar för sig av resurser."
+" eller av att andra program tar för sig av systemets resurser."
#: pcsx2/x86/sVU_zerorec.cpp:363
msgid "!Notice:superVU:VirtualMemoryAlloc"
msgstr ""
"Slut på Minne (typ): superVU-omkompileraren var oförmögen att reservera den "
-"mängd specifika minne som krävs, \n"
-"och kommer inte vara tillgängligt för bruk. Detta är inte ett kritiskt fel, "
-"eftersom sVU är föråldrad, \n"
-"och följdaktligen borde Ni använda Er av microVU istället."
+"mängd särskilda minne \n"
+" som krävs, och kommer inte vara tillgänglig för bruk. Detta är inte ett "
+"kritiskt fel eftersom \n"
+" sVU är föråldrad, och följdaktligen borde Ni hur som helst använda Er av "
+"microVU istället."
+
+#~ msgid "!ContextTip:Speedhacks:vuBlockHack"
+#~ msgstr ""
+#~ "Förmodar att väldigt långt in i framtiden så \n"
+#~ " kommer block inte behöva gammelflagg-instansdata. \n"
+#~ "Det borde vara rätt säkert. \n"
+#~ "Det är okänt ifall detta har sönder något spel..."
#~ msgid "!Notice:Mcd:Overwrite"
#~ msgstr ""
diff --git a/locales/sv_SE/pcsx2_Main.po b/locales/sv_SE/pcsx2_Main.po
index 75583029c..dae853071 100644
--- a/locales/sv_SE/pcsx2_Main.po
+++ b/locales/sv_SE/pcsx2_Main.po
@@ -4,8 +4,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.9\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-11-16 20:15+0100\n"
-"PO-Revision-Date: 2011-11-16 12:28+0100\n"
+"POT-Creation-Date: 2012-02-28 13:06+0100\n"
+"PO-Revision-Date: 2012-02-28 12:54+0100\n"
"Last-Translator: Georg Ronnert \n"
"Language-Team: \n"
"Language: \n"
@@ -30,7 +30,7 @@ msgstr "Tolkningsfel"
#: common/include/Utilities/Exceptions.h:250
msgid "Your machine's hardware is incapable of running PCSX2. Sorry dood."
-msgstr "Er maskinhårdvara är oförmögen att köra PCSX2. Beklagar snubben."
+msgstr "Er maskinhårdvara är oförmögen att köra PCSX2. Beklagar snubben."
#: common/src/Utilities/Exceptions.cpp:219
msgid "Oh noes! Out of memory!"
@@ -75,25 +75,25 @@ msgid ""
"Unexpected end of file or stream encountered. File is probably truncated or "
"corrupted."
msgstr ""
-"Oväntat slut på fil eller ström påträffat. Filen är troligen stympt eller "
+"Oväntat slut på fil eller flöde påträffat. Filen är troligen stympt eller "
"förstörd."
#: common/src/Utilities/ThreadTools.cpp:41
msgid "Threading activity: start, detach, sync, deletion, etc."
-msgstr "Trådaktivitet: start, avskiljning, sync, borttagning, etc."
+msgstr "Trådaktivitet: start, avskiljning, synkning, borttagning, etc."
#: common/src/Utilities/ThreadingDialogs.cpp:30
msgid "Waiting for tasks..."
-msgstr "Väntar på uppgifter..."
+msgstr "Väntar på uppgifter ..."
#: common/src/Utilities/ThreadingDialogs.cpp:41
msgid "Waiting for task..."
-msgstr "Väntar på uppgift..."
+msgstr "Väntar på uppgift ..."
#: common/src/Utilities/wxAppWithHelpers.cpp:36
msgid "Includes idle event processing and some other uncommon event usages."
msgstr ""
-"Inkluderar tomgångshändelsebearbetning och några andra ovanliga "
+"Innefattar tomgångshändelsebearbetning och några andra ovanliga "
"händelseanvändningar."
#: pcsx2/CDVD/IsoFileFormats.cpp:416
@@ -102,15 +102,16 @@ msgstr "Oerkänt ISO-filformat"
#: pcsx2/Elfheader.cpp:266
msgid "Cannot load ELF binary image. The file may be corrupt or incomplete."
-msgstr "Kan inte ladda ELF binär. Filen kan vara förstörd eller ofullständig."
+msgstr ""
+"Kan inte ladda ELF-binären. Filen kan vara förstörd eller ofullständig."
#: pcsx2/Elfheader.cpp:268
msgid ""
"If loading from an ISO image, this error may be caused by an unsupported ISO "
"image type or a bug in PCSX2 ISO image support."
msgstr ""
-"Om försök att ladda en ISO har gjorts, kan detta fel ha orsakats av en "
-"ostödjande ISO-typ, eller av ett fel i PCSX2's ISO-stöd."
+"Om försök att ladda genom en ISO-avbild har gjorts, kan detta fel ha "
+"orsakats av en ostödjandes ISO-typ, eller av ett fel i PCSX2's ISO-stöd."
#: pcsx2/MTGS.cpp:859
msgid ""
@@ -132,7 +133,7 @@ msgid ""
"%s plugin failed to open. Your computer may have insufficient resources, or "
"incompatible hardware/drivers."
msgstr ""
-"%s insticksprogram misslyckades att öppna. Er dator kan ha otillräckliga "
+"%s's insticksprogram misslyckades att öppna. Er dator kan ha otillräckliga "
"resurser, eller oförenlig hårdvara/drivrutiner."
#: pcsx2/PluginManager.cpp:726
@@ -141,7 +142,7 @@ msgid ""
"%s plugin failed to initialize. Your system may have insufficient memory or "
"resources needed."
msgstr ""
-"%s insticksprogram misslyckades att initialiseras. Ert system kan ha "
+"%s's insticksprogram misslyckades att initialiseras. Ert system kan ha "
"otillräckligt med minne eller andra erfordeliga resurser."
#: pcsx2/PluginManager.cpp:832
@@ -161,7 +162,7 @@ msgid ""
"unsupported version of PCSX2."
msgstr ""
"Det konfigurerade %s-insticksprogrammet är inte ett PCSX2-insticksprogram, "
-"eller är för en äldre version av PCSX2 och stödjes inte här."
+"eller är för en äldre ostödjandes version av PCSX2."
#: pcsx2/PluginManager.cpp:879
msgid ""
@@ -176,7 +177,7 @@ msgid ""
"version of PCSX2."
msgstr ""
"Det konfigurerade insticksprogrammet är inte ett PCSX2-insticksprogram, "
-"eller för en äldre version av PCSX2 och stödjes inte här."
+"eller för en äldre ostödjandes version av PCSX2."
#: pcsx2/PluginManager.cpp:926
#, c-format
@@ -184,46 +185,47 @@ msgid ""
"Configured %s plugin is not a valid PCSX2 plugin, or is for an older "
"unsupported version of PCSX2."
msgstr ""
-"Det konfigurerade %s insticksprogrammet är inte ett giltligt PCSX2-"
-"insticksprogram, eller för en äldre version av PCSX2 och stödjes inte här."
+"Det konfigurerade %s-insticksprogrammet är inte ett giltligt PCSX2-"
+"insticksprogram, eller för en äldre ostödjandes version av PCSX2."
#: pcsx2/PluginManager.cpp:1355
msgid "Internal Memorycard Plugin failed to initialize."
msgstr ""
-"Det interna minneskorts-insticksprogrammet misslyckades att initialiseras."
+"Det inhemska MinneskortsInsticksprogrammet misslyckades att initialiseras."
#: pcsx2/PluginManager.cpp:1752
msgid "Unloaded Plugin"
-msgstr "Oladdat insticksprogram"
+msgstr "Oladdat Insticksprogram"
-#: pcsx2/SaveState.cpp:339
+#: pcsx2/SaveState.cpp:342
msgid "Cannot load savestate. It is of an unknown or unsupported version."
msgstr ""
-"Kan inte ladda sparpunkten. Den är av en okänd eller ostödjande version."
+"Kan inte ladda sparpunkten eftersom den är av en okänd eller ostödjandes "
+"version."
#: pcsx2/SourceLog.cpp:96
msgid "Dumps detailed information for PS2 executables (ELFs)."
-msgstr "Dumpar detaljerad information om PS2-verkställare (ELFar)."
+msgstr "Dumpar detaljerad information om PS2-verkställare (ELF'ar)."
#: pcsx2/SourceLog.cpp:101
msgid ""
"Logs manual protection, split blocks, and other things that might impact "
"performance."
msgstr ""
-"Loggar manuellt skydd, delar block, och annat som kan vara av betydelse för "
+"Loggar manuellt skydd, delade block, och annat som kan vara av betydelse för "
"prestanda."
#: pcsx2/SourceLog.cpp:106
msgid "Shows the game developer's logging text (EE processor)"
-msgstr "Visar spelutvecklarens loggningstext (EE processor)"
+msgstr "Visar spelutvecklarens loggningstext (EE-processor)"
#: pcsx2/SourceLog.cpp:111
msgid "Shows the game developer's logging text (IOP processor)"
-msgstr "Visar spelutvecklarens loggningstext (IOP processor)"
+msgstr "Visar spelutvecklarens loggningstext (IOP-processor)"
#: pcsx2/SourceLog.cpp:116
msgid "Shows DECI2 debugging logs (EE processor)"
-msgstr "Visar DECI2 felsökningsloggar (EE processor)"
+msgstr "Visar DECI2-felsökningsloggar (EE-processor)"
#: pcsx2/SourceLog.cpp:145
msgid "SYSCALL and DECI2 activity."
@@ -231,16 +233,16 @@ msgstr "SYSCALL och DECI2 aktivitet."
#: pcsx2/SourceLog.cpp:151
msgid "Direct memory accesses to unknown or unmapped EE memory space."
-msgstr "Direkt minnestillgång till okänt eller ofördelat EE minne."
+msgstr "Direkt minnestillgång till okänt eller ofördelat EE-minnesrum."
#: pcsx2/SourceLog.cpp:157 pcsx2/SourceLog.cpp:276
msgid "Disasm of executing core instructions (excluding COPs and CACHE)."
msgstr ""
-"Avassembering av verkställande kärninstruktioner (exklusive COPar och CACHE)."
+"Avassembering av verkställande kärninstruktioner (förutom COP'ar och CACHE)."
#: pcsx2/SourceLog.cpp:163
msgid "Disasm of COP0 instructions (MMU, cpu and dma status, etc)."
-msgstr "Avassemblering av COP0 instruktioner (MMU, CPU och DMA status etc)."
+msgstr "Avassemblering av COP0-instruktioner (MMU, CPU och DMA status etc)."
#: pcsx2/SourceLog.cpp:169
msgid "Disasm of the EE's floating point unit (FPU) only."
@@ -248,18 +250,18 @@ msgstr "Endast avassemblering av EE's flyttalsenhet (FPU)."
#: pcsx2/SourceLog.cpp:175
msgid "Disasm of the EE's VU0macro co-processor instructions."
-msgstr "Avassemblering av EE's VU0macro hjälpprocessorinstruktioner."
+msgstr "Avassemblering av EE's VU0-macrohjälpprocessorinstruktioner."
#: pcsx2/SourceLog.cpp:181
msgid "Execution of EE cache instructions."
-msgstr "Verkställande av EE cacheinstruktioner."
+msgstr "Verkställande av EE-förrådsinstruktioner."
#: pcsx2/SourceLog.cpp:187
msgid ""
"All known hardware register accesses (very slow!); not including sub filter "
"options below."
msgstr ""
-"Alla kända hårdvaruregister ges åtkomst (mycket långsamt!); ej inräknat "
+"Alla kända hårdvaruregisteråtkomster (mycket långsamt!); förutom "
"underfilterstillämpningarna nedanför."
#: pcsx2/SourceLog.cpp:193 pcsx2/SourceLog.cpp:294
@@ -277,7 +279,7 @@ msgstr ""
#: pcsx2/SourceLog.cpp:211
msgid "All GIFtag parse activity; path index, tag type, etc."
-msgstr "All slags GIF-märkesaktivitetstolkningar; sökvägsindex, märktyp, etc."
+msgstr "All slags GIF-märkestolkningssaktiviteter; sökvägsindex, märktyp, etc."
#: pcsx2/SourceLog.cpp:217
msgid "All VIFcode processing; command, tag style, interrupts."
@@ -285,11 +287,11 @@ msgstr "All slags VIF-kodsbearbetning; betingande, märkstil, avbrott."
#: pcsx2/SourceLog.cpp:223
msgid "All processing involved in Path3 Masking"
-msgstr "All bearbetning inblandat i Path3 Maskning."
+msgstr "All bearbetning inblandat i Path3-Maskning."
#: pcsx2/SourceLog.cpp:229
msgid "Scratchpad's MFIFO activity."
-msgstr "Antekningshäftets MFIFO aktivitet."
+msgstr "Antekningshäftets MFIFO-aktivitet."
#: pcsx2/SourceLog.cpp:235
msgid "Actual data transfer logs, bus right arbitration, stalls, etc."
@@ -297,7 +299,7 @@ msgstr "Faktiska dataöverföringsloggar, rätt buss medling, uppehåll, etc."
#: pcsx2/SourceLog.cpp:241
msgid "Tracks all EE counters events and some counter register activity."
-msgstr "Spårar all EE räknarbegivenhet och en del registerräknaraktivitet."
+msgstr "Spårar alla EE-räknarföreteelser och en del registerräknaraktivitet."
#: pcsx2/SourceLog.cpp:247
msgid "Dumps various VIF and VIFcode processing data."
@@ -305,7 +307,7 @@ msgstr "Dumpar diverse VIF och VIF-kod bearbetningsdata."
#: pcsx2/SourceLog.cpp:253
msgid "Dumps various GIF and GIFtag parsing data."
-msgstr "Dumpar diverse GIF och GIF-märkt tolkningsdata."
+msgstr "Dumpar diverse GIF och GIF-märkes tolkningsdata."
#: pcsx2/SourceLog.cpp:264
msgid "SYSCALL and IRX activity."
@@ -313,7 +315,7 @@ msgstr "SYSCALL och IRX aktivitet."
#: pcsx2/SourceLog.cpp:270
msgid "Direct memory accesses to unknown or unmapped IOP memory space."
-msgstr "Direkt minnestillgång till okänd eller ofördelat IOP minne."
+msgstr "Direkt minnestillgång till okänd eller ofördelat IOP-minne."
#: pcsx2/SourceLog.cpp:282
msgid "Disasm of the IOP's GPU co-processor instructions."
@@ -322,13 +324,12 @@ msgstr "Avassemblering av IOP's GPU-hjälpprocessorinstruktioner."
#: pcsx2/SourceLog.cpp:288
msgid ""
"All known hardware register accesses, not including the sub-filters below."
-msgstr ""
-"Alla kända hårdvaruregister ges tillgång, ej inräknat underfilterna nedanför."
+msgstr "Alla kända hårdvaruregisteråtkomster, förutom underfilterna nedanför."
#: pcsx2/SourceLog.cpp:306
msgid "Memorycard reads, writes, erases, terminators, and other processing."
msgstr ""
-"Minneskorts läs-, skriv-, raderings-, avslutar-, och andra, bearbetningar."
+"Minneskorts läs-, skriv-, kasserings-, avslutar-, och andra - bearbetningar."
#: pcsx2/SourceLog.cpp:312
msgid "Gamepad activity on the SIO."
@@ -336,16 +337,16 @@ msgstr "Spelplattsaktivitet hos SIO."
#: pcsx2/SourceLog.cpp:318
msgid "Actual DMA event processing and data transfer logs."
-msgstr "Faktisk DMA begivenhetsbearbetning och dataöverföringsloggar."
+msgstr "Faktisk DMA-företeelsebearbetning och dataöverföringsloggar."
#: pcsx2/SourceLog.cpp:324
msgid "Tracks all IOP counters events and some counter register activity."
msgstr ""
-"Spårar alla IOP räknares begivenheter och några räknarregisters aktiviteter."
+"Spårar alla IOP-räknarföreteelser och några räknarregisters aktiviteter."
#: pcsx2/SourceLog.cpp:330
msgid "Detailed logging of CDVD hardware."
-msgstr "Detaljerad loggning av CDVD hårdvara."
+msgstr "Detaljerad loggning av CDVD-hårdvara."
#: pcsx2/System.h:206 pcsx2/System.h:207 pcsx2/System.h:208
msgid "PCSX2 Message"
@@ -359,49 +360,49 @@ msgstr ""
"Sparpunkten blev inte ordentligt sparad. Den tillfälliga filen skapades "
"framgångsrikt med kunde inte flyttas till sin slutliga viloplats."
-#: pcsx2/gui/AppConfig.cpp:837
+#: pcsx2/gui/AppConfig.cpp:842
msgid "Safest"
msgstr "Säkrast"
-#: pcsx2/gui/AppConfig.cpp:838
+#: pcsx2/gui/AppConfig.cpp:843
msgid "Safe (faster)"
-msgstr "Säkert (snabare)"
+msgstr "Säkert (snabbare)"
-#: pcsx2/gui/AppConfig.cpp:839
+#: pcsx2/gui/AppConfig.cpp:844
msgid "Balanced"
msgstr "Balanserat"
-#: pcsx2/gui/AppConfig.cpp:840
+#: pcsx2/gui/AppConfig.cpp:845
msgid "Aggressive"
msgstr "Aggressivt"
-#: pcsx2/gui/AppConfig.cpp:841
+#: pcsx2/gui/AppConfig.cpp:846
msgid "Aggressive plus"
msgstr "Aggressivt plus"
-#: pcsx2/gui/AppConfig.cpp:842
+#: pcsx2/gui/AppConfig.cpp:847
msgid "Mostly Harmful"
msgstr "Mest Skadligt"
-#: pcsx2/gui/AppConfig.cpp:999 pcsx2/gui/AppConfig.cpp:1005
+#: pcsx2/gui/AppConfig.cpp:1007 pcsx2/gui/AppConfig.cpp:1013
msgid "Failed to overwrite existing settings file; permission was denied."
msgstr ""
"Misslyckades att skriva över befintlig inställningsfil; tillstånd nekades."
#: pcsx2/gui/AppCorePlugins.cpp:404
msgid "Loading PS2 system plugins..."
-msgstr "Laddar PS2-systeminsticksprogram..."
+msgstr "Laddar PS2-systeminsticksprogram ..."
#: pcsx2/gui/AppInit.cpp:41
msgid "PCSX2 - SSE2 Recommended"
-msgstr "PCSX2 - SSE2 Rekommenderas"
+msgstr "PCSX2 - SSE2 Anrådes"
#: pcsx2/gui/AppInit.cpp:71
msgid ""
"SSE extensions are not available. PCSX2 requires a cpu that supports the "
"SSE instruction set."
msgstr ""
-"SSE utvidgningar är ej tillgängliga. PCSX2 kräver en CPU som stödjer "
+"SSE förlängningar ej tillgängliga. PCSX2 kräver en CPU som stödjer "
"instruktionsuppsättningen SSE."
#: pcsx2/gui/AppInit.cpp:154
@@ -412,7 +413,7 @@ msgstr "PCSX2 OmkompilerarFel"
msgid "All options are for the current session only and will not be saved.\n"
msgstr ""
"Alla valmöjligheter gäller endast för den nuvarande sessionen och kommer "
-"inte att sparas.\n"
+"inte att sparas. \n"
#: pcsx2/gui/AppInit.cpp:237 pcsx2/gui/AppMain.cpp:299
msgid "IsoFile"
@@ -428,27 +429,27 @@ msgstr "tvingar programmets logg/konsol att uppenbara sig"
#: pcsx2/gui/AppInit.cpp:240
msgid "use fullscreen GS mode"
-msgstr "använd helskärms GS läge"
+msgstr "använd helskärms GS-läge"
#: pcsx2/gui/AppInit.cpp:241
msgid "use windowed GS mode"
-msgstr "använd inramat GS läge"
+msgstr "använd inramat GS-läge"
#: pcsx2/gui/AppInit.cpp:243
msgid "disables display of the gui while running games"
-msgstr "förhindrar uppvisning av GUI medans spel köres"
+msgstr "förhindrar uppvisning av GUI medans spel körs"
#: pcsx2/gui/AppInit.cpp:244
msgid "executes an ELF image"
-msgstr "verkställer en ELF avbild"
+msgstr "verkställer en ELF-avbild"
#: pcsx2/gui/AppInit.cpp:245
msgid "boots an empty dvd tray; use to enter the PS2 system menu"
-msgstr "kör en tom DVD tråg; använd för att åtkomma PS2's systemmeny"
+msgstr "kör en tom DVD-tråg; använd för att åtkomma PS2's systemmeny"
#: pcsx2/gui/AppInit.cpp:246
msgid "boots from the CDVD plugin (overrides IsoFile parameter)"
-msgstr "kör från CDVD-insticksprogrammet (upphäver ISO-fil parameter)"
+msgstr "kör från CDVD-insticksprogrammet (åsidosätter ISO-fil parameter)"
#: pcsx2/gui/AppInit.cpp:248
msgid "disables all speedhacks"
@@ -473,7 +474,7 @@ msgstr "anger PCSX2-konfigurationsfilen att använda"
#: pcsx2/gui/AppInit.cpp:254
#, c-format
msgid "forces %s to start the First-time Wizard"
-msgstr "tvingar %s att köra Första-gången Trollkarlen"
+msgstr "tvingar %s att köra ''Första gången Trollkarlen''"
#: pcsx2/gui/AppInit.cpp:255
msgid "enables portable mode operation (requires admin/root access)"
@@ -482,12 +483,12 @@ msgstr "möjliggör flyttbart-läge-procedur (kräver admin/rot behörighet)"
#: pcsx2/gui/AppInit.cpp:259
#, c-format
msgid "specify the file to use as the %s plugin"
-msgstr "ange filen att använda som %s insticksprogram"
+msgstr "ange filen att använda som %s's insticksprogram"
#: pcsx2/gui/AppInit.cpp:307
#, c-format
msgid "Plugin Override Error - %s"
-msgstr "Insticks Upphävande Fel - %s"
+msgstr "Insticks Åsidosättande Fel - %s"
#: pcsx2/gui/AppInit.cpp:310
#, c-format
@@ -496,16 +497,16 @@ msgid ""
"valid %s plugin:\n"
"\n"
msgstr ""
-"%s Insticks Upphävande Fel! Följande fil finns ej eller är icke ett giltligt "
-"%s insticksprogram:\n"
+"%s Insticks Åsidosättande Fel! Följande fil finns ej eller är icke ett "
+"giltligt %s-insticksprogram: \n"
"\n"
#: pcsx2/gui/AppInit.cpp:317
#, c-format
msgid "Press OK to use the default configured plugin, or Cancel to close %s."
msgstr ""
-"Tryck OK för att använda det förvaldskonfigurerade insticksprogrammet, eller "
-"Avbryt för att stänga %s."
+"Tryck ''Vidare'' för att använda det förvaldskonfigurerade "
+"insticksprogrammet, eller ''Avbryt'' för att stänga %s."
#: pcsx2/gui/AppInit.cpp:496
msgid "PCSX2 Error: Hardware Deficiency"
@@ -514,7 +515,7 @@ msgstr "PCSX2 Fel: Hårdvarubristfällighet"
#: pcsx2/gui/AppInit.cpp:496 pcsx2/gui/AppInit.cpp:508
#, c-format
msgid "Press OK to close %s."
-msgstr "Tryck OK för att stänga %s."
+msgstr "Tryck ''Vidare'' för att stänga %s."
#: pcsx2/gui/AppInit.cpp:509
#, c-format
@@ -523,11 +524,11 @@ msgstr "%s Kritiskt Fel"
#: pcsx2/gui/AppInit.cpp:679
msgid "OK"
-msgstr "OK"
+msgstr "Vidare"
#: pcsx2/gui/AppInit.cpp:680
msgid "&OK"
-msgstr "&OK"
+msgstr "&Vidare"
#: pcsx2/gui/AppInit.cpp:681
msgid "Cancel"
@@ -575,7 +576,7 @@ msgstr "&Spara"
#: pcsx2/gui/AppInit.cpp:692
msgid "Save &As..."
-msgstr "Spara &Som"
+msgstr "Spara &Som ..."
#: pcsx2/gui/AppInit.cpp:693
msgid "&Help"
@@ -587,7 +588,7 @@ msgstr "&Hem"
#: pcsx2/gui/AppInit.cpp:696
msgid "Show about dialog"
-msgstr "Visa om dialog"
+msgstr "Info om PCSX2."
#: pcsx2/gui/AppMain.cpp:87
msgid ""
@@ -597,7 +598,7 @@ msgid ""
msgstr ""
"\n"
"\n"
-"Tryck OK för att gå till instickskonfigurationspanelen."
+"Tryck ''Vidare'' för att gå till InsticksKonfigurationsPanelen."
#: pcsx2/gui/AppMain.cpp:140 pcsx2/gui/AppMain.cpp:154
msgid ""
@@ -612,11 +613,11 @@ msgstr "%s Instruktionsmöjligheter"
#: pcsx2/gui/AppMain.cpp:573
msgid "PS2 BIOS Error"
-msgstr "PS2-BIOS Fel"
+msgstr "PS2 BIOS Fel"
#: pcsx2/gui/AppMain.cpp:574
msgid "Press Ok to go to the BIOS Configuration Panel."
-msgstr "Tryck OK för att gå till BIOS-konfigurationspanelen."
+msgstr "Tryck ''Vidare'' för att gå till BIOS-KonfigurationsPanelen."
#: pcsx2/gui/AppMain.cpp:626
msgid "PCSX2 Unresponsive Thread"
@@ -628,19 +629,19 @@ msgstr "Avsluta"
#: pcsx2/gui/AppMain.cpp:963
msgid "Executing PS2 Virtual Machine..."
-msgstr "Verkställer PS2-VM..."
+msgstr "Kör PS2's Virtuella Maskin ..."
#: pcsx2/gui/AppRes.cpp:72
msgid "Browse for an Iso that is not in your recent history."
-msgstr "Bläddra efter en ISO som inte är i Er lista."
+msgstr "Bläddra efter en ISO som inte redan är i Er lista."
#: pcsx2/gui/AppRes.cpp:72
msgid "Browse..."
-msgstr "Bläddra..."
+msgstr "Bläddra ..."
#: pcsx2/gui/AppUserMode.cpp:99
msgid "The following folders exist, but are not writable:"
-msgstr "Följande mappar finnes, men är inte skrivbara:"
+msgstr "Följande mappar finns, men är inte skrivbara:"
#: pcsx2/gui/AppUserMode.cpp:104
msgid "The following folders are missing and cannot be created:"
@@ -661,7 +662,7 @@ msgstr ""
#: pcsx2/gui/AppUserMode.cpp:165
msgid "Switch to User Documents Mode"
-msgstr "Växla till Användardokumentsläge"
+msgstr "Växla till AnvändarDokument-läge"
#: pcsx2/gui/AppUserMode.cpp:178
#, c-format
@@ -679,7 +680,8 @@ msgstr ""
#: pcsx2/gui/ApplyState.h:55
msgid "Cannot apply new settings, one of the settings is invalid."
msgstr ""
-"Kan ej tillämpa de nya inställningarna; en av inställningarna är ogiltlig."
+"Kan inte tillämpa de nya inställningarna eftersom minst en av dom är "
+"ogiltlig."
#: pcsx2/gui/ConsoleLogger.cpp:120
msgid "Save log question"
@@ -691,7 +693,7 @@ msgstr "Klämmer in mycket loggning i en mikroskopiskt liten yta."
#: pcsx2/gui/ConsoleLogger.cpp:413
msgid "Small"
-msgstr "Liten"
+msgstr "Litet"
#: pcsx2/gui/ConsoleLogger.cpp:415
msgid "It's what I use (the programmer guy)."
@@ -699,7 +701,7 @@ msgstr "Det är vad Jag (programmerarsnubben) använder."
#: pcsx2/gui/ConsoleLogger.cpp:415 pcsx2/gui/Panels/CpuPanel.cpp:38
msgid "Normal"
-msgstr "Normal"
+msgstr "Normalt"
#: pcsx2/gui/ConsoleLogger.cpp:417
msgid "Its nice and readable."
@@ -707,11 +709,11 @@ msgstr "Det är fint och läsbart."
#: pcsx2/gui/ConsoleLogger.cpp:417
msgid "Large"
-msgstr "Stor"
+msgstr "Stort"
#: pcsx2/gui/ConsoleLogger.cpp:419
msgid "Huge"
-msgstr "Enorm"
+msgstr "Enormt"
#: pcsx2/gui/ConsoleLogger.cpp:419
msgid "In case you have a really high res display."
@@ -748,7 +750,7 @@ msgstr "När markerad kommer loggfönstret att bli synligt över andra fönster.
#: pcsx2/gui/ConsoleLogger.cpp:430
msgid "&Save..."
-msgstr "&Spara..."
+msgstr "&Spara ..."
#: pcsx2/gui/ConsoleLogger.cpp:430
msgid "Save log contents to file"
@@ -756,11 +758,11 @@ msgstr "Spara logginnehåll till fil"
#: pcsx2/gui/ConsoleLogger.cpp:431
msgid "C&lear"
-msgstr "R&ensa"
+msgstr "&Rensa"
#: pcsx2/gui/ConsoleLogger.cpp:431
msgid "Clear the log window contents"
-msgstr "Rensa Windowslogginnehåll"
+msgstr "Rensa loggfönsterinnehållet"
#: pcsx2/gui/ConsoleLogger.cpp:433 pcsx2/gui/Dialogs/SysConfigDialog.cpp:280
msgid "Appearance"
@@ -776,15 +778,15 @@ msgstr "Stäng detta loggfönster; innehållet bevaras"
#: pcsx2/gui/ConsoleLogger.cpp:439
msgid "Dev/Verbose"
-msgstr "Moj/Ordrik"
+msgstr "Utvecklarloggar"
#: pcsx2/gui/ConsoleLogger.cpp:439
msgid "Shows PCSX2 developer logs"
-msgstr "Visar PCSX2 utvecklarloggar"
+msgstr "Visar PCSX2's utvecklarloggar"
#: pcsx2/gui/ConsoleLogger.cpp:440
msgid "CDVD reads"
-msgstr "CDVD läser"
+msgstr "CDVD läsningar"
#: pcsx2/gui/ConsoleLogger.cpp:440
msgid "Shows disk read activity"
@@ -804,7 +806,7 @@ msgstr "Förhindra allt"
#: pcsx2/gui/ConsoleLogger.cpp:458
msgid "Disables all log source filters."
-msgstr "Förhindra alla loggkälsfilter."
+msgstr "Förhindra alla loggkällsfilter."
#: pcsx2/gui/ConsoleLogger.cpp:460
msgid "&Log"
@@ -829,7 +831,7 @@ msgstr "Föregående versioner"
#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:55
msgid "Webmasters"
-msgstr "Nätansvarig"
+msgstr "Nätansvariga"
#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:66
msgid "Plugin Specialists"
@@ -849,15 +851,15 @@ msgstr "Bidragare"
#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:98
msgid "A Playstation 2 Emulator"
-msgstr "En Playstation 2 Emulator"
+msgstr "En PlayStation®2 emulator"
#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:102
msgid "PCSX2 Official Website and Forums"
-msgstr "PCSX2 Officiella Websida och Forum"
+msgstr "PCSX2's officiella Websida och Forum"
#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:106
msgid "PCSX2 Official Svn Repository at Googlecode"
-msgstr "PCSX2 Officiella SVN-magasin hos Googlecode"
+msgstr "PCSX2's officiella SVN-magasin hos Googlecode"
#: pcsx2/gui/Dialogs/AboutBoxDialog.cpp:110
msgid "I've seen enough"
@@ -873,7 +875,7 @@ msgstr "Sparar en snabbild av denna inställningspanel till en PNG-fil."
#: pcsx2/gui/Dialogs/BaseConfigurationDialog.cpp:308
msgid "Save dialog screenshots to..."
-msgstr "Spara dialogskärmsbilder i..."
+msgstr "Spara dialogskärmsbilder i ..."
#: pcsx2/gui/Dialogs/BiosSelectorDialog.cpp:31
msgid "BIOS Selector"
@@ -896,8 +898,7 @@ msgid ""
"The popup will not be shown again. This setting can be undone from the "
"settings panels."
msgstr ""
-"Uppdykaren kommer att visas igen. Denna inställning kan ogöras i "
-"inställningspanelen."
+"Uppdykaren kommer inte visas igen. Detta kan ogöras i inställningspanelen."
#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:247
#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:292
@@ -910,7 +911,7 @@ msgstr "Återställ"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:40
msgid "Create a new memory card"
-msgstr "Skapa nytt minneskort"
+msgstr "Skapa ett nytt minneskort"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:59
#: pcsx2/gui/Panels/DirPickerPanel.cpp:74
@@ -947,27 +948,27 @@ msgstr "Fel: Minneskortet kunde inte skapas."
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:177
msgid "Use NTFS compression when creating this card."
-msgstr "Använd NTFS-komprimering för skapande att detta kort."
+msgstr "Använd NTFS-komprimering vid skapande av detta kort."
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:195
msgid "8 MB [most compatible]"
-msgstr "8 MB [mest förenlig]"
+msgstr "8 MB [mest förenligt]"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:195
msgid ""
"This is the standard Sony-provisioned size, and is supported by all games "
"and BIOS versions."
msgstr ""
-"Detta är den standard-Sony-provianterade storleken, och stödjes av alla spel "
-"och BIOS-versioner."
+"Detta är den (av Sony) standardföreskrivna storleken \n"
+" och stödjes av alla spel och BIOS-versioner."
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:196
msgid ""
"Always use this option if you want the safest and surest memory card "
"behavior."
msgstr ""
-"Använd alltid denna tillämpning om Ni vill ha det säkraste och "
-"tillförlitligaste minneskortsbeteendet."
+"Använd alltid denna tillämpning om Ni vill ha det \n"
+" säkraste och tillförlitligaste minneskortsbeteendet."
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:199
msgid "16 MB"
@@ -978,13 +979,13 @@ msgstr "16 MB"
msgid ""
"A typical size for 3rd-party memory cards which should work with most games."
msgstr ""
-"En typisk storlek för tredje-persons-minneskort som ska fungera med de "
-"flesta spel."
+"En typisk storlek för tredje-parts minneskort \n"
+" som ska fungera med de flesta spel."
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:200
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:204
msgid "16 and 32 MB cards have roughly the same compatibility factor."
-msgstr "16 och 32 MB kort har ungefär samma förenlighetsfaktor."
+msgstr "16 & 32 MB kort har ungefär samma förenlighetsfaktor."
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:203
msgid "32 MB"
@@ -999,21 +1000,21 @@ msgid ""
"Low compatibility warning: Yes it's very big, but may not work with many "
"games."
msgstr ""
-"Låg förenlighetsvarning: Jo den är väldigt stor, men kan måhända inte "
-"fungera för många spel."
+"Låg förenlighetsvarning: Jo den är väldigt stor, \n"
+" men fungerar måhända inte för många spel."
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:208
msgid ""
"Use at your own risk. Erratic memory card behavior is possible (though "
"unlikely)."
msgstr ""
-"Använd på egen risk. Oberäkneliga minneskortsbeteenden är möjliga (dock "
-"osannolika)."
+"Används på egen risk. Oberäkneliga minneskortsbeteenden \n"
+" är möjliga (dock osannolika)."
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:47
#, c-format
msgid "Select a folder for %s settings"
-msgstr "Välj en mapp för %s inställningar"
+msgstr "Välj en mapp för %s-inställningar"
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:47
msgid "Settings"
@@ -1037,16 +1038,16 @@ msgstr "Välkommen till PCSX2!"
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:104
msgid "Configuration Guides (online)"
-msgstr "Konfigurationsguider (uppkopplat)"
+msgstr "KonfigurationsVägledningen (uppkopplat)"
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:108
msgid "Readme / FAQ (Offline/PDF)"
-msgstr "Läs mig / FAQ (Urkopplat/PDF)"
+msgstr "Läs mig / FAQ (urkopplat/PDF)"
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:117
#, c-format
msgid "%s First Time Configuration"
-msgstr "%s Första-gången Konfiguration"
+msgstr "%s's Första gången Konfiguration"
#: pcsx2/gui/Dialogs/GameDatabaseDialog.cpp:24
#, c-format
@@ -1055,7 +1056,7 @@ msgstr "Speldatabas - %s"
#: pcsx2/gui/Dialogs/ImportSettingsDialog.cpp:24
msgid "Import Existing Settings?"
-msgstr "Importera Befintliga Inställningar?"
+msgstr "Importera befintliga inställningar?"
#: pcsx2/gui/Dialogs/ImportSettingsDialog.cpp:39
msgid "Import"
@@ -1071,11 +1072,11 @@ msgstr "Spåra Loggning"
#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:40
msgid "Auto-eject memory cards when loading savestates"
-msgstr "Auto-utmata minneskort när sparpunkter laddas"
+msgstr "Utmata automatiskt minneskort när sparpunkter laddas"
#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:96
msgid "MemoryCard Manager"
-msgstr "MinnesKorts Hanterare"
+msgstr "Minneskorts Hanterare"
#: pcsx2/gui/Dialogs/McdConfigDialog.cpp:112
msgid "Drag cards to or from PS2-ports"
@@ -1087,12 +1088,12 @@ msgid ""
"Note: Duplicate/Rename/Create/Delete will NOT be reverted with 'Cancel'."
msgstr ""
"\n"
-"Bemärk: Dubblera/Byt namn/Skapa/Ta bort, kommer INTE att återgå om Ni "
-"trycker 'Avbryt'."
+"Bemärk: ''Dubblera''/''Namnbyt''/''Skapa''/''Kassera'' kommer INTE att "
+"återgå genom ''Avbryt''."
#: pcsx2/gui/Dialogs/PickUserModeDialog.cpp:24
msgid "PCSX2 First Time configuration"
-msgstr "PCSX2 Första Gången konfiguration"
+msgstr "PCSX2 Första gången Konfiguration"
#: pcsx2/gui/Dialogs/PickUserModeDialog.cpp:29
#, c-format
@@ -1105,11 +1106,11 @@ msgstr "PCSX2 Tråd är osvarandes"
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:36
msgid "Config Overrides Warning"
-msgstr "Konfig Överskrider Varning"
+msgstr "KonfigÅsidosättningVarning"
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:56
msgid "Components Overrides Warning"
-msgstr "Komponent Överskrider Varning"
+msgstr "KomponentÅsidosättningsVarning"
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:147
msgid "Preset:"
@@ -1126,7 +1127,7 @@ msgstr "EE/IOP"
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:238
msgid "VUs"
-msgstr "VUs"
+msgstr "VU'ar"
#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:239
msgid "GS"
@@ -1168,16 +1169,16 @@ msgstr "Framträdande/Teman - %s"
#: pcsx2/gui/ExecutorThread.cpp:40
msgid "Logs events as they are passed to the PS2 virtual machine."
-msgstr "Loggar händelser medans de skickas till PS2-VM."
+msgstr "Loggar händelser medans de skickas till PS2's Virtuella Maskin."
#: pcsx2/gui/ExecutorThread.cpp:430
msgid "Press Cancel to attempt to cancel the action."
-msgstr "Tryck Avbryt för att försöka avbryta verkan."
+msgstr "Tryck ''Avbryt'' för att försöka avbryta verkan."
#: pcsx2/gui/ExecutorThread.cpp:431
#, c-format
msgid "Press Terminate to kill %s immediately."
-msgstr "Tryck Avsluta för att avsluta %s omedelebart."
+msgstr "Tryck ''Avsluta'' för att avsluta %s omedelebart."
#: pcsx2/gui/ExecutorThread.cpp:434
msgid "Terminate App"
@@ -1185,7 +1186,7 @@ msgstr "Avsluta tillämpning"
#: pcsx2/gui/FrameForGS.cpp:384
msgid "GS Output is Disabled!"
-msgstr "GS Utsignal är Förhindrad!"
+msgstr "GS' Utsignal är Förhindrad!"
#: pcsx2/gui/GlobalCommands.cpp:387 pcsx2/gui/MainFrame.cpp:414
msgid "Save state"
@@ -1193,7 +1194,7 @@ msgstr "Spara tillstånd"
#: pcsx2/gui/GlobalCommands.cpp:388
msgid "Saves the virtual machine state to the current slot."
-msgstr "Sparar VM-tillståndet till den nuvarande sockeln."
+msgstr "Sparar det Virtuella Maskin tillståndet till den nuvarande sockeln."
#: pcsx2/gui/GlobalCommands.cpp:393 pcsx2/gui/MainFrame.cpp:413
msgid "Load state"
@@ -1201,7 +1202,7 @@ msgstr "Ladda tillstånd"
#: pcsx2/gui/GlobalCommands.cpp:394
msgid "Loads a virtual machine state from the current slot."
-msgstr "Laddar VM tillståndet från den nuvarande sockeln."
+msgstr "Laddar det Virtuella Maskin tillståndet från den nuvarande sockeln."
#: pcsx2/gui/GlobalCommands.cpp:399
msgid "Load State Backup"
@@ -1209,7 +1210,8 @@ msgstr "Ladda Tillståndskopia"
#: pcsx2/gui/GlobalCommands.cpp:400
msgid "Loads virtual machine state backup for current slot."
-msgstr "Laddar VM tillståndskopian för den nuvarande sockeln."
+msgstr ""
+"Laddar kopian för det Virtuella Maskin tillståndet för den nuvarande sockeln."
#: pcsx2/gui/GlobalCommands.cpp:405
msgid "Cycle to next slot"
@@ -1237,7 +1239,7 @@ msgid ""
"It is an error to drop multiple files onto a %s window. One at a time "
"please, thank you."
msgstr ""
-"Det är felaktigt att släppa flera filer på ett %s fönster. En i taget, tack."
+"Det är felaktigt att släppa flera filer på ett %s-fönster. En i taget, tack."
#: pcsx2/gui/IsoDropTarget.cpp:89 pcsx2/gui/MainMenuClicks.cpp:342
msgid "Confirm PS2 Reset"
@@ -1249,13 +1251,13 @@ msgid ""
"You have dropped the following ELF binary into %s:\n"
"\n"
msgstr ""
-"Ni har släppt följande ELF-binär i %s:\n"
+"Ni har släppt följande ELF-binär i %s: \n"
"\n"
#: pcsx2/gui/IsoDropTarget.cpp:135
#, c-format
msgid "You have dropped the following ISO image into %s:"
-msgstr "Ni har släppt följande ISO-bild i %s:"
+msgstr "Ni har släppt följande ISO-avbild i %s:"
#: pcsx2/gui/MainFrame.cpp:38
#, c-format
@@ -1264,7 +1266,7 @@ msgstr "Sockel %d"
#: pcsx2/gui/MainFrame.cpp:44 pcsx2/gui/Saveslots.cpp:150
msgid "Backup"
-msgstr "&Säkerhetskopiera"
+msgstr "Säkerhetskopiera"
#: pcsx2/gui/MainFrame.cpp:324
msgid "Show Console"
@@ -1280,7 +1282,7 @@ msgstr "&System"
#: pcsx2/gui/MainFrame.cpp:339
msgid "CD&VD"
-msgstr "CD&VD"
+msgstr "&CDVD"
#: pcsx2/gui/MainFrame.cpp:340
msgid "&Config"
@@ -1311,15 +1313,15 @@ msgstr "(modifierade)"
#: pcsx2/gui/MainFrame.cpp:399 pcsx2/gui/MainFrame.cpp:401
#: pcsx2/gui/MainFrame.cpp:407
msgid "Initializing..."
-msgstr "Initialisering..."
+msgstr "Initialisering ..."
#: pcsx2/gui/MainFrame.cpp:403
msgid "Run ELF..."
-msgstr "Kör ELF..."
+msgstr "Kör ELF ..."
#: pcsx2/gui/MainFrame.cpp:404
msgid "For running raw PS2 binaries directly"
-msgstr "För att köra råa PS2-binärer direkt"
+msgstr "För att direktköra råa PS2-binärer."
#: pcsx2/gui/MainFrame.cpp:416
msgid "Backup before save"
@@ -1333,7 +1335,7 @@ msgstr "Automatiska Spelfixar"
msgid "Automatically applies needed Gamefixes to known problematic games"
msgstr ""
"Tillämpar automatiskt erfordeliga Spelfixar för till vetskap problematiska "
-"spel"
+"spel."
#: pcsx2/gui/MainFrame.cpp:424
msgid "Enable Cheats"
@@ -1349,16 +1351,16 @@ msgstr "Nedstängning"
#: pcsx2/gui/MainFrame.cpp:433
msgid "Wipes all internal VM states and shuts down plugins."
-msgstr "Rensar alla interna VM tillstånd och stänger ner insticksprogram."
+msgstr "Rensar alla inhemska VM-tillstånd och stänger ner insticksprogram."
#: pcsx2/gui/MainFrame.cpp:435
msgid "Exit"
-msgstr "Utgå"
+msgstr "Avsluta"
#: pcsx2/gui/MainFrame.cpp:436
#, c-format
msgid "Closing %s may be hazardous to your health"
-msgstr "Att stänga %s kan vara skadligt för Er hälsa"
+msgstr "Att stänga ner %s kan vara riskfyllt för Eder hälsa."
#: pcsx2/gui/MainFrame.cpp:443
msgid "Iso Selector"
@@ -1374,7 +1376,7 @@ msgstr "ISO"
#: pcsx2/gui/MainFrame.cpp:447
msgid "Makes the specified ISO image the CDVD source."
-msgstr "Gör den angivna ISO-bilden till CDVD-källa."
+msgstr "Gör den ovan angivna ISO-avbilden till CDVD-källa."
#: pcsx2/gui/MainFrame.cpp:448
msgid "Plugin"
@@ -1382,11 +1384,11 @@ msgstr "Insticksprogram"
#: pcsx2/gui/MainFrame.cpp:448
msgid "Uses an external plugin as the CDVD source."
-msgstr "Använder ett externt insticksprogram som CDVD källa."
+msgstr "Använder ett utomstående insticksprogram som CDVD-källa."
#: pcsx2/gui/MainFrame.cpp:449
msgid "No disc"
-msgstr "Ingen disk"
+msgstr "Disklös"
#: pcsx2/gui/MainFrame.cpp:449
msgid "Use this to boot into your virtual PS2's BIOS configuration."
@@ -1414,7 +1416,7 @@ msgstr "&Video (GS)"
#: pcsx2/gui/MainFrame.cpp:467
msgid "&Audio (SPU2)"
-msgstr "&Audio (SPU2)"
+msgstr "&Ljud (SPU2)"
#: pcsx2/gui/MainFrame.cpp:468
msgid "&Controllers (PAD)"
@@ -1442,36 +1444,36 @@ msgstr "Flerplugg 2"
#: pcsx2/gui/MainFrame.cpp:481
msgid "Clear all settings..."
-msgstr "Rensa alla inställningar..."
+msgstr "Rensa alla inställningar ..."
#: pcsx2/gui/MainFrame.cpp:482
#, c-format
msgid "Clears all %s settings and re-runs the startup wizard."
-msgstr "Rensa alla %s inställningar och återkör start-trollkarlen."
+msgstr "Rensa alla %s-inställningar och återkör ''Första gången Trollkarlen''."
#: pcsx2/gui/MainFrame.cpp:504
msgid "About..."
-msgstr "Om..."
+msgstr "Om ..."
#: pcsx2/gui/MainFrame.cpp:508
msgid "Logging..."
-msgstr "Loggning..."
+msgstr "Loggning ..."
#: pcsx2/gui/MainFrame.cpp:585
msgid "Pause"
-msgstr "Pause"
+msgstr "Pausa"
#: pcsx2/gui/MainFrame.cpp:586
msgid "Safely pauses emulation and preserves the PS2 state."
-msgstr "Pausar säkert emulering och bevarar PS2-tillståndet."
+msgstr "Säker pausning av emulering som bevarar PS2-tillståndet."
#: pcsx2/gui/MainFrame.cpp:593
msgid "Resume"
-msgstr "Fortsätt"
+msgstr "Återuppta"
#: pcsx2/gui/MainFrame.cpp:594
msgid "Resumes the suspended emulation state."
-msgstr "Återupptar det inställda emuleringstillståndet."
+msgstr "Återupptar det pausade emuleringstillståndet."
#: pcsx2/gui/MainFrame.cpp:598
msgid "Pause/Resume"
@@ -1479,8 +1481,7 @@ msgstr "Pausa/Återuppta"
#: pcsx2/gui/MainFrame.cpp:599
msgid "No emulation state is active; cannot suspend or resume."
-msgstr ""
-"Inget emuleringstillstånd är aktivt; kan inte inställa eller återuppta."
+msgstr "Inget emuleringstillstånd är aktivt; kan inte Pausa eller Återuppta."
#: pcsx2/gui/MainFrame.cpp:608
msgid "Restart"
@@ -1488,7 +1489,7 @@ msgstr "Omstart"
#: pcsx2/gui/MainFrame.cpp:609
msgid "Simulates hardware reset of the PS2 virtual machine."
-msgstr "Simulerar hårdvaruåterställningen hos PS2-VM."
+msgstr "Simulerar hårdvaruåterställningen för PS2's Virtuella Maskin."
#: pcsx2/gui/MainFrame.cpp:614
msgid "No emulation state is active; boot something first."
@@ -1500,7 +1501,7 @@ msgstr "Återkör CDVD (fullt)"
#: pcsx2/gui/MainFrame.cpp:623
msgid "Hard reset of the active VM."
-msgstr "Hård återställning av den aktiva VM."
+msgstr "Hård återställning av den aktiva VM'n."
#: pcsx2/gui/MainFrame.cpp:627
msgid "Boot CDVD (full)"
@@ -1508,7 +1509,7 @@ msgstr "Kör CDVD (fullt)"
#: pcsx2/gui/MainFrame.cpp:628
msgid "Boot the VM using the current DVD or Iso source media"
-msgstr "Kör VM med nuvarande DVD/ISO mediumet som källa"
+msgstr "Kör VM'n med det nuvarande DVD/ISO mediumet som källa."
#: pcsx2/gui/MainFrame.cpp:636
msgid "Reboot CDVD (fast)"
@@ -1516,7 +1517,7 @@ msgstr "Återkör CDVD (snabbt)"
#: pcsx2/gui/MainFrame.cpp:637
msgid "Reboot using fast BOOT (skips splash screens)"
-msgstr "Återkör med snabb BOOT (hoppar över plaskskärmar)"
+msgstr "Återkör med snabbuppkörning (hoppar över plaskskärmar)"
#: pcsx2/gui/MainFrame.cpp:641
msgid "Boot CDVD (fast)"
@@ -1524,7 +1525,8 @@ msgstr "Kör CDVD (snabbt)"
#: pcsx2/gui/MainFrame.cpp:642
msgid "Use fast boot to skip PS2 startup and splash screens"
-msgstr "Använd snabb boot för att hoppa över PS2-uppstart och plaskskärmar"
+msgstr ""
+"Använd snabbuppkörning för att hoppa över PS2-uppstart och plaskskärmar."
#: pcsx2/gui/MainFrame.cpp:703 pcsx2/gui/MainFrame.cpp:738
msgid "No plugin loaded"
@@ -1532,43 +1534,45 @@ msgstr "Inget insticksprogram laddat"
#: pcsx2/gui/MainFrame.cpp:708
msgid "Core GS Settings..."
-msgstr "Kärn GS Inställningar..."
+msgstr "Kärn-GS Inställningar ..."
#: pcsx2/gui/MainFrame.cpp:709
msgid ""
"Modify hardware emulation settings regulated by the PCSX2 core virtual "
"machine."
-msgstr "Ändra hårdvaruemuleringsinställningar reglerade av PCSX2's kärn-VM."
+msgstr ""
+"Ändra hårdvaruemuleringsinställningar reglerade av PCSX2's kärn Virtuella "
+"Maskin."
#: pcsx2/gui/MainFrame.cpp:711
msgid "Window Settings..."
-msgstr "Fönster Inställningar..."
+msgstr "Fönster Inställningar ..."
#: pcsx2/gui/MainFrame.cpp:712
msgid "Modify window and appearance options, including aspect ratio."
-msgstr "Ändra fönster och utseendetillämpningar, inklusive bildkvot."
+msgstr "Ändra fönster och utseendetillämpningar, däribland bildkvot."
#: pcsx2/gui/MainFrame.cpp:719
msgid "Plugin Settings..."
-msgstr "Insticksinställningar"
+msgstr "Insticksinställningar ..."
#: pcsx2/gui/MainFrame.cpp:720
#, c-format
msgid "Opens the %s plugin's advanced settings dialog."
-msgstr "Öppnar %s insticksprograms avancerade inställningsdialog."
+msgstr "Öppnar %s-insticksprogrammets avancerade inställningsdialog."
#: pcsx2/gui/MainMenuClicks.cpp:112
msgid "Reset all settings?"
-msgstr "Återställ alla inställningar?"
+msgstr "Återställa alla inställningar?"
#: pcsx2/gui/MainMenuClicks.cpp:140
msgid "Confirm ISO image change"
-msgstr "Bekräfta ISO-bildförändring"
+msgstr "Bekräfta ISO-avbildförändring"
#: pcsx2/gui/MainMenuClicks.cpp:146
msgid "Do you want to swap discs or boot the new image (via system reset)?"
msgstr ""
-"Vill Ni byta disk eller köra den nya bilden (genom systemåterställning)?"
+"Vill Ni byta disk eller köra den nya avbilden (genom systemåterställning)?"
#: pcsx2/gui/MainMenuClicks.cpp:148 pcsx2/gui/MainMenuClicks.cpp:194
msgid "Swap Disc"
@@ -1585,7 +1589,7 @@ msgstr "Ni har valt att byta CDVD-källa från %s till %s."
#: pcsx2/gui/MainMenuClicks.cpp:191
msgid "Do you want to swap discs or boot the new image (system reset)?"
-msgstr "Vill Ni byta disk eller köra den nya bilden (systemåterställning)?"
+msgstr "Vill Ni byta disk eller köra den nya avbilden (systemåterställning)?"
#: pcsx2/gui/MainMenuClicks.cpp:261
#, c-format
@@ -1595,7 +1599,7 @@ msgstr "Alla Stödjandes (%s)"
#: pcsx2/gui/MainMenuClicks.cpp:264
#, c-format
msgid "Disc Images (%s)"
-msgstr "Diskbilder (%s)"
+msgstr "Diskavbilder (%s)"
#: pcsx2/gui/MainMenuClicks.cpp:267
#, c-format
@@ -1608,11 +1612,11 @@ msgstr "Alla Filer (*.*)"
#: pcsx2/gui/MainMenuClicks.cpp:273
msgid "Select CDVD source iso..."
-msgstr "Välj CDVD käll-ISO..."
+msgstr "Välj CDVD'ns käll-ISO ..."
#: pcsx2/gui/MainMenuClicks.cpp:290
msgid "Select ELF file..."
-msgstr "Välj ELF fil..."
+msgstr "Välj ELF-fil ..."
#: pcsx2/gui/MainMenuClicks.cpp:316
msgid "ISO file not found!"
@@ -1627,15 +1631,15 @@ msgid ""
"Error: The configured ISO file does not exist. Click OK to select a new ISO "
"source for CDVD."
msgstr ""
-"Fel: Den konfigurerade ISO-files finns ej. Klicka OK för att välja en ny ISO-"
-"källa till CDVD."
+"Fel: Den konfigurerade ISO-filen finns ej. Klicka ''Vidare'' för att välja "
+"en ny ISO-källa till CDVD'n."
#: pcsx2/gui/MainMenuClicks.cpp:390
msgid ""
"You have selected the following ISO image into PCSX2:\n"
"\n"
msgstr ""
-"Ni har valt följande ISO-bild för PCSX2:\n"
+"Ni har valt följande ISO-avbild för PCSX2: \n"
"\n"
#: pcsx2/gui/MemoryCardFile.cpp:183
@@ -1646,9 +1650,9 @@ msgid ""
"%s\n"
"\n"
msgstr ""
-"Kunde inte skapa ett minneskort:\n"
+"Kunde inte skapa ett minneskort: \n"
"\n"
-"%s\n"
+"%s \n"
"\n"
#: pcsx2/gui/MemoryCardFile.cpp:201
@@ -1659,9 +1663,9 @@ msgid ""
"%s\n"
"\n"
msgstr ""
-"Tillgång nekades till minneskortet:\n"
+"Tillgång nekades till minneskortet: \n"
"\n"
-"%s\n"
+"%s \n"
"\n"
#: pcsx2/gui/MemoryCardFile.cpp:525
@@ -1682,23 +1686,23 @@ msgstr "Operativsystemet hindrar denna fil från att skapas"
#: pcsx2/gui/Panels/BaseApplicableConfigPanel.cpp:103
msgid "Cannot apply settings..."
-msgstr "Kan ej tillämpa inställningar..."
+msgstr "Kan ej tillämpa inställningar ..."
#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:103
msgid "BIOS Search Path:"
-msgstr "BIOS Sökväg:"
+msgstr "BIOS-sökväg:"
#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:104
msgid "Select folder with PS2 BIOS roms"
-msgstr "Välj mapp med PS2-BIOS-ROM"
+msgstr "Välj mapp med PS2 BIOS ROM"
#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:111
msgid ""
"Click the Browse button to select a different folder where PCSX2 will look "
"for PS2 BIOS roms."
msgstr ""
-"Klicka på Bläddra för att välja en annan mapp för PCSX2 att söka efter PS2-"
-"BIOS-ROM."
+"Klicka på ''Bläddra'' för att välja en annan mapp för PCSX2 att söka efter "
+"PS2 BIOS ROM."
#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:113
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:156
@@ -1708,7 +1712,7 @@ msgstr "Fräscha upp listan"
#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:115
msgid "Select a BIOS rom:"
-msgstr "Välj ett BIOS-ROM:"
+msgstr "Välj ett BIOS ROM:"
#: pcsx2/gui/Panels/CpuPanel.cpp:24
msgid "Round Mode"
@@ -1732,15 +1736,15 @@ msgstr "Positiv"
#: pcsx2/gui/Panels/CpuPanel.cpp:32
msgid "Chop / Zero"
-msgstr "Hacka / Noll"
+msgstr "Hack / Noll"
#: pcsx2/gui/Panels/CpuPanel.cpp:37
msgid "None"
-msgstr "Ingen"
+msgstr "Inget"
#: pcsx2/gui/Panels/CpuPanel.cpp:85
msgid "EE/FPU Advanced Recompiler Options"
-msgstr "EE/FPU Avancerade Omkompilerar Möjligheter"
+msgstr "EE/FPU Avancerade OmkompilerarFunktioner"
#: pcsx2/gui/Panels/CpuPanel.cpp:87 pcsx2/gui/Panels/CpuPanel.cpp:102
msgid "Extra + Preserve Sign"
@@ -1748,11 +1752,11 @@ msgstr "Extra + Bevara Skylt"
#: pcsx2/gui/Panels/CpuPanel.cpp:88
msgid "Full"
-msgstr "Full"
+msgstr "Fullt"
#: pcsx2/gui/Panels/CpuPanel.cpp:99
msgid "VU0 / VU1 Advanced Recompiler Options"
-msgstr "VU0 / VU1 Avancerade Omkompilerar Möjligheter"
+msgstr "VU0/VU1 Avancerade OmkompilerarFunktioner"
#: pcsx2/gui/Panels/CpuPanel.cpp:101
msgid "Extra"
@@ -1791,7 +1795,7 @@ msgstr ""
#: pcsx2/gui/Panels/CpuPanel.cpp:154
msgid "Enable EE Cache (Slower)"
-msgstr "Möjliggör EE Förråd (Långsammare)"
+msgstr "Möjliggör EE-förråd (Långsammare)"
#: pcsx2/gui/Panels/CpuPanel.cpp:154
msgid "Interpreter only; provided for diagnostic"
@@ -1807,8 +1811,9 @@ msgid ""
"Vector Unit Interpreter. Slow and not very compatible. Only use for "
"diagnostics."
msgstr ""
-"Vektor Enhets Tolkare. Långsam och inte värst förenlig. Använd endast för "
-"diagnostik."
+"VU Tolkare. \n"
+"Långsam och inte värst förenlig. \n"
+"Använd endast för diagnostik."
#: pcsx2/gui/Panels/CpuPanel.cpp:187
msgid "microVU Recompiler"
@@ -1818,8 +1823,8 @@ msgstr "microVU Omkompilerare"
msgid ""
"New Vector Unit recompiler with much improved compatibility. Recommended."
msgstr ""
-"Ny Vektor Enhets omkompilerare med mycket förbättrad förenlighet. "
-"Rekommenderas."
+"Ny VU-omkompilerare med mycket \n"
+" förbättrad förenlighet. Anrådes."
#: pcsx2/gui/Panels/CpuPanel.cpp:190
msgid "superVU Recompiler [legacy]"
@@ -1829,12 +1834,12 @@ msgstr "superVU Omkompilerare [legat]"
msgid ""
"Useful for diagnosing bugs or clamping issues in the new mVU recompiler."
msgstr ""
-"Användbar för att diagnostisera fel eller blockningsproblem i den nya mVU "
-"omkompileraren."
+"Användbar för att diagnostisera fel eller blockningsproblem \n"
+" i den nya mVU-omkompileraren."
#: pcsx2/gui/Panels/DirPickerPanel.cpp:64
msgid "Path does not exist"
-msgstr "Väg finnes ej"
+msgstr "Väg finns ej"
#: pcsx2/gui/Panels/DirPickerPanel.cpp:156
msgid "Use default setting"
@@ -1855,11 +1860,11 @@ msgstr "Skapa mapp?"
#: pcsx2/gui/Panels/DirPickerPanel.cpp:269
#, c-format
msgid "A configured folder does not exist. Should %s try to create it?"
-msgstr "En konfigurerad mapp finnes ej. Ska %s försöka skapa en?"
+msgstr "Ingen konfigurerad mapp finns. Ska %s försöka skapa en?"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:30
msgid "Fit to Window/Screen"
-msgstr "Passa till Fönster/Skärm"
+msgstr "Anpassa till Fönster/Skärm"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:31
msgid "Standard (4:3)"
@@ -1895,7 +1900,7 @@ msgstr "Dynamiskt växla Vsync beroende på bildfrekvens (läs verktygstips!)"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:52
msgid "Double-click toggles fullscreen mode"
-msgstr "Dubbel-klicka bryter helskärmsläge"
+msgstr "Dubbelklick bryter helskärmsläge"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:110
msgid "Aspect Ratio:"
@@ -1928,7 +1933,7 @@ msgstr "Spelfixar"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:38
msgid "VU Add Hack - Fixes Tri-Ace games boot crash."
-msgstr "VU Add Hack - Fixar Tri-Ace spelens körbrak."
+msgstr "VU Tilläggs Hack - åtgärdar ''Tri-Ace'' spelens uppkörskrasch."
#: pcsx2/gui/Panels/GameFixesPanel.cpp:39
msgid ""
@@ -1937,75 +1942,78 @@ msgid ""
" * Radiata Stories\n"
" * Valkyrie Profile 2"
msgstr ""
-"Spel som behöver denna hack för att köras:\n"
-" * Star Ocean 3\n"
-" * Radiata Stories\n"
-" * Valkyrie Profile 2"
+"Spel som behöver denna hack för att köras: \n"
+" * ''Star Ocean 3'' \n"
+" * ''Radiata Stories'' \n"
+" * ''Valkyrie Profile 2''"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:42
msgid "VU Clip Flag Hack - For Persona games (SuperVU recompiler only!)"
-msgstr "VU Clip Flag Hack - för Persona spel (SuperVU omkompilerare endast!)"
+msgstr ""
+"VU Klipp Flagg Hack - för ''Persona'' spel (endast SuperVU-omkompilerare!)"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:46
msgid "FPU Compare Hack - For Digimon Rumble Arena 2."
-msgstr "FPU Jämför Hack - för Digimon Rumble Arena 2."
+msgstr "FPU Jämför Hack - för ''Digimon Rumble Arena 2''."
#: pcsx2/gui/Panels/GameFixesPanel.cpp:50
msgid "FPU Multiply Hack - For Tales of Destiny."
-msgstr "FPU Multiplikations Hack - för Tales of Destiny."
+msgstr "FPU Multiplikations Hack - för ''Tales of Destiny''."
#: pcsx2/gui/Panels/GameFixesPanel.cpp:54
msgid "FPU Negative Div Hack - For Gundam games."
-msgstr "FPU Negativ Diverse Negativ Hack - för Gundam games."
+msgstr "FPU Negativ Diverse Hack - för ''Gundam'' spel."
#: pcsx2/gui/Panels/GameFixesPanel.cpp:58
msgid "VU XGkick Hack - For Erementar Gerad."
-msgstr "VU XGkick Hack - för Erementar Gerad."
+msgstr "VU XGkick Hack - för ''Erementar Gerad''."
#: pcsx2/gui/Panels/GameFixesPanel.cpp:62
msgid "FFX videos fix - Fixes bad graphics overlay in FFX videos."
-msgstr "FFX videor fix - Fixar dålig grafiköverdrag hos FFX videor."
+msgstr "FFX videor fix - löser dåligt grafiköverdrag för FFX-videor."
#: pcsx2/gui/Panels/GameFixesPanel.cpp:66
msgid "EE timing hack - Multi purpose hack. Try if all else fails."
-msgstr "EE tids hack - Flersyftes hack. Försök ifall allt annat misslyckas."
+msgstr "EE tids hack - en flersyftes hack. Försök ifall allt annat misslyckas."
#: pcsx2/gui/Panels/GameFixesPanel.cpp:75
msgid ""
"Skip MPEG hack - Skips videos/FMVs in games to avoid game hanging/freezes."
msgstr ""
-"Hoppa över MPEG hack - Hoppar över video/FMV i spel för att undgå att spel "
+"Hoppa över MPEG hack - hoppar över videor/FMV'er i spel för att undgå att de "
"hänger/fryses."
#: pcsx2/gui/Panels/GameFixesPanel.cpp:79
msgid "OPH Flag hack - Try if your game freezes showing the same frame."
-msgstr "OPH Flag hack - Försök ifall Ert spel fryser visandes samma bild."
+msgstr "OPH Flagg hack - Försök ifall Ert spel fryser visandes samma bild."
#: pcsx2/gui/Panels/GameFixesPanel.cpp:88
msgid "Ignore DMAC writes when it is busy."
-msgstr "Ignorera DMAC skrivningar när den är upptagen."
+msgstr "Ignorera DMAC-skrivningar när denne är upptagen."
#: pcsx2/gui/Panels/GameFixesPanel.cpp:95
msgid "Simulate VIF1 FIFO read ahead. Fixes slow loading games."
-msgstr "Simulerar VIF1 FIFO läs vidare. Löser långsamt laddande spel."
+msgstr "Simulera VIF1 FIFO läs vidare. Löser långsamt laddande spel."
#: pcsx2/gui/Panels/GameFixesPanel.cpp:103
msgid "Delay VIF1 Stalls (VIF1 FIFO) - For SOCOM 2 HUD."
-msgstr "Fördröj VIF1 uppehåll (VIF1 FIFO) - för SOCOM 2 HUD."
+msgstr "Fördröj VIF1 uppehåll (VIF1 FIFO) - för ''SOCOM 2'' HUD."
#: pcsx2/gui/Panels/GameFixesPanel.cpp:107
msgid "Ignore Bus Direction on Path3 Transfer - Used for Hotwheels"
-msgstr "Strunta i Bussriktning vid Path3 Överföring - Används för Hotwheels"
+msgstr ""
+"Strunta i Bussriktning vid Path3 Överföring - används för ''Hotwheels''"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:118
msgid "Enable manual game fixes [Not recommended]"
-msgstr "Möjliggör manuella spelfixar [Rekommenderas ej]"
+msgstr "Möjliggör manuella spelfixar [Avrådes]"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:127
msgid ""
"The safest way to make sure that all game fixes are completely disabled."
msgstr ""
-"Det bästa sättet att försäkra om att alla spelfixar är helt förhindrade."
+"Det bästa sättet att försäkra Er om att alla manuella spelfixar \n"
+" är helt förhindrade är att ha denna avmarkerad."
#: pcsx2/gui/Panels/LogOptionsPanels.cpp:249
msgid "Enable Trace Logging"
@@ -2016,8 +2024,8 @@ msgid ""
"Trace logs are all written to emulog.txt. Toggle trace logging at any time "
"using F10."
msgstr ""
-"Spårloggar är alla tillförda emulog.txt. Växla spårloggning när som helst "
-"med F10."
+"Spårloggar är alla skrivna i ''emulog.txt''. Växla spårloggning när som "
+"helst med ''F10''."
#: pcsx2/gui/Panels/LogOptionsPanels.cpp:251
msgid ""
@@ -2025,7 +2033,7 @@ msgid ""
"of 'What happened to my FPS?' problems. :)"
msgstr ""
"Varning: Möjliggörande av spårloggar är vanligtvis mycket långsamt, och är "
-"den främsta orsaken till 'Vad skedde med mina FPS?' problem. :)"
+"den främsta orsaken till ''Vad skedde med mina FPS'er?'' problem. :)"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:151
msgid "Select folder with PS2 memory cards"
@@ -2061,7 +2069,7 @@ msgstr "Skapa ett nytt minneskort."
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:529
msgid "Rename this memory card ..."
-msgstr "Byt namn på detta minneskort ..."
+msgstr "Namnbyt detta minneskort ..."
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:533
msgid "Insert ..."
@@ -2081,12 +2089,12 @@ msgstr "Dubblera detta minneskort ..."
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:542
msgid "Delete"
-msgstr "Ta bort"
+msgstr "Kassera"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:545
msgid "Permanently delete this memory card from disk (all contents are lost)"
msgstr ""
-"Permanent ta bort detta minneskort från disken (allt innehåll går förlorat)"
+"Ta permanent bort detta minneskort från disken (allt innehåll går förlorat)"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:547
msgid "Create a new memory card and assign it to this Port."
@@ -2094,7 +2102,7 @@ msgstr "Skapa ett nytt minneskort och anvisa den till denna Sockel."
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:726
msgid "Delete memory file?"
-msgstr "Radera minnesfil?"
+msgstr "Kassera minnesfil?"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:750
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:762
@@ -2105,15 +2113,15 @@ msgstr "Dubblera minneskort"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:750
msgid "Failed: Can only duplicate an existing card."
-msgstr "Misslyckades: Kan endast dubblera ett befintlig kort."
+msgstr "Misslyckades: Kan endast dubblera ett befintligt kort."
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:769
msgid ""
"Select a name for the duplicate\n"
"( '.ps2' will be added automatically)"
msgstr ""
-"Välj ett namn för dubbleringen\n"
-"( '.ps2' läggs till automatiskt)"
+"Välj ett namn för dubbleringen \n"
+" (''.ps2'' läggs till automatiskt):"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:782
#, c-format
@@ -2127,7 +2135,7 @@ msgstr "Kopiering misslyckades!"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:816
#, c-format
msgid "Memory card '%s' duplicated to '%s'."
-msgstr "Minneskorts '%s' dubblerad till '%s'."
+msgstr "Minneskort ''%s'' dubblerad till ''%s''."
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:820
msgid "Success"
@@ -2139,18 +2147,18 @@ msgid ""
"Select a new name for the memory card '%s'\n"
"( '.ps2' will be added automatically)"
msgstr ""
-"Välj ett nytt namn för minneskortet '%s'\n"
-"( '.ps2' läggs till automatiskt)"
+"Välj ett nytt namn för minneskortet ''%s'' \n"
+" (''.ps2'' läggs till automatiskt):"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:844
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:856
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:872
msgid "Rename memory card"
-msgstr "Byt namn på minneskort"
+msgstr "Namnbyt minneskort"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:872
msgid "Error: Rename could not be completed.\n"
-msgstr "Fel: Namnbyte kunde inte fullgöras.\n"
+msgstr "Fel: Namnbyte kunde inte fullgöras. \n"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:962
#: pcsx2/gui/Panels/MemoryCardListView.cpp:139
@@ -2171,7 +2179,7 @@ msgstr "Tom"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:994
#, c-format
msgid "Select a target port for '%s'"
-msgstr "Välj en målsockel för %s"
+msgstr "Välj en målsockel för ''%s''"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:995
msgid "Insert card"
@@ -2195,7 +2203,7 @@ msgstr "Namnbyt kort ..."
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1058
msgid "Delete card"
-msgstr "Radera kort"
+msgstr "Kassera kort"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1061
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:1065
@@ -2252,7 +2260,7 @@ msgstr "Användarlägesval"
#: pcsx2/gui/Panels/MiscPanelStuff.cpp:50
msgid "User Documents (recommended)"
-msgstr "Användardokument (rekommenderas)"
+msgstr "AnvändarDokument (Anrådes)"
#: pcsx2/gui/Panels/MiscPanelStuff.cpp:51
msgid "Location: "
@@ -2267,8 +2275,8 @@ msgid ""
"This setting may require administration privileges from your operating "
"system, depending on how your system is configured."
msgstr ""
-"Denna inställning kan kräva administratörsprivilegier av Ert operativsystem, "
-"beroende av hur Ert system är konfigurerat."
+"Beroende av hur Ert system är konfigurerat kan denna inställning kan kräva "
+"administratörsprivilegier av Ert operativsystem."
#: pcsx2/gui/Panels/MiscPanelStuff.cpp:66
#, c-format
@@ -2309,11 +2317,11 @@ msgstr "Välj en mapp för loggar/dumpar"
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:230
msgid "Applying settings..."
-msgstr "Tillämpar inställningar..."
+msgstr "Tillämpar inställningar ..."
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:240
msgid "Shutdown PS2 virtual machine?"
-msgstr "Stänga ned PS2-VM?"
+msgstr "Stänga ner PS2's Virtuella Maskin?"
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:321
msgid "I'm givin' her all she's got, Captain!"
@@ -2321,7 +2329,7 @@ msgstr "Jag ger henne allt hon har, Kapten!"
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:323
msgid "Enumerating available plugins..."
-msgstr "Uppräknar tillgängliga insticksprogram..."
+msgstr "Uppräknar tillgängliga insticksprogram ..."
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:356
msgid "Plugins Search Path:"
@@ -2333,12 +2341,13 @@ msgstr "Välj en mapp med PCSX2-insticksprogram"
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:370
msgid "Configure..."
-msgstr "Konfigurera..."
+msgstr "Konfigurera ..."
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:379
msgid "Click the Browse button to select a different folder for PCSX2 plugins."
msgstr ""
-"Klicka på Bläddra för att välja en annan mapp för PCSX2's insticksprogram."
+"Klicka på ''Bläddra'' för att välja en annan mapp för PCSX2's "
+"insticksprogram."
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:481
#, c-format
@@ -2353,14 +2362,14 @@ msgid ""
"Reason: %s\n"
"\n"
msgstr ""
-"Det valda %s insticksprogrammet misslyckades att laddas.\n"
+"Det valda %s-insticksprogrammet misslyckades att laddas. \n"
"\n"
-"Anledning: %s\n"
+"Anledning: %s \n"
"\n"
#: pcsx2/gui/Panels/PluginSelectorPanel.cpp:730
msgid "Completing tasks..."
-msgstr "Fullföljer uppgifter..."
+msgstr "Fullföljer uppgifter ..."
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:96
msgid "Enable speedhacks"
@@ -2370,7 +2379,8 @@ msgstr "Möjliggör snabbhackar"
msgid ""
"A safe and easy way to make sure that all speedhacks are completely disabled."
msgstr ""
-"Ett säkert och lätt sätt att försäkra om att alla snabbhackar är förhindrade."
+"Ett säkert och lätt sätt att försäkra Er om att alla snabbhackar \n"
+" är helt förhindrade är att ha denna avmarkerad."
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:111
msgid ""
@@ -2382,11 +2392,11 @@ msgstr ""
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:120
msgid "EE Cyclerate [Not Recommended]"
-msgstr "EE Cykelhastighet [Rekommenderas Ej]"
+msgstr "EE cykelhastighet [Avrådes]"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:141
msgid "VU Cycle Stealing [Not Recommended]"
-msgstr "VU Cykelstöld [Rekommenderas Ej]"
+msgstr "VU cykelstöld [Avrådes]"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:161
msgid "microVU Hacks"
@@ -2394,71 +2404,61 @@ msgstr "microVU Hackisar"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:163
msgid "mVU Flag Hack"
-msgstr "mVU Flag Hack"
+msgstr "mVU Flagg Hack"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:164
msgid ""
"Good Speedup and High Compatibility; may cause bad graphics... [Recommended]"
msgstr ""
-"Bra Uppsnabbning och Hög Förenlighet; kan orsaka dålig grafik... "
-"[Rekommenderas]"
+"Bra Uppsnabbning och Hög Förenlighet; \n"
+" kan orsaka dålig grafik ... [Anrådes]"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:166
-msgid "mVU Block Hack"
-msgstr "mVU Block Hack"
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
-msgid ""
-"Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
-msgstr ""
-"Bra Uppsnabbning och Hög Förenlighet; kan orsaka dålig grafik, SPS, etc..."
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "MTVU (Multi-Threaded microVU1)"
msgstr "MTVU (Multi-Trådad microVU1)"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:170
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
msgid ""
"Good Speedup and High Compatibility; may cause hanging... [Recommended if 3+ "
"cores]"
msgstr ""
-"Bra Uppsnabbning och Hög Förenlighet; kan orsaka att det hänger sig... "
-"[Rekommenderas för 3+ kärnor]"
+"Bra Uppsnabbning och Hög Förenlighet; kan orsaka \n"
+" att det hänger sig ... [Anrådes för 3+ kärnor]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:183
msgid "Other Hacks"
msgstr "Andra Hackisar"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:193
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:185
msgid "Enable INTC Spin Detection"
msgstr "Möjliggör INTC Rotationsuppfattning"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:194
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:186
msgid ""
"Huge speedup for some games, with almost no compatibility side effects. "
"[Recommended]"
msgstr ""
-"Enorm uppsnabbning för vissa spel, med nästan inga förenlighetsbieffekter. "
-"[Rekommenderas]"
+"Enorm uppsnabbning för vissa spel, \n"
+" nästan utan förenlighetsbieffekter. [Anrådes]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:196
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:188
msgid "Enable Wait Loop Detection"
-msgstr "Möjliggör Vänta Loop Uppfattning"
+msgstr "Möjliggör VäntloopsUpptäckning"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:197
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:189
msgid ""
"Moderate speedup for some games, with no known side effects. [Recommended]"
msgstr ""
-"Måttlig uppsnabbning för vissa spel, med inga kända bieffekter. "
-"[Rekommenderas]"
+"Måttlig uppsnabbning för vissa spel, \n"
+" utan kända bieffekter. [Anrådes]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:199
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
msgid "Enable fast CDVD"
msgstr "Möjliggör snabb CDVD"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:192
msgid "Fast disc access, less loading times. [Not Recommended]"
-msgstr "Snabb disktillgång, färre laddningsgånger. [Rekommenderas Ej]"
+msgstr "Snabb disktillgång, färre laddningsgånger. [Avrådes]"
#: pcsx2/gui/Panels/ThemeSelectorPanel.cpp:37
msgid "Themes Search Path:"
@@ -2473,8 +2473,8 @@ msgid ""
"Click the Browse button to select a different folder containing PCSX2 visual "
"themes."
msgstr ""
-"Klicka på Bläddra-knappen för att välja en annan mapp som innehåller PCSX2-"
-"teman."
+"Klicka på ''Bläddra''-knappen för att välja en annan mapp innehållandes "
+"PCSX2-teman."
#: pcsx2/gui/Panels/ThemeSelectorPanel.cpp:49
msgid "Select a visual theme:"
@@ -2488,24 +2488,25 @@ msgstr "Förhindra Bildbegränsning"
msgid ""
"Useful for running benchmarks. Toggle this option in-game by pressing F4."
msgstr ""
-"Användbar för att köra riktmärkning. Omkoppla denna tillämpning i aktivt "
-"spel genom att trycka på F4."
+"Användbar för att köra riktmärkning. \n"
+"Omkoppla denna tillämpning i aktivt spel \n"
+" genom att trycka på ''F4''."
#: pcsx2/gui/Panels/VideoPanel.cpp:61
msgid "Base Framerate Adjust:"
-msgstr "Grundbildfrekvensjustering:"
+msgstr "GrundbildfrekvensReglering:"
#: pcsx2/gui/Panels/VideoPanel.cpp:67
msgid "Slow Motion Adjust:"
-msgstr "Ultrarapidjustering:"
+msgstr "UltrarapidReglering:"
#: pcsx2/gui/Panels/VideoPanel.cpp:73
msgid "Turbo Adjust:"
-msgstr "Turbojustering:"
+msgstr "TurboReglering:"
#: pcsx2/gui/Panels/VideoPanel.cpp:88
msgid "NTSC Framerate:"
-msgstr "NTSC Bildfrekvens:"
+msgstr "NTSC bildfrekvens:"
#: pcsx2/gui/Panels/VideoPanel.cpp:91 pcsx2/gui/Panels/VideoPanel.cpp:97
msgid "FPS"
@@ -2513,73 +2514,73 @@ msgstr "FPS"
#: pcsx2/gui/Panels/VideoPanel.cpp:94
msgid "PAL Framerate:"
-msgstr "PAL Bildfrekvens:"
+msgstr "PAL bildfrekvens:"
-#: pcsx2/gui/Panels/VideoPanel.cpp:162
+#: pcsx2/gui/Panels/VideoPanel.cpp:166
msgid ""
"Error while parsing either NTSC or PAL framerate settings. Settings must be "
"valid floating point numerics."
msgstr ""
-"Fel under tolkning av antingen NTSC eller PAL bildfrekvensinstälningar. "
+"Fel under tolkning av antingen NTSC eller PAL bildfrekvensinstälningar. "
"Inställningarna måste vara giltliga flyttalsnummer."
-#: pcsx2/gui/Panels/VideoPanel.cpp:180
-msgid "Disabled [default]"
-msgstr "Förhindrad [förval]"
-
#: pcsx2/gui/Panels/VideoPanel.cpp:184
-msgid "Skip when on Turbo only (TAB to enable)"
-msgstr "Hoppa över endast vid Turbo (TAB för att möjliggöra)"
+msgid "Disabled [default]"
+msgstr "Förhindrat [förval]"
#: pcsx2/gui/Panels/VideoPanel.cpp:188
+msgid "Skip when on Turbo only (TAB to enable)"
+msgstr "Hoppa över endast vid Turbo (''Tab'' för att möjliggöra)"
+
+#: pcsx2/gui/Panels/VideoPanel.cpp:192
msgid "Constant skipping"
msgstr "Konstant överhoppande"
-#: pcsx2/gui/Panels/VideoPanel.cpp:190
+#: pcsx2/gui/Panels/VideoPanel.cpp:194
msgid ""
"Normal and Turbo limit rates skip frames. Slow motion mode will still "
"disable frameskipping."
msgstr ""
-"Normal och Turbobegränsad beräknad bildöverhoppning. Ultrarapidsläge "
-"förhindrar fortfarande bildöverhoppning."
+"Normal och Turbobegränsad bildöverhoppning, \n"
+" vilket dock ännu förhindras med Ultrarapidsläge."
-#: pcsx2/gui/Panels/VideoPanel.cpp:213
+#: pcsx2/gui/Panels/VideoPanel.cpp:217
msgid "Frames to Draw"
msgstr "Bilder att Rita"
-#: pcsx2/gui/Panels/VideoPanel.cpp:218
+#: pcsx2/gui/Panels/VideoPanel.cpp:222
msgid "Frames to Skip"
msgstr "Bilder att Hoppa över"
-#: pcsx2/gui/Panels/VideoPanel.cpp:294
+#: pcsx2/gui/Panels/VideoPanel.cpp:298
msgid "Use Synchronized MTGS"
msgstr "Använd Synkroniserad MTGS"
-#: pcsx2/gui/Panels/VideoPanel.cpp:295
+#: pcsx2/gui/Panels/VideoPanel.cpp:299
msgid ""
"For troubleshooting potential bugs in the MTGS only, as it is potentially "
"very slow."
msgstr ""
-"Enbart för att problemlösa eventuella fel inom \n"
-"MTGS, eftersom det möjligen är mycket långsamt."
+"Endast för att problemlösa eventuella fel inom \n"
+" MTGS, eftersom det möjligen är mycket långsamt."
-#: pcsx2/gui/Panels/VideoPanel.cpp:298
+#: pcsx2/gui/Panels/VideoPanel.cpp:302
msgid "Disable all GS output"
-msgstr "Förhindra all GS utgång"
+msgstr "Förhindra all GS-utgång"
-#: pcsx2/gui/Panels/VideoPanel.cpp:299
+#: pcsx2/gui/Panels/VideoPanel.cpp:303
msgid ""
"Completely disables all GS plugin activity; ideal for benchmarking EEcore "
"components."
msgstr ""
"Förhindrar helt all GS-insticksprogramsaktivitet; \n"
-"idealt som utgångspunkt för EE-kärnkomponenter."
+" idealt för att utvärdera EE-kärnkomponenter."
-#: pcsx2/gui/Panels/VideoPanel.cpp:316
+#: pcsx2/gui/Panels/VideoPanel.cpp:320
msgid "Frame Skipping"
-msgstr "Bildöverhoppande"
+msgstr "Bildöverhoppare"
-#: pcsx2/gui/Panels/VideoPanel.cpp:319
+#: pcsx2/gui/Panels/VideoPanel.cpp:323
msgid "Framelimiter"
msgstr "Bildbegränsare"
@@ -2588,8 +2589,8 @@ msgid ""
"Cannot load this savestate. The state is from an incompatible edition of "
"PCSX2 that is either newer than this version, or is no longer supported."
msgstr ""
-"Kan inte ladda denna sparpunkt; den är från en oförenlig utgåva av PCSX2 som "
-"antingen är nyare än denna version eller som ej längre stödjes."
+"Kan inte att ladda denna sparpunkt; den är från en oförenlig utgåva av PCSX2 "
+"som antingen är nyare än denna eller som inte längre stödjes."
#: pcsx2/gui/SysState.cpp:290
msgid ""
@@ -2601,7 +2602,8 @@ msgstr ""
#: pcsx2/gui/SysState.cpp:326
msgid "There is no active virtual machine state to download or save."
-msgstr "Det finns inget aktivt VM-tillstånd att nerladda eller spara."
+msgstr ""
+"Det finns inget aktivt Virtuellt Maskin tillstånd att nerladda eller spara."
#: pcsx2/gui/SysState.cpp:520
msgid ""
@@ -2610,8 +2612,8 @@ msgid ""
"corrupted."
msgstr ""
"Denna sparpunkt kan inte laddas eftersom den inte är ett giltlig gzip-arkiv. "
-"Den kan ha skapats av en äldre ostödjandes version av PCSX2, eller den kan "
-"ha förstörts."
+"Den kan ha skapats av en äldre ostödjandes version av PCSX2, eller så den "
+"kan ha förstörts."
#: pcsx2/gui/SysState.cpp:579
msgid "This file is not a valid PCSX2 savestate. See the logfile for details."
@@ -2622,8 +2624,8 @@ msgid ""
"This savestate cannot be loaded due to missing critical components. See the "
"log file for details."
msgstr ""
-"Denna sparpunkt kan inte laddas till följd av saknade kritiska komponenter. "
-"Se loggfil för detaljer."
+"Oförmögen att ladda denna sparpunkt till följd av saknade kritiska "
+"komponenter. Se loggfil för detaljer."
#: pcsx2/gui/i18n.cpp:63
msgid " (default)"
@@ -2631,14 +2633,14 @@ msgstr " (förval)"
#: pcsx2/ps2/BiosTools.cpp:83 pcsx2/ps2/BiosTools.cpp:151
msgid "The selected BIOS file is not a valid PS2 BIOS. Please re-configure."
-msgstr "Den valda BIOS-filen är inte ett giltligt PS2-BIOS. Omkonfigurera!"
+msgstr "Den valda BIOS-filen är inte ett giltligt PS2 BIOS. Omkonfigurera!"
#: pcsx2/ps2/BiosTools.cpp:244
msgid ""
"The PS2 BIOS could not be loaded. The BIOS has not been configured, or the "
"configuration has been corrupted. Please re-configure."
msgstr ""
-"PS2-BIOS'et kunde inte laddas eftersom det inte har konfigurerats, eller så "
+"PS2 BIOS'et kunde inte laddas eftersom det inte har konfigurerats, eller så "
"har konfigurationen förstörts. Omkonfigurera!"
#: pcsx2/ps2/BiosTools.cpp:251
@@ -2651,8 +2653,8 @@ msgid ""
"%s Extensions not found. The R5900-32 recompiler requires a host CPU with "
"MMX, SSE, and SSE2 extensions."
msgstr ""
-"%s Förlängningar ej funna. Omkompilatorn R5900-32 kräver en värd-CPU med "
-"MMX, SSE, och SSE2 förlängningar."
+"%s förlängningar ej funna. Omkompilatorn R5900-32 kräver en värd-CPU med "
+"instruktionsuppsättningarna MMX, SSE, och SSE2."
#: pcsx2/x86/microVU.cpp:28
#, c-format
@@ -2660,8 +2662,17 @@ msgid ""
"%s Extensions not found. microVU requires a host CPU with MMX, SSE, and "
"SSE2 extensions."
msgstr ""
-"%s Förlängningar ej funna. microVU kräven en värd-CPU med MMX, SSE, och SSE2 "
-"förlängningar."
+"%s förlängningar ej funna. microVU kräver en värd-CPU med "
+"instruktionsuppsättningarna MMX, SSE, och SSE2."
+
+#~ msgid "mVU Block Hack"
+#~ msgstr "mVU Block Hack"
+
+#~ msgid ""
+#~ "Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
+#~ msgstr ""
+#~ "Bra Uppsnabbning och Hög Förenlighet; \n"
+#~ " kan orsaka dålig grafik, SPS, etc..."
#~ msgid "Enable game fixes"
#~ msgstr "Möjliggör spelfixar"
diff --git a/locales/templates/pcsx2_Iconized.pot b/locales/templates/pcsx2_Iconized.pot
index 1ebf0ea3d..3e7325c1c 100644
--- a/locales/templates/pcsx2_Iconized.pot
+++ b/locales/templates/pcsx2_Iconized.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.9\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-11-16 20:17+0100\n"
+"POT-Creation-Date: 2012-04-07 11:42+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -26,7 +26,7 @@ msgstr ""
msgid "!Notice:VirtualMemoryMap"
msgstr ""
-#: pcsx2/CDVD/CDVD.cpp:385
+#: pcsx2/CDVD/CDVD.cpp:389
msgid "!Notice:PsxDisc"
msgstr ""
@@ -270,27 +270,23 @@ msgstr ""
msgid "!ContextTip:Speedhacks:VUCycleStealing Slider"
msgstr ""
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:172
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "!ContextTip:Speedhacks:vuFlagHack"
msgstr ""
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:177
-msgid "!ContextTip:Speedhacks:vuBlockHack"
-msgstr ""
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:182
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:174
msgid "!ContextTip:Speedhacks:vuThread"
msgstr ""
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:203
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:195
msgid "!ContextTip:Speedhacks:INTC"
msgstr ""
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:208
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
msgid "!ContextTip:Speedhacks:BIFC0"
msgstr ""
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:215
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:207
msgid "!ContextTip:Speedhacks:fastCDVD"
msgstr ""
@@ -298,15 +294,15 @@ msgstr ""
msgid "!ContextTip:Framelimiter:Disable"
msgstr ""
-#: pcsx2/gui/Panels/VideoPanel.cpp:223
+#: pcsx2/gui/Panels/VideoPanel.cpp:227
msgid "!Panel:Frameskip:Heading"
msgstr ""
-#: pcsx2/gui/Panels/VideoPanel.cpp:302
+#: pcsx2/gui/Panels/VideoPanel.cpp:306
msgid "!ContextTip:GS:SyncMTGS"
msgstr ""
-#: pcsx2/gui/Panels/VideoPanel.cpp:306
+#: pcsx2/gui/Panels/VideoPanel.cpp:310
msgid "!ContextTip:GS:DisableOutput"
msgstr ""
diff --git a/locales/templates/pcsx2_Main.pot b/locales/templates/pcsx2_Main.pot
index 80ed6960d..91e5fb7d0 100644
--- a/locales/templates/pcsx2_Main.pot
+++ b/locales/templates/pcsx2_Main.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.9\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-11-16 20:17+0100\n"
+"POT-Creation-Date: 2012-04-07 11:42+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -148,7 +148,7 @@ msgstr ""
msgid "Unloaded Plugin"
msgstr ""
-#: pcsx2/SaveState.cpp:339
+#: pcsx2/SaveState.cpp:342
msgid "Cannot load savestate. It is of an unknown or unsupported version."
msgstr ""
@@ -292,31 +292,31 @@ msgstr ""
msgid "The savestate was not properly saved. The temporary file was created successfully but could not be moved to its final resting place."
msgstr ""
-#: pcsx2/gui/AppConfig.cpp:837
+#: pcsx2/gui/AppConfig.cpp:842
msgid "Safest"
msgstr ""
-#: pcsx2/gui/AppConfig.cpp:838
+#: pcsx2/gui/AppConfig.cpp:843
msgid "Safe (faster)"
msgstr ""
-#: pcsx2/gui/AppConfig.cpp:839
+#: pcsx2/gui/AppConfig.cpp:844
msgid "Balanced"
msgstr ""
-#: pcsx2/gui/AppConfig.cpp:840
+#: pcsx2/gui/AppConfig.cpp:845
msgid "Aggressive"
msgstr ""
-#: pcsx2/gui/AppConfig.cpp:841
+#: pcsx2/gui/AppConfig.cpp:846
msgid "Aggressive plus"
msgstr ""
-#: pcsx2/gui/AppConfig.cpp:842
+#: pcsx2/gui/AppConfig.cpp:847
msgid "Mostly Harmful"
msgstr ""
-#: pcsx2/gui/AppConfig.cpp:999 pcsx2/gui/AppConfig.cpp:1005
+#: pcsx2/gui/AppConfig.cpp:1007 pcsx2/gui/AppConfig.cpp:1013
msgid "Failed to overwrite existing settings file; permission was denied."
msgstr ""
@@ -2184,46 +2184,38 @@ msgid "Good Speedup and High Compatibility; may cause bad graphics... [Recommend
msgstr ""
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:166
-msgid "mVU Block Hack"
-msgstr ""
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
-msgid "Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
-msgstr ""
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "MTVU (Multi-Threaded microVU1)"
msgstr ""
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:170
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
msgid "Good Speedup and High Compatibility; may cause hanging... [Recommended if 3+ cores]"
msgstr ""
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:183
msgid "Other Hacks"
msgstr ""
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:193
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:185
msgid "Enable INTC Spin Detection"
msgstr ""
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:194
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:186
msgid "Huge speedup for some games, with almost no compatibility side effects. [Recommended]"
msgstr ""
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:196
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:188
msgid "Enable Wait Loop Detection"
msgstr ""
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:197
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:189
msgid "Moderate speedup for some games, with no known side effects. [Recommended]"
msgstr ""
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:199
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
msgid "Enable fast CDVD"
msgstr ""
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:192
msgid "Fast disc access, less loading times. [Not Recommended]"
msgstr ""
@@ -2275,55 +2267,55 @@ msgstr ""
msgid "PAL Framerate:"
msgstr ""
-#: pcsx2/gui/Panels/VideoPanel.cpp:162
+#: pcsx2/gui/Panels/VideoPanel.cpp:166
msgid "Error while parsing either NTSC or PAL framerate settings. Settings must be valid floating point numerics."
msgstr ""
-#: pcsx2/gui/Panels/VideoPanel.cpp:180
+#: pcsx2/gui/Panels/VideoPanel.cpp:184
msgid "Disabled [default]"
msgstr ""
-#: pcsx2/gui/Panels/VideoPanel.cpp:184
+#: pcsx2/gui/Panels/VideoPanel.cpp:188
msgid "Skip when on Turbo only (TAB to enable)"
msgstr ""
-#: pcsx2/gui/Panels/VideoPanel.cpp:188
+#: pcsx2/gui/Panels/VideoPanel.cpp:192
msgid "Constant skipping"
msgstr ""
-#: pcsx2/gui/Panels/VideoPanel.cpp:190
+#: pcsx2/gui/Panels/VideoPanel.cpp:194
msgid "Normal and Turbo limit rates skip frames. Slow motion mode will still disable frameskipping."
msgstr ""
-#: pcsx2/gui/Panels/VideoPanel.cpp:213
+#: pcsx2/gui/Panels/VideoPanel.cpp:217
msgid "Frames to Draw"
msgstr ""
-#: pcsx2/gui/Panels/VideoPanel.cpp:218
+#: pcsx2/gui/Panels/VideoPanel.cpp:222
msgid "Frames to Skip"
msgstr ""
-#: pcsx2/gui/Panels/VideoPanel.cpp:294
+#: pcsx2/gui/Panels/VideoPanel.cpp:298
msgid "Use Synchronized MTGS"
msgstr ""
-#: pcsx2/gui/Panels/VideoPanel.cpp:295
+#: pcsx2/gui/Panels/VideoPanel.cpp:299
msgid "For troubleshooting potential bugs in the MTGS only, as it is potentially very slow."
msgstr ""
-#: pcsx2/gui/Panels/VideoPanel.cpp:298
+#: pcsx2/gui/Panels/VideoPanel.cpp:302
msgid "Disable all GS output"
msgstr ""
-#: pcsx2/gui/Panels/VideoPanel.cpp:299
+#: pcsx2/gui/Panels/VideoPanel.cpp:303
msgid "Completely disables all GS plugin activity; ideal for benchmarking EEcore components."
msgstr ""
-#: pcsx2/gui/Panels/VideoPanel.cpp:316
+#: pcsx2/gui/Panels/VideoPanel.cpp:320
msgid "Frame Skipping"
msgstr ""
-#: pcsx2/gui/Panels/VideoPanel.cpp:319
+#: pcsx2/gui/Panels/VideoPanel.cpp:323
msgid "Framelimiter"
msgstr ""
diff --git a/locales/tr_TR/pcsx2_Iconized.po b/locales/tr_TR/pcsx2_Iconized.po
index d324e1f5a..9ced83dab 100644
--- a/locales/tr_TR/pcsx2_Iconized.po
+++ b/locales/tr_TR/pcsx2_Iconized.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.9\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-09-28 20:27+0200\n"
+"POT-Creation-Date: 2012-04-07 11:42+0200\n"
"PO-Revision-Date: 2011-04-08 19:53+0200\n"
"Last-Translator: PyramidHead \n"
"Language-Team: Ceyhun Özgöç (PyramidHead) \n"
@@ -27,7 +27,7 @@ msgstr ""
msgid "!Notice:VirtualMemoryMap"
msgstr "!Notice:VirtualMemoryMap"
-#: pcsx2/CDVD/CDVD.cpp:385
+#: pcsx2/CDVD/CDVD.cpp:389
msgid "!Notice:PsxDisc"
msgstr "!Notice:PsxDisc"
@@ -273,28 +273,24 @@ msgstr "!ContextTip:Speedhacks:EECycleRate Slider"
msgid "!ContextTip:Speedhacks:VUCycleStealing Slider"
msgstr "!ContextTip:Speedhacks:VUCycleStealing Slider"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:172
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "!ContextTip:Speedhacks:vuFlagHack"
msgstr "!ContextTip:Speedhacks:vuFlagHack"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:177
-msgid "!ContextTip:Speedhacks:vuBlockHack"
-msgstr "!ContextTip:Speedhacks:vuBlockHack"
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:182
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:174
#, fuzzy
msgid "!ContextTip:Speedhacks:vuThread"
msgstr "!ContextTip:Speedhacks:vuMinMax"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:203
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:195
msgid "!ContextTip:Speedhacks:INTC"
msgstr "!ContextTip:Speedhacks:INTC"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:208
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
msgid "!ContextTip:Speedhacks:BIFC0"
msgstr "!ContextTip:Speedhacks:BIFC0"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:215
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:207
msgid "!ContextTip:Speedhacks:fastCDVD"
msgstr "!ContextTip:Speedhacks:fastCDVD"
@@ -302,15 +298,15 @@ msgstr "!ContextTip:Speedhacks:fastCDVD"
msgid "!ContextTip:Framelimiter:Disable"
msgstr "!ContextTip:Framelimiter:Disable"
-#: pcsx2/gui/Panels/VideoPanel.cpp:223
+#: pcsx2/gui/Panels/VideoPanel.cpp:227
msgid "!Panel:Frameskip:Heading"
msgstr "!Panel:Frameskip:Heading"
-#: pcsx2/gui/Panels/VideoPanel.cpp:302
+#: pcsx2/gui/Panels/VideoPanel.cpp:306
msgid "!ContextTip:GS:SyncMTGS"
msgstr "!ContextTip:GS:SyncMTGS"
-#: pcsx2/gui/Panels/VideoPanel.cpp:306
+#: pcsx2/gui/Panels/VideoPanel.cpp:310
msgid "!ContextTip:GS:DisableOutput"
msgstr "!ContextTip:GS:DisableOutput"
@@ -322,6 +318,9 @@ msgstr "!Notice:HostVmReserve"
msgid "!Notice:superVU:VirtualMemoryAlloc"
msgstr "!Notice:superVU:VirtualMemoryAlloc"
+#~ msgid "!ContextTip:Speedhacks:vuBlockHack"
+#~ msgstr "!ContextTip:Speedhacks:vuBlockHack"
+
#~ msgid "No reason given."
#~ msgstr "Sebep belirtilmemiş."
diff --git a/locales/tr_TR/pcsx2_Main.po b/locales/tr_TR/pcsx2_Main.po
index 82c02b6ea..c0febd4c7 100644
--- a/locales/tr_TR/pcsx2_Main.po
+++ b/locales/tr_TR/pcsx2_Main.po
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.9\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-09-28 20:27+0200\n"
+"POT-Creation-Date: 2012-02-28 12:20+0100\n"
"PO-Revision-Date: 2011-04-09 16:40+0200\n"
"Last-Translator: PyramidHead \n"
"Language-Team: Ceyhun Özgöç (PyramidHead) \n"
@@ -185,7 +185,7 @@ msgstr "Hafıza kartı eklentisi başlatılamadı."
msgid "Unloaded Plugin"
msgstr "Yüklenmemiş Eklenti"
-#: pcsx2/SaveState.cpp:339
+#: pcsx2/SaveState.cpp:342
msgid "Cannot load savestate. It is of an unknown or unsupported version."
msgstr ""
"Kayıt konumu yüklenemiyor. Dosya bilinmeyen ya da desteklenmeyen bir sürüme "
@@ -346,31 +346,31 @@ msgstr ""
"Kayıt konumu doğru şekilde kaydedilemedi. Geçici dosya oluşturuldu fakat son "
"kayıt işlemi tamamlanamadı."
-#: pcsx2/gui/AppConfig.cpp:837
+#: pcsx2/gui/AppConfig.cpp:842
msgid "Safest"
msgstr "En Güvenli"
-#: pcsx2/gui/AppConfig.cpp:838
+#: pcsx2/gui/AppConfig.cpp:843
msgid "Safe (faster)"
msgstr "Güvenli (daha hızlı)"
-#: pcsx2/gui/AppConfig.cpp:839
+#: pcsx2/gui/AppConfig.cpp:844
msgid "Balanced"
msgstr "Dengeli"
-#: pcsx2/gui/AppConfig.cpp:840
+#: pcsx2/gui/AppConfig.cpp:845
msgid "Aggressive"
msgstr "Agresif"
-#: pcsx2/gui/AppConfig.cpp:841
+#: pcsx2/gui/AppConfig.cpp:846
msgid "Aggressive plus"
msgstr "Daha Agresif"
-#: pcsx2/gui/AppConfig.cpp:842
+#: pcsx2/gui/AppConfig.cpp:847
msgid "Mostly Harmful"
msgstr "Çoğu Zaman Zararlı"
-#: pcsx2/gui/AppConfig.cpp:999 pcsx2/gui/AppConfig.cpp:1005
+#: pcsx2/gui/AppConfig.cpp:1007 pcsx2/gui/AppConfig.cpp:1013
msgid "Failed to overwrite existing settings file; permission was denied."
msgstr "Var olan dosya değiştirilemiyor; erişim engellendi."
@@ -2372,22 +2372,10 @@ msgstr ""
"neden olabilir [Önerilir]"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:166
-msgid "mVU Block Hack"
-msgstr "mVU Block Hack"
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
-#, fuzzy
-msgid ""
-"Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
-msgstr ""
-"Hızı oldukça artırır ve uyumluluğu yüksektir; görüntü ya da ses hatalarına "
-"neden olabilir."
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "MTVU (Multi-Threaded microVU1)"
msgstr ""
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:170
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
#, fuzzy
msgid ""
"Good Speedup and High Compatibility; may cause hanging... [Recommended if 3+ "
@@ -2396,35 +2384,35 @@ msgstr ""
"Hızı oldukça artırır ve uyumluluğu yüksektir; görüntü ya da ses hatalarına "
"neden olabilir [Önerilir]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:183
msgid "Other Hacks"
msgstr "Diğer Hackler"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:193
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:185
msgid "Enable INTC Spin Detection"
msgstr "INTC Spin Tanımlamasını Etkinleştir"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:194
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:186
msgid ""
"Huge speedup for some games, with almost no compatibility side effects. "
"[Recommended]"
msgstr ""
"Bazı oyunlarda hiçbir soruna yol açmadan büyük hız artışı sağlar. [Önerilir]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:196
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:188
msgid "Enable Wait Loop Detection"
msgstr "Wait Loop Tanımlamasını Etkinleştir"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:197
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:189
msgid ""
"Moderate speedup for some games, with no known side effects. [Recommended]"
msgstr "Bazı oyunlarda hiçvir soruna yol açmadan hız artışı sağlar. [Önerilir]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:199
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
msgid "Enable fast CDVD"
msgstr "Hızlı CDVD'yi etkinleştir"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:192
msgid "Fast disc access, less loading times. [Not Recommended]"
msgstr "CD'ye daha hızlı ulaşarak yükleme süresini azaltır. [Önerilmez]"
@@ -2482,7 +2470,7 @@ msgstr "FPS"
msgid "PAL Framerate:"
msgstr "PAL Kare hızı:"
-#: pcsx2/gui/Panels/VideoPanel.cpp:162
+#: pcsx2/gui/Panels/VideoPanel.cpp:166
msgid ""
"Error while parsing either NTSC or PAL framerate settings. Settings must be "
"valid floating point numerics."
@@ -2490,48 +2478,48 @@ msgstr ""
"NTSC ya da PAL kare hızı ayarlarında hata. Ayarlar geçerli rakamlardan "
"oluşmalı."
-#: pcsx2/gui/Panels/VideoPanel.cpp:180
+#: pcsx2/gui/Panels/VideoPanel.cpp:184
msgid "Disabled [default]"
msgstr "Devre dışı [varsayılan]"
-#: pcsx2/gui/Panels/VideoPanel.cpp:184
+#: pcsx2/gui/Panels/VideoPanel.cpp:188
msgid "Skip when on Turbo only (TAB to enable)"
msgstr "Yalnızca Turbo açıkken kare atla (TAB ile açın)"
-#: pcsx2/gui/Panels/VideoPanel.cpp:188
+#: pcsx2/gui/Panels/VideoPanel.cpp:192
msgid "Constant skipping"
msgstr "Sürekli kare atlama"
-#: pcsx2/gui/Panels/VideoPanel.cpp:190
+#: pcsx2/gui/Panels/VideoPanel.cpp:194
msgid ""
"Normal and Turbo limit rates skip frames. Slow motion mode will still "
"disable frameskipping."
msgstr ""
"Normal ve Turbo kare atlar. Ağır çekim modu kare atlamayı devre dışı bırakır."
-#: pcsx2/gui/Panels/VideoPanel.cpp:213
+#: pcsx2/gui/Panels/VideoPanel.cpp:217
msgid "Frames to Draw"
msgstr "Çizilecek Kare Sayısı"
-#: pcsx2/gui/Panels/VideoPanel.cpp:218
+#: pcsx2/gui/Panels/VideoPanel.cpp:222
msgid "Frames to Skip"
msgstr "Atlanacak Kare Sayısı"
-#: pcsx2/gui/Panels/VideoPanel.cpp:294
+#: pcsx2/gui/Panels/VideoPanel.cpp:298
msgid "Use Synchronized MTGS"
msgstr "Senkronize MTGS Kullan"
-#: pcsx2/gui/Panels/VideoPanel.cpp:295
+#: pcsx2/gui/Panels/VideoPanel.cpp:299
msgid ""
"For troubleshooting potential bugs in the MTGS only, as it is potentially "
"very slow."
msgstr "MTGS hatalarını tespit etmek için. Çok yavaştır."
-#: pcsx2/gui/Panels/VideoPanel.cpp:298
+#: pcsx2/gui/Panels/VideoPanel.cpp:302
msgid "Disable all GS output"
msgstr "Tüm GS çıkışını devre dışı bırak"
-#: pcsx2/gui/Panels/VideoPanel.cpp:299
+#: pcsx2/gui/Panels/VideoPanel.cpp:303
msgid ""
"Completely disables all GS plugin activity; ideal for benchmarking EEcore "
"components."
@@ -2539,11 +2527,11 @@ msgstr ""
"Tüm GS eklenti işlemlerini devre dışı bırakır; EEcore bileşenlerini test "
"etmek için idealdir."
-#: pcsx2/gui/Panels/VideoPanel.cpp:316
+#: pcsx2/gui/Panels/VideoPanel.cpp:320
msgid "Frame Skipping"
msgstr "Kare Atlama"
-#: pcsx2/gui/Panels/VideoPanel.cpp:319
+#: pcsx2/gui/Panels/VideoPanel.cpp:323
msgid "Framelimiter"
msgstr "Kare Sınırlama"
@@ -2628,6 +2616,16 @@ msgstr ""
"%s Uzantıları bulunamıyor. microVU MMX, SSE ve SSE2 destekleyen bir işlemci "
"gerektirir."
+#~ msgid "mVU Block Hack"
+#~ msgstr "mVU Block Hack"
+
+#, fuzzy
+#~ msgid ""
+#~ "Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
+#~ msgstr ""
+#~ "Hızı oldukça artırır ve uyumluluğu yüksektir; görüntü ya da ses "
+#~ "hatalarına neden olabilir."
+
#~ msgid "ISO mounting failed: PCSX2 is unable to identify the ISO image type."
#~ msgstr "ISO yüklemesi başarısız: PCSX2 ISO dosyası türünü tanımlayamıyor."
diff --git a/locales/zh_CN/pcsx2_Iconized.po b/locales/zh_CN/pcsx2_Iconized.po
index 773b1501e..5fa134236 100644
--- a/locales/zh_CN/pcsx2_Iconized.po
+++ b/locales/zh_CN/pcsx2_Iconized.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.9\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-09-24 20:29+0800\n"
+"POT-Creation-Date: 2012-04-07 11:42+0200\n"
"PO-Revision-Date: 2011-08-13 16:51+0700\n"
"Last-Translator: Wei Mingzhi \n"
"Language-Team: \n"
@@ -26,7 +26,7 @@ msgid "!Notice:VirtualMemoryMap"
msgstr ""
"没有足够的虚拟内存可用,或所需的虚拟内存映射已经被其它进程、服务或 DLL 保留。"
-#: pcsx2/CDVD/CDVD.cpp:385
+#: pcsx2/CDVD/CDVD.cpp:389
msgid "!Notice:PsxDisc"
msgstr ""
"PCSX2 不支持 Playstation 1 游戏。如果您想模拟 PS1 游戏请下载一个 PS1 模拟器,"
@@ -390,39 +390,33 @@ msgstr ""
"此选项控制 VU 单元从情感引擎挪用的时钟周期数目。较高数值将增加各个被游戏执行"
"的 VU 微程序从 EE 挪用的周期数目。"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:172
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "!ContextTip:Speedhacks:vuFlagHack"
msgstr ""
"仅在标志位被读取时更新,而不是总是更新。此选项通常是安全的,Super VU 默认会以"
"相似的方式处理。"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:177
-msgid "!ContextTip:Speedhacks:vuBlockHack"
-msgstr ""
-"假定未来的块不需要旧的标志实例数据。这应该是安全的。是否导致游戏出现问题仍然"
-"未知。"
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:182
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:174
msgid "!ContextTip:Speedhacks:vuThread"
msgstr ""
"在单独的线程是运行 VU1 (仅限 microVU1)。通常在三核以上 CPU 中有提速效果。此选"
"项对大多数游戏是安全的,但一部分游戏可能不兼容或导致没有响应。对于受限于 GS "
"的游戏,可能会造成性能下降 (特别是在双核 CPU 上)。"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:203
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:195
msgid "!ContextTip:Speedhacks:INTC"
msgstr ""
"此选项对于使用 INTC 状态寄存器来等待垂直同步的游戏效果较好,包括一些主要的 "
"3D RPG 游戏。对于不使用此方法的游戏没有提速效果。"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:208
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
msgid "!ContextTip:Speedhacks:BIFC0"
msgstr ""
"主要针对位于内核地址 0x81FC0 的 EE 空闲循环,此 Hack 试图检测循环体在一个另外"
"的模拟单元计划的事件处理过程之前不保证产生相同结果的循环。在一次循环体执行之"
"后,将下一事件的时间或处理器的时间片结束时间 (孰早) 做出更新。"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:215
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:207
msgid "!ContextTip:Speedhacks:fastCDVD"
msgstr ""
"请参看 HDLoader 兼容性列表以获取启用此项会出现问题的游戏列表。(通常标记为需"
@@ -432,16 +426,16 @@ msgstr ""
msgid "!ContextTip:Framelimiter:Disable"
msgstr "注意: 如限帧被禁用,快速模式和慢动作模式将不可用。"
-#: pcsx2/gui/Panels/VideoPanel.cpp:223
+#: pcsx2/gui/Panels/VideoPanel.cpp:227
msgid "!Panel:Frameskip:Heading"
msgstr ""
"注意: 由于 PS2 硬件设计,不可能准确跳帧。启用此选项可能在游戏中导致图像错误。"
-#: pcsx2/gui/Panels/VideoPanel.cpp:302
+#: pcsx2/gui/Panels/VideoPanel.cpp:306
msgid "!ContextTip:GS:SyncMTGS"
msgstr "如您认为 MTGS 线程同步导致崩溃或图像错误,请启用此项。"
-#: pcsx2/gui/Panels/VideoPanel.cpp:306
+#: pcsx2/gui/Panels/VideoPanel.cpp:310
msgid "!ContextTip:GS:DisableOutput"
msgstr ""
"禁用全部由 MTGS 线程或 GPU 开销导致的测试信息。此选项可与即时存档配合使用: 在"
@@ -461,6 +455,11 @@ msgstr ""
"内存溢出: SuperVU 重编译器无法保留所需的指定内存范围,且将不可用。这不是一个"
"严重错误,sVU 重编译器已过时,您应该使用 microVU。:)"
+#~ msgid "!ContextTip:Speedhacks:vuBlockHack"
+#~ msgstr ""
+#~ "假定未来的块不需要旧的标志实例数据。这应该是安全的。是否导致游戏出现问题仍"
+#~ "然未知。"
+
#~ msgid "!Notice:Mcd:Overwrite"
#~ msgstr ""
#~ "此操作将把 %u 插槽上的记忆卡内容复制到 %u 插槽。目标插槽记忆卡的数据将丢"
diff --git a/locales/zh_CN/pcsx2_Main.po b/locales/zh_CN/pcsx2_Main.po
index 154877fc0..34a988bb5 100644
--- a/locales/zh_CN/pcsx2_Main.po
+++ b/locales/zh_CN/pcsx2_Main.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.9\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-09-24 20:29+0800\n"
+"POT-Creation-Date: 2012-02-28 12:20+0100\n"
"PO-Revision-Date: 2011-09-24 20:32+0800\n"
"Last-Translator: Wei Mingzhi \n"
"Language-Team: \n"
@@ -37,8 +37,13 @@ msgid "Oh noes! Out of memory!"
msgstr "不好! 内存不够!"
#: common/src/Utilities/Exceptions.cpp:234
-msgid "Virtual memory mapping failure! Your system may have conflicting device drivers, services, or may simply have insufficient memory or resources to meet PCSX2's lofty needs."
-msgstr "虚拟内存映射错误! 您的系统可能有冲突的硬件驱动程序、服务,或者没有足够的内存或资源来满足 PCSX2 的要求。"
+msgid ""
+"Virtual memory mapping failure! Your system may have conflicting device "
+"drivers, services, or may simply have insufficient memory or resources to "
+"meet PCSX2's lofty needs."
+msgstr ""
+"虚拟内存映射错误! 您的系统可能有冲突的硬件驱动程序、服务,或者没有足够的内存"
+"或资源来满足 PCSX2 的要求。"
#: common/src/Utilities/Exceptions.cpp:309
msgid "Path: "
@@ -57,11 +62,15 @@ msgid "File not found."
msgstr "文件未找到。"
#: common/src/Utilities/Exceptions.cpp:373
-msgid "Permission denied while trying to open file, likely due to insufficient user account rights."
+msgid ""
+"Permission denied while trying to open file, likely due to insufficient user "
+"account rights."
msgstr "打开文件时拒绝访问,可能是由于用户账户权限限制。"
#: common/src/Utilities/Exceptions.cpp:393
-msgid "Unexpected end of file or stream encountered. File is probably truncated or corrupted."
+msgid ""
+"Unexpected end of file or stream encountered. File is probably truncated or "
+"corrupted."
msgstr "遇到非预期的文件或串流结尾。文件可能被截断或被破坏。"
#: common/src/Utilities/ThreadTools.cpp:41
@@ -89,25 +98,37 @@ msgid "Cannot load ELF binary image. The file may be corrupt or incomplete."
msgstr "无法加载 ELF 二进制映像。文件可能已损坏或不完整。"
#: pcsx2/Elfheader.cpp:268
-msgid "If loading from an ISO image, this error may be caused by an unsupported ISO image type or a bug in PCSX2 ISO image support."
-msgstr "如从一个 ISO 镜像加载,此错误可能由一个不被支持的 ISO 镜像类型或 PCSX2 ISO 镜像支持的 bug 引起。"
+msgid ""
+"If loading from an ISO image, this error may be caused by an unsupported ISO "
+"image type or a bug in PCSX2 ISO image support."
+msgstr ""
+"如从一个 ISO 镜像加载,此错误可能由一个不被支持的 ISO 镜像类型或 PCSX2 ISO 镜"
+"像支持的 bug 引起。"
#: pcsx2/MTGS.cpp:859
-msgid "The MTGS thread has become unresponsive while waiting for the GS plugin to open."
+msgid ""
+"The MTGS thread has become unresponsive while waiting for the GS plugin to "
+"open."
msgstr "MTGS 线程在等待 GS 插件打开时失去响应。"
#: pcsx2/PluginManager.cpp:709
-msgid "The savestate cannot be loaded, as it appears to be corrupt or incomplete."
+msgid ""
+"The savestate cannot be loaded, as it appears to be corrupt or incomplete."
msgstr "即时存档无法读取,文件可能已损坏或不完整。"
#: pcsx2/PluginManager.cpp:719
#, c-format
-msgid "%s plugin failed to open. Your computer may have insufficient resources, or incompatible hardware/drivers."
-msgstr "打开 %s 插件失败。您的计算机可能没有可用资源,或由不兼容的硬件/驱动程序导致。"
+msgid ""
+"%s plugin failed to open. Your computer may have insufficient resources, or "
+"incompatible hardware/drivers."
+msgstr ""
+"打开 %s 插件失败。您的计算机可能没有可用资源,或由不兼容的硬件/驱动程序导致。"
#: pcsx2/PluginManager.cpp:726
#, c-format
-msgid "%s plugin failed to initialize. Your system may have insufficient memory or resources needed."
+msgid ""
+"%s plugin failed to initialize. Your system may have insufficient memory or "
+"resources needed."
msgstr "%s 插件初始化失败。您的系统可能没有足够的内存或资源。"
#: pcsx2/PluginManager.cpp:832
@@ -122,21 +143,33 @@ msgstr "配置的 %s 插件文件不是一个合法的动态链接库"
#: pcsx2/PluginManager.cpp:854
#, c-format
-msgid "The configured %s plugin is not a PCSX2 plugin, or is for an older unsupported version of PCSX2."
-msgstr "配置的 %s 插件不是一个合法的 PCSX2 插件,或是为一个不受支持的 PCSX2 旧版本设计的。"
+msgid ""
+"The configured %s plugin is not a PCSX2 plugin, or is for an older "
+"unsupported version of PCSX2."
+msgstr ""
+"配置的 %s 插件不是一个合法的 PCSX2 插件,或是为一个不受支持的 PCSX2 旧版本设"
+"计的。"
#: pcsx2/PluginManager.cpp:879
-msgid "The plugin reports that your hardware or software/drivers are not supported."
+msgid ""
+"The plugin reports that your hardware or software/drivers are not supported."
msgstr "插件报告您的硬件或软件/驱动程序不受支持。"
#: pcsx2/PluginManager.cpp:900
-msgid "Configured plugin is not a PCSX2 plugin, or is for an older unsupported version of PCSX2."
-msgstr "配置的插件不是一个 PCSX2 插件,或是为一个不受支持的 PCSX2 旧版本设计的。"
+msgid ""
+"Configured plugin is not a PCSX2 plugin, or is for an older unsupported "
+"version of PCSX2."
+msgstr ""
+"配置的插件不是一个 PCSX2 插件,或是为一个不受支持的 PCSX2 旧版本设计的。"
#: pcsx2/PluginManager.cpp:926
#, c-format
-msgid "Configured %s plugin is not a valid PCSX2 plugin, or is for an older unsupported version of PCSX2."
-msgstr "配置的 %s 插件不是一个合法的 PCSX2 插件,或是为一个不受支持的 PCSX2 旧版本设计的。"
+msgid ""
+"Configured %s plugin is not a valid PCSX2 plugin, or is for an older "
+"unsupported version of PCSX2."
+msgstr ""
+"配置的 %s 插件不是一个合法的 PCSX2 插件,或是为一个不受支持的 PCSX2 旧版本设"
+"计的。"
#: pcsx2/PluginManager.cpp:1355
msgid "Internal Memorycard Plugin failed to initialize."
@@ -146,7 +179,7 @@ msgstr "内置记忆卡插件初始化失败。"
msgid "Unloaded Plugin"
msgstr "已卸载插件"
-#: pcsx2/SaveState.cpp:339
+#: pcsx2/SaveState.cpp:342
msgid "Cannot load savestate. It is of an unknown or unsupported version."
msgstr "无法加载即时存档。存档为一个未知或不支持的版本。"
@@ -155,7 +188,9 @@ msgid "Dumps detailed information for PS2 executables (ELFs)."
msgstr "转储 PS2 可执行文件 (ELF) 的详细信息。"
#: pcsx2/SourceLog.cpp:101
-msgid "Logs manual protection, split blocks, and other things that might impact performance."
+msgid ""
+"Logs manual protection, split blocks, and other things that might impact "
+"performance."
msgstr "记录手动保护、分割块以及其它可能影响性能的东西。"
#: pcsx2/SourceLog.cpp:106
@@ -178,8 +213,7 @@ msgstr "SYSCALL 及 DECI2 活动。"
msgid "Direct memory accesses to unknown or unmapped EE memory space."
msgstr "到未知或未映射的内存空间的直接内存访问。"
-#: pcsx2/SourceLog.cpp:157
-#: pcsx2/SourceLog.cpp:276
+#: pcsx2/SourceLog.cpp:157 pcsx2/SourceLog.cpp:276
msgid "Disasm of executing core instructions (excluding COPs and CACHE)."
msgstr "反汇编执行核心指令 (除了 COP 指令及 CACHE 指令)。"
@@ -200,16 +234,16 @@ msgid "Execution of EE cache instructions."
msgstr "EE 缓存指令的执行。"
#: pcsx2/SourceLog.cpp:187
-msgid "All known hardware register accesses (very slow!); not including sub filter options below."
+msgid ""
+"All known hardware register accesses (very slow!); not including sub filter "
+"options below."
msgstr "全部已知硬件寄存器访问 (很慢!);不包括以下子过滤器选项。"
-#: pcsx2/SourceLog.cpp:193
-#: pcsx2/SourceLog.cpp:294
+#: pcsx2/SourceLog.cpp:193 pcsx2/SourceLog.cpp:294
msgid "Logs only unknown, unmapped, or unimplemented register accesses."
msgstr "仅记录未知、未映射或未实现的寄存器访问。"
-#: pcsx2/SourceLog.cpp:199
-#: pcsx2/SourceLog.cpp:300
+#: pcsx2/SourceLog.cpp:199 pcsx2/SourceLog.cpp:300
msgid "Logs only DMA-related registers."
msgstr "仅记录 DMA 相关寄存器。"
@@ -262,7 +296,8 @@ msgid "Disasm of the IOP's GPU co-processor instructions."
msgstr "反汇编 IOP GPU 协处理器指令。"
#: pcsx2/SourceLog.cpp:288
-msgid "All known hardware register accesses, not including the sub-filters below."
+msgid ""
+"All known hardware register accesses, not including the sub-filters below."
msgstr "全部已知硬件寄存器访问,不包括以下子过滤器。"
#: pcsx2/SourceLog.cpp:306
@@ -285,42 +320,41 @@ msgstr "跟踪所有 IOP 计数器事件和一些计数器寄存器活动。"
msgid "Detailed logging of CDVD hardware."
msgstr "详细记录 CDVD 硬件信息。"
-#: pcsx2/System.h:206
-#: pcsx2/System.h:207
-#: pcsx2/System.h:208
+#: pcsx2/System.h:206 pcsx2/System.h:207 pcsx2/System.h:208
msgid "PCSX2 Message"
msgstr "PCSX2 消息"
#: pcsx2/ZipTools/thread_gzip.cpp:82
-msgid "The savestate was not properly saved. The temporary file was created successfully but could not be moved to its final resting place."
+msgid ""
+"The savestate was not properly saved. The temporary file was created "
+"successfully but could not be moved to its final resting place."
msgstr "即时存档未正确保存。临时文件建立成功但无法移至存档位置。"
-#: pcsx2/gui/AppConfig.cpp:837
+#: pcsx2/gui/AppConfig.cpp:842
msgid "Safest"
msgstr "最安全"
-#: pcsx2/gui/AppConfig.cpp:838
+#: pcsx2/gui/AppConfig.cpp:843
msgid "Safe (faster)"
msgstr "安全 (较快)"
-#: pcsx2/gui/AppConfig.cpp:839
+#: pcsx2/gui/AppConfig.cpp:844
msgid "Balanced"
msgstr "平衡"
-#: pcsx2/gui/AppConfig.cpp:840
+#: pcsx2/gui/AppConfig.cpp:845
msgid "Aggressive"
msgstr "较激进"
-#: pcsx2/gui/AppConfig.cpp:841
+#: pcsx2/gui/AppConfig.cpp:846
msgid "Aggressive plus"
msgstr "激进"
-#: pcsx2/gui/AppConfig.cpp:842
+#: pcsx2/gui/AppConfig.cpp:847
msgid "Mostly Harmful"
msgstr "不稳定"
-#: pcsx2/gui/AppConfig.cpp:999
-#: pcsx2/gui/AppConfig.cpp:1005
+#: pcsx2/gui/AppConfig.cpp:1007 pcsx2/gui/AppConfig.cpp:1013
msgid "Failed to overwrite existing settings file; permission was denied."
msgstr "覆盖已存在文件失败;权限被拒绝。"
@@ -333,7 +367,9 @@ msgid "PCSX2 - SSE2 Recommended"
msgstr "PCSX2 - 推荐使用 SSE2"
#: pcsx2/gui/AppInit.cpp:71
-msgid "SSE extensions are not available. PCSX2 requires a cpu that supports the SSE instruction set."
+msgid ""
+"SSE extensions are not available. PCSX2 requires a cpu that supports the "
+"SSE instruction set."
msgstr "SSE 扩展不可用。PCSX2 需要一个支持 SSE 指令集的 CPU。"
#: pcsx2/gui/AppInit.cpp:154
@@ -344,8 +380,7 @@ msgstr "PCSX2 重编译器错误"
msgid "All options are for the current session only and will not be saved.\n"
msgstr "全部选项仅对当前会话有效,不会被保存。\n"
-#: pcsx2/gui/AppInit.cpp:237
-#: pcsx2/gui/AppMain.cpp:299
+#: pcsx2/gui/AppInit.cpp:237 pcsx2/gui/AppMain.cpp:299
msgid "IsoFile"
msgstr "Iso 文件"
@@ -423,7 +458,8 @@ msgstr "插件覆盖错误 - %s"
#: pcsx2/gui/AppInit.cpp:310
#, c-format
msgid ""
-"%s Plugin Override Error! The following file does not exist or is not a valid %s plugin:\n"
+"%s Plugin Override Error! The following file does not exist or is not a "
+"valid %s plugin:\n"
"\n"
msgstr ""
"%s 插件覆盖错误! 以下文件不存在或不是一个合法的 %s 插件:\n"
@@ -438,8 +474,7 @@ msgstr "单击确定使用默认配置的插件,或取消关闭 %s。"
msgid "PCSX2 Error: Hardware Deficiency"
msgstr "PCSX2 错误: 硬件缺陷"
-#: pcsx2/gui/AppInit.cpp:496
-#: pcsx2/gui/AppInit.cpp:508
+#: pcsx2/gui/AppInit.cpp:496 pcsx2/gui/AppInit.cpp:508
#, c-format
msgid "Press OK to close %s."
msgstr "请单击 \"确定\" 来关闭 %s。"
@@ -527,9 +562,9 @@ msgstr ""
"\n"
"单击确定进入插件配置面板。"
-#: pcsx2/gui/AppMain.cpp:140
-#: pcsx2/gui/AppMain.cpp:154
-msgid "Warning! System plugins have not been loaded. PCSX2 may be inoperable."
+#: pcsx2/gui/AppMain.cpp:140 pcsx2/gui/AppMain.cpp:154
+msgid ""
+"Warning! System plugins have not been loaded. PCSX2 may be inoperable."
msgstr "警告! 系统插件未被加载。PCSX2 可能不可使用。"
#: pcsx2/gui/AppMain.cpp:309
@@ -579,7 +614,9 @@ msgid "Portable mode error - %s"
msgstr "绿色模式错误 - %s"
#: pcsx2/gui/AppUserMode.cpp:157
-msgid "PCSX2 has been installed as a portable application but cannot run due to the following errors:"
+msgid ""
+"PCSX2 has been installed as a portable application but cannot run due to the "
+"following errors:"
msgstr "PCSX2 已被安装为一个绿色软件,但由于以下错误无法运行:"
#: pcsx2/gui/AppUserMode.cpp:165
@@ -592,7 +629,9 @@ msgid "%s is switching to local install mode."
msgstr "%s 正在切换本地安装模式。"
#: pcsx2/gui/AppUserMode.cpp:179
-msgid "Try to remove the file called \"portable.ini\" from your installation directory manually."
+msgid ""
+"Try to remove the file called \"portable.ini\" from your installation "
+"directory manually."
msgstr "请尝试手动删除您的安装目录中的 \"portable.ini\" 文件。"
#: pcsx2/gui/ApplyState.h:55
@@ -615,8 +654,7 @@ msgstr "小"
msgid "It's what I use (the programmer guy)."
msgstr "我使用的 (程序员)。"
-#: pcsx2/gui/ConsoleLogger.cpp:415
-#: pcsx2/gui/Panels/CpuPanel.cpp:38
+#: pcsx2/gui/ConsoleLogger.cpp:415 pcsx2/gui/Panels/CpuPanel.cpp:38
msgid "Normal"
msgstr "正常"
@@ -645,7 +683,9 @@ msgid "Light theme"
msgstr "亮色主题"
#: pcsx2/gui/ConsoleLogger.cpp:424
-msgid "Classic black color scheme for people who enjoy having text seared into their optic nerves."
+msgid ""
+"Classic black color scheme for people who enjoy having text seared into "
+"their optic nerves."
msgstr "经典黑色主题。"
#: pcsx2/gui/ConsoleLogger.cpp:424
@@ -657,7 +697,8 @@ msgid "Always on Top"
msgstr "总在最上面"
#: pcsx2/gui/ConsoleLogger.cpp:428
-msgid "When checked the log window will be visible over other foreground windows."
+msgid ""
+"When checked the log window will be visible over other foreground windows."
msgstr "如选中,日志窗口将在其它窗口上面显示。"
#: pcsx2/gui/ConsoleLogger.cpp:430
@@ -676,8 +717,7 @@ msgstr "清除(&L)"
msgid "Clear the log window contents"
msgstr "清除日志窗口内容"
-#: pcsx2/gui/ConsoleLogger.cpp:433
-#: pcsx2/gui/Dialogs/SysConfigDialog.cpp:280
+#: pcsx2/gui/ConsoleLogger.cpp:433 pcsx2/gui/Dialogs/SysConfigDialog.cpp:280
msgid "Appearance"
msgstr "外观"
@@ -799,11 +839,15 @@ msgid "Do not show this dialog again."
msgstr "不再显示此对话框。"
#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:199
-msgid "Disables this popup and whatever response you select here will be automatically used from now on."
+msgid ""
+"Disables this popup and whatever response you select here will be "
+"automatically used from now on."
msgstr "禁用弹出提示,以后任何您选定的内容将被自动使用。"
#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:201
-msgid "The popup will not be shown again. This setting can be undone from the settings panels."
+msgid ""
+"The popup will not be shown again. This setting can be undone from the "
+"settings panels."
msgstr "此提示框将不会再被显示。此设定可以从设置面板中撤消。"
#: pcsx2/gui/Dialogs/ConfirmationDialogs.cpp:247
@@ -861,11 +905,15 @@ msgid "8 MB [most compatible]"
msgstr "8 MB [兼容性最高]"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:195
-msgid "This is the standard Sony-provisioned size, and is supported by all games and BIOS versions."
+msgid ""
+"This is the standard Sony-provisioned size, and is supported by all games "
+"and BIOS versions."
msgstr "索尼的标准大小,支持所有游戏和 BIOS 版本。"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:196
-msgid "Always use this option if you want the safest and surest memory card behavior."
+msgid ""
+"Always use this option if you want the safest and surest memory card "
+"behavior."
msgstr "如果您需要最安全的记忆卡行为,请使用此选项。"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:199
@@ -874,7 +922,8 @@ msgstr "16 MB"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:199
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:203
-msgid "A typical size for 3rd-party memory cards which should work with most games."
+msgid ""
+"A typical size for 3rd-party memory cards which should work with most games."
msgstr "一个通常的第三方记忆卡大小,应该可以兼容大多数游戏。"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:200
@@ -891,11 +940,15 @@ msgid "64 MB"
msgstr "64 MB"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:207
-msgid "Low compatibility warning: Yes it's very big, but may not work with many games."
+msgid ""
+"Low compatibility warning: Yes it's very big, but may not work with many "
+"games."
msgstr "兼容性低: 容量较大,但可能在很多游戏中不可用。"
#: pcsx2/gui/Dialogs/CreateMemoryCardDialog.cpp:208
-msgid "Use at your own risk. Erratic memory card behavior is possible (though unlikely)."
+msgid ""
+"Use at your own risk. Erratic memory card behavior is possible (though "
+"unlikely)."
msgstr "可能出现错误的记忆卡行为 (一般不会)。"
#: pcsx2/gui/Dialogs/FirstTimeWizard.cpp:47
@@ -1074,8 +1127,7 @@ msgstr "终止应用程序"
msgid "GS Output is Disabled!"
msgstr "GS 输出已禁用!"
-#: pcsx2/gui/GlobalCommands.cpp:387
-#: pcsx2/gui/MainFrame.cpp:414
+#: pcsx2/gui/GlobalCommands.cpp:387 pcsx2/gui/MainFrame.cpp:414
msgid "Save state"
msgstr "即时存档"
@@ -1083,8 +1135,7 @@ msgstr "即时存档"
msgid "Saves the virtual machine state to the current slot."
msgstr "将虚拟机的状态保存至当前存档位置。"
-#: pcsx2/gui/GlobalCommands.cpp:393
-#: pcsx2/gui/MainFrame.cpp:413
+#: pcsx2/gui/GlobalCommands.cpp:393 pcsx2/gui/MainFrame.cpp:413
msgid "Load state"
msgstr "即时读档"
@@ -1122,11 +1173,12 @@ msgstr "拖放错误"
#: pcsx2/gui/IsoDropTarget.cpp:58
#, c-format
-msgid "It is an error to drop multiple files onto a %s window. One at a time please, thank you."
+msgid ""
+"It is an error to drop multiple files onto a %s window. One at a time "
+"please, thank you."
msgstr "不可以将多个文件同时拖到到 %s 窗口上。一次只能拖动一个文件。"
-#: pcsx2/gui/IsoDropTarget.cpp:89
-#: pcsx2/gui/MainMenuClicks.cpp:342
+#: pcsx2/gui/IsoDropTarget.cpp:89 pcsx2/gui/MainMenuClicks.cpp:342
msgid "Confirm PS2 Reset"
msgstr "确认 PS2 重启"
@@ -1149,8 +1201,7 @@ msgstr "您已将以下 ISO 镜像拖放至 %s:"
msgid "Slot %d"
msgstr "位置 %d"
-#: pcsx2/gui/MainFrame.cpp:44
-#: pcsx2/gui/Saveslots.cpp:150
+#: pcsx2/gui/MainFrame.cpp:44 pcsx2/gui/Saveslots.cpp:150
msgid "Backup"
msgstr "备份"
@@ -1196,8 +1247,7 @@ msgstr "%s %d.%d.%d %s"
msgid "(modded)"
msgstr "(已修改)"
-#: pcsx2/gui/MainFrame.cpp:399
-#: pcsx2/gui/MainFrame.cpp:401
+#: pcsx2/gui/MainFrame.cpp:399 pcsx2/gui/MainFrame.cpp:401
#: pcsx2/gui/MainFrame.cpp:407
msgid "Initializing..."
msgstr "正在初始化..."
@@ -1291,8 +1341,7 @@ msgstr "记忆卡(&M)"
msgid "&Plugin/BIOS Selector"
msgstr "插件/BIOS 选择器(&P)"
-#: pcsx2/gui/MainFrame.cpp:460
-#: pcsx2/gui/Panels/GameDatabasePanel.cpp:346
+#: pcsx2/gui/MainFrame.cpp:460 pcsx2/gui/Panels/GameDatabasePanel.cpp:346
msgid "Game Database Editor"
msgstr "游戏数据库编辑器"
@@ -1413,8 +1462,7 @@ msgstr "启动 CDVD (快速模式)"
msgid "Use fast boot to skip PS2 startup and splash screens"
msgstr "使用快速启动模式来跳过 PS2 启动画面"
-#: pcsx2/gui/MainFrame.cpp:703
-#: pcsx2/gui/MainFrame.cpp:738
+#: pcsx2/gui/MainFrame.cpp:703 pcsx2/gui/MainFrame.cpp:738
msgid "No plugin loaded"
msgstr "未加载插件"
@@ -1423,7 +1471,9 @@ msgid "Core GS Settings..."
msgstr "核心 GS 设置..."
#: pcsx2/gui/MainFrame.cpp:709
-msgid "Modify hardware emulation settings regulated by the PCSX2 core virtual machine."
+msgid ""
+"Modify hardware emulation settings regulated by the PCSX2 core virtual "
+"machine."
msgstr "修改 PCSX2 核心虚拟机相关的硬件模拟设置。"
#: pcsx2/gui/MainFrame.cpp:711
@@ -1455,8 +1505,7 @@ msgstr "确认 ISO 镜像更改"
msgid "Do you want to swap discs or boot the new image (via system reset)?"
msgstr "是否要更换光盘或启动新光盘镜像 (通过系统复位)?"
-#: pcsx2/gui/MainMenuClicks.cpp:148
-#: pcsx2/gui/MainMenuClicks.cpp:194
+#: pcsx2/gui/MainMenuClicks.cpp:148 pcsx2/gui/MainMenuClicks.cpp:194
msgid "Swap Disc"
msgstr "更换光盘"
@@ -1488,8 +1537,7 @@ msgstr "光盘映像 (%s)"
msgid "Blockdumps (%s)"
msgstr "块转储 (%s)"
-#: pcsx2/gui/MainMenuClicks.cpp:270
-#: pcsx2/gui/MainMenuClicks.cpp:291
+#: pcsx2/gui/MainMenuClicks.cpp:270 pcsx2/gui/MainMenuClicks.cpp:291
msgid "All Files (*.*)"
msgstr "全部文件 (*.*)"
@@ -1510,7 +1558,9 @@ msgid "An error occurred while trying to open the file:"
msgstr "打开文件时出现一个错误:"
#: pcsx2/gui/MainMenuClicks.cpp:319
-msgid "Error: The configured ISO file does not exist. Click OK to select a new ISO source for CDVD."
+msgid ""
+"Error: The configured ISO file does not exist. Click OK to select a new ISO "
+"source for CDVD."
msgstr "错误: 配置的 ISO 文件不存在。单击确定为 CDVD 选择一个新的 ISO 源。"
#: pcsx2/gui/MainMenuClicks.cpp:390
@@ -1576,7 +1626,9 @@ msgid "Select folder with PS2 BIOS roms"
msgstr "选择 PS2 BIOS 文件所在文件夹"
#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:111
-msgid "Click the Browse button to select a different folder where PCSX2 will look for PS2 BIOS roms."
+msgid ""
+"Click the Browse button to select a different folder where PCSX2 will look "
+"for PS2 BIOS roms."
msgstr "单击浏览按钮可选择一个 PS2 BIOS 所在的不同文件夹。"
#: pcsx2/gui/Panels/BiosSelectorPanel.cpp:113
@@ -1621,8 +1673,7 @@ msgstr "无"
msgid "EE/FPU Advanced Recompiler Options"
msgstr "EE/FPU 高级重编译器选项"
-#: pcsx2/gui/Panels/CpuPanel.cpp:87
-#: pcsx2/gui/Panels/CpuPanel.cpp:102
+#: pcsx2/gui/Panels/CpuPanel.cpp:87 pcsx2/gui/Panels/CpuPanel.cpp:102
msgid "Extra + Preserve Sign"
msgstr "额外 + 保留符号"
@@ -1638,8 +1689,7 @@ msgstr "VU0 / VU1 高级重编译器选项"
msgid "Extra"
msgstr "额外"
-#: pcsx2/gui/Panels/CpuPanel.cpp:117
-#: pcsx2/gui/Panels/CpuPanel.cpp:126
+#: pcsx2/gui/Panels/CpuPanel.cpp:117 pcsx2/gui/Panels/CpuPanel.cpp:126
#: pcsx2/gui/Panels/CpuPanel.cpp:184
msgid "Interpreter"
msgstr "解释器"
@@ -1648,13 +1698,14 @@ msgstr "解释器"
msgid "Quite possibly the slowest thing in the universe."
msgstr "很有可能是宇宙中最慢的东西。"
-#: pcsx2/gui/Panels/CpuPanel.cpp:120
-#: pcsx2/gui/Panels/CpuPanel.cpp:129
+#: pcsx2/gui/Panels/CpuPanel.cpp:120 pcsx2/gui/Panels/CpuPanel.cpp:129
msgid "Recompiler"
msgstr "重编译器"
#: pcsx2/gui/Panels/CpuPanel.cpp:121
-msgid "Performs just-in-time binary translation of 64-bit MIPS-IV machine code to x86."
+msgid ""
+"Performs just-in-time binary translation of 64-bit MIPS-IV machine code to "
+"x86."
msgstr "进行从 64 位 MIPS-IV 机器代码到 x86 的即时代码翻译。"
#: pcsx2/gui/Panels/CpuPanel.cpp:127
@@ -1662,7 +1713,9 @@ msgid "Pretty slow; provided for diagnostic purposes only."
msgstr "很慢;仅供诊断用途。"
#: pcsx2/gui/Panels/CpuPanel.cpp:130
-msgid "Performs just-in-time binary translation of 32-bit MIPS-I machine code to x86."
+msgid ""
+"Performs just-in-time binary translation of 32-bit MIPS-I machine code to "
+"x86."
msgstr "进行从 32 位 MIPS-IV 机器代码到 x86 的即时代码翻译。"
#: pcsx2/gui/Panels/CpuPanel.cpp:154
@@ -1673,14 +1726,15 @@ msgstr "启用 EE 缓存 (较慢)"
msgid "Interpreter only; provided for diagnostic"
msgstr "很慢;仅供诊断用途。"
-#: pcsx2/gui/Panels/CpuPanel.cpp:170
-#: pcsx2/gui/Panels/CpuPanel.cpp:223
+#: pcsx2/gui/Panels/CpuPanel.cpp:170 pcsx2/gui/Panels/CpuPanel.cpp:223
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:110
msgid "Restore Defaults"
msgstr "恢复默认值"
#: pcsx2/gui/Panels/CpuPanel.cpp:185
-msgid "Vector Unit Interpreter. Slow and not very compatible. Only use for diagnostics."
+msgid ""
+"Vector Unit Interpreter. Slow and not very compatible. Only use for "
+"diagnostics."
msgstr "矢量单元解释器。速度慢且兼容性低。仅供诊断用途。"
#: pcsx2/gui/Panels/CpuPanel.cpp:187
@@ -1688,7 +1742,8 @@ msgid "microVU Recompiler"
msgstr "microVU 重编译器"
#: pcsx2/gui/Panels/CpuPanel.cpp:188
-msgid "New Vector Unit recompiler with much improved compatibility. Recommended."
+msgid ""
+"New Vector Unit recompiler with much improved compatibility. Recommended."
msgstr "新版矢量单元重编译器,兼容性有较大提升。推荐。"
#: pcsx2/gui/Panels/CpuPanel.cpp:190
@@ -1696,7 +1751,8 @@ msgid "superVU Recompiler [legacy]"
msgstr "superVU 重编译器 [旧式]"
#: pcsx2/gui/Panels/CpuPanel.cpp:191
-msgid "Useful for diagnosing bugs or clamping issues in the new mVU recompiler."
+msgid ""
+"Useful for diagnosing bugs or clamping issues in the new mVU recompiler."
msgstr "可用于诊断新的 mVU 重编译器的 bug 或限值问题。"
#: pcsx2/gui/Panels/DirPickerPanel.cpp:64
@@ -1777,7 +1833,9 @@ msgid "Zoom:"
msgstr "缩放:"
#: pcsx2/gui/Panels/GSWindowPanel.cpp:196
-msgid "Invalid window dimensions specified: Size cannot contain non-numeric digits! >_<"
+msgid ""
+"Invalid window dimensions specified: Size cannot contain non-numeric digits! "
+">_<"
msgstr "指定了非法的数值: 大小数值不能包含非数字内容! >_<"
#: pcsx2/gui/Panels/GameDatabasePanel.cpp:334
@@ -1834,7 +1892,8 @@ msgid "EE timing hack - Multi purpose hack. Try if all else fails."
msgstr "EE 定时 Hack - 有多种用途。如以上皆失败请尝试。"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:75
-msgid "Skip MPEG hack - Skips videos/FMVs in games to avoid game hanging/freezes."
+msgid ""
+"Skip MPEG hack - Skips videos/FMVs in games to avoid game hanging/freezes."
msgstr "跳过 MPEG hack - 跳过游戏中的 CG 以避免游戏挂起或失去响应。"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:79
@@ -1862,7 +1921,8 @@ msgid "Enable manual game fixes [Not recommended]"
msgstr "手动设置游戏特殊修正 [不推荐]"
#: pcsx2/gui/Panels/GameFixesPanel.cpp:127
-msgid "The safest way to make sure that all game fixes are completely disabled."
+msgid ""
+"The safest way to make sure that all game fixes are completely disabled."
msgstr "确保所有游戏特殊修正被禁用的最安全的方法。"
#: pcsx2/gui/Panels/LogOptionsPanels.cpp:249
@@ -1870,11 +1930,15 @@ msgid "Enable Trace Logging"
msgstr "启用跟踪日志"
#: pcsx2/gui/Panels/LogOptionsPanels.cpp:250
-msgid "Trace logs are all written to emulog.txt. Toggle trace logging at any time using F10."
+msgid ""
+"Trace logs are all written to emulog.txt. Toggle trace logging at any time "
+"using F10."
msgstr "跟踪记录将被写到 emuLog.txt 文件中。可随时用 F10 切换跟踪记录。"
#: pcsx2/gui/Panels/LogOptionsPanels.cpp:251
-msgid "Warning: Enabling trace logs is typically very slow, and is a leading cause of 'What happened to my FPS?' problems. :)"
+msgid ""
+"Warning: Enabling trace logs is typically very slow, and is a leading cause "
+"of 'What happened to my FPS?' problems. :)"
msgstr "警告: 启用跟踪记录通常非常慢,且可能导致 \"FPS 怎么回事\" 类问题。:)"
#: pcsx2/gui/Panels/MemoryCardListPanel.cpp:151
@@ -2112,7 +2176,9 @@ msgid "Custom folder:"
msgstr "自定义文件夹:"
#: pcsx2/gui/Panels/MiscPanelStuff.cpp:57
-msgid "This setting may require administration privileges from your operating system, depending on how your system is configured."
+msgid ""
+"This setting may require administration privileges from your operating "
+"system, depending on how your system is configured."
msgstr "此设置可能需要操作系统管理员权限,取决于您的操作系统的配置。"
#: pcsx2/gui/Panels/MiscPanelStuff.cpp:66
@@ -2211,11 +2277,14 @@ msgid "Enable speedhacks"
msgstr "启用速度 Hack"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:102
-msgid "A safe and easy way to make sure that all speedhacks are completely disabled."
+msgid ""
+"A safe and easy way to make sure that all speedhacks are completely disabled."
msgstr "确认全部速度 Hack 被禁用的一个安全简易的方法。"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:111
-msgid "Resets all speedhack options to their defaults, which consequently turns them all OFF."
+msgid ""
+"Resets all speedhack options to their defaults, which consequently turns "
+"them all OFF."
msgstr "将所有速度 Hack 选项重置到默认值,即关闭所有选项。"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:120
@@ -2235,50 +2304,48 @@ msgid "mVU Flag Hack"
msgstr "mVU 标志位 Hack"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:164
-msgid "Good Speedup and High Compatibility; may cause bad graphics... [Recommended]"
+msgid ""
+"Good Speedup and High Compatibility; may cause bad graphics... [Recommended]"
msgstr "提速效果较好,兼容性较高;可能导致图像错误等。[推荐]"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:166
-msgid "mVU Block Hack"
-msgstr "mVU 数据块 Hack"
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
-msgid "Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
-msgstr "提速效果较好,兼容性较高;可能导致图像错误等。"
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "MTVU (Multi-Threaded microVU1)"
msgstr "MTVU (多线程 microVU1)"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:170
-msgid "Good Speedup and High Compatibility; may cause hanging... [Recommended if 3+ cores]"
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
+msgid ""
+"Good Speedup and High Compatibility; may cause hanging... [Recommended if 3+ "
+"cores]"
msgstr "提速效果较好,兼容性较高;可能导致模拟器没有响应等。[三核以上用户推荐]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:183
msgid "Other Hacks"
msgstr "其它 Hack"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:193
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:185
msgid "Enable INTC Spin Detection"
msgstr "启用 INTC Spin 检测"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:194
-msgid "Huge speedup for some games, with almost no compatibility side effects. [Recommended]"
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:186
+msgid ""
+"Huge speedup for some games, with almost no compatibility side effects. "
+"[Recommended]"
msgstr "对部分游戏有显著提速,基本无副作用。[推荐]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:196
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:188
msgid "Enable Wait Loop Detection"
msgstr "启用等待循环检测"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:197
-msgid "Moderate speedup for some games, with no known side effects. [Recommended]"
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:189
+msgid ""
+"Moderate speedup for some games, with no known side effects. [Recommended]"
msgstr "对部分游戏有中等提速,无已知副作用。[推荐]"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:199
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
msgid "Enable fast CDVD"
msgstr "启用快速 CDVD"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:192
msgid "Fast disc access, less loading times. [Not Recommended]"
msgstr "加速光盘访问,缩短加载时间。[不推荐]"
@@ -2291,7 +2358,9 @@ msgid "Select folder containing PCSX2 visual themes"
msgstr "选择存放 PCSX2 视觉主题的文件夹"
#: pcsx2/gui/Panels/ThemeSelectorPanel.cpp:45
-msgid "Click the Browse button to select a different folder containing PCSX2 visual themes."
+msgid ""
+"Click the Browse button to select a different folder containing PCSX2 visual "
+"themes."
msgstr "单击浏览按钮来选择一个不同的 PCSX2 视觉主题文件夹。"
#: pcsx2/gui/Panels/ThemeSelectorPanel.cpp:49
@@ -2303,7 +2372,8 @@ msgid "Disable Framelimiting"
msgstr "禁用限帧"
#: pcsx2/gui/Panels/VideoPanel.cpp:35
-msgid "Useful for running benchmarks. Toggle this option in-game by pressing F4."
+msgid ""
+"Useful for running benchmarks. Toggle this option in-game by pressing F4."
msgstr "在进行评测时有用。游戏中可按 F4 开关此选项。"
#: pcsx2/gui/Panels/VideoPanel.cpp:61
@@ -2322,8 +2392,7 @@ msgstr "快速模式速率调整:"
msgid "NTSC Framerate:"
msgstr "NTSC 帧率:"
-#: pcsx2/gui/Panels/VideoPanel.cpp:91
-#: pcsx2/gui/Panels/VideoPanel.cpp:97
+#: pcsx2/gui/Panels/VideoPanel.cpp:91 pcsx2/gui/Panels/VideoPanel.cpp:97
msgid "FPS"
msgstr "FPS"
@@ -2331,93 +2400,117 @@ msgstr "FPS"
msgid "PAL Framerate:"
msgstr "PAL 帧率:"
-#: pcsx2/gui/Panels/VideoPanel.cpp:162
-msgid "Error while parsing either NTSC or PAL framerate settings. Settings must be valid floating point numerics."
+#: pcsx2/gui/Panels/VideoPanel.cpp:166
+msgid ""
+"Error while parsing either NTSC or PAL framerate settings. Settings must be "
+"valid floating point numerics."
msgstr "解析 NTSC 或 PAL 帧率时出错。设定值必须是一个合法的浮点数值。"
-#: pcsx2/gui/Panels/VideoPanel.cpp:180
+#: pcsx2/gui/Panels/VideoPanel.cpp:184
msgid "Disabled [default]"
msgstr "禁用 [默认]"
-#: pcsx2/gui/Panels/VideoPanel.cpp:184
+#: pcsx2/gui/Panels/VideoPanel.cpp:188
msgid "Skip when on Turbo only (TAB to enable)"
msgstr "仅在快速模式中跳帧 (按 TAB 键启用)"
-#: pcsx2/gui/Panels/VideoPanel.cpp:188
+#: pcsx2/gui/Panels/VideoPanel.cpp:192
msgid "Constant skipping"
msgstr "常数跳帧"
-#: pcsx2/gui/Panels/VideoPanel.cpp:190
-msgid "Normal and Turbo limit rates skip frames. Slow motion mode will still disable frameskipping."
+#: pcsx2/gui/Panels/VideoPanel.cpp:194
+msgid ""
+"Normal and Turbo limit rates skip frames. Slow motion mode will still "
+"disable frameskipping."
msgstr "正常及加速模式帧率跳帧。慢动作模式仍将禁用跳帧。"
-#: pcsx2/gui/Panels/VideoPanel.cpp:213
+#: pcsx2/gui/Panels/VideoPanel.cpp:217
msgid "Frames to Draw"
msgstr "绘制帧数"
-#: pcsx2/gui/Panels/VideoPanel.cpp:218
+#: pcsx2/gui/Panels/VideoPanel.cpp:222
msgid "Frames to Skip"
msgstr "跳过帧数"
-#: pcsx2/gui/Panels/VideoPanel.cpp:294
+#: pcsx2/gui/Panels/VideoPanel.cpp:298
msgid "Use Synchronized MTGS"
msgstr "使用同步 MTGS"
-#: pcsx2/gui/Panels/VideoPanel.cpp:295
-msgid "For troubleshooting potential bugs in the MTGS only, as it is potentially very slow."
+#: pcsx2/gui/Panels/VideoPanel.cpp:299
+msgid ""
+"For troubleshooting potential bugs in the MTGS only, as it is potentially "
+"very slow."
msgstr "仅供诊断 MTGS 中可能的错误,可能会非常慢。"
-#: pcsx2/gui/Panels/VideoPanel.cpp:298
+#: pcsx2/gui/Panels/VideoPanel.cpp:302
msgid "Disable all GS output"
msgstr "禁用所有 GS 输出"
-#: pcsx2/gui/Panels/VideoPanel.cpp:299
-msgid "Completely disables all GS plugin activity; ideal for benchmarking EEcore components."
+#: pcsx2/gui/Panels/VideoPanel.cpp:303
+msgid ""
+"Completely disables all GS plugin activity; ideal for benchmarking EEcore "
+"components."
msgstr "彻底禁用所有的 GS 插件活动;可用于评测 EE 内核组件性能。"
-#: pcsx2/gui/Panels/VideoPanel.cpp:316
+#: pcsx2/gui/Panels/VideoPanel.cpp:320
msgid "Frame Skipping"
msgstr "跳帧"
-#: pcsx2/gui/Panels/VideoPanel.cpp:319
+#: pcsx2/gui/Panels/VideoPanel.cpp:323
msgid "Framelimiter"
msgstr "限帧"
#: pcsx2/gui/SysState.cpp:283
-msgid "Cannot load this savestate. The state is from an incompatible edition of PCSX2 that is either newer than this version, or is no longer supported."
-msgstr "无法读取即时存档。即时存档是由一个不兼容的 PCSX2 版本 (或新或旧) 创建的,或已经不再支持。"
+msgid ""
+"Cannot load this savestate. The state is from an incompatible edition of "
+"PCSX2 that is either newer than this version, or is no longer supported."
+msgstr ""
+"无法读取即时存档。即时存档是由一个不兼容的 PCSX2 版本 (或新或旧) 创建的,或已"
+"经不再支持。"
#: pcsx2/gui/SysState.cpp:290
-msgid "Cannot load this savestate. The state is an unsupported version, likely created by a newer edition of PCSX2."
-msgstr "无法读取即时存档。即时存档是一个不支持的版本。可能是由一个较新版本的 PCSX2 创建。"
+msgid ""
+"Cannot load this savestate. The state is an unsupported version, likely "
+"created by a newer edition of PCSX2."
+msgstr ""
+"无法读取即时存档。即时存档是一个不支持的版本。可能是由一个较新版本的 PCSX2 创"
+"建。"
#: pcsx2/gui/SysState.cpp:326
msgid "There is no active virtual machine state to download or save."
msgstr "没有活动的虚拟机状态可供下载或保存。"
#: pcsx2/gui/SysState.cpp:520
-msgid "This savestate cannot be loaded because it is not a valid gzip archive. It may have been created by an older unsupported version of PCSX2, or it may be corrupted."
-msgstr "此即时存档无法加载。它不是一个合法的 gzip 归档。它可能是由一个旧的不受支持的 PCSX2 版本创建的,或可能已损坏。"
+msgid ""
+"This savestate cannot be loaded because it is not a valid gzip archive. It "
+"may have been created by an older unsupported version of PCSX2, or it may be "
+"corrupted."
+msgstr ""
+"此即时存档无法加载。它不是一个合法的 gzip 归档。它可能是由一个旧的不受支持的 "
+"PCSX2 版本创建的,或可能已损坏。"
#: pcsx2/gui/SysState.cpp:579
msgid "This file is not a valid PCSX2 savestate. See the logfile for details."
msgstr "这不是一个合法的 PCSX2 即时存档。请查看日志文件以获取详细信息。"
#: pcsx2/gui/SysState.cpp:598
-msgid "This savestate cannot be loaded due to missing critical components. See the log file for details."
+msgid ""
+"This savestate cannot be loaded due to missing critical components. See the "
+"log file for details."
msgstr "此即时存档无法加载。关键组件缺失。请参看日志文件以获取详细信息。"
#: pcsx2/gui/i18n.cpp:63
msgid " (default)"
msgstr " (默认)"
-#: pcsx2/ps2/BiosTools.cpp:83
-#: pcsx2/ps2/BiosTools.cpp:151
+#: pcsx2/ps2/BiosTools.cpp:83 pcsx2/ps2/BiosTools.cpp:151
msgid "The selected BIOS file is not a valid PS2 BIOS. Please re-configure."
msgstr "选择的 BIOS 文件不是一个合法的 PS2 BIOS。请重新配置。"
#: pcsx2/ps2/BiosTools.cpp:244
-msgid "The PS2 BIOS could not be loaded. The BIOS has not been configured, or the configuration has been corrupted. Please re-configure."
+msgid ""
+"The PS2 BIOS could not be loaded. The BIOS has not been configured, or the "
+"configuration has been corrupted. Please re-configure."
msgstr "PS2 BIOS 不可加载。BIOS 未被配置,或配置已被破坏。请重新配置。"
#: pcsx2/ps2/BiosTools.cpp:251
@@ -2426,14 +2519,27 @@ msgstr "配置的 BIOS 文件不存在。请重新配置。"
#: pcsx2/x86/ix86-32/iR5900-32.cpp:578
#, c-format
-msgid "%s Extensions not found. The R5900-32 recompiler requires a host CPU with MMX, SSE, and SSE2 extensions."
-msgstr "%s 扩展未找到。R5900-32 重编译器需要一个带有 MMX, SSE 及 SSE2 扩展的主机 CPU。"
+msgid ""
+"%s Extensions not found. The R5900-32 recompiler requires a host CPU with "
+"MMX, SSE, and SSE2 extensions."
+msgstr ""
+"%s 扩展未找到。R5900-32 重编译器需要一个带有 MMX, SSE 及 SSE2 扩展的主机 "
+"CPU。"
#: pcsx2/x86/microVU.cpp:28
#, c-format
-msgid "%s Extensions not found. microVU requires a host CPU with MMX, SSE, and SSE2 extensions."
+msgid ""
+"%s Extensions not found. microVU requires a host CPU with MMX, SSE, and "
+"SSE2 extensions."
msgstr "%s 扩展未找到。microVU 需要一个带有 MMX, SSE 及 SSE2 扩展的主机 CPU。"
+#~ msgid "mVU Block Hack"
+#~ msgstr "mVU 数据块 Hack"
+
+#~ msgid ""
+#~ "Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
+#~ msgstr "提速效果较好,兼容性较高;可能导致图像错误等。"
+
#~ msgid "Enable game fixes"
#~ msgstr "启用游戏特殊修正"
diff --git a/locales/zh_TW/pcsx2_Iconized.po b/locales/zh_TW/pcsx2_Iconized.po
index a6ba50100..43bf661ea 100644
--- a/locales/zh_TW/pcsx2_Iconized.po
+++ b/locales/zh_TW/pcsx2_Iconized.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.9\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-09-28 20:27+0200\n"
+"POT-Creation-Date: 2012-04-07 11:42+0200\n"
"PO-Revision-Date: 2011-09-09 11:52+0800\n"
"Last-Translator: 呆丸北拜\n"
"Language-Team: pcsx2fan\n"
@@ -24,7 +24,7 @@ msgstr ""
"可用的虛擬記憶體不足,\n"
"或必備的虛擬記憶體映射已經被其他處理程序、服務,或 DLL 保留。"
-#: pcsx2/CDVD/CDVD.cpp:385
+#: pcsx2/CDVD/CDVD.cpp:389
msgid "!Notice:PsxDisc"
msgstr ""
"PCSX2 不支援 Playstation 遊戲光碟。\n"
@@ -435,33 +435,27 @@ msgstr ""
"滑桿控制著 VU 從 EE 偷竊的週期的數目。\n"
"數值愈高,遊戲執行的每一個 VU 微程式從 EE 偷的就愈多。"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:172
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "!ContextTip:Speedhacks:vuFlagHack"
msgstr ""
"僅對讀取狀態旗標的塊,更新狀態旗標,取代一直更新狀態旗標。\n"
"大部分時間是安全的,Super VU 預設做類似的事情。"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:177
-msgid "!ContextTip:Speedhacks:vuBlockHack"
-msgstr ""
-"假定遙遠未來的塊不需要舊的旗標實例資料。\n"
-"非常安全。不曉得會不會令遊戲不正常..."
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:182
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:174
msgid "!ContextTip:Speedhacks:vuThread"
msgstr ""
"microVU1 獨佔一個執行緒。對於 3 核或更多核的 CPU,通常會提升遊戲速度。\n"
"對於大多數遊戲是安全的。但是少數遊戲不相容可能會遊戲停止回應。\n"
"對顯示卡要求高的遊戲,可能會降低遊戲速度(尤其在雙核心 CPU 上)。"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:203
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:195
msgid "!ContextTip:Speedhacks:INTC"
msgstr ""
"對於使用 INTC 狀態暫存器等待垂直同步的遊戲,表現最好。\n"
"主要包括 RPG 遊戲非 3D 的標題。\n"
"不使用此垂直同步方式的遊戲,將會有少量或沒有速度提升。"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:208
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
msgid "!ContextTip:Speedhacks:BIFC0"
msgstr ""
"主要把核心內位址 0x81FC0 的 EE 空閒循環作為目標。\n"
@@ -470,7 +464,7 @@ msgstr ""
"這樣的循環重複一次之後,取決於哪個先到:\n"
"我們前進到下次事件或處理器時間片段的結束。"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:215
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:207
msgid "!ContextTip:Speedhacks:fastCDVD"
msgstr ""
"查閱 HDLoader 相容性列表,以確定已知使用這個選項會出現問題的遊戲。\n"
@@ -480,20 +474,20 @@ msgstr ""
msgid "!ContextTip:Framelimiter:Disable"
msgstr "注意:當畫框限制停用時,渦輪加速和慢動作無法使用。"
-#: pcsx2/gui/Panels/VideoPanel.cpp:223
+#: pcsx2/gui/Panels/VideoPanel.cpp:227
msgid "!Panel:Frameskip:Heading"
msgstr ""
"注意:\n"
"由於 PS2 的硬體設計,精確的跳框是不可能的。\n"
"啟用跳框將導致一些遊戲出現嚴重的圖形錯誤。"
-#: pcsx2/gui/Panels/VideoPanel.cpp:302
+#: pcsx2/gui/Panels/VideoPanel.cpp:306
msgid "!ContextTip:GS:SyncMTGS"
msgstr ""
"啟用這個選項,若您認為多執行緒圖形模式執行緒的同步正在導致模擬器當掉或圖形錯"
"誤。"
-#: pcsx2/gui/Panels/VideoPanel.cpp:306
+#: pcsx2/gui/Panels/VideoPanel.cpp:310
msgid "!ContextTip:GS:DisableOutput"
msgstr ""
"移除任何由多執行緒圖形模式的執行緒過載或 GPU 過載引起的效能測試產生的噪音。\n"
@@ -518,6 +512,11 @@ msgstr ""
"這不是嚴重的錯誤,因為 SuperVU 是過時的。無論如何,您應該使用 microVU 代"
"替。:)"
+#~ msgid "!ContextTip:Speedhacks:vuBlockHack"
+#~ msgstr ""
+#~ "假定遙遠未來的塊不需要舊的旗標實例資料。\n"
+#~ "非常安全。不曉得會不會令遊戲不正常..."
+
#~ msgid "!ContextTip:Window:FullscreenExclusive"
#~ msgstr ""
#~ "可能在 CRT 螢幕上,畫面看起來更好;可能在老舊的顯示卡中,速度稍微快一"
diff --git a/locales/zh_TW/pcsx2_Main.po b/locales/zh_TW/pcsx2_Main.po
index 7283805c4..1adc50a1d 100644
--- a/locales/zh_TW/pcsx2_Main.po
+++ b/locales/zh_TW/pcsx2_Main.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PCSX2 0.9.9\n"
"Report-Msgid-Bugs-To: http://code.google.com/p/pcsx2/\n"
-"POT-Creation-Date: 2011-09-28 20:27+0200\n"
+"POT-Creation-Date: 2012-02-28 12:20+0100\n"
"PO-Revision-Date: 2011-09-08 19:40+0800\n"
"Last-Translator: 呆丸北拜\n"
"Language-Team: pcsx2fan\n"
@@ -175,7 +175,7 @@ msgstr "初始化內部記憶卡插件失敗。"
msgid "Unloaded Plugin"
msgstr "未載入的插件"
-#: pcsx2/SaveState.cpp:339
+#: pcsx2/SaveState.cpp:342
msgid "Cannot load savestate. It is of an unknown or unsupported version."
msgstr "無法讀取即時存檔,檔案版本未知或不支援。"
@@ -326,31 +326,31 @@ msgid ""
"successfully but could not be moved to its final resting place."
msgstr "即時存檔未能正確地儲存。成功建立暫存檔,但是無法將其移至目的地。"
-#: pcsx2/gui/AppConfig.cpp:837
+#: pcsx2/gui/AppConfig.cpp:842
msgid "Safest"
msgstr "最安全"
-#: pcsx2/gui/AppConfig.cpp:838
+#: pcsx2/gui/AppConfig.cpp:843
msgid "Safe (faster)"
msgstr "安全(速度更快)"
-#: pcsx2/gui/AppConfig.cpp:839
+#: pcsx2/gui/AppConfig.cpp:844
msgid "Balanced"
msgstr "平衡"
-#: pcsx2/gui/AppConfig.cpp:840
+#: pcsx2/gui/AppConfig.cpp:845
msgid "Aggressive"
msgstr "激進"
-#: pcsx2/gui/AppConfig.cpp:841
+#: pcsx2/gui/AppConfig.cpp:846
msgid "Aggressive plus"
msgstr "更加激進"
-#: pcsx2/gui/AppConfig.cpp:842
+#: pcsx2/gui/AppConfig.cpp:847
msgid "Mostly Harmful"
msgstr "基本上有害"
-#: pcsx2/gui/AppConfig.cpp:999 pcsx2/gui/AppConfig.cpp:1005
+#: pcsx2/gui/AppConfig.cpp:1007 pcsx2/gui/AppConfig.cpp:1013
msgid "Failed to overwrite existing settings file; permission was denied."
msgstr "覆寫現存的設定檔失敗;沒有權限。"
@@ -2327,21 +2327,10 @@ msgstr ""
"【推薦】"
#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:166
-msgid "mVU Block Hack"
-msgstr "mVU Block Hack"
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
-msgid ""
-"Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
-msgstr ""
-"不錯的速度提升而且相容性高;可能導致\n"
-"圖像變得糟糕、有尖刺的多邊形,等等..."
-
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:169
msgid "MTVU (Multi-Threaded microVU1)"
msgstr "MTVU(多執行緒 microVU1)"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:170
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:167
msgid ""
"Good Speedup and High Compatibility; may cause hanging... [Recommended if 3+ "
"cores]"
@@ -2350,15 +2339,15 @@ msgstr ""
"遊戲停止回應...\n"
"【推薦 3 核或更多核的 CPU 使用】"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:183
msgid "Other Hacks"
msgstr "其他駭客"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:193
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:185
msgid "Enable INTC Spin Detection"
msgstr "Enable INTC Spin Detection"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:194
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:186
msgid ""
"Huge speedup for some games, with almost no compatibility side effects. "
"[Recommended]"
@@ -2366,22 +2355,22 @@ msgstr ""
"對於一些遊戲有巨大的速度提升,\n"
"幾乎沒有相容性副作用【推薦】"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:196
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:188
msgid "Enable Wait Loop Detection"
msgstr "Enable Wait Loop Detection"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:197
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:189
msgid ""
"Moderate speedup for some games, with no known side effects. [Recommended]"
msgstr ""
"對於一些遊戲有適度的速度提升,\n"
"沒有已知的副作用【推薦】"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:199
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:191
msgid "Enable fast CDVD"
msgstr "Enable fast CDVD"
-#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:200
+#: pcsx2/gui/Panels/SpeedhacksPanel.cpp:192
msgid "Fast disc access, less loading times. [Not Recommended]"
msgstr "快速讀取光碟,減少載入時間【不推薦】"
@@ -2438,7 +2427,7 @@ msgstr "FPS"
msgid "PAL Framerate:"
msgstr "PAL 遊戲的畫框速率:"
-#: pcsx2/gui/Panels/VideoPanel.cpp:162
+#: pcsx2/gui/Panels/VideoPanel.cpp:166
msgid ""
"Error while parsing either NTSC or PAL framerate settings. Settings must be "
"valid floating point numerics."
@@ -2446,19 +2435,19 @@ msgstr ""
"當解析 NTSC 遊戲或 PAL 遊戲的畫框速率設定時出現錯誤。設定值必須是有效的浮點"
"數。"
-#: pcsx2/gui/Panels/VideoPanel.cpp:180
+#: pcsx2/gui/Panels/VideoPanel.cpp:184
msgid "Disabled [default]"
msgstr "停用【預設】"
-#: pcsx2/gui/Panels/VideoPanel.cpp:184
+#: pcsx2/gui/Panels/VideoPanel.cpp:188
msgid "Skip when on Turbo only (TAB to enable)"
msgstr "僅在渦輪加速時跳框(按 TAB 啟動)"
-#: pcsx2/gui/Panels/VideoPanel.cpp:188
+#: pcsx2/gui/Panels/VideoPanel.cpp:192
msgid "Constant skipping"
msgstr "恆定的跳框"
-#: pcsx2/gui/Panels/VideoPanel.cpp:190
+#: pcsx2/gui/Panels/VideoPanel.cpp:194
msgid ""
"Normal and Turbo limit rates skip frames. Slow motion mode will still "
"disable frameskipping."
@@ -2466,19 +2455,19 @@ msgstr ""
"普通模式和渦輪加速模式有限制速度,能夠跳框\n"
"慢動作模式依然會停用跳框"
-#: pcsx2/gui/Panels/VideoPanel.cpp:213
+#: pcsx2/gui/Panels/VideoPanel.cpp:217
msgid "Frames to Draw"
msgstr "繪製的畫框"
-#: pcsx2/gui/Panels/VideoPanel.cpp:218
+#: pcsx2/gui/Panels/VideoPanel.cpp:222
msgid "Frames to Skip"
msgstr "跳過的畫框"
-#: pcsx2/gui/Panels/VideoPanel.cpp:294
+#: pcsx2/gui/Panels/VideoPanel.cpp:298
msgid "Use Synchronized MTGS"
msgstr "使用同步的多執行緒圖形模式"
-#: pcsx2/gui/Panels/VideoPanel.cpp:295
+#: pcsx2/gui/Panels/VideoPanel.cpp:299
msgid ""
"For troubleshooting potential bugs in the MTGS only, as it is potentially "
"very slow."
@@ -2486,11 +2475,11 @@ msgstr ""
"僅用於排除多執行緒圖形模式潛在的程式錯誤,\n"
"因為速度可能非常慢"
-#: pcsx2/gui/Panels/VideoPanel.cpp:298
+#: pcsx2/gui/Panels/VideoPanel.cpp:302
msgid "Disable all GS output"
msgstr "停止輸出遊戲畫面"
-#: pcsx2/gui/Panels/VideoPanel.cpp:299
+#: pcsx2/gui/Panels/VideoPanel.cpp:303
msgid ""
"Completely disables all GS plugin activity; ideal for benchmarking EEcore "
"components."
@@ -2498,11 +2487,11 @@ msgstr ""
"完全停止圖形插件所有的活動;\n"
"適合用來做 EEcore 的效能測試"
-#: pcsx2/gui/Panels/VideoPanel.cpp:316
+#: pcsx2/gui/Panels/VideoPanel.cpp:320
msgid "Frame Skipping"
msgstr "跳框"
-#: pcsx2/gui/Panels/VideoPanel.cpp:319
+#: pcsx2/gui/Panels/VideoPanel.cpp:323
msgid "Framelimiter"
msgstr "畫框限制"
@@ -2576,6 +2565,15 @@ msgid ""
"SSE2 extensions."
msgstr "%s 指令集未找到。microVU 要求 CPU 支援 MMX、SSE、SSE2。"
+#~ msgid "mVU Block Hack"
+#~ msgstr "mVU Block Hack"
+
+#~ msgid ""
+#~ "Good Speedup and High Compatibility; may cause bad graphics, SPS, etc..."
+#~ msgstr ""
+#~ "不錯的速度提升而且相容性高;可能導致\n"
+#~ "圖像變得糟糕、有尖刺的多邊形,等等..."
+
#~ msgid ""
#~ "Good Speedup and High Compatibility; may cause garbage graphics, SPS, "
#~ "etc... [Recommended]"
diff --git a/pcsx2-codeblocks.workspace b/pcsx2-codeblocks.workspace
index c5d3652b6..939001417 100644
--- a/pcsx2-codeblocks.workspace
+++ b/pcsx2-codeblocks.workspace
@@ -27,7 +27,7 @@
-
+
diff --git a/pcsx2/3rdparty b/pcsx2/3rdparty
deleted file mode 120000
index 2781723b7..000000000
--- a/pcsx2/3rdparty
+++ /dev/null
@@ -1 +0,0 @@
-../3rdparty/
\ No newline at end of file
diff --git a/pcsx2/CDVD/CDVD.cpp b/pcsx2/CDVD/CDVD.cpp
index 90931da71..be4bf99b9 100644
--- a/pcsx2/CDVD/CDVD.cpp
+++ b/pcsx2/CDVD/CDVD.cpp
@@ -70,7 +70,6 @@ static void cdvdSetIrq( uint id = (1<> 8) & 1))
+#define CP2COND (vif1Regs.stat.VEW)
-#define CP2COND (((VU0.VI[REG_VPU_STAT].US[0] >> 8) & 1))
-
+//Run the FINISH either side of the VCALL's as we have no control over it past here.
void VCALLMS() {
vu0Finish();
vu0ExecMicro(((cpuRegs.code >> 6) & 0x7FFF) * 8);
+ vif0Regs.stat.VEW = false;
}
void VCALLMSR() {
vu0Finish();
vu0ExecMicro(VU0.VI[REG_CMSAR0].US[0] * 8);
+ vif0Regs.stat.VEW = false;
}
void BC2F()
diff --git a/pcsx2/Config.h b/pcsx2/Config.h
index f129d5148..b46ce04f2 100644
--- a/pcsx2/Config.h
+++ b/pcsx2/Config.h
@@ -381,7 +381,6 @@ struct Pcsx2Config
IntcStat :1, // tells Pcsx2 to fast-forward through intc_stat waits.
WaitLoop :1, // enables constant loop detection and fast-forwarding
vuFlagHack :1, // microVU specific flag hack
- vuBlockHack :1, // microVU specific block flag no-propagation hack
vuThread :1; // Enable Threaded VU1
BITFIELD_END
diff --git a/pcsx2/Counters.cpp b/pcsx2/Counters.cpp
index 623f99d36..0a908567a 100644
--- a/pcsx2/Counters.cpp
+++ b/pcsx2/Counters.cpp
@@ -209,6 +209,12 @@ static void vSyncInfoCalc( vSyncTimingInfo* info, Fixed100 framesPerSecond, u32
u64 Scanline = Frame / scansPerFrame;
u64 hBlank = Scanline / 2;
u64 hRender = Scanline - hBlank;
+
+ if ( gsRegionMode == Region_NTSC_PROGRESSIVE )
+ {
+ hBlank /= 2;
+ hRender /= 2;
+ }
info->Framerate = framesPerSecond;
info->Render = (u32)(Render/10000);
@@ -226,12 +232,14 @@ static void vSyncInfoCalc( vSyncTimingInfo* info, Fixed100 framesPerSecond, u32
else if( ( hBlank - info->hBlank ) >= 5000 ) info->hBlank++;
// Calculate accumulative hSync rounding error per half-frame:
+ if ( gsRegionMode != Region_NTSC_PROGRESSIVE ) // gets off the chart in that mode
{
- u32 hSyncCycles = ((info->hRender + info->hBlank) * scansPerFrame) / 2;
- u32 vSyncCycles = (info->Render + info->Blank);
- info->hSyncError = vSyncCycles - hSyncCycles;
+ u32 hSyncCycles = ((info->hRender + info->hBlank) * scansPerFrame) / 2;
+ u32 vSyncCycles = (info->Render + info->Blank);
+ info->hSyncError = vSyncCycles - hSyncCycles;
+ //Console.Warning("%d",info->hSyncError);
}
-
+ else info->hSyncError = 0;
// Note: In NTSC modes there is some small rounding error in the vsync too,
// however it would take thousands of frames for it to amount to anything and
// is thus not worth the effort at this time.
@@ -256,17 +264,25 @@ u32 UpdateVSyncRate()
framerate = EmuConfig.GS.FrameratePAL / 2;
scanlines = SCANLINES_TOTAL_PAL;
}
- else
+ else if ( gsRegionMode == Region_NTSC )
{
isCustom = (EmuConfig.GS.FramerateNTSC != 59.94);
framerate = EmuConfig.GS.FramerateNTSC / 2;
scanlines = SCANLINES_TOTAL_NTSC;
}
+ else if ( gsRegionMode == Region_NTSC_PROGRESSIVE )
+ {
+ isCustom = (EmuConfig.GS.FramerateNTSC != 59.94);
+ framerate = 30; // Cheating here to avoid a complex change to the below "vSyncInfo.Framerate != framerate" branch
+ scanlines = SCANLINES_TOTAL_NTSC;
+ }
if( vSyncInfo.Framerate != framerate )
{
vSyncInfoCalc( &vSyncInfo, framerate, scanlines );
- Console.WriteLn( Color_Green, "(UpdateVSyncRate) Mode Changed to %s.", ( gsRegionMode == Region_PAL ) ? "PAL" : "NTSC" );
+ Console.WriteLn( Color_Green, "(UpdateVSyncRate) Mode Changed to %s.", ( gsRegionMode == Region_PAL ) ? "PAL" :
+ ( gsRegionMode == Region_NTSC ) ? "NTSC" : "Progressive Scan" );
+
if( isCustom )
Console.Indent().WriteLn( Color_StrongGreen, "... with user configured refresh rate: %.02f Hz", framerate.ToFloat() );
}
@@ -406,6 +422,8 @@ static __fi void VSyncEnd(u32 sCycle)
if (gates) rcntEndGate(true, sCycle); // Counters End Gate Code
frameLimit(); // limit FPS
+ //Do this here, breaks Dynasty Warriors otherwise.
+ CSRreg.SwapField();
// This doesn't seem to be needed here. Games only seem to break with regard to the
// vsyncstart irq.
//cpuRegs.eCycle[30] = 2;
diff --git a/pcsx2/GS.cpp b/pcsx2/GS.cpp
index b00e8b65f..b5dc488ea 100644
--- a/pcsx2/GS.cpp
+++ b/pcsx2/GS.cpp
@@ -79,7 +79,7 @@ static __fi void gsCSRwrite( const tGS_CSR& csr )
SIGNAL_IMR_Pending = false;
#else
GUNIT_WARN("GUNIT_WARN: csr.RESET");
- Console.Warning( "csr.RESET" );
+ //Console.Warning( "csr.RESET" );
//gifUnit.Reset(true); // Don't think gif should be reset...
gifUnit.gsSIGNAL.queued = false;
GetMTGS().SendSimplePacket(GS_RINGTYPE_RESET, 0, 0, 0);
@@ -173,7 +173,8 @@ static __fi void _gsSMODEwrite( u32 mem, u32 value )
switch (mem)
{
case GS_SMODE1:
- gsSetRegionMode( ((value & 0x6000) == 0x6000) ? Region_PAL : Region_NTSC );
+ // ToDo: There's other flags determining which mode to set. The only tested one so far is the PAL / NTSC one.
+ gsSetRegionMode( ((value & 0x6000) == 0x6000) ? Region_PAL : (value & 0x400000) ? Region_NTSC_PROGRESSIVE : Region_NTSC );
break;
case GS_SMODE2:
@@ -425,7 +426,8 @@ __fi void gsFrameSkip()
//We got away with it before i think due to our awful GS timing, but now we have it right (ish)
void gsPostVsyncStart()
{
- CSRreg.SwapField();
+ //gifUnit.FlushToMTGS(); // Needed for some (broken?) homebrew game loaders
+
GetMTGS().PostVsyncStart();
}
diff --git a/pcsx2/GS.h b/pcsx2/GS.h
index a9631824b..05943c921 100644
--- a/pcsx2/GS.h
+++ b/pcsx2/GS.h
@@ -220,7 +220,8 @@ struct GSRegSIGBLID
enum GS_RegionMode
{
Region_NTSC,
- Region_PAL
+ Region_PAL,
+ Region_NTSC_PROGRESSIVE
};
extern GS_RegionMode gsRegionMode;
diff --git a/pcsx2/Gif_Unit.h b/pcsx2/Gif_Unit.h
index 33cbc1b56..4e4dc1047 100644
--- a/pcsx2/Gif_Unit.h
+++ b/pcsx2/Gif_Unit.h
@@ -429,7 +429,7 @@ struct Gif_Unit {
Gif_Tag gifTag(&pMem[offset & memMask]);
incTag(offset, curSize, 16 + gifTag.len); // Tag + Data length
if (pathIdx == GIF_PATH_1 && curSize >= 0x4000) {
- Console.Warning("Gif Unit - GS packet size exceeded VU memory size!");
+ DevCon.Warning("Gif Unit - GS packet size exceeded VU memory size!");
return 0; // Bios does this... (Fixed if you delay vu1's xgkick by 103 vu cycles)
}
if (curSize >= size) return size;
@@ -583,7 +583,8 @@ struct Gif_Unit {
bool CanDoP3Slice() { return stat.IMT == 1 && gifPath[GIF_PATH_3].state == GIF_PATH_IMAGE; }
bool CanDoGif() { return stat.PSE == 0 && (CHECK_GIFREVERSEHACK ? 1 : stat.DIR == 0) && gsSIGNAL.queued == 0; }
- bool Path3Masked() { return stat.M3R || stat.M3P; }
+ //Mask stops the next packet which hasnt started from transferring
+ bool Path3Masked() { return ((stat.M3R || stat.M3P) && (gifPath[GIF_PATH_3].state == GIF_PATH_IDLE)); }
void PrintInfo(bool printP1=1, bool printP2=1, bool printP3=1) {
u32 a = checkPaths(1,1,1), b = checkQueued(1,1,1);
diff --git a/pcsx2/HwRead.cpp b/pcsx2/HwRead.cpp
index c9483d3e6..f6b34a02d 100644
--- a/pcsx2/HwRead.cpp
+++ b/pcsx2/HwRead.cpp
@@ -203,7 +203,7 @@ mem16_t __fastcall hwRead16_page_0F_INTC_HACK(u32 mem)
u32 ret32 = _hwRead32<0x0f, true>(mem & ~0x03);
u16 ret16 = ((u16*)&ret32)[(mem>>1) & 0x01];
- eeHwTraceLog( mem, ret16, "Read" );
+ eeHwTraceLog( mem, ret16, true );
return ret16;
}
diff --git a/pcsx2/IopIrq.cpp b/pcsx2/IopIrq.cpp
index 6ed9be3ab..b915db9d8 100644
--- a/pcsx2/IopIrq.cpp
+++ b/pcsx2/IopIrq.cpp
@@ -23,7 +23,6 @@ void dev9Interrupt()
if ((dev9Handler != NULL) && (dev9Handler() != 1)) return;
iopIntcIrq(13);
- hwIntcIrq(INTC_SBUS);
}
void dev9Irq(int cycles)
@@ -36,7 +35,6 @@ void usbInterrupt()
if (usbHandler != NULL && (usbHandler() != 1)) return;
iopIntcIrq(22);
- hwIntcIrq(INTC_SBUS);
}
void usbIrq(int cycles)
@@ -47,7 +45,6 @@ void usbIrq(int cycles)
void fwIrq()
{
iopIntcIrq(24);
- hwIntcIrq(INTC_SBUS);
}
void spu2Irq()
@@ -56,7 +53,6 @@ void spu2Irq()
Console.Warning("spu2Irq");
#endif
iopIntcIrq(9);
- hwIntcIrq(INTC_SBUS);
}
void iopIntcIrq(uint irqType)
diff --git a/pcsx2/MTVU.cpp b/pcsx2/MTVU.cpp
index 5e7de0446..43d40f7ba 100644
--- a/pcsx2/MTVU.cpp
+++ b/pcsx2/MTVU.cpp
@@ -17,21 +17,341 @@
#include "Common.h"
#include "MTVU.h"
#include "newVif.h"
+#include "Gif_Unit.h"
__aligned16 VU_Thread vu1Thread(CpuVU1, VU1);
+#define volatize(x) (*reinterpret_cast(&(x)))
+#define size_u32(x) (((u32)x+3u)>>2) // Rounds up a size in bytes for size in u32's
+#define MTVU_ALWAYS_KICK 0
+#define MTVU_SYNC_MODE 0
+
+enum MTVU_EVENT {
+ MTVU_VU_EXECUTE, // Execute VU program
+ MTVU_VU_WRITE_MICRO, // Write to VU micro-mem
+ MTVU_VU_WRITE_DATA, // Write to VU data-mem
+ MTVU_VIF_WRITE_COL, // Write to Vif col reg
+ MTVU_VIF_WRITE_ROW, // Write to Vif row reg
+ MTVU_VIF_UNPACK, // Execute Vif Unpack
+ MTVU_NULL_PACKET, // Go back to beginning of buffer
+ MTVU_RESET
+};
+
// Calls the vif unpack functions from the MTVU thread
-void MTVU_Unpack(void* data, VIFregisters& vifRegs) {
+static void MTVU_Unpack(void* data, VIFregisters& vifRegs)
+{
bool isFill = vifRegs.cycle.cl < vifRegs.cycle.wl;
if (newVifDynaRec) dVifUnpack<1>((u8*)data, isFill);
else _nVifUnpack(1, (u8*)data, vifRegs.mode, isFill);
}
// Called on Saving/Loading states...
-void SaveStateBase::mtvuFreeze() {
+void SaveStateBase::mtvuFreeze()
+{
FreezeTag("MTVU");
pxAssert(vu1Thread.IsDone());
if (!IsSaving()) vu1Thread.Reset();
Freeze(vu1Thread.vuCycles);
Freeze(vu1Thread.vuCycleIdx);
}
+
+VU_Thread::VU_Thread(BaseVUmicroCPU*& _vuCPU, VURegs& _vuRegs) :
+ vuCPU(_vuCPU), vuRegs(_vuRegs)
+{
+ m_name = L"MTVU";
+ Reset();
+}
+
+VU_Thread::~VU_Thread() throw()
+{
+ pxThread::Cancel();
+}
+
+void VU_Thread::Reset()
+{
+ read_pos = 0;
+ write_pos = 0;
+ write_offset = 0;
+ vuCycleIdx = 0;
+ isBusy = false;
+ memzero(vif);
+ memzero(vifRegs);
+ memzero(vuCycles);
+}
+
+void VU_Thread::ExecuteTaskInThread()
+{
+ PCSX2_PAGEFAULT_PROTECT {
+ ExecuteRingBuffer();
+ } PCSX2_PAGEFAULT_EXCEPT;
+}
+
+void VU_Thread::ExecuteRingBuffer()
+{
+ for(;;) {
+ semaEvent.WaitWithoutYield();
+ ScopedLockBool lock(mtxBusy, isBusy);
+ while (read_pos != GetWritePos()) {
+ u32 tag = Read();
+ switch (tag) {
+ case MTVU_VU_EXECUTE: {
+ vuRegs.cycle = 0;
+ s32 addr = Read();
+ vifRegs.top = Read();
+ vifRegs.itop = Read();
+ if (addr != -1) vuRegs.VI[REG_TPC].UL = addr;
+ vuCPU->Execute(vu1RunCycles);
+ gifUnit.gifPath[GIF_PATH_1].FinishGSPacketMTVU();
+ semaXGkick.Post(); // Tell MTGS a path1 packet is complete
+ AtomicExchange(vuCycles[vuCycleIdx], vuRegs.cycle);
+ vuCycleIdx = (vuCycleIdx + 1) & 3;
+ break;
+ }
+ case MTVU_VU_WRITE_MICRO: {
+ u32 vu_micro_addr = Read();
+ u32 size = Read();
+ vuCPU->Clear(vu_micro_addr, size);
+ Read(&vuRegs.Micro[vu_micro_addr], size);
+ break;
+ }
+ case MTVU_VU_WRITE_DATA: {
+ u32 vu_data_addr = Read();
+ u32 size = Read();
+ Read(&vuRegs.Mem[vu_data_addr], size);
+ break;
+ }
+ case MTVU_VIF_WRITE_COL:
+ Read(&vif.MaskCol, sizeof(vif.MaskCol));
+ break;
+ case MTVU_VIF_WRITE_ROW:
+ Read(&vif.MaskRow, sizeof(vif.MaskRow));
+ break;
+ case MTVU_VIF_UNPACK: {
+ u32 vif_copy_size = (uptr)&vif.StructEnd - (uptr)&vif.tag;
+ Read(&vif.tag, vif_copy_size);
+ ReadRegs(&vifRegs);
+ u32 size = Read();
+ MTVU_Unpack(&buffer[read_pos], vifRegs);
+ incReadPos(size_u32(size));
+ break;
+ }
+ case MTVU_NULL_PACKET:
+ AtomicExchange(read_pos, 0);
+ break;
+ jNO_DEFAULT;
+ }
+ }
+ }
+}
+
+
+// Should only be called by ReserveSpace()
+__ri void VU_Thread::WaitOnSize(s32 size)
+{
+ for(;;) {
+ s32 readPos = GetReadPos();
+ if (readPos <= write_pos) break; // MTVU is reading in back of write_pos
+ if (readPos > write_pos + size) break; // Enough free front space
+ if (1) { // Let MTVU run to free up buffer space
+ KickStart();
+ if (IsDevBuild) DevCon.WriteLn("WaitOnSize()");
+ ScopedLock lock(mtxBusy);
+ }
+ }
+}
+
+// Makes sure theres enough room in the ring buffer
+// to write a continuous 'size * sizeof(u32)' bytes
+void VU_Thread::ReserveSpace(s32 size)
+{
+ pxAssert(write_pos < buffer_size);
+ pxAssert(size < buffer_size);
+ pxAssert(size > 0);
+ pxAssert(write_offset == 0);
+ if (write_pos + size > buffer_size) {
+ pxAssert(write_pos > 0);
+ WaitOnSize(1); // Size of MTVU_NULL_PACKET
+ Write(MTVU_NULL_PACKET);
+ write_offset = 0;
+ AtomicExchange(volatize(write_pos), 0);
+ }
+ WaitOnSize(size);
+}
+
+// Use this when reading read_pos from ee thread
+__fi volatile s32 VU_Thread::GetReadPos()
+{
+ return AtomicRead(read_pos);
+}
+// Use this when reading write_pos from vu thread
+__fi volatile s32 VU_Thread::GetWritePos()
+{
+ return AtomicRead(volatize(write_pos));
+}
+// Gets the effective write pointer after adding write_offset
+__fi u32* VU_Thread::GetWritePtr()
+{
+ return &buffer[(write_pos + write_offset) & buffer_mask];
+}
+
+__fi void VU_Thread::incReadPos(s32 offset)
+{ // Offset in u32 sizes
+ s32 temp = (read_pos + offset) & buffer_mask;
+ AtomicExchange(read_pos, temp);
+}
+__fi void VU_Thread::incWritePos()
+{ // Adds write_offset
+ s32 temp = (write_pos + write_offset) & buffer_mask;
+ write_offset = 0;
+ AtomicExchange(volatize(write_pos), temp);
+ if (MTVU_ALWAYS_KICK) KickStart();
+ if (MTVU_SYNC_MODE) WaitVU();
+}
+
+__fi u32 VU_Thread::Read()
+{
+ u32 ret = buffer[read_pos];
+ incReadPos(1);
+ return ret;
+}
+
+__fi void VU_Thread::Read(void* dest, u32 size)
+{
+ memcpy_fast(dest, &buffer[read_pos], size);
+ incReadPos(size_u32(size));
+}
+
+__fi void VU_Thread::ReadRegs(VIFregisters* dest)
+{
+ VIFregistersMTVU* src = (VIFregistersMTVU*)&buffer[read_pos];
+ dest->cycle = src->cycle;
+ dest->mode = src->mode;
+ dest->num = src->num;
+ dest->mask = src->mask;
+ dest->itop = src->itop;
+ dest->top = src->top;
+ incReadPos(size_u32(sizeof(VIFregistersMTVU)));
+}
+
+__fi void VU_Thread::Write(u32 val)
+{
+ GetWritePtr()[0] = val;
+ write_offset += 1;
+}
+__fi void VU_Thread::Write(void* src, u32 size)
+{
+ memcpy_fast(GetWritePtr(), src, size);
+ write_offset += size_u32(size);
+}
+
+__fi void VU_Thread::WriteRegs(VIFregisters* src)
+{
+ VIFregistersMTVU* dest = (VIFregistersMTVU*)GetWritePtr();
+ dest->cycle = src->cycle;
+ dest->mode = src->mode;
+ dest->num = src->num;
+ dest->mask = src->mask;
+ dest->top = src->top;
+ dest->itop = src->itop;
+ write_offset += size_u32(sizeof(VIFregistersMTVU));
+}
+
+// Returns Average number of vu Cycles from last 4 runs
+// Used for vu cycle stealing hack
+u32 VU_Thread::Get_vuCycles()
+{
+ return (AtomicRead(vuCycles[0]) + AtomicRead(vuCycles[1])
+ + AtomicRead(vuCycles[2]) + AtomicRead(vuCycles[3])) >> 2;
+}
+
+void VU_Thread::KickStart(bool forceKick)
+{
+ if ((forceKick && !semaEvent.Count())
+ || (!isBusy && GetReadPos() != write_pos)) semaEvent.Post();
+}
+
+bool VU_Thread::IsDone()
+{
+ return !isBusy && GetReadPos() == GetWritePos();
+}
+
+void VU_Thread::WaitVU()
+{
+ MTVU_LOG("MTVU - WaitVU!");
+ for(;;) {
+ if (IsDone()) break;
+ //DevCon.WriteLn("WaitVU()");
+ pxAssert(THREAD_VU1);
+ KickStart();
+ ScopedLock lock(mtxBusy);
+ }
+}
+
+void VU_Thread::ExecuteVU(u32 vu_addr, u32 vif_top, u32 vif_itop)
+{
+ MTVU_LOG("MTVU - ExecuteVU!");
+ ReserveSpace(4);
+ Write(MTVU_VU_EXECUTE);
+ Write(vu_addr);
+ Write(vif_top);
+ Write(vif_itop);
+ incWritePos();
+ gifUnit.TransferGSPacketData(GIF_TRANS_MTVU, NULL, 0);
+ KickStart();
+ u32 cycles = std::min(Get_vuCycles(), 3000u);
+ cpuRegs.cycle += cycles * EmuConfig.Speedhacks.VUCycleSteal;
+}
+
+void VU_Thread::VifUnpack(vifStruct& _vif, VIFregisters& _vifRegs, u8* data, u32 size)
+{
+ MTVU_LOG("MTVU - VifUnpack!");
+ u32 vif_copy_size = (uptr)&_vif.StructEnd - (uptr)&_vif.tag;
+ ReserveSpace(1 + size_u32(vif_copy_size) + size_u32(sizeof(VIFregistersMTVU)) + 1 + size_u32(size));
+ Write(MTVU_VIF_UNPACK);
+ Write(&_vif.tag, vif_copy_size);
+ WriteRegs(&_vifRegs);
+ Write(size);
+ Write(data, size);
+ incWritePos();
+ KickStart();
+}
+
+void VU_Thread::WriteMicroMem(u32 vu_micro_addr, void* data, u32 size)
+{
+ MTVU_LOG("MTVU - WriteMicroMem!");
+ ReserveSpace(3 + size_u32(size));
+ Write(MTVU_VU_WRITE_MICRO);
+ Write(vu_micro_addr);
+ Write(size);
+ Write(data, size);
+ incWritePos();
+}
+
+void VU_Thread::WriteDataMem(u32 vu_data_addr, void* data, u32 size)
+{
+ MTVU_LOG("MTVU - WriteDataMem!");
+ ReserveSpace(3 + size_u32(size));
+ Write(MTVU_VU_WRITE_DATA);
+ Write(vu_data_addr);
+ Write(size);
+ Write(data, size);
+ incWritePos();
+}
+
+void VU_Thread::WriteCol(vifStruct& _vif)
+{
+ MTVU_LOG("MTVU - WriteCol!");
+ ReserveSpace(1 + size_u32(sizeof(_vif.MaskCol)));
+ Write(MTVU_VIF_WRITE_COL);
+ Write(&_vif.MaskCol, sizeof(_vif.MaskCol));
+ incWritePos();
+}
+
+void VU_Thread::WriteRow(vifStruct& _vif)
+{
+ MTVU_LOG("MTVU - WriteRow!");
+ ReserveSpace(1 + size_u32(sizeof(_vif.MaskRow)));
+ Write(MTVU_VIF_WRITE_ROW);
+ Write(&_vif.MaskRow, sizeof(_vif.MaskRow));
+ incWritePos();
+}
\ No newline at end of file
diff --git a/pcsx2/MTVU.h b/pcsx2/MTVU.h
index 1e18065bf..d6eec9104 100644
--- a/pcsx2/MTVU.h
+++ b/pcsx2/MTVU.h
@@ -1,35 +1,32 @@
+/* PCSX2 - PS2 Emulator for PCs
+ * Copyright (C) 2002-2010 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.
+ *
+ * PCSX2 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 PCSX2.
+ * If not, see .
+ */
#pragma once
#include "System/SysThreads.h"
#include "Vif.h"
#include "Vif_Dma.h"
#include "VUmicro.h"
-#include "Gif_Unit.h"
-extern void MTVU_Unpack(void* data, VIFregisters& vifRegs);
-#define volatize(x) (*reinterpret_cast(&(x)))
-#define size_u32(x) (((u32)x+3u)>>2) // Rounds up a size in bytes for size in u32's
-#define MTVU_ALWAYS_KICK 0
-#define MTVU_SYNC_MODE 0
#define MTVU_LOG(...) do{} while(0)
//#define MTVU_LOG DevCon.WriteLn
-enum MTVU_EVENT {
- MTVU_VU_EXECUTE, // Execute VU program
- MTVU_VU_WRITE_MICRO, // Write to VU micro-mem
- MTVU_VU_WRITE_DATA, // Write to VU data-mem
- MTVU_VIF_WRITE_COL, // Write to Vif col reg
- MTVU_VIF_WRITE_ROW, // Write to Vif row reg
- MTVU_VIF_UNPACK, // Execute Vif Unpack
- MTVU_NULL_PACKET, // Go back to beginning of buffer
- MTVU_RESET
-};
-
// Notes:
// - This class should only be accessed from the EE thread...
// - buffer_size must be power of 2
// - ring-buffer has no complete pending packets when read_pos==write_pos
-struct VU_Thread : public pxThread {
+class VU_Thread : public pxThread {
static const u32 buffer_size = (_1mb * 16) / sizeof(u32);
static const u32 buffer_mask = buffer_size - 1;
__aligned(4) u32 buffer[buffer_size];
@@ -39,267 +36,69 @@ struct VU_Thread : public pxThread {
__aligned(4) s32 write_offset; // Only modified by EE thread
__aligned(4) Mutex mtxBusy;
__aligned(4) Semaphore semaEvent;
- __aligned(4) Semaphore semaXGkick;
__aligned(4) BaseVUmicroCPU*& vuCPU;
__aligned(4) VURegs& vuRegs;
+
+public:
__aligned16 vifStruct vif;
__aligned16 VIFregisters vifRegs;
+ __aligned(4) Semaphore semaXGkick;
__aligned(4) u32 vuCycles[4]; // Used for VU cycle stealing hack
__aligned(4) u32 vuCycleIdx; // Used for VU cycle stealing hack
- VU_Thread(BaseVUmicroCPU*& _vuCPU, VURegs& _vuRegs) :
- vuCPU(_vuCPU), vuRegs(_vuRegs) {
- m_name = L"MTVU";
- Reset();
- }
- virtual ~VU_Thread() throw() {
- pxThread::Cancel();
- }
- void InitThread() {
- Start(); // Starts the pxThread
- }
- void Reset() {
- read_pos = 0;
- write_pos = 0;
- write_offset = 0;
- vuCycleIdx = 0;
- isBusy = false;
- memzero(vif);
- memzero(vifRegs);
- memzero(vuCycles);
- }
-protected:
- // Should only be called by ReserveSpace()
- __ri void WaitOnSize(s32 size) {
- for(;;) {
- s32 readPos = GetReadPos();
- if (readPos <= write_pos) break; // MTVU is reading in back of write_pos
- if (readPos > write_pos + size) break; // Enough free front space
- if (1) { // Let MTVU run to free up buffer space
- KickStart();
- if (IsDevBuild) DevCon.WriteLn("WaitOnSize()");
- ScopedLock lock(mtxBusy);
- }
- }
- }
+ VU_Thread(BaseVUmicroCPU*& _vuCPU, VURegs& _vuRegs);
+ virtual ~VU_Thread() throw();
- // Makes sure theres enough room in the ring buffer
- // to write a continuous 'size * sizeof(u32)' bytes
- void ReserveSpace(s32 size) {
- pxAssert(write_pos < buffer_size);
- pxAssert(size < buffer_size);
- pxAssert(size > 0);
- pxAssert(write_offset == 0);
- if (write_pos + size > buffer_size) {
- pxAssert(write_pos > 0);
- WaitOnSize(1); // Size of MTVU_NULL_PACKET
- Write(MTVU_NULL_PACKET);
- write_offset = 0;
- AtomicExchange(volatize(write_pos), 0);
- }
- WaitOnSize(size);
- }
+ void Reset();
- // Use this when reading read_pos from ee thread
- __fi volatile s32 GetReadPos() {
- return AtomicRead(read_pos);
- }
- // Use this when reading write_pos from vu thread
- __fi volatile s32 GetWritePos() {
- return AtomicRead(volatize(write_pos));
- }
- // Gets the effective write pointer after adding write_offset
- __fi u32* GetWritePtr() {
- return &buffer[(write_pos + write_offset) & buffer_mask];
- }
-
- __fi void incReadPos(s32 offset) { // Offset in u32 sizes
- s32 temp = (read_pos + offset) & buffer_mask;
- AtomicExchange(read_pos, temp);
- }
- __fi void incWritePos() { // Adds write_offset
- s32 temp = (write_pos + write_offset) & buffer_mask;
- write_offset = 0;
- AtomicExchange(volatize(write_pos), temp);
- if (MTVU_ALWAYS_KICK) KickStart();
- if (MTVU_SYNC_MODE) WaitVU();
- }
-
- __fi u32 Read() {
- u32 ret = buffer[read_pos];
- incReadPos(1);
- return ret;
- }
- __fi void Read(void* dest, u32 size) { // Size in bytes
- memcpy_fast(dest, &buffer[read_pos], size);
- incReadPos(size_u32(size));
- }
-
- __fi void Write(u32 val) {
- GetWritePtr()[0] = val;
- write_offset += 1;
- }
- __fi void Write(void* src, u32 size) { // Size in bytes
- memcpy_fast(GetWritePtr(), src, size);
- write_offset += size_u32(size);
- }
-
- void ExecuteTaskInThread() {
- PCSX2_PAGEFAULT_PROTECT {
- ExecuteRingBuffer();
- } PCSX2_PAGEFAULT_EXCEPT;
- }
-
- void ExecuteRingBuffer() {
- for(;;) {
- semaEvent.WaitWithoutYield();
- ScopedLockBool lock(mtxBusy, isBusy);
- while (read_pos != GetWritePos()) {
- u32 tag = Read();
- switch (tag) {
- case MTVU_VU_EXECUTE: {
- vuRegs.cycle = 0;
- s32 addr = Read();
- vifRegs.top = Read();
- vifRegs.itop = Read();
- if (addr != -1) vuRegs.VI[REG_TPC].UL = addr;
- vuCPU->Execute(vu1RunCycles);
- gifUnit.gifPath[GIF_PATH_1].FinishGSPacketMTVU();
- semaXGkick.Post(); // Tell MTGS a path1 packet is complete
- AtomicExchange(vuCycles[vuCycleIdx], vuRegs.cycle);
- vuCycleIdx = (vuCycleIdx + 1) & 3;
- break;
- }
- case MTVU_VU_WRITE_MICRO: {
- u32 vu_micro_addr = Read();
- u32 size = Read();
- vuCPU->Clear(vu_micro_addr, size);
- Read(&vuRegs.Micro[vu_micro_addr], size);
- break;
- }
- case MTVU_VU_WRITE_DATA: {
- u32 vu_data_addr = Read();
- u32 size = Read();
- Read(&vuRegs.Mem[vu_data_addr], size);
- break;
- }
- case MTVU_VIF_WRITE_COL:
- Read(&vif.MaskCol, sizeof(vif.MaskCol));
- break;
- case MTVU_VIF_WRITE_ROW:
- Read(&vif.MaskRow, sizeof(vif.MaskRow));
- break;
- case MTVU_VIF_UNPACK: {
- u32 vif_copy_size = (uptr)&vif.StructEnd - (uptr)&vif.tag;
- Read(&vif.tag, vif_copy_size);
- Read(&vifRegs, sizeof(vifRegs));
- u32 size = Read();
- MTVU_Unpack(&buffer[read_pos], vifRegs);
- incReadPos(size_u32(size));
- break;
- }
- case MTVU_NULL_PACKET:
- AtomicExchange(read_pos, 0);
- break;
- jNO_DEFAULT;
- }
- }
- }
- }
-
- // Returns Average number of vu Cycles from last 4 runs
- u32 Get_vuCycles() { // Used for vu cycle stealing hack
- return (AtomicRead(vuCycles[0]) + AtomicRead(vuCycles[1])
- + AtomicRead(vuCycles[2]) + AtomicRead(vuCycles[3])) >> 2;
- }
-public:
-
// Get MTVU to start processing its packets if it isn't already
- void KickStart(bool forceKick = false) {
- if ((forceKick && !semaEvent.Count())
- || (!isBusy && GetReadPos() != write_pos)) semaEvent.Post();
- }
+ void KickStart(bool forceKick = false);
// Used for assertions...
- bool IsDone() { return !isBusy && GetReadPos() == GetWritePos(); }
+ bool IsDone();
// Waits till MTVU is done processing
- void WaitVU() {
- MTVU_LOG("MTVU - WaitVU!");
- for(;;) {
- if (IsDone()) break;
- //DevCon.WriteLn("WaitVU()");
- pxAssert(THREAD_VU1);
- KickStart();
- ScopedLock lock(mtxBusy);
- }
- }
+ void WaitVU();
- void ExecuteVU(u32 vu_addr, u32 vif_top, u32 vif_itop) {
- MTVU_LOG("MTVU - ExecuteVU!");
- ReserveSpace(4);
- Write(MTVU_VU_EXECUTE);
- Write(vu_addr);
- Write(vif_top);
- Write(vif_itop);
- incWritePos();
- gifUnit.TransferGSPacketData(GIF_TRANS_MTVU, NULL, 0);
- KickStart();
- u32 cycles = std::min(Get_vuCycles(), 3000u);
- cpuRegs.cycle += cycles * EmuConfig.Speedhacks.VUCycleSteal;
- }
+ void ExecuteVU(u32 vu_addr, u32 vif_top, u32 vif_itop);
- void VifUnpack(vifStruct& _vif, VIFregisters& _vifRegs, u8* data, u32 size) {
- MTVU_LOG("MTVU - VifUnpack!");
- u32 vif_copy_size = (uptr)&_vif.StructEnd - (uptr)&_vif.tag;
- ReserveSpace(1 + size_u32(vif_copy_size) + size_u32(sizeof(_vifRegs)) + 1 + size_u32(size));
- Write(MTVU_VIF_UNPACK);
- Write(&_vif.tag, vif_copy_size);
- Write(&_vifRegs, sizeof(_vifRegs));
- Write(size);
- Write(data, size);
- incWritePos();
- KickStart();
- }
+ void VifUnpack(vifStruct& _vif, VIFregisters& _vifRegs, u8* data, u32 size);
// Writes to VU's Micro Memory (size in bytes)
- void WriteMicroMem(u32 vu_micro_addr, void* data, u32 size) {
- MTVU_LOG("MTVU - WriteMicroMem!");
- ReserveSpace(3 + size_u32(size));
- Write(MTVU_VU_WRITE_MICRO);
- Write(vu_micro_addr);
- Write(size);
- Write(data, size);
- incWritePos();
- }
+ void WriteMicroMem(u32 vu_micro_addr, void* data, u32 size);
// Writes to VU's Data Memory (size in bytes)
- void WriteDataMem(u32 vu_data_addr, void* data, u32 size) {
- MTVU_LOG("MTVU - WriteDataMem!");
- ReserveSpace(3 + size_u32(size));
- Write(MTVU_VU_WRITE_DATA);
- Write(vu_data_addr);
- Write(size);
- Write(data, size);
- incWritePos();
- }
+ void WriteDataMem(u32 vu_data_addr, void* data, u32 size);
- void WriteCol(vifStruct& _vif) {
- MTVU_LOG("MTVU - WriteCol!");
- ReserveSpace(1 + size_u32(sizeof(_vif.MaskCol)));
- Write(MTVU_VIF_WRITE_COL);
- Write(&_vif.MaskCol, sizeof(_vif.MaskCol));
- incWritePos();
- }
+ void WriteCol(vifStruct& _vif);
- void WriteRow(vifStruct& _vif) {
- MTVU_LOG("MTVU - WriteRow!");
- ReserveSpace(1 + size_u32(sizeof(_vif.MaskRow)));
- Write(MTVU_VIF_WRITE_ROW);
- Write(&_vif.MaskRow, sizeof(_vif.MaskRow));
- incWritePos();
- }
+ void WriteRow(vifStruct& _vif);
+
+protected:
+ void ExecuteTaskInThread();
+
+private:
+ void ExecuteRingBuffer();
+
+ void WaitOnSize(s32 size);
+ void ReserveSpace(s32 size);
+
+ volatile s32 GetReadPos();
+ volatile s32 GetWritePos();
+ u32* GetWritePtr();
+
+ void incReadPos(s32 offset);
+ void incWritePos();
+
+ u32 Read();
+ void Read(void* dest, u32 size);
+ void ReadRegs(VIFregisters* dest);
+
+ void Write(u32 val);
+ void Write(void* src, u32 size);
+ void WriteRegs(VIFregisters* src);
+
+ u32 Get_vuCycles();
};
extern __aligned16 VU_Thread vu1Thread;
-
diff --git a/pcsx2/Pcsx2Config.cpp b/pcsx2/Pcsx2Config.cpp
index 7bb835c65..a9ca357a4 100644
--- a/pcsx2/Pcsx2Config.cpp
+++ b/pcsx2/Pcsx2Config.cpp
@@ -63,7 +63,6 @@ void Pcsx2Config::SpeedhackOptions::LoadSave( IniInterface& ini )
IniBitBool( IntcStat );
IniBitBool( WaitLoop );
IniBitBool( vuFlagHack );
- IniBitBool( vuBlockHack );
IniBitBool( vuThread );
}
diff --git a/pcsx2/PluginManager.cpp b/pcsx2/PluginManager.cpp
index 0fc2cba71..1166fca2c 100644
--- a/pcsx2/PluginManager.cpp
+++ b/pcsx2/PluginManager.cpp
@@ -967,7 +967,7 @@ void SysCorePlugins::Load( PluginsEnum_t pid, const wxString& srcfile )
{
ScopedLock lock( m_mtx_PluginStatus );
pxAssert( (uint)pid < PluginId_Count );
- Console.Indent().WriteLn( L"Binding %s\t: %s ", tbl_PluginInfo[pid].GetShortname().c_str(), srcfile.c_str() );
+ Console.Indent().WriteLn( L"Binding %4s: %s ", tbl_PluginInfo[pid].GetShortname().c_str(), srcfile.c_str() );
m_info[pid] = new PluginStatus_t( pid, srcfile );
}
diff --git a/pcsx2/R5900.cpp b/pcsx2/R5900.cpp
index db32ba281..f65eb032e 100644
--- a/pcsx2/R5900.cpp
+++ b/pcsx2/R5900.cpp
@@ -292,7 +292,7 @@ static __fi void _cpuTestInterrupts()
// The following ints are rarely called. Encasing them in a conditional
// as follows helps speed up most games.
- if( cpuRegs.interrupt & 0xF19 ) // Bits 0 3 4 8 9 10 11 ( 111100011001 )
+ if( cpuRegs.interrupt & 0x60F19 ) // Bits 0 3 4 8 9 10 11 17 18( 1100000111100011001 )
{
TESTINT(DMAC_VIF0, vif0Interrupt);
@@ -304,6 +304,9 @@ static __fi void _cpuTestInterrupts()
TESTINT(DMAC_MFIFO_VIF, vifMFIFOInterrupt);
TESTINT(DMAC_MFIFO_GIF, gifMFIFOInterrupt);
+
+ TESTINT(VIF_VU0_FINISH, vif0VUFinish);
+ TESTINT(VIF_VU1_FINISH, vif1VUFinish);
}
}
diff --git a/pcsx2/R5900.h b/pcsx2/R5900.h
index b57952bd8..0bc2ecf32 100644
--- a/pcsx2/R5900.h
+++ b/pcsx2/R5900.h
@@ -405,8 +405,10 @@ enum EE_EventType
DMAC_STALL_SIS = 13, // SIS
DMAC_MFIFO_EMPTY = 14, // MEIS
DMAC_BUS_ERROR = 15, // BEIS
-
- DMAC_GIF_UNIT
+
+ DMAC_GIF_UNIT,
+ VIF_VU0_FINISH,
+ VIF_VU1_FINISH
};
extern void CPU_INT( EE_EventType n, s32 ecycle );
diff --git a/pcsx2/SaveState.h b/pcsx2/SaveState.h
index 11b8745e9..485176b32 100644
--- a/pcsx2/SaveState.h
+++ b/pcsx2/SaveState.h
@@ -24,7 +24,7 @@
// the lower 16 bit value. IF the change is breaking of all compatibility with old
// states, increment the upper 16 bit value, and clear the lower 16 bits to 0.
-static const u32 g_SaveVersion = (0x9A06 << 16) | 0x0000;
+static const u32 g_SaveVersion = (0x9A07 << 16) | 0x0000;
// this function is meant to be used in the place of GSfreeze, and provides a safe layer
// between the GS saving function and the MTGS's needs. :)
diff --git a/pcsx2/Sif0.cpp b/pcsx2/Sif0.cpp
index 27691e5d1..408c34565 100644
--- a/pcsx2/Sif0.cpp
+++ b/pcsx2/Sif0.cpp
@@ -359,7 +359,6 @@ __fi void dmaSIF0()
// (as it should always be at the beginning of a DMA). using "if iop is busy" flags breaks Tom Clancy Rainbow Six.
// Legend of Legaia doesn't throw a warning either :)
sif0.ee.end = false;
- //hwIntcIrq(INTC_SBUS); // not sure, so let's not
- SIF0Dma();
+ SIF0Dma();
}
diff --git a/pcsx2/System/SysCoreThread.cpp b/pcsx2/System/SysCoreThread.cpp
index 0a9a600b6..8248252cf 100644
--- a/pcsx2/System/SysCoreThread.cpp
+++ b/pcsx2/System/SysCoreThread.cpp
@@ -23,6 +23,7 @@
#include "Elfheader.h"
#include "Patch.h"
#include "SysThreads.h"
+#include "MTVU.h"
#include "Utilities/PageFaultSource.h"
#include "Utilities/TlsVariable.inl"
@@ -278,6 +279,8 @@ void SysCoreThread::OnCleanupInThread()
m_hasActiveMachine = false;
m_resetVirtualMachine = true;
+ // FIXME: temporary workaround for deadlock on exit, which actually should be a crash
+ vu1Thread.WaitVU();
GetCorePlugins().Close();
GetCorePlugins().Shutdown();
diff --git a/pcsx2/VU0.cpp b/pcsx2/VU0.cpp
index 9ece6dd2d..40bd817cc 100644
--- a/pcsx2/VU0.cpp
+++ b/pcsx2/VU0.cpp
@@ -29,6 +29,7 @@
#include "R5900OpcodeTables.h"
#include "VUmicro.h"
+#include "Vif_Dma.h"
#define _Ft_ _Rt_
#define _Fs_ _Rd_
@@ -164,6 +165,7 @@ void CTC2() {
case REG_CMSAR1: // REG_CMSAR1
if (!(VU0.VI[REG_VPU_STAT].UL & 0x100) ) {
vu1ExecMicro(cpuRegs.GPR.r[_Rt_].US[0]); // Execute VU1 Micro SubRoutine
+ vif1VUFinish();
}
break;
default:
diff --git a/pcsx2/VU0micro.cpp b/pcsx2/VU0micro.cpp
index d9e5d853f..d8cd35cd9 100644
--- a/pcsx2/VU0micro.cpp
+++ b/pcsx2/VU0micro.cpp
@@ -46,6 +46,7 @@ void __fastcall vu0ExecMicro(u32 addr) {
VU0.VI[REG_VPU_STAT].UL &= ~0xFF;
VU0.VI[REG_VPU_STAT].UL |= 0x01;
+ vif0Regs.stat.VEW = true;
if ((s32)addr != -1) VU0.VI[REG_TPC].UL = addr;
_vuExecMicroDebug(VU0);
diff --git a/pcsx2/VU1micro.cpp b/pcsx2/VU1micro.cpp
index c1cec190d..740daf6ae 100644
--- a/pcsx2/VU1micro.cpp
+++ b/pcsx2/VU1micro.cpp
@@ -50,9 +50,10 @@ void vu1Finish() {
void __fastcall vu1ExecMicro(u32 addr)
{
+ vif1Regs.stat.VEW = true;
+
if (THREAD_VU1) {
vu1Thread.ExecuteVU(addr, vif1Regs.top, vif1Regs.itop);
- vif1Regs.stat.VEW = false;
VU0.VI[REG_VPU_STAT].UL &= ~0xFF00;
return;
}
@@ -64,7 +65,6 @@ void __fastcall vu1ExecMicro(u32 addr)
VU0.VI[REG_VPU_STAT].UL &= ~0xFF00;
VU0.VI[REG_VPU_STAT].UL |= 0x0100;
- vif1Regs.stat.VEW = true;
if ((s32)addr != -1) VU1.VI[REG_TPC].UL = addr;
_vuExecMicroDebug(VU1);
diff --git a/pcsx2/Vif.cpp b/pcsx2/Vif.cpp
index 2a3a8c822..83d435b08 100644
--- a/pcsx2/Vif.cpp
+++ b/pcsx2/Vif.cpp
@@ -47,8 +47,6 @@ void SaveStateBase::vif0Freeze()
FreezeTag("VIF0dma");
Freeze(g_vif0Cycles);
- Freeze(g_vu0Cycles);
- Freeze(g_packetsizeonvu0);
Freeze(vif0);
@@ -61,8 +59,6 @@ void SaveStateBase::vif1Freeze()
FreezeTag("VIF1dma");
Freeze(g_vif1Cycles);
- Freeze(g_vu1Cycles);
- Freeze(g_packetsizeonvu1);
Freeze(vif1);
diff --git a/pcsx2/Vif.h b/pcsx2/Vif.h
index e1df7ca46..4488efd8c 100644
--- a/pcsx2/Vif.h
+++ b/pcsx2/Vif.h
@@ -215,6 +215,15 @@ struct VIFregisters {
u32 addr;
};
+struct VIFregistersMTVU {
+ vifCycle cycle; //data write cycle
+ u32 mode;
+ u32 num;
+ u32 mask;
+ u32 itop;
+ u32 top; // Not used in VIF0
+};
+
static VIFregisters& vif0Regs = (VIFregisters&)eeHw[0x3800];
static VIFregisters& vif1Regs = (VIFregisters&)eeHw[0x3C00];
diff --git a/pcsx2/Vif0_Dma.cpp b/pcsx2/Vif0_Dma.cpp
index b378021a6..85b720115 100644
--- a/pcsx2/Vif0_Dma.cpp
+++ b/pcsx2/Vif0_Dma.cpp
@@ -25,31 +25,11 @@ u32 g_vif0Cycles = 0;
// because its vif stalling not the EE core...
__fi void vif0FLUSH()
{
- if(g_packetsizeonvu0 > vif0.vifpacketsize && g_vu0Cycles > 0)
- {
- //DevCon.Warning("Adding on same packet");
- if( ((g_packetsizeonvu0 - vif0.vifpacketsize) >> 1) > g_vu0Cycles)
- g_vu0Cycles -= (g_packetsizeonvu0 - vif0.vifpacketsize) >> 1;
- else g_vu0Cycles = 0;
- }
- if(g_vu0Cycles > 0)
- {
- //DevCon.Warning("Adding %x cycles to VIF0", g_vu0Cycles * BIAS);
- g_vif0Cycles += g_vu0Cycles;
- g_vu0Cycles = 0;
- }
- g_vu0Cycles = 0;
-
- if (!(VU0.VI[REG_VPU_STAT].UL & 1)) return;
- if(VU0.flags & VUFLAG_MFLAGSET)
+ if(vif0Regs.stat.VEW == true)
{
+ vif0.waitforvu = true;
vif0.vifstalled = true;
- return;
}
- int _cycles = VU0.cycle;
- vu0Finish();
- //DevCon.Warning("VIF0 adding %x cycles", (VU0.cycle - _cycles) * BIAS);
- g_vif0Cycles += (VU0.cycle - _cycles) * BIAS;
return;
}
@@ -160,6 +140,30 @@ __fi void vif0SetupTransfer()
}
}
+__fi void vif0VUFinish()
+{
+ if ((VU0.VI[REG_VPU_STAT].UL & 1))
+ {
+ int _cycles = VU0.cycle;
+ //DevCon.Warning("Finishing VU0");
+ vu0Finish();
+ _cycles = VU0.cycle - _cycles;
+ //DevCon.Warning("Finishing VU0 %d cycles", _cycles);
+ CPU_INT(VIF_VU0_FINISH, _cycles * BIAS);
+ return;
+ }
+ vif0Regs.stat.VEW = false;
+ if(vif0.waitforvu == true)
+ {
+ vif0.waitforvu = false;
+ ExecuteVU(0);
+ //Make sure VIF0 isnt already scheduled to spin.
+ if(!(cpuRegs.interrupt & 0x1))
+ vif0Interrupt();
+ }
+ //DevCon.Warning("VU0 state cleared");
+}
+
__fi void vif0Interrupt()
{
VIF_LOG("vif0Interrupt: %8.8x", cpuRegs.cycle);
@@ -190,6 +194,12 @@ __fi void vif0Interrupt()
}
}
+ if(vif0.waitforvu == true)
+ {
+ //DevCon.Warning("Waiting on VU0");
+ //CPU_INT(DMAC_VIF0, 16);
+ return;
+ }
//Must go after the Stall, incase it's still in progress, GTC africa likes to see it still transferring.
if (vif0.cmd)
{
@@ -250,7 +260,6 @@ void dmaVIF0()
vif0ch.tadr, vif0ch.asr0, vif0ch.asr1);
g_vif0Cycles = 0;
- g_vu0Cycles = 0;
//if(vif0.irqoffset != 0 && vif0.vifstalled == true) DevCon.Warning("Offset on VIF0 start! offset %x, Progress %x", vif0.irqoffset, vif0.vifstalled);
/*vif0.irqoffset = 0;
vif0.vifstalled = false;
diff --git a/pcsx2/Vif1_Dma.cpp b/pcsx2/Vif1_Dma.cpp
index c588411ae..79c4c8cd0 100644
--- a/pcsx2/Vif1_Dma.cpp
+++ b/pcsx2/Vif1_Dma.cpp
@@ -25,27 +25,10 @@ u32 g_vif1Cycles = 0;
__fi void vif1FLUSH()
{
- if(g_packetsizeonvu1 > vif1.vifpacketsize && g_vu1Cycles > 0)
+ if(vif1Regs.stat.VEW == true)
{
- //DevCon.Warning("Adding on same packet");
- if( ((g_packetsizeonvu1 - vif1.vifpacketsize) >> 1) > g_vu1Cycles)
- g_vu1Cycles -= (g_packetsizeonvu1 - vif1.vifpacketsize) >> 1;
- else g_vu1Cycles = 0;
- }
- if(g_vu1Cycles > 0)
- {
- //DevCon.Warning("Adding %x cycles to VIF1", g_vu1Cycles * BIAS);
- g_vif1Cycles += g_vu1Cycles;
- g_vu1Cycles = 0;
- }
- g_vu1Cycles = 0;//else DevCon.Warning("VIF1 Different Packet, how can i work this out :/");
-
- if (VU0.VI[REG_VPU_STAT].UL & 0x100)
- {
- int _cycles = VU1.cycle;
- vu1Finish();
- //DevCon.Warning("VIF1 adding %x cycles", (VU1.cycle - _cycles) * BIAS);
- g_vif1Cycles += (VU1.cycle - _cycles) * BIAS;
+ vif1.waitforvu = true;
+ vif1.vifstalled = true;
}
}
@@ -230,9 +213,38 @@ __fi void vif1SetupTransfer()
}
}
+__fi void vif1VUFinish()
+{
+ if (VU0.VI[REG_VPU_STAT].UL & 0x100)
+ {
+ int _cycles = VU1.cycle;
+ //DevCon.Warning("Finishing VU1");
+ vu1Finish();
+ CPU_INT(VIF_VU1_FINISH, (VU1.cycle - _cycles) * BIAS);
+ return;
+ }
+
+ vif1Regs.stat.VEW = false;
+ if(vif1.waitforvu == true)
+ {
+ vif1.waitforvu = false;
+ ExecuteVU(1);
+ //Check if VIF is already scheduled to interrupt, if it's waiting, kick it :P
+ if((cpuRegs.interrupt & (1< 0 || vif1ch.qwc)
+ {
+ CPU_INT(DMAC_VIF1, max((int)g_vif1Cycles, 8));
return;
}
+ else if(vif1Regs.stat.VPS == VPS_TRANSFERRING) DevCon.Warning("Cycles %x, cmd %x, qwc %x, waitonvu %x", g_vif1Cycles, vif1.cmd, vif1ch.qwc, vif1.waitforvu);
if (vif1.vifstalled && vif1.irq)
{
@@ -344,7 +369,6 @@ __fi void vif1Interrupt()
vif1ch.chcr.STR = false;
vif1.vifstalled = false;
g_vif1Cycles = 0;
- g_vu1Cycles = 0;
DMA_LOG("VIF1 DMA End");
hwDmacIrq(DMAC_VIF1);
@@ -364,7 +388,6 @@ void dmaVIF1()
vif1.vifstalled = false;
vif1.inprogress = 0;*/
g_vif1Cycles = 0;
- g_vu1Cycles = 0;
#ifdef PCSX2_DEVBUILD
if (dmacRegs.ctrl.STD == STD_VIF1)
@@ -410,7 +433,7 @@ void dmaVIF1()
{
vif1.dmamode = VIF_CHAIN_MODE;
vif1.done = false;
- vif1.inprogress = 0;
+ vif1.inprogress &= ~0x1;
}
if (vif1ch.chcr.DIR) vif1Regs.stat.FQC = min((u16)0x10, vif1ch.qwc);
diff --git a/pcsx2/Vif1_MFIFO.cpp b/pcsx2/Vif1_MFIFO.cpp
index 816b4267c..717fe0002 100644
--- a/pcsx2/Vif1_MFIFO.cpp
+++ b/pcsx2/Vif1_MFIFO.cpp
@@ -20,10 +20,6 @@
#include "Vif_Dma.h"
u16 vifqwc = 0;
-u32 g_vu0Cycles = 0;
-u32 g_vu1Cycles = 0;
-u32 g_packetsizeonvu0 = 0;
-u32 g_packetsizeonvu1 = 0;
static u32 qwctag(u32 mask)
{
@@ -267,6 +263,12 @@ void vifMFIFOInterrupt()
return;
}
}
+ if(vif1.waitforvu == true)
+ {
+ // DevCon.Warning("Waiting on VU1 MFIFO");
+ //CPU_INT(DMAC_MFIFO_VIF, 16);
+ return;
+ }
// We need to check the direction, if it is downloading from the GS,
// we handle that separately (KH2 for testing)
diff --git a/pcsx2/Vif_Codes.cpp b/pcsx2/Vif_Codes.cpp
index cd31b538d..b7678bd82 100644
--- a/pcsx2/Vif_Codes.cpp
+++ b/pcsx2/Vif_Codes.cpp
@@ -76,14 +76,30 @@ static __fi void vuExecMicro(int idx, u32 addr) {
if (!idx) vu0ExecMicro(addr);
else vu1ExecMicro(addr);
- if (!idx || !THREAD_VU1) {
- if (!idx) { g_vu0Cycles += (VU0.cycle-startcycles); g_packetsizeonvu0 = vif0.vifpacketsize; }
- else { g_vu1Cycles += (VU1.cycle-startcycles); g_packetsizeonvu1 = vif1.vifpacketsize; }
- }
+ if (!idx) { startcycles = ((VU0.cycle-startcycles) + ( vif0ch.qwc - (vif0.vifpacketsize >> 2) )); CPU_INT(VIF_VU0_FINISH, 1/*startcycles * BIAS*/); }
+ else { startcycles = ((VU1.cycle-startcycles) + ( vif1ch.qwc - (vif1.vifpacketsize >> 2) )); CPU_INT(VIF_VU1_FINISH, 1/*startcycles * BIAS*/); }
+
+
//DevCon.Warning("Ran VU%x, VU0 Cycles %x, VU1 Cycles %x, start %x cycle %x", idx, g_vu0Cycles, g_vu1Cycles, startcycles, VU1.cycle);
GetVifX.vifstalled = true;
}
+void ExecuteVU(int idx)
+{
+ vifStruct& vifX = GetVifX;
+
+ if((vifX.cmd & 0x7f) == 0x17)
+ {
+ vuExecMicro(idx, -1);
+ vifX.cmd = 0;
+ }
+ else if((vifX.cmd & 0x7f) == 0x14 || (vifX.cmd & 0x7f) == 0x15)
+ {
+ vuExecMicro(idx, (u16)(vifXRegs.code) << 3);
+ vifX.cmd = 0;
+ }
+}
+
//------------------------------------------------------------------
// Vif0/Vif1 Code Implementations
//------------------------------------------------------------------
@@ -174,14 +190,14 @@ vifOp(vifCode_FlushA) {
//p3.state= GIF_PATH_IDLE; // Does any game need this anymore?
DevCon.Warning("Vif FlushA - path3 has no more data, but didn't EOP");
}
- else { // Path 3 hasn't finished its current gs packet
+ /*else { // Path 3 hasn't finished its current gs packet
if (gifUnit.stat.APATH != 3 && gifUnit.Path3Masked()) {
gifUnit.stat.APATH = 3; // Hack: Force path 3 to finish (persona 3 needs this)
//DevCon.Warning("Vif FlushA - Forcing path3 to finish current packet");
}
gifInterrupt(); // Feed path3 some gif dma data
gifUnit.Execute(); // Execute path3 in-case gifInterrupt() didn't...
- }
+ }*/
if (p3.state != GIF_PATH_IDLE) {
doStall = true; // If path3 still isn't finished...
}
@@ -245,7 +261,7 @@ vifOp(vifCode_MPG) {
int vifNum = (u8)(vifXRegs.code >> 16);
vifX.tag.addr = (u16)(vifXRegs.code << 3) & (idx ? 0x3fff : 0xfff);
vifX.tag.size = vifNum ? (vifNum*2) : 512;
- //vifFlush(idx);
+ vifFlush(idx);
return 1;
}
pass2 {
@@ -275,7 +291,15 @@ vifOp(vifCode_MPG) {
vifOp(vifCode_MSCAL) {
vifStruct& vifX = GetVifX;
- pass1 { vifFlush(idx); vuExecMicro(idx, (u16)(vifXRegs.code) << 3); vifX.cmd = 0;}
+ pass1 {
+ vifFlush(idx);
+
+ if(vifX.waitforvu == false)
+ {
+ vuExecMicro(idx, (u16)(vifXRegs.code) << 3);
+ vifX.cmd = 0;
+ }
+ }
pass3 { VifCodeLog("MSCAL"); }
return 0;
}
@@ -290,7 +314,8 @@ vifOp(vifCode_MSCALF) {
vif1Regs.stat.VGW = true;
vifX.vifstalled = true;
}
- else {
+ if(vifX.waitforvu == false)
+ {
vuExecMicro(idx, (u16)(vifXRegs.code) << 3);
vifX.cmd = 0;
}
@@ -301,7 +326,14 @@ vifOp(vifCode_MSCALF) {
vifOp(vifCode_MSCNT) {
vifStruct& vifX = GetVifX;
- pass1 { vifFlush(idx); vuExecMicro(idx, -1); vifX.cmd = 0; }
+ pass1 {
+ vifFlush(idx);
+ if(vifX.waitforvu == false)
+ {
+ vuExecMicro(idx, -1);
+ vifX.cmd = 0;
+ }
+ }
pass3 { VifCodeLog("MSCNT"); }
return 0;
}
diff --git a/pcsx2/Vif_Dma.h b/pcsx2/Vif_Dma.h
index d655c440d..b4797a299 100644
--- a/pcsx2/Vif_Dma.h
+++ b/pcsx2/Vif_Dma.h
@@ -72,6 +72,7 @@ struct vifStruct {
bool done;
bool vifstalled;
bool stallontag;
+ bool waitforvu;
// GS registers used for calculating the size of the last local->host transfer initiated on the GS
// Transfer size calculation should be restricted to GS emulation in the future
@@ -89,11 +90,13 @@ extern __aligned16 vifStruct vif0, vif1;
_vifT extern u32 vifRead32(u32 mem);
_vifT extern bool vifWrite32(u32 mem, u32 value);
-
+void ExecuteVU(int idx);
extern void vif0Interrupt();
+extern void vif0VUFinish();
extern void vif0Reset();
extern void vif1Interrupt();
+extern void vif1VUFinish();
extern void vif1Reset();
typedef int __fastcall FnType_VifCmdHandler(int pass, const u32 *data);
@@ -119,10 +122,6 @@ static const unsigned int VIF1intc = 5;
extern u32 g_vif0Cycles;
extern u32 g_vif1Cycles;
-extern u32 g_vu0Cycles;
-extern u32 g_vu1Cycles;
-extern u32 g_packetsizeonvu0;
-extern u32 g_packetsizeonvu1;
extern void vif0FLUSH();
extern void vif1FLUSH();
diff --git a/pcsx2/Vif_Transfer.cpp b/pcsx2/Vif_Transfer.cpp
index f9c67bcfa..90562af10 100644
--- a/pcsx2/Vif_Transfer.cpp
+++ b/pcsx2/Vif_Transfer.cpp
@@ -122,14 +122,13 @@ _vifT static __fi bool vifTransfer(u32 *data, int size, bool TTE) {
transferred += size - vifX.vifpacketsize;
- if (!idx) {
- g_packetsizeonvu0 = size;
- g_vif0Cycles +=((transferred * BIAS) >> 2) ; /* guessing */
- }
- else {
- g_packetsizeonvu1 = size;
- g_vif1Cycles +=((transferred * BIAS) >> 2) ; /* guessing */
- }
+ //Make this a minimum of 1 cycle so if it's the end of the packet it doesnt just fall through.
+ //Metal Saga can do this, just to be safe :)
+ if (!idx) g_vif0Cycles += max(1, (int)((transferred * BIAS) >> 2));
+ else g_vif1Cycles += max(1, (int)((transferred * BIAS) >> 2));
+
+
+ /*
if(!idx && g_vu0Cycles > 0) {
if (g_vif0Cycles < g_vu0Cycles) g_vu0Cycles -= g_vif0Cycles;
elif(g_vif0Cycles >= g_vu0Cycles) g_vu0Cycles = 0;
@@ -138,7 +137,8 @@ _vifT static __fi bool vifTransfer(u32 *data, int size, bool TTE) {
if (g_vif1Cycles < g_vu1Cycles) g_vu1Cycles -= g_vif1Cycles;
elif(g_vif1Cycles >= g_vu1Cycles) g_vu1Cycles = 0;
}
-
+ */
+
vifX.irqoffset = transferred % 4; // cannot lose the offset
if (!TTE) {// *WARNING* - Tags CAN have interrupts! so lets just ignore the dma modifying stuffs (GT4)
diff --git a/pcsx2/ZipTools/thread_gzip.cpp b/pcsx2/ZipTools/thread_gzip.cpp
index ca437fda8..41d09eecd 100644
--- a/pcsx2/ZipTools/thread_gzip.cpp
+++ b/pcsx2/ZipTools/thread_gzip.cpp
@@ -3,7 +3,7 @@
*
* 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 te License, or (at your option) any later version.
+ * ation, either version 3 of the License, or (at your option) any later version.
*
* PCSX2 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
diff --git a/pcsx2/ZipTools/thread_lzma.cpp b/pcsx2/ZipTools/thread_lzma.cpp
index fd06a199f..48c9329f2 100644
--- a/pcsx2/ZipTools/thread_lzma.cpp
+++ b/pcsx2/ZipTools/thread_lzma.cpp
@@ -3,7 +3,7 @@
*
* 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 te License, or (at your option) any later version.
+ * ation, either version 3 of the License, or (at your option) any later version.
*
* PCSX2 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
diff --git a/pcsx2/bin b/pcsx2/bin
deleted file mode 120000
index 19f285ac7..000000000
--- a/pcsx2/bin
+++ /dev/null
@@ -1 +0,0 @@
-../bin
\ No newline at end of file
diff --git a/pcsx2/gui/AppConfig.cpp b/pcsx2/gui/AppConfig.cpp
index e64649939..ddf65394c 100644
--- a/pcsx2/gui/AppConfig.cpp
+++ b/pcsx2/gui/AppConfig.cpp
@@ -922,9 +922,8 @@ bool AppConfig::IsOkApplyPreset(int n)
case 4 : //set EE cyclerate to 2 clicks (maximum)
eeUsed?0:(eeUsed=true, EmuOptions.Speedhacks.EECycleRate = 2);
- case 3 : //Set VU cycle steal to 1 click, enable (m)vuBlockHack, set VU clamp mode to 'none'
+ case 3 : //Set VU cycle steal to 1 click, set VU clamp mode to 'none'
vuUsed?0:(vuUsed=true, EmuOptions.Speedhacks.VUCycleSteal = 1);
- EmuOptions.Speedhacks.vuBlockHack = true;
EmuOptions.Cpu.Recompiler.vuOverflow =
EmuOptions.Cpu.Recompiler.vuExtraOverflow =
EmuOptions.Cpu.Recompiler.vuSignOverflow = false; //VU Clamp mode to 'none'
diff --git a/pcsx2/gui/Panels/ConfigurationPanels.h b/pcsx2/gui/Panels/ConfigurationPanels.h
index 19366862e..43209f89a 100644
--- a/pcsx2/gui/Panels/ConfigurationPanels.h
+++ b/pcsx2/gui/Panels/ConfigurationPanels.h
@@ -334,7 +334,6 @@ namespace Panels
pxCheckBox* m_check_waitloop;
pxCheckBox* m_check_fastCDVD;
pxCheckBox* m_check_vuFlagHack;
- pxCheckBox* m_check_vuBlockHack;
pxCheckBox* m_check_vuThread;
public:
diff --git a/pcsx2/gui/Panels/MemoryCardListPanel.cpp b/pcsx2/gui/Panels/MemoryCardListPanel.cpp
index 918bedde5..b365fcd8b 100644
--- a/pcsx2/gui/Panels/MemoryCardListPanel.cpp
+++ b/pcsx2/gui/Panels/MemoryCardListPanel.cpp
@@ -53,7 +53,7 @@ bool EnumerateMemoryCard( McdSlotItem& dest, const wxFileName& filename, const w
const wxString fullpath( filename.GetFullPath() );
if( !filename.FileExists() ) return false;
- DevCon.WriteLn( fullpath );
+ //DevCon.WriteLn( fullpath );
wxFFile mcdFile( fullpath );
if( !mcdFile.IsOpened() ) return false; // wx should log the error for us.
if( mcdFile.Length() < (1024*528) )
@@ -1095,10 +1095,10 @@ void Panels::MemoryCardListPanel_Simple::ReadFilesAtMcdFolder(){
currentCardFile.Slot = -1;
currentCardFile.IsEnabled = false;
m_allFilesystemCards.push_back(currentCardFile);
- DevCon.WriteLn(L"Enumerated file: '%s'", currentCardFile.Filename.GetFullName().c_str() );
+ //DevCon.WriteLn(L"Enumerated file: '%s'", currentCardFile.Filename.GetFullName().c_str() );
}
- else
- DevCon.WriteLn(L"MCD folder card file skipped: '%s'", memcardList[i].c_str() );
+ /*else
+ DevCon.WriteLn(L"MCD folder card file skipped: '%s'", memcardList[i].c_str() );*/
}
}
diff --git a/pcsx2/gui/Panels/SpeedhacksPanel.cpp b/pcsx2/gui/Panels/SpeedhacksPanel.cpp
index d7db4d164..0052b1a0d 100644
--- a/pcsx2/gui/Panels/SpeedhacksPanel.cpp
+++ b/pcsx2/gui/Panels/SpeedhacksPanel.cpp
@@ -163,9 +163,6 @@ Panels::SpeedHacksPanel::SpeedHacksPanel( wxWindow* parent )
m_check_vuFlagHack = new pxCheckBox( vuHacksPanel, _("mVU Flag Hack"),
_("Good Speedup and High Compatibility; may cause bad graphics... [Recommended]" ) );
- m_check_vuBlockHack = new pxCheckBox( vuHacksPanel, _("mVU Block Hack"),
- _("Good Speedup and High Compatibility; may cause bad graphics, SPS, etc...") );
-
m_check_vuThread = new pxCheckBox( vuHacksPanel, _("MTVU (Multi-Threaded microVU1)"),
_("Good Speedup and High Compatibility; may cause hanging... [Recommended if 3+ cores]") );
@@ -174,11 +171,6 @@ Panels::SpeedHacksPanel::SpeedHacksPanel( wxWindow* parent )
L"This is safe most of the time, and Super VU does something similar by default."
) );
- m_check_vuBlockHack->SetToolTip( pxEt( "!ContextTip:Speedhacks:vuBlockHack",
- L"Assumes that very far into future blocks will not need old flag instance data. "
- L"This should be pretty safe. It is unknown if this breaks any game..."
- ) );
-
m_check_vuThread->SetToolTip( pxEt( "!ContextTip:Speedhacks:vuThread",
L"Runs VU1 on its own thread (microVU1-only). Generally a speedup on CPUs with 3 or more cores. "
L"This is safe for most games, but a few games are incompatible and may hang. "
@@ -234,7 +226,6 @@ Panels::SpeedHacksPanel::SpeedHacksPanel( wxWindow* parent )
*vuSliderPanel += m_msg_vustealer | sliderFlags;
*vuHacksPanel += m_check_vuFlagHack;
- *vuHacksPanel += m_check_vuBlockHack;
*vuHacksPanel += m_check_vuThread;
//*vuHacksPanel += 57; // Aligns left and right boxes in default language and font size
@@ -313,7 +304,6 @@ void Panels::SpeedHacksPanel::ApplyConfigToGui( AppConfig& configToApply, int fl
SetVUcycleSliderMsg();
m_check_vuFlagHack ->SetValue(opts.vuFlagHack);
- m_check_vuBlockHack ->SetValue(opts.vuBlockHack);
m_check_vuThread ->SetValue(opts.vuThread);
m_check_intc ->SetValue(opts.IntcStat);
m_check_waitloop ->SetValue(opts.WaitLoop);
@@ -343,7 +333,6 @@ void Panels::SpeedHacksPanel::Apply()
opts.fastCDVD = m_check_fastCDVD->GetValue();
opts.IntcStat = m_check_intc->GetValue();
opts.vuFlagHack = m_check_vuFlagHack->GetValue();
- opts.vuBlockHack = m_check_vuBlockHack->GetValue();
opts.vuThread = m_check_vuThread->GetValue();
// If the user has a command line override specified, we need to disable it
diff --git a/pcsx2/gui/Panels/ThemeSelectorPanel.cpp b/pcsx2/gui/Panels/ThemeSelectorPanel.cpp
index 6c9719b45..e9044824f 100644
--- a/pcsx2/gui/Panels/ThemeSelectorPanel.cpp
+++ b/pcsx2/gui/Panels/ThemeSelectorPanel.cpp
@@ -3,7 +3,7 @@
*
* 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 te License, or (at your option) any later version.
+ * ation, either version 3 of the License, or (at your option) any later version.
*
* PCSX2 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
diff --git a/pcsx2/gui/RecentIsoList.cpp b/pcsx2/gui/RecentIsoList.cpp
index eecd7e718..492a08fd1 100644
--- a/pcsx2/gui/RecentIsoList.cpp
+++ b/pcsx2/gui/RecentIsoList.cpp
@@ -121,9 +121,14 @@ void RecentIsoManager::Repopulate()
m_Separator = m_Menu->AppendSeparator();
- // The following line is important
+ // From arcum's comment on r5141
+ // What was happening is that when all the radio button menu items in a group are deleted,
+ // wxwidgets deletes the group, but when you start adding radio menu items again,
+ // it trys to add them to a group that doesn't exist. Since the group doesn't exist,
+ // it starts a new group, but it also spews a couple warnings about it in Linux.
+#ifdef __LINUX__
m_Menu->Remove( m_Menu->Append( -1, wxEmptyString ) );
-
+#endif
//Note: the internal recent iso list (m_Items) has the most recent item last (also at the INI file)
// but the menu is composed in reverse order such that the most recent item appears at the top.
for( int i=cnt-1; i>=0; --i )
diff --git a/pcsx2/gui/Resources/rebuild.sh b/pcsx2/gui/Resources/rebuild.sh
index 51cb30614..6a4b060dd 100755
--- a/pcsx2/gui/Resources/rebuild.sh
+++ b/pcsx2/gui/Resources/rebuild.sh
@@ -1,5 +1,19 @@
#!/bin/sh
+# PCSX2 - PS2 Emulator for PCs
+# Copyright (C) 2002-2011 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.
+#
+# PCSX2 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 PCSX2.
+# If not, see .
+
../../../tools/bin/bin2cpp BackgroundLogo.png
../../../tools/bin/bin2cpp AppIcon16.png
../../../tools/bin/bin2cpp AppIcon32.png
diff --git a/pcsx2/gui/SysState.cpp b/pcsx2/gui/SysState.cpp
index c976dd058..4e6f137aa 100644
--- a/pcsx2/gui/SysState.cpp
+++ b/pcsx2/gui/SysState.cpp
@@ -3,7 +3,7 @@
*
* 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 te License, or (at your option) any later version.
+ * ation, either version 3 of the License, or (at your option) any later version.
*
* PCSX2 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
@@ -280,14 +280,14 @@ static void CheckVersion( pxInputStream& thr )
if( savever > g_SaveVersion )
throw Exception::SaveStateLoadError( thr.GetStreamName() )
.SetDiagMsg(pxsFmt( L"Savestate uses an unsupported or unknown savestate version.\n(PCSX2 ver=%x, state ver=%x)", g_SaveVersion, savever ))
- .SetUserMsg(_("Cannot load this savestate. The state is from an incompatible edition of PCSX2 that is either newer than this version, or is no longer supported."));
+ .SetUserMsg(_("Cannot load this savestate. The state is an unsupported version."));
// check for a "minor" version incompatibility; which happens if the savestate being loaded is a newer version
// than the emulator recognizes. 99% chance that trying to load it will just corrupt emulation or crash.
if( (savever >> 16) != (g_SaveVersion >> 16) )
throw Exception::SaveStateLoadError( thr.GetStreamName() )
- .SetDiagMsg(pxsFmt( L"Savestate uses an unknown (future?!) savestate version.\n(PCSX2 ver=%x, state ver=%x)", g_SaveVersion, savever ))
- .SetUserMsg(_("Cannot load this savestate. The state is an unsupported version, likely created by a newer edition of PCSX2."));
+ .SetDiagMsg(pxsFmt( L"Savestate uses an unknown savestate version.\n(PCSX2 ver=%x, state ver=%x)", g_SaveVersion, savever ))
+ .SetUserMsg(_("Cannot load this savestate. The state is an unsupported version."));
};
// --------------------------------------------------------------------------------------
diff --git a/pcsx2/gui/i18n.cpp b/pcsx2/gui/i18n.cpp
index 88d9b00b9..9e856b93c 100644
--- a/pcsx2/gui/i18n.cpp
+++ b/pcsx2/gui/i18n.cpp
@@ -208,7 +208,13 @@ static wxLanguage i18n_FallbackToAnotherLang( wxLanguage wxLangId )
case wxLANGUAGE_SPANISH_VENEZUELA: return wxLANGUAGE_SPANISH_MODERN;
case wxLANGUAGE_ITALIAN_SWISS : return wxLANGUAGE_ITALIAN;
-
+
+ case wxLANGUAGE_FRENCH_BELGIAN:
+ case wxLANGUAGE_FRENCH_CANADIAN:
+ case wxLANGUAGE_FRENCH_LUXEMBOURG:
+ case wxLANGUAGE_FRENCH_MONACO:
+ case wxLANGUAGE_FRENCH_SWISS: return wxLANGUAGE_FRENCH;
+
default : break;
}
return wxLangId;
diff --git a/pcsx2/x86/BaseblockEx.h b/pcsx2/x86/BaseblockEx.h
index 2fc4cd80c..89ccec31e 100644
--- a/pcsx2/x86/BaseblockEx.h
+++ b/pcsx2/x86/BaseblockEx.h
@@ -127,9 +127,6 @@ public:
void clear()
{
- if(blocks) {
- memset(blocks, 0, sizeof(blocks));
- }
_Size = 0;
}
diff --git a/pcsx2/x86/microVU.cpp b/pcsx2/x86/microVU.cpp
index b953e6567..8ec9b1f0f 100644
--- a/pcsx2/x86/microVU.cpp
+++ b/pcsx2/x86/microVU.cpp
@@ -293,7 +293,7 @@ void recMicroVU0::Reserve() {
void recMicroVU1::Reserve() {
if (AtomicExchange(m_Reserved, 1) == 0) {
mVUinit(microVU1, 1);
- vu1Thread.InitThread();
+ vu1Thread.Start();
}
}
diff --git a/pcsx2/x86/microVU_Analyze.inl b/pcsx2/x86/microVU_Analyze.inl
index 51f1e1798..7fd22f544 100644
--- a/pcsx2/x86/microVU_Analyze.inl
+++ b/pcsx2/x86/microVU_Analyze.inl
@@ -364,7 +364,7 @@ __fi void mVUanalyzeXGkick(mV, int Fs, int xCycles) {
static void analyzeBranchVI(mV, int xReg, bool& infoVar) {
if (!xReg) return;
if (mVUstall) { // I assume a stall on branch means the vi reg is not modified directly b4 the branch...
- DevCon.Warning("microVU%d: Warning %d cycle stall on branch instruction [%04x]", getIndex, mVUstall, xPC);
+ DevCon.Warning("microVU%d: %d cycle stall on branch instruction [%04x]", getIndex, mVUstall, xPC);
return;
}
int i, j = 0;
@@ -374,7 +374,7 @@ static void analyzeBranchVI(mV, int xReg, bool& infoVar) {
incPC2(-2);
for (i = 0; i < iEnd && cyc < iEnd; i++) {
if (i && mVUstall) {
- DevCon.Warning("microVU%d: Warning Branch VI-Delay with %d cycle stall (%d) [%04x]", getIndex, mVUstall, i, xPC);
+ DevCon.Warning("microVU%d: Branch VI-Delay with %d cycle stall (%d) [%04x]", getIndex, mVUstall, i, xPC);
}
if (i == mVUcount) {
bool warn = 0;
@@ -385,12 +385,12 @@ static void analyzeBranchVI(mV, int xReg, bool& infoVar) {
infoVar = 1;
j = i; i++;
}
- if (warn) DevCon.Warning("microVU%d: Warning Branch VI-Delay with small block (%d) [%04x]", getIndex, i, xPC);
+ if (warn) DevCon.Warning("microVU%d: Branch VI-Delay with small block (%d) [%04x]", getIndex, i, xPC);
break; // if (warn), we don't have enough information to always guarantee the correct result.
}
if ((mVUlow.VI_write.reg == xReg) && mVUlow.VI_write.used) {
if (mVUlow.readFlags) {
- if (i) DevCon.Warning("microVU%d: Warning Branch VI-Delay with Read Flags Set (%d) [%04x]", getIndex, i, xPC);
+ if (i) DevCon.Warning("microVU%d: Branch VI-Delay with Read Flags Set (%d) [%04x]", getIndex, i, xPC);
break; // Not sure if on the above "if (i)" case, if we need to "continue" or if we should "break"
}
j = i;
@@ -465,14 +465,14 @@ __ri int mVUbranchCheck(mV) {
mVUregs.flagInfo = 0;
mVUregs.fullFlags0 = 0;
mVUregs.fullFlags1 = 0;
- DevCon.Warning("microVU%d Warning: %s in %s delay slot! [%04x]", mVU.index,
+ DevCon.Warning("microVU%d: %s in %s delay slot! [%04x]", mVU.index,
branchSTR[mVUlow.branch&0xf], branchSTR[branchType&0xf], xPC);
return 1;
}
else {
incPC(2);
mVUlow.isNOP = 1;
- DevCon.Warning("microVU%d Warning: %s in %s delay slot! [%04x]", mVU.index,
+ DevCon.Warning("microVU%d: %s in %s delay slot! [%04x]", mVU.index,
branchSTR[mVUlow.branch&0xf], branchSTR[branchType&0xf], xPC);
return 0;
}
diff --git a/pcsx2/x86/microVU_Branch.inl b/pcsx2/x86/microVU_Branch.inl
index 4e75c8173..02eb27484 100644
--- a/pcsx2/x86/microVU_Branch.inl
+++ b/pcsx2/x86/microVU_Branch.inl
@@ -79,7 +79,7 @@ void mVUendProgram(mV, microFlagCycles* mFC, int isEbit) {
if (isEbit || isVU1) { // Clear 'is busy' Flags
if (!mVU.index || !THREAD_VU1) {
xAND(ptr32[&VU0.VI[REG_VPU_STAT].UL], (isVU1 ? ~0x100 : ~0x001)); // VBS0/VBS1 flag
- xAND(ptr32[&mVU.getVifRegs().stat], ~VIF1_STAT_VEW); // Clear VU 'is busy' signal for vif
+ //xAND(ptr32[&mVU.getVifRegs().stat], ~VIF1_STAT_VEW); // Clear VU 'is busy' signal for vif
}
}
diff --git a/pcsx2/x86/microVU_Flags.inl b/pcsx2/x86/microVU_Flags.inl
index 7d215ab42..b908e5231 100644
--- a/pcsx2/x86/microVU_Flags.inl
+++ b/pcsx2/x86/microVU_Flags.inl
@@ -290,7 +290,7 @@ __fi void mVUsetupFlags(mV, microFlagCycles& mFC) {
branch = 0; \
} \
else if (branch == 5) { /*JR/JARL*/ \
- if(!CHECK_VU_BLOCKHACK && (sCount+found<4)) { \
+ if(sCount+found<4) { \
mVUregs.needExactMatch |= 7; \
} \
break; \
diff --git a/pcsx2/x86/microVU_Lower.inl b/pcsx2/x86/microVU_Lower.inl
index 6f337914a..d816b11fa 100644
--- a/pcsx2/x86/microVU_Lower.inl
+++ b/pcsx2/x86/microVU_Lower.inl
@@ -949,13 +949,14 @@ mVUop(mVU_LQD) {
pass1 { mVUanalyzeLQ(mVU, _Ft_, _Is_, 1); }
pass2 {
xAddressVoid ptr(mVU.regs().Mem);
- if (_Is_) {
+ if (_Is_ || isVU0) { // Access VU1 regs mem-map in !_Is_ case
mVUallocVIa(mVU, gprT2, _Is_);
xSUB(gprT2b, 1);
- mVUallocVIb(mVU, gprT2, _Is_);
+ if (_Is_) mVUallocVIb(mVU, gprT2, _Is_);
mVUaddrFix (mVU, gprT2);
ptr += gprT2;
}
+ else ptr += (0xffff & (mVU.microMemSize-8));
if (!mVUlow.noWriteVF) {
const xmm& Ft = mVU.regAlloc->allocReg(-1, _Ft_, _X_Y_Z_W);
mVUloadReg(Ft, ptr, _X_Y_Z_W);
@@ -1016,13 +1017,14 @@ mVUop(mVU_SQD) {
pass1 { mVUanalyzeSQ(mVU, _Fs_, _It_, 1); }
pass2 {
xAddressVoid ptr(mVU.regs().Mem);
- if (_It_) {
+ if (_It_ || isVU0) {// Access VU1 regs mem-map in !_It_ case
mVUallocVIa(mVU, gprT2, _It_);
xSUB(gprT2b, 1);
- mVUallocVIb(mVU, gprT2, _It_);
+ if (_It_) mVUallocVIb(mVU, gprT2, _It_);
mVUaddrFix (mVU, gprT2);
ptr += gprT2;
}
+ else ptr += (0xffff & (mVU.microMemSize-8));
const xmm& Fs = mVU.regAlloc->allocReg(_Fs_, 0, _X_Y_Z_W);
mVUsaveReg(Fs, ptr, _X_Y_Z_W, 1);
mVU.regAlloc->clearNeeded(Fs);
diff --git a/pcsx2/x86/microVU_Macro.inl b/pcsx2/x86/microVU_Macro.inl
index ffba4bde6..48d5756e3 100644
--- a/pcsx2/x86/microVU_Macro.inl
+++ b/pcsx2/x86/microVU_Macro.inl
@@ -232,7 +232,8 @@ INTERPRETATE_COP2_FUNC(CALLMSR);
void _setupBranchTest(u32*(jmpType)(u32), bool isLikely) {
printCOP2("COP2 Branch");
_eeFlushAllUnused();
- TEST32ItoM((uptr)&VU0.VI[REG_VPU_STAT].UL, 0x100);
+ TEST32ItoM((uptr)&vif1Regs.stat._u32, 0x4);
+ //TEST32ItoM((uptr)&VU0.VI[REG_VPU_STAT].UL, 0x100);
recDoBranchImm(jmpType(0), isLikely);
}
@@ -316,6 +317,7 @@ static void recCTC2() {
}
else xXOR(ecx, ecx);
xCALL(vu1ExecMicro);
+ xCALL(vif1VUFinish);
break;
case REG_FBRST:
if (!_Rt_) {
diff --git a/pcsx2/x86/microVU_Misc.h b/pcsx2/x86/microVU_Misc.h
index 17aed5ed7..bc05ddc53 100644
--- a/pcsx2/x86/microVU_Misc.h
+++ b/pcsx2/x86/microVU_Misc.h
@@ -359,13 +359,6 @@ static const bool doJumpAsSameProgram = 0; // Set to 1 to treat jumps as same pr
// This hack only updates the Status Flag on blocks that will read it.
// Most blocks do not read status flags, so this is a big speedup.
-// Block Flag Instance No-Propagation Hack
-#define CHECK_VU_BLOCKHACK (EmuConfig.Speedhacks.vuBlockHack)
-// There are times when it is unknown if future blocks will need old
-// flag instance data (due to indirect jumps). This hack assumes
-// that they won't need old flag data. This effectively removes a lot
-// of end-of-block flag instance shuffling, causing nice speedups.
-
// Min/Max Speed Hack
#define CHECK_VU_MINMAXHACK 0 //(EmuConfig.Speedhacks.vuMinMax)
// This hack uses SSE min/max instructions instead of emulated "logical min/max"
diff --git a/pcsx2/x86/sVU_zerorec.cpp b/pcsx2/x86/sVU_zerorec.cpp
index 7bd57dee8..bcfc1aaa1 100644
--- a/pcsx2/x86/sVU_zerorec.cpp
+++ b/pcsx2/x86/sVU_zerorec.cpp
@@ -2721,7 +2721,7 @@ static void SuperVURecompile()
pxAssert(pchild->blocks.size() == 0);
AND32ItoM((uptr)&VU0.VI[ REG_VPU_STAT ].UL, s_vu ? ~0x100 : ~0x001); // E flag
- AND32ItoM((uptr)&VU->GetVifRegs().stat, ~VIF1_STAT_VEW);
+ //AND32ItoM((uptr)&VU->GetVifRegs().stat, ~VIF1_STAT_VEW);
MOV32ItoM((uptr)&VU->VI[REG_TPC], pchild->endpc);
JMP32((uptr)SuperVUEndProgram - ((uptr)x86Ptr + 5));
@@ -2994,7 +2994,7 @@ void VuBaseBlock::Recompile()
_freeXMMregs();
_freeX86regs();
AND32ItoM((uptr)&VU0.VI[ REG_VPU_STAT ].UL, s_vu ? ~0x100 : ~0x001); // E flag
- AND32ItoM((uptr)&VU->GetVifRegs().stat, ~VIF1_STAT_VEW);
+ //AND32ItoM((uptr)&VU->GetVifRegs().stat, ~VIF1_STAT_VEW);
if (!branch) MOV32ItoM((uptr)&VU->VI[REG_TPC], endpc);
diff --git a/pcsx2_suite_2008.sln b/pcsx2_suite_2008.sln
index 8002a13f1..ad5f23fea 100644
--- a/pcsx2_suite_2008.sln
+++ b/pcsx2_suite_2008.sln
@@ -153,15 +153,30 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ZZOgl", "plugins\zzogl-pg\o
ProjectSection(ProjectDependencies) = postProject
{48AD7E0A-25B1-4974-A1E3-03F8C438D34F} = {48AD7E0A-25B1-4974-A1E3-03F8C438D34F}
{4639972E-424E-4E13-8B07-CA403C481346} = {4639972E-424E-4E13-8B07-CA403C481346}
+ {0318BA30-EF48-441A-9E10-DC85EFAE39F0} = {0318BA30-EF48-441A-9E10-DC85EFAE39F0}
{BC236261-77E8-4567-8D09-45CD02965EB6} = {BC236261-77E8-4567-8D09-45CD02965EB6}
{26511268-2902-4997-8421-ECD7055F9E28} = {26511268-2902-4997-8421-ECD7055F9E28}
{2F6C0388-20CB-4242-9F6C-A6EBB6A83F47} = {2F6C0388-20CB-4242-9F6C-A6EBB6A83F47}
{C34487AF-228A-4D11-8E50-27803DF76873} = {C34487AF-228A-4D11-8E50-27803DF76873}
+ {0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E} = {0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E}
{7E9B2BE7-CEC3-4F14-847B-0AB8D562FB86} = {7E9B2BE7-CEC3-4F14-847B-0AB8D562FB86}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SDL", "3rdparty\SDL-1.3.0-5387\VisualC\SDL\SDL_VS2008.vcproj", "{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ZZOgl-cg", "plugins\zzogl-pg-cg\opengl\Win32\zerogsogl-cg_2008.vcproj", "{D41E16E8-A01C-4368-B83E-1A999CCB892C}"
+ ProjectSection(ProjectDependencies) = postProject
+ {48AD7E0A-25B1-4974-A1E3-03F8C438D34F} = {48AD7E0A-25B1-4974-A1E3-03F8C438D34F}
+ {4639972E-424E-4E13-8B07-CA403C481346} = {4639972E-424E-4E13-8B07-CA403C481346}
+ {0318BA30-EF48-441A-9E10-DC85EFAE39F0} = {0318BA30-EF48-441A-9E10-DC85EFAE39F0}
+ {BC236261-77E8-4567-8D09-45CD02965EB6} = {BC236261-77E8-4567-8D09-45CD02965EB6}
+ {26511268-2902-4997-8421-ECD7055F9E28} = {26511268-2902-4997-8421-ECD7055F9E28}
+ {2F6C0388-20CB-4242-9F6C-A6EBB6A83F47} = {2F6C0388-20CB-4242-9F6C-A6EBB6A83F47}
+ {C34487AF-228A-4D11-8E50-27803DF76873} = {C34487AF-228A-4D11-8E50-27803DF76873}
+ {0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E} = {0E231FB1-F3C9-4724-ACCB-DE8BCB3C089E}
+ {7E9B2BE7-CEC3-4F14-847B-0AB8D562FB86} = {7E9B2BE7-CEC3-4F14-847B-0AB8D562FB86}
+ EndProjectSection
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
@@ -799,6 +814,24 @@ Global
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|Win32.ActiveCfg = Release|Win32
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|Win32.Build.0 = Release|Win32
{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|x64.ActiveCfg = Release|Win32
+ {D41E16E8-A01C-4368-B83E-1A999CCB892C}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D41E16E8-A01C-4368-B83E-1A999CCB892C}.Debug|Win32.Build.0 = Debug|Win32
+ {D41E16E8-A01C-4368-B83E-1A999CCB892C}.Debug|x64.ActiveCfg = Debug|Win32
+ {D41E16E8-A01C-4368-B83E-1A999CCB892C}.Devel|Win32.ActiveCfg = Devel|Win32
+ {D41E16E8-A01C-4368-B83E-1A999CCB892C}.Devel|Win32.Build.0 = Devel|Win32
+ {D41E16E8-A01C-4368-B83E-1A999CCB892C}.Devel|x64.ActiveCfg = Devel|Win32
+ {D41E16E8-A01C-4368-B83E-1A999CCB892C}.Release SSE2|Win32.ActiveCfg = Release|Win32
+ {D41E16E8-A01C-4368-B83E-1A999CCB892C}.Release SSE2|Win32.Build.0 = Release|Win32
+ {D41E16E8-A01C-4368-B83E-1A999CCB892C}.Release SSE2|x64.ActiveCfg = Release|Win32
+ {D41E16E8-A01C-4368-B83E-1A999CCB892C}.Release SSE4|Win32.ActiveCfg = Release|Win32
+ {D41E16E8-A01C-4368-B83E-1A999CCB892C}.Release SSE4|Win32.Build.0 = Release|Win32
+ {D41E16E8-A01C-4368-B83E-1A999CCB892C}.Release SSE4|x64.ActiveCfg = Release|Win32
+ {D41E16E8-A01C-4368-B83E-1A999CCB892C}.Release SSSE3|Win32.ActiveCfg = Release|Win32
+ {D41E16E8-A01C-4368-B83E-1A999CCB892C}.Release SSSE3|Win32.Build.0 = Release|Win32
+ {D41E16E8-A01C-4368-B83E-1A999CCB892C}.Release SSSE3|x64.ActiveCfg = Release|Win32
+ {D41E16E8-A01C-4368-B83E-1A999CCB892C}.Release|Win32.ActiveCfg = Release|Win32
+ {D41E16E8-A01C-4368-B83E-1A999CCB892C}.Release|Win32.Build.0 = Release|Win32
+ {D41E16E8-A01C-4368-B83E-1A999CCB892C}.Release|x64.ActiveCfg = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -816,6 +849,7 @@ Global
{5CF88D5F-64DD-4EDC-9F1A-436BD502940A} = {703FD00B-D7A0-41E3-BD03-CEC86B385DAF}
{6C8D28E4-447E-4856-BD9E-6B8F5E7C58C9} = {703FD00B-D7A0-41E3-BD03-CEC86B385DAF}
{2D4E85B2-F47F-4D65-B091-701E5C031DAC} = {703FD00B-D7A0-41E3-BD03-CEC86B385DAF}
+ {D41E16E8-A01C-4368-B83E-1A999CCB892C} = {703FD00B-D7A0-41E3-BD03-CEC86B385DAF}
{2F6C0388-20CB-4242-9F6C-A6EBB6A83F47} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38}
{F4EB4AB2-C595-4B05-8BC0-059024BC796C} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38}
{26511268-2902-4997-8421-ECD7055F9E28} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38}
diff --git a/pcsx2_suite_2010.sln b/pcsx2_suite_2010.sln
index 077eea2fc..19c01588a 100644
--- a/pcsx2_suite_2010.sln
+++ b/pcsx2_suite_2010.sln
@@ -119,6 +119,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SDL", "3rdparty\SDL-1.3.0-5
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "USBqemu", "plugins\USBqemu\Win32\USBqemu.vcxproj", "{E613DA9F-41B4-4613-9911-E418EF5533BC}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ZZOgl-cg", "plugins\zzogl-pg-cg\opengl\Win32\zerogsogl-cg.vcxproj", "{019773FA-2DAA-4C12-9511-BD2D4EB2A718}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug AVX|Win32 = Debug AVX|Win32
@@ -1270,6 +1272,39 @@ Global
{E613DA9F-41B4-4613-9911-E418EF5533BC}.Release|Win32.ActiveCfg = Release|Win32
{E613DA9F-41B4-4613-9911-E418EF5533BC}.Release|Win32.Build.0 = Release|Win32
{E613DA9F-41B4-4613-9911-E418EF5533BC}.Release|x64.ActiveCfg = Release|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Debug AVX|Win32.ActiveCfg = Debug|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Debug AVX|Win32.Build.0 = Debug|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Debug AVX|x64.ActiveCfg = Debug|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Debug SSE2|Win32.ActiveCfg = Debug|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Debug SSE2|Win32.Build.0 = Debug|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Debug SSE2|x64.ActiveCfg = Debug|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Debug SSE4|Win32.ActiveCfg = Debug|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Debug SSE4|Win32.Build.0 = Debug|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Debug SSE4|x64.ActiveCfg = Debug|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Debug SSSE3|Win32.ActiveCfg = Debug|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Debug SSSE3|Win32.Build.0 = Debug|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Debug SSSE3|x64.ActiveCfg = Debug|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Debug|Win32.ActiveCfg = Debug|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Debug|Win32.Build.0 = Debug|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Debug|x64.ActiveCfg = Debug|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Devel|Win32.ActiveCfg = Devel|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Devel|Win32.Build.0 = Devel|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Devel|x64.ActiveCfg = Devel|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Release AVX|Win32.ActiveCfg = Release|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Release AVX|Win32.Build.0 = Release|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Release AVX|x64.ActiveCfg = Release|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Release SSE2|Win32.ActiveCfg = Release|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Release SSE2|Win32.Build.0 = Release|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Release SSE2|x64.ActiveCfg = Release|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Release SSE4|Win32.ActiveCfg = Release|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Release SSE4|Win32.Build.0 = Release|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Release SSE4|x64.ActiveCfg = Release|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Release SSSE3|Win32.ActiveCfg = Release|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Release SSSE3|Win32.Build.0 = Release|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Release SSSE3|x64.ActiveCfg = Release|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Release|Win32.ActiveCfg = Release|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Release|Win32.Build.0 = Release|Win32
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718}.Release|x64.ActiveCfg = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -1288,6 +1323,7 @@ Global
{6C8D28E4-447E-4856-BD9E-6B8F5E7C58C9} = {703FD00B-D7A0-41E3-BD03-CEC86B385DAF}
{2D4E85B2-F47F-4D65-B091-701E5C031DAC} = {703FD00B-D7A0-41E3-BD03-CEC86B385DAF}
{E613DA9F-41B4-4613-9911-E418EF5533BC} = {703FD00B-D7A0-41E3-BD03-CEC86B385DAF}
+ {019773FA-2DAA-4C12-9511-BD2D4EB2A718} = {703FD00B-D7A0-41E3-BD03-CEC86B385DAF}
{E9B51944-7E6D-4BCD-83F2-7BBD5A46182D} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38}
{2F6C0388-20CB-4242-9F6C-A6EBB6A83F47} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38}
{F4EB4AB2-C595-4B05-8BC0-059024BC796C} = {78EBE642-7A4D-4EA7-86BE-5639C6646C38}
diff --git a/plugins/CDVDnull/CMakeLists.txt b/plugins/CDVDnull/CMakeLists.txt
index 10d245b5a..27a72d14f 100644
--- a/plugins/CDVDnull/CMakeLists.txt
+++ b/plugins/CDVDnull/CMakeLists.txt
@@ -63,6 +63,11 @@ add_library(${Output} SHARED
${CDVDnullHeaders}
)
+if(Linux)
+ # link target with gtk2
+ target_link_libraries(${Output} ${GTK2_LIBRARIES})
+endif(Linux)
+
# User flags options
if(NOT USER_CMAKE_LD_FLAGS STREQUAL "")
target_link_libraries(${Output} "${USER_CMAKE_LD_FLAGS}")
diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt
index e9b14baf9..ce5a5fd74 100644
--- a/plugins/CMakeLists.txt
+++ b/plugins/CMakeLists.txt
@@ -116,6 +116,11 @@ if(EXISTS "${PROJECT_SOURCE_DIR}/plugins/zzogl-pg" AND zzogl)
add_subdirectory(zzogl-pg/opengl)
endif(EXISTS "${PROJECT_SOURCE_DIR}/plugins/zzogl-pg" AND zzogl)
+# make zzogl-pg
+if(EXISTS "${PROJECT_SOURCE_DIR}/plugins/zzogl-pg-cg" AND zzogl)
+ add_subdirectory(zzogl-pg-cg/opengl)
+endif(EXISTS "${PROJECT_SOURCE_DIR}/plugins/zzogl-pg-cg" AND zzogl)
+
# make zeropad
if(EXISTS "${PROJECT_SOURCE_DIR}/plugins/zeropad" AND zeropad)
add_subdirectory(zeropad)
diff --git a/plugins/FWnull/CMakeLists.txt b/plugins/FWnull/CMakeLists.txt
index 4e3c93d11..0d8a7ba36 100644
--- a/plugins/FWnull/CMakeLists.txt
+++ b/plugins/FWnull/CMakeLists.txt
@@ -75,6 +75,11 @@ add_library(${Output} SHARED
${FWnullLinuxSources}
${FWnullLinuxHeaders})
+if(Linux)
+ # link target with gtk2
+ target_link_libraries(${Output} ${GTK2_LIBRARIES})
+endif(Linux)
+
# User flags options
if(NOT USER_CMAKE_LD_FLAGS STREQUAL "")
target_link_libraries(${Output} "${USER_CMAKE_LD_FLAGS}")
diff --git a/plugins/GSdx/CMakeLists.txt b/plugins/GSdx/CMakeLists.txt
index 51cf2e5b4..57f4e9328 100644
--- a/plugins/GSdx/CMakeLists.txt
+++ b/plugins/GSdx/CMakeLists.txt
@@ -189,6 +189,10 @@ if(projectSDL)
target_link_libraries(${Output} ${SDL_LIBRARY})
endif(projectSDL)
+if(Linux)
+ target_link_libraries(${Output} ${GTK2_LIBRARIES})
+endif(Linux)
+
if(NOT USER_CMAKE_LD_FLAGS STREQUAL "")
target_link_libraries(${Output} "${USER_CMAKE_LD_FLAGS}")
endif(NOT USER_CMAKE_LD_FLAGS STREQUAL "")
diff --git a/plugins/GSdx/GPURenderer.cpp b/plugins/GSdx/GPURenderer.cpp
index 7b71a41d4..05500ff6f 100644
--- a/plugins/GSdx/GPURenderer.cpp
+++ b/plugins/GSdx/GPURenderer.cpp
@@ -38,6 +38,7 @@ GPURenderer::GPURenderer(GSDevice* dev)
m_vsync = !!theApp.GetConfig("vsync", 0);
m_fxaa = !!theApp.GetConfig("fxaa", 0);
m_scale = m_mem.GetScale();
+ m_shadeboost = !!theApp.GetConfig("ShadeBoost", 0);
#ifdef _WINDOWS
@@ -117,6 +118,11 @@ bool GPURenderer::Merge()
m_dev->Merge(st, sr, dr, s, 1, 1, GSVector4(0, 0, 0, 1));
+ if(m_shadeboost)
+ {
+ m_dev->ShadeBoost();
+ }
+
if(m_fxaa)
{
m_dev->FXAA();
diff --git a/plugins/GSdx/GPURenderer.h b/plugins/GSdx/GPURenderer.h
index b1c41a45d..53adfa150 100644
--- a/plugins/GSdx/GPURenderer.h
+++ b/plugins/GSdx/GPURenderer.h
@@ -36,6 +36,7 @@ protected:
int m_aspectratio;
bool m_vsync;
bool m_fxaa;
+ bool m_shadeboost;
GSVector2i m_scale;
virtual void ResetDevice() {}
diff --git a/plugins/GSdx/GS.cpp b/plugins/GSdx/GS.cpp
index df1a20fdc..e59abc2a5 100644
--- a/plugins/GSdx/GS.cpp
+++ b/plugins/GSdx/GS.cpp
@@ -347,8 +347,17 @@ EXPORT_C_(int) GSopen2(void** dsp, uint32 flags)
{
#ifdef _WINDOWS
D3D_FEATURE_LEVEL level;
+ int best_sw_renderer = GSUtil::CheckDirect3D11Level(level) && level >= D3D_FEATURE_LEVEL_10_0 ? 4 : 1; // dx11 / dx9 sw
+
+ switch(renderer){
+ // Use alternative renderer (SW if currently using HW renderer, and vice versa, keeping the same DX level)
+ case 1: renderer = 0; break; // DX9: SW to HW
+ case 0: renderer = 1; break; // DX9: HW to SW
+ case 4: renderer = 3; break; // DX11: SW to HW
+ case 3: renderer = 4; break; // DX11: HW to SW
+ default: renderer = best_sw_renderer; // If wasn't using DX (e.g. SDL), use best SW renderer.
+ }
- renderer = GSUtil::CheckDirect3D11Level(level) && level >= D3D_FEATURE_LEVEL_10_0 ? 4 : 1; // dx11 / dx9 sw
#endif
}
diff --git a/plugins/GSdx/GSCrc.cpp b/plugins/GSdx/GSCrc.cpp
index 09d727613..5bffeb484 100644
--- a/plugins/GSdx/GSCrc.cpp
+++ b/plugins/GSdx/GSCrc.cpp
@@ -55,6 +55,7 @@ CRC::Game CRC::m_games[] =
{0x48FE0C71, FFX2, US, 0},
{0x8A6D7F14, FFX2, JP, 0},
{0xE1FD9A2D, FFX2, JP, 0}, // int.
+ {0x11624CD6, FFX2, KO, 0},
{0x78DA0252, FFXII, EU, 0},
{0xC1274668, FFXII, EU, 0},
{0xDC2A467E, FFXII, EU, 0},
@@ -85,16 +86,21 @@ CRC::Game CRC::m_games[] =
{0xAA31B5BF, MetalGearSolid3, US, 0},
{0x86BC3040, MetalGearSolid3, US, 0}, //Subsistance disc 1
{0x0481AD8A, MetalGearSolid3, JP, 0},
+ {0xC69ACB6F, MetalGearSolid3, KO, 0}, //MetalGearSolid 3 SnakeEater
+ {0xB0D195EF, MetalGearSolid3, KO, 0}, //MetalGearSolid 3 Substance disc1
+ {0x3EBABC9C, MetalGearSolid3, KO, 0}, //MetalGearSolid3Substance disc2
{0x278722BF, DBZBT2, US, 0},
{0xFE961D28, DBZBT2, US, 0},
{0x0393B6BE, DBZBT2, EU, 0},
{0xE2F289ED, DBZBT2, JP, 0}, // Sparking Neo!
+ {0xE29C09A3, DBZBT2, KO, 0}, //DragonBall Z Sparking Neo
{0x35AA84D1, DBZBT2, NoRegion, 0},
{0x428113C2, DBZBT3, US, 0},
{0xA422BB13, DBZBT3, EU, 0},
{0xF28D21F1, DBZBT3, JP, 0},
{0x983C53D2, DBZBT3, NoRegion, 0},
{0x983C53D3, DBZBT3, NoRegion, 0},
+ {0x9B0E119F, DBZBT3, KO, 0}, //DragonBall Z Sparking Meteo
{0x72B3802A, SFEX3, US, 0},
{0x71521863, SFEX3, US, 0},
{0x28703748, Bully, US, 0},
@@ -103,8 +109,11 @@ CRC::Game CRC::m_games[] =
{0x7D8F539A, SoTC, EU, 0},
{0x0F0C4A9C, SoTC, EU, 0},
{0x877F3436, SoTC, JP, 0},
+ {0xA17D6AAA, SoTC, KO, 0},
{0x3122B508, OnePieceGrandAdventure, US, 0},
{0x8DF14A24, OnePieceGrandAdventure, EU, 0},
+ {0xE446C9F9, OnePieceGrandAdventure, KO, 0},
+ {0xCA2073B3, OnePieceGrandBattle, KO, 0},
{0xB049DD5E, OnePieceGrandBattle, US, 0},
{0x5D02CC5B, OnePieceGrandBattle, NoRegion, 0},
{0x6F8545DB, ICO, US, 0},
@@ -157,6 +166,8 @@ CRC::Game CRC::m_games[] =
{0xEB001875, GodOfWar, EU, 0},
{0xCA052D22, GodOfWar, JP, 0},
{0xBFCC1795, GodOfWar, KO, 0},
+ {0x9567B7D6, GodOfWar, KO, 0},
+ {0x9B5C97BA, GodOfWar, KO, 0},
{0xA61A4C6D, GodOfWar, NoRegion, 0},
{0xE23D532B, GodOfWar, NoRegion, 0},
{0xDF1AF973, GodOfWar, NoRegion, 0},
@@ -176,6 +187,7 @@ CRC::Game CRC::m_games[] =
{0xBF6F101F, GiTS, US, 0},
{0x95CC86EF, GiTS, US, 0},
{0xA5768F53, GiTS, JP, 0},
+ {0xA3643EB1, GiTS, KO, 0},
{0x6BF11378, Onimusha3, US, 0},
{0x71320CA8, Onimusha3, JP, 0},
{0xDAFFFB0D, Onimusha3, KO, 0},
@@ -194,6 +206,7 @@ CRC::Game CRC::m_games[] =
{0xD71B57F4, Genji, US, 0},
{0xFADEBC45, Genji, EU, 0},
{0xB4776FC1, Genji, JP, 0},
+ {0x56242EC9, Genji, KO, 0},
{0x7D4EA48F, Genji, NoRegion, 0},
{0xE04EA200, StarOcean3, EU, 0},
{0x23A97857, StarOcean3, US, 0},
@@ -213,9 +226,12 @@ CRC::Game CRC::m_games[] =
{0xD60DA6D4, SMTNocturne, JP, ZWriteMustNotClear}, // SMTNocturne
{0x0E762E8D, SMTNocturne, JP, ZWriteMustNotClear}, // SMTNocturne Maniacs
{0x47BA9034, SMTNocturne, JP, ZWriteMustNotClear}, // SMTNocturne Maniacs Chronicle
+ {0xD3FFC263, SMTNocturne, KO, ZWriteMustNotClear},
{0xD7273511, SMTDDS1, US, ZWriteMustNotClear}, // SMT Digital Devil Saga
{0x1683A6BE, SMTDDS1, EU, ZWriteMustNotClear}, // SMT Digital Devil Saga
{0x44865CE1, SMTDDS1, JP, ZWriteMustNotClear}, // SMT Digital Devil Saga
+ {0xF2E397C0, SMTDDS1, KO, ZWriteMustNotClear}, // SMT Digital Devil Saga
+ {0x43202D1A, SMTDDS2, KO, ZWriteMustNotClear}, // SMT Digital Devil Saga 2
{0xD382C164, SMTDDS2, US, ZWriteMustNotClear}, // SMT Digital Devil Saga 2
{0xD568B684, SMTDDS2, EU, ZWriteMustNotClear}, // SMT Digital Devil Saga 2
{0xE47C1A9C, SMTDDS2, JP, ZWriteMustNotClear}, // SMT Digital Devil Saga 2
@@ -228,17 +244,22 @@ CRC::Game CRC::m_games[] =
{0x1969B19A, TenchuFS, ES, 0}, //PAL Spanish
{0x696BBEC3, TenchuFS, KO, 0},
{0x525C1994, TenchuFS, ASIA, 0},
+ {0x0D73BBCD, TenchuFS, KO, 0},
+ {0xAFBFB287, TenchuWoH, KO, 0},
{0x767E383D, TenchuWoH, US, 0},
{0x83261085, TenchuWoH, EU, 0}, //PAL German
{0x7FA1510D, TenchuWoH, EU, 0}, //PAL ES, IT
{0x13DD9957, TenchuWoH, JP, 0},
{0x8BC95883, Sly3, US, 0},
{0x8164C614, Sly3, EU, 0},
+ {0xA8CC1583, Sly3, KO, 0},
+ {0x518DD841, Sly2, KO, 0},
{0x07652DD9, Sly2, US, 0},
{0xFDA1CBF6, Sly2, EU, 0},
{0x15DD1F6F, Sly2, NoRegion, 0},
{0xA9C82AB9, DemonStone, US, 0},
{0x7C7578F3, DemonStone, EU, 0},
+ {0x22425C19, DemonStone, KO, 0},
{0x506644B3, BigMuthaTruckers, EU, 0},
{0x90F0D852, BigMuthaTruckers, US, 0},
{0x5CC9BF81, TimeSplitters2, EU, 0},
@@ -250,8 +271,10 @@ CRC::Game CRC::m_games[] =
{0xDC43F2B8, LordOfTheRingsTwoTowers, EU, 0},
{0x9ABF90FB, LordOfTheRingsTwoTowers, ES, 0},
{0xC0E909E9, LordOfTheRingsTwoTowers, JP, 0},
+ {0x6898435D, LordOfTheRingsTwoTowers, KO, 0},
{0xEB198738, LordOfTheRingsThirdAge, US, 0},
{0x614F4CF4, LordOfTheRingsThirdAge, EU, 0},
+ {0x37CD4279, LordOfTheRingsThirdAge, KO, 0},
{0xE169BAF8, RedDeadRevolver, US, 0},
{0xE2E67E23, RedDeadRevolver, EU, 0},
{0xEDDD6573, SpidermanWoS, US, 0}, //Web of Shadows
@@ -260,6 +283,7 @@ CRC::Game CRC::m_games[] =
{0x2498951B, SilentHill3, US, 0},
{0x5088CCDB, SilentHill3, EU, 0},
{0x8CFE667F, SilentHill3, JP, 0},
+ {0xC6CBDE91, SilentHill3, KO, 0},
{0x8E8E384B, SilentHill2, US, 0},
{0xFE06A030, SilentHill2, US, 0}, //greatest hits
{0xE36E16C9, SilentHill2, JP, 0},
@@ -268,9 +292,11 @@ CRC::Game CRC::m_games[] =
{0x6EB71AB0, BleachBladeBattlers, JP, 0}, //2nd
{0x3A446111, CastlevaniaCoD, US, 0},
{0xF321BC38, CastlevaniaCoD, EU, 0},
+ {0x950876FA, CastlevaniaCoD, KO, 0},
{0x28270F7D, CastlevaniaLoI, US, 0},
{0x306CDADA, CastlevaniaLoI, EU, 0},
{0xA36CFF6C, CastlevaniaLoI, JP, 0},
+ {0x9A93FE5D, CastlevaniaLoI, KO, 0},
{0x5C891FF1, Black, US, 0},
{0xCAA04879, Black, EU, 0},
{0xADDFF505, Black, EU, 0}, //?
@@ -284,6 +310,7 @@ CRC::Game CRC::m_games[] =
{0x568A5C78, DigimonRumbleArena2, US, 0},
{0x785E22BB, DigimonRumbleArena2, EU, 0},
{0x4C5CE4C3, DigimonRumbleArena2, EU, 0},
+ {0x115A184D, DigimonRumbleArena2, KO, 0},
{0x879CDA5E, StarWarsForceUnleashed, US, 0},
{0x137C792E, StarWarsForceUnleashed, US, 0},
{0x503BF9E1, StarWarsBattlefront, NoRegion, 0}, //EU and US versions have same CRC
@@ -296,11 +323,13 @@ CRC::Game CRC::m_games[] =
{0x7ADCB24A, DevilMayCry3, EU, 0},
{0x79C952B0, DevilMayCry3, JP, 0}, //SE
{0x7F3DDEAB, DevilMayCry3, JP, 0},
+ {0x05931990, DevilMayCry3, KO, 0},
{0xBEBF8793, BurnoutTakedown, US, 0},
{0x75BECC18, BurnoutTakedown, EU, 0},
{0xCE49B0DE, BurnoutTakedown, EU, 0},
{0xD224D348, BurnoutRevenge, US, 0},
{0x7E83CC5B, BurnoutRevenge, EU, 0},
+ {0xEEA60511, BurnoutRevenge, KO, 0},
{0x8C9576A1, BurnoutDominator, US, 0},
{0x8C9576B4, BurnoutDominator, EU, 0},
{0x4A0E5B3A, MidnightClub3, US, 0}, //dub
@@ -308,6 +337,7 @@ CRC::Game CRC::m_games[] =
{0x60A42FF5, MidnightClub3, US, 0}, //remix
{0x4B1A0FFA, XmenOriginsWolverine, US, 0},
{0xBFF3DBCB, CallofDutyFinalFronts, US, 0},
+ {0xB78A5F5A, CallofDutyFinalFronts, EU, 0},
{0xD03D4C77, SpyroNewBeginning, US, 0},
{0x0EE5646B, SpyroNewBeginning, EU, 0},
{0x7ACF7E03, SpyroNewBeginning, NoRegion, 0},
@@ -316,12 +346,14 @@ CRC::Game CRC::m_games[] =
{0xC95F0198, SpyroEternalNight, NoRegion, 0},
{0x43AB7214, TalesOfLegendia, US, 0},
{0x1F8640E0, TalesOfLegendia, JP, 0},
+ {0xE4F5DA2B, TalesOfLegendia, KO, 0},
{0x98C7B76D, NanoBreaker, US, 0},
{0x7098BE76, NanoBreaker, KO, 0},
{0x9B89F425, NanoBreaker, EU, 0},
{0x519E816B, Kunoichi, US, 0}, //Nightshade
{0x3FB419FD, Kunoichi, JP, 0},
{0x3B470BBD, Kunoichi, EU, 0},
+ {0x6BA65DD8, Kunoichi, KO, 0},
{0XD3F182A3, Yakuza, EU, 0},
{0x6F9F99F8, Yakuza, EU, 0},
{0x388F687B, Yakuza, US, 0},
@@ -357,7 +389,8 @@ CRC::Game CRC::Lookup(uint32 crc)
if(m_map.empty())
{
string exclusions = theApp.GetConfig( "CrcHacksExclusions", "" );
- printf( "GSdx: CrcHacksExclusions: %s\n", exclusions.c_str() );
+ if (exclusions.length() != 0)
+ printf( "GSdx: CrcHacksExclusions: %s\n", exclusions.c_str() );
for(int i = 0; i < countof(m_games); i++)
{
diff --git a/plugins/GSdx/GSDevice.cpp b/plugins/GSdx/GSDevice.cpp
index 8dbb1c881..348af8b68 100644
--- a/plugins/GSdx/GSDevice.cpp
+++ b/plugins/GSdx/GSDevice.cpp
@@ -32,6 +32,7 @@ GSDevice::GSDevice()
, m_weavebob(NULL)
, m_blend(NULL)
, m_fxaa(NULL)
+ , m_shadeboost(NULL)
, m_1x1(NULL)
, m_frame(0)
{
@@ -48,6 +49,7 @@ GSDevice::~GSDevice()
delete m_weavebob;
delete m_blend;
delete m_fxaa;
+ delete m_shadeboost;
delete m_1x1;
}
@@ -69,6 +71,7 @@ bool GSDevice::Reset(int w, int h)
delete m_weavebob;
delete m_blend;
delete m_fxaa;
+ delete m_shadeboost;
delete m_1x1;
m_backbuffer = NULL;
@@ -76,6 +79,7 @@ bool GSDevice::Reset(int w, int h)
m_weavebob = NULL;
m_blend = NULL;
m_fxaa = NULL;
+ m_shadeboost = NULL;
m_1x1 = NULL;
m_current = NULL; // current is special, points to other textures, no need to delete
@@ -317,6 +321,26 @@ void GSDevice::FXAA()
}
}
+void GSDevice::ShadeBoost()
+{
+ GSVector2i s = m_current->GetSize();
+
+ if(m_shadeboost == NULL || m_shadeboost->GetSize() != s)
+ {
+ delete m_shadeboost;
+ m_shadeboost = CreateRenderTarget(s.x, s.y, false);
+ }
+
+ if(m_shadeboost != NULL)
+ {
+ GSVector4 sr(0, 0, 1, 1);
+ GSVector4 dr(0, 0, s.x, s.y);
+
+ StretchRect(m_current, sr, m_shadeboost, dr, 0, false);
+ DoShadeBoost(m_shadeboost, m_current);
+ }
+}
+
bool GSDevice::ResizeTexture(GSTexture** t, int w, int h)
{
if(t == NULL) {ASSERT(0); return false;}
diff --git a/plugins/GSdx/GSDevice.h b/plugins/GSdx/GSDevice.h
index 3ce8770a2..44f2d82ae 100644
--- a/plugins/GSdx/GSDevice.h
+++ b/plugins/GSdx/GSDevice.h
@@ -55,6 +55,15 @@ public:
FXAAConstantBuffer() {memset(this, 0, sizeof(*this));}
};
+class ShadeBoostConstantBuffer
+{
+public:
+ GSVector4 rcpFrame;
+ GSVector4 rcpFrameOpt;
+
+ ShadeBoostConstantBuffer() {memset(this, 0, sizeof(*this));}
+};
+
#pragma pack(pop)
class GSDevice : public GSAlignedClass<32>
@@ -70,6 +79,7 @@ protected:
GSTexture* m_weavebob;
GSTexture* m_blend;
GSTexture* m_fxaa;
+ GSTexture* m_shadeboost;
GSTexture* m_1x1;
GSTexture* m_current;
struct {size_t stride, start, count, limit;} m_vertex;
@@ -82,6 +92,7 @@ protected:
virtual void DoMerge(GSTexture* st[2], GSVector4* sr, GSTexture* dt, GSVector4* dr, bool slbg, bool mmod, const GSVector4& c) = 0;
virtual void DoInterlace(GSTexture* st, GSTexture* dt, int shader, bool linear, float yoffset) = 0;
virtual void DoFXAA(GSTexture* st, GSTexture* dt) {}
+ virtual void DoShadeBoost(GSTexture* st, GSTexture* dt) {}
public:
GSDevice();
@@ -134,6 +145,7 @@ public:
void Merge(GSTexture* st[2], GSVector4* sr, GSVector4* dr, const GSVector2i& fs, bool slbg, bool mmod, const GSVector4& c);
void Interlace(const GSVector2i& ds, int field, int mode, float yoffset);
void FXAA();
+ void ShadeBoost();
bool ResizeTexture(GSTexture** t, int w, int h);
diff --git a/plugins/GSdx/GSDevice11.cpp b/plugins/GSdx/GSDevice11.cpp
index f936be407..3d355349e 100644
--- a/plugins/GSdx/GSDevice11.cpp
+++ b/plugins/GSdx/GSDevice11.cpp
@@ -201,6 +201,36 @@ bool GSDevice11::Create(GSWnd* wnd)
hr = CompileShader(IDR_INTERLACE_FX, format("ps_main%d", i).c_str(), NULL, &m_interlace.ps[i]);
}
+ // Shade Boost
+
+ int ShadeBoost_Contrast = theApp.GetConfig("ShadeBoost_Contrast", 50);
+ int ShadeBoost_Brightness = theApp.GetConfig("ShadeBoost_Brightness", 50);
+ int ShadeBoost_Saturation = theApp.GetConfig("ShadeBoost_Saturation", 50);
+
+ string str[3];
+
+ str[0] = format("%d", ShadeBoost_Saturation);
+ str[1] = format("%d", ShadeBoost_Brightness);
+ str[2] = format("%d", ShadeBoost_Contrast);
+
+ D3D11_SHADER_MACRO macro[] =
+ {
+ {"SB_SATURATION", str[0].c_str()},
+ {"SB_BRIGHTNESS", str[1].c_str()},
+ {"SB_CONTRAST", str[2].c_str()},
+ {NULL, NULL},
+ };
+
+ memset(&bd, 0, sizeof(bd));
+
+ bd.ByteWidth = sizeof(ShadeBoostConstantBuffer);
+ bd.Usage = D3D11_USAGE_DEFAULT;
+ bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
+
+ hr = m_dev->CreateBuffer(&bd, NULL, &m_shadeboost.cb);
+
+ hr = CompileShader(IDR_SHADEBOOST_FX, "ps_main", macro, &m_shadeboost.ps);
+
// fxaa
memset(&bd, 0, sizeof(bd));
@@ -670,6 +700,23 @@ void GSDevice11::DoFXAA(GSTexture* st, GSTexture* dt)
//dt->Save("c:\\temp1\\2.bmp");
}
+void GSDevice11::DoShadeBoost(GSTexture* st, GSTexture* dt)
+{
+ GSVector2i s = dt->GetSize();
+
+ GSVector4 sr(0, 0, 1, 1);
+ GSVector4 dr(0, 0, s.x, s.y);
+
+ ShadeBoostConstantBuffer cb;
+
+ cb.rcpFrame = GSVector4(1.0f / s.x, 1.0f / s.y, 0.0f, 0.0f);
+ cb.rcpFrameOpt = GSVector4::zero();
+
+ m_ctx->UpdateSubresource(m_shadeboost.cb, 0, NULL, &cb, 0, 0);
+
+ StretchRect(st, sr, dt, dr, m_shadeboost.ps, m_shadeboost.cb, true);
+}
+
void GSDevice11::SetupDATE(GSTexture* rt, GSTexture* ds, const GSVertexPT1* vertices, bool datm)
{
const GSVector2i& size = rt->GetSize();
diff --git a/plugins/GSdx/GSDevice11.h b/plugins/GSdx/GSDevice11.h
index 8e8b4afb9..33ec350d8 100644
--- a/plugins/GSdx/GSDevice11.h
+++ b/plugins/GSdx/GSDevice11.h
@@ -37,6 +37,7 @@ class GSDevice11 : public GSDeviceDX
void DoMerge(GSTexture* st[2], GSVector4* sr, GSTexture* dt, GSVector4* dr, bool slbg, bool mmod, const GSVector4& c);
void DoInterlace(GSTexture* st, GSTexture* dt, int shader, bool linear, float yoffset = 0);
void DoFXAA(GSTexture* st, GSTexture* dt);
+ void DoShadeBoost(GSTexture* st, GSTexture* dt);
//
@@ -110,6 +111,12 @@ public: // TODO
CComPtr cb;
} m_fxaa;
+ struct
+ {
+ CComPtr ps;
+ CComPtr cb;
+ } m_shadeboost;
+
struct
{
CComPtr dss;
diff --git a/plugins/GSdx/GSDevice9.cpp b/plugins/GSdx/GSDevice9.cpp
index b912b9019..f9fc212a4 100644
--- a/plugins/GSdx/GSDevice9.cpp
+++ b/plugins/GSdx/GSDevice9.cpp
@@ -137,9 +137,9 @@ uint32 GSDevice9::GetMaxDepth(uint32 msaa = 0)
void GSDevice9::ForceValidMsaaConfig()
{
- if(0 == GetMaxDepth(theApp.GetConfig("msaa", 0)))
+ if(0 == GetMaxDepth(theApp.GetConfig("UserHacks_MSAA", 0)))
{
- theApp.SetConfig("msaa", 0); // replace invalid msaa value in ini file with 0.
+ theApp.SetConfig("UserHacks_MSAA", 0); // replace invalid msaa value in ini file with 0.
}
};
@@ -282,6 +282,28 @@ bool GSDevice9::Create(GSWnd* wnd)
CompileShader(IDR_INTERLACE_FX, format("ps_main%d", i), NULL, &m_interlace.ps[i]);
}
+ // Shade Boost
+
+ int ShadeBoost_Contrast = theApp.GetConfig("ShadeBoost_Contrast", 50);
+ int ShadeBoost_Brightness = theApp.GetConfig("ShadeBoost_Brightness", 50);
+ int ShadeBoost_Saturation = theApp.GetConfig("ShadeBoost_Saturation", 50);
+
+ string str[3];
+
+ str[0] = format("%d", ShadeBoost_Saturation);
+ str[1] = format("%d", ShadeBoost_Brightness);
+ str[2] = format("%d", ShadeBoost_Contrast);
+
+ D3DXMACRO macro[] =
+ {
+ {"SB_SATURATION", str[0].c_str()},
+ {"SB_BRIGHTNESS", str[1].c_str()},
+ {"SB_CONTRAST", str[2].c_str()},
+ {NULL, NULL},
+ };
+
+ CompileShader(IDR_SHADEBOOST_FX, "ps_main", macro, &m_shadeboost.ps);
+
// fxaa
CompileShader(IDR_FXAA_FX, "ps_main", NULL, &m_fxaa.ps);
@@ -860,6 +882,21 @@ void GSDevice9::DoFXAA(GSTexture* st, GSTexture* dt)
StretchRect(st, sr, dt, dr, m_fxaa.ps, (const float*)&cb, 2, true);
}
+void GSDevice9::DoShadeBoost(GSTexture* st, GSTexture* dt)
+{
+ GSVector2i s = dt->GetSize();
+
+ GSVector4 sr(0, 0, 1, 1);
+ GSVector4 dr(0, 0, s.x, s.y);
+
+ ShadeBoostConstantBuffer cb;
+
+ cb.rcpFrame = GSVector4(1.0f / s.x, 1.0f / s.y, 0.0f, 0.0f);
+ cb.rcpFrameOpt = GSVector4::zero();
+
+ StretchRect(st, sr, dt, dr, m_shadeboost.ps, (const float*)&cb, 1, true);
+}
+
void GSDevice9::SetupDATE(GSTexture* rt, GSTexture* ds, const GSVertexPT1* vertices, bool datm)
{
const GSVector2i& size = rt->GetSize();
diff --git a/plugins/GSdx/GSDevice9.h b/plugins/GSdx/GSDevice9.h
index 319e063d0..1c7c7d8c9 100644
--- a/plugins/GSdx/GSDevice9.h
+++ b/plugins/GSdx/GSDevice9.h
@@ -72,6 +72,7 @@ class GSDevice9 : public GSDeviceDX
void DoMerge(GSTexture* st[2], GSVector4* sr, GSTexture* dt, GSVector4* dr, bool slbg, bool mmod, const GSVector4& c);
void DoInterlace(GSTexture* st, GSTexture* dt, int shader, bool linear, float yoffset = 0);
void DoFXAA(GSTexture* st, GSTexture* dt);
+ void DoShadeBoost(GSTexture* st, GSTexture* dt);
//
@@ -139,6 +140,11 @@ public: // TODO
CComPtr ps;
} m_fxaa;
+ struct
+ {
+ CComPtr ps;
+ } m_shadeboost;
+
struct
{
Direct3DDepthStencilState9 dss;
diff --git a/plugins/GSdx/GSDeviceDX.cpp b/plugins/GSdx/GSDeviceDX.cpp
index 160e3130d..eca5e6905 100644
--- a/plugins/GSdx/GSDeviceDX.cpp
+++ b/plugins/GSdx/GSDeviceDX.cpp
@@ -25,7 +25,7 @@
GSDeviceDX::GSDeviceDX()
{
- m_msaa = theApp.GetConfig("msaa", 0);
+ m_msaa = !!theApp.GetConfig("UserHacks", 0) ? theApp.GetConfig("UserHacks_MSAA", 0) : 0;
m_msaa_desc.Count = 1;
m_msaa_desc.Quality = 0;
diff --git a/plugins/GSdx/GSDeviceDX.h b/plugins/GSdx/GSDeviceDX.h
index 4ce845665..84b76b019 100644
--- a/plugins/GSdx/GSDeviceDX.h
+++ b/plugins/GSdx/GSDeviceDX.h
@@ -76,6 +76,7 @@ public:
uint32 fst:1;
uint32 logz:1;
uint32 rtcopy:1;
+ uint32 wildhack:2;
};
uint32 key;
@@ -173,6 +174,7 @@ public:
uint32 ltf:1;
uint32 colclip:2;
uint32 date:2;
+ uint32 spritehack:1;
};
uint32 key;
diff --git a/plugins/GSdx/GSDrawScanline.cpp b/plugins/GSdx/GSDrawScanline.cpp
index af79af75f..2f9613f8a 100644
--- a/plugins/GSdx/GSDrawScanline.cpp
+++ b/plugins/GSdx/GSDrawScanline.cpp
@@ -103,8 +103,6 @@ void GSDrawScanline::EndDraw(uint64 frame, uint64 ticks, int pixels)
#ifndef ENABLE_JIT_RASTERIZER
-// FIXME: something's not right with the sky in burnout 3
-
void GSDrawScanline::SetupPrim(const GSVertexSW* vertex, const uint32* index, const GSVertexSW& dscan)
{
GSScanlineSelector sel = m_global.sel;
@@ -326,7 +324,7 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
}
else if(sel.ltf)
{
- vf = v.xxzzlh().srl16(16 - GS_BILINEAR_PRECISION).sll16(15 - GS_BILINEAR_PRECISION);
+ vf = v.xxzzlh().srl16(12);
}
s = GSVector4::cast(u);
@@ -516,8 +514,8 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
u -= 0x8000;
v -= 0x8000;
- uf = u.xxzzlh().srl16(16 - GS_BILINEAR_PRECISION).sll16(15 - GS_BILINEAR_PRECISION);
- vf = v.xxzzlh().srl16(16 - GS_BILINEAR_PRECISION).sll16(15 - GS_BILINEAR_PRECISION);
+ uf = u.xxzzlh().srl16(12);
+ vf = v.xxzzlh().srl16(12);
}
GSVector4i uv0 = u.sra32(16).ps32(v.sra32(16));
@@ -583,19 +581,19 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
GSVector4i rb01 = c01.sll16(8).srl16(8);
GSVector4i ga01 = c01.srl16(8);
- rb00 = rb00.lerp16<0>(rb01, uf);
- ga00 = ga00.lerp16<0>(ga01, uf);
+ rb00 = rb00.lerp16_4(rb01, uf);
+ ga00 = ga00.lerp16_4(ga01, uf);
GSVector4i rb10 = c10.sll16(8).srl16(8);
GSVector4i ga10 = c10.srl16(8);
GSVector4i rb11 = c11.sll16(8).srl16(8);
GSVector4i ga11 = c11.srl16(8);
- rb10 = rb10.lerp16<0>(rb11, uf);
- ga10 = ga10.lerp16<0>(ga11, uf);
+ rb10 = rb10.lerp16_4(rb11, uf);
+ ga10 = ga10.lerp16_4(ga11, uf);
- rb = rb00.lerp16<0>(rb10, vf);
- ga = ga00.lerp16<0>(ga10, vf);
+ rb = rb00.lerp16_4(rb10, vf);
+ ga = ga00.lerp16_4(ga10, vf);
}
else
{
@@ -637,8 +635,8 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
u -= 0x8000;
v -= 0x8000;
- uf = u.xxzzlh().srl16(16 - GS_BILINEAR_PRECISION).sll16(15 - GS_BILINEAR_PRECISION);
- vf = v.xxzzlh().srl16(16 - GS_BILINEAR_PRECISION).sll16(15 - GS_BILINEAR_PRECISION);
+ uf = u.xxzzlh().srl16(12);
+ vf = v.xxzzlh().srl16(12);
}
GSVector4i uv0 = u.sra32(16).ps32(v.sra32(16));
@@ -704,19 +702,19 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
GSVector4i rb01 = c01.sll16(8).srl16(8);
GSVector4i ga01 = c01.srl16(8);
- rb00 = rb00.lerp16<0>(rb01, uf);
- ga00 = ga00.lerp16<0>(ga01, uf);
+ rb00 = rb00.lerp16_4(rb01, uf);
+ ga00 = ga00.lerp16_4(ga01, uf);
GSVector4i rb10 = c10.sll16(8).srl16(8);
GSVector4i ga10 = c10.srl16(8);
GSVector4i rb11 = c11.sll16(8).srl16(8);
GSVector4i ga11 = c11.srl16(8);
- rb10 = rb10.lerp16<0>(rb11, uf);
- ga10 = ga10.lerp16<0>(ga11, uf);
+ rb10 = rb10.lerp16_4(rb11, uf);
+ ga10 = ga10.lerp16_4(ga11, uf);
- rb2 = rb00.lerp16<0>(rb10, vf);
- ga2 = ga00.lerp16<0>(ga10, vf);
+ rb2 = rb00.lerp16_4(rb10, vf);
+ ga2 = ga00.lerp16_4(ga10, vf);
}
else
{
@@ -747,7 +745,7 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
rb = rb.lerp16<0>(rb2, lodf);
ga = ga.lerp16<0>(ga2, lodf);
- }
+ }
}
else
{
@@ -772,11 +770,11 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
if(sel.ltf)
{
- uf = u.xxzzlh().srl16(16 - GS_BILINEAR_PRECISION).sll16(15 - GS_BILINEAR_PRECISION);
+ uf = u.xxzzlh().srl16(12);
if(sel.prim != GS_SPRITE_CLASS)
{
- vf = v.xxzzlh().srl16(16 - GS_BILINEAR_PRECISION).sll16(15 - GS_BILINEAR_PRECISION);
+ vf = v.xxzzlh().srl16(12);
}
}
@@ -837,19 +835,19 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
GSVector4i rb01 = c01.sll16(8).srl16(8);
GSVector4i ga01 = c01.srl16(8);
- rb00 = rb00.lerp16<0>(rb01, uf);
- ga00 = ga00.lerp16<0>(ga01, uf);
+ rb00 = rb00.lerp16_4(rb01, uf);
+ ga00 = ga00.lerp16_4(ga01, uf);
GSVector4i rb10 = c10.sll16(8).srl16(8);
GSVector4i ga10 = c10.srl16(8);
GSVector4i rb11 = c11.sll16(8).srl16(8);
GSVector4i ga11 = c11.srl16(8);
- rb10 = rb10.lerp16<0>(rb11, uf);
- ga10 = ga10.lerp16<0>(ga11, uf);
+ rb10 = rb10.lerp16_4(rb11, uf);
+ ga10 = ga10.lerp16_4(ga11, uf);
- rb = rb00.lerp16<0>(rb10, vf);
- ga = ga00.lerp16<0>(ga10, vf);
+ rb = rb00.lerp16_4(rb10, vf);
+ ga = ga00.lerp16_4(ga10, vf);
}
else
{
@@ -1179,6 +1177,15 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
case 2: break;
}
}
+ else
+ {
+ switch(sel.abd)
+ {
+ case 0: break;
+ case 1: ga = gad; break;
+ case 2: ga = GSVector4i::zero(); break;
+ }
+ }
if(sel.pabe)
{
diff --git a/plugins/GSdx/GSDrawScanlineCodeGenerator.cpp b/plugins/GSdx/GSDrawScanlineCodeGenerator.cpp
index 7309f75fe..e2d731978 100644
--- a/plugins/GSdx/GSDrawScanlineCodeGenerator.cpp
+++ b/plugins/GSdx/GSDrawScanlineCodeGenerator.cpp
@@ -97,6 +97,25 @@ void GSDrawScanlineCodeGenerator::lerp16(const Xmm& a, const Xmm& b, const Xmm&
#endif
}
+void GSDrawScanlineCodeGenerator::lerp16_4(const Xmm& a, const Xmm& b, const Xmm& f)
+{
+ #if _M_SSE >= 0x500
+
+ vpsubw(a, b);
+ vpmullw(a, f);
+ vpsraw(a, 4);
+ vpaddw(a, b);
+
+ #else
+
+ psubw(a, b);
+ pmullw(a, f);
+ psraw(a, 4);
+ paddw(a, b);
+
+ #endif
+}
+
void GSDrawScanlineCodeGenerator::mix16(const Xmm& a, const Xmm& b, const Xmm& temp)
{
#if _M_SSE >= 0x500
diff --git a/plugins/GSdx/GSDrawScanlineCodeGenerator.h b/plugins/GSdx/GSDrawScanlineCodeGenerator.h
index 4b5b6c746..73f4b59f0 100644
--- a/plugins/GSdx/GSDrawScanlineCodeGenerator.h
+++ b/plugins/GSdx/GSDrawScanlineCodeGenerator.h
@@ -71,6 +71,7 @@ class GSDrawScanlineCodeGenerator : public GSCodeGenerator
void modulate16(const Xmm& a, const Operand& f, int shift);
void lerp16(const Xmm& a, const Xmm& b, const Xmm& f, int shift);
+ void lerp16_4(const Xmm& a, const Xmm& b, const Xmm& f);
void mix16(const Xmm& a, const Xmm& b, const Xmm& temp);
void clamp16(const Xmm& a, const Xmm& temp);
void alltrue();
diff --git a/plugins/GSdx/GSDrawScanlineCodeGenerator.x86.avx.cpp b/plugins/GSdx/GSDrawScanlineCodeGenerator.x86.avx.cpp
index c0d938f10..374b3d24f 100644
--- a/plugins/GSdx/GSDrawScanlineCodeGenerator.x86.avx.cpp
+++ b/plugins/GSdx/GSDrawScanlineCodeGenerator.x86.avx.cpp
@@ -389,8 +389,7 @@ void GSDrawScanlineCodeGenerator::Init()
{
vpshuflw(xmm6, xmm3, _MM_SHUFFLE(2, 2, 0, 0));
vpshufhw(xmm6, xmm6, _MM_SHUFFLE(2, 2, 0, 0));
- vpsrlw(xmm6, 16 - GS_BILINEAR_PRECISION);
- if(GS_BILINEAR_PRECISION < 15) vpsllw(xmm6, 15 - GS_BILINEAR_PRECISION);
+ vpsrlw(xmm6, 12);
vmovdqa(ptr[&m_local.temp.vf], xmm6);
}
}
@@ -743,8 +742,7 @@ void GSDrawScanlineCodeGenerator::SampleTexture()
vpshuflw(xmm0, xmm2, _MM_SHUFFLE(2, 2, 0, 0));
vpshufhw(xmm0, xmm0, _MM_SHUFFLE(2, 2, 0, 0));
- vpsrlw(xmm0, 16 - GS_BILINEAR_PRECISION);
- if(GS_BILINEAR_PRECISION < 15) vpsllw(xmm0, 15 - GS_BILINEAR_PRECISION);
+ vpsrlw(xmm0, 12);
vmovdqa(ptr[&m_local.temp.uf], xmm0);
if(m_sel.prim != GS_SPRITE_CLASS)
@@ -753,8 +751,7 @@ void GSDrawScanlineCodeGenerator::SampleTexture()
vpshuflw(xmm0, xmm3, _MM_SHUFFLE(2, 2, 0, 0));
vpshufhw(xmm0, xmm0, _MM_SHUFFLE(2, 2, 0, 0));
- vpsrlw(xmm0, 16 - GS_BILINEAR_PRECISION);
- if(GS_BILINEAR_PRECISION < 15) vpsllw(xmm0, 15 - GS_BILINEAR_PRECISION);
+ vpsrlw(xmm0, 12);
vmovdqa(ptr[&m_local.temp.vf], xmm0);
}
}
@@ -878,11 +875,11 @@ void GSDrawScanlineCodeGenerator::SampleTexture()
// xmm5 = c11
// xmm7 = used
- // rb00 = rb00.lerp16<0>(rb01, uf);
- // ga00 = ga00.lerp16<0>(ga01, uf);
+ // rb00 = rb00.lerp16_4(rb01, uf);
+ // ga00 = ga00.lerp16_4(ga01, uf);
- lerp16(xmm3, xmm2, xmm0, 0);
- lerp16(xmm4, xmm6, xmm0, 0);
+ lerp16_4(xmm3, xmm2, xmm0);
+ lerp16_4(xmm4, xmm6, xmm0);
// xmm0 = uf
// xmm3 = rb00
@@ -915,11 +912,11 @@ void GSDrawScanlineCodeGenerator::SampleTexture()
// xmm6 = ga11
// xmm7 = used
- // rb10 = rb10.lerp16<0>(rb11, uf);
- // ga10 = ga10.lerp16<0>(ga11, uf);
+ // rb10 = rb10.lerp16_4(rb11, uf);
+ // ga10 = ga10.lerp16_4(ga11, uf);
- lerp16(xmm5, xmm1, xmm0, 0);
- lerp16(xmm6, xmm2, xmm0, 0);
+ lerp16_4(xmm5, xmm1, xmm0);
+ lerp16_4(xmm6, xmm2, xmm0);
// xmm3 = rb00
// xmm4 = ga00
@@ -928,13 +925,13 @@ void GSDrawScanlineCodeGenerator::SampleTexture()
// xmm0, xmm1, xmm2 = free
// xmm7 = used
- // rb00 = rb00.lerp16<0>(rb10, vf);
- // ga00 = ga00.lerp16<0>(ga10, vf);
+ // rb00 = rb00.lerp16_4(rb10, vf);
+ // ga00 = ga00.lerp16_4(ga10, vf);
vmovdqa(xmm0, ptr[&m_local.temp.vf]);
- lerp16(xmm5, xmm3, xmm0, 0);
- lerp16(xmm6, xmm4, xmm0, 0);
+ lerp16_4(xmm5, xmm3, xmm0);
+ lerp16_4(xmm6, xmm4, xmm0);
}
else
{
@@ -1298,16 +1295,14 @@ return;
vpshuflw(xmm0, xmm2, _MM_SHUFFLE(2, 2, 0, 0));
vpshufhw(xmm0, xmm0, _MM_SHUFFLE(2, 2, 0, 0));
- vpsrlw(xmm0, 16 - GS_BILINEAR_PRECISION);
- if(GS_BILINEAR_PRECISION < 15) vpsllw(xmm0, 15 - GS_BILINEAR_PRECISION);
+ vpsrlw(xmm0, 12);
vmovdqa(ptr[&m_local.temp.uf], xmm0);
// GSVector4i vf = v.xxzzlh().srl16(1);
vpshuflw(xmm0, xmm3, _MM_SHUFFLE(2, 2, 0, 0));
vpshufhw(xmm0, xmm0, _MM_SHUFFLE(2, 2, 0, 0));
- vpsrlw(xmm0, 16 - GS_BILINEAR_PRECISION);
- if(GS_BILINEAR_PRECISION < 15) vpsllw(xmm0, 15 - GS_BILINEAR_PRECISION);
+ vpsrlw(xmm0, 12);
vmovdqa(ptr[&m_local.temp.vf], xmm0);
}
@@ -1430,11 +1425,11 @@ return;
// xmm5 = c11
// xmm7 = used
- // rb00 = rb00.lerp16<0>(rb01, uf);
- // ga00 = ga00.lerp16<0>(ga01, uf);
+ // rb00 = rb00.lerp16_4(rb01, uf);
+ // ga00 = ga00.lerp16_4(ga01, uf);
- lerp16(xmm3, xmm2, xmm0, 0);
- lerp16(xmm4, xmm6, xmm0, 0);
+ lerp16_4(xmm3, xmm2, xmm0);
+ lerp16_4(xmm4, xmm6, xmm0);
// xmm0 = uf
// xmm3 = rb00
@@ -1467,11 +1462,11 @@ return;
// xmm6 = ga11
// xmm7 = used
- // rb10 = rb10.lerp16<0>(rb11, uf);
- // ga10 = ga10.lerp16<0>(ga11, uf);
+ // rb10 = rb10.lerp16_4(rb11, uf);
+ // ga10 = ga10.lerp16_4(ga11, uf);
- lerp16(xmm5, xmm1, xmm0, 0);
- lerp16(xmm6, xmm2, xmm0, 0);
+ lerp16_4(xmm5, xmm1, xmm0);
+ lerp16_4(xmm6, xmm2, xmm0);
// xmm3 = rb00
// xmm4 = ga00
@@ -1480,13 +1475,13 @@ return;
// xmm0, xmm1, xmm2 = free
// xmm7 = used
- // rb00 = rb00.lerp16<0>(rb10, vf);
- // ga00 = ga00.lerp16<0>(ga10, vf);
+ // rb00 = rb00.lerp16_4(rb10, vf);
+ // ga00 = ga00.lerp16_4(ga10, vf);
vmovdqa(xmm0, ptr[&m_local.temp.vf]);
- lerp16(xmm5, xmm3, xmm0, 0);
- lerp16(xmm6, xmm4, xmm0, 0);
+ lerp16_4(xmm5, xmm3, xmm0);
+ lerp16_4(xmm6, xmm4, xmm0);
}
else
{
@@ -1541,16 +1536,14 @@ return;
vpshuflw(xmm0, xmm2, _MM_SHUFFLE(2, 2, 0, 0));
vpshufhw(xmm0, xmm0, _MM_SHUFFLE(2, 2, 0, 0));
- vpsrlw(xmm0, 16 - GS_BILINEAR_PRECISION);
- if(GS_BILINEAR_PRECISION < 15) vpsllw(xmm0, 15 - GS_BILINEAR_PRECISION);
+ vpsrlw(xmm0, 12);
vmovdqa(ptr[&m_local.temp.uf], xmm0);
// GSVector4i vf = v.xxzzlh().srl16(1);
vpshuflw(xmm0, xmm3, _MM_SHUFFLE(2, 2, 0, 0));
vpshufhw(xmm0, xmm0, _MM_SHUFFLE(2, 2, 0, 0));
- vpsrlw(xmm0, 16 - GS_BILINEAR_PRECISION);
- if(GS_BILINEAR_PRECISION < 15) vpsllw(xmm0, 15 - GS_BILINEAR_PRECISION);
+ vpsrlw(xmm0, 12);
vmovdqa(ptr[&m_local.temp.vf], xmm0);
}
@@ -1673,11 +1666,11 @@ return;
// xmm5 = c11
// xmm7 = used
- // rb00 = rb00.lerp16<0>(rb01, uf);
- // ga00 = ga00.lerp16<0>(ga01, uf);
+ // rb00 = rb00.lerp16_4(rb01, uf);
+ // ga00 = ga00.lerp16_4(ga01, uf);
- lerp16(xmm3, xmm2, xmm0, 0);
- lerp16(xmm4, xmm6, xmm0, 0);
+ lerp16_4(xmm3, xmm2, xmm0);
+ lerp16_4(xmm4, xmm6, xmm0);
// xmm0 = uf
// xmm3 = rb00
@@ -1710,11 +1703,11 @@ return;
// xmm6 = ga11
// xmm7 = used
- // rb10 = rb10.lerp16<0>(rb11, uf);
- // ga10 = ga10.lerp16<0>(ga11, uf);
+ // rb10 = rb10.lerp16_4(rb11, uf);
+ // ga10 = ga10.lerp16_4(ga11, uf);
- lerp16(xmm5, xmm1, xmm0, 0);
- lerp16(xmm6, xmm2, xmm0, 0);
+ lerp16_4(xmm5, xmm1, xmm0);
+ lerp16_4(xmm6, xmm2, xmm0);
// xmm3 = rb00
// xmm4 = ga00
@@ -1723,13 +1716,13 @@ return;
// xmm0, xmm1, xmm2 = free
// xmm7 = used
- // rb00 = rb00.lerp16<0>(rb10, vf);
- // ga00 = ga00.lerp16<0>(ga10, vf);
+ // rb00 = rb00.lerp16_4(rb10, vf);
+ // ga00 = ga00.lerp16_4(ga10, vf);
vmovdqa(xmm0, ptr[&m_local.temp.vf]);
- lerp16(xmm5, xmm3, xmm0, 0);
- lerp16(xmm6, xmm4, xmm0, 0);
+ lerp16_4(xmm5, xmm3, xmm0);
+ lerp16_4(xmm6, xmm4, xmm0);
}
else
{
diff --git a/plugins/GSdx/GSDrawScanlineCodeGenerator.x86.cpp b/plugins/GSdx/GSDrawScanlineCodeGenerator.x86.cpp
index b37dc1163..51ba25f4b 100644
--- a/plugins/GSdx/GSDrawScanlineCodeGenerator.x86.cpp
+++ b/plugins/GSdx/GSDrawScanlineCodeGenerator.x86.cpp
@@ -389,8 +389,7 @@ void GSDrawScanlineCodeGenerator::Init()
{
pshuflw(xmm6, xmm3, _MM_SHUFFLE(2, 2, 0, 0));
pshufhw(xmm6, xmm6, _MM_SHUFFLE(2, 2, 0, 0));
- psrlw(xmm6, 16 - GS_BILINEAR_PRECISION);
- if(GS_BILINEAR_PRECISION < 15) psllw(xmm6, 15 - GS_BILINEAR_PRECISION);
+ psrlw(xmm6, 12);
movdqa(ptr[&m_local.temp.vf], xmm6);
}
}
@@ -748,8 +747,7 @@ void GSDrawScanlineCodeGenerator::SampleTexture()
pshuflw(xmm0, xmm2, _MM_SHUFFLE(2, 2, 0, 0));
pshufhw(xmm0, xmm0, _MM_SHUFFLE(2, 2, 0, 0));
- psrlw(xmm0, 16 - GS_BILINEAR_PRECISION);
- if(GS_BILINEAR_PRECISION < 15) psllw(xmm0, 15 - GS_BILINEAR_PRECISION);
+ psrlw(xmm0, 12);
movdqa(ptr[&m_local.temp.uf], xmm0);
if(m_sel.prim != GS_SPRITE_CLASS)
@@ -758,8 +756,7 @@ void GSDrawScanlineCodeGenerator::SampleTexture()
pshuflw(xmm0, xmm3, _MM_SHUFFLE(2, 2, 0, 0));
pshufhw(xmm0, xmm0, _MM_SHUFFLE(2, 2, 0, 0));
- psrlw(xmm0, 16 - GS_BILINEAR_PRECISION);
- if(GS_BILINEAR_PRECISION < 15) psllw(xmm0, 15 - GS_BILINEAR_PRECISION);
+ psrlw(xmm0, 12);
movdqa(ptr[&m_local.temp.vf], xmm0);
}
}
@@ -891,11 +888,11 @@ void GSDrawScanlineCodeGenerator::SampleTexture()
// xmm5 = c11
// xmm7 = used
- // rb00 = rb00.lerp16<0>(rb01, uf);
- // ga00 = ga00.lerp16<0>(ga01, uf);
+ // rb00 = rb00.lerp_4(rb01, uf);
+ // ga00 = ga00.lerp_4(ga01, uf);
- lerp16(xmm3, xmm2, xmm0, 0);
- lerp16(xmm4, xmm6, xmm0, 0);
+ lerp16_4(xmm3, xmm2, xmm0);
+ lerp16_4(xmm4, xmm6, xmm0);
// xmm0 = uf
// xmm3 = rb00
@@ -930,11 +927,11 @@ void GSDrawScanlineCodeGenerator::SampleTexture()
// xmm6 = ga11
// xmm7 = used
- // rb10 = rb10.lerp16<0>(rb11, uf);
- // ga10 = ga10.lerp16<0>(ga11, uf);
+ // rb10 = rb10.lerp_4(rb11, uf);
+ // ga10 = ga10.lerp_4(ga11, uf);
- lerp16(xmm5, xmm1, xmm0, 0);
- lerp16(xmm6, xmm2, xmm0, 0);
+ lerp16_4(xmm5, xmm1, xmm0);
+ lerp16_4(xmm6, xmm2, xmm0);
// xmm3 = rb00
// xmm4 = ga00
@@ -943,13 +940,13 @@ void GSDrawScanlineCodeGenerator::SampleTexture()
// xmm0, xmm1, xmm2 = free
// xmm7 = used
- // rb00 = rb00.lerp16<0>(rb10, vf);
- // ga00 = ga00.lerp16<0>(ga10, vf);
+ // rb00 = rb00.lerp_4(rb10, vf);
+ // ga00 = ga00.lerp_4(ga10, vf);
movdqa(xmm0, ptr[&m_local.temp.vf]);
- lerp16(xmm5, xmm3, xmm0, 0);
- lerp16(xmm6, xmm4, xmm0, 0);
+ lerp16_4(xmm5, xmm3, xmm0);
+ lerp16_4(xmm6, xmm4, xmm0);
}
else
{
@@ -1353,16 +1350,14 @@ void GSDrawScanlineCodeGenerator::SampleTextureLOD()
pshuflw(xmm0, xmm2, _MM_SHUFFLE(2, 2, 0, 0));
pshufhw(xmm0, xmm0, _MM_SHUFFLE(2, 2, 0, 0));
- psrlw(xmm0, 16 - GS_BILINEAR_PRECISION);
- if(GS_BILINEAR_PRECISION < 15) psllw(xmm0, 15 - GS_BILINEAR_PRECISION);
+ psrlw(xmm0, 12);
movdqa(ptr[&m_local.temp.uf], xmm0);
// GSVector4i vf = v.xxzzlh().srl16(1);
pshuflw(xmm0, xmm3, _MM_SHUFFLE(2, 2, 0, 0));
pshufhw(xmm0, xmm0, _MM_SHUFFLE(2, 2, 0, 0));
- psrlw(xmm0, 16 - GS_BILINEAR_PRECISION);
- if(GS_BILINEAR_PRECISION < 15) psllw(xmm0, 15 - GS_BILINEAR_PRECISION);
+ psrlw(xmm0, 12);
movdqa(ptr[&m_local.temp.vf], xmm0);
}
@@ -1493,11 +1488,11 @@ void GSDrawScanlineCodeGenerator::SampleTextureLOD()
// xmm5 = c11
// xmm7 = used
- // rb00 = rb00.lerp16<0>(rb01, uf);
- // ga00 = ga00.lerp16<0>(ga01, uf);
+ // rb00 = rb00.lerp_4(rb01, uf);
+ // ga00 = ga00.lerp_4(ga01, uf);
- lerp16(xmm3, xmm2, xmm0, 0);
- lerp16(xmm4, xmm6, xmm0, 0);
+ lerp16_4(xmm3, xmm2, xmm0);
+ lerp16_4(xmm4, xmm6, xmm0);
// xmm0 = uf
// xmm3 = rb00
@@ -1532,11 +1527,11 @@ void GSDrawScanlineCodeGenerator::SampleTextureLOD()
// xmm6 = ga11
// xmm7 = used
- // rb10 = rb10.lerp16<0>(rb11, uf);
- // ga10 = ga10.lerp16<0>(ga11, uf);
+ // rb10 = rb10.lerp_4(rb11, uf);
+ // ga10 = ga10.lerp_4(ga11, uf);
- lerp16(xmm5, xmm1, xmm0, 0);
- lerp16(xmm6, xmm2, xmm0, 0);
+ lerp16_4(xmm5, xmm1, xmm0);
+ lerp16_4(xmm6, xmm2, xmm0);
// xmm3 = rb00
// xmm4 = ga00
@@ -1545,13 +1540,13 @@ void GSDrawScanlineCodeGenerator::SampleTextureLOD()
// xmm0, xmm1, xmm2 = free
// xmm7 = used
- // rb00 = rb00.lerp16<0>(rb10, vf);
- // ga00 = ga00.lerp16<0>(ga10, vf);
+ // rb00 = rb00.lerp_4(rb10, vf);
+ // ga00 = ga00.lerp_4(ga10, vf);
movdqa(xmm0, ptr[&m_local.temp.vf]);
- lerp16(xmm5, xmm3, xmm0, 0);
- lerp16(xmm6, xmm4, xmm0, 0);
+ lerp16_4(xmm5, xmm3, xmm0);
+ lerp16_4(xmm6, xmm4, xmm0);
}
else
{
@@ -1608,16 +1603,14 @@ void GSDrawScanlineCodeGenerator::SampleTextureLOD()
pshuflw(xmm0, xmm2, _MM_SHUFFLE(2, 2, 0, 0));
pshufhw(xmm0, xmm0, _MM_SHUFFLE(2, 2, 0, 0));
- psrlw(xmm0, 16 - GS_BILINEAR_PRECISION);
- if(GS_BILINEAR_PRECISION < 15) psllw(xmm0, 15 - GS_BILINEAR_PRECISION);
+ psrlw(xmm0, 12);
movdqa(ptr[&m_local.temp.uf], xmm0);
// GSVector4i vf = v.xxzzlh().srl16(1);
pshuflw(xmm0, xmm3, _MM_SHUFFLE(2, 2, 0, 0));
pshufhw(xmm0, xmm0, _MM_SHUFFLE(2, 2, 0, 0));
- psrlw(xmm0, 16 - GS_BILINEAR_PRECISION);
- if(GS_BILINEAR_PRECISION < 15) psllw(xmm0, 15 - GS_BILINEAR_PRECISION);
+ psrlw(xmm0, 12);
movdqa(ptr[&m_local.temp.vf], xmm0);
}
@@ -1748,11 +1741,11 @@ void GSDrawScanlineCodeGenerator::SampleTextureLOD()
// xmm5 = c11
// xmm7 = used
- // rb00 = rb00.lerp16<0>(rb01, uf);
- // ga00 = ga00.lerp16<0>(ga01, uf);
+ // rb00 = rb00.lerp_4(rb01, uf);
+ // ga00 = ga00.lerp_4(ga01, uf);
- lerp16(xmm3, xmm2, xmm0, 0);
- lerp16(xmm4, xmm6, xmm0, 0);
+ lerp16_4(xmm3, xmm2, xmm0);
+ lerp16_4(xmm4, xmm6, xmm0);
// xmm0 = uf
// xmm3 = rb00
@@ -1787,11 +1780,11 @@ void GSDrawScanlineCodeGenerator::SampleTextureLOD()
// xmm6 = ga11
// xmm7 = used
- // rb10 = rb10.lerp16<0>(rb11, uf);
- // ga10 = ga10.lerp16<0>(ga11, uf);
+ // rb10 = rb10.lerp_4(rb11, uf);
+ // ga10 = ga10.lerp_4(ga11, uf);
- lerp16(xmm5, xmm1, xmm0, 0);
- lerp16(xmm6, xmm2, xmm0, 0);
+ lerp16_4(xmm5, xmm1, xmm0);
+ lerp16_4(xmm6, xmm2, xmm0);
// xmm3 = rb00
// xmm4 = ga00
@@ -1800,13 +1793,13 @@ void GSDrawScanlineCodeGenerator::SampleTextureLOD()
// xmm0, xmm1, xmm2 = free
// xmm7 = used
- // rb00 = rb00.lerp16<0>(rb10, vf);
- // ga00 = ga00.lerp16<0>(ga10, vf);
+ // rb00 = rb00.lerp_4(rb10, vf);
+ // ga00 = ga00.lerp_4(ga10, vf);
movdqa(xmm0, ptr[&m_local.temp.vf]);
- lerp16(xmm5, xmm3, xmm0, 0);
- lerp16(xmm6, xmm4, xmm0, 0);
+ lerp16_4(xmm5, xmm3, xmm0);
+ lerp16_4(xmm6, xmm4, xmm0);
}
else
{
diff --git a/plugins/GSdx/GSLocalMemory.cpp b/plugins/GSdx/GSLocalMemory.cpp
index dfdd11274..bca4e345e 100644
--- a/plugins/GSdx/GSLocalMemory.cpp
+++ b/plugins/GSdx/GSLocalMemory.cpp
@@ -221,6 +221,7 @@ GSLocalMemory::GSLocalMemory()
m_psm[i].pgs = GSVector2i(64, 32);
for(int j = 0; j < 8; j++) m_psm[i].rowOffset[j] = rowOffset32;
m_psm[i].blockOffset = blockOffset32;
+ m_psm[i].msk = 0xff;
}
m_psm[PSM_PSMCT16].pa = &GSLocalMemory::PixelAddress16;
@@ -440,6 +441,12 @@ GSLocalMemory::GSLocalMemory()
m_psm[PSM_PSMZ24].blockOffset = blockOffset32Z;
m_psm[PSM_PSMZ16].blockOffset = blockOffset16Z;
m_psm[PSM_PSMZ16S].blockOffset = blockOffset16SZ;
+
+ m_psm[PSM_PSMCT24].msk = 0x3f;
+ m_psm[PSM_PSMZ24].msk = 0x3f;
+ m_psm[PSM_PSMT8H].msk = 0xc0;
+ m_psm[PSM_PSMT4HL].msk = 0x40;
+ m_psm[PSM_PSMT4HH].msk = 0x80;
}
GSLocalMemory::~GSLocalMemory()
@@ -447,6 +454,7 @@ GSLocalMemory::~GSLocalMemory()
vmfree(m_vm8, m_vmsize * 2);
for_each(m_omap.begin(), m_omap.end(), aligned_free_second());
+ for_each(m_pomap.begin(), m_pomap.end(), aligned_free_second());
for_each(m_po4map.begin(), m_po4map.end(), aligned_free_second());
for(hash_map*>::iterator i = m_p2tmap.begin(); i != m_p2tmap.end(); i++)
diff --git a/plugins/GSdx/GSLocalMemory.h b/plugins/GSdx/GSLocalMemory.h
index 8cda1b73b..9a32b0169 100644
--- a/plugins/GSdx/GSLocalMemory.h
+++ b/plugins/GSdx/GSLocalMemory.h
@@ -111,6 +111,7 @@ public:
GSVector2i bs, pgs;
int* rowOffset[8];
short* blockOffset;
+ uint8 msk;
};
static psm_t m_psm[64];
diff --git a/plugins/GSdx/GSRenderer.cpp b/plugins/GSdx/GSRenderer.cpp
index ca8fee320..646e0aec5 100644
--- a/plugins/GSdx/GSRenderer.cpp
+++ b/plugins/GSdx/GSRenderer.cpp
@@ -37,6 +37,7 @@ GSRenderer::GSRenderer()
m_aa1 = !!theApp.GetConfig("aa1", 0);
m_mipmap = !!theApp.GetConfig("mipmap", 1);
m_fxaa = !!theApp.GetConfig("fxaa", 0);
+ m_shadeboost = !!theApp.GetConfig("ShadeBoost", 0);
}
GSRenderer::~GSRenderer()
@@ -95,7 +96,7 @@ bool GSRenderer::Merge(int field)
baseline = min(dr[i].top, baseline);
- // printf("[%d]: %d %d %d %d, %d %d %d %d\n", i, fr[i], dr[i]);
+ //printf("[%d]: %d %d %d %d, %d %d %d %d\n", i, fr[i].x,fr[i].y,fr[i].z,fr[i].w , dr[i].x,dr[i].y,dr[i].z,dr[i].w);
}
}
@@ -250,10 +251,23 @@ bool GSRenderer::Merge(int field)
if(m_regs->SMODE2.INT && m_interlace > 0)
{
- int field2 = 1 - ((m_interlace - 1) & 1);
- int mode = (m_interlace - 1) >> 1;
-
- m_dev->Interlace(ds, field ^ field2, mode, tex[1] ? tex[1]->GetScale().y : tex[0]->GetScale().y);
+ if (m_interlace == 7 && m_regs->SMODE2.FFMD == 1) // Auto interlace enabled / Odd frame interlace setting
+ {
+ int field2 = 0;
+ int mode = 2;
+ m_dev->Interlace(ds, field ^ field2, mode, tex[1] ? tex[1]->GetScale().y : tex[0]->GetScale().y);
+ }
+ else
+ {
+ int field2 = 1 - ((m_interlace - 1) & 1);
+ int mode = (m_interlace - 1) >> 1;
+ m_dev->Interlace(ds, field ^ field2, mode, tex[1] ? tex[1]->GetScale().y : tex[0]->GetScale().y);
+ }
+ }
+
+ if(m_shadeboost)
+ {
+ m_dev->ShadeBoost();
}
if(m_fxaa)
@@ -519,7 +533,7 @@ void GSRenderer::KeyEvent(GSKeyEventData* e)
switch(e->key)
{
case VK_F5:
- m_interlace = (m_interlace + 7 + step) % 7;
+ m_interlace = (m_interlace + 8 + step) % 8;
printf("GSdx: Set deinterlace mode to %d (%s).\n", (int)m_interlace, theApp.m_gs_interlace.at(m_interlace).name.c_str());
return;
case VK_F6:
diff --git a/plugins/GSdx/GSRenderer.h b/plugins/GSdx/GSRenderer.h
index ce6b8417d..9450bf331 100644
--- a/plugins/GSdx/GSRenderer.h
+++ b/plugins/GSdx/GSRenderer.h
@@ -48,6 +48,7 @@ protected:
bool m_mipmap;
bool m_framelimit;
bool m_fxaa;
+ bool m_shadeboost;
virtual GSTexture* GetOutput(int i) = 0;
diff --git a/plugins/GSdx/GSRendererCS.cpp b/plugins/GSdx/GSRendererCS.cpp
index d9945a907..50fd594cd 100644
--- a/plugins/GSdx/GSRendererCS.cpp
+++ b/plugins/GSdx/GSRendererCS.cpp
@@ -1,865 +1,865 @@
-/*
- * Copyright (C) 2007-2009 Gabest
- * http://www.gabest.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, 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 GNU Make; see the file COPYING. If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- */
-
-#include "stdafx.h"
-#include "GSRendererCS.h"
-
-#define PS_BATCH_SIZE 512
-
-GSRendererCS::GSRendererCS()
- : GSRenderer()
-{
- m_nativeres = true;
-
- memset(m_vm_valid, 0, sizeof(m_vm_valid));
-
- memset(m_texture, 0, sizeof(m_texture));
-
- m_output = (uint8*)_aligned_malloc(1024 * 1024 * sizeof(uint32), 32);
-}
-
-GSRendererCS::~GSRendererCS()
-{
- for(int i = 0; i < countof(m_texture); i++)
- {
- delete m_texture[i];
- }
-
- _aligned_free(m_output);
-}
-
-bool GSRendererCS::CreateDevice(GSDevice* dev_unk)
-{
- if(!__super::CreateDevice(dev_unk))
- return false;
-
- HRESULT hr;
-
- D3D11_DEPTH_STENCIL_DESC dsd;
- D3D11_BLEND_DESC bsd;
- D3D11_SAMPLER_DESC sd;
- D3D11_BUFFER_DESC bd;
- D3D11_TEXTURE2D_DESC td;
- D3D11_UNORDERED_ACCESS_VIEW_DESC uavd;
- D3D11_SHADER_RESOURCE_VIEW_DESC srvd;
-
- D3D_FEATURE_LEVEL level;
-
- ((GSDeviceDX*)dev_unk)->GetFeatureLevel(level);
-
- if(level < D3D_FEATURE_LEVEL_11_0)
- return false;
-
- GSDevice11* dev = (GSDevice11*)dev_unk;
-
- ID3D11DeviceContext* ctx = *dev;
-
- // empty depth stencil state
-
- memset(&dsd, 0, sizeof(dsd));
-
- dsd.StencilEnable = false;
- dsd.DepthEnable = false;
-
- hr = (*dev)->CreateDepthStencilState(&dsd, &m_dss);
-
- if(FAILED(hr)) return false;
-
- // empty blend state
-
- memset(&bsd, 0, sizeof(bsd));
-
- bsd.RenderTarget[0].BlendEnable = false;
-
- hr = (*dev)->CreateBlendState(&bsd, &m_bs);
-
- if(FAILED(hr)) return false;
-
- // point sampler
-
- memset(&sd, 0, sizeof(sd));
-
- sd.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT;
-
- sd.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;
- sd.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;
- sd.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;
-
- sd.MaxLOD = FLT_MAX;
- sd.MaxAnisotropy = 16;
- sd.ComparisonFunc = D3D11_COMPARISON_NEVER;
-
- hr = (*dev)->CreateSamplerState(&sd, &m_ss);
-
- if(FAILED(hr)) return false;
-
- // link buffer
-
- memset(&bd, 0, sizeof(bd));
-
- bd.ByteWidth = 256 << 20; // 256 MB w00t
- bd.StructureByteStride = sizeof(uint32) * 4; // c, z, id, next
- bd.Usage = D3D11_USAGE_DEFAULT;
- bd.BindFlags = D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE;
- bd.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;
-
- hr = (*dev)->CreateBuffer(&bd, NULL, &m_lb);
-
- {
- uint32 data[] = {0, 0, 0xffffffff, 0};
-
- D3D11_BOX box;
- memset(&box, 0, sizeof(box));
- box.right = sizeof(data);
- box.bottom = 1;
- box.back = 1;
-
- ctx->UpdateSubresource(m_lb, 0, &box, data, 0, 0);
- }
-
- if(FAILED(hr)) return false;
-
- memset(&uavd, 0, sizeof(uavd));
-
- uavd.Format = DXGI_FORMAT_UNKNOWN;
- uavd.Buffer.NumElements = bd.ByteWidth / bd.StructureByteStride;
- uavd.Buffer.Flags = D3D11_BUFFER_UAV_FLAG_COUNTER;
- uavd.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
-
- hr = (*dev)->CreateUnorderedAccessView(m_lb, &uavd, &m_lb_uav);
-
- if(FAILED(hr)) return false;
-
- memset(&srvd, 0, sizeof(srvd));
-
- srvd.Format = DXGI_FORMAT_UNKNOWN;
- srvd.Buffer.NumElements = bd.ByteWidth / bd.StructureByteStride;
- srvd.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
-
- hr = (*dev)->CreateShaderResourceView(m_lb, &srvd, &m_lb_srv);
-
- if(FAILED(hr)) return false;
-
- // start offset buffer
-
- memset(&bd, 0, sizeof(bd));
-
- bd.ByteWidth = sizeof(uint32) * 2048 * 2048; // index
- bd.Usage = D3D11_USAGE_DEFAULT;
- bd.BindFlags = D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE;
- bd.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS;
-
- hr = (*dev)->CreateBuffer(&bd, NULL, &m_sob);
-
- if(FAILED(hr)) return false;
-
- memset(&uavd, 0, sizeof(uavd));
-
- uavd.Format = DXGI_FORMAT_R32_TYPELESS;
- uavd.Buffer.NumElements = bd.ByteWidth / sizeof(uint32);
- uavd.Buffer.Flags = D3D11_BUFFER_UAV_FLAG_RAW;
- uavd.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
-
- hr = (*dev)->CreateUnorderedAccessView(m_sob, &uavd, &m_sob_uav);
-
- if(FAILED(hr)) return false;
-
- memset(&srvd, 0, sizeof(srvd));
-
- srvd.Format = DXGI_FORMAT_R32_TYPELESS;
- srvd.BufferEx.NumElements = bd.ByteWidth / sizeof(uint32);
- srvd.BufferEx.Flags = D3D11_BUFFEREX_SRV_FLAG_RAW;
- srvd.ViewDimension = D3D11_SRV_DIMENSION_BUFFEREX;
-
- hr = (*dev)->CreateShaderResourceView(m_sob, &srvd, &m_sob_srv);
-
- if(FAILED(hr)) return false;
-
- const uint32 tmp = 0;
-
- ctx->ClearUnorderedAccessViewUint(m_sob_uav, &tmp); // initial clear, next time Draw should restore it in Step 2
-
- // video memory (4MB)
-
- memset(&bd, 0, sizeof(bd));
-
- bd.ByteWidth = 4 * 1024 * 1024;
- bd.Usage = D3D11_USAGE_DEFAULT;
- bd.BindFlags = D3D11_BIND_UNORDERED_ACCESS;
- bd.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS;
-
- hr = (*dev)->CreateBuffer(&bd, NULL, &m_vm);
-
- if(FAILED(hr)) return false;
-
- memset(&uavd, 0, sizeof(uavd));
-
- uavd.Format = DXGI_FORMAT_R32_TYPELESS;
- uavd.Buffer.FirstElement = 0;
- uavd.Buffer.NumElements = 1024 * 1024;
- uavd.Buffer.Flags = D3D11_BUFFER_UAV_FLAG_RAW;
- uavd.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
-
- hr = (*dev)->CreateUnorderedAccessView(m_vm, &uavd, &m_vm_uav);
-
- if(FAILED(hr)) return false;
-/*
- memset(&td, 0, sizeof(td));
-
- td.Width = PAGE_SIZE;
- td.Height = MAX_PAGES;
- td.Format = DXGI_FORMAT_R8_UINT;
- td.MipLevels = 1;
- td.ArraySize = 1;
- td.SampleDesc.Count = 1;
- td.SampleDesc.Quality = 0;
- td.Usage = D3D11_USAGE_DEFAULT;
- td.BindFlags = D3D11_BIND_UNORDERED_ACCESS;
-
- hr = (*dev)->CreateTexture2D(&td, NULL, &m_vm);
-
- if(FAILED(hr)) return false;
-
- memset(&uavd, 0, sizeof(uavd));
-
- uavd.Format = DXGI_FORMAT_R8_UINT;
- uavd.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2D;
-
- hr = (*dev)->CreateUnorderedAccessView(m_vm, &uavd, &m_vm_uav);
-
- if(FAILED(hr)) return false;
-*/
- // one page, for copying between cpu<->gpu
-
- memset(&bd, 0, sizeof(bd));
-
- bd.ByteWidth = PAGE_SIZE;
- bd.Usage = D3D11_USAGE_STAGING;
- bd.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
-
- hr = (*dev)->CreateBuffer(&bd, NULL, &m_pb);
-
- if(FAILED(hr)) return false;
-/*
- memset(&td, 0, sizeof(td));
-
- td.Width = PAGE_SIZE;
- td.Height = 1;
- td.Format = DXGI_FORMAT_R8_UINT;
- td.MipLevels = 1;
- td.ArraySize = 1;
- td.SampleDesc.Count = 1;
- td.SampleDesc.Quality = 0;
- td.Usage = D3D11_USAGE_STAGING;
- td.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
-
- hr = (*dev)->CreateTexture2D(&td, NULL, &m_pb);
-
- if(FAILED(hr)) return false;
-*/
- // VSConstantBuffer
-
- memset(&bd, 0, sizeof(bd));
-
- bd.ByteWidth = sizeof(VSConstantBuffer);
- bd.Usage = D3D11_USAGE_DEFAULT;
- bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
-
- hr = (*dev)->CreateBuffer(&bd, NULL, &m_vs_cb);
-
- if(FAILED(hr)) return false;
-
- // PS
-
- D3D11_SHADER_MACRO macro[] =
- {
- {NULL, NULL},
- };
-
- hr = dev->CompileShader(IDR_CS_FX, "ps_main0", macro, &m_ps0);
-
- if(FAILED(hr)) return false;
-
- // PSConstantBuffer
-
- memset(&bd, 0, sizeof(bd));
-
- bd.ByteWidth = sizeof(PSConstantBuffer);
- bd.Usage = D3D11_USAGE_DEFAULT;
- bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
-
- hr = (*dev)->CreateBuffer(&bd, NULL, &m_ps_cb);
-
- if(FAILED(hr)) return false;
-
- //
-
- return true;
-}
-
-void GSRendererCS::ResetDevice()
-{
- for(int i = 0; i < countof(m_texture); i++)
- {
- delete m_texture[i];
-
- m_texture[i] = NULL;
- }
-}
-
-void GSRendererCS::VSync(int field)
-{
- __super::VSync(field);
-
- //printf("%lld\n", m_perfmon.GetFrame());
-}
-
-GSTexture* GSRendererCS::GetOutput(int i)
-{
- // TODO: create a compute shader which unswizzles the frame from m_vm to the output texture
-
- const GSRegDISPFB& DISPFB = m_regs->DISP[i].DISPFB;
-
- int w = DISPFB.FBW * 64;
- int h = GetFrameRect(i).bottom;
-
- // TODO: round up bottom
-
- if(m_dev->ResizeTexture(&m_texture[i], w, h))
- {
- const GSLocalMemory::psm_t& psm = GSLocalMemory::m_psm[DISPFB.PSM];
-
- GSVector4i r(0, 0, w, h);
- GSVector4i r2 = r.ralign(psm.bs);
-
- GSOffset* o = m_mem.GetOffset(DISPFB.Block(), DISPFB.FBW, DISPFB.PSM);
-
- Read(o, r2, false);
-
- (m_mem.*psm.rtx)(o, r2, m_output, 1024 * 4, m_env.TEXA);
-
- m_texture[i]->Update(r, m_output, 1024 * 4);
-
- if(s_dump)
- {
- if(s_save && s_n >= s_saven)
- {
- m_texture[i]->Save(format("c:\\temp1\\_%05d_f%lld_fr%d_%05x_%d.bmp", s_n, m_perfmon.GetFrame(), i, (int)DISPFB.Block(), (int)DISPFB.PSM));
- }
-
- s_n++;
- }
- }
-
- return m_texture[i];
-}
-
-void GSRendererCS::Draw()
-{
- GSDrawingEnvironment& env = m_env;
- GSDrawingContext* context = m_context;
-
- GSVector2i rtsize(2048, 2048);
- GSVector4i scissor = GSVector4i(context->scissor.in).rintersect(GSVector4i(rtsize).zwxy());
- GSVector4i bbox = GSVector4i(m_vt.m_min.p.floor().xyxy(m_vt.m_max.p.ceil()));
- GSVector4i r = bbox.rintersect(scissor);
-
- uint32 fm = context->FRAME.FBMSK;
- uint32 zm = context->ZBUF.ZMSK || context->TEST.ZTE == 0 ? 0xffffffff : 0;
-
- if(fm != 0xffffffff)
- {
- Write(context->offset.fb, r);
-
- // TODO: m_tc->InvalidateVideoMem(context->offset.fb, r, false);
- }
-
- if(zm != 0xffffffff)
- {
- Write(context->offset.zb, r);
-
- // TODO: m_tc->InvalidateVideoMem(context->offset.zb, r, false);
- }
-
- // TODO: if(24-bit) fm/zm |= 0xff000000;
-
- if(PRIM->TME)
- {
- m_mem.m_clut.Read32(context->TEX0, env.TEXA);
-
- GSVector4i r;
-
- GetTextureMinMax(r, context->TEX0, context->CLAMP, m_vt.IsLinear());
-
- // TODO: unswizzle pages of r to a texture, check m_vm_valid, bit not set cpu->gpu, set gpu->gpu
-
- // TODO: Write transfer should directly write to m_vm, then Read/Write syncing won't be necessary, clut must be updated with the gpu also
-
- // TODO: tex = m_tc->LookupSource(context->TEX0, env.TEXA, r);
-
- // if(!tex) return;
- }
-
- //
-
- GSDevice11* dev = (GSDevice11*)m_dev;
-
- ID3D11DeviceContext* ctx = *dev;
-
- //
-
- dev->BeginScene();
-
- // SetupOM
-
- dev->OMSetDepthStencilState(m_dss, 0);
- dev->OMSetBlendState(m_bs, 0);
-
- ID3D11UnorderedAccessView* uavs[] = {m_vm_uav, m_lb_uav, m_sob_uav};
- uint32 counters[] = {1, 0, 0};
-
- dev->OMSetRenderTargets(rtsize, countof(uavs), uavs, counters, &scissor);
-
- // SetupIA
-
- D3D11_PRIMITIVE_TOPOLOGY topology;
-
- switch(m_vt.m_primclass)
- {
- case GS_POINT_CLASS:
- topology = D3D11_PRIMITIVE_TOPOLOGY_POINTLIST;
- break;
- case GS_LINE_CLASS:
- case GS_SPRITE_CLASS:
- topology = D3D11_PRIMITIVE_TOPOLOGY_LINELIST;
- break;
- case GS_TRIANGLE_CLASS:
- topology = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
- break;
- default:
- __assume(0);
- }
-
- GSVector4i r2 = bbox.add32(GSVector4i(-1, -1, 1, 1)).rintersect(scissor);
-
- m_vertex.buff[m_vertex.next + 0].XYZ.X = context->XYOFFSET.OFX + (r2.left << 4);
- m_vertex.buff[m_vertex.next + 0].XYZ.Y = context->XYOFFSET.OFY + (r2.top << 4);
- m_vertex.buff[m_vertex.next + 1].XYZ.X = context->XYOFFSET.OFX + (r2.right << 4);
- m_vertex.buff[m_vertex.next + 1].XYZ.Y = context->XYOFFSET.OFY + (r2.bottom << 4);
-
- m_index.buff[m_index.tail + 0] = m_vertex.next + 0;
- m_index.buff[m_index.tail + 1] = m_vertex.next + 1;
-
- dev->IASetVertexBuffer(m_vertex.buff, sizeof(GSVertex), m_vertex.next + 2);
- dev->IASetIndexBuffer(m_index.buff, m_index.tail + 2);
-
- // SetupVS
-
- VSSelector vs_sel;
-
- vs_sel.tme = PRIM->TME;
- vs_sel.fst = PRIM->FST;
-
- VSConstantBuffer vs_cb;
-
- float sx = 2.0f / (rtsize.x << 4);
- float sy = 2.0f / (rtsize.y << 4);
- //float sx = 1.0f / 16;
- //float sy = 1.0f / 16;
- float ox = (float)(int)context->XYOFFSET.OFX;
- float oy = (float)(int)context->XYOFFSET.OFY;
-
- vs_cb.VertexScale = GSVector4(sx, -sy, 0.0f, 0.0f);
- vs_cb.VertexOffset = GSVector4(ox * sx + 1, -(oy * sy + 1), 0.0f, -1.0f);
- //vs_cb.VertexScale = GSVector4(sx, sy, 0.0f, 0.0f);
- //vs_cb.VertexOffset = GSVector4(ox * sx, oy * sy, 0.0f, -1.0f);
-
- {
- GSVertexShader11 vs;
-
- hash_map::const_iterator i = m_vs.find(vs_sel);
-
- if(i != m_vs.end())
- {
- vs = i->second;
- }
- else
- {
- string str[2];
-
- str[0] = format("%d", vs_sel.tme);
- str[1] = format("%d", vs_sel.fst);
-
- D3D11_SHADER_MACRO macro[] =
- {
- {"VS_TME", str[0].c_str()},
- {"VS_FST", str[1].c_str()},
- {NULL, NULL},
- };
-
- D3D11_INPUT_ELEMENT_DESC layout[] =
- {
- {"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
- {"COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 8, D3D11_INPUT_PER_VERTEX_DATA, 0},
- {"TEXCOORD", 1, DXGI_FORMAT_R32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0},
- {"POSITION", 0, DXGI_FORMAT_R16G16_UINT, 0, 16, D3D11_INPUT_PER_VERTEX_DATA, 0},
- {"POSITION", 1, DXGI_FORMAT_R32_UINT, 0, 20, D3D11_INPUT_PER_VERTEX_DATA, 0},
- {"TEXCOORD", 2, DXGI_FORMAT_R16G16_UINT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0},
- {"COLOR", 1, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 28, D3D11_INPUT_PER_VERTEX_DATA, 0},
- };
-
- dev->CompileShader(IDR_CS_FX, "vs_main", macro, &vs.vs, layout, countof(layout), &vs.il);
-
- m_vs[vs_sel] = vs;
- }
-
- ctx->UpdateSubresource(m_vs_cb, 0, NULL, &vs_cb, 0, 0); // TODO: only update if changed
-
- dev->VSSetShader(vs.vs, m_vs_cb);
-
- dev->IASetInputLayout(vs.il);
- }
-
- // SetupGS
-
- GSSelector gs_sel;
-
- gs_sel.iip = PRIM->IIP;
-
- CComPtr gs[2];
-
- for(int j = 0; j < 2; j++)
- {
- gs_sel.prim = j == 0 ? m_vt.m_primclass : GS_SPRITE_CLASS;
-
- hash_map >::const_iterator i = m_gs.find(gs_sel);
-
- if(i != m_gs.end())
- {
- gs[j] = i->second;
- }
- else
- {
- string str[2];
-
- str[0] = format("%d", gs_sel.iip);
- str[1] = format("%d", j == 0 ? gs_sel.prim : GS_SPRITE_CLASS);
-
- D3D11_SHADER_MACRO macro[] =
- {
- {"GS_IIP", str[0].c_str()},
- {"GS_PRIM", str[1].c_str()},
- {NULL, NULL},
- };
-
- dev->CompileShader(IDR_CS_FX, "gs_main", macro, &gs[j]);
-
- m_gs[gs_sel] = gs[j];
- }
- }
-
- // SetupPS
-
- dev->PSSetSamplerState(m_ss, NULL, NULL);
-
- PSSelector ps_sel;
-
- ps_sel.fpsm = context->FRAME.PSM;
- ps_sel.zpsm = context->ZBUF.PSM;
-
- CComPtr ps[2] = {m_ps0, NULL};
-
- hash_map >::const_iterator i = m_ps1.find(ps_sel);
-
- if(i != m_ps1.end())
- {
- ps[1] = i->second;
- }
- else
- {
- string str[15];
-
- str[0] = format("%d", PS_BATCH_SIZE);
- str[1] = format("%d", context->FRAME.PSM);
- str[2] = format("%d", context->ZBUF.PSM);
-
- D3D11_SHADER_MACRO macro[] =
- {
- {"PS_BATCH_SIZE", str[0].c_str()},
- {"PS_FPSM", str[1].c_str()},
- {"PS_ZPSM", str[2].c_str()},
- {NULL, NULL},
- };
-
- dev->CompileShader(IDR_CS_FX, "ps_main1", macro, &ps[1]);
-
- m_ps1[ps_sel] = ps[1];
- }
-
- PSConstantBuffer ps_cb;
-
- ps_cb.fm = fm;
- ps_cb.zm = zm;
-
- ctx->UpdateSubresource(m_ps_cb, 0, NULL, &ps_cb, 0, 0); // TODO: only update if changed
-
- OffsetBuffer* fzbo = NULL;
-
- GetOffsetBuffer(&fzbo);
-
- dev->PSSetShaderResourceView(0, fzbo->row_srv);
- dev->PSSetShaderResourceView(1, fzbo->col_srv);
- // TODO: palette, texture
-
- int step = PS_BATCH_SIZE * GSUtil::GetVertexCount(PRIM->PRIM);
-
- for(int i = 0; i < m_index.tail; i += step)
- {
- dev->IASetPrimitiveTopology(topology);
- dev->GSSetShader(gs[0]);
- dev->PSSetShader(ps[0], m_ps_cb);
- dev->DrawIndexedPrimitive(i, std::min(m_index.tail - i, step));
-
- dev->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST);
- dev->GSSetShader(gs[1]);
- dev->PSSetShader(ps[1], m_ps_cb);
- dev->DrawIndexedPrimitive(m_index.tail, 2);
-
- //printf("%d/%d, %d %d %d %d\n", i, m_index.tail, r2.x, r2.y, r2.z, r2.w);
- }
-
- dev->EndScene();
-
- if(0)
- {
- std::string s;
- /*
- s = format("c:\\temp1\\_%05d_f%lld_fb0_%05x_%d.bmp", s_n, m_perfmon.GetFrame(), 0, 0);
- m_mem.SaveBMP(s, 0, 16, PSM_PSMCT32, 1024, 1024);
- Read(m_mem.GetOffset(0, 16, PSM_PSMCT32), GSVector4i(0, 0, 1024, 1024), false);
- */
- //
- if(fm != 0xffffffff) Read(context->offset.fb, r, false);
- //
- if(zm != 0xffffffff) Read(context->offset.zb, r, false);
-
- s = format("c:\\temp1\\_%05d_f%lld_rt1_%05x_%d.bmp", s_n, m_perfmon.GetFrame(), m_context->FRAME.Block(), m_context->FRAME.PSM);
- m_mem.SaveBMP(s, m_context->FRAME.Block(), m_context->FRAME.FBW, m_context->FRAME.PSM, GetFrameRect().width(), 512);
-
- s = format("c:\\temp1\\_%05d_f%lld_zt1_%05x_%d.bmp", s_n, m_perfmon.GetFrame(), m_context->ZBUF.Block(), m_context->ZBUF.PSM);
- m_mem.SaveBMP(s, m_context->ZBUF.Block(), m_context->FRAME.FBW, m_context->ZBUF.PSM, GetFrameRect().width(), 512);
-
- /*
- s = format("c:\\temp1\\_%05d_f%lld_fb1_%05x_%d.bmp", s_n, m_perfmon.GetFrame(), 0, 0);
- m_mem.SaveBMP(s, 0, 16, PSM_PSMCT32, 1024, 1024);
- */
-
- s_n++;
- }
-}
-
-void GSRendererCS::InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r)
-{
- GSOffset* o = m_mem.GetOffset(BITBLTBUF.DBP, BITBLTBUF.DBW, BITBLTBUF.DPSM);
-
- Read(o, r, true); // TODO: fully overwritten pages are not needed to be read, only invalidated (important)
-
- // TODO: false deps, 8H/4HL/4HH texture sharing pages with 24-bit target
- // TODO: invalidate texture cache
-}
-
-void GSRendererCS::InvalidateLocalMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r, bool clut)
-{
- GSOffset* o = m_mem.GetOffset(BITBLTBUF.SBP, BITBLTBUF.SBW, BITBLTBUF.SPSM);
-
- Read(o, r, false);
-}
-
-void GSRendererCS::Write(GSOffset* o, const GSVector4i& r)
-{
- GSDevice11* dev = (GSDevice11*)m_dev;
-
- ID3D11DeviceContext* ctx = *dev;
-
- D3D11_BOX box;
-
- memset(&box, 0, sizeof(box));
-
- box.right = 1;
- box.bottom = 1;
- box.back = 1;
-
- uint32* pages = o->GetPages(r);
-
- for(size_t i = 0; pages[i] != GSOffset::EOP; i++)
- {
- uint32 page = pages[i];
-
- uint32 row = page >> 5;
- uint32 col = 1 << (page & 31);
-
- if((m_vm_valid[row] & col) == 0)
- {
- m_vm_valid[row] |= col;
-
- box.left = page * PAGE_SIZE;
- box.right = (page + 1) * PAGE_SIZE;
-
- ctx->UpdateSubresource(m_vm, 0, &box, m_mem.m_vm8 + page * PAGE_SIZE, 0, 0);
-/*
- // m_vm texture row is 2k in bytes, one page is 8k => starting row: addr / 4k, number of rows: 8k / 2k = 4
-
- box.left = 0;
- box.right = PAGE_SIZE;
- box.top = page;
- box.bottom = box.top + 1;
-
- ctx->UpdateSubresource(m_vm, 0, &box, m_mem.m_vm8 + page * PAGE_SIZE, 0, 0);
-*/
- if(0)
- printf("[%lld] write %05x %d %d (%d)\n", __rdtsc(), o->bp, o->bw, o->psm, page);
- }
- }
-
- delete [] pages;
-}
-
-void GSRendererCS::Read(GSOffset* o, const GSVector4i& r, bool invalidate)
-{
- GSDevice11* dev = (GSDevice11*)m_dev;
-
- ID3D11DeviceContext* ctx = *dev;
-
- D3D11_BOX box;
-
- memset(&box, 0, sizeof(box));
-
- box.right = 1;
- box.bottom = 1;
- box.back = 1;
-
- uint32* pages = o->GetPages(r);
-
- for(size_t i = 0; pages[i] != GSOffset::EOP; i++)
- {
- uint32 page = pages[i];
-
- uint32 row = page >> 5;
- uint32 col = 1 << (page & 31);
-
- if(m_vm_valid[row] & col)
- {
- if(invalidate)
- {
- m_vm_valid[row] ^= col;
- }
-
- box.left = page * PAGE_SIZE;
- box.right = (page + 1) * PAGE_SIZE;
-
- ctx->CopySubresourceRegion(m_pb, 0, 0, 0, 0, m_vm, 0, &box);
-/*
- // m_vm texture row is 2k in bytes, one page is 8k => starting row: addr / 4k, number of rows: 8k / 2k = 4
-
- box.left = 0;
- box.right = PAGE_SIZE;
- box.top = page;
- box.bottom = box.top + 1;
-
- ctx->CopySubresourceRegion(m_pb, 0, 0, 0, 0, m_vm, 0, &box);
-*/
- D3D11_MAPPED_SUBRESOURCE map;
-
- if(SUCCEEDED(ctx->Map(m_pb, 0, D3D11_MAP_READ, 0, &map)))
- {
- memcpy(m_mem.m_vm8 + page * PAGE_SIZE, map.pData, PAGE_SIZE);
-
- ctx->Unmap(m_pb, 0);
-
- if(0)
- printf("[%lld] read %05x %d %d (%d)\n", __rdtsc(), o->bp, o->bw, o->psm, page);
- }
- }
- }
-
- delete [] pages;
-}
-
-bool GSRendererCS::GetOffsetBuffer(OffsetBuffer** fzbo)
-{
- HRESULT hr;
-
- GSDevice11* dev = (GSDevice11*)m_dev;
-
- D3D11_BUFFER_DESC bd;
- D3D11_SHADER_RESOURCE_VIEW_DESC srvd;
- D3D11_SUBRESOURCE_DATA data;
-
- hash_map::iterator i = m_offset.find(m_context->offset.fzb->hash);
-
- if(i == m_offset.end())
- {
- OffsetBuffer ob;
-
- memset(&bd, 0, sizeof(bd));
-
- bd.ByteWidth = sizeof(GSVector2i) * 2048;
- bd.Usage = D3D11_USAGE_IMMUTABLE;
- bd.BindFlags = D3D11_BIND_SHADER_RESOURCE;
-
- memset(&data, 0, sizeof(data));
-
- data.pSysMem = m_context->offset.fzb->row;
-
- hr = (*dev)->CreateBuffer(&bd, &data, &ob.row);
-
- if(FAILED(hr)) return false;
-
- data.pSysMem = m_context->offset.fzb->col;
-
- hr = (*dev)->CreateBuffer(&bd, &data, &ob.col);
-
- if(FAILED(hr)) return false;
-
- memset(&srvd, 0, sizeof(srvd));
-
- srvd.Format = DXGI_FORMAT_R32G32_SINT;
- srvd.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
- srvd.Buffer.FirstElement = 0;
- srvd.Buffer.NumElements = 2048;
-
- hr = (*dev)->CreateShaderResourceView(ob.row, &srvd, &ob.row_srv);
-
- if(FAILED(hr)) return false;
-
- hr = (*dev)->CreateShaderResourceView(ob.col, &srvd, &ob.col_srv);
-
- if(FAILED(hr)) return false;
-
- m_offset[m_context->offset.fzb->hash] = ob;
-
- i = m_offset.find(m_context->offset.fzb->hash);
- }
-
- *fzbo = &i->second;
-
- return true;
-}
+/*
+ * Copyright (C) 2007-2009 Gabest
+ * http://www.gabest.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, 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 GNU Make; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ */
+
+#include "stdafx.h"
+#include "GSRendererCS.h"
+
+#define PS_BATCH_SIZE 512
+
+GSRendererCS::GSRendererCS()
+ : GSRenderer()
+{
+ m_nativeres = true;
+
+ memset(m_vm_valid, 0, sizeof(m_vm_valid));
+
+ memset(m_texture, 0, sizeof(m_texture));
+
+ m_output = (uint8*)_aligned_malloc(1024 * 1024 * sizeof(uint32), 32);
+}
+
+GSRendererCS::~GSRendererCS()
+{
+ for(int i = 0; i < countof(m_texture); i++)
+ {
+ delete m_texture[i];
+ }
+
+ _aligned_free(m_output);
+}
+
+bool GSRendererCS::CreateDevice(GSDevice* dev_unk)
+{
+ if(!__super::CreateDevice(dev_unk))
+ return false;
+
+ HRESULT hr;
+
+ D3D11_DEPTH_STENCIL_DESC dsd;
+ D3D11_BLEND_DESC bsd;
+ D3D11_SAMPLER_DESC sd;
+ D3D11_BUFFER_DESC bd;
+ D3D11_TEXTURE2D_DESC td;
+ D3D11_UNORDERED_ACCESS_VIEW_DESC uavd;
+ D3D11_SHADER_RESOURCE_VIEW_DESC srvd;
+
+ D3D_FEATURE_LEVEL level;
+
+ ((GSDeviceDX*)dev_unk)->GetFeatureLevel(level);
+
+ if(level < D3D_FEATURE_LEVEL_11_0)
+ return false;
+
+ GSDevice11* dev = (GSDevice11*)dev_unk;
+
+ ID3D11DeviceContext* ctx = *dev;
+
+ // empty depth stencil state
+
+ memset(&dsd, 0, sizeof(dsd));
+
+ dsd.StencilEnable = false;
+ dsd.DepthEnable = false;
+
+ hr = (*dev)->CreateDepthStencilState(&dsd, &m_dss);
+
+ if(FAILED(hr)) return false;
+
+ // empty blend state
+
+ memset(&bsd, 0, sizeof(bsd));
+
+ bsd.RenderTarget[0].BlendEnable = false;
+
+ hr = (*dev)->CreateBlendState(&bsd, &m_bs);
+
+ if(FAILED(hr)) return false;
+
+ // point sampler
+
+ memset(&sd, 0, sizeof(sd));
+
+ sd.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT;
+
+ sd.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;
+ sd.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;
+ sd.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;
+
+ sd.MaxLOD = FLT_MAX;
+ sd.MaxAnisotropy = 16;
+ sd.ComparisonFunc = D3D11_COMPARISON_NEVER;
+
+ hr = (*dev)->CreateSamplerState(&sd, &m_ss);
+
+ if(FAILED(hr)) return false;
+
+ // link buffer
+
+ memset(&bd, 0, sizeof(bd));
+
+ bd.ByteWidth = 256 << 20; // 256 MB w00t
+ bd.StructureByteStride = sizeof(uint32) * 4; // c, z, id, next
+ bd.Usage = D3D11_USAGE_DEFAULT;
+ bd.BindFlags = D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE;
+ bd.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;
+
+ hr = (*dev)->CreateBuffer(&bd, NULL, &m_lb);
+
+ {
+ uint32 data[] = {0, 0, 0xffffffff, 0};
+
+ D3D11_BOX box;
+ memset(&box, 0, sizeof(box));
+ box.right = sizeof(data);
+ box.bottom = 1;
+ box.back = 1;
+
+ ctx->UpdateSubresource(m_lb, 0, &box, data, 0, 0);
+ }
+
+ if(FAILED(hr)) return false;
+
+ memset(&uavd, 0, sizeof(uavd));
+
+ uavd.Format = DXGI_FORMAT_UNKNOWN;
+ uavd.Buffer.NumElements = bd.ByteWidth / bd.StructureByteStride;
+ uavd.Buffer.Flags = D3D11_BUFFER_UAV_FLAG_COUNTER;
+ uavd.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
+
+ hr = (*dev)->CreateUnorderedAccessView(m_lb, &uavd, &m_lb_uav);
+
+ if(FAILED(hr)) return false;
+
+ memset(&srvd, 0, sizeof(srvd));
+
+ srvd.Format = DXGI_FORMAT_UNKNOWN;
+ srvd.Buffer.NumElements = bd.ByteWidth / bd.StructureByteStride;
+ srvd.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
+
+ hr = (*dev)->CreateShaderResourceView(m_lb, &srvd, &m_lb_srv);
+
+ if(FAILED(hr)) return false;
+
+ // start offset buffer
+
+ memset(&bd, 0, sizeof(bd));
+
+ bd.ByteWidth = sizeof(uint32) * 2048 * 2048; // index
+ bd.Usage = D3D11_USAGE_DEFAULT;
+ bd.BindFlags = D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE;
+ bd.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS;
+
+ hr = (*dev)->CreateBuffer(&bd, NULL, &m_sob);
+
+ if(FAILED(hr)) return false;
+
+ memset(&uavd, 0, sizeof(uavd));
+
+ uavd.Format = DXGI_FORMAT_R32_TYPELESS;
+ uavd.Buffer.NumElements = bd.ByteWidth / sizeof(uint32);
+ uavd.Buffer.Flags = D3D11_BUFFER_UAV_FLAG_RAW;
+ uavd.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
+
+ hr = (*dev)->CreateUnorderedAccessView(m_sob, &uavd, &m_sob_uav);
+
+ if(FAILED(hr)) return false;
+
+ memset(&srvd, 0, sizeof(srvd));
+
+ srvd.Format = DXGI_FORMAT_R32_TYPELESS;
+ srvd.BufferEx.NumElements = bd.ByteWidth / sizeof(uint32);
+ srvd.BufferEx.Flags = D3D11_BUFFEREX_SRV_FLAG_RAW;
+ srvd.ViewDimension = D3D11_SRV_DIMENSION_BUFFEREX;
+
+ hr = (*dev)->CreateShaderResourceView(m_sob, &srvd, &m_sob_srv);
+
+ if(FAILED(hr)) return false;
+
+ const uint32 tmp = 0;
+
+ ctx->ClearUnorderedAccessViewUint(m_sob_uav, &tmp); // initial clear, next time Draw should restore it in Step 2
+
+ // video memory (4MB)
+
+ memset(&bd, 0, sizeof(bd));
+
+ bd.ByteWidth = 4 * 1024 * 1024;
+ bd.Usage = D3D11_USAGE_DEFAULT;
+ bd.BindFlags = D3D11_BIND_UNORDERED_ACCESS;
+ bd.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS;
+
+ hr = (*dev)->CreateBuffer(&bd, NULL, &m_vm);
+
+ if(FAILED(hr)) return false;
+
+ memset(&uavd, 0, sizeof(uavd));
+
+ uavd.Format = DXGI_FORMAT_R32_TYPELESS;
+ uavd.Buffer.FirstElement = 0;
+ uavd.Buffer.NumElements = 1024 * 1024;
+ uavd.Buffer.Flags = D3D11_BUFFER_UAV_FLAG_RAW;
+ uavd.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
+
+ hr = (*dev)->CreateUnorderedAccessView(m_vm, &uavd, &m_vm_uav);
+
+ if(FAILED(hr)) return false;
+/*
+ memset(&td, 0, sizeof(td));
+
+ td.Width = PAGE_SIZE;
+ td.Height = MAX_PAGES;
+ td.Format = DXGI_FORMAT_R8_UINT;
+ td.MipLevels = 1;
+ td.ArraySize = 1;
+ td.SampleDesc.Count = 1;
+ td.SampleDesc.Quality = 0;
+ td.Usage = D3D11_USAGE_DEFAULT;
+ td.BindFlags = D3D11_BIND_UNORDERED_ACCESS;
+
+ hr = (*dev)->CreateTexture2D(&td, NULL, &m_vm);
+
+ if(FAILED(hr)) return false;
+
+ memset(&uavd, 0, sizeof(uavd));
+
+ uavd.Format = DXGI_FORMAT_R8_UINT;
+ uavd.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2D;
+
+ hr = (*dev)->CreateUnorderedAccessView(m_vm, &uavd, &m_vm_uav);
+
+ if(FAILED(hr)) return false;
+*/
+ // one page, for copying between cpu<->gpu
+
+ memset(&bd, 0, sizeof(bd));
+
+ bd.ByteWidth = PAGE_SIZE;
+ bd.Usage = D3D11_USAGE_STAGING;
+ bd.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
+
+ hr = (*dev)->CreateBuffer(&bd, NULL, &m_pb);
+
+ if(FAILED(hr)) return false;
+/*
+ memset(&td, 0, sizeof(td));
+
+ td.Width = PAGE_SIZE;
+ td.Height = 1;
+ td.Format = DXGI_FORMAT_R8_UINT;
+ td.MipLevels = 1;
+ td.ArraySize = 1;
+ td.SampleDesc.Count = 1;
+ td.SampleDesc.Quality = 0;
+ td.Usage = D3D11_USAGE_STAGING;
+ td.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
+
+ hr = (*dev)->CreateTexture2D(&td, NULL, &m_pb);
+
+ if(FAILED(hr)) return false;
+*/
+ // VSConstantBuffer
+
+ memset(&bd, 0, sizeof(bd));
+
+ bd.ByteWidth = sizeof(VSConstantBuffer);
+ bd.Usage = D3D11_USAGE_DEFAULT;
+ bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
+
+ hr = (*dev)->CreateBuffer(&bd, NULL, &m_vs_cb);
+
+ if(FAILED(hr)) return false;
+
+ // PS
+
+ D3D11_SHADER_MACRO macro[] =
+ {
+ {NULL, NULL},
+ };
+
+ hr = dev->CompileShader(IDR_CS_FX, "ps_main0", macro, &m_ps0);
+
+ if(FAILED(hr)) return false;
+
+ // PSConstantBuffer
+
+ memset(&bd, 0, sizeof(bd));
+
+ bd.ByteWidth = sizeof(PSConstantBuffer);
+ bd.Usage = D3D11_USAGE_DEFAULT;
+ bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
+
+ hr = (*dev)->CreateBuffer(&bd, NULL, &m_ps_cb);
+
+ if(FAILED(hr)) return false;
+
+ //
+
+ return true;
+}
+
+void GSRendererCS::ResetDevice()
+{
+ for(int i = 0; i < countof(m_texture); i++)
+ {
+ delete m_texture[i];
+
+ m_texture[i] = NULL;
+ }
+}
+
+void GSRendererCS::VSync(int field)
+{
+ __super::VSync(field);
+
+ //printf("%lld\n", m_perfmon.GetFrame());
+}
+
+GSTexture* GSRendererCS::GetOutput(int i)
+{
+ // TODO: create a compute shader which unswizzles the frame from m_vm to the output texture
+
+ const GSRegDISPFB& DISPFB = m_regs->DISP[i].DISPFB;
+
+ int w = DISPFB.FBW * 64;
+ int h = GetFrameRect(i).bottom;
+
+ // TODO: round up bottom
+
+ if(m_dev->ResizeTexture(&m_texture[i], w, h))
+ {
+ const GSLocalMemory::psm_t& psm = GSLocalMemory::m_psm[DISPFB.PSM];
+
+ GSVector4i r(0, 0, w, h);
+ GSVector4i r2 = r.ralign(psm.bs);
+
+ GSOffset* o = m_mem.GetOffset(DISPFB.Block(), DISPFB.FBW, DISPFB.PSM);
+
+ Read(o, r2, false);
+
+ (m_mem.*psm.rtx)(o, r2, m_output, 1024 * 4, m_env.TEXA);
+
+ m_texture[i]->Update(r, m_output, 1024 * 4);
+
+ if(s_dump)
+ {
+ if(s_save && s_n >= s_saven)
+ {
+ m_texture[i]->Save(format("c:\\temp1\\_%05d_f%lld_fr%d_%05x_%d.bmp", s_n, m_perfmon.GetFrame(), i, (int)DISPFB.Block(), (int)DISPFB.PSM));
+ }
+
+ s_n++;
+ }
+ }
+
+ return m_texture[i];
+}
+
+void GSRendererCS::Draw()
+{
+ GSDrawingEnvironment& env = m_env;
+ GSDrawingContext* context = m_context;
+
+ GSVector2i rtsize(2048, 2048);
+ GSVector4i scissor = GSVector4i(context->scissor.in).rintersect(GSVector4i(rtsize).zwxy());
+ GSVector4i bbox = GSVector4i(m_vt.m_min.p.floor().xyxy(m_vt.m_max.p.ceil()));
+ GSVector4i r = bbox.rintersect(scissor);
+
+ uint32 fm = context->FRAME.FBMSK;
+ uint32 zm = context->ZBUF.ZMSK || context->TEST.ZTE == 0 ? 0xffffffff : 0;
+
+ if(fm != 0xffffffff)
+ {
+ Write(context->offset.fb, r);
+
+ // TODO: m_tc->InvalidateVideoMem(context->offset.fb, r, false);
+ }
+
+ if(zm != 0xffffffff)
+ {
+ Write(context->offset.zb, r);
+
+ // TODO: m_tc->InvalidateVideoMem(context->offset.zb, r, false);
+ }
+
+ // TODO: if(24-bit) fm/zm |= 0xff000000;
+
+ if(PRIM->TME)
+ {
+ m_mem.m_clut.Read32(context->TEX0, env.TEXA);
+
+ GSVector4i r;
+
+ GetTextureMinMax(r, context->TEX0, context->CLAMP, m_vt.IsLinear());
+
+ // TODO: unswizzle pages of r to a texture, check m_vm_valid, bit not set cpu->gpu, set gpu->gpu
+
+ // TODO: Write transfer should directly write to m_vm, then Read/Write syncing won't be necessary, clut must be updated with the gpu also
+
+ // TODO: tex = m_tc->LookupSource(context->TEX0, env.TEXA, r);
+
+ // if(!tex) return;
+ }
+
+ //
+
+ GSDevice11* dev = (GSDevice11*)m_dev;
+
+ ID3D11DeviceContext* ctx = *dev;
+
+ //
+
+ dev->BeginScene();
+
+ // SetupOM
+
+ dev->OMSetDepthStencilState(m_dss, 0);
+ dev->OMSetBlendState(m_bs, 0);
+
+ ID3D11UnorderedAccessView* uavs[] = {m_vm_uav, m_lb_uav, m_sob_uav};
+ uint32 counters[] = {1, 0, 0};
+
+ dev->OMSetRenderTargets(rtsize, countof(uavs), uavs, counters, &scissor);
+
+ // SetupIA
+
+ D3D11_PRIMITIVE_TOPOLOGY topology;
+
+ switch(m_vt.m_primclass)
+ {
+ case GS_POINT_CLASS:
+ topology = D3D11_PRIMITIVE_TOPOLOGY_POINTLIST;
+ break;
+ case GS_LINE_CLASS:
+ case GS_SPRITE_CLASS:
+ topology = D3D11_PRIMITIVE_TOPOLOGY_LINELIST;
+ break;
+ case GS_TRIANGLE_CLASS:
+ topology = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
+ break;
+ default:
+ __assume(0);
+ }
+
+ GSVector4i r2 = bbox.add32(GSVector4i(-1, -1, 1, 1)).rintersect(scissor);
+
+ m_vertex.buff[m_vertex.next + 0].XYZ.X = context->XYOFFSET.OFX + (r2.left << 4);
+ m_vertex.buff[m_vertex.next + 0].XYZ.Y = context->XYOFFSET.OFY + (r2.top << 4);
+ m_vertex.buff[m_vertex.next + 1].XYZ.X = context->XYOFFSET.OFX + (r2.right << 4);
+ m_vertex.buff[m_vertex.next + 1].XYZ.Y = context->XYOFFSET.OFY + (r2.bottom << 4);
+
+ m_index.buff[m_index.tail + 0] = m_vertex.next + 0;
+ m_index.buff[m_index.tail + 1] = m_vertex.next + 1;
+
+ dev->IASetVertexBuffer(m_vertex.buff, sizeof(GSVertex), m_vertex.next + 2);
+ dev->IASetIndexBuffer(m_index.buff, m_index.tail + 2);
+
+ // SetupVS
+
+ VSSelector vs_sel;
+
+ vs_sel.tme = PRIM->TME;
+ vs_sel.fst = PRIM->FST;
+
+ VSConstantBuffer vs_cb;
+
+ float sx = 2.0f / (rtsize.x << 4);
+ float sy = 2.0f / (rtsize.y << 4);
+ //float sx = 1.0f / 16;
+ //float sy = 1.0f / 16;
+ float ox = (float)(int)context->XYOFFSET.OFX;
+ float oy = (float)(int)context->XYOFFSET.OFY;
+
+ vs_cb.VertexScale = GSVector4(sx, -sy, 0.0f, 0.0f);
+ vs_cb.VertexOffset = GSVector4(ox * sx + 1, -(oy * sy + 1), 0.0f, -1.0f);
+ //vs_cb.VertexScale = GSVector4(sx, sy, 0.0f, 0.0f);
+ //vs_cb.VertexOffset = GSVector4(ox * sx, oy * sy, 0.0f, -1.0f);
+
+ {
+ GSVertexShader11 vs;
+
+ hash_map::const_iterator i = m_vs.find(vs_sel);
+
+ if(i != m_vs.end())
+ {
+ vs = i->second;
+ }
+ else
+ {
+ string str[2];
+
+ str[0] = format("%d", vs_sel.tme);
+ str[1] = format("%d", vs_sel.fst);
+
+ D3D11_SHADER_MACRO macro[] =
+ {
+ {"VS_TME", str[0].c_str()},
+ {"VS_FST", str[1].c_str()},
+ {NULL, NULL},
+ };
+
+ D3D11_INPUT_ELEMENT_DESC layout[] =
+ {
+ {"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
+ {"COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 8, D3D11_INPUT_PER_VERTEX_DATA, 0},
+ {"TEXCOORD", 1, DXGI_FORMAT_R32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0},
+ {"POSITION", 0, DXGI_FORMAT_R16G16_UINT, 0, 16, D3D11_INPUT_PER_VERTEX_DATA, 0},
+ {"POSITION", 1, DXGI_FORMAT_R32_UINT, 0, 20, D3D11_INPUT_PER_VERTEX_DATA, 0},
+ {"TEXCOORD", 2, DXGI_FORMAT_R16G16_UINT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0},
+ {"COLOR", 1, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 28, D3D11_INPUT_PER_VERTEX_DATA, 0},
+ };
+
+ dev->CompileShader(IDR_CS_FX, "vs_main", macro, &vs.vs, layout, countof(layout), &vs.il);
+
+ m_vs[vs_sel] = vs;
+ }
+
+ ctx->UpdateSubresource(m_vs_cb, 0, NULL, &vs_cb, 0, 0); // TODO: only update if changed
+
+ dev->VSSetShader(vs.vs, m_vs_cb);
+
+ dev->IASetInputLayout(vs.il);
+ }
+
+ // SetupGS
+
+ GSSelector gs_sel;
+
+ gs_sel.iip = PRIM->IIP;
+
+ CComPtr gs[2];
+
+ for(int j = 0; j < 2; j++)
+ {
+ gs_sel.prim = j == 0 ? m_vt.m_primclass : GS_SPRITE_CLASS;
+
+ hash_map >::const_iterator i = m_gs.find(gs_sel);
+
+ if(i != m_gs.end())
+ {
+ gs[j] = i->second;
+ }
+ else
+ {
+ string str[2];
+
+ str[0] = format("%d", gs_sel.iip);
+ str[1] = format("%d", j == 0 ? gs_sel.prim : GS_SPRITE_CLASS);
+
+ D3D11_SHADER_MACRO macro[] =
+ {
+ {"GS_IIP", str[0].c_str()},
+ {"GS_PRIM", str[1].c_str()},
+ {NULL, NULL},
+ };
+
+ dev->CompileShader(IDR_CS_FX, "gs_main", macro, &gs[j]);
+
+ m_gs[gs_sel] = gs[j];
+ }
+ }
+
+ // SetupPS
+
+ dev->PSSetSamplerState(m_ss, NULL, NULL);
+
+ PSSelector ps_sel;
+
+ ps_sel.fpsm = context->FRAME.PSM;
+ ps_sel.zpsm = context->ZBUF.PSM;
+
+ CComPtr ps[2] = {m_ps0, NULL};
+
+ hash_map >::const_iterator i = m_ps1.find(ps_sel);
+
+ if(i != m_ps1.end())
+ {
+ ps[1] = i->second;
+ }
+ else
+ {
+ string str[15];
+
+ str[0] = format("%d", PS_BATCH_SIZE);
+ str[1] = format("%d", context->FRAME.PSM);
+ str[2] = format("%d", context->ZBUF.PSM);
+
+ D3D11_SHADER_MACRO macro[] =
+ {
+ {"PS_BATCH_SIZE", str[0].c_str()},
+ {"PS_FPSM", str[1].c_str()},
+ {"PS_ZPSM", str[2].c_str()},
+ {NULL, NULL},
+ };
+
+ dev->CompileShader(IDR_CS_FX, "ps_main1", macro, &ps[1]);
+
+ m_ps1[ps_sel] = ps[1];
+ }
+
+ PSConstantBuffer ps_cb;
+
+ ps_cb.fm = fm;
+ ps_cb.zm = zm;
+
+ ctx->UpdateSubresource(m_ps_cb, 0, NULL, &ps_cb, 0, 0); // TODO: only update if changed
+
+ OffsetBuffer* fzbo = NULL;
+
+ GetOffsetBuffer(&fzbo);
+
+ dev->PSSetShaderResourceView(0, fzbo->row_srv);
+ dev->PSSetShaderResourceView(1, fzbo->col_srv);
+ // TODO: palette, texture
+
+ int step = PS_BATCH_SIZE * GSUtil::GetVertexCount(PRIM->PRIM);
+
+ for(int i = 0; i < m_index.tail; i += step)
+ {
+ dev->IASetPrimitiveTopology(topology);
+ dev->GSSetShader(gs[0]);
+ dev->PSSetShader(ps[0], m_ps_cb);
+ dev->DrawIndexedPrimitive(i, std::min(m_index.tail - i, step));
+
+ dev->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST);
+ dev->GSSetShader(gs[1]);
+ dev->PSSetShader(ps[1], m_ps_cb);
+ dev->DrawIndexedPrimitive(m_index.tail, 2);
+
+ //printf("%d/%d, %d %d %d %d\n", i, m_index.tail, r2.x, r2.y, r2.z, r2.w);
+ }
+
+ dev->EndScene();
+
+ if(0)
+ {
+ std::string s;
+ /*
+ s = format("c:\\temp1\\_%05d_f%lld_fb0_%05x_%d.bmp", s_n, m_perfmon.GetFrame(), 0, 0);
+ m_mem.SaveBMP(s, 0, 16, PSM_PSMCT32, 1024, 1024);
+ Read(m_mem.GetOffset(0, 16, PSM_PSMCT32), GSVector4i(0, 0, 1024, 1024), false);
+ */
+ //
+ if(fm != 0xffffffff) Read(context->offset.fb, r, false);
+ //
+ if(zm != 0xffffffff) Read(context->offset.zb, r, false);
+
+ s = format("c:\\temp1\\_%05d_f%lld_rt1_%05x_%d.bmp", s_n, m_perfmon.GetFrame(), m_context->FRAME.Block(), m_context->FRAME.PSM);
+ m_mem.SaveBMP(s, m_context->FRAME.Block(), m_context->FRAME.FBW, m_context->FRAME.PSM, GetFrameRect().width(), 512);
+
+ s = format("c:\\temp1\\_%05d_f%lld_zt1_%05x_%d.bmp", s_n, m_perfmon.GetFrame(), m_context->ZBUF.Block(), m_context->ZBUF.PSM);
+ m_mem.SaveBMP(s, m_context->ZBUF.Block(), m_context->FRAME.FBW, m_context->ZBUF.PSM, GetFrameRect().width(), 512);
+
+ /*
+ s = format("c:\\temp1\\_%05d_f%lld_fb1_%05x_%d.bmp", s_n, m_perfmon.GetFrame(), 0, 0);
+ m_mem.SaveBMP(s, 0, 16, PSM_PSMCT32, 1024, 1024);
+ */
+
+ s_n++;
+ }
+}
+
+void GSRendererCS::InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r)
+{
+ GSOffset* o = m_mem.GetOffset(BITBLTBUF.DBP, BITBLTBUF.DBW, BITBLTBUF.DPSM);
+
+ Read(o, r, true); // TODO: fully overwritten pages are not needed to be read, only invalidated (important)
+
+ // TODO: false deps, 8H/4HL/4HH texture sharing pages with 24-bit target
+ // TODO: invalidate texture cache
+}
+
+void GSRendererCS::InvalidateLocalMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r, bool clut)
+{
+ GSOffset* o = m_mem.GetOffset(BITBLTBUF.SBP, BITBLTBUF.SBW, BITBLTBUF.SPSM);
+
+ Read(o, r, false);
+}
+
+void GSRendererCS::Write(GSOffset* o, const GSVector4i& r)
+{
+ GSDevice11* dev = (GSDevice11*)m_dev;
+
+ ID3D11DeviceContext* ctx = *dev;
+
+ D3D11_BOX box;
+
+ memset(&box, 0, sizeof(box));
+
+ box.right = 1;
+ box.bottom = 1;
+ box.back = 1;
+
+ uint32* pages = o->GetPages(r);
+
+ for(size_t i = 0; pages[i] != GSOffset::EOP; i++)
+ {
+ uint32 page = pages[i];
+
+ uint32 row = page >> 5;
+ uint32 col = 1 << (page & 31);
+
+ if((m_vm_valid[row] & col) == 0)
+ {
+ m_vm_valid[row] |= col;
+
+ box.left = page * PAGE_SIZE;
+ box.right = (page + 1) * PAGE_SIZE;
+
+ ctx->UpdateSubresource(m_vm, 0, &box, m_mem.m_vm8 + page * PAGE_SIZE, 0, 0);
+/*
+ // m_vm texture row is 2k in bytes, one page is 8k => starting row: addr / 4k, number of rows: 8k / 2k = 4
+
+ box.left = 0;
+ box.right = PAGE_SIZE;
+ box.top = page;
+ box.bottom = box.top + 1;
+
+ ctx->UpdateSubresource(m_vm, 0, &box, m_mem.m_vm8 + page * PAGE_SIZE, 0, 0);
+*/
+ if(0)
+ printf("[%lld] write %05x %d %d (%d)\n", __rdtsc(), o->bp, o->bw, o->psm, page);
+ }
+ }
+
+ delete [] pages;
+}
+
+void GSRendererCS::Read(GSOffset* o, const GSVector4i& r, bool invalidate)
+{
+ GSDevice11* dev = (GSDevice11*)m_dev;
+
+ ID3D11DeviceContext* ctx = *dev;
+
+ D3D11_BOX box;
+
+ memset(&box, 0, sizeof(box));
+
+ box.right = 1;
+ box.bottom = 1;
+ box.back = 1;
+
+ uint32* pages = o->GetPages(r);
+
+ for(size_t i = 0; pages[i] != GSOffset::EOP; i++)
+ {
+ uint32 page = pages[i];
+
+ uint32 row = page >> 5;
+ uint32 col = 1 << (page & 31);
+
+ if(m_vm_valid[row] & col)
+ {
+ if(invalidate)
+ {
+ m_vm_valid[row] ^= col;
+ }
+
+ box.left = page * PAGE_SIZE;
+ box.right = (page + 1) * PAGE_SIZE;
+
+ ctx->CopySubresourceRegion(m_pb, 0, 0, 0, 0, m_vm, 0, &box);
+/*
+ // m_vm texture row is 2k in bytes, one page is 8k => starting row: addr / 4k, number of rows: 8k / 2k = 4
+
+ box.left = 0;
+ box.right = PAGE_SIZE;
+ box.top = page;
+ box.bottom = box.top + 1;
+
+ ctx->CopySubresourceRegion(m_pb, 0, 0, 0, 0, m_vm, 0, &box);
+*/
+ D3D11_MAPPED_SUBRESOURCE map;
+
+ if(SUCCEEDED(ctx->Map(m_pb, 0, D3D11_MAP_READ, 0, &map)))
+ {
+ memcpy(m_mem.m_vm8 + page * PAGE_SIZE, map.pData, PAGE_SIZE);
+
+ ctx->Unmap(m_pb, 0);
+
+ if(0)
+ printf("[%lld] read %05x %d %d (%d)\n", __rdtsc(), o->bp, o->bw, o->psm, page);
+ }
+ }
+ }
+
+ delete [] pages;
+}
+
+bool GSRendererCS::GetOffsetBuffer(OffsetBuffer** fzbo)
+{
+ HRESULT hr;
+
+ GSDevice11* dev = (GSDevice11*)m_dev;
+
+ D3D11_BUFFER_DESC bd;
+ D3D11_SHADER_RESOURCE_VIEW_DESC srvd;
+ D3D11_SUBRESOURCE_DATA data;
+
+ hash_map::iterator i = m_offset.find(m_context->offset.fzb->hash);
+
+ if(i == m_offset.end())
+ {
+ OffsetBuffer ob;
+
+ memset(&bd, 0, sizeof(bd));
+
+ bd.ByteWidth = sizeof(GSVector2i) * 2048;
+ bd.Usage = D3D11_USAGE_IMMUTABLE;
+ bd.BindFlags = D3D11_BIND_SHADER_RESOURCE;
+
+ memset(&data, 0, sizeof(data));
+
+ data.pSysMem = m_context->offset.fzb->row;
+
+ hr = (*dev)->CreateBuffer(&bd, &data, &ob.row);
+
+ if(FAILED(hr)) return false;
+
+ data.pSysMem = m_context->offset.fzb->col;
+
+ hr = (*dev)->CreateBuffer(&bd, &data, &ob.col);
+
+ if(FAILED(hr)) return false;
+
+ memset(&srvd, 0, sizeof(srvd));
+
+ srvd.Format = DXGI_FORMAT_R32G32_SINT;
+ srvd.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
+ srvd.Buffer.FirstElement = 0;
+ srvd.Buffer.NumElements = 2048;
+
+ hr = (*dev)->CreateShaderResourceView(ob.row, &srvd, &ob.row_srv);
+
+ if(FAILED(hr)) return false;
+
+ hr = (*dev)->CreateShaderResourceView(ob.col, &srvd, &ob.col_srv);
+
+ if(FAILED(hr)) return false;
+
+ m_offset[m_context->offset.fzb->hash] = ob;
+
+ i = m_offset.find(m_context->offset.fzb->hash);
+ }
+
+ *fzbo = &i->second;
+
+ return true;
+}
diff --git a/plugins/GSdx/GSRendererCS.h b/plugins/GSdx/GSRendererCS.h
index 8a08e0442..69b25d795 100644
--- a/plugins/GSdx/GSRendererCS.h
+++ b/plugins/GSdx/GSRendererCS.h
@@ -1,145 +1,145 @@
-/*
- * Copyright (C) 2007-2009 Gabest
- * http://www.gabest.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, 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 GNU Make; see the file COPYING. If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- */
-
-#pragma once
-
-#include "GSRenderer.h"
-#include "GSDevice11.h"
-
-class GSRendererCS : public GSRenderer
-{
- struct VSSelector
- {
- union
- {
- struct
- {
- uint32 tme:1;
- uint32 fst:1;
- };
-
- uint32 key;
- };
-
- operator uint32() {return key & 0x3;}
-
- VSSelector() : key(0) {}
- };
-
- __aligned(struct, 32) VSConstantBuffer
- {
- GSVector4 VertexScale;
- GSVector4 VertexOffset;
- };
-
- struct GSSelector
- {
- union
- {
- struct
- {
- uint32 iip:1;
- uint32 prim:2;
- };
-
- uint32 key;
- };
-
- operator uint32() {return key & 0x7;}
-
- GSSelector() : key(0) {}
- };
-
- struct PSSelector
- {
- union
- {
- struct
- {
- uint32 fpsm:6;
- uint32 zpsm:6;
- };
-
- uint32 key;
- };
-
- operator uint32() {return key & 0x3ff;}
-
- PSSelector() : key(0) {}
- };
-
- __aligned(struct, 32) PSConstantBuffer
- {
- uint32 fm;
- uint32 zm;
- };
-
- CComPtr m_dss;
- CComPtr m_bs;
- CComPtr m_ss;
- CComPtr m_lb;
- CComPtr m_lb_uav;
- CComPtr m_lb_srv;
- CComPtr m_sob;
- CComPtr m_sob_uav;
- CComPtr m_sob_srv;
- CComPtr m_vm;
- //CComPtr m_vm;
- CComPtr m_vm_uav;
- uint32 m_vm_valid[16];
- CComPtr m_pb;
- //CComPtr m_pb;
- hash_map m_vs;
- CComPtr m_vs_cb;
- hash_map > m_gs;
- CComPtr m_ps0;
- hash_map > m_ps1;
- CComPtr m_ps_cb;
-
- void Write(GSOffset* o, const GSVector4i& r);
- void Read(GSOffset* o, const GSVector4i& r, bool invalidate);
-
- struct OffsetBuffer
- {
- CComPtr row, col;
- CComPtr row_srv, col_srv;
- };
-
- hash_map m_offset;
-
- bool GetOffsetBuffer(OffsetBuffer** fzbo);
-
-protected:
- GSTexture* m_texture[2];
- uint8* m_output;
-
- bool CreateDevice(GSDevice* dev);
- void ResetDevice();
- void VSync(int field);
- GSTexture* GetOutput(int i);
- void Draw();
- void InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r);
- void InvalidateLocalMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r, bool clut);
-
-public:
- GSRendererCS();
- virtual ~GSRendererCS();
-};
+/*
+ * Copyright (C) 2007-2009 Gabest
+ * http://www.gabest.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, 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 GNU Make; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ */
+
+#pragma once
+
+#include "GSRenderer.h"
+#include "GSDevice11.h"
+
+class GSRendererCS : public GSRenderer
+{
+ struct VSSelector
+ {
+ union
+ {
+ struct
+ {
+ uint32 tme:1;
+ uint32 fst:1;
+ };
+
+ uint32 key;
+ };
+
+ operator uint32() {return key & 0x3;}
+
+ VSSelector() : key(0) {}
+ };
+
+ __aligned(struct, 32) VSConstantBuffer
+ {
+ GSVector4 VertexScale;
+ GSVector4 VertexOffset;
+ };
+
+ struct GSSelector
+ {
+ union
+ {
+ struct
+ {
+ uint32 iip:1;
+ uint32 prim:2;
+ };
+
+ uint32 key;
+ };
+
+ operator uint32() {return key & 0x7;}
+
+ GSSelector() : key(0) {}
+ };
+
+ struct PSSelector
+ {
+ union
+ {
+ struct
+ {
+ uint32 fpsm:6;
+ uint32 zpsm:6;
+ };
+
+ uint32 key;
+ };
+
+ operator uint32() {return key & 0x3ff;}
+
+ PSSelector() : key(0) {}
+ };
+
+ __aligned(struct, 32) PSConstantBuffer
+ {
+ uint32 fm;
+ uint32 zm;
+ };
+
+ CComPtr m_dss;
+ CComPtr m_bs;
+ CComPtr m_ss;
+ CComPtr m_lb;
+ CComPtr m_lb_uav;
+ CComPtr m_lb_srv;
+ CComPtr m_sob;
+ CComPtr m_sob_uav;
+ CComPtr m_sob_srv;
+ CComPtr m_vm;
+ //CComPtr m_vm;
+ CComPtr m_vm_uav;
+ uint32 m_vm_valid[16];
+ CComPtr m_pb;
+ //CComPtr m_pb;
+ hash_map m_vs;
+ CComPtr m_vs_cb;
+ hash_map > m_gs;
+ CComPtr m_ps0;
+ hash_map > m_ps1;
+ CComPtr m_ps_cb;
+
+ void Write(GSOffset* o, const GSVector4i& r);
+ void Read(GSOffset* o, const GSVector4i& r, bool invalidate);
+
+ struct OffsetBuffer
+ {
+ CComPtr row, col;
+ CComPtr row_srv, col_srv;
+ };
+
+ hash_map m_offset;
+
+ bool GetOffsetBuffer(OffsetBuffer** fzbo);
+
+protected:
+ GSTexture* m_texture[2];
+ uint8* m_output;
+
+ bool CreateDevice(GSDevice* dev);
+ void ResetDevice();
+ void VSync(int field);
+ GSTexture* GetOutput(int i);
+ void Draw();
+ void InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r);
+ void InvalidateLocalMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r, bool clut);
+
+public:
+ GSRendererCS();
+ virtual ~GSRendererCS();
+};
diff --git a/plugins/GSdx/GSRendererDX.cpp b/plugins/GSdx/GSRendererDX.cpp
index c8b447a79..1f853ed3f 100644
--- a/plugins/GSdx/GSRendererDX.cpp
+++ b/plugins/GSdx/GSRendererDX.cpp
@@ -29,8 +29,9 @@ GSRendererDX::GSRendererDX(GSTextureCache* tc, const GSVector2& pixelcenter)
{
m_logz = !!theApp.GetConfig("logz", 0);
m_fba = !!theApp.GetConfig("fba", 1);
- //UserHacks_HalfPixelOffset = !!theApp.GetConfig("UserHacks_HalfPixelOffset", 0);
- UserHacks_AlphaHack = !!theApp.GetConfig("UserHacks_AlphaHack", 0);
+
+ UserHacks_AlphaHack = !!theApp.GetConfig("UserHacks_AlphaHack", 0) && !!theApp.GetConfig("UserHacks", 0);
+ UserHacks_WildHack = !!theApp.GetConfig("UserHacks", 0) ? theApp.GetConfig("UserHacks_WildHack", 0) : 0;
}
GSRendererDX::~GSRendererDX()
@@ -280,8 +281,9 @@ void GSRendererDX::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sourc
ps_sel.aem = env.TEXA.AEM;
ps_sel.tfx = context->TEX0.TFX;
ps_sel.tcc = context->TEX0.TCC;
- ps_sel.ltf = m_filter == 2 ? m_vt.IsLinear() : m_filter;
+ ps_sel.ltf = m_filter == 2 ? m_vt.IsLinear() : m_filter;
ps_sel.rt = tex->m_target;
+ ps_sel.spritehack = tex->m_spritehack_t;
int w = tex->m_texture->GetWidth();
int h = tex->m_texture->GetHeight();
diff --git a/plugins/GSdx/GSRendererDX.h b/plugins/GSdx/GSRendererDX.h
index 13dfbc48c..c3dc63127 100644
--- a/plugins/GSdx/GSRendererDX.h
+++ b/plugins/GSdx/GSRendererDX.h
@@ -28,7 +28,7 @@ class GSRendererDX : public GSRendererHW
GSVector2 m_pixelcenter;
bool m_logz;
bool m_fba;
- //bool UserHacks_HalfPixelOffset;
+
bool UserHacks_AlphaHack;
protected:
@@ -36,6 +36,8 @@ protected:
virtual void SetupIA() = 0;
virtual void UpdateFBA(GSTexture* rt) {}
+ int UserHacks_WildHack;
+
public:
GSRendererDX(GSTextureCache* tc, const GSVector2& pixelcenter = GSVector2(0, 0));
virtual ~GSRendererDX();
diff --git a/plugins/GSdx/GSRendererDX11.cpp b/plugins/GSdx/GSRendererDX11.cpp
index 2feb6c7ec..a6e48d836 100644
--- a/plugins/GSdx/GSRendererDX11.cpp
+++ b/plugins/GSdx/GSRendererDX11.cpp
@@ -45,8 +45,17 @@ void GSRendererDX11::SetupIA()
if(dev->IAMapVertexBuffer(&ptr, sizeof(GSVertex), m_vertex.next))
{
- GSVector4i::storent(ptr, m_vertex.buff, sizeof(GSVertex) * m_vertex.next);
-
+ GSVector4i::storent(ptr, m_vertex.buff, sizeof(GSVertex) * m_vertex.next);
+
+ if(UserHacks_WildHack && !isPackedUV_HackFlag)
+ {
+ GSVertex* RESTRICT d = (GSVertex*)ptr;
+
+ for(unsigned int i = 0; i < m_vertex.next; i++, d++)
+ if(PRIM->TME && PRIM->FST)
+ d->UV &= UserHacks_WildHack == 1 ? 0x3FEF3FEF : 0x3FF73FF7;
+ }
+
dev->IAUnmapVertexBuffer();
}
diff --git a/plugins/GSdx/GSRendererDX9.cpp b/plugins/GSdx/GSRendererDX9.cpp
index ab0143e17..d33d7b32e 100644
--- a/plugins/GSdx/GSRendererDX9.cpp
+++ b/plugins/GSdx/GSRendererDX9.cpp
@@ -199,7 +199,15 @@ void GSRendererDX9::SetupIA()
{
if(PRIM->FST)
{
- t = GSVector4(GSVector4i::load(s->UV).upl16());
+ if(UserHacks_WildHack && !isPackedUV_HackFlag)
+ {
+ t = GSVector4(GSVector4i::load(UserHacks_WildHack == 1?
+ s->UV & 0x3FEF3FEF : s->UV & 0x3FF73FF7).upl16());
+
+ //printf("GSDX: %08X | D3D9(%d) %s\n", s->UV & 0x3FEF3FEF, m_vertex.next, i == 0 ? "*" : "");
+ }
+ else
+ t = GSVector4(GSVector4i::load(s->UV).upl16());
}
else
{
diff --git a/plugins/GSdx/GSRendererHW.cpp b/plugins/GSdx/GSRendererHW.cpp
index c773999d5..cb27133ca 100644
--- a/plugins/GSdx/GSRendererHW.cpp
+++ b/plugins/GSdx/GSRendererHW.cpp
@@ -31,7 +31,7 @@ GSRendererHW::GSRendererHW(GSTextureCache* tc)
, m_upscale_multiplier(1)
{
m_upscale_multiplier = theApp.GetConfig("upscale_multiplier", 1);
- m_userhacks_skipdraw = theApp.GetConfig("UserHacks_SkipDraw", 0);
+ m_userhacks_skipdraw = !!theApp.GetConfig("UserHacks", 0) ? theApp.GetConfig("UserHacks_SkipDraw", 0) : 0;
if(!m_nativeres)
{
@@ -424,16 +424,18 @@ bool GSRendererHW::OI_FFXII(GSTexture* rt, GSTexture* ds, GSTextureCache::Source
if(!video) video = new uint32[512 * 512];
- int ox = m_context->XYOFFSET.OFX;
- int oy = m_context->XYOFFSET.OFY;
+ int ox = m_context->XYOFFSET.OFX - 8;
+ int oy = m_context->XYOFFSET.OFY - 8;
const GSVertex* RESTRICT v = m_vertex.buff;
- for(int i = (int)m_vertex.next; i >= 0; i--, v++)
+ for(int i = (int)m_vertex.next; i > 0; i--, v++)
{
int x = (v->XYZ.X - ox) >> 4;
int y = (v->XYZ.Y - oy) >> 4;
-
+
+ if (x < 0 || x >= 448 || y < 0 || y >= (int)lines) return false; // le sigh
+
video[(y << 8) + (y << 7) + (y << 6) + x] = v->RGBAQ.u32[0];
}
@@ -504,7 +506,7 @@ bool GSRendererHW::OI_MetalSlug6(GSTexture* rt, GSTexture* ds, GSTextureCache::S
GSVertex* RESTRICT v = m_vertex.buff;
- for(int i = (int)m_vertex.next; i >= 0; i--, v++)
+ for(int i = (int)m_vertex.next; i > 0; i--, v++)
{
uint32 c = v->RGBAQ.u32[0];
diff --git a/plugins/GSdx/GSRendererSW.cpp b/plugins/GSdx/GSRendererSW.cpp
index 44de11026..8209d5b81 100644
--- a/plugins/GSdx/GSRendererSW.cpp
+++ b/plugins/GSdx/GSRendererSW.cpp
@@ -426,21 +426,9 @@ void GSRendererSW::Draw()
//
- if(LOG)
- {
- fprintf(s_fp, "[%d] queue %05x %d (%d) %05x %d (%d) %05x %d %dx%d (%d %d %d) | %d %d %d\n",
- sd->counter,
- m_context->FRAME.Block(), m_context->FRAME.PSM, gd.sel.fwrite,
- m_context->ZBUF.Block(), m_context->ZBUF.PSM, gd.sel.zwrite,
- PRIM->TME ? m_context->TEX0.TBP0 : 0xfffff, m_context->TEX0.PSM, (int)m_context->TEX0.TW, (int)m_context->TEX0.TH, m_context->TEX0.CSM, m_context->TEX0.CPSM, m_context->TEX0.CSA,
- PRIM->PRIM, sd->vertex_count, sd->index_count);
-
- fflush(s_fp);
- }
-
if(s_dump)
{
- Sync(3);
+ Sync(2);
uint64 frame = m_perfmon.GetFrame();
@@ -473,7 +461,7 @@ void GSRendererSW::Draw()
Queue(data);
- Sync(4);
+ Sync(3);
if(s_save && s_n >= s_saven)
{
@@ -514,13 +502,34 @@ void GSRendererSW::Queue(shared_ptr& item)
if(sd->m_syncpoint == SharedData::SyncSource)
{
- m_rl->Sync();
+ Sync(4);
}
// update previously invalidated parts
sd->UpdateSource();
+ if(sd->m_syncpoint == SharedData::SyncTarget)
+ {
+ Sync(5);
+ }
+
+ if(LOG)
+ {
+ GSScanlineGlobalData& gd = ((SharedData*)item.get())->global;
+
+ fprintf(s_fp, "[%d] queue %05x %d (%d) %05x %d (%d) %05x %d %dx%d (%d %d %d) | %d %d %d\n",
+ sd->counter,
+ m_context->FRAME.Block(), m_context->FRAME.PSM, gd.sel.fwrite,
+ m_context->ZBUF.Block(), m_context->ZBUF.PSM, gd.sel.zwrite,
+ PRIM->TME ? m_context->TEX0.TBP0 : 0xfffff, m_context->TEX0.PSM, (int)m_context->TEX0.TW, (int)m_context->TEX0.TH, m_context->TEX0.CSM, m_context->TEX0.CPSM, m_context->TEX0.CSA,
+ PRIM->PRIM, sd->vertex_count, sd->index_count);
+
+ fflush(s_fp);
+ }
+
+ m_rl->Queue(item);
+
// invalidate new parts rendered onto
if(sd->global.sel.fwrite)
@@ -532,13 +541,6 @@ void GSRendererSW::Queue(shared_ptr& item)
{
m_tc->InvalidatePages(sd->m_zb_pages, sd->m_zpsm);
}
-
- if(sd->m_syncpoint == SharedData::SyncTarget)
- {
- m_rl->Sync();
- }
-
- m_rl->Queue(item);
}
void GSRendererSW::Sync(int reason)
@@ -597,7 +599,7 @@ void GSRendererSW::InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const GS
{
if(m_fzb_pages[*p] | m_tex_pages[*p])
{
- Sync(5);
+ Sync(6);
break;
}
@@ -680,6 +682,8 @@ bool GSRendererSW::CheckTargetPages(const uint32* fb_pages, const uint32* zb_pag
bool fb = fb_pages != NULL;
bool zb = zb_pages != NULL;
+ bool res = false;
+
if(m_fzb != m_context->offset.fzb4)
{
// targets changed, check everything
@@ -724,7 +728,7 @@ bool GSRendererSW::CheckTargetPages(const uint32* fb_pages, const uint32* zb_pag
{
if(LOG) {fprintf(s_fp, "syncpoint 0\n"); fflush(s_fp);}
- return true;
+ res = true;
}
//if(LOG) {fprintf(s_fp, "no syncpoint *\n"); fflush(s_fp);}
@@ -785,7 +789,7 @@ bool GSRendererSW::CheckTargetPages(const uint32* fb_pages, const uint32* zb_pag
{
if(LOG) {fprintf(s_fp, "syncpoint 1\n"); fflush(s_fp);}
- return true;
+ res = true;
}
}
}
@@ -795,7 +799,7 @@ bool GSRendererSW::CheckTargetPages(const uint32* fb_pages, const uint32* zb_pag
// chross-check frame and z-buffer pages, they cannot overlap with eachother and with previous batches in queue,
// have to be careful when the two buffers are mutually enabled/disabled and alternating (Bully FBP/ZBP = 0x2300)
- if(fb)
+ if(fb && !res)
{
for(const uint32* p = fb_pages; *p != GSOffset::EOP; p++)
{
@@ -803,12 +807,14 @@ bool GSRendererSW::CheckTargetPages(const uint32* fb_pages, const uint32* zb_pag
{
if(LOG) {fprintf(s_fp, "syncpoint 2\n"); fflush(s_fp);}
- return true;
+ res = true;
+
+ break;
}
}
}
- if(zb)
+ if(zb && !res)
{
for(const uint32* p = zb_pages; *p != GSOffset::EOP; p++)
{
@@ -816,14 +822,19 @@ bool GSRendererSW::CheckTargetPages(const uint32* fb_pages, const uint32* zb_pag
{
if(LOG) {fprintf(s_fp, "syncpoint 3\n"); fflush(s_fp);}
- return true;
+ res = true;
+
+ break;
}
}
}
}
}
- return false;
+ if(!fb && fb_pages != NULL) delete [] fb_pages;
+ if(!zb && zb_pages != NULL) delete [] zb_pages;
+
+ return res;
}
bool GSRendererSW::CheckSourcePages(SharedData* sd)
@@ -1057,12 +1068,6 @@ bool GSRendererSW::GetScanlineGlobalData(SharedData* data)
static int s_counter = 0;
- if(0)
- //if(context->TEX0.TH > context->TEX0.TW)
- //if(s_n >= s_saven && s_n < s_saven + 3)
- //if(context->TEX0.TBP0 >= 0x2b80 && context->TEX0.TBW == 2 && context->TEX0.PSM == PSM_PSMT4)
- t->Save(format("c:/temp1/%08d_%05x_0.bmp", s_counter, context->TEX0.TBP0));
-
for(int i = 1, j = std::min((int)context->TEX1.MXL, 6); i <= j; i++)
{
switch(i)
@@ -1334,7 +1339,7 @@ bool GSRendererSW::GetScanlineGlobalData(SharedData* data)
gd.zm |= GSVector4i::xffff0000();
}
- if(gd.sel.prim == GS_SPRITE_CLASS && !gd.sel.ftest && !gd.sel.ztest && data->bbox.eq(data->bbox.rintersect(data->scissor)))
+ if(gd.sel.prim == GS_SPRITE_CLASS && !gd.sel.ftest && !gd.sel.ztest && data->bbox.eq(data->bbox.rintersect(data->scissor))) // TODO: check scissor horizontally only
{
gd.sel.notest = 1;
@@ -1464,21 +1469,37 @@ void GSRendererSW::SharedData::UpdateSource()
global.sel.tfx = TFX_NONE;
}
+ }
- // TODO
+ // TODO
- if(m_parent->s_dump)
+ if(m_parent->s_dump)
+ {
+ uint64 frame = m_parent->m_perfmon.GetFrame();
+
+ string s;
+
+ if(m_parent->s_save && m_parent->s_n >= m_parent->s_saven)
{
- uint64 frame = m_parent->m_perfmon.GetFrame();
-
- string s;
-
- if(m_parent->s_save && m_parent->s_n >= m_parent->s_saven)
+ for(size_t i = 0; m_tex[i].t != NULL; i++)
{
s = format("c:\\temp1\\_%05d_f%lld_tex%d_%05x_%d.bmp", m_parent->s_n - 2, frame, i, (int)m_parent->m_context->TEX0.TBP0, (int)m_parent->m_context->TEX0.PSM);
m_tex[i].t->Save(s);
}
+
+ if(global.clut != NULL)
+ {
+ GSTextureSW* t = new GSTextureSW(0, 256, 1);
+
+ t->Update(GSVector4i(0, 0, 256, 1), global.clut, sizeof(uint32) * 256);
+
+ s = format("c:\\temp1\\_%05d_f%lld_texp_%05x_%d.bmp", m_parent->s_n - 2, frame, (int)m_parent->m_context->TEX0.TBP0, (int)m_parent->m_context->TEX0.PSM);
+
+ t->Save(s);
+
+ delete t;
+ }
}
}
}
diff --git a/plugins/GSdx/GSScanlineEnvironment.h b/plugins/GSdx/GSScanlineEnvironment.h
index a8d9637c4..aee43b840 100644
--- a/plugins/GSdx/GSScanlineEnvironment.h
+++ b/plugins/GSdx/GSScanlineEnvironment.h
@@ -24,8 +24,6 @@
#include "GSLocalMemory.h"
#include "GSVector.h"
-#define GS_BILINEAR_PRECISION 4 // max precision 15, but several games like okami, rogue galaxy, dq8 break above 4
-
union GSScanlineSelector
{
struct
@@ -70,6 +68,7 @@ union GSScanlineSelector
uint32 lcm:1; // 52
uint32 mmin:2; // 53
uint32 notest:1; // 54 (no ztest, no atest, no date, no scissor test, and horizontally aligned to 4 pixels)
+ // TODO: 1D texture flag? could save 2 texture reads and 4 lerps with bilinear, and also the texture coordinate clamp/wrap code in one direction
};
struct
diff --git a/plugins/GSdx/GSSettingsDlg.cpp b/plugins/GSdx/GSSettingsDlg.cpp
index 905b8b5f1..deaad5004 100644
--- a/plugins/GSdx/GSSettingsDlg.cpp
+++ b/plugins/GSdx/GSSettingsDlg.cpp
@@ -94,7 +94,7 @@ void GSSettingsDlg::OnInit()
}
ComboBoxInit(IDC_RENDERER, renderers, theApp.GetConfig("Renderer", 0));
- ComboBoxInit(IDC_INTERLACE, theApp.m_gs_interlace, theApp.GetConfig("Interlace", 0));
+ ComboBoxInit(IDC_INTERLACE, theApp.m_gs_interlace, theApp.GetConfig("Interlace", 7)); // 7 = "auto", detects interlace based on SMODE2 register
ComboBoxInit(IDC_ASPECTRATIO, theApp.m_gs_aspectratio, theApp.GetConfig("AspectRatio", 1));
ComboBoxInit(IDC_UPSCALE_MULTIPLIER, theApp.m_gs_upscale_multiplier, theApp.GetConfig("upscale_multiplier", 1));
@@ -106,11 +106,13 @@ void GSSettingsDlg::OnInit()
CheckDlgButton(m_hWnd, IDC_FBA, theApp.GetConfig("fba", 1));
CheckDlgButton(m_hWnd, IDC_AA1, theApp.GetConfig("aa1", 0));
CheckDlgButton(m_hWnd, IDC_NATIVERES, theApp.GetConfig("nativeres", 0));
+
+ // Shade Boost
+ CheckDlgButton(m_hWnd, IDC_SHADEBOOST, theApp.GetConfig("ShadeBoost", 0));
+
// Hacks
- CheckDlgButton(m_hWnd, IDC_ALPHAHACK, theApp.GetConfig("UserHacks_AlphaHack", 0));
- CheckDlgButton(m_hWnd, IDC_OFFSETHACK, theApp.GetConfig("UserHacks_HalfPixelOffset", 0));
- SendMessage(GetDlgItem(m_hWnd, IDC_SKIPDRAWHACK), UDM_SETRANGE, 0, MAKELPARAM(1000, 0));
- SendMessage(GetDlgItem(m_hWnd, IDC_SKIPDRAWHACK), UDM_SETPOS, 0, MAKELPARAM(theApp.GetConfig("UserHacks_SkipDraw", 0), 0));
+ CheckDlgButton(m_hWnd, IDC_HACKS_ENABLED, theApp.GetConfig("UserHacks", 0));
+
SendMessage(GetDlgItem(m_hWnd, IDC_RESX), UDM_SETRANGE, 0, MAKELPARAM(8192, 256));
SendMessage(GetDlgItem(m_hWnd, IDC_RESX), UDM_SETPOS, 0, MAKELPARAM(theApp.GetConfig("resx", 1024), 0));
@@ -118,17 +120,6 @@ void GSSettingsDlg::OnInit()
SendMessage(GetDlgItem(m_hWnd, IDC_RESY), UDM_SETRANGE, 0, MAKELPARAM(8192, 256));
SendMessage(GetDlgItem(m_hWnd, IDC_RESY), UDM_SETPOS, 0, MAKELPARAM(theApp.GetConfig("resy", 1024), 0));
- int r = theApp.GetConfig("Renderer", 0);
-
- if(r >= 0 && r <= 2) // DX9
- {
- GSDevice9::ForceValidMsaaConfig();
-
- m_lastValidMsaa = theApp.GetConfig("msaa", 0);
- }
-
- SendMessage(GetDlgItem(m_hWnd, IDC_MSAA), UDM_SETRANGE, 0, MAKELPARAM(16, 0));
- SendMessage(GetDlgItem(m_hWnd, IDC_MSAA), UDM_SETPOS, 0, MAKELPARAM(theApp.GetConfig("msaa", 0), 0));
SendMessage(GetDlgItem(m_hWnd, IDC_SWTHREADS), UDM_SETRANGE, 0, MAKELPARAM(16, 0));
SendMessage(GetDlgItem(m_hWnd, IDC_SWTHREADS), UDM_SETPOS, 0, MAKELPARAM(theApp.GetConfig("extrathreads", 0), 0));
@@ -138,76 +129,7 @@ void GSSettingsDlg::OnInit()
bool GSSettingsDlg::OnCommand(HWND hWnd, UINT id, UINT code)
{
- if(id == IDC_MSAAEDIT && code == EN_CHANGE) // validate and possibly warn user when changing msaa
- {
- //post change
-
- bool dx9 = false;
-
- INT_PTR i;
-
- if(ComboBoxGetSelData(IDC_RENDERER, i))
- {
- dx9 = i >= 0 && i <= 2;
- }
-
- if(dx9)
- {
- uint32 requestedMsaa = (int)SendMessage(GetDlgItem(m_hWnd, IDC_MSAA), UDM_GETPOS, 0, 0); // valid from OnCommand?
- uint32 derivedDepth = GSDevice9::GetMaxDepth(requestedMsaa);
-
- if(derivedDepth == 0)
- {
- //FIXME: Ugly UI: HW AA is currently a uint spinbox but usually only some values are supported (e.g. only 2/4/8 or a similar set).
- // Better solution would be to use a drop-down with only valid msaa values such that we don't need this. Maybe some day.
- // Known bad behavior: When manually deleting a HW AA value to put another instead (e.g. 2 -> delete -> 4)
- // it's registered as 0 after the deletion (with possible higher derived z bits), and might issue
- // a warning when the new value is registered (i.e. 4 in our example) since it might result in fewer
- // z bits than 0, even if it's not different than the previous value (i.e. 2 in our example) z bits.
-
- //Find valid msaa values, regardless of derived z buffer bits
-
- string supportedAa = "";
-
- for(int i = 2; i <= 16; i++)
- {
- if(GSDevice9::GetMaxDepth(i))
- {
- if(supportedAa.length()) supportedAa += "/";
-
- supportedAa += format("%d", i);
- }
- }
-
- if(!supportedAa.length())
- {
- supportedAa = "None";
- }
-
- string s = format("AA=%d is not supported.\nSupported AA values: %s.", (int)requestedMsaa, supportedAa.c_str());
-
- MessageBox(hWnd, s.c_str(),"Warning", MB_OK | MB_ICONWARNING);
-
- SendMessage(GetDlgItem(m_hWnd, IDC_MSAA), UDM_SETPOS, 0, requestedMsaa = m_lastValidMsaa); // revert value from inside OnCommand? is this OK?
- }
- else if(derivedDepth < GSDevice9::GetMaxDepth(m_lastValidMsaa))
- {
- string s = format("AA=%d will force GSdx to degrade Z buffer\nfrom 32 to 24 bit, which will probably cause glitches\n(changing 'Logarithmic Z' might help some).\n\nContinue?", (int)requestedMsaa);
-
- //s+= format("\nlastMsaa=%d, lastDepth=%d, newMsaa=%d, newDepth=%d", (int)m_lastValidMsaa, (int)GSDevice9::GetMaxDepth(m_lastValidMsaa), (int)requestedMsaa, (int)GSDevice9::GetMaxDepth(requestedMsaa));
-
- if(IDOK != MessageBox(hWnd, s.c_str(), "Warning", MB_OKCANCEL|MB_ICONWARNING))
- {
- SendMessage(GetDlgItem(m_hWnd, IDC_MSAA), UDM_SETPOS, 0, requestedMsaa=m_lastValidMsaa); // revert value from inside OnCommand? is this OK?
- }
- }
-
- m_lastValidMsaa = requestedMsaa;
-
- UpdateControls();
- }
- }
- else if(id == IDC_UPSCALE_MULTIPLIER && code == CBN_SELCHANGE)
+ if(id == IDC_UPSCALE_MULTIPLIER && code == CBN_SELCHANGE)
{
UpdateControls();
}
@@ -219,6 +141,22 @@ bool GSSettingsDlg::OnCommand(HWND hWnd, UINT id, UINT code)
{
UpdateControls();
}
+ else if(id == IDC_SHADEBOOST && code == BN_CLICKED)
+ {
+ UpdateControls();
+ }
+ else if(id == IDC_SHADEBUTTON && code == BN_CLICKED)
+ {
+ ShadeBoostDlg.DoModal();
+ }
+ else if(id == IDC_HACKS_ENABLED && code == BN_CLICKED)
+ {
+ UpdateControls();
+ }
+ else if(id == IDC_HACKSBUTTON && code == BN_CLICKED)
+ {
+ HacksDlg.DoModal();
+ }
else if(id == IDOK)
{
INT_PTR data;
@@ -271,23 +209,21 @@ bool GSSettingsDlg::OnCommand(HWND hWnd, UINT id, UINT code)
theApp.SetConfig("resx", (int)SendMessage(GetDlgItem(m_hWnd, IDC_RESX), UDM_GETPOS, 0, 0));
theApp.SetConfig("resy", (int)SendMessage(GetDlgItem(m_hWnd, IDC_RESY), UDM_GETPOS, 0, 0));
theApp.SetConfig("extrathreads", (int)SendMessage(GetDlgItem(m_hWnd, IDC_SWTHREADS), UDM_GETPOS, 0, 0));
- theApp.SetConfig("msaa", (int)SendMessage(GetDlgItem(m_hWnd, IDC_MSAA), UDM_GETPOS, 0, 0));
+
+ // Shade Boost
+ theApp.SetConfig("ShadeBoost", (int)IsDlgButtonChecked(m_hWnd, IDC_SHADEBOOST));
+
// Hacks
- theApp.SetConfig("UserHacks_AlphaHack", (int)IsDlgButtonChecked(m_hWnd, IDC_ALPHAHACK));
- theApp.SetConfig("UserHacks_HalfPixelOffset", (int)IsDlgButtonChecked(m_hWnd, IDC_OFFSETHACK));
- theApp.SetConfig("UserHacks_SkipDraw", (int)SendMessage(GetDlgItem(m_hWnd, IDC_SKIPDRAWHACK), UDM_GETPOS, 0, 0));
+ theApp.SetConfig("UserHacks", (int)IsDlgButtonChecked(m_hWnd, IDC_HACKS_ENABLED));
}
return __super::OnCommand(hWnd, id, code);
}
-
void GSSettingsDlg::UpdateControls()
{
INT_PTR i;
- bool allowHacks = !!theApp.GetConfig("allowHacks", 0);
-
int scaling = 1; // in case reading the combo doesn't work, enable the custom res control anyway
if(ComboBoxGetSelData(IDC_UPSCALE_MULTIPLIER, i))
@@ -320,19 +256,266 @@ void GSSettingsDlg::UpdateControls()
//EnableWindow(GetDlgItem(m_hWnd, IDC_AA1), sw); // Let uers set software params regardless of renderer used
//EnableWindow(GetDlgItem(m_hWnd, IDC_SWTHREADS_EDIT), sw);
//EnableWindow(GetDlgItem(m_hWnd, IDC_SWTHREADS), sw);
- EnableWindow(GetDlgItem(m_hWnd, IDC_MSAAEDIT), hw);
- EnableWindow(GetDlgItem(m_hWnd, IDC_MSAA), hw);
- //ShowWindow(GetDlgItem(m_hWnd, IDC_USERHACKS), allowHacks && hw) ? SW_SHOW : SW_HIDE; //Don't disable the "Hacks" frame
- ShowWindow(GetDlgItem(m_hWnd, IDC_MSAAEDIT), allowHacks && hw) ? SW_SHOW : SW_HIDE;
- ShowWindow(GetDlgItem(m_hWnd, IDC_MSAA), allowHacks && hw) ? SW_SHOW : SW_HIDE;
- ShowWindow(GetDlgItem(m_hWnd, IDC_STATIC_TEXT_HWAA), allowHacks && hw) ? SW_SHOW : SW_HIDE;
-
- ShowWindow(GetDlgItem(m_hWnd, IDC_ALPHAHACK), allowHacks && hw) ? SW_SHOW : SW_HIDE;
- ShowWindow(GetDlgItem(m_hWnd, IDC_OFFSETHACK), allowHacks && hw) ? SW_SHOW : SW_HIDE;
-
- ShowWindow(GetDlgItem(m_hWnd, IDC_SKIPDRAWHACKEDIT), allowHacks && hw) ? SW_SHOW : SW_HIDE;
- ShowWindow(GetDlgItem(m_hWnd, IDC_SKIPDRAWHACK), allowHacks && hw) ? SW_SHOW : SW_HIDE;
- ShowWindow(GetDlgItem(m_hWnd, IDC_STATIC_TEXT_SKIPDRAW), allowHacks && hw) ? SW_SHOW : SW_HIDE;
+
+ // Shade Boost
+ EnableWindow(GetDlgItem(m_hWnd, IDC_SHADEBUTTON), IsDlgButtonChecked(m_hWnd, IDC_SHADEBOOST) == BST_CHECKED);
+
+ // Hacks
+ EnableWindow(GetDlgItem(m_hWnd, IDC_HACKS_ENABLED), hw);
+ EnableWindow(GetDlgItem(m_hWnd, IDC_HACKSBUTTON), hw /*&& IsDlgButtonChecked(m_hWnd, IDC_HACKS_ENABLED) == BST_CHECKED*/);
}
}
+
+// Shade Boost Dialog
+
+GSShadeBostDlg::GSShadeBostDlg() :
+ GSDialog(IDD_SHADEBOOST)
+{}
+
+void GSShadeBostDlg::OnInit()
+{
+ contrast = theApp.GetConfig("ShadeBoost_Contrast", 50);
+ brightness = theApp.GetConfig("ShadeBoost_Brightness", 50);
+ saturation = theApp.GetConfig("ShadeBoost_Saturation", 50);
+
+ UpdateControls();
+}
+
+void GSShadeBostDlg::UpdateControls()
+{
+ SendMessage(GetDlgItem(m_hWnd, IDC_SATURATION_SLIDER), TBM_SETRANGE, TRUE, MAKELONG(0, 100));
+ SendMessage(GetDlgItem(m_hWnd, IDC_BRIGHTNESS_SLIDER), TBM_SETRANGE, TRUE, MAKELONG(0, 100));
+ SendMessage(GetDlgItem(m_hWnd, IDC_CONTRAST_SLIDER), TBM_SETRANGE, TRUE, MAKELONG(0, 100));
+
+ SendMessage(GetDlgItem(m_hWnd, IDC_SATURATION_SLIDER), TBM_SETPOS, TRUE, saturation);
+ SendMessage(GetDlgItem(m_hWnd, IDC_BRIGHTNESS_SLIDER), TBM_SETPOS, TRUE, brightness);
+ SendMessage(GetDlgItem(m_hWnd, IDC_CONTRAST_SLIDER), TBM_SETPOS, TRUE, contrast);
+
+ char text[8] = {0};
+
+ sprintf(text, "%d", saturation);
+ SetDlgItemText(m_hWnd, IDC_SATURATION_TEXT, text);
+ sprintf(text, "%d", brightness);
+ SetDlgItemText(m_hWnd, IDC_BRIGHTNESS_TEXT, text);
+ sprintf(text, "%d", contrast);
+ SetDlgItemText(m_hWnd, IDC_CONTRAST_TEXT, text);
+}
+
+bool GSShadeBostDlg::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)
+{
+ switch(message)
+ {
+ case WM_HSCROLL:
+ {
+ if((HWND)lParam == GetDlgItem(m_hWnd, IDC_SATURATION_SLIDER))
+ {
+ char text[8] = {0};
+
+ saturation = SendMessage(GetDlgItem(m_hWnd, IDC_SATURATION_SLIDER),TBM_GETPOS,0,0);
+
+ sprintf(text, "%d", saturation);
+ SetDlgItemText(m_hWnd, IDC_SATURATION_TEXT, text);
+ }
+ else if((HWND)lParam == GetDlgItem(m_hWnd, IDC_BRIGHTNESS_SLIDER))
+ {
+ char text[8] = {0};
+
+ brightness = SendMessage(GetDlgItem(m_hWnd, IDC_BRIGHTNESS_SLIDER),TBM_GETPOS,0,0);
+
+ sprintf(text, "%d", brightness);
+ SetDlgItemText(m_hWnd, IDC_BRIGHTNESS_TEXT, text);
+ }
+ else if((HWND)lParam == GetDlgItem(m_hWnd, IDC_CONTRAST_SLIDER))
+ {
+ char text[8] = {0};
+
+ contrast = SendMessage(GetDlgItem(m_hWnd, IDC_CONTRAST_SLIDER),TBM_GETPOS,0,0);
+
+ sprintf(text, "%d", contrast);
+ SetDlgItemText(m_hWnd, IDC_CONTRAST_TEXT, text);
+ }
+ } break;
+
+ case WM_COMMAND:
+ {
+ int id = LOWORD(wParam);
+
+ switch(id)
+ {
+ case IDOK:
+ {
+ theApp.SetConfig("ShadeBoost_Contrast", contrast);
+ theApp.SetConfig("ShadeBoost_Brightness", brightness);
+ theApp.SetConfig("ShadeBoost_Saturation", saturation);
+ EndDialog(m_hWnd, id);
+ } break;
+
+ case IDRESET:
+ {
+ contrast = 50;
+ brightness = 50;
+ saturation = 50;
+
+ UpdateControls();
+ } break;
+ }
+
+ } break;
+
+ case WM_CLOSE:EndDialog(m_hWnd, IDCANCEL); break;
+
+ default: return false;
+ }
+
+
+ return true;
+}
+
+// Hacks Dialog
+
+GSHacksDlg::GSHacksDlg() :
+ GSDialog(IDD_HACKS)
+{
+ memset(msaa2cb, 0, sizeof(msaa2cb));
+ memset(cb2msaa, 0, sizeof(cb2msaa));
+}
+
+void GSHacksDlg::OnInit()
+{
+ bool dx9 = (int)SendMessage(GetDlgItem(GetParent(m_hWnd), IDC_RENDERER), CB_GETCURSEL, 0, 0) / 3 == 0;
+ unsigned short cb = 0;
+
+ if(dx9) for(unsigned short i = 0; i < 17; i++)
+ {
+ if( i == 1) continue;
+
+ int depth = GSDevice9::GetMaxDepth(i);
+
+ if(depth)
+ {
+ char text[32] = {0};
+ sprintf(text, depth == 32 ? "%dx Z-32" : "%dx Z-24", i);
+ SendMessage(GetDlgItem(m_hWnd, IDC_MSAACB), CB_ADDSTRING, 0, (LPARAM)text);
+
+ msaa2cb[i] = cb;
+ cb2msaa[cb] = i;
+ cb++;
+ }
+ }
+ else for(unsigned short j = 0; j < 5; j++) // TODO: Make the same kind of check for d3d11, eventually....
+ {
+ unsigned short i = j == 0 ? 0 : 1 << j;
+
+ msaa2cb[i] = j;
+ cb2msaa[j] = i;
+
+ char text[32] = {0};
+ sprintf(text, "%dx ", i);
+
+ SendMessage(GetDlgItem(m_hWnd, IDC_MSAACB), CB_ADDSTRING, 0, (LPARAM)text);
+ }
+
+ SendMessage(GetDlgItem(m_hWnd, IDC_MSAACB), CB_SETCURSEL, msaa2cb[min(theApp.GetConfig("UserHacks_MSAA", 0), 16)], 0);
+
+ CheckDlgButton(m_hWnd, IDC_ALPHAHACK, theApp.GetConfig("UserHacks_AlphaHack", 0));
+ CheckDlgButton(m_hWnd, IDC_OFFSETHACK, theApp.GetConfig("UserHacks_HalfPixelOffset", 0));
+ CheckDlgButton(m_hWnd, IDC_SPRITEHACK, theApp.GetConfig("UserHacks_SpriteHack", 0));
+ CheckDlgButton(m_hWnd, IDC_WILDHACK, theApp.GetConfig("UserHacks_WildHack", 0));
+
+ SendMessage(GetDlgItem(m_hWnd, IDC_SKIPDRAWHACK), UDM_SETRANGE, 0, MAKELPARAM(1000, 0));
+ SendMessage(GetDlgItem(m_hWnd, IDC_SKIPDRAWHACK), UDM_SETPOS, 0, MAKELPARAM(theApp.GetConfig("UserHacks_SkipDraw", 0), 0));
+
+
+ // Hacks descriptions
+ SetWindowText(GetDlgItem(m_hWnd, IDC_HACK_DESCRIPTION), "Hover over an item to get a description.");
+}
+
+void GSHacksDlg::UpdateControls()
+{}
+
+bool GSHacksDlg::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)
+{
+ switch(message)
+ {
+ case WM_SETCURSOR:
+ {
+ const char *helpstr = "";
+
+ POINT pos;
+ GetCursorPos(&pos);
+ ScreenToClient(m_hWnd, &pos);
+
+ HWND hoveredwnd = ChildWindowFromPointEx(m_hWnd, pos, CWP_SKIPINVISIBLE | CWP_SKIPTRANSPARENT);
+
+ if (hoveredwnd != hovered_window)
+ hovered_window = hoveredwnd;
+ else
+ break;
+
+ switch (GetDlgCtrlID(hoveredwnd))
+ {
+ case IDC_SKIPDRAWHACK:
+ case IDC_SKIPDRAWHACKEDIT:
+ case IDC_STATIC_SKIPDRAW:
+ helpstr = "Skipdraw\n\nSkips drawing n surfaces completely. "
+ "Use it, for example, to try and get rid of bad post processing effects."
+ " Try values between 1 and 100.";
+ break;
+ case IDC_ALPHAHACK:
+ helpstr = "Alpha Hack\n\nDifferent alpha handling. Can work around some shadow problems.";
+ break;
+ case IDC_OFFSETHACK:
+ helpstr = "Halfpixel\n\nMight fix some misaligned fog, bloom, or blend effect.";
+ break;
+ case IDC_SPRITEHACK:
+ helpstr = "Sprite Hack\n\nHelps getting rid of black inner lines in some filtered sprites."
+ " Half option is the preferred one. Use it for Mana Khemia or ArTonelico for example."
+ " Full can be used for Tales of Destiny.";
+ break;
+ case IDC_WILDHACK:
+ helpstr = "WildArms\n\nLowers the GS precission to avoid gaps between pixels when"
+ " upscaling. Full option fixes the text on WildArms games, while Half option might improve portraits"
+ " in ArTonelico.";
+ break;
+ case IDC_MSAACB:
+ case IDC_STATIC_MSAA:
+ helpstr = "Multisample Anti-Aliasing\n\nEnables hardware Anti-Aliasing. Needs lots of memory."
+ " The Z-24 modes might need to have LogarithmicZ to compensate for the bits lost (only in DX9 mode).";
+ break;
+ default:
+ helpstr = "Hover over an item to get a description.";
+ break;
+ }
+
+ SetWindowText(GetDlgItem(m_hWnd, IDC_HACK_DESCRIPTION), helpstr);
+
+ } break;
+
+ case WM_COMMAND:
+ {
+ int id = LOWORD(wParam);
+
+ switch(id)
+ {
+ case IDOK:
+ {
+ theApp.SetConfig("UserHacks_MSAA", cb2msaa[(int)SendMessage(GetDlgItem(m_hWnd, IDC_MSAACB), CB_GETCURSEL, 0, 0)]);
+ theApp.SetConfig("UserHacks_AlphaHack", (int)IsDlgButtonChecked(m_hWnd, IDC_ALPHAHACK));
+ theApp.SetConfig("UserHacks_HalfPixelOffset", (int)IsDlgButtonChecked(m_hWnd, IDC_OFFSETHACK));
+ theApp.SetConfig("UserHacks_SpriteHack", (int)IsDlgButtonChecked(m_hWnd, IDC_SPRITEHACK));
+ theApp.SetConfig("UserHacks_SkipDraw", (int)SendMessage(GetDlgItem(m_hWnd, IDC_SKIPDRAWHACK), UDM_GETPOS, 0, 0));
+ theApp.SetConfig("UserHacks_WildHack", (int)IsDlgButtonChecked(m_hWnd, IDC_WILDHACK));
+ EndDialog(m_hWnd, id);
+ } break;
+ }
+
+ } break;
+
+ case WM_CLOSE:EndDialog(m_hWnd, IDCANCEL); break;
+
+ default: return false;
+ }
+
+ return true;
+}
diff --git a/plugins/GSdx/GSSettingsDlg.h b/plugins/GSdx/GSSettingsDlg.h
index 9cb7c60d5..b287c077e 100644
--- a/plugins/GSdx/GSSettingsDlg.h
+++ b/plugins/GSdx/GSSettingsDlg.h
@@ -24,6 +24,41 @@
#include "GSDialog.h"
#include "GSSetting.h"
+class GSShadeBostDlg : public GSDialog
+{
+ int saturation;
+ int brightness;
+ int contrast;
+
+ void UpdateControls();
+
+protected:
+ void OnInit();
+ bool OnMessage(UINT message, WPARAM wParam, LPARAM lParam);
+
+public:
+ GSShadeBostDlg();
+};
+
+class GSHacksDlg : public GSDialog
+{
+ unsigned short cb2msaa[17];
+ unsigned short msaa2cb[17];
+
+ bool isdx9;
+
+ HWND hovered_window;
+
+ void UpdateControls();
+
+protected:
+ void OnInit();
+ bool OnMessage(UINT message, WPARAM wParam, LPARAM lParam);
+
+public:
+ GSHacksDlg();
+};
+
class GSSettingsDlg : public GSDialog
{
list m_modes;
@@ -37,6 +72,10 @@ protected:
uint32 m_lastValidMsaa; // used to revert to previous dialog value if the user changed to invalid one, or lesser one and canceled
+ // Shade Boost
+ GSShadeBostDlg ShadeBoostDlg;
+ GSHacksDlg HacksDlg;
+
public:
GSSettingsDlg(bool isOpen2);
};
diff --git a/plugins/GSdx/GSState.cpp b/plugins/GSdx/GSState.cpp
index 3562a94f5..77c64f49a 100644
--- a/plugins/GSdx/GSState.cpp
+++ b/plugins/GSdx/GSState.cpp
@@ -24,7 +24,6 @@
#include "GSdx.h"
//#define Offset_ST // Fixes Persona3 mini map alignment which is off even in software rendering
-//#define Offset_UV // Fixes / breaks various titles
GSState::GSState()
: m_version(6)
@@ -184,7 +183,7 @@ void GSState::SetFrameSkip(int skip)
void GSState::Reset()
{
- printf("GS reset\n");
+ //printf("GSdx info: GS reset\n");
// FIXME: memset(m_mem.m_vm8, 0, m_mem.m_vmsize); // bios logo not shown cut in half after reset, missing graphics in GoW after first FMV
memset(&m_path[0], 0, sizeof(m_path[0]) * countof(m_path));
@@ -444,18 +443,14 @@ void GSState::GIFPackedRegHandlerRGBA(const GIFPackedReg* RESTRICT r)
void GSState::GIFPackedRegHandlerSTQ(const GIFPackedReg* RESTRICT r)
{
- #if defined(_M_AMD64)
+ GSVector4i st = GSVector4i::loadl(&r->u64[0]);
+ GSVector4i q = GSVector4i::loadl(&r->u64[1]);
- m_v.ST.u64 = r->u64[0];
+ GSVector4i::storel(&m_v.ST, st);
- #else
-
- GSVector4i v = GSVector4i::loadl(r);
- GSVector4i::storel(&m_v.ST.u64, v);
-
- #endif
-
- m_q = r->STQ.Q;
+ q = q.blend8(GSVector4i::cast(GSVector4::m_one), q == GSVector4i::zero()); // character shadow in Vexx, q = 0 (st also 0 on the first 16 vertices), setting it to 1.0f to avoid div by zero later
+
+ *(int*)&m_q = GSVector4i::store(q);
#ifdef Offset_ST
GIFRegTEX0 TEX0 = m_context->TEX0;
@@ -470,10 +465,7 @@ void GSState::GIFPackedRegHandlerUV(const GIFPackedReg* RESTRICT r)
m_v.UV = (uint32)GSVector4i::store(v.ps32(v));
-#ifdef Offset_UV
- m_v.UV.U = min((uint16)m_v.UV.U, (uint16)(m_v.UV.U - 4U));
- m_v.UV.V = min((uint16)m_v.UV.V, (uint16)(m_v.UV.V - 4U));
-#endif
+ isPackedUV_HackFlag = true;
}
template
@@ -539,6 +531,8 @@ void GSState::GIFPackedRegHandlerSTQRGBAXYZF2(const GIFPackedReg* RESTRICT r, ui
GSVector4i q = GSVector4i::loadl(&r[0].u64[1]);
GSVector4i rgba = (GSVector4i::load(&r[1]) & GSVector4i::x000000ff()).ps32().pu16();
+ q = q.blend8(GSVector4i::cast(GSVector4::m_one), q == GSVector4i::zero()); // see GIFPackedRegHandlerSTQ
+
m_v.m[0] = st.upl64(rgba.upl32(q)); // TODO: only store the last one
GSVector4i xy = GSVector4i::loadl(&r[2].u64[0]);
@@ -569,6 +563,8 @@ void GSState::GIFPackedRegHandlerSTQRGBAXYZ2(const GIFPackedReg* RESTRICT r, uin
GSVector4i q = GSVector4i::loadl(&r[0].u64[1]);
GSVector4i rgba = (GSVector4i::load(&r[1]) & GSVector4i::x000000ff()).ps32().pu16();
+ q = q.blend8(GSVector4i::cast(GSVector4::m_one), q == GSVector4i::zero()); // see GIFPackedRegHandlerSTQ
+
m_v.m[0] = st.upl64(rgba.upl32(q)); // TODO: only store the last one
GSVector4i xy = GSVector4i::loadl(&r[2].u64[0]);
@@ -638,7 +634,11 @@ void GSState::GIFRegHandlerPRIM(const GIFReg* RESTRICT r)
void GSState::GIFRegHandlerRGBAQ(const GIFReg* RESTRICT r)
{
- m_v.RGBAQ = (GSVector4i)r->RGBAQ;
+ GSVector4i rgbaq = (GSVector4i)r->RGBAQ;
+
+ rgbaq = rgbaq.upl32(rgbaq.blend8(GSVector4i::cast(GSVector4::m_one), rgbaq == GSVector4i::zero()).yyyy()); // see GIFPackedRegHandlerSTQ
+
+ m_v.RGBAQ = rgbaq;
}
void GSState::GIFRegHandlerST(const GIFReg* RESTRICT r)
@@ -654,12 +654,9 @@ void GSState::GIFRegHandlerST(const GIFReg* RESTRICT r)
void GSState::GIFRegHandlerUV(const GIFReg* RESTRICT r)
{
- m_v.UV = r->UV.u32[0] & 0x3fff3fff;
+ m_v.UV = r->UV.u32[0] & 0x3fff3fff;
-#ifdef Offset_UV
- m_v.UV.U = min((uint16)m_v.UV.U, (uint16)(m_v.UV.U - 4U));
- m_v.UV.V = min((uint16)m_v.UV.V, (uint16)(m_v.UV.V - 4U));
-#endif
+ isPackedUV_HackFlag = false;
}
template
@@ -776,13 +773,31 @@ template void GSState::GIFRegHandlerTEX0(const GIFReg* RESTRICT r)
{
GIFRegTEX0 TEX0 = r->TEX0;
- // Tokyo Xtreme Racer Drift 2, TW/TH == 0, PRIM->FST == 1
- // Just setting the max texture size to make the texture cache allocate some surface.
- // The vertex trace will narrow the updated area down to the minimum, upper-left 8x8
- // for a single letter, but it may address the whole thing if it wants to.
+ int tw = (int)TEX0.TW;
+ int th = (int)TEX0.TH;
- if(TEX0.TW > 10 || TEX0.TW == 0) TEX0.TW = 10;
- if(TEX0.TH > 10 || TEX0.TH == 0) TEX0.TH = 10;
+ if(tw > 10) tw = 10;
+ if(th > 10) th = 10;
+
+ if(PRIM->FST)
+ {
+ // Tokyo Xtreme Racer Drift 2, TW/TH == 0
+ // Just setting the max texture size to make the texture cache allocate some surface.
+ // The vertex trace will narrow the updated area down to the minimum, upper-left 8x8
+ // for a single letter, but it may address the whole thing if it wants to.
+
+ if(tw == 0) tw = 10;
+ if(th == 0) th = 10;
+ }
+ else
+ {
+ // Yakuza, TW/TH == 0
+ // The minimap is drawn using solid colors, the texture is really a 1x1 white texel,
+ // modulated by the vertex color. Cannot change the dimension because S/T are normalized.
+ }
+
+ TEX0.TW = tw;
+ TEX0.TH = th;
if((TEX0.TBW & 1) && (TEX0.PSM == PSM_PSMT8 || TEX0.PSM == PSM_PSMT4))
{
@@ -1134,8 +1149,8 @@ template void GSState::GIFRegHandlerZBUF(const GIFReg* RESTRICT r)
if(ZBUF.u32[0] == 0)
{
// during startup all regs are cleared to 0 (by the bios or something), so we mask z until this register becomes valid
-
- ZBUF.ZMSK = 1;
+ // edit: breaks Grandia Xtreme and sounds like a bad idea generally. What was the intend?
+ //ZBUF.ZMSK = 1;
}
ZBUF.PSM |= 0x30;
@@ -2518,10 +2533,10 @@ void GSState::GetTextureMinMax(GSVector4i& r, const GIFRegTEX0& TEX0, const GIFR
if(linear)
{
- st += GSVector4(-0x8000, 0x8000).xxyy();
+ st += GSVector4(-0.5f, 0.5f).xxyy();
}
- GSVector4i uv = GSVector4i(st).sra32(16);
+ GSVector4i uv = GSVector4i(st.floor());
GSVector4i u, v;
diff --git a/plugins/GSdx/GSState.h b/plugins/GSdx/GSState.h
index 8e4431d7b..6a16caba8 100644
--- a/plugins/GSdx/GSState.h
+++ b/plugins/GSdx/GSState.h
@@ -194,6 +194,8 @@ public:
GSDump m_dump;
bool m_nativeres;
+ bool isPackedUV_HackFlag;
+
int s_n;
bool s_dump;
bool s_save;
diff --git a/plugins/GSdx/GSTextureCache.cpp b/plugins/GSdx/GSTextureCache.cpp
index 49743f557..ed5a49fdb 100644
--- a/plugins/GSdx/GSTextureCache.cpp
+++ b/plugins/GSdx/GSTextureCache.cpp
@@ -25,11 +25,13 @@
GSTextureCache::GSTextureCache(GSRenderer* r)
: m_renderer(r)
{
+ m_spritehack = !!theApp.GetConfig("UserHacks", 0) ? theApp.GetConfig("UserHacks_SpriteHack", 0) : 0;
+
+ UserHacks_HalfPixelOffset = !!theApp.GetConfig("UserHacks", 0) && !!theApp.GetConfig("UserHacks_HalfPixelOffset", 0);
+
m_paltex = !!theApp.GetConfig("paltex", 0);
m_temp = (uint8*)_aligned_malloc(1024 * 1024 * sizeof(uint32), 32);
-
- UserHacks_HalfPixelOffset = !!theApp.GetConfig("UserHacks_HalfPixelOffset", 0);
}
GSTextureCache::~GSTextureCache()
@@ -266,7 +268,7 @@ GSTextureCache::Target* GSTextureCache::LookupTarget(const GIFRegTEX0& TEX0, int
{
// HACK: try to find something close to the base pointer
- if(t->m_TEX0.TBP0 <= bp && bp < t->m_TEX0.TBP0 + 0x700 && (!dst || t->m_TEX0.TBP0 >= dst->m_TEX0.TBP0))
+ if(t->m_TEX0.TBP0 <= bp && bp < t->m_TEX0.TBP0 + 0xe00 && (!dst || t->m_TEX0.TBP0 >= dst->m_TEX0.TBP0))
{
dst = t;
}
@@ -584,6 +586,16 @@ GSTextureCache::Source* GSTextureCache::CreateSource(const GIFRegTEX0& TEX0, con
if(dst == NULL)
{
+ if(m_spritehack && (TEX0.PSM == PSM_PSMT8 || TEX0.PSM == PSM_PSMT8H))
+ {
+ src->m_spritehack_t = true;
+
+ if(m_spritehack == 2 && TEX0.CPSM != PSM_PSMCT16)
+ src->m_spritehack_t = false;
+ }
+ else
+ src->m_spritehack_t = false;
+
if(m_paltex && GSLocalMemory::m_psm[TEX0.PSM].pal > 0)
{
src->m_fmt = FMT_8;
diff --git a/plugins/GSdx/GSTextureCache.h b/plugins/GSdx/GSTextureCache.h
index 3706ac785..726917048 100644
--- a/plugins/GSdx/GSTextureCache.h
+++ b/plugins/GSdx/GSTextureCache.h
@@ -75,6 +75,7 @@ public:
bool m_target;
bool m_complete;
bool m_repeating;
+ bool m_spritehack_t;
vector* m_p2t;
public:
@@ -118,6 +119,7 @@ protected:
SourceMap m_src;
list m_dst[2];
bool m_paltex;
+ int m_spritehack;
uint8* m_temp;
virtual Source* CreateSource(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, Target* t = NULL);
diff --git a/plugins/GSdx/GSTextureCacheSW.cpp b/plugins/GSdx/GSTextureCacheSW.cpp
index 37e272006..ea71154a9 100644
--- a/plugins/GSdx/GSTextureCacheSW.cpp
+++ b/plugins/GSdx/GSTextureCacheSW.cpp
@@ -131,25 +131,6 @@ void GSTextureCacheSW::RemoveAll()
}
}
-void GSTextureCacheSW::RemoveAt(Texture* t)
-{
- m_textures.erase(t);
-
- for(uint32 start = t->m_TEX0.TBP0 >> 5, end = countof(m_map) - 1; start <= end; start++)
- {
- list& m = m_map[start];
-
- for(list::iterator i = m.begin(); i != m.end(); )
- {
- list::iterator j = i++;
-
- if(*j == t) {m.erase(j); break;}
- }
- }
-
- delete t;
-}
-
void GSTextureCacheSW::IncAge()
{
for(hash_set::iterator i = m_textures.begin(); i != m_textures.end(); )
@@ -158,9 +139,23 @@ void GSTextureCacheSW::IncAge()
Texture* t = *j;
- if(++t->m_age > 30)
+ if(++t->m_age > 10)
{
- RemoveAt(t);
+ m_textures.erase(j);
+
+ for(const uint32* p = t->m_pages.n; *p != GSOffset::EOP; p++)
+ {
+ list& m = m_map[*p];
+
+ for(list::iterator i = m.begin(); i != m.end(); )
+ {
+ list::iterator j = i++;
+
+ if(*j == t) {m.erase(j); break;}
+ }
+ }
+
+ delete t;
}
}
}
@@ -368,7 +363,7 @@ bool GSTextureCacheSW::Texture::Save(const string& fn, bool dds) const
{
for(int i = 0; i < w; i++)
{
- ((uint32*)m.bits)[i] = clut[((uint8*)src)[i]];
+ ((uint32*)m.bits)[i] = clut[src[i]];
}
}
}
diff --git a/plugins/GSdx/GSTextureCacheSW.h b/plugins/GSdx/GSTextureCacheSW.h
index 8c80456c1..f15998c64 100644
--- a/plugins/GSdx/GSTextureCacheSW.h
+++ b/plugins/GSdx/GSTextureCacheSW.h
@@ -68,6 +68,5 @@ public:
void InvalidatePages(const uint32* pages, uint32 psm);
void RemoveAll();
- void RemoveAt(Texture* t);
void IncAge();
};
diff --git a/plugins/GSdx/GSTextureFX11.cpp b/plugins/GSdx/GSTextureFX11.cpp
index 5e7171b29..84189a7d8 100644
--- a/plugins/GSdx/GSTextureFX11.cpp
+++ b/plugins/GSdx/GSTextureFX11.cpp
@@ -177,7 +177,7 @@ void GSDevice11::SetupPS(PSSelector sel, const PSConstantBuffer* cb, PSSamplerSe
if(i == m_ps.end())
{
- string str[15];
+ string str[16];
str[0] = format("%d", sel.fst);
str[1] = format("%d", sel.wms);
@@ -194,6 +194,7 @@ void GSDevice11::SetupPS(PSSelector sel, const PSConstantBuffer* cb, PSSamplerSe
str[12] = format("%d", sel.ltf);
str[13] = format("%d", sel.colclip);
str[14] = format("%d", sel.date);
+ str[15] = format("%d", sel.spritehack);
D3D11_SHADER_MACRO macro[] =
{
@@ -212,6 +213,7 @@ void GSDevice11::SetupPS(PSSelector sel, const PSConstantBuffer* cb, PSSamplerSe
{"PS_LTF", str[12].c_str()},
{"PS_COLCLIP", str[13].c_str()},
{"PS_DATE", str[14].c_str()},
+ {"PS_SPRITEHACK", str[15].c_str()},
{NULL, NULL},
};
diff --git a/plugins/GSdx/GSTextureFX9.cpp b/plugins/GSdx/GSTextureFX9.cpp
index 617333412..a8e0d913b 100644
--- a/plugins/GSdx/GSTextureFX9.cpp
+++ b/plugins/GSdx/GSTextureFX9.cpp
@@ -135,7 +135,7 @@ void GSDevice9::SetupPS(PSSelector sel, const PSConstantBuffer* cb, PSSamplerSel
if(i == m_ps.end())
{
- string str[14];
+ string str[15];
str[0] = format("%d", sel.fst);
str[1] = format("%d", sel.wms);
@@ -151,6 +151,7 @@ void GSDevice9::SetupPS(PSSelector sel, const PSConstantBuffer* cb, PSSamplerSel
str[11] = format("%d", sel.ltf);
str[12] = format("%d", sel.colclip);
str[13] = format("%d", sel.date);
+ str[14] = format("%d", sel.spritehack);
D3DXMACRO macro[] =
{
@@ -168,6 +169,7 @@ void GSDevice9::SetupPS(PSSelector sel, const PSConstantBuffer* cb, PSSamplerSel
{"PS_LTF", str[11].c_str()},
{"PS_COLCLIP", str[12].c_str()},
{"PS_DATE", str[13].c_str()},
+ {"PS_SPRITEHACK", str[14].c_str()},
{NULL, NULL},
};
diff --git a/plugins/GSdx/GSVector.h b/plugins/GSdx/GSVector.h
index de2080735..19a21ded0 100644
--- a/plugins/GSdx/GSVector.h
+++ b/plugins/GSdx/GSVector.h
@@ -1004,6 +1004,13 @@ public:
return d.add16(a.sub16(b).modulate16(c));
}
+ __forceinline GSVector4i lerp16_4(const GSVector4i& a, const GSVector4i& f) const
+ {
+ // (a - this) * f >> 4 + this (a, this: 8-bit, f: 4-bit)
+
+ return add16(a.sub16(*this).mul16l(f).sra16(4));
+ }
+
template __forceinline GSVector4i modulate16(const GSVector4i& f) const
{
// a * f << shift
diff --git a/plugins/GSdx/GSVertexTrace.cpp b/plugins/GSdx/GSVertexTrace.cpp
index 955c1bc80..5d3e3b482 100644
--- a/plugins/GSdx/GSVertexTrace.cpp
+++ b/plugins/GSdx/GSVertexTrace.cpp
@@ -455,11 +455,11 @@ void GSVertexTrace::FindMinMax(const void* vertex, const uint32* index, int coun
{
if(fst)
{
- s = GSVector4(1 << (16 - 4), 1).xxyy();
+ s = GSVector4(1.0f / 16, 1.0f).xxyy();
}
else
{
- s = GSVector4(0x10000 << context->TEX0.TW, 0x10000 << context->TEX0.TH, 1, 1);
+ s = GSVector4(1 << context->TEX0.TW, 1 << context->TEX0.TH, 1, 1);
}
m_min.t = tmin * s;
diff --git a/plugins/GSdx/GSVertexTrace.h b/plugins/GSdx/GSVertexTrace.h
index a5734fafc..c7fd01228 100644
--- a/plugins/GSdx/GSVertexTrace.h
+++ b/plugins/GSdx/GSVertexTrace.h
@@ -32,7 +32,7 @@ class GSState;
__aligned(class, 32) GSVertexTrace : public GSAlignedClass<32>
{
public:
- struct Vertex {GSVector4i c; GSVector4 p, t;}; // t.xy * 0x10000
+ struct Vertex {GSVector4i c; GSVector4 p, t;};
struct VertexAlpha {int min, max; bool valid;};
protected:
diff --git a/plugins/GSdx/GSdx.cpp b/plugins/GSdx/GSdx.cpp
index e719d5e84..eb7f3c4df 100644
--- a/plugins/GSdx/GSdx.cpp
+++ b/plugins/GSdx/GSdx.cpp
@@ -126,6 +126,7 @@ GSdxApp::GSdxApp()
m_gs_interlace.push_back(GSSetting(4, "Bob bff", "use blend if shaking"));
m_gs_interlace.push_back(GSSetting(5, "Blend tff", "slight blur, 1/2 fps"));
m_gs_interlace.push_back(GSSetting(6, "Blend bff", "slight blur, 1/2 fps"));
+ m_gs_interlace.push_back(GSSetting(7, "Auto", ""));
m_gs_aspectratio.push_back(GSSetting(0, "Stretch", ""));
m_gs_aspectratio.push_back(GSSetting(1, "4:3", ""));
diff --git a/plugins/GSdx/GSdx.rc b/plugins/GSdx/GSdx.rc
index 5c7c47230..d3a216214 100644
--- a/plugins/GSdx/GSdx.rc
+++ b/plugins/GSdx/GSdx.rc
@@ -42,6 +42,7 @@ BEGIN
"#include ""res/interlace.fx""\r\n"
"#include ""res/merge.fx""\r\0"
"#include ""res/fxaa.fx""\r\0"
+ "#include ""res/shadeboost.fx""\r\0"
END
#endif // APSTUDIO_INVOKED
@@ -57,7 +58,8 @@ IDR_TFX_FX RCDATA "res\\tfx.fx"
IDR_MERGE_FX RCDATA "res\\merge.fx"
IDR_INTERLACE_FX RCDATA "res\\interlace.fx"
IDR_FXAA_FX RCDATA "res\\fxaa.fx"
-IDR_CS_FX RCDATA "res\\cs.fx"
+IDR_CS_FX RCDATA "res\\cs.fx"
+IDR_SHADEBOOST_FX RCDATA "res\\shadeboost.fx"
/////////////////////////////////////////////////////////////////////////////
//
@@ -72,7 +74,47 @@ IDB_LOGO10 BITMAP "res\\logo10.bmp"
// Dialog
//
-IDD_CONFIG DIALOGEX 0, 0, 189, 351
+IDD_HACKS DIALOGEX 0, 0, 315, 203
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Hacks Configuration"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ DEFPUSHBUTTON "OK",IDOK,258,182,50,14
+ GROUPBOX "Hack",IDC_STATIC,7,7,76,165,0,WS_EX_TRANSPARENT
+ GROUPBOX "Description",IDC_STATIC,85,7,223,165
+ LTEXT "MSAA",IDC_STATIC_MSAA,14,20,20,8
+ LTEXT "Skipdraw",IDC_STATIC_SKIPDRAW,14,37,30,8
+ EDITTEXT IDC_SKIPDRAWHACKEDIT,45,35,24,14,ES_RIGHT | ES_AUTOHSCROLL
+ CONTROL "",IDC_SKIPDRAWHACK,"msctls_updown32",UDS_SETBUDDYINT | UDS_AUTOBUDDY | UDS_ARROWKEYS,68,35,10,14
+ CONTROL "Alpha",IDC_ALPHAHACK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,54,34,10
+ CONTROL "Half-pixel Offset",IDC_OFFSETHACK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,71,65,10
+ CONTROL "Sprite",IDC_SPRITEHACK,"Button",BS_AUTO3STATE | WS_TABSTOP,14,88,35,10
+ LTEXT "USE AT YOUR OWN RISK!",IDC_STATIC,7,182,84,8,WS_DISABLED
+ COMBOBOX IDC_MSAACB,35,18,44,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ CONTROL "WildArmsOffset",IDC_WILDHACK,"Button",BS_AUTO3STATE | WS_TABSTOP,14,105,64,10
+ LTEXT "TEXT_GOES_HERE",IDC_HACK_DESCRIPTION,92,20,209,145
+END
+
+IDD_SHADEBOOST DIALOGEX 0, 0, 316, 129
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Shade Boost Settings"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ DEFPUSHBUTTON "OK",IDOK,259,108,50,14
+ PUSHBUTTON "Reset",IDRESET,7,108,50,14
+ GROUPBOX "Color Adjustments",IDC_STATIC,7,7,302,95
+ LTEXT "Saturation",IDC_STATIC,15,25,34,8
+ CONTROL "",IDC_SATURATION_SLIDER,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,55,23,236,15
+ LTEXT "Brightness",IDC_STATIC,15,50,34,8
+ CONTROL "",IDC_BRIGHTNESS_SLIDER,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,55,48,236,15
+ LTEXT "Contrast",IDC_STATIC,15,75,29,8
+ CONTROL "",IDC_CONTRAST_SLIDER,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,55,72,236,15
+ RTEXT "100",IDC_SATURATION_TEXT,288,25,15,8
+ RTEXT "100",IDC_BRIGHTNESS_TEXT,288,50,15,8
+ RTEXT "100",IDC_CONTRAST_TEXT,288,75,15,8
+END
+
+IDD_CONFIG DIALOGEX 0, 0, 189, 330
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Settings..."
FONT 8, "MS Shell Dlg", 400, 0, 0x1
@@ -80,43 +122,40 @@ BEGIN
CONTROL 2022,IDC_LOGO11,"Static",SS_BITMAP,7,7,175,42
CONTROL 2021,IDC_LOGO9,"Static",SS_BITMAP,7,7,175,44
LTEXT "Resolution:",IDC_STATIC,7,58,37,8
- COMBOBOX IDC_RESOLUTION,71,56,111,125,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ COMBOBOX IDC_RESOLUTION,71,56,72,125,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "Renderer:",IDC_STATIC,7,73,34,8
COMBOBOX IDC_RENDERER,71,71,111,118,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "Interlacing (F5):",IDC_STATIC,7,89,53,8
COMBOBOX IDC_INTERLACE,71,86,111,98,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "Aspect Ratio (F6):",IDC_STATIC,7,104,60,8
COMBOBOX IDC_ASPECTRATIO,71,101,111,98,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
- DEFPUSHBUTTON "OK",IDOK,43,323,50,14
- PUSHBUTTON "Cancel",IDCANCEL,96,323,50,14
- CONTROL "Windowed",IDC_WINDOWED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,89,231,93,10
- LTEXT "D3D internal res:",IDC_STATIC,18,135,55,8
- EDITTEXT IDC_RESX_EDIT,82,132,35,13,ES_AUTOHSCROLL | ES_NUMBER
- CONTROL "",IDC_RESX,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,110,135,11,14
- EDITTEXT IDC_RESY_EDIT,120,132,35,13,ES_AUTOHSCROLL | ES_NUMBER
- CONTROL "",IDC_RESY,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,144,135,11,14
- CONTROL "Native",IDC_NATIVERES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,123,165,33,10
- COMBOBOX IDC_UPSCALE_MULTIPLIER,82,147,74,98,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
- LTEXT "Or use Scaling:",IDC_STATIC,18,150,49,8
- LTEXT "Or use original PS2 resolution :",IDC_STATIC,18,165,99,8
- EDITTEXT IDC_MSAAEDIT,75,258,35,13,ES_AUTOHSCROLL | ES_NUMBER
- CONTROL "",IDC_MSAA,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,109,261,11,14
- LTEXT "HW Anti Aliasing",IDC_STATIC_TEXT_HWAA,18,261,53,8
- GROUPBOX "D3D Enhancements (can cause glitches)",IDC_STATIC,7,117,175,66
- LTEXT "Extra rendering threads:",IDC_STATIC,7,189,80,8
- EDITTEXT IDC_SWTHREADS_EDIT,89,187,35,13,ES_AUTOHSCROLL | ES_NUMBER
- CONTROL "",IDC_SWTHREADS,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,117,190,11,14
- CONTROL "Texture filtering",IDC_FILTER,"Button",BS_AUTO3STATE | WS_TABSTOP,7,203,67,10
- CONTROL "Logarithmic Z",IDC_LOGZ,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,89,204,58,10
- CONTROL "Allow 8-bit textures",IDC_PALTEX,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,217,82,10
- CONTROL "Alpha correction (FBA)",IDC_FBA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,89,217,93,10
- CONTROL "Edge anti-aliasing",IDC_AA1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,231,72,10
- CONTROL "Alpha Hack",IDC_ALPHAHACK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,20,279,51,10
- CONTROL "Offset Hack",IDC_OFFSETHACK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,85,279,51,10
- GROUPBOX "Hacks",IDC_USERHACKS,13,244,161,71,BS_CENTER
- EDITTEXT IDC_SKIPDRAWHACKEDIT,55,291,40,14,ES_AUTOHSCROLL | ES_NUMBER
- CONTROL "",IDC_SKIPDRAWHACK,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,94,293,11,14
- LTEXT "SkipDraw:",IDC_STATIC_TEXT_SKIPDRAW,20,293,33,8
+ DEFPUSHBUTTON "OK",IDOK,43,309,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,96,309,50,14
+ CONTROL "Window",IDC_WINDOWED,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,146,58,36,10
+ LTEXT "D3D internal res:",IDC_STATIC,18,137,55,8
+ EDITTEXT IDC_RESX_EDIT,82,134,35,13,ES_AUTOHSCROLL | ES_NUMBER
+ CONTROL "",IDC_RESX,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,110,133,11,14
+ EDITTEXT IDC_RESY_EDIT,120,134,35,13,ES_AUTOHSCROLL | ES_NUMBER
+ CONTROL "",IDC_RESY,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,146,133,11,14
+ CONTROL "Native",IDC_NATIVERES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,123,167,33,10
+ COMBOBOX IDC_UPSCALE_MULTIPLIER,82,149,74,98,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ LTEXT "Or use Scaling:",IDC_STATIC,18,152,49,8
+ LTEXT "Or use original PS2 resolution :",IDC_STATIC,18,167,99,8
+ GROUPBOX "D3D Enhancements (can cause glitches)",IDC_STATIC,7,119,175,66,BS_CENTER
+ LTEXT "Extra rendering threads:",IDC_STATIC,11,277,80,8
+ EDITTEXT IDC_SWTHREADS_EDIT,93,276,35,13,ES_AUTOHSCROLL | ES_NUMBER
+ CONTROL "",IDC_SWTHREADS,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,124,275,11,14
+ CONTROL "Texture filtering",IDC_FILTER,"Button",BS_AUTO3STATE | WS_TABSTOP,11,215,67,10
+ CONTROL "Logarithmic Z",IDC_LOGZ,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,89,216,58,10
+ CONTROL "Allow 8-bit textures",IDC_PALTEX,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,231,78,10
+ CONTROL "Alpha correction (FBA)",IDC_FBA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,89,231,85,10
+ CONTROL "Edge anti-aliasing (AA1)",IDC_AA1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,292,93,10
+ CONTROL "Enable Shade Boost",IDC_SHADEBOOST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,189,79,10
+ PUSHBUTTON "Settings...",IDC_SHADEBUTTON,88,186,87,14
+ GROUPBOX "Software Mode Settings",IDC_STATIC,7,265,175,42,BS_CENTER
+ GROUPBOX "Hardware Mode Settings",IDC_STATIC,7,203,175,61,BS_CENTER
+ CONTROL "Enable HW Hacks",IDC_HACKS_ENABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,247,71,10
+ PUSHBUTTON "Configure...",IDC_HACKSBUTTON,88,244,87,14
END
IDD_CAPTURE DIALOGEX 0, 0, 279, 71
@@ -163,48 +202,43 @@ BEGIN
CONTROL "Windowed",IDC_WINDOWED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,129,157,49,10
END
-IDD_CONFIG2 DIALOGEX 0, 0, 187, 341
+IDD_CONFIG2 DIALOGEX 0, 0, 187, 311
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Settings..."
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
CONTROL 2022,IDC_LOGO11,"Static",SS_BITMAP,6,6,173,42
- DEFPUSHBUTTON "OK",IDOK,41,312,50,14
+ DEFPUSHBUTTON "OK",IDOK,35,290,50,14
LTEXT "Renderer:",IDC_STATIC,6,57,34,8
COMBOBOX IDC_RENDERER,70,55,111,118,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
LTEXT "Interlacing (F5):",IDC_STATIC,6,73,81,8
COMBOBOX IDC_INTERLACE,70,70,111,98,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
- LTEXT "Custom resolution:",IDC_STATIC,26,135,65,8
+ LTEXT "Custom resolution:",IDC_STATIC,26,134,65,8
EDITTEXT IDC_RESX_EDIT,92,132,35,13,ES_AUTOHSCROLL | ES_NUMBER
- CONTROL "",IDC_RESX,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,120,135,11,14
+ CONTROL "",IDC_RESX,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,120,132,11,14
EDITTEXT IDC_RESY_EDIT,130,132,35,13,ES_AUTOHSCROLL | ES_NUMBER
- CONTROL "",IDC_RESY,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,154,130,11,14
+ CONTROL "",IDC_RESY,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,154,132,11,14
CONTROL "Native",IDC_NATIVERES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,105,33,10
- LTEXT "Extra rendering threads:",IDC_STATIC,19,214,80,8
- EDITTEXT IDC_SWTHREADS_EDIT,102,212,35,13,ES_AUTOHSCROLL | ES_NUMBER
- CONTROL "",IDC_SWTHREADS,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,135,215,11,14
+ LTEXT "Extra rendering threads:",IDC_STATIC,11,252,80,8
+ EDITTEXT IDC_SWTHREADS_EDIT,94,250,35,13,ES_AUTOHSCROLL | ES_NUMBER
+ CONTROL "",IDC_SWTHREADS,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,129,249,11,14
COMBOBOX IDC_UPSCALE_MULTIPLIER,92,117,74,98,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
- LTEXT "Or use Scaling:",IDC_STATIC,38,120,49,8
+ LTEXT "Or use Scaling:",IDC_STATIC,38,119,49,8
LTEXT "Original PS2 resolution :",IDC_STATIC,10,105,80,8
- CONTROL "Edge anti-aliasing (AA1)",IDC_AA1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,230,93,10
- PUSHBUTTON "Cancel",IDCANCEL,95,312,50,14
+ CONTROL "Edge anti-aliasing (AA1)",IDC_AA1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,268,93,10
+ PUSHBUTTON "Cancel",IDCANCEL,89,290,50,14
CONTROL 2021,IDC_LOGO9,"Static",SS_BITMAP,6,6,175,44
- CONTROL "Alpha Hack",IDC_ALPHAHACK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,275,51,10
- CONTROL "Offset Hack",IDC_OFFSETHACK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,87,275,51,10
- GROUPBOX "Hacks",IDC_USERHACKS,6,250,175,55,BS_CENTER
- EDITTEXT IDC_SKIPDRAWHACKEDIT,65,286,40,14,ES_AUTOHSCROLL | ES_NUMBER
- CONTROL "",IDC_SKIPDRAWHACK,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,104,288,11,14
- LTEXT "Skipdraw Hack:",IDC_STATIC_TEXT_SKIPDRAW,11,289,50,8
- EDITTEXT IDC_MSAAEDIT,69,260,35,13,ES_AUTOHSCROLL | ES_NUMBER
- CONTROL "",IDC_MSAA,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,103,263,11,14
GROUPBOX "D3D Internal resolution (can cause glitches)",IDC_STATIC,6,87,175,64,BS_CENTER
- GROUPBOX "Software Mode Settings",IDC_STATIC,6,198,175,50,BS_CENTER
- GROUPBOX "Hardware Mode Settings",IDC_STATIC,6,152,175,45,BS_CENTER
- CONTROL "Logarithmic Z",IDC_LOGZ,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,88,166,58,10
- CONTROL "Alpha correction (FBA)",IDC_FBA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,88,179,87,10
- CONTROL "Allow 8-bit textures",IDC_PALTEX,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,179,82,10
- CONTROL "Texture filtering",IDC_FILTER,"Button",BS_AUTO3STATE | WS_TABSTOP,6,165,67,10
- LTEXT "HW Anti Aliasing",IDC_STATIC_TEXT_HWAA,11,263,53,8
+ GROUPBOX "Software Mode Settings",IDC_STATIC,6,236,175,50,BS_CENTER
+ GROUPBOX "Hardware Mode Settings",IDC_STATIC,6,171,175,63,BS_CENTER
+ CONTROL "Logarithmic Z",IDC_LOGZ,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,184,58,10
+ CONTROL "Alpha correction (FBA)",IDC_FBA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,200,87,10
+ CONTROL "Allow 8-bit textures",IDC_PALTEX,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,200,82,10
+ CONTROL "Texture filtering",IDC_FILTER,"Button",BS_AUTO3STATE | WS_TABSTOP,10,184,67,10
+ CONTROL "Enable Shade Boost",IDC_SHADEBOOST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,157,79,10
+ PUSHBUTTON "Settings...",IDC_SHADEBUTTON,95,154,75,14
+ CONTROL "Enable HW Hacks",IDC_HACKS_ENABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,216,71,10
+ PUSHBUTTON "Configure...",IDC_HACKSBUTTON,95,213,75,14
END
@@ -216,6 +250,22 @@ END
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
+ IDD_HACKS, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 308
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 196
+ END
+
+ IDD_SHADEBOOST, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 309
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 122
+ END
+
IDD_CONFIG, DIALOG
BEGIN
LEFTMARGIN, 7
@@ -224,7 +274,7 @@ BEGIN
VERTGUIDE, 89
VERTGUIDE, 182
TOPMARGIN, 7
- BOTTOMMARGIN, 344
+ BOTTOMMARGIN, 323
HORZGUIDE, 49
END
@@ -252,7 +302,7 @@ BEGIN
RIGHTMARGIN, 181
VERTGUIDE, 87
TOPMARGIN, 6
- BOTTOMMARGIN, 334
+ BOTTOMMARGIN, 304
END
END
#endif // APSTUDIO_INVOKED
diff --git a/plugins/GSdx/GSdx.vcxproj b/plugins/GSdx/GSdx.vcxproj
index fb69ea004..c297ee967 100644
--- a/plugins/GSdx/GSdx.vcxproj
+++ b/plugins/GSdx/GSdx.vcxproj
@@ -1680,6 +1680,7 @@
+
diff --git a/plugins/GSdx/GSdx.vcxproj.filters b/plugins/GSdx/GSdx.vcxproj.filters
index a2bc719e2..e0bb32e28 100644
--- a/plugins/GSdx/GSdx.vcxproj.filters
+++ b/plugins/GSdx/GSdx.vcxproj.filters
@@ -674,6 +674,9 @@
Shaders
+
+ Shaders
+
diff --git a/plugins/GSdx/GSdx_vs2008.vcproj b/plugins/GSdx/GSdx_vs2008.vcproj
index 30da18704..09f70dc5f 100644
--- a/plugins/GSdx/GSdx_vs2008.vcproj
+++ b/plugins/GSdx/GSdx_vs2008.vcproj
@@ -1708,6 +1708,10 @@
RelativePath=".\res\merge.fx"
>
+
+
diff --git a/plugins/GSdx/config.h b/plugins/GSdx/config.h
index 1f63b0142..b082c9bce 100644
--- a/plugins/GSdx/config.h
+++ b/plugins/GSdx/config.h
@@ -1,23 +1,44 @@
-#pragma once
-
-//#define ENABLE_VTUNE
-
-#define ENABLE_JIT_RASTERIZER
-
-//#define ENABLE_DYNAMIC_CRC_HACK
-
-#define ENABLE_UPSCALE_HACKS // Hacks intended to fix upscaling / rendering glitches in HW renderers
-
-//#define DISABLE_HW_TEXTURE_CACHE // Slow but fixes a lot of bugs
-
-//#define DISABLE_CRC_HACKS // Disable all game specific hacks
-
-#if defined(DISABLE_HW_TEXTURE_CACHE) && !defined(DISABLE_CRC_HACKS)
- #define DISABLE_CRC_HACKS
-#endif
-
-//#define DISABLE_BITMASKING
-
-//#define DISABLE_COLCLAMP
-
-//#define DISABLE_DATE
+/*
+ * Copyright (C) 2007-2009 Gabest
+ * http://www.gabest.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, 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 GNU Make; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ */
+
+#pragma once
+
+//#define ENABLE_VTUNE
+
+#define ENABLE_JIT_RASTERIZER
+
+//#define ENABLE_DYNAMIC_CRC_HACK
+
+#define ENABLE_UPSCALE_HACKS // Hacks intended to fix upscaling / rendering glitches in HW renderers
+
+//#define DISABLE_HW_TEXTURE_CACHE // Slow but fixes a lot of bugs
+
+//#define DISABLE_CRC_HACKS // Disable all game specific hacks
+
+#if defined(DISABLE_HW_TEXTURE_CACHE) && !defined(DISABLE_CRC_HACKS)
+ #define DISABLE_CRC_HACKS
+#endif
+
+//#define DISABLE_BITMASKING
+
+//#define DISABLE_COLCLAMP
+
+//#define DISABLE_DATE
diff --git a/plugins/GSdx/res/cs.fx b/plugins/GSdx/res/cs.fx
index 594e99e85..fb63c0b01 100644
--- a/plugins/GSdx/res/cs.fx
+++ b/plugins/GSdx/res/cs.fx
@@ -1,383 +1,383 @@
-#ifndef VS_TME
-#define VS_TME 1
-#define VS_FST 1
-#endif
-
-#ifndef GS_IIP
-#define GS_IIP 0
-#define GS_PRIM 2
-#endif
-
-#ifndef PS_BATCH_SIZE
-#define PS_BATCH_SIZE 2048
-#define PS_FPSM PSM_PSMCT32
-#define PS_ZPSM PSM_PSMZ16
-#endif
-
-#define PSM_PSMCT32 0
-#define PSM_PSMCT24 1
-#define PSM_PSMCT16 2
-#define PSM_PSMCT16S 10
-#define PSM_PSMT8 19
-#define PSM_PSMT4 20
-#define PSM_PSMT8H 27
-#define PSM_PSMT4HL 36
-#define PSM_PSMT4HH 44
-#define PSM_PSMZ32 48
-#define PSM_PSMZ24 49
-#define PSM_PSMZ16 50
-#define PSM_PSMZ16S 58
-
-struct VS_INPUT
-{
- float2 st : TEXCOORD0;
- float4 c : COLOR0;
- float q : TEXCOORD1;
- uint2 p : POSITION0;
- uint z : POSITION1;
- uint2 uv : TEXCOORD2;
- float4 f : COLOR1;
-};
-
-struct VS_OUTPUT
-{
- float4 p : SV_Position;
- float2 z : TEXCOORD0;
- float4 t : TEXCOORD1;
- float4 c : COLOR0;
-};
-
-struct GS_OUTPUT
-{
- float4 p : SV_Position;
- float2 z : TEXCOORD0;
- float4 t : TEXCOORD1;
- float4 c : COLOR0;
- uint id : SV_PrimitiveID;
-};
-
-cbuffer VSConstantBuffer : register(c0)
-{
- float4 VertexScale;
- float4 VertexOffset;
-};
-
-cbuffer PSConstantBuffer : register(c0)
-{
- uint2 WriteMask;
-};
-
-struct FragmentLinkItem
-{
- uint c, z, id, next;
-};
-
-RWByteAddressBuffer VideoMemory : register(u0);
-RWStructuredBuffer FragmentLinkBuffer : register(u1);
-RWByteAddressBuffer StartOffsetBuffer : register(u2);
-//RWTexture2D VideoMemory : register(u2); // 8192 * 512 R8_UINT
-
-Buffer FZRowOffset : register(t0);
-Buffer FZColOffset : register(t1);
-Texture2D Palette : register(t2);
-Texture2D Texture : register(t3);
-
-VS_OUTPUT vs_main(VS_INPUT input)
-{
- VS_OUTPUT output;
-
- output.p = float4(input.p, 0.0f, 0.0f) * VertexScale - VertexOffset;
- output.z = float2(input.z & 0xffff, input.z >> 16); // TODO: min(input.z, 0xffffff00) ?
-
- if(VS_TME)
- {
- if(VS_FST)
- {
- output.t.xy = input.uv;
- output.t.w = 1.0f;
- }
- else
- {
- output.t.xy = input.st;
- output.t.w = input.q;
- }
- }
- else
- {
- output.t.xy = 0;
- output.t.w = 1.0f;
- }
-
- output.c = input.c;
- output.t.z = input.f.r;
-
- return output;
-}
-
-#if GS_PRIM == 0
-
-[maxvertexcount(1)]
-void gs_main(point VS_OUTPUT input[1], inout PointStream stream, uint id : SV_PrimitiveID)
-{
- GS_OUTPUT output;
-
- output.p = input[0].p;
- output.z = input[0].z;
- output.t = input[0].t;
- output.c = input[0].c;
- output.id = id;
-
- stream.Append(output);
-}
-
-#elif GS_PRIM == 1
-
-[maxvertexcount(2)]
-void gs_main(line VS_OUTPUT input[2], inout LineStream stream, uint id : SV_PrimitiveID)
-{
- [unroll]
- for(int i = 0; i < 2; i++)
- {
- GS_OUTPUT output;
-
- output.p = input[i].p;
- output.z = input[i].z;
- output.t = input[i].t;
- output.c = input[i].c;
- output.id = id;
-
-#if GS_IIP == 0
- if(i != 1) output.c = input[1].c;
-#endif
-
- stream.Append(output);
- }
-}
-
-#elif GS_PRIM == 2
-
-[maxvertexcount(3)]
-void gs_main(triangle VS_OUTPUT input[3], inout TriangleStream stream, uint id : SV_PrimitiveID)
-{
- [unroll]
- for(int i = 0; i < 3; i++)
- {
- GS_OUTPUT output;
-
- output.p = input[i].p;
- output.z = input[i].z;
- output.t = input[i].t;
- output.c = input[i].c;
- output.id = id;
-
-#if GS_IIP == 0
- if(i != 2) output.c = input[2].c;
-#endif
-
- stream.Append(output);
- }
-}
-
-#elif GS_PRIM == 3
-
-[maxvertexcount(4)]
-void gs_main(line VS_OUTPUT input[2], inout TriangleStream stream, uint id : SV_PrimitiveID)
-{
- GS_OUTPUT lt, rb, lb, rt;
-
- lt.p = input[0].p;
- lt.z = input[1].z;
- lt.t.xy = input[0].t.xy;
- lt.t.zw = input[1].t.zw;
- lt.c = input[0].c;
- lt.id = id;
-
-#if GS_IIP == 0
- lt.c = input[1].c;
-#endif
-
- rb.p = input[1].p;
- rb.z = input[1].z;
- rb.t = input[1].t;
- rb.c = input[1].c;
- rb.id = id;
-
- lb = lt;
- lb.p.y = rb.p.y;
- lb.t.y = rb.t.y;
-
- rt = rb;
- rt.p.y = lt.p.y;
- rt.t.y = lt.t.y;
-
- stream.Append(lt);
- stream.Append(lb);
- stream.Append(rt);
- stream.Append(rb);
-}
-
-#endif
-
-uint CompressColor32(float4 f)
-{
- uint4 c = (uint4)(f * 0xff) << uint4(0, 8, 16, 24);
-
- return c.r | c.g | c.b | c.a;
-}
-
-uint DecompressColor16(uint c)
-{
- uint r = (c & 0x001f) << 3;
- uint g = (c & 0x03e0) << 6;
- uint b = (c & 0x7c00) << 9;
- uint a = (c & 0x8000) << 15;
-
- return r | g | b | a;
-}
-
-uint ReadPixel(uint addr)
-{
- return VideoMemory.Load(addr) >> ((addr & 2) << 3);
-}
-
-void WritePixel(uint addr, uint value, uint psm)
-{
- uint tmp;
-
- switch(psm)
- {
- case PSM_PSMCT32:
- case PSM_PSMZ32:
- case PSM_PSMCT24:
- case PSM_PSMZ24:
- VideoMemory.Store(addr, value);
- break;
- case PSM_PSMCT16:
- case PSM_PSMCT16S:
- case PSM_PSMZ16:
- case PSM_PSMZ16S:
- tmp = (addr & 2) << 3;
- value = ((value << tmp) ^ VideoMemory.Load(addr)) & (0x0000ffff << tmp);
- VideoMemory.InterlockedXor(addr, value, tmp);
- break;
- }
-}
-
-void ps_main0(GS_OUTPUT input)
-{
- uint x = (uint)input.p.x;
- uint y = (uint)input.p.y;
-
- uint tail = FragmentLinkBuffer.IncrementCounter();
-
- uint index = (y << 11) + x;
- uint next = 0;
-
- StartOffsetBuffer.InterlockedExchange(index * 4, tail, next);
-
- FragmentLinkItem item;
-
- // TODO: preprocess color (tfx, alpha test), z-test
-
- item.c = CompressColor32(input.c);
- item.z = (uint)(input.z.y * 0x10000 + input.z.x);
- item.id = input.id;
- item.next = next;
-
- FragmentLinkBuffer[tail] = item;
-}
-
-void ps_main1(GS_OUTPUT input)
-{
- uint2 pos = (uint2)input.p.xy;
-
- // sort fragments
-
- uint StartOffsetIndex = (pos.y << 11) + pos.x;
-
- int index[PS_BATCH_SIZE];
- int count = 0;
-
- uint next = StartOffsetBuffer.Load(StartOffsetIndex * 4);
-
- StartOffsetBuffer.Store(StartOffsetIndex * 4, 0);
-
- [allow_uav_condition]
- while(next != 0)
- {
- index[count++] = next;
-
- next = FragmentLinkBuffer[next].next;
- }
-
- int N2 = 1 << (int)(ceil(log2(count)));
-
- [allow_uav_condition]
- for(int i = count; i < N2; i++)
- {
- index[i] = 0;
- }
-
- [allow_uav_condition]
- for(int k = 2; k <= N2; k = 2 * k)
- {
- [allow_uav_condition]
- for(int j = k >> 1; j > 0 ; j = j >> 1)
- {
- [allow_uav_condition]
- for(int i = 0; i < N2; i++)
- {
- uint i_id = FragmentLinkBuffer[index[i]].id;
-
- int ixj = i ^ j;
-
- if(ixj > i)
- {
- uint ixj_id = FragmentLinkBuffer[index[ixj]].id;
-
- if((i & k) == 0 && i_id > ixj_id)
- {
- int temp = index[i];
- index[i] = index[ixj];
- index[ixj] = temp;
- }
-
- if((i & k) != 0 && i_id < ixj_id)
- {
- int temp = index[i];
- index[i] = index[ixj];
- index[ixj] = temp;
- }
- }
- }
- }
- }
-
- uint2 addr = (uint2)(FZRowOffset[pos.y] + FZColOffset[pos.x]) << 1;
-
- uint dc = ReadPixel(addr.x);
- uint dz = ReadPixel(addr.y);
-
- uint sc = dc;
- uint sz = dz;
-
- [allow_uav_condition]
- while(--count >= 0)
- {
- FragmentLinkItem f = FragmentLinkBuffer[index[count]];
-
- // TODO
-
- if(sz < f.z)
- {
- sc = f.c;
- sz = f.z;
- }
- }
-
- uint c = sc; // (dc & ~WriteMask.x) | (sc & WriteMask.x);
- uint z = 0;//sz; //(dz & ~WriteMask.y) | (sz & WriteMask.y);
-
- WritePixel(addr.x, c, PS_FPSM);
- WritePixel(addr.y, z, PS_ZPSM);
-}
+#ifndef VS_TME
+#define VS_TME 1
+#define VS_FST 1
+#endif
+
+#ifndef GS_IIP
+#define GS_IIP 0
+#define GS_PRIM 2
+#endif
+
+#ifndef PS_BATCH_SIZE
+#define PS_BATCH_SIZE 2048
+#define PS_FPSM PSM_PSMCT32
+#define PS_ZPSM PSM_PSMZ16
+#endif
+
+#define PSM_PSMCT32 0
+#define PSM_PSMCT24 1
+#define PSM_PSMCT16 2
+#define PSM_PSMCT16S 10
+#define PSM_PSMT8 19
+#define PSM_PSMT4 20
+#define PSM_PSMT8H 27
+#define PSM_PSMT4HL 36
+#define PSM_PSMT4HH 44
+#define PSM_PSMZ32 48
+#define PSM_PSMZ24 49
+#define PSM_PSMZ16 50
+#define PSM_PSMZ16S 58
+
+struct VS_INPUT
+{
+ float2 st : TEXCOORD0;
+ float4 c : COLOR0;
+ float q : TEXCOORD1;
+ uint2 p : POSITION0;
+ uint z : POSITION1;
+ uint2 uv : TEXCOORD2;
+ float4 f : COLOR1;
+};
+
+struct VS_OUTPUT
+{
+ float4 p : SV_Position;
+ float2 z : TEXCOORD0;
+ float4 t : TEXCOORD1;
+ float4 c : COLOR0;
+};
+
+struct GS_OUTPUT
+{
+ float4 p : SV_Position;
+ float2 z : TEXCOORD0;
+ float4 t : TEXCOORD1;
+ float4 c : COLOR0;
+ uint id : SV_PrimitiveID;
+};
+
+cbuffer VSConstantBuffer : register(c0)
+{
+ float4 VertexScale;
+ float4 VertexOffset;
+};
+
+cbuffer PSConstantBuffer : register(c0)
+{
+ uint2 WriteMask;
+};
+
+struct FragmentLinkItem
+{
+ uint c, z, id, next;
+};
+
+RWByteAddressBuffer VideoMemory : register(u0);
+RWStructuredBuffer FragmentLinkBuffer : register(u1);
+RWByteAddressBuffer StartOffsetBuffer : register(u2);
+//RWTexture2D VideoMemory : register(u2); // 8192 * 512 R8_UINT
+
+Buffer FZRowOffset : register(t0);
+Buffer FZColOffset : register(t1);
+Texture2D Palette : register(t2);
+Texture2D Texture : register(t3);
+
+VS_OUTPUT vs_main(VS_INPUT input)
+{
+ VS_OUTPUT output;
+
+ output.p = float4(input.p, 0.0f, 0.0f) * VertexScale - VertexOffset;
+ output.z = float2(input.z & 0xffff, input.z >> 16); // TODO: min(input.z, 0xffffff00) ?
+
+ if(VS_TME)
+ {
+ if(VS_FST)
+ {
+ output.t.xy = input.uv;
+ output.t.w = 1.0f;
+ }
+ else
+ {
+ output.t.xy = input.st;
+ output.t.w = input.q;
+ }
+ }
+ else
+ {
+ output.t.xy = 0;
+ output.t.w = 1.0f;
+ }
+
+ output.c = input.c;
+ output.t.z = input.f.r;
+
+ return output;
+}
+
+#if GS_PRIM == 0
+
+[maxvertexcount(1)]
+void gs_main(point VS_OUTPUT input[1], inout PointStream stream, uint id : SV_PrimitiveID)
+{
+ GS_OUTPUT output;
+
+ output.p = input[0].p;
+ output.z = input[0].z;
+ output.t = input[0].t;
+ output.c = input[0].c;
+ output.id = id;
+
+ stream.Append(output);
+}
+
+#elif GS_PRIM == 1
+
+[maxvertexcount(2)]
+void gs_main(line VS_OUTPUT input[2], inout LineStream stream, uint id : SV_PrimitiveID)
+{
+ [unroll]
+ for(int i = 0; i < 2; i++)
+ {
+ GS_OUTPUT output;
+
+ output.p = input[i].p;
+ output.z = input[i].z;
+ output.t = input[i].t;
+ output.c = input[i].c;
+ output.id = id;
+
+#if GS_IIP == 0
+ if(i != 1) output.c = input[1].c;
+#endif
+
+ stream.Append(output);
+ }
+}
+
+#elif GS_PRIM == 2
+
+[maxvertexcount(3)]
+void gs_main(triangle VS_OUTPUT input[3], inout TriangleStream stream, uint id : SV_PrimitiveID)
+{
+ [unroll]
+ for(int i = 0; i < 3; i++)
+ {
+ GS_OUTPUT output;
+
+ output.p = input[i].p;
+ output.z = input[i].z;
+ output.t = input[i].t;
+ output.c = input[i].c;
+ output.id = id;
+
+#if GS_IIP == 0
+ if(i != 2) output.c = input[2].c;
+#endif
+
+ stream.Append(output);
+ }
+}
+
+#elif GS_PRIM == 3
+
+[maxvertexcount(4)]
+void gs_main(line VS_OUTPUT input[2], inout TriangleStream stream, uint id : SV_PrimitiveID)
+{
+ GS_OUTPUT lt, rb, lb, rt;
+
+ lt.p = input[0].p;
+ lt.z = input[1].z;
+ lt.t.xy = input[0].t.xy;
+ lt.t.zw = input[1].t.zw;
+ lt.c = input[0].c;
+ lt.id = id;
+
+#if GS_IIP == 0
+ lt.c = input[1].c;
+#endif
+
+ rb.p = input[1].p;
+ rb.z = input[1].z;
+ rb.t = input[1].t;
+ rb.c = input[1].c;
+ rb.id = id;
+
+ lb = lt;
+ lb.p.y = rb.p.y;
+ lb.t.y = rb.t.y;
+
+ rt = rb;
+ rt.p.y = lt.p.y;
+ rt.t.y = lt.t.y;
+
+ stream.Append(lt);
+ stream.Append(lb);
+ stream.Append(rt);
+ stream.Append(rb);
+}
+
+#endif
+
+uint CompressColor32(float4 f)
+{
+ uint4 c = (uint4)(f * 0xff) << uint4(0, 8, 16, 24);
+
+ return c.r | c.g | c.b | c.a;
+}
+
+uint DecompressColor16(uint c)
+{
+ uint r = (c & 0x001f) << 3;
+ uint g = (c & 0x03e0) << 6;
+ uint b = (c & 0x7c00) << 9;
+ uint a = (c & 0x8000) << 15;
+
+ return r | g | b | a;
+}
+
+uint ReadPixel(uint addr)
+{
+ return VideoMemory.Load(addr) >> ((addr & 2) << 3);
+}
+
+void WritePixel(uint addr, uint value, uint psm)
+{
+ uint tmp;
+
+ switch(psm)
+ {
+ case PSM_PSMCT32:
+ case PSM_PSMZ32:
+ case PSM_PSMCT24:
+ case PSM_PSMZ24:
+ VideoMemory.Store(addr, value);
+ break;
+ case PSM_PSMCT16:
+ case PSM_PSMCT16S:
+ case PSM_PSMZ16:
+ case PSM_PSMZ16S:
+ tmp = (addr & 2) << 3;
+ value = ((value << tmp) ^ VideoMemory.Load(addr)) & (0x0000ffff << tmp);
+ VideoMemory.InterlockedXor(addr, value, tmp);
+ break;
+ }
+}
+
+void ps_main0(GS_OUTPUT input)
+{
+ uint x = (uint)input.p.x;
+ uint y = (uint)input.p.y;
+
+ uint tail = FragmentLinkBuffer.IncrementCounter();
+
+ uint index = (y << 11) + x;
+ uint next = 0;
+
+ StartOffsetBuffer.InterlockedExchange(index * 4, tail, next);
+
+ FragmentLinkItem item;
+
+ // TODO: preprocess color (tfx, alpha test), z-test
+
+ item.c = CompressColor32(input.c);
+ item.z = (uint)(input.z.y * 0x10000 + input.z.x);
+ item.id = input.id;
+ item.next = next;
+
+ FragmentLinkBuffer[tail] = item;
+}
+
+void ps_main1(GS_OUTPUT input)
+{
+ uint2 pos = (uint2)input.p.xy;
+
+ // sort fragments
+
+ uint StartOffsetIndex = (pos.y << 11) + pos.x;
+
+ int index[PS_BATCH_SIZE];
+ int count = 0;
+
+ uint next = StartOffsetBuffer.Load(StartOffsetIndex * 4);
+
+ StartOffsetBuffer.Store(StartOffsetIndex * 4, 0);
+
+ [allow_uav_condition]
+ while(next != 0)
+ {
+ index[count++] = next;
+
+ next = FragmentLinkBuffer[next].next;
+ }
+
+ int N2 = 1 << (int)(ceil(log2(count)));
+
+ [allow_uav_condition]
+ for(int i = count; i < N2; i++)
+ {
+ index[i] = 0;
+ }
+
+ [allow_uav_condition]
+ for(int k = 2; k <= N2; k = 2 * k)
+ {
+ [allow_uav_condition]
+ for(int j = k >> 1; j > 0 ; j = j >> 1)
+ {
+ [allow_uav_condition]
+ for(int i = 0; i < N2; i++)
+ {
+ uint i_id = FragmentLinkBuffer[index[i]].id;
+
+ int ixj = i ^ j;
+
+ if(ixj > i)
+ {
+ uint ixj_id = FragmentLinkBuffer[index[ixj]].id;
+
+ if((i & k) == 0 && i_id > ixj_id)
+ {
+ int temp = index[i];
+ index[i] = index[ixj];
+ index[ixj] = temp;
+ }
+
+ if((i & k) != 0 && i_id < ixj_id)
+ {
+ int temp = index[i];
+ index[i] = index[ixj];
+ index[ixj] = temp;
+ }
+ }
+ }
+ }
+ }
+
+ uint2 addr = (uint2)(FZRowOffset[pos.y] + FZColOffset[pos.x]) << 1;
+
+ uint dc = ReadPixel(addr.x);
+ uint dz = ReadPixel(addr.y);
+
+ uint sc = dc;
+ uint sz = dz;
+
+ [allow_uav_condition]
+ while(--count >= 0)
+ {
+ FragmentLinkItem f = FragmentLinkBuffer[index[count]];
+
+ // TODO
+
+ if(sz < f.z)
+ {
+ sc = f.c;
+ sz = f.z;
+ }
+ }
+
+ uint c = sc; // (dc & ~WriteMask.x) | (sc & WriteMask.x);
+ uint z = 0;//sz; //(dz & ~WriteMask.y) | (sz & WriteMask.y);
+
+ WritePixel(addr.x, c, PS_FPSM);
+ WritePixel(addr.y, z, PS_ZPSM);
+}
diff --git a/plugins/GSdx/res/fxaa.fx b/plugins/GSdx/res/fxaa.fx
index 095d28919..450aea1d8 100644
--- a/plugins/GSdx/res/fxaa.fx
+++ b/plugins/GSdx/res/fxaa.fx
@@ -1,1996 +1,1996 @@
-#ifdef SHADER_MODEL // make safe to include in resource file to enforce dependency
-
-#define FXAA_PC 1
-#define FXAA_QUALITY__SUBPIX 0.0
-
-#if SHADER_MODEL >= 0x400
-
-#if SHADER_MODEL >= 0x500
- #define FXAA_HLSL_5 1
-#else
- #define FXAA_HLSL_4 1
-#endif
-
-Texture2D Texture;
-SamplerState TextureSampler;
-
-cbuffer cb0
-{
- float4 _rcpFrame;
- float4 _rcpFrameOpt;
-};
-
-struct PS_INPUT
-{
- float4 p : SV_Position;
- float2 t : TEXCOORD0;
-};
-
-struct PS_OUTPUT
-{
- float4 c : SV_Target0;
-};
-
-#elif SHADER_MODEL <= 0x300
-
-#define FXAA_HLSL_3 1
-
-sampler Texture : register(s0);
-
-float4 _rcpFrame : register(c0);
-float4 _rcpFrameOpt : register(c1);
-
-struct PS_INPUT
-{
-#if SHADER_MODEL < 0x300
- float4 p : TEXCOORD1;
-#else
- float4 p : VPOS;
-#endif
- float2 t : TEXCOORD0;
-};
-
-struct PS_OUTPUT
-{
- float4 c : COLOR;
-};
-
-#endif
-
-/*============================================================================
-
-
- NVIDIA FXAA 3.10 by TIMOTHY LOTTES
-
-
-------------------------------------------------------------------------------
-COPYRIGHT (C) 2010, 2011 NVIDIA CORPORATION. ALL RIGHTS RESERVED.
-------------------------------------------------------------------------------
-TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED
-*AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA
-OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR
-CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR
-LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION,
-OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE
-THIS SOFTWARE, EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-------------------------------------------------------------------------------
- INTEGRATION CHECKLIST
-------------------------------------------------------------------------------
-(1.)
-In the shader source,
-setup defines for the desired configuration.
-Example,
-
- #define FXAA_PC 1
- #define FXAA_HLSL_3 1
- #define FXAA_QUALITY__PRESET 12
- #define FXAA_QUALITY__EDGE_THRESHOLD (1.0/6.0)
- #define FXAA_QUALITY__EDGE_THRESHOLD_MIN (1.0/12.0)
-
-(2.)
-Then include this file,
-
- #include "Fxaa3.h"
-
-(3.)
-Then call the FXAA pixel shader from within your desired shader,
-
- return FxaaPixelShader(pos, posPos, tex, rcpFrame, rcpFrameOpt);
-
-(4.)
-Insure pass prior to FXAA outputs RGBL.
-See next section.
-
-(5.)
-Setup engine to provide "rcpFrame" and "rcpFrameOpt" constants.
-Not using constants will result in a performance loss.
-
- // {x_} = 1.0/screenWidthInPixels
- // {_y} = 1.0/screenHeightInPixels
- float2 rcpFrame
-
- // This must be from a constant/uniform.
- // {x___} = 2.0/screenWidthInPixels
- // {_y__} = 2.0/screenHeightInPixels
- // {__z_} = 0.5/screenWidthInPixels
- // {___w} = 0.5/screenHeightInPixels
- float4 rcpFrameOpt
-
-(5.a.)
-Optionally change to this for sharper FXAA Console,
-
- // This must be from a constant/uniform.
- // {x___} = 2.0/screenWidthInPixels
- // {_y__} = 2.0/screenHeightInPixels
- // {__z_} = 0.333/screenWidthInPixels
- // {___w} = 0.333/screenHeightInPixels
- float4 rcpFrameOpt
-
-(6.)
-Have FXAA vertex shader run as a full screen triangle,
-and output "pos" and "posPos" such that inputs in the pixel shader provide,
-
- // {xy} = center of pixel
- float2 pos,
-
- // {xy__} = upper left of pixel
- // {__zw} = lower right of pixel
- float4 posPos,
-
-(7.)
-Insure the texture sampler used by FXAA is set to bilinear filtering.
-
-
-------------------------------------------------------------------------------
- INTEGRATION - RGBL AND COLORSPACE
-------------------------------------------------------------------------------
-FXAA3 requires RGBL as input.
-
-RGB should be LDR (low dynamic range).
-Specifically do FXAA after tonemapping.
-
-RGB data as returned by a texture fetch can be linear or non-linear.
-Note an "sRGB format" texture counts as linear,
-because the result of a texture fetch is linear data.
-Regular "RGBA8" textures in the sRGB colorspace are non-linear.
-
-Luma must be stored in the alpha channel prior to running FXAA.
-This luma should be in a perceptual space (could be gamma 2.0).
-Example pass before FXAA where output is gamma 2.0 encoded,
-
- color.rgb = ToneMap(color.rgb); // linear color output
- color.rgb = sqrt(color.rgb); // gamma 2.0 color output
- return color;
-
-To use FXAA,
-
- color.rgb = ToneMap(color.rgb); // linear color output
- color.rgb = sqrt(color.rgb); // gamma 2.0 color output
- color.a = dot(color.rgb, float3(0.299, 0.587, 0.114)); // compute luma
- return color;
-
-Another example where output is linear encoded,
-say for instance writing to an sRGB formated render target,
-where the render target does the conversion back to sRGB after blending,
-
- color.rgb = ToneMap(color.rgb); // linear color output
- return color;
-
-To use FXAA,
-
- color.rgb = ToneMap(color.rgb); // linear color output
- color.a = sqrt(dot(color.rgb, float3(0.299, 0.587, 0.114))); // compute luma
- return color;
-
-Getting luma correct is required for the algorithm to work correctly.
-
-
-------------------------------------------------------------------------------
- BEING LINEARLY CORRECT?
-------------------------------------------------------------------------------
-Applying FXAA to a framebuffer with linear RGB color will look worse.
-This is very counter intuitive, but happends to be true in this case.
-The reason is because dithering artifacts will be more visiable
-in a linear colorspace.
-
-
-------------------------------------------------------------------------------
- COMPLEX INTEGRATION
-------------------------------------------------------------------------------
-Q. What if the engine is blending into RGB before wanting to run FXAA?
-
-A. In the last opaque pass prior to FXAA,
- have the pass write out luma into alpha.
- Then blend into RGB only.
- FXAA should be able to run ok
- assuming the blending pass did not any add aliasing.
- This should be the common case for particles and common blending passes.
-
-============================================================================*/
-
-/*============================================================================
-
- INTEGRATION KNOBS
-
-============================================================================*/
-//
-// FXAA_PS3 and FXAA_360 choose the console algorithm (FXAA3 CONSOLE).
-// FXAA_360_OPT is a prototype for the new optimized 360 version.
-//
-// 1 = Use API.
-// 0 = Don't use API.
-//
-/*--------------------------------------------------------------------------*/
-#ifndef FXAA_PS3
- #define FXAA_PS3 0
-#endif
-/*--------------------------------------------------------------------------*/
-#ifndef FXAA_360
- #define FXAA_360 0
-#endif
-/*--------------------------------------------------------------------------*/
-#ifndef FXAA_360_OPT
- #define FXAA_360_OPT 0
-#endif
-/*==========================================================================*/
-#ifndef FXAA_PC
- //
- // FXAA Quality
- // The high quality PC algorithm.
- //
- #define FXAA_PC 0
-#endif
-/*--------------------------------------------------------------------------*/
-#ifndef FXAA_PC_CONSOLE
- //
- // The console algorithm for PC is included
- // for developers targeting really low spec machines.
- //
- #define FXAA_PC_CONSOLE 0
-#endif
-/*--------------------------------------------------------------------------*/
-#ifndef FXAA_GLSL_120
- #define FXAA_GLSL_120 0
-#endif
-/*--------------------------------------------------------------------------*/
-#ifndef FXAA_GLSL_130
- #define FXAA_GLSL_130 0
-#endif
-/*--------------------------------------------------------------------------*/
-#ifndef FXAA_HLSL_3
- #define FXAA_HLSL_3 0
-#endif
-/*--------------------------------------------------------------------------*/
-#ifndef FXAA_HLSL_4
- #define FXAA_HLSL_4 0
-#endif
-/*--------------------------------------------------------------------------*/
-#ifndef FXAA_HLSL_5
- #define FXAA_HLSL_5 0
-#endif
-/*==========================================================================*/
-#ifndef FXAA_EARLY_EXIT
- //
- // Controls algorithm's early exit path.
- // On PS3 turning this on adds 2 cycles to the shader.
- // On 360 turning this off adds 10ths of a millisecond to the shader.
- // Turning this off on console will result in a more blurry image.
- // So this defaults to on.
- //
- // 1 = On.
- // 0 = Off.
- //
- #define FXAA_EARLY_EXIT 1
-#endif
-/*--------------------------------------------------------------------------*/
-#ifndef FXAA_DISCARD
- //
- // Only valid for PC OpenGL currently.
- //
- // 1 = Use discard on pixels which don't need AA.
- // For APIs which enable concurrent TEX+ROP from same surface.
- // 0 = Return unchanged color on pixels which don't need AA.
- //
- #define FXAA_DISCARD 0
-#endif
-/*--------------------------------------------------------------------------*/
-#ifndef FXAA_FAST_PIXEL_OFFSET
- //
- // Used for GLSL 120 only.
- //
- // 1 = GL API supports fast pixel offsets
- // 0 = do not use fast pixel offsets
- //
- #ifdef GL_EXT_gpu_shader4
- #define FXAA_FAST_PIXEL_OFFSET 1
- #endif
- #ifdef GL_NV_gpu_shader5
- #define FXAA_FAST_PIXEL_OFFSET 1
- #endif
- #ifdef GL_ARB_gpu_shader5
- #define FXAA_FAST_PIXEL_OFFSET 1
- #endif
- #ifndef FXAA_FAST_PIXEL_OFFSET
- #define FXAA_FAST_PIXEL_OFFSET 0
- #endif
-#endif
-/*--------------------------------------------------------------------------*/
-#ifndef FXAA_GATHER4_ALPHA
- //
- // 1 = API supports gather4 on alpha channel.
- // 0 = API does not support gather4 on alpha channel.
- //
- #if (FXAA_HLSL_5 == 1)
- #define FXAA_GATHER4_ALPHA 1
- #endif
- #ifdef GL_ARB_gpu_shader5
- #define FXAA_GATHER4_ALPHA 1
- #endif
- #ifdef GL_NV_gpu_shader5
- #define FXAA_GATHER4_ALPHA 1
- #endif
- #ifndef FXAA_GATHER4_ALPHA
- #define FXAA_GATHER4_ALPHA 0
- #endif
-#endif
-
-/*============================================================================
- FXAA CONSOLE - TUNING KNOBS
-============================================================================*/
-#ifndef FXAA_CONSOLE__EDGE_SHARPNESS
- //
- // Consoles the sharpness of edges.
- //
- // Due to the PS3 being ALU bound,
- // there are only two safe values here: 4 and 8.
- // These options use the shaders ability to a free *|/ by 4|8.
- //
- // 8.0 is sharper
- // 4.0 is softer
- // 2.0 is really soft (good for vector graphics inputs)
- //
- #if 1
- #define FXAA_CONSOLE__EDGE_SHARPNESS 8.0
- #endif
- #if 0
- #define FXAA_CONSOLE__EDGE_SHARPNESS 4.0
- #endif
- #if 0
- #define FXAA_CONSOLE__EDGE_SHARPNESS 2.0
- #endif
-#endif
-/*--------------------------------------------------------------------------*/
-#ifndef FXAA_CONSOLE__EDGE_THRESHOLD
- //
- // The minimum amount of local contrast required to apply algorithm.
- // The console setting has a different mapping than the quality setting.
- //
- // This only applies when FXAA_EARLY_EXIT is 1.
- //
- // Due to the PS3 being ALU bound,
- // there are only two safe values here: 0.25 and 0.125.
- // These options use the shaders ability to a free *|/ by 4|8.
- //
- // 0.125 leaves less aliasing, but is softer
- // 0.25 leaves more aliasing, and is sharper
- //
- #if 1
- #define FXAA_CONSOLE__EDGE_THRESHOLD 0.125
- #else
- #define FXAA_CONSOLE__EDGE_THRESHOLD 0.25
- #endif
-#endif
-/*--------------------------------------------------------------------------*/
-#ifndef FXAA_CONSOLE__EDGE_THRESHOLD_MIN
- //
- // Trims the algorithm from processing darks.
- // The console setting has a different mapping than the quality setting.
- //
- // This only applies when FXAA_EARLY_EXIT is 1.
- //
- // This does not apply to PS3.
- // PS3 was simplified to avoid more shader instructions.
- //
- #define FXAA_CONSOLE__EDGE_THRESHOLD_MIN 0.05
-#endif
-
-/*============================================================================
- FXAA QUALITY - TUNING KNOBS
-============================================================================*/
-#ifndef FXAA_QUALITY__EDGE_THRESHOLD
- //
- // The minimum amount of local contrast required to apply algorithm.
- //
- // 1/3 - too little
- // 1/4 - low quality
- // 1/6 - default
- // 1/8 - high quality (default)
- // 1/16 - overkill
- //
- #define FXAA_QUALITY__EDGE_THRESHOLD (1.0/6.0)
-#endif
-/*--------------------------------------------------------------------------*/
-#ifndef FXAA_QUALITY__EDGE_THRESHOLD_MIN
- //
- // Trims the algorithm from processing darks.
- //
- // 1/32 - visible limit
- // 1/16 - high quality
- // 1/12 - upper limit (default, the start of visible unfiltered edges)
- //
- #define FXAA_QUALITY__EDGE_THRESHOLD_MIN (1.0/12.0)
-#endif
-/*--------------------------------------------------------------------------*/
-#ifndef FXAA_QUALITY__SUBPIX
- //
- // Choose the amount of sub-pixel aliasing removal.
- //
- // 1 - upper limit (softer)
- // 3/4 - default amount of filtering
- // 1/2 - lower limit (sharper, less sub-pixel aliasing removal)
- //
- #define FXAA_QUALITY__SUBPIX (3.0/4.0)
-#endif
-/*--------------------------------------------------------------------------*/
-#ifndef FXAA_QUALITY__PRESET
- //
- // Choose the quality preset.
- //
- // OPTIONS
- // -----------------------------------------------------------------------
- // 10 to 15 - default medium dither (10=fastest, 15=highest quality)
- // 20 to 29 - less dither, more expensive (20=fastest, 29=highest quality)
- // 39 - no dither, very expensive
- //
- // NOTES
- // -----------------------------------------------------------------------
- // 12 = slightly faster then FXAA 3.9 and higher edge quality (default)
- // 13 = about same speed as FXAA 3.9 and better than 12
- // 23 = closest to FXAA 3.9 visually and performance wise
- // _ = the lowest digit is directly related to performance
- // _ = the highest digit is directly related to style
- //
- #define FXAA_QUALITY__PRESET 12
-#endif
-
-
-/*============================================================================
-
- FXAA QUALITY - PRESETS
-
-============================================================================*/
-
-/*============================================================================
- FXAA QUALITY - MEDIUM DITHER PRESETS
-============================================================================*/
-#if (FXAA_QUALITY__PRESET == 10)
- #define FXAA_QUALITY__PS 3
- #define FXAA_QUALITY__P0 1.5
- #define FXAA_QUALITY__P1 3.0
- #define FXAA_QUALITY__P2 12.0
-#endif
-/*--------------------------------------------------------------------------*/
-#if (FXAA_QUALITY__PRESET == 11)
- #define FXAA_QUALITY__PS 4
- #define FXAA_QUALITY__P0 1.0
- #define FXAA_QUALITY__P1 1.5
- #define FXAA_QUALITY__P2 3.0
- #define FXAA_QUALITY__P3 12.0
-#endif
-/*--------------------------------------------------------------------------*/
-#if (FXAA_QUALITY__PRESET == 12)
- #define FXAA_QUALITY__PS 5
- #define FXAA_QUALITY__P0 1.0
- #define FXAA_QUALITY__P1 1.5
- #define FXAA_QUALITY__P2 2.0
- #define FXAA_QUALITY__P3 4.0
- #define FXAA_QUALITY__P4 12.0
-#endif
-/*--------------------------------------------------------------------------*/
-#if (FXAA_QUALITY__PRESET == 13)
- #define FXAA_QUALITY__PS 6
- #define FXAA_QUALITY__P0 1.0
- #define FXAA_QUALITY__P1 1.5
- #define FXAA_QUALITY__P2 2.0
- #define FXAA_QUALITY__P3 2.0
- #define FXAA_QUALITY__P4 4.0
- #define FXAA_QUALITY__P5 12.0
-#endif
-/*--------------------------------------------------------------------------*/
-#if (FXAA_QUALITY__PRESET == 14)
- #define FXAA_QUALITY__PS 7
- #define FXAA_QUALITY__P0 1.0
- #define FXAA_QUALITY__P1 1.5
- #define FXAA_QUALITY__P2 2.0
- #define FXAA_QUALITY__P3 2.0
- #define FXAA_QUALITY__P4 2.0
- #define FXAA_QUALITY__P5 4.0
- #define FXAA_QUALITY__P6 12.0
-#endif
-/*--------------------------------------------------------------------------*/
-#if (FXAA_QUALITY__PRESET == 15)
- #define FXAA_QUALITY__PS 8
- #define FXAA_QUALITY__P0 1.0
- #define FXAA_QUALITY__P1 1.5
- #define FXAA_QUALITY__P2 2.0
- #define FXAA_QUALITY__P3 2.0
- #define FXAA_QUALITY__P4 2.0
- #define FXAA_QUALITY__P5 2.0
- #define FXAA_QUALITY__P6 4.0
- #define FXAA_QUALITY__P7 12.0
-#endif
-
-/*============================================================================
- FXAA QUALITY - LOW DITHER PRESETS
-============================================================================*/
-#if (FXAA_QUALITY__PRESET == 20)
- #define FXAA_QUALITY__PS 3
- #define FXAA_QUALITY__P0 1.5
- #define FXAA_QUALITY__P1 2.0
- #define FXAA_QUALITY__P2 8.0
-#endif
-/*--------------------------------------------------------------------------*/
-#if (FXAA_QUALITY__PRESET == 21)
- #define FXAA_QUALITY__PS 4
- #define FXAA_QUALITY__P0 1.0
- #define FXAA_QUALITY__P1 1.5
- #define FXAA_QUALITY__P2 2.0
- #define FXAA_QUALITY__P3 8.0
-#endif
-/*--------------------------------------------------------------------------*/
-#if (FXAA_QUALITY__PRESET == 22)
- #define FXAA_QUALITY__PS 5
- #define FXAA_QUALITY__P0 1.0
- #define FXAA_QUALITY__P1 1.5
- #define FXAA_QUALITY__P2 2.0
- #define FXAA_QUALITY__P3 2.0
- #define FXAA_QUALITY__P4 8.0
-#endif
-/*--------------------------------------------------------------------------*/
-#if (FXAA_QUALITY__PRESET == 23)
- #define FXAA_QUALITY__PS 6
- #define FXAA_QUALITY__P0 1.0
- #define FXAA_QUALITY__P1 1.5
- #define FXAA_QUALITY__P2 2.0
- #define FXAA_QUALITY__P3 2.0
- #define FXAA_QUALITY__P4 2.0
- #define FXAA_QUALITY__P5 8.0
-#endif
-/*--------------------------------------------------------------------------*/
-#if (FXAA_QUALITY__PRESET == 24)
- #define FXAA_QUALITY__PS 7
- #define FXAA_QUALITY__P0 1.0
- #define FXAA_QUALITY__P1 1.5
- #define FXAA_QUALITY__P2 2.0
- #define FXAA_QUALITY__P3 2.0
- #define FXAA_QUALITY__P4 2.0
- #define FXAA_QUALITY__P5 3.0
- #define FXAA_QUALITY__P6 8.0
-#endif
-/*--------------------------------------------------------------------------*/
-#if (FXAA_QUALITY__PRESET == 25)
- #define FXAA_QUALITY__PS 8
- #define FXAA_QUALITY__P0 1.0
- #define FXAA_QUALITY__P1 1.5
- #define FXAA_QUALITY__P2 2.0
- #define FXAA_QUALITY__P3 2.0
- #define FXAA_QUALITY__P4 2.0
- #define FXAA_QUALITY__P5 2.0
- #define FXAA_QUALITY__P6 4.0
- #define FXAA_QUALITY__P7 8.0
-#endif
-/*--------------------------------------------------------------------------*/
-#if (FXAA_QUALITY__PRESET == 26)
- #define FXAA_QUALITY__PS 9
- #define FXAA_QUALITY__P0 1.0
- #define FXAA_QUALITY__P1 1.5
- #define FXAA_QUALITY__P2 2.0
- #define FXAA_QUALITY__P3 2.0
- #define FXAA_QUALITY__P4 2.0
- #define FXAA_QUALITY__P5 2.0
- #define FXAA_QUALITY__P6 2.0
- #define FXAA_QUALITY__P7 4.0
- #define FXAA_QUALITY__P8 8.0
-#endif
-/*--------------------------------------------------------------------------*/
-#if (FXAA_QUALITY__PRESET == 27)
- #define FXAA_QUALITY__PS 10
- #define FXAA_QUALITY__P0 1.0
- #define FXAA_QUALITY__P1 1.5
- #define FXAA_QUALITY__P2 2.0
- #define FXAA_QUALITY__P3 2.0
- #define FXAA_QUALITY__P4 2.0
- #define FXAA_QUALITY__P5 2.0
- #define FXAA_QUALITY__P6 2.0
- #define FXAA_QUALITY__P7 2.0
- #define FXAA_QUALITY__P8 4.0
- #define FXAA_QUALITY__P9 8.0
-#endif
-/*--------------------------------------------------------------------------*/
-#if (FXAA_QUALITY__PRESET == 28)
- #define FXAA_QUALITY__PS 11
- #define FXAA_QUALITY__P0 1.0
- #define FXAA_QUALITY__P1 1.5
- #define FXAA_QUALITY__P2 2.0
- #define FXAA_QUALITY__P3 2.0
- #define FXAA_QUALITY__P4 2.0
- #define FXAA_QUALITY__P5 2.0
- #define FXAA_QUALITY__P6 2.0
- #define FXAA_QUALITY__P7 2.0
- #define FXAA_QUALITY__P8 2.0
- #define FXAA_QUALITY__P9 4.0
- #define FXAA_QUALITY__P10 8.0
-#endif
-/*--------------------------------------------------------------------------*/
-#if (FXAA_QUALITY__PRESET == 29)
- #define FXAA_QUALITY__PS 12
- #define FXAA_QUALITY__P0 1.0
- #define FXAA_QUALITY__P1 1.5
- #define FXAA_QUALITY__P2 2.0
- #define FXAA_QUALITY__P3 2.0
- #define FXAA_QUALITY__P4 2.0
- #define FXAA_QUALITY__P5 2.0
- #define FXAA_QUALITY__P6 2.0
- #define FXAA_QUALITY__P7 2.0
- #define FXAA_QUALITY__P8 2.0
- #define FXAA_QUALITY__P9 2.0
- #define FXAA_QUALITY__P10 4.0
- #define FXAA_QUALITY__P11 8.0
-#endif
-
-/*============================================================================
- FXAA QUALITY - EXTREME QUALITY
-============================================================================*/
-#if (FXAA_QUALITY__PRESET == 39)
- #define FXAA_QUALITY__PS 12
- #define FXAA_QUALITY__P0 1.0
- #define FXAA_QUALITY__P1 1.0
- #define FXAA_QUALITY__P2 1.0
- #define FXAA_QUALITY__P3 1.0
- #define FXAA_QUALITY__P4 1.0
- #define FXAA_QUALITY__P5 1.5
- #define FXAA_QUALITY__P6 2.0
- #define FXAA_QUALITY__P7 2.0
- #define FXAA_QUALITY__P8 2.0
- #define FXAA_QUALITY__P9 2.0
- #define FXAA_QUALITY__P10 4.0
- #define FXAA_QUALITY__P11 8.0
-#endif
-
-
-
-/*============================================================================
-
- API PORTING
-
-============================================================================*/
-#if FXAA_GLSL_120
- // Requires,
- // #version 120
- // And at least,
- // #extension GL_EXT_gpu_shader4 : enable
- // (or set FXAA_FAST_PIXEL_OFFSET 1 to work like DX9)
- #define half float
- #define half2 vec2
- #define half3 vec3
- #define half4 vec4
- #define int2 ivec2
- #define float2 vec2
- #define float3 vec3
- #define float4 vec4
- #define FxaaInt2 ivec2
- #define FxaaFloat2 vec2
- #define FxaaFloat3 vec3
- #define FxaaFloat4 vec4
- #define FxaaDiscard discard
- #define FxaaDot3(a, b) dot(a, b)
- #define FxaaSat(x) clamp(x, 0.0, 1.0)
- #define FxaaLerp(x,y,s) mix(x,y,s)
- #define FxaaTex sampler2D
- #define FxaaTexTop(t, p) texture2DLod(t, p, 0.0)
- #if (FXAA_FAST_PIXEL_OFFSET == 1)
- #define FxaaTexOff(t, p, o, r) texture2DLodOffset(t, p, 0.0, o)
- #else
- #define FxaaTexOff(t, p, o, r) texture2DLod(t, p + (o * r), 0.0)
- #endif
- #if (FXAA_GATHER4_ALPHA == 1)
- // use #extension GL_ARB_gpu_shader5 : enable
- #define FxaaTexAlpha4(t, p, r) textureGather(t, p, 3)
- #define FxaaTexOffAlpha4(t, p, o, r) textureGatherOffset(t, p, o, 3)
- #endif
-#endif
-/*--------------------------------------------------------------------------*/
-#if FXAA_GLSL_130
- // Requires "#version 130" or better
- #define half float
- #define half2 vec2
- #define half3 vec3
- #define half4 vec4
- #define int2 ivec2
- #define float2 vec2
- #define float3 vec3
- #define float4 vec4
- #define FxaaInt2 ivec2
- #define FxaaFloat2 vec2
- #define FxaaFloat3 vec3
- #define FxaaFloat4 vec4
- #define FxaaDiscard discard
- #define FxaaDot3(a, b) dot(a, b)
- #define FxaaSat(x) clamp(x, 0.0, 1.0)
- #define FxaaLerp(x,y,s) mix(x,y,s)
- #define FxaaTex sampler2D
- #define FxaaTexTop(t, p) textureLod(t, p, 0.0)
- #define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o)
- #if (FXAA_GATHER4_ALPHA == 1)
- // use #extension GL_ARB_gpu_shader5 : enable
- #define FxaaTexAlpha4(t, p, r) textureGather(t, p, 3)
- #define FxaaTexOffAlpha4(t, p, o, r) textureGatherOffset(t, p, o, 3)
- #endif
-#endif
-/*--------------------------------------------------------------------------*/
-#if (FXAA_HLSL_3 == 1) || (FXAA_360 == 1)
- #define int2 float2
- #define FxaaInt2 float2
- #define FxaaFloat2 float2
- #define FxaaFloat3 float3
- #define FxaaFloat4 float4
- #define FxaaDiscard clip(-1)
- #define FxaaDot3(a, b) dot(a, b)
- #define FxaaSat(x) saturate(x)
- #define FxaaLerp(x,y,s) lerp(x,y,s)
- #define FxaaTex sampler2D
- #define FxaaTexTop(t, p) tex2Dlod(t, float4(p, 0.0, 0.0))
- #define FxaaTexOff(t, p, o, r) tex2Dlod(t, float4(p + (o * r), 0, 0))
-#endif
-/*--------------------------------------------------------------------------*/
-#if FXAA_HLSL_4
- #define FxaaInt2 int2
- #define FxaaFloat2 float2
- #define FxaaFloat3 float3
- #define FxaaFloat4 float4
- #define FxaaDiscard clip(-1)
- #define FxaaDot3(a, b) dot(a, b)
- #define FxaaSat(x) saturate(x)
- #define FxaaLerp(x,y,s) lerp(x,y,s)
- struct FxaaTex { SamplerState smpl; Texture2D tex; };
- #define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0)
- #define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o)
-#endif
-/*--------------------------------------------------------------------------*/
-#if FXAA_HLSL_5
- #define FxaaInt2 int2
- #define FxaaFloat2 float2
- #define FxaaFloat3 float3
- #define FxaaFloat4 float4
- #define FxaaDiscard clip(-1)
- #define FxaaDot3(a, b) dot(a, b)
- #define FxaaSat(x) saturate(x)
- #define FxaaLerp(x,y,s) lerp(x,y,s)
- struct FxaaTex { SamplerState smpl; Texture2D tex; };
- #define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0)
- #define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o)
- #define FxaaTexAlpha4(t, p, r) t.tex.GatherAlpha(t.smpl, p)
- #define FxaaTexOffAlpha4(t, p, o, r) t.tex.GatherAlpha(t.smpl, p, o)
-#endif
-
-
-
-/*============================================================================
-
- FXAA3 CONSOLE - 360 PIXEL SHADER
-
-------------------------------------------------------------------------------
-Might be some optimizations left here,
-as of this latest change didn't have a PIX dump to verify if TEX bound.
-============================================================================*/
-#if (FXAA_360 == 1)
-/*--------------------------------------------------------------------------*/
-half4 FxaaPixelShader(
- // {xy} = center of pixel
- float2 pos,
- // {xy__} = upper left of pixel
- // {__zw} = lower right of pixel
- float4 posPos,
- // {rgb_} = color in linear or perceptual color space
- // {___a} = alpha output is junk value
- FxaaTex tex,
- // This must be from a constant/uniform.
- // {xy} = rcpFrame not used on PC version of FXAA Console
- float2 rcpFrame,
- // This must be from a constant/uniform.
- // {x___} = 2.0/screenWidthInPixels
- // {_y__} = 2.0/screenHeightInPixels
- // {__z_} = 0.5/screenWidthInPixels
- // {___w} = 0.5/screenHeightInPixels
- float4 rcpFrameOpt
-) {
-/*--------------------------------------------------------------------------*/
- half4 lumaNwNeSwSe;
- lumaNwNeSwSe.x = FxaaTexTop(tex, posPos.xy).w;
- lumaNwNeSwSe.y = FxaaTexTop(tex, posPos.zy).w;
- lumaNwNeSwSe.z = FxaaTexTop(tex, posPos.xw).w;
- lumaNwNeSwSe.w = FxaaTexTop(tex, posPos.zw).w;
-/*--------------------------------------------------------------------------*/
- half4 rgbyM = FxaaTexTop(tex, pos.xy);
-/*--------------------------------------------------------------------------*/
- lumaNwNeSwSe.y += 1.0/384.0;
-/*--------------------------------------------------------------------------*/
- half2 lumaMinTemp = min(lumaNwNeSwSe.xy, lumaNwNeSwSe.zw);
- half2 lumaMaxTemp = max(lumaNwNeSwSe.xy, lumaNwNeSwSe.zw);
-/*--------------------------------------------------------------------------*/
- half lumaMin = min(lumaMinTemp.x, lumaMinTemp.y);
- half lumaMax = max(lumaMaxTemp.x, lumaMaxTemp.y);
-/*--------------------------------------------------------------------------*/
- half lumaMinM = min(lumaMin, rgbyM.w);
- half lumaMaxM = max(lumaMax, rgbyM.w);
- if((lumaMaxM - lumaMinM) < max(FXAA_CONSOLE__EDGE_THRESHOLD_MIN, lumaMax * FXAA_CONSOLE__EDGE_THRESHOLD)) return rgbyM;
-/*--------------------------------------------------------------------------*/
- half2 dir;
- dir.x = dot(lumaNwNeSwSe, float4(-1.0, -1.0, 1.0, 1.0));
- dir.y = dot(lumaNwNeSwSe, float4( 1.0, -1.0, 1.0,-1.0));
-/*--------------------------------------------------------------------------*/
- half2 dir1;
- dir1 = normalize(dir.xy);
-/*--------------------------------------------------------------------------*/
- half dirAbsMinTimesC = min(abs(dir1.x), abs(dir1.y)) * FXAA_CONSOLE__EDGE_SHARPNESS;
- half2 dir2;
- dir2 = clamp(dir1.xy / dirAbsMinTimesC, -2.0, 2.0);
-/*--------------------------------------------------------------------------*/
- half4 rgbyN1 = FxaaTexTop(tex, pos.xy - dir1 * rcpFrameOpt.zw);
- half4 rgbyP1 = FxaaTexTop(tex, pos.xy + dir1 * rcpFrameOpt.zw);
- half4 rgbyN2 = FxaaTexTop(tex, pos.xy - dir2 * rcpFrameOpt.xy);
- half4 rgbyP2 = FxaaTexTop(tex, pos.xy + dir2 * rcpFrameOpt.xy);
-/*--------------------------------------------------------------------------*/
- half4 rgbyA = rgbyN1 * 0.5 + rgbyP1 * 0.5;
- half4 rgbyB = rgbyN2 * 0.25 + rgbyP2 * 0.25 + rgbyA * 0.5;
-/*--------------------------------------------------------------------------*/
- bool twoTap = (rgbyB.w < lumaMin) || (rgbyB.w > lumaMax);
- if(twoTap) rgbyB.xyz = rgbyA.xyz;
- return rgbyB; }
-/*==========================================================================*/
-#endif
-
-
-
-/*============================================================================
-
- FXAA3 CONSOLE - 360 PIXEL SHADER OPTIMIZED PROTOTYPE
-
-------------------------------------------------------------------------------
-This prototype optimized version thanks to suggestions from Andy Luedke.
-Should be fully tex bound in all cases.
-As of the FXAA 3.10 release I have not tested this code,
-but at least the missing ";" was fixed.
-If it does not work, please let me know so I can fix it.
-------------------------------------------------------------------------------
-Extra requirements,
-(1.) Different inputs: no posPos.
-(2.) Different inputs: alias three samplers with different exp bias settings!
-(3.) New constants: setup fxaaConst as described below.
-============================================================================*/
-#if (FXAA_360_OPT == 1)
-/*--------------------------------------------------------------------------*/
-[reduceTempRegUsage(4)]
-float4 FxaaPixelShader(
- // {xy} = center of pixel
- float2 pos,
- // Three samplers,
- // texExpBias0 = exponent bias 0
- // texExpBiasNeg1 = exponent bias -1
- // texExpBiasNeg2 = exponent bias -2
- // {rgb_} = color in linear or perceptual color space
- // {___a} = alpha output is junk value
- uniform sampler2D texExpBias0,
- uniform sampler2D texExpBiasNeg1,
- uniform sampler2D texExpBiasNeg2,
- // These must be in physical constant registers and NOT immedates
- // Immedates will result in compiler un-optimizing
- // width = screen width in pixels
- // height = screen height in pixels
- fxaaConstDir, // float4(1.0, -1.0, 0.25, -0.25);
- fxaaConstInner, // float4(0.5/width, 0.5/height, -0.5/width, -0.5/height);
- fxaaConstOuter // float4(8.0/width, 8.0/height, -4.0/width, -4.0/height);
-) {
-/*--------------------------------------------------------------------------*/
- float4 lumaNwNeSwSe;
- asm {
- tfetch2D lumaNwNeSwSe.w___, texExpBias0, pos.xy, OffsetX = -0.5, OffsetY = -0.5, UseComputedLOD=false
- tfetch2D lumaNwNeSwSe._w__, texExpBias0, pos.xy, OffsetX = 0.5, OffsetY = -0.5, UseComputedLOD=false
- tfetch2D lumaNwNeSwSe.__w_, texExpBias0, pos.xy, OffsetX = -0.5, OffsetY = 0.5, UseComputedLOD=false
- tfetch2D lumaNwNeSwSe.___w, texExpBias0, pos.xy, OffsetX = 0.5, OffsetY = 0.5, UseComputedLOD=false
- };
-/*--------------------------------------------------------------------------*/
- lumaNwNeSwSe.y += 1.0/384.0;
- float2 lumaMinTemp = min(lumaNwNeSwSe.xy, lumaNwNeSwSe.zw);
- float2 lumaMaxTemp = max(lumaNwNeSwSe.xy, lumaNwNeSwSe.zw);
- float lumaMin = min(lumaMinTemp.x, lumaMinTemp.y);
- float lumaMax = max(lumaMaxTemp.x, lumaMaxTemp.y);
-/*--------------------------------------------------------------------------*/
- float4 rgbyM = tex2Dlod(texExpBias0, float4(pos.xy, 0.0, 0.0));
- float4 lumaMinM = min(lumaMin, rgbyM.w);
- float4 lumaMaxM = max(lumaMax, rgbyM.w);
- if((lumaMaxM - lumaMinM) < max(FXAA_CONSOLE__EDGE_THRESHOLD_MIN, lumaMax * FXAA_CONSOLE__EDGE_THRESHOLD)) return rgbyM;
-/*--------------------------------------------------------------------------*/
- float2 dir;
- dir.x = dot(lumaNwNeSwSe, fxaaConstDir.yyxx);
- dir.y = dot(lumaNwNeSwSe, fxaaConstDir.xyxy);
- dir = normalize(dir);
-/*--------------------------------------------------------------------------*/
- float4 dir1 = dir.xyxy * fxaaConstInner.xyzw;
-/*--------------------------------------------------------------------------*/
- float4 dir2;
- float dirAbsMinTimesC = min(abs(dir.x), abs(dir.y));
- dir2 = saturate(fxaaConstOuter.zzww * dir.xyxy / FXAA_CONSOLE__EDGE_SHARPNESS / dirAbsMinTimesC + 0.5);
- dir2 = dir2 * fxaaConstOuter.xyxy + fxaaConstOuter.zwzw;
-/*--------------------------------------------------------------------------*/
- float4 rgbyN1 = tex2Dlod(texExpBiasNeg1, float4(pos.xy + dir1.xy, 0.0, 0.0));
- float4 rgbyP1 = tex2Dlod(texExpBiasNeg1, float4(pos.xy + dir1.zw, 0.0, 0.0));
- float4 rgbyN2 = tex2Dlod(texExpBiasNeg2, float4(pos.xy + dir2.xy, 0.0, 0.0));
- float4 rgbyP2 = tex2Dlod(texExpBiasNeg2, float4(pos.xy + dir2.zw, 0.0, 0.0));
-/*--------------------------------------------------------------------------*/
- half4 rgbyA = rgbyN1 + rgbyP1;
- half4 rgbyB = rgbyN2 + rgbyP2 * 0.5 + rgbyA;
-/*--------------------------------------------------------------------------*/
- float4 rgbyR = ((rgbyB.w - lumaMax) > 0.0) ? rgbyA : rgbyB;
- rgbyR = ((rgbyB.w - lumaMin) > 0.0) ? rgbyR : rgbyA;
- return rgbyR; }
-/*==========================================================================*/
-#endif
-
-
-
-
-/*============================================================================
-
- FXAA3 CONSOLE - OPTIMIZED PS3 PIXEL SHADER (NO EARLY EXIT)
-
-==============================================================================
-The code below does not exactly match the assembly.
-I have a feeling that 12 cycles is possible, but was not able to get there.
-Might have to increase register count to get full performance.
-Note this shader does not use perspective interpolation.
-
-Use the following cgc options,
-
- --fenable-bx2 --fastmath --fastprecision --nofloatbindings
-
-------------------------------------------------------------------------------
- NVSHADERPERF OUTPUT
-------------------------------------------------------------------------------
-For reference and to aid in debug, output of NVShaderPerf should match this,
-
-Shader to schedule:
- 0: texpkb h0.w(TRUE), v5.zyxx, #0
- 2: addh h2.z(TRUE), h0.w, constant(0.001953, 0.000000, 0.000000, 0.000000).x
- 4: texpkb h0.w(TRUE), v5.xwxx, #0
- 6: addh h0.z(TRUE), -h2, h0.w
- 7: texpkb h1.w(TRUE), v5, #0
- 9: addh h0.x(TRUE), h0.z, -h1.w
- 10: addh h3.w(TRUE), h0.z, h1
- 11: texpkb h2.w(TRUE), v5.zwzz, #0
- 13: addh h0.z(TRUE), h3.w, -h2.w
- 14: addh h0.x(TRUE), h2.w, h0
- 15: nrmh h1.xz(TRUE), h0_n
- 16: minh_m8 h0.x(TRUE), |h1|, |h1.z|
- 17: maxh h4.w(TRUE), h0, h1
- 18: divx h2.xy(TRUE), h1_n.xzzw, h0_n
- 19: movr r1.zw(TRUE), v4.xxxy
- 20: madr r2.xz(TRUE), -h1, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).zzww, r1.zzww
- 22: minh h5.w(TRUE), h0, h1
- 23: texpkb h0(TRUE), r2.xzxx, #0
- 25: madr r0.zw(TRUE), h1.xzxz, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w), r1
- 27: maxh h4.x(TRUE), h2.z, h2.w
- 28: texpkb h1(TRUE), r0.zwzz, #0
- 30: addh_d2 h1(TRUE), h0, h1
- 31: madr r0.xy(TRUE), -h2, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz
- 33: texpkb h0(TRUE), r0, #0
- 35: minh h4.z(TRUE), h2, h2.w
- 36: fenct TRUE
- 37: madr r1.xy(TRUE), h2, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz
- 39: texpkb h2(TRUE), r1, #0
- 41: addh_d2 h0(TRUE), h0, h2
- 42: maxh h2.w(TRUE), h4, h4.x
- 43: minh h2.x(TRUE), h5.w, h4.z
- 44: addh_d2 h0(TRUE), h0, h1
- 45: slth h2.x(TRUE), h0.w, h2
- 46: sgth h2.w(TRUE), h0, h2
- 47: movh h0(TRUE), h0
- 48: addx.c0 rc(TRUE), h2, h2.w
- 49: movh h0(c0.NE.x), h1
-
-IPU0 ------ Simplified schedule: --------
-Pass | Unit | uOp | PC: Op
------+--------+------+-------------------------
- 1 | SCT0/1 | mov | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;
- | TEX | txl | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;
- | SCB1 | add | 2: ADDh h2.z, h0.--w-, const.--x-;
- | | |
- 2 | SCT0/1 | mov | 4: TXLr h0.w, g[TEX1].xwxx, const.xxxx, TEX0;
- | TEX | txl | 4: TXLr h0.w, g[TEX1].xwxx, const.xxxx, TEX0;
- | SCB1 | add | 6: ADDh h0.z,-h2, h0.--w-;
- | | |
- 3 | SCT0/1 | mov | 7: TXLr h1.w, g[TEX1], const.xxxx, TEX0;
- | TEX | txl | 7: TXLr h1.w, g[TEX1], const.xxxx, TEX0;
- | SCB0 | add | 9: ADDh h0.x, h0.z---,-h1.w---;
- | SCB1 | add | 10: ADDh h3.w, h0.---z, h1;
- | | |
- 4 | SCT0/1 | mov | 11: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;
- | TEX | txl | 11: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;
- | SCB0 | add | 14: ADDh h0.x, h2.w---, h0;
- | SCB1 | add | 13: ADDh h0.z, h3.--w-,-h2.--w-;
- | | |
- 5 | SCT1 | mov | 15: NRMh h1.xz, h0;
- | SRB | nrm | 15: NRMh h1.xz, h0;
- | SCB0 | min | 16: MINh*8 h0.x, |h1|, |h1.z---|;
- | SCB1 | max | 17: MAXh h4.w, h0, h1;
- | | |
- 6 | SCT0 | div | 18: DIVx h2.xy, h1.xz--, h0;
- | SCT1 | mov | 19: MOVr r1.zw, g[TEX0].--xy;
- | SCB0 | mad | 20: MADr r2.xz,-h1, const.z-w-, r1.z-w-;
- | SCB1 | min | 22: MINh h5.w, h0, h1;
- | | |
- 7 | SCT0/1 | mov | 23: TXLr h0, r2.xzxx, const.xxxx, TEX0;
- | TEX | txl | 23: TXLr h0, r2.xzxx, const.xxxx, TEX0;
- | SCB0 | max | 27: MAXh h4.x, h2.z---, h2.w---;
- | SCB1 | mad | 25: MADr r0.zw, h1.--xz, const, r1;
- | | |
- 8 | SCT0/1 | mov | 28: TXLr h1, r0.zwzz, const.xxxx, TEX0;
- | TEX | txl | 28: TXLr h1, r0.zwzz, const.xxxx, TEX0;
- | SCB0/1 | add | 30: ADDh/2 h1, h0, h1;
- | | |
- 9 | SCT0 | mad | 31: MADr r0.xy,-h2, const.xy--, r1.zw--;
- | SCT1 | mov | 33: TXLr h0, r0, const.zzzz, TEX0;
- | TEX | txl | 33: TXLr h0, r0, const.zzzz, TEX0;
- | SCB1 | min | 35: MINh h4.z, h2, h2.--w-;
- | | |
- 10 | SCT0 | mad | 37: MADr r1.xy, h2, const.xy--, r1.zw--;
- | SCT1 | mov | 39: TXLr h2, r1, const.zzzz, TEX0;
- | TEX | txl | 39: TXLr h2, r1, const.zzzz, TEX0;
- | SCB0/1 | add | 41: ADDh/2 h0, h0, h2;
- | | |
- 11 | SCT0 | min | 43: MINh h2.x, h5.w---, h4.z---;
- | SCT1 | max | 42: MAXh h2.w, h4, h4.---x;
- | SCB0/1 | add | 44: ADDh/2 h0, h0, h1;
- | | |
- 12 | SCT0 | set | 45: SLTh h2.x, h0.w---, h2;
- | SCT1 | set | 46: SGTh h2.w, h0, h2;
- | SCB0/1 | mul | 47: MOVh h0, h0;
- | | |
- 13 | SCT0 | mad | 48: ADDxc0_s rc, h2, h2.w---;
- | SCB0/1 | mul | 49: MOVh h0(NE0.xxxx), h1;
-
-Pass SCT TEX SCB
- 1: 0% 100% 25%
- 2: 0% 100% 25%
- 3: 0% 100% 50%
- 4: 0% 100% 50%
- 5: 0% 0% 50%
- 6: 100% 0% 75%
- 7: 0% 100% 75%
- 8: 0% 100% 100%
- 9: 0% 100% 25%
- 10: 0% 100% 100%
- 11: 50% 0% 100%
- 12: 50% 0% 100%
- 13: 25% 0% 100%
-
-MEAN: 17% 61% 67%
-
-Pass SCT0 SCT1 TEX SCB0 SCB1
- 1: 0% 0% 100% 0% 100%
- 2: 0% 0% 100% 0% 100%
- 3: 0% 0% 100% 100% 100%
- 4: 0% 0% 100% 100% 100%
- 5: 0% 0% 0% 100% 100%
- 6: 100% 100% 0% 100% 100%
- 7: 0% 0% 100% 100% 100%
- 8: 0% 0% 100% 100% 100%
- 9: 0% 0% 100% 0% 100%
- 10: 0% 0% 100% 100% 100%
- 11: 100% 100% 0% 100% 100%
- 12: 100% 100% 0% 100% 100%
- 13: 100% 0% 0% 100% 100%
-
-MEAN: 30% 23% 61% 76% 100%
-Fragment Performance Setup: Driver RSX Compiler, GPU RSX, Flags 0x5
-Results 13 cycles, 3 r regs, 923,076,923 pixels/s
-============================================================================*/
-#if (FXAA_PS3 == 1) && (FXAA_EARLY_EXIT == 0)
-/*--------------------------------------------------------------------------*/
-#pragma disablepc all
-#pragma option O3
-#pragma option OutColorPrec=fp16
-#pragma texformat default RGBA8
-/*==========================================================================*/
-half4 FxaaPixelShader(
- // {xy} = center of pixel
- float2 pos,
- // {xy__} = upper left of pixel
- // {__zw} = lower right of pixel
- float4 posPos,
- // {rgb_} = color in linear or perceptual color space
- // {___a} = luma in perceptual color space (not linear)
- sampler2D tex,
- // This must be from a constant/uniform.
- // {xy} = rcpFrame not used on PS3
- float2 rcpFrame,
- // This must be from a constant/uniform.
- // {x___} = 2.0/screenWidthInPixels
- // {_y__} = 2.0/screenHeightInPixels
- // {__z_} = 0.5/screenWidthInPixels
- // {___w} = 0.5/screenHeightInPixels
- float4 rcpFrameOpt
-) {
-/*--------------------------------------------------------------------------*/
-// (1)
- half4 dir;
- half4 lumaNe = h4tex2Dlod(tex, half4(posPos.zy, 0, 0));
- lumaNe.w += half(1.0/512.0);
- dir.x = -lumaNe.w;
- dir.z = -lumaNe.w;
-/*--------------------------------------------------------------------------*/
-// (2)
- half4 lumaSw = h4tex2Dlod(tex, half4(posPos.xw, 0, 0));
- dir.x += lumaSw.w;
- dir.z += lumaSw.w;
-/*--------------------------------------------------------------------------*/
-// (3)
- half4 lumaNw = h4tex2Dlod(tex, half4(posPos.xy, 0, 0));
- dir.x -= lumaNw.w;
- dir.z += lumaNw.w;
-/*--------------------------------------------------------------------------*/
-// (4)
- half4 lumaSe = h4tex2Dlod(tex, half4(posPos.zw, 0, 0));
- dir.x += lumaSe.w;
- dir.z -= lumaSe.w;
-/*--------------------------------------------------------------------------*/
-// (5)
- half4 dir1_pos;
- dir1_pos.xy = normalize(dir.xyz).xz;
- half dirAbsMinTimesC = min(abs(dir1_pos.x), abs(dir1_pos.y)) * half(FXAA_CONSOLE__EDGE_SHARPNESS);
-/*--------------------------------------------------------------------------*/
-// (6)
- half4 dir2_pos;
- dir2_pos.xy = clamp(dir1_pos.xy / dirAbsMinTimesC, half(-2.0), half(2.0));
- dir1_pos.zw = pos.xy;
- dir2_pos.zw = pos.xy;
- half4 temp1N;
- temp1N.xy = dir1_pos.zw - dir1_pos.xy * rcpFrameOpt.zw;
-/*--------------------------------------------------------------------------*/
-// (7)
- temp1N = h4tex2Dlod(tex, half4(temp1N.xy, 0.0, 0.0));
- half4 rgby1;
- rgby1.xy = dir1_pos.zw + dir1_pos.xy * rcpFrameOpt.zw;
-/*--------------------------------------------------------------------------*/
-// (8)
- rgby1 = h4tex2Dlod(tex, half4(rgby1.xy, 0.0, 0.0));
- rgby1 = (temp1N + rgby1) * 0.5;
-/*--------------------------------------------------------------------------*/
-// (9)
- half4 temp2N;
- temp2N.xy = dir2_pos.zw - dir2_pos.xy * rcpFrameOpt.xy;
- temp2N = h4tex2Dlod(tex, half4(temp2N.xy, 0.0, 0.0));
-/*--------------------------------------------------------------------------*/
-// (10)
- half4 rgby2;
- rgby2.xy = dir2_pos.zw + dir2_pos.xy * rcpFrameOpt.xy;
- rgby2 = h4tex2Dlod(tex, half4(rgby2.xy, 0.0, 0.0));
- rgby2 = (temp2N + rgby2) * 0.5;
-/*--------------------------------------------------------------------------*/
-// (11)
- // compilier moves these scalar ops up to other cycles
- half lumaMin = min(min(lumaNw.w, lumaSw.w), min(lumaNe.w, lumaSe.w));
- half lumaMax = max(max(lumaNw.w, lumaSw.w), max(lumaNe.w, lumaSe.w));
- rgby2 = (rgby2 + rgby1) * 0.5;
-/*--------------------------------------------------------------------------*/
-// (12)
- bool twoTapLt = rgby2.w < lumaMin;
- bool twoTapGt = rgby2.w > lumaMax;
-/*--------------------------------------------------------------------------*/
-// (13)
- if(twoTapLt || twoTapGt) rgby2 = rgby1;
-/*--------------------------------------------------------------------------*/
- return rgby2; }
-/*==========================================================================*/
-#endif
-
-
-
-/*============================================================================
-
- FXAA3 CONSOLE - OPTIMIZED PS3 PIXEL SHADER (WITH EARLY EXIT)
-
-==============================================================================
-The code mostly matches the assembly.
-I have a feeling that 14 cycles is possible, but was not able to get there.
-Might have to increase register count to get full performance.
-Note this shader does not use perspective interpolation.
-
-Use the following cgc options,
-
- --fenable-bx2 --fastmath --fastprecision --nofloatbindings
-
-------------------------------------------------------------------------------
- NVSHADERPERF OUTPUT
-------------------------------------------------------------------------------
-For reference and to aid in debug, output of NVShaderPerf should match this,
-
-Shader to schedule:
- 0: texpkb h0.w(TRUE), v5.zyxx, #0
- 2: addh h2.y(TRUE), h0.w, constant(0.001953, 0.000000, 0.000000, 0.000000).x
- 4: texpkb h1.w(TRUE), v5.xwxx, #0
- 6: addh h0.x(TRUE), h1.w, -h2.y
- 7: texpkb h2.w(TRUE), v5.zwzz, #0
- 9: minh h4.w(TRUE), h2.y, h2
- 10: maxh h5.x(TRUE), h2.y, h2.w
- 11: texpkb h0.w(TRUE), v5, #0
- 13: addh h3.w(TRUE), -h0, h0.x
- 14: addh h0.x(TRUE), h0.w, h0
- 15: addh h0.z(TRUE), -h2.w, h0.x
- 16: addh h0.x(TRUE), h2.w, h3.w
- 17: minh h5.y(TRUE), h0.w, h1.w
- 18: nrmh h2.xz(TRUE), h0_n
- 19: minh_m8 h2.w(TRUE), |h2.x|, |h2.z|
- 20: divx h4.xy(TRUE), h2_n.xzzw, h2_n.w
- 21: movr r1.zw(TRUE), v4.xxxy
- 22: maxh h2.w(TRUE), h0, h1
- 23: fenct TRUE
- 24: madr r0.xy(TRUE), -h2.xzzw, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).zwzz, r1.zwzz
- 26: texpkb h0(TRUE), r0, #0
- 28: maxh h5.x(TRUE), h2.w, h5
- 29: minh h5.w(TRUE), h5.y, h4
- 30: madr r1.xy(TRUE), h2.xzzw, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).zwzz, r1.zwzz
- 32: texpkb h2(TRUE), r1, #0
- 34: addh_d2 h2(TRUE), h0, h2
- 35: texpkb h1(TRUE), v4, #0
- 37: maxh h5.y(TRUE), h5.x, h1.w
- 38: minh h4.w(TRUE), h1, h5
- 39: madr r0.xy(TRUE), -h4, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz
- 41: texpkb h0(TRUE), r0, #0
- 43: addh_m8 h5.z(TRUE), h5.y, -h4.w
- 44: madr r2.xy(TRUE), h4, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz
- 46: texpkb h3(TRUE), r2, #0
- 48: addh_d2 h0(TRUE), h0, h3
- 49: addh_d2 h3(TRUE), h0, h2
- 50: movh h0(TRUE), h3
- 51: slth h3.x(TRUE), h3.w, h5.w
- 52: sgth h3.w(TRUE), h3, h5.x
- 53: addx.c0 rc(TRUE), h3.x, h3
- 54: slth.c0 rc(TRUE), h5.z, h5
- 55: movh h0(c0.NE.w), h2
- 56: movh h0(c0.NE.x), h1
-
-IPU0 ------ Simplified schedule: --------
-Pass | Unit | uOp | PC: Op
------+--------+------+-------------------------
- 1 | SCT0/1 | mov | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;
- | TEX | txl | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;
- | SCB0 | add | 2: ADDh h2.y, h0.-w--, const.-x--;
- | | |
- 2 | SCT0/1 | mov | 4: TXLr h1.w, g[TEX1].xwxx, const.xxxx, TEX0;
- | TEX | txl | 4: TXLr h1.w, g[TEX1].xwxx, const.xxxx, TEX0;
- | SCB0 | add | 6: ADDh h0.x, h1.w---,-h2.y---;
- | | |
- 3 | SCT0/1 | mov | 7: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;
- | TEX | txl | 7: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;
- | SCB0 | max | 10: MAXh h5.x, h2.y---, h2.w---;
- | SCB1 | min | 9: MINh h4.w, h2.---y, h2;
- | | |
- 4 | SCT0/1 | mov | 11: TXLr h0.w, g[TEX1], const.xxxx, TEX0;
- | TEX | txl | 11: TXLr h0.w, g[TEX1], const.xxxx, TEX0;
- | SCB0 | add | 14: ADDh h0.x, h0.w---, h0;
- | SCB1 | add | 13: ADDh h3.w,-h0, h0.---x;
- | | |
- 5 | SCT0 | mad | 16: ADDh h0.x, h2.w---, h3.w---;
- | SCT1 | mad | 15: ADDh h0.z,-h2.--w-, h0.--x-;
- | SCB0 | min | 17: MINh h5.y, h0.-w--, h1.-w--;
- | | |
- 6 | SCT1 | mov | 18: NRMh h2.xz, h0;
- | SRB | nrm | 18: NRMh h2.xz, h0;
- | SCB1 | min | 19: MINh*8 h2.w, |h2.---x|, |h2.---z|;
- | | |
- 7 | SCT0 | div | 20: DIVx h4.xy, h2.xz--, h2.ww--;
- | SCT1 | mov | 21: MOVr r1.zw, g[TEX0].--xy;
- | SCB1 | max | 22: MAXh h2.w, h0, h1;
- | | |
- 8 | SCT0 | mad | 24: MADr r0.xy,-h2.xz--, const.zw--, r1.zw--;
- | SCT1 | mov | 26: TXLr h0, r0, const.xxxx, TEX0;
- | TEX | txl | 26: TXLr h0, r0, const.xxxx, TEX0;
- | SCB0 | max | 28: MAXh h5.x, h2.w---, h5;
- | SCB1 | min | 29: MINh h5.w, h5.---y, h4;
- | | |
- 9 | SCT0 | mad | 30: MADr r1.xy, h2.xz--, const.zw--, r1.zw--;
- | SCT1 | mov | 32: TXLr h2, r1, const.xxxx, TEX0;
- | TEX | txl | 32: TXLr h2, r1, const.xxxx, TEX0;
- | SCB0/1 | add | 34: ADDh/2 h2, h0, h2;
- | | |
- 10 | SCT0/1 | mov | 35: TXLr h1, g[TEX0], const.xxxx, TEX0;
- | TEX | txl | 35: TXLr h1, g[TEX0], const.xxxx, TEX0;
- | SCB0 | max | 37: MAXh h5.y, h5.-x--, h1.-w--;
- | SCB1 | min | 38: MINh h4.w, h1, h5;
- | | |
- 11 | SCT0 | mad | 39: MADr r0.xy,-h4, const.xy--, r1.zw--;
- | SCT1 | mov | 41: TXLr h0, r0, const.zzzz, TEX0;
- | TEX | txl | 41: TXLr h0, r0, const.zzzz, TEX0;
- | SCB0 | mad | 44: MADr r2.xy, h4, const.xy--, r1.zw--;
- | SCB1 | add | 43: ADDh*8 h5.z, h5.--y-,-h4.--w-;
- | | |
- 12 | SCT0/1 | mov | 46: TXLr h3, r2, const.xxxx, TEX0;
- | TEX | txl | 46: TXLr h3, r2, const.xxxx, TEX0;
- | SCB0/1 | add | 48: ADDh/2 h0, h0, h3;
- | | |
- 13 | SCT0/1 | mad | 49: ADDh/2 h3, h0, h2;
- | SCB0/1 | mul | 50: MOVh h0, h3;
- | | |
- 14 | SCT0 | set | 51: SLTh h3.x, h3.w---, h5.w---;
- | SCT1 | set | 52: SGTh h3.w, h3, h5.---x;
- | SCB0 | set | 54: SLThc0 rc, h5.z---, h5;
- | SCB1 | add | 53: ADDxc0_s rc, h3.---x, h3;
- | | |
- 15 | SCT0/1 | mul | 55: MOVh h0(NE0.wwww), h2;
- | SCB0/1 | mul | 56: MOVh h0(NE0.xxxx), h1;
-
-Pass SCT TEX SCB
- 1: 0% 100% 25%
- 2: 0% 100% 25%
- 3: 0% 100% 50%
- 4: 0% 100% 50%
- 5: 50% 0% 25%
- 6: 0% 0% 25%
- 7: 100% 0% 25%
- 8: 0% 100% 50%
- 9: 0% 100% 100%
- 10: 0% 100% 50%
- 11: 0% 100% 75%
- 12: 0% 100% 100%
- 13: 100% 0% 100%
- 14: 50% 0% 50%
- 15: 100% 0% 100%
-
-MEAN: 26% 60% 56%
-
-Pass SCT0 SCT1 TEX SCB0 SCB1
- 1: 0% 0% 100% 100% 0%
- 2: 0% 0% 100% 100% 0%
- 3: 0% 0% 100% 100% 100%
- 4: 0% 0% 100% 100% 100%
- 5: 100% 100% 0% 100% 0%
- 6: 0% 0% 0% 0% 100%
- 7: 100% 100% 0% 0% 100%
- 8: 0% 0% 100% 100% 100%
- 9: 0% 0% 100% 100% 100%
- 10: 0% 0% 100% 100% 100%
- 11: 0% 0% 100% 100% 100%
- 12: 0% 0% 100% 100% 100%
- 13: 100% 100% 0% 100% 100%
- 14: 100% 100% 0% 100% 100%
- 15: 100% 100% 0% 100% 100%
-
-MEAN: 33% 33% 60% 86% 80%
-Fragment Performance Setup: Driver RSX Compiler, GPU RSX, Flags 0x5
-Results 15 cycles, 3 r regs, 800,000,000 pixels/s
-============================================================================*/
-#if (FXAA_PS3 == 1) && (FXAA_EARLY_EXIT == 1)
-/*--------------------------------------------------------------------------*/
-#pragma disablepc all
-#pragma option O2
-#pragma option OutColorPrec=fp16
-#pragma texformat default RGBA8
-/*==========================================================================*/
-half4 FxaaPixelShader(
- // {xy} = center of pixel
- float2 pos,
- // {xy__} = upper left of pixel
- // {__zw} = lower right of pixel
- float4 posPos,
- // {rgb_} = color in linear or perceptual color space
- // {___a} = luma in perceptual color space (not linear)
- sampler2D tex,
- // This must be from a constant/uniform.
- // {xy} = rcpFrame not used on PS3
- float2 rcpFrame,
- // This must be from a constant/uniform.
- // {x___} = 2.0/screenWidthInPixels
- // {_y__} = 2.0/screenHeightInPixels
- // {__z_} = 0.5/screenWidthInPixels
- // {___w} = 0.5/screenHeightInPixels
- float4 rcpFrameOpt
-) {
-/*--------------------------------------------------------------------------*/
-// (1)
- half4 rgbyNe = h4tex2Dlod(tex, half4(posPos.zy, 0, 0));
- half lumaNe = rgbyNe.w + half(1.0/512.0);
-/*--------------------------------------------------------------------------*/
-// (2)
- half4 lumaSw = h4tex2Dlod(tex, half4(posPos.xw, 0, 0));
- half lumaSwNegNe = lumaSw.w - lumaNe;
-/*--------------------------------------------------------------------------*/
-// (3)
- half4 lumaNw = h4tex2Dlod(tex, half4(posPos.xy, 0, 0));
- half lumaMaxNwSw = max(lumaNw.w, lumaSw.w);
- half lumaMinNwSw = min(lumaNw.w, lumaSw.w);
-/*--------------------------------------------------------------------------*/
-// (4)
- half4 lumaSe = h4tex2Dlod(tex, half4(posPos.zw, 0, 0));
- half dirZ = lumaNw.w + lumaSwNegNe;
- half dirX = -lumaNw.w + lumaSwNegNe;
-/*--------------------------------------------------------------------------*/
-// (5)
- half3 dir;
- dir.y = 0.0;
- dir.x = lumaSe.w + dirX;
- dir.z = -lumaSe.w + dirZ;
- half lumaMinNeSe = min(lumaNe, lumaSe.w);
-/*--------------------------------------------------------------------------*/
-// (6)
- half4 dir1_pos;
- dir1_pos.xy = normalize(dir).xz;
- half dirAbsMinTimes8 = min(abs(dir1_pos.x), abs(dir1_pos.y)) * half(FXAA_CONSOLE__EDGE_SHARPNESS);
-/*--------------------------------------------------------------------------*/
-// (7)
- half4 dir2_pos;
- dir2_pos.xy = clamp(dir1_pos.xy / dirAbsMinTimes8, half(-2.0), half(2.0));
- dir1_pos.zw = pos.xy;
- dir2_pos.zw = pos.xy;
- half lumaMaxNeSe = max(lumaNe, lumaSe.w);
-/*--------------------------------------------------------------------------*/
-// (8)
- half4 temp1N;
- temp1N.xy = dir1_pos.zw - dir1_pos.xy * rcpFrameOpt.zw;
- temp1N = h4tex2Dlod(tex, half4(temp1N.xy, 0.0, 0.0));
- half lumaMax = max(lumaMaxNwSw, lumaMaxNeSe);
- half lumaMin = min(lumaMinNwSw, lumaMinNeSe);
-/*--------------------------------------------------------------------------*/
-// (9)
- half4 rgby1;
- rgby1.xy = dir1_pos.zw + dir1_pos.xy * rcpFrameOpt.zw;
- rgby1 = h4tex2Dlod(tex, half4(rgby1.xy, 0.0, 0.0));
- rgby1 = (temp1N + rgby1) * 0.5;
-/*--------------------------------------------------------------------------*/
-// (10)
- half4 rgbyM = h4tex2Dlod(tex, half4(pos.xy, 0.0, 0.0));
- half lumaMaxM = max(lumaMax, rgbyM.w);
- half lumaMinM = min(lumaMin, rgbyM.w);
-/*--------------------------------------------------------------------------*/
-// (11)
- half4 temp2N;
- temp2N.xy = dir2_pos.zw - dir2_pos.xy * rcpFrameOpt.xy;
- temp2N = h4tex2Dlod(tex, half4(temp2N.xy, 0.0, 0.0));
- half4 rgby2;
- rgby2.xy = dir2_pos.zw + dir2_pos.xy * rcpFrameOpt.xy;
- half lumaRangeM = (lumaMaxM - lumaMinM) / FXAA_CONSOLE__EDGE_THRESHOLD;
-/*--------------------------------------------------------------------------*/
-// (12)
- rgby2 = h4tex2Dlod(tex, half4(rgby2.xy, 0.0, 0.0));
- rgby2 = (temp2N + rgby2) * 0.5;
-/*--------------------------------------------------------------------------*/
-// (13)
- rgby2 = (rgby2 + rgby1) * 0.5;
-/*--------------------------------------------------------------------------*/
-// (14)
- bool twoTapLt = rgby2.w < lumaMin;
- bool twoTapGt = rgby2.w > lumaMax;
- bool earlyExit = lumaRangeM < lumaMax;
- bool twoTap = twoTapLt || twoTapGt;
-/*--------------------------------------------------------------------------*/
-// (15)
- if(twoTap) rgby2 = rgby1;
- if(earlyExit) rgby2 = rgbyM;
-/*--------------------------------------------------------------------------*/
- return rgby2; }
-/*==========================================================================*/
-#endif
-
-
-
-/*============================================================================
-
- FXAA3 CONSOLE - PC PIXEL SHADER
-
-------------------------------------------------------------------------------
-Using a modified version of the PS3 version here to best target old hardware.
-============================================================================*/
-#if (FXAA_PC_CONSOLE == 1)
-/*--------------------------------------------------------------------------*/
-half4 FxaaPixelShader(
- // {xy} = center of pixel
- float2 pos,
- // {xy__} = upper left of pixel
- // {__zw} = lower right of pixel
- float4 posPos,
- // {rgb_} = color in linear or perceptual color space
- // {___a} = alpha output is junk value
- FxaaTex tex,
- // This must be from a constant/uniform.
- // {xy} = rcpFrame not used on PC version of FXAA Console
- float2 rcpFrame,
- // This must be from a constant/uniform.
- // {x___} = 2.0/screenWidthInPixels
- // {_y__} = 2.0/screenHeightInPixels
- // {__z_} = 0.5/screenWidthInPixels
- // {___w} = 0.5/screenHeightInPixels
- float4 rcpFrameOpt
-) {
-/*--------------------------------------------------------------------------*/
- half4 dir;
- dir.y = 0.0;
- half4 lumaNe = FxaaTexTop(tex, posPos.zy);
- lumaNe.w += half(1.0/384.0);
- dir.x = -lumaNe.w;
- dir.z = -lumaNe.w;
-/*--------------------------------------------------------------------------*/
- half4 lumaSw = FxaaTexTop(tex, posPos.xw);
- dir.x += lumaSw.w;
- dir.z += lumaSw.w;
-/*--------------------------------------------------------------------------*/
- half4 lumaNw = FxaaTexTop(tex, posPos.xy);
- dir.x -= lumaNw.w;
- dir.z += lumaNw.w;
-/*--------------------------------------------------------------------------*/
- half4 lumaSe = FxaaTexTop(tex, posPos.zw);
- dir.x += lumaSe.w;
- dir.z -= lumaSe.w;
-/*==========================================================================*/
- #if (FXAA_EARLY_EXIT == 1)
- half4 rgbyM = FxaaTexTop(tex, pos.xy);
-/*--------------------------------------------------------------------------*/
- half lumaMin = min(min(lumaNw.w, lumaSw.w), min(lumaNe.w, lumaSe.w));
- half lumaMax = max(max(lumaNw.w, lumaSw.w), max(lumaNe.w, lumaSe.w));
-/*--------------------------------------------------------------------------*/
- half lumaMinM = min(lumaMin, rgbyM.w);
- half lumaMaxM = max(lumaMax, rgbyM.w);
-/*--------------------------------------------------------------------------*/
- if((lumaMaxM - lumaMinM) < max(FXAA_CONSOLE__EDGE_THRESHOLD_MIN, lumaMax * FXAA_CONSOLE__EDGE_THRESHOLD))
- #if (FXAA_DISCARD == 1)
- FxaaDiscard;
- #else
- return rgbyM;
- #endif
- #endif
-/*==========================================================================*/
- half4 dir1_pos;
- dir1_pos.xy = normalize(dir.xyz).xz;
- half dirAbsMinTimesC = min(abs(dir1_pos.x), abs(dir1_pos.y)) * half(FXAA_CONSOLE__EDGE_SHARPNESS);
-/*--------------------------------------------------------------------------*/
- half4 dir2_pos;
- dir2_pos.xy = clamp(dir1_pos.xy / dirAbsMinTimesC, half(-2.0), half(2.0));
- dir1_pos.zw = pos.xy;
- dir2_pos.zw = pos.xy;
- half4 temp1N;
- temp1N.xy = dir1_pos.zw - dir1_pos.xy * rcpFrameOpt.zw;
-/*--------------------------------------------------------------------------*/
- temp1N = FxaaTexTop(tex, temp1N.xy);
- half4 rgby1;
- rgby1.xy = dir1_pos.zw + dir1_pos.xy * rcpFrameOpt.zw;
-/*--------------------------------------------------------------------------*/
- rgby1 = FxaaTexTop(tex, rgby1.xy);
- rgby1 = (temp1N + rgby1) * 0.5;
-/*--------------------------------------------------------------------------*/
- half4 temp2N;
- temp2N.xy = dir2_pos.zw - dir2_pos.xy * rcpFrameOpt.xy;
- temp2N = FxaaTexTop(tex, temp2N.xy);
-/*--------------------------------------------------------------------------*/
- half4 rgby2;
- rgby2.xy = dir2_pos.zw + dir2_pos.xy * rcpFrameOpt.xy;
- rgby2 = FxaaTexTop(tex, rgby2.xy);
- rgby2 = (temp2N + rgby2) * 0.5;
-/*--------------------------------------------------------------------------*/
- #if (FXAA_EARLY_EXIT == 0)
- half lumaMin = min(min(lumaNw.w, lumaSw.w), min(lumaNe.w, lumaSe.w));
- half lumaMax = max(max(lumaNw.w, lumaSw.w), max(lumaNe.w, lumaSe.w));
- #endif
- rgby2 = (rgby2 + rgby1) * 0.5;
-/*--------------------------------------------------------------------------*/
- bool twoTapLt = rgby2.w < lumaMin;
- bool twoTapGt = rgby2.w > lumaMax;
-/*--------------------------------------------------------------------------*/
- if(twoTapLt || twoTapGt) rgby2 = rgby1;
-/*--------------------------------------------------------------------------*/
- return rgby2; }
-/*==========================================================================*/
-#endif
-
-
-
-/*============================================================================
-
- FXAA3 QUALITY - PC
-
-============================================================================*/
-#if (FXAA_PC == 1)
-/*--------------------------------------------------------------------------*/
-float4 FxaaPixelShader(
- // {xy} = center of pixel
- float2 pos,
- // {xyzw} = not used on FXAA3 Quality
- float4 posPos,
- // {rgb_} = color in linear or perceptual color space
- // {___a} = luma in perceptual color space (not linear)
- FxaaTex tex,
- // This must be from a constant/uniform.
- // {x_} = 1.0/screenWidthInPixels
- // {_y} = 1.0/screenHeightInPixels
- float2 rcpFrame,
- // {xyzw} = not used on FXAA3 Quality
- float4 rcpFrameOpt
-) {
-/*--------------------------------------------------------------------------*/
- float2 posM;
- posM.x = pos.x;
- posM.y = pos.y;
- #if (FXAA_GATHER4_ALPHA == 1)
- #if (FXAA_DISCARD == 0)
- float4 rgbyM = FxaaTexTop(tex, posM);
- #define lumaM rgbyM.w
- #endif
- float4 luma4A = FxaaTexAlpha4(tex, posM, rcpFrame.xy);
- float4 luma4B = FxaaTexOffAlpha4(tex, posM, FxaaInt2(-1, -1), rcpFrame.xy);
- #if (FXAA_DISCARD == 1)
- #define lumaM luma4A.w
- #endif
- #define lumaE luma4A.z
- #define lumaS luma4A.x
- #define lumaSE luma4A.y
- #define lumaNW luma4B.w
- #define lumaN luma4B.z
- #define lumaW luma4B.x
- #else
- float4 rgbyM = FxaaTexTop(tex, posM);
- #define lumaM rgbyM.w
- float lumaS = FxaaTexOff(tex, posM, FxaaInt2( 0, 1), rcpFrame.xy).w;
- float lumaE = FxaaTexOff(tex, posM, FxaaInt2( 1, 0), rcpFrame.xy).w;
- float lumaN = FxaaTexOff(tex, posM, FxaaInt2( 0,-1), rcpFrame.xy).w;
- float lumaW = FxaaTexOff(tex, posM, FxaaInt2(-1, 0), rcpFrame.xy).w;
- #endif
-/*--------------------------------------------------------------------------*/
- float maxSM = max(lumaS, lumaM);
- float minSM = min(lumaS, lumaM);
- float maxESM = max(lumaE, maxSM);
- float minESM = min(lumaE, minSM);
- float maxWN = max(lumaN, lumaW);
- float minWN = min(lumaN, lumaW);
- float rangeMax = max(maxWN, maxESM);
- float rangeMin = min(minWN, minESM);
- float rangeMaxScaled = rangeMax * FXAA_QUALITY__EDGE_THRESHOLD;
- float range = rangeMax - rangeMin;
- float rangeMaxClamped = max(FXAA_QUALITY__EDGE_THRESHOLD_MIN, rangeMaxScaled);
- bool earlyExit = range < rangeMaxClamped;
-/*--------------------------------------------------------------------------*/
- if(earlyExit)
- #if (FXAA_DISCARD == 1)
- FxaaDiscard;
- #else
- return rgbyM;
- #endif
-/*--------------------------------------------------------------------------*/
- #if (FXAA_GATHER4_ALPHA == 0)
- float lumaNW = FxaaTexOff(tex, posM, FxaaInt2(-1,-1), rcpFrame.xy).w;
- float lumaSE = FxaaTexOff(tex, posM, FxaaInt2( 1, 1), rcpFrame.xy).w;
- float lumaNE = FxaaTexOff(tex, posM, FxaaInt2( 1,-1), rcpFrame.xy).w;
- float lumaSW = FxaaTexOff(tex, posM, FxaaInt2(-1, 1), rcpFrame.xy).w;
- #else
- float lumaNE = FxaaTexOff(tex, posM, FxaaInt2(1, -1), rcpFrame.xy).w;
- float lumaSW = FxaaTexOff(tex, posM, FxaaInt2(-1, 1), rcpFrame.xy).w;
- #endif
-/*--------------------------------------------------------------------------*/
- float lumaNS = lumaN + lumaS;
- float lumaWE = lumaW + lumaE;
- float subpixRcpRange = 1.0/range;
- float subpixNSWE = lumaNS + lumaWE;
- float edgeHorz1 = (-2.0 * lumaM) + lumaNS;
- float edgeVert1 = (-2.0 * lumaM) + lumaWE;
-/*--------------------------------------------------------------------------*/
- float lumaNESE = lumaNE + lumaSE;
- float lumaNWNE = lumaNW + lumaNE;
- float edgeHorz2 = (-2.0 * lumaE) + lumaNESE;
- float edgeVert2 = (-2.0 * lumaN) + lumaNWNE;
-/*--------------------------------------------------------------------------*/
- float lumaNWSW = lumaNW + lumaSW;
- float lumaSWSE = lumaSW + lumaSE;
- float edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2);
- float edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2);
- float edgeHorz3 = (-2.0 * lumaW) + lumaNWSW;
- float edgeVert3 = (-2.0 * lumaS) + lumaSWSE;
- float edgeHorz = abs(edgeHorz3) + edgeHorz4;
- float edgeVert = abs(edgeVert3) + edgeVert4;
-/*--------------------------------------------------------------------------*/
- float subpixNWSWNESE = lumaNWSW + lumaNESE;
- float lengthSign = rcpFrame.x;
- bool horzSpan = edgeHorz >= edgeVert;
- float subpixA = subpixNSWE * 2.0 + subpixNWSWNESE;
-/*--------------------------------------------------------------------------*/
- if(!horzSpan) lumaN = lumaW;
- if(!horzSpan) lumaS = lumaE;
- if(horzSpan) lengthSign = rcpFrame.y;
- float subpixB = (subpixA * (1.0/12.0)) - lumaM;
-/*--------------------------------------------------------------------------*/
- float gradientN = lumaN - lumaM;
- float gradientS = lumaS - lumaM;
- float lumaNN = lumaN + lumaM;
- float lumaSS = lumaS + lumaM;
- bool pairN = abs(gradientN) >= abs(gradientS);
- float gradient = max(abs(gradientN), abs(gradientS));
- if(pairN) lengthSign = -lengthSign;
- float subpixC = FxaaSat(abs(subpixB) * subpixRcpRange);
-/*--------------------------------------------------------------------------*/
- float2 posB;
- posB.x = posM.x;
- posB.y = posM.y;
- float2 offNP;
- offNP.x = (!horzSpan) ? 0.0 : rcpFrame.x;
- offNP.y = ( horzSpan) ? 0.0 : rcpFrame.y;
- if(!horzSpan) posB.x += lengthSign * 0.5;
- if( horzSpan) posB.y += lengthSign * 0.5;
-/*--------------------------------------------------------------------------*/
- float2 posN;
- posN.x = posB.x - offNP.x * FXAA_QUALITY__P0;
- posN.y = posB.y - offNP.y * FXAA_QUALITY__P0;
- float2 posP;
- posP.x = posB.x + offNP.x * FXAA_QUALITY__P0;
- posP.y = posB.y + offNP.y * FXAA_QUALITY__P0;
- float subpixD = ((-2.0)*subpixC) + 3.0;
- float lumaEndN = FxaaTexTop(tex, posN).w;
- float subpixE = subpixC * subpixC;
- float lumaEndP = FxaaTexTop(tex, posP).w;
-/*--------------------------------------------------------------------------*/
- if(!pairN) lumaNN = lumaSS;
- float gradientScaled = gradient * 1.0/4.0;
- float lumaMM = lumaM - lumaNN * 0.5;
- float subpixF = subpixD * subpixE;
- bool lumaMLTZero = lumaMM < 0.0;
-/*--------------------------------------------------------------------------*/
- lumaEndN -= lumaNN * 0.5;
- lumaEndP -= lumaNN * 0.5;
- bool doneN = abs(lumaEndN) >= gradientScaled;
- bool doneP = abs(lumaEndP) >= gradientScaled;
- if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P1;
- if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P1;
- bool doneNP = (!doneN) || (!doneP);
- if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P1;
- if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P1;
-/*--------------------------------------------------------------------------*/
- if(doneNP) {
- if(!doneN) lumaEndN = FxaaTexTop(tex, posN.xy).w;
- if(!doneP) lumaEndP = FxaaTexTop(tex, posP.xy).w;
- if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
- if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
- doneN = abs(lumaEndN) >= gradientScaled;
- doneP = abs(lumaEndP) >= gradientScaled;
- if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P2;
- if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P2;
- doneNP = (!doneN) || (!doneP);
- if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P2;
- if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P2;
-/*--------------------------------------------------------------------------*/
- #if (FXAA_QUALITY__PS > 3)
- if(doneNP) {
- if(!doneN) lumaEndN = FxaaTexTop(tex, posN.xy).w;
- if(!doneP) lumaEndP = FxaaTexTop(tex, posP.xy).w;
- if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
- if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
- doneN = abs(lumaEndN) >= gradientScaled;
- doneP = abs(lumaEndP) >= gradientScaled;
- if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P3;
- if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P3;
- doneNP = (!doneN) || (!doneP);
- if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P3;
- if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P3;
-/*--------------------------------------------------------------------------*/
- #if (FXAA_QUALITY__PS > 4)
- if(doneNP) {
- if(!doneN) lumaEndN = FxaaTexTop(tex, posN.xy).w;
- if(!doneP) lumaEndP = FxaaTexTop(tex, posP.xy).w;
- if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
- if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
- doneN = abs(lumaEndN) >= gradientScaled;
- doneP = abs(lumaEndP) >= gradientScaled;
- if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P4;
- if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P4;
- doneNP = (!doneN) || (!doneP);
- if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P4;
- if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P4;
-/*--------------------------------------------------------------------------*/
- #if (FXAA_QUALITY__PS > 5)
- if(doneNP) {
- if(!doneN) lumaEndN = FxaaTexTop(tex, posN.xy).w;
- if(!doneP) lumaEndP = FxaaTexTop(tex, posP.xy).w;
- if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
- if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
- doneN = abs(lumaEndN) >= gradientScaled;
- doneP = abs(lumaEndP) >= gradientScaled;
- if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P5;
- if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P5;
- doneNP = (!doneN) || (!doneP);
- if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P5;
- if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P5;
-/*--------------------------------------------------------------------------*/
- #if (FXAA_QUALITY__PS > 6)
- if(doneNP) {
- if(!doneN) lumaEndN = FxaaTexTop(tex, posN.xy).w;
- if(!doneP) lumaEndP = FxaaTexTop(tex, posP.xy).w;
- if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
- if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
- doneN = abs(lumaEndN) >= gradientScaled;
- doneP = abs(lumaEndP) >= gradientScaled;
- if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P6;
- if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P6;
- doneNP = (!doneN) || (!doneP);
- if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P6;
- if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P6;
-/*--------------------------------------------------------------------------*/
- #if (FXAA_QUALITY__PS > 7)
- if(doneNP) {
- if(!doneN) lumaEndN = FxaaTexTop(tex, posN.xy).w;
- if(!doneP) lumaEndP = FxaaTexTop(tex, posP.xy).w;
- if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
- if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
- doneN = abs(lumaEndN) >= gradientScaled;
- doneP = abs(lumaEndP) >= gradientScaled;
- if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P7;
- if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P7;
- doneNP = (!doneN) || (!doneP);
- if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P7;
- if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P7;
-/*--------------------------------------------------------------------------*/
- #if (FXAA_QUALITY__PS > 8)
- if(doneNP) {
- if(!doneN) lumaEndN = FxaaTexTop(tex, posN.xy).w;
- if(!doneP) lumaEndP = FxaaTexTop(tex, posP.xy).w;
- if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
- if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
- doneN = abs(lumaEndN) >= gradientScaled;
- doneP = abs(lumaEndP) >= gradientScaled;
- if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P8;
- if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P8;
- doneNP = (!doneN) || (!doneP);
- if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P8;
- if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P8;
-/*--------------------------------------------------------------------------*/
- #if (FXAA_QUALITY__PS > 9)
- if(doneNP) {
- if(!doneN) lumaEndN = FxaaTexTop(tex, posN.xy).w;
- if(!doneP) lumaEndP = FxaaTexTop(tex, posP.xy).w;
- if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
- if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
- doneN = abs(lumaEndN) >= gradientScaled;
- doneP = abs(lumaEndP) >= gradientScaled;
- if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P9;
- if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P9;
- doneNP = (!doneN) || (!doneP);
- if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P9;
- if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P9;
-/*--------------------------------------------------------------------------*/
- #if (FXAA_QUALITY__PS > 10)
- if(doneNP) {
- if(!doneN) lumaEndN = FxaaTexTop(tex, posN.xy).w;
- if(!doneP) lumaEndP = FxaaTexTop(tex, posP.xy).w;
- if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
- if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
- doneN = abs(lumaEndN) >= gradientScaled;
- doneP = abs(lumaEndP) >= gradientScaled;
- if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P10;
- if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P10;
- doneNP = (!doneN) || (!doneP);
- if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P10;
- if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P10;
-/*--------------------------------------------------------------------------*/
- #if (FXAA_QUALITY__PS > 11)
- if(doneNP) {
- if(!doneN) lumaEndN = FxaaTexTop(tex, posN.xy).w;
- if(!doneP) lumaEndP = FxaaTexTop(tex, posP.xy).w;
- if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
- if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
- doneN = abs(lumaEndN) >= gradientScaled;
- doneP = abs(lumaEndP) >= gradientScaled;
- if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P11;
- if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P11;
- doneNP = (!doneN) || (!doneP);
- if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P11;
- if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P11;
-/*--------------------------------------------------------------------------*/
- #if (FXAA_QUALITY__PS > 12)
- if(doneNP) {
- if(!doneN) lumaEndN = FxaaTexTop(tex, posN.xy).w;
- if(!doneP) lumaEndP = FxaaTexTop(tex, posP.xy).w;
- if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
- if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
- doneN = abs(lumaEndN) >= gradientScaled;
- doneP = abs(lumaEndP) >= gradientScaled;
- if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P12;
- if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P12;
- doneNP = (!doneN) || (!doneP);
- if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P12;
- if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P12;
-/*--------------------------------------------------------------------------*/
- }
- #endif
-/*--------------------------------------------------------------------------*/
- }
- #endif
-/*--------------------------------------------------------------------------*/
- }
- #endif
-/*--------------------------------------------------------------------------*/
- }
- #endif
-/*--------------------------------------------------------------------------*/
- }
- #endif
-/*--------------------------------------------------------------------------*/
- }
- #endif
-/*--------------------------------------------------------------------------*/
- }
- #endif
-/*--------------------------------------------------------------------------*/
- }
- #endif
-/*--------------------------------------------------------------------------*/
- }
- #endif
-/*--------------------------------------------------------------------------*/
- }
- #endif
-/*--------------------------------------------------------------------------*/
- }
-/*--------------------------------------------------------------------------*/
- float dstN = posM.x - posN.x;
- float dstP = posP.x - posM.x;
- if(!horzSpan) dstN = posM.y - posN.y;
- if(!horzSpan) dstP = posP.y - posM.y;
-/*--------------------------------------------------------------------------*/
- bool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero;
- float spanLength = (dstP + dstN);
- bool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero;
- float spanLengthRcp = 1.0/spanLength;
-/*--------------------------------------------------------------------------*/
- bool directionN = dstN < dstP;
- float dst = min(dstN, dstP);
- bool goodSpan = directionN ? goodSpanN : goodSpanP;
- float subpixG = subpixF * subpixF;
- float pixelOffset = (dst * (-spanLengthRcp)) + 0.5;
- float subpixH = subpixG * FXAA_QUALITY__SUBPIX;
-/*--------------------------------------------------------------------------*/
- float pixelOffsetGood = goodSpan ? pixelOffset : 0.0;
- float pixelOffsetSubpix = max(pixelOffsetGood, subpixH);
- if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign;
- if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign;
- #if (FXAA_DISCARD == 1)
- return FxaaTexTop(tex, posM);
- #else
- return float4(FxaaTexTop(tex, posM).xyz, lumaM);
- #endif
-}
-/*==========================================================================*/
-#endif
-
-PS_OUTPUT ps_main(PS_INPUT input)
-{
- PS_OUTPUT output;
-
- float2 pos = input.t;
- float4 posPos = (float4)0;
-
- FxaaTex tex;
-
- #if SHADER_MODEL >= 0x400
-
- tex.tex = Texture;
- tex.smpl = TextureSampler;
-
- #else
-
- tex = Texture;
-
- #endif
-
- output.c = FxaaPixelShader(pos, posPos, tex, _rcpFrame.xy, _rcpFrameOpt);
-
- return output;
-}
-
-#endif
+#ifdef SHADER_MODEL // make safe to include in resource file to enforce dependency
+
+#define FXAA_PC 1
+#define FXAA_QUALITY__SUBPIX 0.0
+
+#if SHADER_MODEL >= 0x400
+
+#if SHADER_MODEL >= 0x500
+ #define FXAA_HLSL_5 1
+#else
+ #define FXAA_HLSL_4 1
+#endif
+
+Texture2D Texture;
+SamplerState TextureSampler;
+
+cbuffer cb0
+{
+ float4 _rcpFrame;
+ float4 _rcpFrameOpt;
+};
+
+struct PS_INPUT
+{
+ float4 p : SV_Position;
+ float2 t : TEXCOORD0;
+};
+
+struct PS_OUTPUT
+{
+ float4 c : SV_Target0;
+};
+
+#elif SHADER_MODEL <= 0x300
+
+#define FXAA_HLSL_3 1
+
+sampler Texture : register(s0);
+
+float4 _rcpFrame : register(c0);
+float4 _rcpFrameOpt : register(c1);
+
+struct PS_INPUT
+{
+#if SHADER_MODEL < 0x300
+ float4 p : TEXCOORD1;
+#else
+ float4 p : VPOS;
+#endif
+ float2 t : TEXCOORD0;
+};
+
+struct PS_OUTPUT
+{
+ float4 c : COLOR;
+};
+
+#endif
+
+/*============================================================================
+
+
+ NVIDIA FXAA 3.10 by TIMOTHY LOTTES
+
+
+------------------------------------------------------------------------------
+COPYRIGHT (C) 2010, 2011 NVIDIA CORPORATION. ALL RIGHTS RESERVED.
+------------------------------------------------------------------------------
+TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED
+*AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA
+OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR
+CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR
+LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION,
+OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE
+THIS SOFTWARE, EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+------------------------------------------------------------------------------
+ INTEGRATION CHECKLIST
+------------------------------------------------------------------------------
+(1.)
+In the shader source,
+setup defines for the desired configuration.
+Example,
+
+ #define FXAA_PC 1
+ #define FXAA_HLSL_3 1
+ #define FXAA_QUALITY__PRESET 12
+ #define FXAA_QUALITY__EDGE_THRESHOLD (1.0/6.0)
+ #define FXAA_QUALITY__EDGE_THRESHOLD_MIN (1.0/12.0)
+
+(2.)
+Then include this file,
+
+ #include "Fxaa3.h"
+
+(3.)
+Then call the FXAA pixel shader from within your desired shader,
+
+ return FxaaPixelShader(pos, posPos, tex, rcpFrame, rcpFrameOpt);
+
+(4.)
+Insure pass prior to FXAA outputs RGBL.
+See next section.
+
+(5.)
+Setup engine to provide "rcpFrame" and "rcpFrameOpt" constants.
+Not using constants will result in a performance loss.
+
+ // {x_} = 1.0/screenWidthInPixels
+ // {_y} = 1.0/screenHeightInPixels
+ float2 rcpFrame
+
+ // This must be from a constant/uniform.
+ // {x___} = 2.0/screenWidthInPixels
+ // {_y__} = 2.0/screenHeightInPixels
+ // {__z_} = 0.5/screenWidthInPixels
+ // {___w} = 0.5/screenHeightInPixels
+ float4 rcpFrameOpt
+
+(5.a.)
+Optionally change to this for sharper FXAA Console,
+
+ // This must be from a constant/uniform.
+ // {x___} = 2.0/screenWidthInPixels
+ // {_y__} = 2.0/screenHeightInPixels
+ // {__z_} = 0.333/screenWidthInPixels
+ // {___w} = 0.333/screenHeightInPixels
+ float4 rcpFrameOpt
+
+(6.)
+Have FXAA vertex shader run as a full screen triangle,
+and output "pos" and "posPos" such that inputs in the pixel shader provide,
+
+ // {xy} = center of pixel
+ float2 pos,
+
+ // {xy__} = upper left of pixel
+ // {__zw} = lower right of pixel
+ float4 posPos,
+
+(7.)
+Insure the texture sampler used by FXAA is set to bilinear filtering.
+
+
+------------------------------------------------------------------------------
+ INTEGRATION - RGBL AND COLORSPACE
+------------------------------------------------------------------------------
+FXAA3 requires RGBL as input.
+
+RGB should be LDR (low dynamic range).
+Specifically do FXAA after tonemapping.
+
+RGB data as returned by a texture fetch can be linear or non-linear.
+Note an "sRGB format" texture counts as linear,
+because the result of a texture fetch is linear data.
+Regular "RGBA8" textures in the sRGB colorspace are non-linear.
+
+Luma must be stored in the alpha channel prior to running FXAA.
+This luma should be in a perceptual space (could be gamma 2.0).
+Example pass before FXAA where output is gamma 2.0 encoded,
+
+ color.rgb = ToneMap(color.rgb); // linear color output
+ color.rgb = sqrt(color.rgb); // gamma 2.0 color output
+ return color;
+
+To use FXAA,
+
+ color.rgb = ToneMap(color.rgb); // linear color output
+ color.rgb = sqrt(color.rgb); // gamma 2.0 color output
+ color.a = dot(color.rgb, float3(0.299, 0.587, 0.114)); // compute luma
+ return color;
+
+Another example where output is linear encoded,
+say for instance writing to an sRGB formated render target,
+where the render target does the conversion back to sRGB after blending,
+
+ color.rgb = ToneMap(color.rgb); // linear color output
+ return color;
+
+To use FXAA,
+
+ color.rgb = ToneMap(color.rgb); // linear color output
+ color.a = sqrt(dot(color.rgb, float3(0.299, 0.587, 0.114))); // compute luma
+ return color;
+
+Getting luma correct is required for the algorithm to work correctly.
+
+
+------------------------------------------------------------------------------
+ BEING LINEARLY CORRECT?
+------------------------------------------------------------------------------
+Applying FXAA to a framebuffer with linear RGB color will look worse.
+This is very counter intuitive, but happends to be true in this case.
+The reason is because dithering artifacts will be more visiable
+in a linear colorspace.
+
+
+------------------------------------------------------------------------------
+ COMPLEX INTEGRATION
+------------------------------------------------------------------------------
+Q. What if the engine is blending into RGB before wanting to run FXAA?
+
+A. In the last opaque pass prior to FXAA,
+ have the pass write out luma into alpha.
+ Then blend into RGB only.
+ FXAA should be able to run ok
+ assuming the blending pass did not any add aliasing.
+ This should be the common case for particles and common blending passes.
+
+============================================================================*/
+
+/*============================================================================
+
+ INTEGRATION KNOBS
+
+============================================================================*/
+//
+// FXAA_PS3 and FXAA_360 choose the console algorithm (FXAA3 CONSOLE).
+// FXAA_360_OPT is a prototype for the new optimized 360 version.
+//
+// 1 = Use API.
+// 0 = Don't use API.
+//
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_PS3
+ #define FXAA_PS3 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_360
+ #define FXAA_360 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_360_OPT
+ #define FXAA_360_OPT 0
+#endif
+/*==========================================================================*/
+#ifndef FXAA_PC
+ //
+ // FXAA Quality
+ // The high quality PC algorithm.
+ //
+ #define FXAA_PC 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_PC_CONSOLE
+ //
+ // The console algorithm for PC is included
+ // for developers targeting really low spec machines.
+ //
+ #define FXAA_PC_CONSOLE 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_GLSL_120
+ #define FXAA_GLSL_120 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_GLSL_130
+ #define FXAA_GLSL_130 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_HLSL_3
+ #define FXAA_HLSL_3 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_HLSL_4
+ #define FXAA_HLSL_4 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_HLSL_5
+ #define FXAA_HLSL_5 0
+#endif
+/*==========================================================================*/
+#ifndef FXAA_EARLY_EXIT
+ //
+ // Controls algorithm's early exit path.
+ // On PS3 turning this on adds 2 cycles to the shader.
+ // On 360 turning this off adds 10ths of a millisecond to the shader.
+ // Turning this off on console will result in a more blurry image.
+ // So this defaults to on.
+ //
+ // 1 = On.
+ // 0 = Off.
+ //
+ #define FXAA_EARLY_EXIT 1
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_DISCARD
+ //
+ // Only valid for PC OpenGL currently.
+ //
+ // 1 = Use discard on pixels which don't need AA.
+ // For APIs which enable concurrent TEX+ROP from same surface.
+ // 0 = Return unchanged color on pixels which don't need AA.
+ //
+ #define FXAA_DISCARD 0
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_FAST_PIXEL_OFFSET
+ //
+ // Used for GLSL 120 only.
+ //
+ // 1 = GL API supports fast pixel offsets
+ // 0 = do not use fast pixel offsets
+ //
+ #ifdef GL_EXT_gpu_shader4
+ #define FXAA_FAST_PIXEL_OFFSET 1
+ #endif
+ #ifdef GL_NV_gpu_shader5
+ #define FXAA_FAST_PIXEL_OFFSET 1
+ #endif
+ #ifdef GL_ARB_gpu_shader5
+ #define FXAA_FAST_PIXEL_OFFSET 1
+ #endif
+ #ifndef FXAA_FAST_PIXEL_OFFSET
+ #define FXAA_FAST_PIXEL_OFFSET 0
+ #endif
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_GATHER4_ALPHA
+ //
+ // 1 = API supports gather4 on alpha channel.
+ // 0 = API does not support gather4 on alpha channel.
+ //
+ #if (FXAA_HLSL_5 == 1)
+ #define FXAA_GATHER4_ALPHA 1
+ #endif
+ #ifdef GL_ARB_gpu_shader5
+ #define FXAA_GATHER4_ALPHA 1
+ #endif
+ #ifdef GL_NV_gpu_shader5
+ #define FXAA_GATHER4_ALPHA 1
+ #endif
+ #ifndef FXAA_GATHER4_ALPHA
+ #define FXAA_GATHER4_ALPHA 0
+ #endif
+#endif
+
+/*============================================================================
+ FXAA CONSOLE - TUNING KNOBS
+============================================================================*/
+#ifndef FXAA_CONSOLE__EDGE_SHARPNESS
+ //
+ // Consoles the sharpness of edges.
+ //
+ // Due to the PS3 being ALU bound,
+ // there are only two safe values here: 4 and 8.
+ // These options use the shaders ability to a free *|/ by 4|8.
+ //
+ // 8.0 is sharper
+ // 4.0 is softer
+ // 2.0 is really soft (good for vector graphics inputs)
+ //
+ #if 1
+ #define FXAA_CONSOLE__EDGE_SHARPNESS 8.0
+ #endif
+ #if 0
+ #define FXAA_CONSOLE__EDGE_SHARPNESS 4.0
+ #endif
+ #if 0
+ #define FXAA_CONSOLE__EDGE_SHARPNESS 2.0
+ #endif
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_CONSOLE__EDGE_THRESHOLD
+ //
+ // The minimum amount of local contrast required to apply algorithm.
+ // The console setting has a different mapping than the quality setting.
+ //
+ // This only applies when FXAA_EARLY_EXIT is 1.
+ //
+ // Due to the PS3 being ALU bound,
+ // there are only two safe values here: 0.25 and 0.125.
+ // These options use the shaders ability to a free *|/ by 4|8.
+ //
+ // 0.125 leaves less aliasing, but is softer
+ // 0.25 leaves more aliasing, and is sharper
+ //
+ #if 1
+ #define FXAA_CONSOLE__EDGE_THRESHOLD 0.125
+ #else
+ #define FXAA_CONSOLE__EDGE_THRESHOLD 0.25
+ #endif
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_CONSOLE__EDGE_THRESHOLD_MIN
+ //
+ // Trims the algorithm from processing darks.
+ // The console setting has a different mapping than the quality setting.
+ //
+ // This only applies when FXAA_EARLY_EXIT is 1.
+ //
+ // This does not apply to PS3.
+ // PS3 was simplified to avoid more shader instructions.
+ //
+ #define FXAA_CONSOLE__EDGE_THRESHOLD_MIN 0.05
+#endif
+
+/*============================================================================
+ FXAA QUALITY - TUNING KNOBS
+============================================================================*/
+#ifndef FXAA_QUALITY__EDGE_THRESHOLD
+ //
+ // The minimum amount of local contrast required to apply algorithm.
+ //
+ // 1/3 - too little
+ // 1/4 - low quality
+ // 1/6 - default
+ // 1/8 - high quality (default)
+ // 1/16 - overkill
+ //
+ #define FXAA_QUALITY__EDGE_THRESHOLD (1.0/6.0)
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_QUALITY__EDGE_THRESHOLD_MIN
+ //
+ // Trims the algorithm from processing darks.
+ //
+ // 1/32 - visible limit
+ // 1/16 - high quality
+ // 1/12 - upper limit (default, the start of visible unfiltered edges)
+ //
+ #define FXAA_QUALITY__EDGE_THRESHOLD_MIN (1.0/12.0)
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_QUALITY__SUBPIX
+ //
+ // Choose the amount of sub-pixel aliasing removal.
+ //
+ // 1 - upper limit (softer)
+ // 3/4 - default amount of filtering
+ // 1/2 - lower limit (sharper, less sub-pixel aliasing removal)
+ //
+ #define FXAA_QUALITY__SUBPIX (3.0/4.0)
+#endif
+/*--------------------------------------------------------------------------*/
+#ifndef FXAA_QUALITY__PRESET
+ //
+ // Choose the quality preset.
+ //
+ // OPTIONS
+ // -----------------------------------------------------------------------
+ // 10 to 15 - default medium dither (10=fastest, 15=highest quality)
+ // 20 to 29 - less dither, more expensive (20=fastest, 29=highest quality)
+ // 39 - no dither, very expensive
+ //
+ // NOTES
+ // -----------------------------------------------------------------------
+ // 12 = slightly faster then FXAA 3.9 and higher edge quality (default)
+ // 13 = about same speed as FXAA 3.9 and better than 12
+ // 23 = closest to FXAA 3.9 visually and performance wise
+ // _ = the lowest digit is directly related to performance
+ // _ = the highest digit is directly related to style
+ //
+ #define FXAA_QUALITY__PRESET 12
+#endif
+
+
+/*============================================================================
+
+ FXAA QUALITY - PRESETS
+
+============================================================================*/
+
+/*============================================================================
+ FXAA QUALITY - MEDIUM DITHER PRESETS
+============================================================================*/
+#if (FXAA_QUALITY__PRESET == 10)
+ #define FXAA_QUALITY__PS 3
+ #define FXAA_QUALITY__P0 1.5
+ #define FXAA_QUALITY__P1 3.0
+ #define FXAA_QUALITY__P2 12.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 11)
+ #define FXAA_QUALITY__PS 4
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 3.0
+ #define FXAA_QUALITY__P3 12.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 12)
+ #define FXAA_QUALITY__PS 5
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 4.0
+ #define FXAA_QUALITY__P4 12.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 13)
+ #define FXAA_QUALITY__PS 6
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 4.0
+ #define FXAA_QUALITY__P5 12.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 14)
+ #define FXAA_QUALITY__PS 7
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 4.0
+ #define FXAA_QUALITY__P6 12.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 15)
+ #define FXAA_QUALITY__PS 8
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 2.0
+ #define FXAA_QUALITY__P6 4.0
+ #define FXAA_QUALITY__P7 12.0
+#endif
+
+/*============================================================================
+ FXAA QUALITY - LOW DITHER PRESETS
+============================================================================*/
+#if (FXAA_QUALITY__PRESET == 20)
+ #define FXAA_QUALITY__PS 3
+ #define FXAA_QUALITY__P0 1.5
+ #define FXAA_QUALITY__P1 2.0
+ #define FXAA_QUALITY__P2 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 21)
+ #define FXAA_QUALITY__PS 4
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 22)
+ #define FXAA_QUALITY__PS 5
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 23)
+ #define FXAA_QUALITY__PS 6
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 24)
+ #define FXAA_QUALITY__PS 7
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 3.0
+ #define FXAA_QUALITY__P6 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 25)
+ #define FXAA_QUALITY__PS 8
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 2.0
+ #define FXAA_QUALITY__P6 4.0
+ #define FXAA_QUALITY__P7 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 26)
+ #define FXAA_QUALITY__PS 9
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 2.0
+ #define FXAA_QUALITY__P6 2.0
+ #define FXAA_QUALITY__P7 4.0
+ #define FXAA_QUALITY__P8 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 27)
+ #define FXAA_QUALITY__PS 10
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 2.0
+ #define FXAA_QUALITY__P6 2.0
+ #define FXAA_QUALITY__P7 2.0
+ #define FXAA_QUALITY__P8 4.0
+ #define FXAA_QUALITY__P9 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 28)
+ #define FXAA_QUALITY__PS 11
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 2.0
+ #define FXAA_QUALITY__P6 2.0
+ #define FXAA_QUALITY__P7 2.0
+ #define FXAA_QUALITY__P8 2.0
+ #define FXAA_QUALITY__P9 4.0
+ #define FXAA_QUALITY__P10 8.0
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_QUALITY__PRESET == 29)
+ #define FXAA_QUALITY__PS 12
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.5
+ #define FXAA_QUALITY__P2 2.0
+ #define FXAA_QUALITY__P3 2.0
+ #define FXAA_QUALITY__P4 2.0
+ #define FXAA_QUALITY__P5 2.0
+ #define FXAA_QUALITY__P6 2.0
+ #define FXAA_QUALITY__P7 2.0
+ #define FXAA_QUALITY__P8 2.0
+ #define FXAA_QUALITY__P9 2.0
+ #define FXAA_QUALITY__P10 4.0
+ #define FXAA_QUALITY__P11 8.0
+#endif
+
+/*============================================================================
+ FXAA QUALITY - EXTREME QUALITY
+============================================================================*/
+#if (FXAA_QUALITY__PRESET == 39)
+ #define FXAA_QUALITY__PS 12
+ #define FXAA_QUALITY__P0 1.0
+ #define FXAA_QUALITY__P1 1.0
+ #define FXAA_QUALITY__P2 1.0
+ #define FXAA_QUALITY__P3 1.0
+ #define FXAA_QUALITY__P4 1.0
+ #define FXAA_QUALITY__P5 1.5
+ #define FXAA_QUALITY__P6 2.0
+ #define FXAA_QUALITY__P7 2.0
+ #define FXAA_QUALITY__P8 2.0
+ #define FXAA_QUALITY__P9 2.0
+ #define FXAA_QUALITY__P10 4.0
+ #define FXAA_QUALITY__P11 8.0
+#endif
+
+
+
+/*============================================================================
+
+ API PORTING
+
+============================================================================*/
+#if FXAA_GLSL_120
+ // Requires,
+ // #version 120
+ // And at least,
+ // #extension GL_EXT_gpu_shader4 : enable
+ // (or set FXAA_FAST_PIXEL_OFFSET 1 to work like DX9)
+ #define half float
+ #define half2 vec2
+ #define half3 vec3
+ #define half4 vec4
+ #define int2 ivec2
+ #define float2 vec2
+ #define float3 vec3
+ #define float4 vec4
+ #define FxaaInt2 ivec2
+ #define FxaaFloat2 vec2
+ #define FxaaFloat3 vec3
+ #define FxaaFloat4 vec4
+ #define FxaaDiscard discard
+ #define FxaaDot3(a, b) dot(a, b)
+ #define FxaaSat(x) clamp(x, 0.0, 1.0)
+ #define FxaaLerp(x,y,s) mix(x,y,s)
+ #define FxaaTex sampler2D
+ #define FxaaTexTop(t, p) texture2DLod(t, p, 0.0)
+ #if (FXAA_FAST_PIXEL_OFFSET == 1)
+ #define FxaaTexOff(t, p, o, r) texture2DLodOffset(t, p, 0.0, o)
+ #else
+ #define FxaaTexOff(t, p, o, r) texture2DLod(t, p + (o * r), 0.0)
+ #endif
+ #if (FXAA_GATHER4_ALPHA == 1)
+ // use #extension GL_ARB_gpu_shader5 : enable
+ #define FxaaTexAlpha4(t, p, r) textureGather(t, p, 3)
+ #define FxaaTexOffAlpha4(t, p, o, r) textureGatherOffset(t, p, o, 3)
+ #endif
+#endif
+/*--------------------------------------------------------------------------*/
+#if FXAA_GLSL_130
+ // Requires "#version 130" or better
+ #define half float
+ #define half2 vec2
+ #define half3 vec3
+ #define half4 vec4
+ #define int2 ivec2
+ #define float2 vec2
+ #define float3 vec3
+ #define float4 vec4
+ #define FxaaInt2 ivec2
+ #define FxaaFloat2 vec2
+ #define FxaaFloat3 vec3
+ #define FxaaFloat4 vec4
+ #define FxaaDiscard discard
+ #define FxaaDot3(a, b) dot(a, b)
+ #define FxaaSat(x) clamp(x, 0.0, 1.0)
+ #define FxaaLerp(x,y,s) mix(x,y,s)
+ #define FxaaTex sampler2D
+ #define FxaaTexTop(t, p) textureLod(t, p, 0.0)
+ #define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o)
+ #if (FXAA_GATHER4_ALPHA == 1)
+ // use #extension GL_ARB_gpu_shader5 : enable
+ #define FxaaTexAlpha4(t, p, r) textureGather(t, p, 3)
+ #define FxaaTexOffAlpha4(t, p, o, r) textureGatherOffset(t, p, o, 3)
+ #endif
+#endif
+/*--------------------------------------------------------------------------*/
+#if (FXAA_HLSL_3 == 1) || (FXAA_360 == 1)
+ #define int2 float2
+ #define FxaaInt2 float2
+ #define FxaaFloat2 float2
+ #define FxaaFloat3 float3
+ #define FxaaFloat4 float4
+ #define FxaaDiscard clip(-1)
+ #define FxaaDot3(a, b) dot(a, b)
+ #define FxaaSat(x) saturate(x)
+ #define FxaaLerp(x,y,s) lerp(x,y,s)
+ #define FxaaTex sampler2D
+ #define FxaaTexTop(t, p) tex2Dlod(t, float4(p, 0.0, 0.0))
+ #define FxaaTexOff(t, p, o, r) tex2Dlod(t, float4(p + (o * r), 0, 0))
+#endif
+/*--------------------------------------------------------------------------*/
+#if FXAA_HLSL_4
+ #define FxaaInt2 int2
+ #define FxaaFloat2 float2
+ #define FxaaFloat3 float3
+ #define FxaaFloat4 float4
+ #define FxaaDiscard clip(-1)
+ #define FxaaDot3(a, b) dot(a, b)
+ #define FxaaSat(x) saturate(x)
+ #define FxaaLerp(x,y,s) lerp(x,y,s)
+ struct FxaaTex { SamplerState smpl; Texture2D tex; };
+ #define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0)
+ #define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o)
+#endif
+/*--------------------------------------------------------------------------*/
+#if FXAA_HLSL_5
+ #define FxaaInt2 int2
+ #define FxaaFloat2 float2
+ #define FxaaFloat3 float3
+ #define FxaaFloat4 float4
+ #define FxaaDiscard clip(-1)
+ #define FxaaDot3(a, b) dot(a, b)
+ #define FxaaSat(x) saturate(x)
+ #define FxaaLerp(x,y,s) lerp(x,y,s)
+ struct FxaaTex { SamplerState smpl; Texture2D tex; };
+ #define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0)
+ #define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o)
+ #define FxaaTexAlpha4(t, p, r) t.tex.GatherAlpha(t.smpl, p)
+ #define FxaaTexOffAlpha4(t, p, o, r) t.tex.GatherAlpha(t.smpl, p, o)
+#endif
+
+
+
+/*============================================================================
+
+ FXAA3 CONSOLE - 360 PIXEL SHADER
+
+------------------------------------------------------------------------------
+Might be some optimizations left here,
+as of this latest change didn't have a PIX dump to verify if TEX bound.
+============================================================================*/
+#if (FXAA_360 == 1)
+/*--------------------------------------------------------------------------*/
+half4 FxaaPixelShader(
+ // {xy} = center of pixel
+ float2 pos,
+ // {xy__} = upper left of pixel
+ // {__zw} = lower right of pixel
+ float4 posPos,
+ // {rgb_} = color in linear or perceptual color space
+ // {___a} = alpha output is junk value
+ FxaaTex tex,
+ // This must be from a constant/uniform.
+ // {xy} = rcpFrame not used on PC version of FXAA Console
+ float2 rcpFrame,
+ // This must be from a constant/uniform.
+ // {x___} = 2.0/screenWidthInPixels
+ // {_y__} = 2.0/screenHeightInPixels
+ // {__z_} = 0.5/screenWidthInPixels
+ // {___w} = 0.5/screenHeightInPixels
+ float4 rcpFrameOpt
+) {
+/*--------------------------------------------------------------------------*/
+ half4 lumaNwNeSwSe;
+ lumaNwNeSwSe.x = FxaaTexTop(tex, posPos.xy).w;
+ lumaNwNeSwSe.y = FxaaTexTop(tex, posPos.zy).w;
+ lumaNwNeSwSe.z = FxaaTexTop(tex, posPos.xw).w;
+ lumaNwNeSwSe.w = FxaaTexTop(tex, posPos.zw).w;
+/*--------------------------------------------------------------------------*/
+ half4 rgbyM = FxaaTexTop(tex, pos.xy);
+/*--------------------------------------------------------------------------*/
+ lumaNwNeSwSe.y += 1.0/384.0;
+/*--------------------------------------------------------------------------*/
+ half2 lumaMinTemp = min(lumaNwNeSwSe.xy, lumaNwNeSwSe.zw);
+ half2 lumaMaxTemp = max(lumaNwNeSwSe.xy, lumaNwNeSwSe.zw);
+/*--------------------------------------------------------------------------*/
+ half lumaMin = min(lumaMinTemp.x, lumaMinTemp.y);
+ half lumaMax = max(lumaMaxTemp.x, lumaMaxTemp.y);
+/*--------------------------------------------------------------------------*/
+ half lumaMinM = min(lumaMin, rgbyM.w);
+ half lumaMaxM = max(lumaMax, rgbyM.w);
+ if((lumaMaxM - lumaMinM) < max(FXAA_CONSOLE__EDGE_THRESHOLD_MIN, lumaMax * FXAA_CONSOLE__EDGE_THRESHOLD)) return rgbyM;
+/*--------------------------------------------------------------------------*/
+ half2 dir;
+ dir.x = dot(lumaNwNeSwSe, float4(-1.0, -1.0, 1.0, 1.0));
+ dir.y = dot(lumaNwNeSwSe, float4( 1.0, -1.0, 1.0,-1.0));
+/*--------------------------------------------------------------------------*/
+ half2 dir1;
+ dir1 = normalize(dir.xy);
+/*--------------------------------------------------------------------------*/
+ half dirAbsMinTimesC = min(abs(dir1.x), abs(dir1.y)) * FXAA_CONSOLE__EDGE_SHARPNESS;
+ half2 dir2;
+ dir2 = clamp(dir1.xy / dirAbsMinTimesC, -2.0, 2.0);
+/*--------------------------------------------------------------------------*/
+ half4 rgbyN1 = FxaaTexTop(tex, pos.xy - dir1 * rcpFrameOpt.zw);
+ half4 rgbyP1 = FxaaTexTop(tex, pos.xy + dir1 * rcpFrameOpt.zw);
+ half4 rgbyN2 = FxaaTexTop(tex, pos.xy - dir2 * rcpFrameOpt.xy);
+ half4 rgbyP2 = FxaaTexTop(tex, pos.xy + dir2 * rcpFrameOpt.xy);
+/*--------------------------------------------------------------------------*/
+ half4 rgbyA = rgbyN1 * 0.5 + rgbyP1 * 0.5;
+ half4 rgbyB = rgbyN2 * 0.25 + rgbyP2 * 0.25 + rgbyA * 0.5;
+/*--------------------------------------------------------------------------*/
+ bool twoTap = (rgbyB.w < lumaMin) || (rgbyB.w > lumaMax);
+ if(twoTap) rgbyB.xyz = rgbyA.xyz;
+ return rgbyB; }
+/*==========================================================================*/
+#endif
+
+
+
+/*============================================================================
+
+ FXAA3 CONSOLE - 360 PIXEL SHADER OPTIMIZED PROTOTYPE
+
+------------------------------------------------------------------------------
+This prototype optimized version thanks to suggestions from Andy Luedke.
+Should be fully tex bound in all cases.
+As of the FXAA 3.10 release I have not tested this code,
+but at least the missing ";" was fixed.
+If it does not work, please let me know so I can fix it.
+------------------------------------------------------------------------------
+Extra requirements,
+(1.) Different inputs: no posPos.
+(2.) Different inputs: alias three samplers with different exp bias settings!
+(3.) New constants: setup fxaaConst as described below.
+============================================================================*/
+#if (FXAA_360_OPT == 1)
+/*--------------------------------------------------------------------------*/
+[reduceTempRegUsage(4)]
+float4 FxaaPixelShader(
+ // {xy} = center of pixel
+ float2 pos,
+ // Three samplers,
+ // texExpBias0 = exponent bias 0
+ // texExpBiasNeg1 = exponent bias -1
+ // texExpBiasNeg2 = exponent bias -2
+ // {rgb_} = color in linear or perceptual color space
+ // {___a} = alpha output is junk value
+ uniform sampler2D texExpBias0,
+ uniform sampler2D texExpBiasNeg1,
+ uniform sampler2D texExpBiasNeg2,
+ // These must be in physical constant registers and NOT immedates
+ // Immedates will result in compiler un-optimizing
+ // width = screen width in pixels
+ // height = screen height in pixels
+ fxaaConstDir, // float4(1.0, -1.0, 0.25, -0.25);
+ fxaaConstInner, // float4(0.5/width, 0.5/height, -0.5/width, -0.5/height);
+ fxaaConstOuter // float4(8.0/width, 8.0/height, -4.0/width, -4.0/height);
+) {
+/*--------------------------------------------------------------------------*/
+ float4 lumaNwNeSwSe;
+ asm {
+ tfetch2D lumaNwNeSwSe.w___, texExpBias0, pos.xy, OffsetX = -0.5, OffsetY = -0.5, UseComputedLOD=false
+ tfetch2D lumaNwNeSwSe._w__, texExpBias0, pos.xy, OffsetX = 0.5, OffsetY = -0.5, UseComputedLOD=false
+ tfetch2D lumaNwNeSwSe.__w_, texExpBias0, pos.xy, OffsetX = -0.5, OffsetY = 0.5, UseComputedLOD=false
+ tfetch2D lumaNwNeSwSe.___w, texExpBias0, pos.xy, OffsetX = 0.5, OffsetY = 0.5, UseComputedLOD=false
+ };
+/*--------------------------------------------------------------------------*/
+ lumaNwNeSwSe.y += 1.0/384.0;
+ float2 lumaMinTemp = min(lumaNwNeSwSe.xy, lumaNwNeSwSe.zw);
+ float2 lumaMaxTemp = max(lumaNwNeSwSe.xy, lumaNwNeSwSe.zw);
+ float lumaMin = min(lumaMinTemp.x, lumaMinTemp.y);
+ float lumaMax = max(lumaMaxTemp.x, lumaMaxTemp.y);
+/*--------------------------------------------------------------------------*/
+ float4 rgbyM = tex2Dlod(texExpBias0, float4(pos.xy, 0.0, 0.0));
+ float4 lumaMinM = min(lumaMin, rgbyM.w);
+ float4 lumaMaxM = max(lumaMax, rgbyM.w);
+ if((lumaMaxM - lumaMinM) < max(FXAA_CONSOLE__EDGE_THRESHOLD_MIN, lumaMax * FXAA_CONSOLE__EDGE_THRESHOLD)) return rgbyM;
+/*--------------------------------------------------------------------------*/
+ float2 dir;
+ dir.x = dot(lumaNwNeSwSe, fxaaConstDir.yyxx);
+ dir.y = dot(lumaNwNeSwSe, fxaaConstDir.xyxy);
+ dir = normalize(dir);
+/*--------------------------------------------------------------------------*/
+ float4 dir1 = dir.xyxy * fxaaConstInner.xyzw;
+/*--------------------------------------------------------------------------*/
+ float4 dir2;
+ float dirAbsMinTimesC = min(abs(dir.x), abs(dir.y));
+ dir2 = saturate(fxaaConstOuter.zzww * dir.xyxy / FXAA_CONSOLE__EDGE_SHARPNESS / dirAbsMinTimesC + 0.5);
+ dir2 = dir2 * fxaaConstOuter.xyxy + fxaaConstOuter.zwzw;
+/*--------------------------------------------------------------------------*/
+ float4 rgbyN1 = tex2Dlod(texExpBiasNeg1, float4(pos.xy + dir1.xy, 0.0, 0.0));
+ float4 rgbyP1 = tex2Dlod(texExpBiasNeg1, float4(pos.xy + dir1.zw, 0.0, 0.0));
+ float4 rgbyN2 = tex2Dlod(texExpBiasNeg2, float4(pos.xy + dir2.xy, 0.0, 0.0));
+ float4 rgbyP2 = tex2Dlod(texExpBiasNeg2, float4(pos.xy + dir2.zw, 0.0, 0.0));
+/*--------------------------------------------------------------------------*/
+ half4 rgbyA = rgbyN1 + rgbyP1;
+ half4 rgbyB = rgbyN2 + rgbyP2 * 0.5 + rgbyA;
+/*--------------------------------------------------------------------------*/
+ float4 rgbyR = ((rgbyB.w - lumaMax) > 0.0) ? rgbyA : rgbyB;
+ rgbyR = ((rgbyB.w - lumaMin) > 0.0) ? rgbyR : rgbyA;
+ return rgbyR; }
+/*==========================================================================*/
+#endif
+
+
+
+
+/*============================================================================
+
+ FXAA3 CONSOLE - OPTIMIZED PS3 PIXEL SHADER (NO EARLY EXIT)
+
+==============================================================================
+The code below does not exactly match the assembly.
+I have a feeling that 12 cycles is possible, but was not able to get there.
+Might have to increase register count to get full performance.
+Note this shader does not use perspective interpolation.
+
+Use the following cgc options,
+
+ --fenable-bx2 --fastmath --fastprecision --nofloatbindings
+
+------------------------------------------------------------------------------
+ NVSHADERPERF OUTPUT
+------------------------------------------------------------------------------
+For reference and to aid in debug, output of NVShaderPerf should match this,
+
+Shader to schedule:
+ 0: texpkb h0.w(TRUE), v5.zyxx, #0
+ 2: addh h2.z(TRUE), h0.w, constant(0.001953, 0.000000, 0.000000, 0.000000).x
+ 4: texpkb h0.w(TRUE), v5.xwxx, #0
+ 6: addh h0.z(TRUE), -h2, h0.w
+ 7: texpkb h1.w(TRUE), v5, #0
+ 9: addh h0.x(TRUE), h0.z, -h1.w
+ 10: addh h3.w(TRUE), h0.z, h1
+ 11: texpkb h2.w(TRUE), v5.zwzz, #0
+ 13: addh h0.z(TRUE), h3.w, -h2.w
+ 14: addh h0.x(TRUE), h2.w, h0
+ 15: nrmh h1.xz(TRUE), h0_n
+ 16: minh_m8 h0.x(TRUE), |h1|, |h1.z|
+ 17: maxh h4.w(TRUE), h0, h1
+ 18: divx h2.xy(TRUE), h1_n.xzzw, h0_n
+ 19: movr r1.zw(TRUE), v4.xxxy
+ 20: madr r2.xz(TRUE), -h1, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).zzww, r1.zzww
+ 22: minh h5.w(TRUE), h0, h1
+ 23: texpkb h0(TRUE), r2.xzxx, #0
+ 25: madr r0.zw(TRUE), h1.xzxz, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w), r1
+ 27: maxh h4.x(TRUE), h2.z, h2.w
+ 28: texpkb h1(TRUE), r0.zwzz, #0
+ 30: addh_d2 h1(TRUE), h0, h1
+ 31: madr r0.xy(TRUE), -h2, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz
+ 33: texpkb h0(TRUE), r0, #0
+ 35: minh h4.z(TRUE), h2, h2.w
+ 36: fenct TRUE
+ 37: madr r1.xy(TRUE), h2, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz
+ 39: texpkb h2(TRUE), r1, #0
+ 41: addh_d2 h0(TRUE), h0, h2
+ 42: maxh h2.w(TRUE), h4, h4.x
+ 43: minh h2.x(TRUE), h5.w, h4.z
+ 44: addh_d2 h0(TRUE), h0, h1
+ 45: slth h2.x(TRUE), h0.w, h2
+ 46: sgth h2.w(TRUE), h0, h2
+ 47: movh h0(TRUE), h0
+ 48: addx.c0 rc(TRUE), h2, h2.w
+ 49: movh h0(c0.NE.x), h1
+
+IPU0 ------ Simplified schedule: --------
+Pass | Unit | uOp | PC: Op
+-----+--------+------+-------------------------
+ 1 | SCT0/1 | mov | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;
+ | TEX | txl | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;
+ | SCB1 | add | 2: ADDh h2.z, h0.--w-, const.--x-;
+ | | |
+ 2 | SCT0/1 | mov | 4: TXLr h0.w, g[TEX1].xwxx, const.xxxx, TEX0;
+ | TEX | txl | 4: TXLr h0.w, g[TEX1].xwxx, const.xxxx, TEX0;
+ | SCB1 | add | 6: ADDh h0.z,-h2, h0.--w-;
+ | | |
+ 3 | SCT0/1 | mov | 7: TXLr h1.w, g[TEX1], const.xxxx, TEX0;
+ | TEX | txl | 7: TXLr h1.w, g[TEX1], const.xxxx, TEX0;
+ | SCB0 | add | 9: ADDh h0.x, h0.z---,-h1.w---;
+ | SCB1 | add | 10: ADDh h3.w, h0.---z, h1;
+ | | |
+ 4 | SCT0/1 | mov | 11: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;
+ | TEX | txl | 11: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;
+ | SCB0 | add | 14: ADDh h0.x, h2.w---, h0;
+ | SCB1 | add | 13: ADDh h0.z, h3.--w-,-h2.--w-;
+ | | |
+ 5 | SCT1 | mov | 15: NRMh h1.xz, h0;
+ | SRB | nrm | 15: NRMh h1.xz, h0;
+ | SCB0 | min | 16: MINh*8 h0.x, |h1|, |h1.z---|;
+ | SCB1 | max | 17: MAXh h4.w, h0, h1;
+ | | |
+ 6 | SCT0 | div | 18: DIVx h2.xy, h1.xz--, h0;
+ | SCT1 | mov | 19: MOVr r1.zw, g[TEX0].--xy;
+ | SCB0 | mad | 20: MADr r2.xz,-h1, const.z-w-, r1.z-w-;
+ | SCB1 | min | 22: MINh h5.w, h0, h1;
+ | | |
+ 7 | SCT0/1 | mov | 23: TXLr h0, r2.xzxx, const.xxxx, TEX0;
+ | TEX | txl | 23: TXLr h0, r2.xzxx, const.xxxx, TEX0;
+ | SCB0 | max | 27: MAXh h4.x, h2.z---, h2.w---;
+ | SCB1 | mad | 25: MADr r0.zw, h1.--xz, const, r1;
+ | | |
+ 8 | SCT0/1 | mov | 28: TXLr h1, r0.zwzz, const.xxxx, TEX0;
+ | TEX | txl | 28: TXLr h1, r0.zwzz, const.xxxx, TEX0;
+ | SCB0/1 | add | 30: ADDh/2 h1, h0, h1;
+ | | |
+ 9 | SCT0 | mad | 31: MADr r0.xy,-h2, const.xy--, r1.zw--;
+ | SCT1 | mov | 33: TXLr h0, r0, const.zzzz, TEX0;
+ | TEX | txl | 33: TXLr h0, r0, const.zzzz, TEX0;
+ | SCB1 | min | 35: MINh h4.z, h2, h2.--w-;
+ | | |
+ 10 | SCT0 | mad | 37: MADr r1.xy, h2, const.xy--, r1.zw--;
+ | SCT1 | mov | 39: TXLr h2, r1, const.zzzz, TEX0;
+ | TEX | txl | 39: TXLr h2, r1, const.zzzz, TEX0;
+ | SCB0/1 | add | 41: ADDh/2 h0, h0, h2;
+ | | |
+ 11 | SCT0 | min | 43: MINh h2.x, h5.w---, h4.z---;
+ | SCT1 | max | 42: MAXh h2.w, h4, h4.---x;
+ | SCB0/1 | add | 44: ADDh/2 h0, h0, h1;
+ | | |
+ 12 | SCT0 | set | 45: SLTh h2.x, h0.w---, h2;
+ | SCT1 | set | 46: SGTh h2.w, h0, h2;
+ | SCB0/1 | mul | 47: MOVh h0, h0;
+ | | |
+ 13 | SCT0 | mad | 48: ADDxc0_s rc, h2, h2.w---;
+ | SCB0/1 | mul | 49: MOVh h0(NE0.xxxx), h1;
+
+Pass SCT TEX SCB
+ 1: 0% 100% 25%
+ 2: 0% 100% 25%
+ 3: 0% 100% 50%
+ 4: 0% 100% 50%
+ 5: 0% 0% 50%
+ 6: 100% 0% 75%
+ 7: 0% 100% 75%
+ 8: 0% 100% 100%
+ 9: 0% 100% 25%
+ 10: 0% 100% 100%
+ 11: 50% 0% 100%
+ 12: 50% 0% 100%
+ 13: 25% 0% 100%
+
+MEAN: 17% 61% 67%
+
+Pass SCT0 SCT1 TEX SCB0 SCB1
+ 1: 0% 0% 100% 0% 100%
+ 2: 0% 0% 100% 0% 100%
+ 3: 0% 0% 100% 100% 100%
+ 4: 0% 0% 100% 100% 100%
+ 5: 0% 0% 0% 100% 100%
+ 6: 100% 100% 0% 100% 100%
+ 7: 0% 0% 100% 100% 100%
+ 8: 0% 0% 100% 100% 100%
+ 9: 0% 0% 100% 0% 100%
+ 10: 0% 0% 100% 100% 100%
+ 11: 100% 100% 0% 100% 100%
+ 12: 100% 100% 0% 100% 100%
+ 13: 100% 0% 0% 100% 100%
+
+MEAN: 30% 23% 61% 76% 100%
+Fragment Performance Setup: Driver RSX Compiler, GPU RSX, Flags 0x5
+Results 13 cycles, 3 r regs, 923,076,923 pixels/s
+============================================================================*/
+#if (FXAA_PS3 == 1) && (FXAA_EARLY_EXIT == 0)
+/*--------------------------------------------------------------------------*/
+#pragma disablepc all
+#pragma option O3
+#pragma option OutColorPrec=fp16
+#pragma texformat default RGBA8
+/*==========================================================================*/
+half4 FxaaPixelShader(
+ // {xy} = center of pixel
+ float2 pos,
+ // {xy__} = upper left of pixel
+ // {__zw} = lower right of pixel
+ float4 posPos,
+ // {rgb_} = color in linear or perceptual color space
+ // {___a} = luma in perceptual color space (not linear)
+ sampler2D tex,
+ // This must be from a constant/uniform.
+ // {xy} = rcpFrame not used on PS3
+ float2 rcpFrame,
+ // This must be from a constant/uniform.
+ // {x___} = 2.0/screenWidthInPixels
+ // {_y__} = 2.0/screenHeightInPixels
+ // {__z_} = 0.5/screenWidthInPixels
+ // {___w} = 0.5/screenHeightInPixels
+ float4 rcpFrameOpt
+) {
+/*--------------------------------------------------------------------------*/
+// (1)
+ half4 dir;
+ half4 lumaNe = h4tex2Dlod(tex, half4(posPos.zy, 0, 0));
+ lumaNe.w += half(1.0/512.0);
+ dir.x = -lumaNe.w;
+ dir.z = -lumaNe.w;
+/*--------------------------------------------------------------------------*/
+// (2)
+ half4 lumaSw = h4tex2Dlod(tex, half4(posPos.xw, 0, 0));
+ dir.x += lumaSw.w;
+ dir.z += lumaSw.w;
+/*--------------------------------------------------------------------------*/
+// (3)
+ half4 lumaNw = h4tex2Dlod(tex, half4(posPos.xy, 0, 0));
+ dir.x -= lumaNw.w;
+ dir.z += lumaNw.w;
+/*--------------------------------------------------------------------------*/
+// (4)
+ half4 lumaSe = h4tex2Dlod(tex, half4(posPos.zw, 0, 0));
+ dir.x += lumaSe.w;
+ dir.z -= lumaSe.w;
+/*--------------------------------------------------------------------------*/
+// (5)
+ half4 dir1_pos;
+ dir1_pos.xy = normalize(dir.xyz).xz;
+ half dirAbsMinTimesC = min(abs(dir1_pos.x), abs(dir1_pos.y)) * half(FXAA_CONSOLE__EDGE_SHARPNESS);
+/*--------------------------------------------------------------------------*/
+// (6)
+ half4 dir2_pos;
+ dir2_pos.xy = clamp(dir1_pos.xy / dirAbsMinTimesC, half(-2.0), half(2.0));
+ dir1_pos.zw = pos.xy;
+ dir2_pos.zw = pos.xy;
+ half4 temp1N;
+ temp1N.xy = dir1_pos.zw - dir1_pos.xy * rcpFrameOpt.zw;
+/*--------------------------------------------------------------------------*/
+// (7)
+ temp1N = h4tex2Dlod(tex, half4(temp1N.xy, 0.0, 0.0));
+ half4 rgby1;
+ rgby1.xy = dir1_pos.zw + dir1_pos.xy * rcpFrameOpt.zw;
+/*--------------------------------------------------------------------------*/
+// (8)
+ rgby1 = h4tex2Dlod(tex, half4(rgby1.xy, 0.0, 0.0));
+ rgby1 = (temp1N + rgby1) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (9)
+ half4 temp2N;
+ temp2N.xy = dir2_pos.zw - dir2_pos.xy * rcpFrameOpt.xy;
+ temp2N = h4tex2Dlod(tex, half4(temp2N.xy, 0.0, 0.0));
+/*--------------------------------------------------------------------------*/
+// (10)
+ half4 rgby2;
+ rgby2.xy = dir2_pos.zw + dir2_pos.xy * rcpFrameOpt.xy;
+ rgby2 = h4tex2Dlod(tex, half4(rgby2.xy, 0.0, 0.0));
+ rgby2 = (temp2N + rgby2) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (11)
+ // compilier moves these scalar ops up to other cycles
+ half lumaMin = min(min(lumaNw.w, lumaSw.w), min(lumaNe.w, lumaSe.w));
+ half lumaMax = max(max(lumaNw.w, lumaSw.w), max(lumaNe.w, lumaSe.w));
+ rgby2 = (rgby2 + rgby1) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (12)
+ bool twoTapLt = rgby2.w < lumaMin;
+ bool twoTapGt = rgby2.w > lumaMax;
+/*--------------------------------------------------------------------------*/
+// (13)
+ if(twoTapLt || twoTapGt) rgby2 = rgby1;
+/*--------------------------------------------------------------------------*/
+ return rgby2; }
+/*==========================================================================*/
+#endif
+
+
+
+/*============================================================================
+
+ FXAA3 CONSOLE - OPTIMIZED PS3 PIXEL SHADER (WITH EARLY EXIT)
+
+==============================================================================
+The code mostly matches the assembly.
+I have a feeling that 14 cycles is possible, but was not able to get there.
+Might have to increase register count to get full performance.
+Note this shader does not use perspective interpolation.
+
+Use the following cgc options,
+
+ --fenable-bx2 --fastmath --fastprecision --nofloatbindings
+
+------------------------------------------------------------------------------
+ NVSHADERPERF OUTPUT
+------------------------------------------------------------------------------
+For reference and to aid in debug, output of NVShaderPerf should match this,
+
+Shader to schedule:
+ 0: texpkb h0.w(TRUE), v5.zyxx, #0
+ 2: addh h2.y(TRUE), h0.w, constant(0.001953, 0.000000, 0.000000, 0.000000).x
+ 4: texpkb h1.w(TRUE), v5.xwxx, #0
+ 6: addh h0.x(TRUE), h1.w, -h2.y
+ 7: texpkb h2.w(TRUE), v5.zwzz, #0
+ 9: minh h4.w(TRUE), h2.y, h2
+ 10: maxh h5.x(TRUE), h2.y, h2.w
+ 11: texpkb h0.w(TRUE), v5, #0
+ 13: addh h3.w(TRUE), -h0, h0.x
+ 14: addh h0.x(TRUE), h0.w, h0
+ 15: addh h0.z(TRUE), -h2.w, h0.x
+ 16: addh h0.x(TRUE), h2.w, h3.w
+ 17: minh h5.y(TRUE), h0.w, h1.w
+ 18: nrmh h2.xz(TRUE), h0_n
+ 19: minh_m8 h2.w(TRUE), |h2.x|, |h2.z|
+ 20: divx h4.xy(TRUE), h2_n.xzzw, h2_n.w
+ 21: movr r1.zw(TRUE), v4.xxxy
+ 22: maxh h2.w(TRUE), h0, h1
+ 23: fenct TRUE
+ 24: madr r0.xy(TRUE), -h2.xzzw, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).zwzz, r1.zwzz
+ 26: texpkb h0(TRUE), r0, #0
+ 28: maxh h5.x(TRUE), h2.w, h5
+ 29: minh h5.w(TRUE), h5.y, h4
+ 30: madr r1.xy(TRUE), h2.xzzw, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).zwzz, r1.zwzz
+ 32: texpkb h2(TRUE), r1, #0
+ 34: addh_d2 h2(TRUE), h0, h2
+ 35: texpkb h1(TRUE), v4, #0
+ 37: maxh h5.y(TRUE), h5.x, h1.w
+ 38: minh h4.w(TRUE), h1, h5
+ 39: madr r0.xy(TRUE), -h4, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz
+ 41: texpkb h0(TRUE), r0, #0
+ 43: addh_m8 h5.z(TRUE), h5.y, -h4.w
+ 44: madr r2.xy(TRUE), h4, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz
+ 46: texpkb h3(TRUE), r2, #0
+ 48: addh_d2 h0(TRUE), h0, h3
+ 49: addh_d2 h3(TRUE), h0, h2
+ 50: movh h0(TRUE), h3
+ 51: slth h3.x(TRUE), h3.w, h5.w
+ 52: sgth h3.w(TRUE), h3, h5.x
+ 53: addx.c0 rc(TRUE), h3.x, h3
+ 54: slth.c0 rc(TRUE), h5.z, h5
+ 55: movh h0(c0.NE.w), h2
+ 56: movh h0(c0.NE.x), h1
+
+IPU0 ------ Simplified schedule: --------
+Pass | Unit | uOp | PC: Op
+-----+--------+------+-------------------------
+ 1 | SCT0/1 | mov | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;
+ | TEX | txl | 0: TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;
+ | SCB0 | add | 2: ADDh h2.y, h0.-w--, const.-x--;
+ | | |
+ 2 | SCT0/1 | mov | 4: TXLr h1.w, g[TEX1].xwxx, const.xxxx, TEX0;
+ | TEX | txl | 4: TXLr h1.w, g[TEX1].xwxx, const.xxxx, TEX0;
+ | SCB0 | add | 6: ADDh h0.x, h1.w---,-h2.y---;
+ | | |
+ 3 | SCT0/1 | mov | 7: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;
+ | TEX | txl | 7: TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;
+ | SCB0 | max | 10: MAXh h5.x, h2.y---, h2.w---;
+ | SCB1 | min | 9: MINh h4.w, h2.---y, h2;
+ | | |
+ 4 | SCT0/1 | mov | 11: TXLr h0.w, g[TEX1], const.xxxx, TEX0;
+ | TEX | txl | 11: TXLr h0.w, g[TEX1], const.xxxx, TEX0;
+ | SCB0 | add | 14: ADDh h0.x, h0.w---, h0;
+ | SCB1 | add | 13: ADDh h3.w,-h0, h0.---x;
+ | | |
+ 5 | SCT0 | mad | 16: ADDh h0.x, h2.w---, h3.w---;
+ | SCT1 | mad | 15: ADDh h0.z,-h2.--w-, h0.--x-;
+ | SCB0 | min | 17: MINh h5.y, h0.-w--, h1.-w--;
+ | | |
+ 6 | SCT1 | mov | 18: NRMh h2.xz, h0;
+ | SRB | nrm | 18: NRMh h2.xz, h0;
+ | SCB1 | min | 19: MINh*8 h2.w, |h2.---x|, |h2.---z|;
+ | | |
+ 7 | SCT0 | div | 20: DIVx h4.xy, h2.xz--, h2.ww--;
+ | SCT1 | mov | 21: MOVr r1.zw, g[TEX0].--xy;
+ | SCB1 | max | 22: MAXh h2.w, h0, h1;
+ | | |
+ 8 | SCT0 | mad | 24: MADr r0.xy,-h2.xz--, const.zw--, r1.zw--;
+ | SCT1 | mov | 26: TXLr h0, r0, const.xxxx, TEX0;
+ | TEX | txl | 26: TXLr h0, r0, const.xxxx, TEX0;
+ | SCB0 | max | 28: MAXh h5.x, h2.w---, h5;
+ | SCB1 | min | 29: MINh h5.w, h5.---y, h4;
+ | | |
+ 9 | SCT0 | mad | 30: MADr r1.xy, h2.xz--, const.zw--, r1.zw--;
+ | SCT1 | mov | 32: TXLr h2, r1, const.xxxx, TEX0;
+ | TEX | txl | 32: TXLr h2, r1, const.xxxx, TEX0;
+ | SCB0/1 | add | 34: ADDh/2 h2, h0, h2;
+ | | |
+ 10 | SCT0/1 | mov | 35: TXLr h1, g[TEX0], const.xxxx, TEX0;
+ | TEX | txl | 35: TXLr h1, g[TEX0], const.xxxx, TEX0;
+ | SCB0 | max | 37: MAXh h5.y, h5.-x--, h1.-w--;
+ | SCB1 | min | 38: MINh h4.w, h1, h5;
+ | | |
+ 11 | SCT0 | mad | 39: MADr r0.xy,-h4, const.xy--, r1.zw--;
+ | SCT1 | mov | 41: TXLr h0, r0, const.zzzz, TEX0;
+ | TEX | txl | 41: TXLr h0, r0, const.zzzz, TEX0;
+ | SCB0 | mad | 44: MADr r2.xy, h4, const.xy--, r1.zw--;
+ | SCB1 | add | 43: ADDh*8 h5.z, h5.--y-,-h4.--w-;
+ | | |
+ 12 | SCT0/1 | mov | 46: TXLr h3, r2, const.xxxx, TEX0;
+ | TEX | txl | 46: TXLr h3, r2, const.xxxx, TEX0;
+ | SCB0/1 | add | 48: ADDh/2 h0, h0, h3;
+ | | |
+ 13 | SCT0/1 | mad | 49: ADDh/2 h3, h0, h2;
+ | SCB0/1 | mul | 50: MOVh h0, h3;
+ | | |
+ 14 | SCT0 | set | 51: SLTh h3.x, h3.w---, h5.w---;
+ | SCT1 | set | 52: SGTh h3.w, h3, h5.---x;
+ | SCB0 | set | 54: SLThc0 rc, h5.z---, h5;
+ | SCB1 | add | 53: ADDxc0_s rc, h3.---x, h3;
+ | | |
+ 15 | SCT0/1 | mul | 55: MOVh h0(NE0.wwww), h2;
+ | SCB0/1 | mul | 56: MOVh h0(NE0.xxxx), h1;
+
+Pass SCT TEX SCB
+ 1: 0% 100% 25%
+ 2: 0% 100% 25%
+ 3: 0% 100% 50%
+ 4: 0% 100% 50%
+ 5: 50% 0% 25%
+ 6: 0% 0% 25%
+ 7: 100% 0% 25%
+ 8: 0% 100% 50%
+ 9: 0% 100% 100%
+ 10: 0% 100% 50%
+ 11: 0% 100% 75%
+ 12: 0% 100% 100%
+ 13: 100% 0% 100%
+ 14: 50% 0% 50%
+ 15: 100% 0% 100%
+
+MEAN: 26% 60% 56%
+
+Pass SCT0 SCT1 TEX SCB0 SCB1
+ 1: 0% 0% 100% 100% 0%
+ 2: 0% 0% 100% 100% 0%
+ 3: 0% 0% 100% 100% 100%
+ 4: 0% 0% 100% 100% 100%
+ 5: 100% 100% 0% 100% 0%
+ 6: 0% 0% 0% 0% 100%
+ 7: 100% 100% 0% 0% 100%
+ 8: 0% 0% 100% 100% 100%
+ 9: 0% 0% 100% 100% 100%
+ 10: 0% 0% 100% 100% 100%
+ 11: 0% 0% 100% 100% 100%
+ 12: 0% 0% 100% 100% 100%
+ 13: 100% 100% 0% 100% 100%
+ 14: 100% 100% 0% 100% 100%
+ 15: 100% 100% 0% 100% 100%
+
+MEAN: 33% 33% 60% 86% 80%
+Fragment Performance Setup: Driver RSX Compiler, GPU RSX, Flags 0x5
+Results 15 cycles, 3 r regs, 800,000,000 pixels/s
+============================================================================*/
+#if (FXAA_PS3 == 1) && (FXAA_EARLY_EXIT == 1)
+/*--------------------------------------------------------------------------*/
+#pragma disablepc all
+#pragma option O2
+#pragma option OutColorPrec=fp16
+#pragma texformat default RGBA8
+/*==========================================================================*/
+half4 FxaaPixelShader(
+ // {xy} = center of pixel
+ float2 pos,
+ // {xy__} = upper left of pixel
+ // {__zw} = lower right of pixel
+ float4 posPos,
+ // {rgb_} = color in linear or perceptual color space
+ // {___a} = luma in perceptual color space (not linear)
+ sampler2D tex,
+ // This must be from a constant/uniform.
+ // {xy} = rcpFrame not used on PS3
+ float2 rcpFrame,
+ // This must be from a constant/uniform.
+ // {x___} = 2.0/screenWidthInPixels
+ // {_y__} = 2.0/screenHeightInPixels
+ // {__z_} = 0.5/screenWidthInPixels
+ // {___w} = 0.5/screenHeightInPixels
+ float4 rcpFrameOpt
+) {
+/*--------------------------------------------------------------------------*/
+// (1)
+ half4 rgbyNe = h4tex2Dlod(tex, half4(posPos.zy, 0, 0));
+ half lumaNe = rgbyNe.w + half(1.0/512.0);
+/*--------------------------------------------------------------------------*/
+// (2)
+ half4 lumaSw = h4tex2Dlod(tex, half4(posPos.xw, 0, 0));
+ half lumaSwNegNe = lumaSw.w - lumaNe;
+/*--------------------------------------------------------------------------*/
+// (3)
+ half4 lumaNw = h4tex2Dlod(tex, half4(posPos.xy, 0, 0));
+ half lumaMaxNwSw = max(lumaNw.w, lumaSw.w);
+ half lumaMinNwSw = min(lumaNw.w, lumaSw.w);
+/*--------------------------------------------------------------------------*/
+// (4)
+ half4 lumaSe = h4tex2Dlod(tex, half4(posPos.zw, 0, 0));
+ half dirZ = lumaNw.w + lumaSwNegNe;
+ half dirX = -lumaNw.w + lumaSwNegNe;
+/*--------------------------------------------------------------------------*/
+// (5)
+ half3 dir;
+ dir.y = 0.0;
+ dir.x = lumaSe.w + dirX;
+ dir.z = -lumaSe.w + dirZ;
+ half lumaMinNeSe = min(lumaNe, lumaSe.w);
+/*--------------------------------------------------------------------------*/
+// (6)
+ half4 dir1_pos;
+ dir1_pos.xy = normalize(dir).xz;
+ half dirAbsMinTimes8 = min(abs(dir1_pos.x), abs(dir1_pos.y)) * half(FXAA_CONSOLE__EDGE_SHARPNESS);
+/*--------------------------------------------------------------------------*/
+// (7)
+ half4 dir2_pos;
+ dir2_pos.xy = clamp(dir1_pos.xy / dirAbsMinTimes8, half(-2.0), half(2.0));
+ dir1_pos.zw = pos.xy;
+ dir2_pos.zw = pos.xy;
+ half lumaMaxNeSe = max(lumaNe, lumaSe.w);
+/*--------------------------------------------------------------------------*/
+// (8)
+ half4 temp1N;
+ temp1N.xy = dir1_pos.zw - dir1_pos.xy * rcpFrameOpt.zw;
+ temp1N = h4tex2Dlod(tex, half4(temp1N.xy, 0.0, 0.0));
+ half lumaMax = max(lumaMaxNwSw, lumaMaxNeSe);
+ half lumaMin = min(lumaMinNwSw, lumaMinNeSe);
+/*--------------------------------------------------------------------------*/
+// (9)
+ half4 rgby1;
+ rgby1.xy = dir1_pos.zw + dir1_pos.xy * rcpFrameOpt.zw;
+ rgby1 = h4tex2Dlod(tex, half4(rgby1.xy, 0.0, 0.0));
+ rgby1 = (temp1N + rgby1) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (10)
+ half4 rgbyM = h4tex2Dlod(tex, half4(pos.xy, 0.0, 0.0));
+ half lumaMaxM = max(lumaMax, rgbyM.w);
+ half lumaMinM = min(lumaMin, rgbyM.w);
+/*--------------------------------------------------------------------------*/
+// (11)
+ half4 temp2N;
+ temp2N.xy = dir2_pos.zw - dir2_pos.xy * rcpFrameOpt.xy;
+ temp2N = h4tex2Dlod(tex, half4(temp2N.xy, 0.0, 0.0));
+ half4 rgby2;
+ rgby2.xy = dir2_pos.zw + dir2_pos.xy * rcpFrameOpt.xy;
+ half lumaRangeM = (lumaMaxM - lumaMinM) / FXAA_CONSOLE__EDGE_THRESHOLD;
+/*--------------------------------------------------------------------------*/
+// (12)
+ rgby2 = h4tex2Dlod(tex, half4(rgby2.xy, 0.0, 0.0));
+ rgby2 = (temp2N + rgby2) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (13)
+ rgby2 = (rgby2 + rgby1) * 0.5;
+/*--------------------------------------------------------------------------*/
+// (14)
+ bool twoTapLt = rgby2.w < lumaMin;
+ bool twoTapGt = rgby2.w > lumaMax;
+ bool earlyExit = lumaRangeM < lumaMax;
+ bool twoTap = twoTapLt || twoTapGt;
+/*--------------------------------------------------------------------------*/
+// (15)
+ if(twoTap) rgby2 = rgby1;
+ if(earlyExit) rgby2 = rgbyM;
+/*--------------------------------------------------------------------------*/
+ return rgby2; }
+/*==========================================================================*/
+#endif
+
+
+
+/*============================================================================
+
+ FXAA3 CONSOLE - PC PIXEL SHADER
+
+------------------------------------------------------------------------------
+Using a modified version of the PS3 version here to best target old hardware.
+============================================================================*/
+#if (FXAA_PC_CONSOLE == 1)
+/*--------------------------------------------------------------------------*/
+half4 FxaaPixelShader(
+ // {xy} = center of pixel
+ float2 pos,
+ // {xy__} = upper left of pixel
+ // {__zw} = lower right of pixel
+ float4 posPos,
+ // {rgb_} = color in linear or perceptual color space
+ // {___a} = alpha output is junk value
+ FxaaTex tex,
+ // This must be from a constant/uniform.
+ // {xy} = rcpFrame not used on PC version of FXAA Console
+ float2 rcpFrame,
+ // This must be from a constant/uniform.
+ // {x___} = 2.0/screenWidthInPixels
+ // {_y__} = 2.0/screenHeightInPixels
+ // {__z_} = 0.5/screenWidthInPixels
+ // {___w} = 0.5/screenHeightInPixels
+ float4 rcpFrameOpt
+) {
+/*--------------------------------------------------------------------------*/
+ half4 dir;
+ dir.y = 0.0;
+ half4 lumaNe = FxaaTexTop(tex, posPos.zy);
+ lumaNe.w += half(1.0/384.0);
+ dir.x = -lumaNe.w;
+ dir.z = -lumaNe.w;
+/*--------------------------------------------------------------------------*/
+ half4 lumaSw = FxaaTexTop(tex, posPos.xw);
+ dir.x += lumaSw.w;
+ dir.z += lumaSw.w;
+/*--------------------------------------------------------------------------*/
+ half4 lumaNw = FxaaTexTop(tex, posPos.xy);
+ dir.x -= lumaNw.w;
+ dir.z += lumaNw.w;
+/*--------------------------------------------------------------------------*/
+ half4 lumaSe = FxaaTexTop(tex, posPos.zw);
+ dir.x += lumaSe.w;
+ dir.z -= lumaSe.w;
+/*==========================================================================*/
+ #if (FXAA_EARLY_EXIT == 1)
+ half4 rgbyM = FxaaTexTop(tex, pos.xy);
+/*--------------------------------------------------------------------------*/
+ half lumaMin = min(min(lumaNw.w, lumaSw.w), min(lumaNe.w, lumaSe.w));
+ half lumaMax = max(max(lumaNw.w, lumaSw.w), max(lumaNe.w, lumaSe.w));
+/*--------------------------------------------------------------------------*/
+ half lumaMinM = min(lumaMin, rgbyM.w);
+ half lumaMaxM = max(lumaMax, rgbyM.w);
+/*--------------------------------------------------------------------------*/
+ if((lumaMaxM - lumaMinM) < max(FXAA_CONSOLE__EDGE_THRESHOLD_MIN, lumaMax * FXAA_CONSOLE__EDGE_THRESHOLD))
+ #if (FXAA_DISCARD == 1)
+ FxaaDiscard;
+ #else
+ return rgbyM;
+ #endif
+ #endif
+/*==========================================================================*/
+ half4 dir1_pos;
+ dir1_pos.xy = normalize(dir.xyz).xz;
+ half dirAbsMinTimesC = min(abs(dir1_pos.x), abs(dir1_pos.y)) * half(FXAA_CONSOLE__EDGE_SHARPNESS);
+/*--------------------------------------------------------------------------*/
+ half4 dir2_pos;
+ dir2_pos.xy = clamp(dir1_pos.xy / dirAbsMinTimesC, half(-2.0), half(2.0));
+ dir1_pos.zw = pos.xy;
+ dir2_pos.zw = pos.xy;
+ half4 temp1N;
+ temp1N.xy = dir1_pos.zw - dir1_pos.xy * rcpFrameOpt.zw;
+/*--------------------------------------------------------------------------*/
+ temp1N = FxaaTexTop(tex, temp1N.xy);
+ half4 rgby1;
+ rgby1.xy = dir1_pos.zw + dir1_pos.xy * rcpFrameOpt.zw;
+/*--------------------------------------------------------------------------*/
+ rgby1 = FxaaTexTop(tex, rgby1.xy);
+ rgby1 = (temp1N + rgby1) * 0.5;
+/*--------------------------------------------------------------------------*/
+ half4 temp2N;
+ temp2N.xy = dir2_pos.zw - dir2_pos.xy * rcpFrameOpt.xy;
+ temp2N = FxaaTexTop(tex, temp2N.xy);
+/*--------------------------------------------------------------------------*/
+ half4 rgby2;
+ rgby2.xy = dir2_pos.zw + dir2_pos.xy * rcpFrameOpt.xy;
+ rgby2 = FxaaTexTop(tex, rgby2.xy);
+ rgby2 = (temp2N + rgby2) * 0.5;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_EARLY_EXIT == 0)
+ half lumaMin = min(min(lumaNw.w, lumaSw.w), min(lumaNe.w, lumaSe.w));
+ half lumaMax = max(max(lumaNw.w, lumaSw.w), max(lumaNe.w, lumaSe.w));
+ #endif
+ rgby2 = (rgby2 + rgby1) * 0.5;
+/*--------------------------------------------------------------------------*/
+ bool twoTapLt = rgby2.w < lumaMin;
+ bool twoTapGt = rgby2.w > lumaMax;
+/*--------------------------------------------------------------------------*/
+ if(twoTapLt || twoTapGt) rgby2 = rgby1;
+/*--------------------------------------------------------------------------*/
+ return rgby2; }
+/*==========================================================================*/
+#endif
+
+
+
+/*============================================================================
+
+ FXAA3 QUALITY - PC
+
+============================================================================*/
+#if (FXAA_PC == 1)
+/*--------------------------------------------------------------------------*/
+float4 FxaaPixelShader(
+ // {xy} = center of pixel
+ float2 pos,
+ // {xyzw} = not used on FXAA3 Quality
+ float4 posPos,
+ // {rgb_} = color in linear or perceptual color space
+ // {___a} = luma in perceptual color space (not linear)
+ FxaaTex tex,
+ // This must be from a constant/uniform.
+ // {x_} = 1.0/screenWidthInPixels
+ // {_y} = 1.0/screenHeightInPixels
+ float2 rcpFrame,
+ // {xyzw} = not used on FXAA3 Quality
+ float4 rcpFrameOpt
+) {
+/*--------------------------------------------------------------------------*/
+ float2 posM;
+ posM.x = pos.x;
+ posM.y = pos.y;
+ #if (FXAA_GATHER4_ALPHA == 1)
+ #if (FXAA_DISCARD == 0)
+ float4 rgbyM = FxaaTexTop(tex, posM);
+ #define lumaM rgbyM.w
+ #endif
+ float4 luma4A = FxaaTexAlpha4(tex, posM, rcpFrame.xy);
+ float4 luma4B = FxaaTexOffAlpha4(tex, posM, FxaaInt2(-1, -1), rcpFrame.xy);
+ #if (FXAA_DISCARD == 1)
+ #define lumaM luma4A.w
+ #endif
+ #define lumaE luma4A.z
+ #define lumaS luma4A.x
+ #define lumaSE luma4A.y
+ #define lumaNW luma4B.w
+ #define lumaN luma4B.z
+ #define lumaW luma4B.x
+ #else
+ float4 rgbyM = FxaaTexTop(tex, posM);
+ #define lumaM rgbyM.w
+ float lumaS = FxaaTexOff(tex, posM, FxaaInt2( 0, 1), rcpFrame.xy).w;
+ float lumaE = FxaaTexOff(tex, posM, FxaaInt2( 1, 0), rcpFrame.xy).w;
+ float lumaN = FxaaTexOff(tex, posM, FxaaInt2( 0,-1), rcpFrame.xy).w;
+ float lumaW = FxaaTexOff(tex, posM, FxaaInt2(-1, 0), rcpFrame.xy).w;
+ #endif
+/*--------------------------------------------------------------------------*/
+ float maxSM = max(lumaS, lumaM);
+ float minSM = min(lumaS, lumaM);
+ float maxESM = max(lumaE, maxSM);
+ float minESM = min(lumaE, minSM);
+ float maxWN = max(lumaN, lumaW);
+ float minWN = min(lumaN, lumaW);
+ float rangeMax = max(maxWN, maxESM);
+ float rangeMin = min(minWN, minESM);
+ float rangeMaxScaled = rangeMax * FXAA_QUALITY__EDGE_THRESHOLD;
+ float range = rangeMax - rangeMin;
+ float rangeMaxClamped = max(FXAA_QUALITY__EDGE_THRESHOLD_MIN, rangeMaxScaled);
+ bool earlyExit = range < rangeMaxClamped;
+/*--------------------------------------------------------------------------*/
+ if(earlyExit)
+ #if (FXAA_DISCARD == 1)
+ FxaaDiscard;
+ #else
+ return rgbyM;
+ #endif
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_GATHER4_ALPHA == 0)
+ float lumaNW = FxaaTexOff(tex, posM, FxaaInt2(-1,-1), rcpFrame.xy).w;
+ float lumaSE = FxaaTexOff(tex, posM, FxaaInt2( 1, 1), rcpFrame.xy).w;
+ float lumaNE = FxaaTexOff(tex, posM, FxaaInt2( 1,-1), rcpFrame.xy).w;
+ float lumaSW = FxaaTexOff(tex, posM, FxaaInt2(-1, 1), rcpFrame.xy).w;
+ #else
+ float lumaNE = FxaaTexOff(tex, posM, FxaaInt2(1, -1), rcpFrame.xy).w;
+ float lumaSW = FxaaTexOff(tex, posM, FxaaInt2(-1, 1), rcpFrame.xy).w;
+ #endif
+/*--------------------------------------------------------------------------*/
+ float lumaNS = lumaN + lumaS;
+ float lumaWE = lumaW + lumaE;
+ float subpixRcpRange = 1.0/range;
+ float subpixNSWE = lumaNS + lumaWE;
+ float edgeHorz1 = (-2.0 * lumaM) + lumaNS;
+ float edgeVert1 = (-2.0 * lumaM) + lumaWE;
+/*--------------------------------------------------------------------------*/
+ float lumaNESE = lumaNE + lumaSE;
+ float lumaNWNE = lumaNW + lumaNE;
+ float edgeHorz2 = (-2.0 * lumaE) + lumaNESE;
+ float edgeVert2 = (-2.0 * lumaN) + lumaNWNE;
+/*--------------------------------------------------------------------------*/
+ float lumaNWSW = lumaNW + lumaSW;
+ float lumaSWSE = lumaSW + lumaSE;
+ float edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2);
+ float edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2);
+ float edgeHorz3 = (-2.0 * lumaW) + lumaNWSW;
+ float edgeVert3 = (-2.0 * lumaS) + lumaSWSE;
+ float edgeHorz = abs(edgeHorz3) + edgeHorz4;
+ float edgeVert = abs(edgeVert3) + edgeVert4;
+/*--------------------------------------------------------------------------*/
+ float subpixNWSWNESE = lumaNWSW + lumaNESE;
+ float lengthSign = rcpFrame.x;
+ bool horzSpan = edgeHorz >= edgeVert;
+ float subpixA = subpixNSWE * 2.0 + subpixNWSWNESE;
+/*--------------------------------------------------------------------------*/
+ if(!horzSpan) lumaN = lumaW;
+ if(!horzSpan) lumaS = lumaE;
+ if(horzSpan) lengthSign = rcpFrame.y;
+ float subpixB = (subpixA * (1.0/12.0)) - lumaM;
+/*--------------------------------------------------------------------------*/
+ float gradientN = lumaN - lumaM;
+ float gradientS = lumaS - lumaM;
+ float lumaNN = lumaN + lumaM;
+ float lumaSS = lumaS + lumaM;
+ bool pairN = abs(gradientN) >= abs(gradientS);
+ float gradient = max(abs(gradientN), abs(gradientS));
+ if(pairN) lengthSign = -lengthSign;
+ float subpixC = FxaaSat(abs(subpixB) * subpixRcpRange);
+/*--------------------------------------------------------------------------*/
+ float2 posB;
+ posB.x = posM.x;
+ posB.y = posM.y;
+ float2 offNP;
+ offNP.x = (!horzSpan) ? 0.0 : rcpFrame.x;
+ offNP.y = ( horzSpan) ? 0.0 : rcpFrame.y;
+ if(!horzSpan) posB.x += lengthSign * 0.5;
+ if( horzSpan) posB.y += lengthSign * 0.5;
+/*--------------------------------------------------------------------------*/
+ float2 posN;
+ posN.x = posB.x - offNP.x * FXAA_QUALITY__P0;
+ posN.y = posB.y - offNP.y * FXAA_QUALITY__P0;
+ float2 posP;
+ posP.x = posB.x + offNP.x * FXAA_QUALITY__P0;
+ posP.y = posB.y + offNP.y * FXAA_QUALITY__P0;
+ float subpixD = ((-2.0)*subpixC) + 3.0;
+ float lumaEndN = FxaaTexTop(tex, posN).w;
+ float subpixE = subpixC * subpixC;
+ float lumaEndP = FxaaTexTop(tex, posP).w;
+/*--------------------------------------------------------------------------*/
+ if(!pairN) lumaNN = lumaSS;
+ float gradientScaled = gradient * 1.0/4.0;
+ float lumaMM = lumaM - lumaNN * 0.5;
+ float subpixF = subpixD * subpixE;
+ bool lumaMLTZero = lumaMM < 0.0;
+/*--------------------------------------------------------------------------*/
+ lumaEndN -= lumaNN * 0.5;
+ lumaEndP -= lumaNN * 0.5;
+ bool doneN = abs(lumaEndN) >= gradientScaled;
+ bool doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P1;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P1;
+ bool doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P1;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P1;
+/*--------------------------------------------------------------------------*/
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaTexTop(tex, posN.xy).w;
+ if(!doneP) lumaEndP = FxaaTexTop(tex, posP.xy).w;
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P2;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P2;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P2;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P2;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 3)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaTexTop(tex, posN.xy).w;
+ if(!doneP) lumaEndP = FxaaTexTop(tex, posP.xy).w;
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P3;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P3;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P3;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P3;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 4)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaTexTop(tex, posN.xy).w;
+ if(!doneP) lumaEndP = FxaaTexTop(tex, posP.xy).w;
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P4;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P4;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P4;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P4;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 5)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaTexTop(tex, posN.xy).w;
+ if(!doneP) lumaEndP = FxaaTexTop(tex, posP.xy).w;
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P5;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P5;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P5;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P5;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 6)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaTexTop(tex, posN.xy).w;
+ if(!doneP) lumaEndP = FxaaTexTop(tex, posP.xy).w;
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P6;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P6;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P6;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P6;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 7)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaTexTop(tex, posN.xy).w;
+ if(!doneP) lumaEndP = FxaaTexTop(tex, posP.xy).w;
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P7;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P7;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P7;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P7;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 8)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaTexTop(tex, posN.xy).w;
+ if(!doneP) lumaEndP = FxaaTexTop(tex, posP.xy).w;
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P8;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P8;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P8;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P8;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 9)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaTexTop(tex, posN.xy).w;
+ if(!doneP) lumaEndP = FxaaTexTop(tex, posP.xy).w;
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P9;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P9;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P9;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P9;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 10)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaTexTop(tex, posN.xy).w;
+ if(!doneP) lumaEndP = FxaaTexTop(tex, posP.xy).w;
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P10;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P10;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P10;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P10;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 11)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaTexTop(tex, posN.xy).w;
+ if(!doneP) lumaEndP = FxaaTexTop(tex, posP.xy).w;
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P11;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P11;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P11;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P11;
+/*--------------------------------------------------------------------------*/
+ #if (FXAA_QUALITY__PS > 12)
+ if(doneNP) {
+ if(!doneN) lumaEndN = FxaaTexTop(tex, posN.xy).w;
+ if(!doneP) lumaEndP = FxaaTexTop(tex, posP.xy).w;
+ if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;
+ if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;
+ doneN = abs(lumaEndN) >= gradientScaled;
+ doneP = abs(lumaEndP) >= gradientScaled;
+ if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P12;
+ if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P12;
+ doneNP = (!doneN) || (!doneP);
+ if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P12;
+ if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P12;
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+ #endif
+/*--------------------------------------------------------------------------*/
+ }
+/*--------------------------------------------------------------------------*/
+ float dstN = posM.x - posN.x;
+ float dstP = posP.x - posM.x;
+ if(!horzSpan) dstN = posM.y - posN.y;
+ if(!horzSpan) dstP = posP.y - posM.y;
+/*--------------------------------------------------------------------------*/
+ bool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero;
+ float spanLength = (dstP + dstN);
+ bool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero;
+ float spanLengthRcp = 1.0/spanLength;
+/*--------------------------------------------------------------------------*/
+ bool directionN = dstN < dstP;
+ float dst = min(dstN, dstP);
+ bool goodSpan = directionN ? goodSpanN : goodSpanP;
+ float subpixG = subpixF * subpixF;
+ float pixelOffset = (dst * (-spanLengthRcp)) + 0.5;
+ float subpixH = subpixG * FXAA_QUALITY__SUBPIX;
+/*--------------------------------------------------------------------------*/
+ float pixelOffsetGood = goodSpan ? pixelOffset : 0.0;
+ float pixelOffsetSubpix = max(pixelOffsetGood, subpixH);
+ if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign;
+ if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign;
+ #if (FXAA_DISCARD == 1)
+ return FxaaTexTop(tex, posM);
+ #else
+ return float4(FxaaTexTop(tex, posM).xyz, lumaM);
+ #endif
+}
+/*==========================================================================*/
+#endif
+
+PS_OUTPUT ps_main(PS_INPUT input)
+{
+ PS_OUTPUT output;
+
+ float2 pos = input.t;
+ float4 posPos = (float4)0;
+
+ FxaaTex tex;
+
+ #if SHADER_MODEL >= 0x400
+
+ tex.tex = Texture;
+ tex.smpl = TextureSampler;
+
+ #else
+
+ tex = Texture;
+
+ #endif
+
+ output.c = FxaaPixelShader(pos, posPos, tex, _rcpFrame.xy, _rcpFrameOpt);
+
+ return output;
+}
+
+#endif
diff --git a/plugins/GSdx/res/shadeboost.fx b/plugins/GSdx/res/shadeboost.fx
new file mode 100644
index 000000000..5f3c2474a
--- /dev/null
+++ b/plugins/GSdx/res/shadeboost.fx
@@ -0,0 +1,76 @@
+#ifdef SHADER_MODEL // make safe to include in resource file to enforce dependency
+
+/*
+** Contrast, saturation, brightness
+** Code of this function is from TGM's shader pack
+** http://irrlicht.sourceforge.net/phpBB2/viewtopic.php?t=21057
+*/
+
+// For all settings: 1.0 = 100% 0.5=50% 1.5 = 150%
+float4 ContrastSaturationBrightness(float4 color) // Ported to HLSL
+{
+ const float sat = SB_SATURATION / 50.0;
+ const float brt = SB_BRIGHTNESS / 50.0;
+ const float con = SB_CONTRAST / 50.0;
+
+ // Increase or decrease theese values to adjust r, g and b color channels seperately
+ const float AvgLumR = 0.5;
+ const float AvgLumG = 0.5;
+ const float AvgLumB = 0.5;
+
+ const float3 LumCoeff = float3(0.2125, 0.7154, 0.0721);
+
+ float3 AvgLumin = float3(AvgLumR, AvgLumG, AvgLumB);
+ float3 brtColor = color.rgb * brt;
+ float3 intensity = dot(brtColor, LumCoeff);
+ float3 satColor = lerp(intensity, brtColor, sat);
+ float3 conColor = lerp(AvgLumin, satColor, con);
+
+ color.rgb = conColor;
+ return color;
+}
+
+#if SHADER_MODEL >= 0x400
+
+Texture2D Texture;
+SamplerState Sampler;
+
+cbuffer cb0
+{
+ float4 BGColor;
+};
+
+struct PS_INPUT
+{
+ float4 p : SV_Position;
+ float2 t : TEXCOORD0;
+};
+
+float4 ps_main(PS_INPUT input) : SV_Target0
+{
+ float4 c = Texture.Sample(Sampler, input.t);
+ return ContrastSaturationBrightness(c);
+}
+
+
+#elif SHADER_MODEL <= 0x300
+
+sampler Texture : register(s0);
+
+float4 g_params[1];
+
+#define BGColor (g_params[0])
+
+struct PS_INPUT
+{
+ float2 t : TEXCOORD0;
+};
+
+float4 ps_main(PS_INPUT input) : COLOR
+{
+ float4 c = tex2D(Texture, input.t);
+ return ContrastSaturationBrightness(c);
+}
+
+#endif
+#endif
\ No newline at end of file
diff --git a/plugins/GSdx/res/tfx.fx b/plugins/GSdx/res/tfx.fx
index 2372bbf1d..a1ba306cd 100644
--- a/plugins/GSdx/res/tfx.fx
+++ b/plugins/GSdx/res/tfx.fx
@@ -36,6 +36,7 @@
#define PS_LTF 1
#define PS_COLCLIP 0
#define PS_DATE 0
+#define PS_SPRITEHACK 0
#endif
struct VS_INPUT
@@ -411,7 +412,7 @@ float4 sample(float2 st, float q)
}
if(PS_LTF)
- {
+ {
t = lerp(lerp(c[0], c[1], dd.x), lerp(c[2], c[3], dd.x), dd.y);
}
else
@@ -515,14 +516,19 @@ void atst(float4 c)
{
// nothing to do
}
- else if(PS_ATST == 2 || PS_ATST == 3) // l, le
+ else if(PS_ATST == 2) // l
+ {
+ #if PS_SPRITEHACK == 0
+ clip(AREF - a);
+ #endif
+ }
+ else if(PS_ATST == 3) // le
{
clip(AREF - a);
}
else if(PS_ATST == 4) // e
{
- clip(0.5f - abs(a - AREF));
- }
+ clip(0.5f - abs(a - AREF)); }
else if(PS_ATST == 5 || PS_ATST == 6) // ge, g
{
clip(a - AREF);
@@ -750,7 +756,7 @@ VS_OUTPUT vs_main(VS_INPUT input)
{
if(VS_FST)
{
- output.t.xy = input.t * TextureScale;
+ output.t.xy = input.t * TextureScale;
output.t.w = 1.0f;
}
else
diff --git a/plugins/GSdx/resource.h b/plugins/GSdx/resource.h
index b3e8f0207..3cf1d4c3e 100644
--- a/plugins/GSdx/resource.h
+++ b/plugins/GSdx/resource.h
@@ -1,3 +1,7 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by GSdx.rc
+//
/*
* Copyright (C) 2007-2009 Gabest
* http://www.gabest.org
@@ -19,10 +23,6 @@
*
*/
-//{{NO_DEPENDENCIES}}
-// Microsoft Visual C++ generated include file.
-// Used by GSdx.rc
-//
#define IDC_NATIVERES 2001
#define IDC_VSYNC 2002
#define IDC_PALTEX 2003
@@ -74,6 +74,24 @@
#define IDC_USERHACKS 2047
#define IDC_SKIPDRAWHACKEDIT 2048
#define IDC_STATIC10 2049
+#define IDC_HACKDISABLED 2050
+#define IDC_SPRITEHACK 2051
+#define IDRESET 2052
+#define IDC_SATURATION_SLIDER 2053
+#define IDC_BRIGHTNESS_SLIDER 2055
+#define IDC_CONTRAST_SLIDER 2056
+#define IDC_SHADEBUTTON 2058
+#define IDC_SHADEBOOST 2059
+#define IDC_HACKS_ENABLED 2060
+#define IDC_SATURATION_TEXT 2061
+#define IDC_BRIGHTNESS_TEXT 2062
+#define IDC_CONTRAST_TEXT 2063
+#define IDC_MSAACB 2070
+#define IDC_HACKSBUTTON 2071
+#define IDC_WILDHACK 2072
+#define IDC_HACK_DESCRIPTION 2073
+#define IDC_STATIC_MSAA 2074
+#define IDC_STATIC_SKIPDRAW 2075
#define IDC_COLORSPACE 3000
#define IDR_CONVERT_FX 10000
#define IDR_TFX_FX 10001
@@ -81,15 +99,18 @@
#define IDR_INTERLACE_FX 10003
#define IDD_CONFIG2 10004
#define IDR_FXAA_FX 10005
-#define IDR_CS_FX 10006
+#define IDR_CS_FX 10006
+#define IDD_SHADEBOOST 10007
+#define IDR_SHADEBOOST_FX 10009
+#define IDD_HACKS 10011
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 10007
+#define _APS_NEXT_RESOURCE_VALUE 10012
#define _APS_NEXT_COMMAND_VALUE 32771
-#define _APS_NEXT_CONTROL_VALUE 2050
+#define _APS_NEXT_CONTROL_VALUE 2076
#define _APS_NEXT_SYMED_VALUE 5000
#endif
#endif
diff --git a/plugins/GSdx/stdafx.cpp b/plugins/GSdx/stdafx.cpp
index 9e45478e6..425f0d196 100644
--- a/plugins/GSdx/stdafx.cpp
+++ b/plugins/GSdx/stdafx.cpp
@@ -74,6 +74,7 @@ void vmfree(void* ptr, size_t size)
#else
#include
+#include
void* vmalloc(size_t size, bool code)
{
diff --git a/plugins/GSnull/CMakeLists.txt b/plugins/GSnull/CMakeLists.txt
index 3ca4b35ff..15bfa9a87 100644
--- a/plugins/GSnull/CMakeLists.txt
+++ b/plugins/GSnull/CMakeLists.txt
@@ -94,6 +94,14 @@ add_library(${Output} SHARED
${GSnullLinuxSources}
${GSnullLinuxHeaders})
+if(Linux)
+ # link target with gtk2
+ target_link_libraries(${Output} ${GTK2_LIBRARIES})
+endif(Linux)
+
+# link target with X11
+target_link_libraries(${Output} ${X11_LIBRARIES})
+
# User flags options
if(NOT USER_CMAKE_LD_FLAGS STREQUAL "")
target_link_libraries(${Output} "${USER_CMAKE_LD_FLAGS}")
diff --git a/plugins/LilyPad/LilyPad.cpp b/plugins/LilyPad/LilyPad.cpp
index 7a52f656e..72bf53b5d 100644
--- a/plugins/LilyPad/LilyPad.cpp
+++ b/plugins/LilyPad/LilyPad.cpp
@@ -1428,7 +1428,13 @@ struct PadPluginFreezeData {
};
s32 CALLBACK PADfreeze(int mode, freezeData *data) {
- if (mode == FREEZE_SIZE) {
+ if (!data)
+ {
+ printf("LilyPad savestate null pointer!\n");
+ return -1;
+ }
+
+ if (mode == FREEZE_SIZE) {
data->size = sizeof(PadPluginFreezeData);
}
else if (mode == FREEZE_LOAD) {
diff --git a/plugins/PadNull/CMakeLists.txt b/plugins/PadNull/CMakeLists.txt
index 6c454922a..2cba99fd5 100644
--- a/plugins/PadNull/CMakeLists.txt
+++ b/plugins/PadNull/CMakeLists.txt
@@ -77,6 +77,14 @@ add_library(${Output} SHARED
${PadNullLinuxSources}
${PadNullLinuxHeaders})
+if(Linux)
+ # link target with gtk2
+ target_link_libraries(${Output} ${GTK2_LIBRARIES})
+endif(Linux)
+
+# link target with X11
+target_link_libraries(${Output} ${X11_LIBRARIES})
+
# User flags options
if(NOT USER_CMAKE_LD_FLAGS STREQUAL "")
target_link_libraries(${Output} "${USER_CMAKE_LD_FLAGS}")
diff --git a/plugins/SPU2null/CMakeLists.txt b/plugins/SPU2null/CMakeLists.txt
index 8c1c1eb6e..08271ef5f 100644
--- a/plugins/SPU2null/CMakeLists.txt
+++ b/plugins/SPU2null/CMakeLists.txt
@@ -74,6 +74,11 @@ add_library(${Output} SHARED
${SPU2nullLinuxSources}
${SPU2nullLinuxHeaders})
+if(Linux)
+ # link target with gtk2
+ target_link_libraries(${Output} ${GTK2_LIBRARIES})
+endif(Linux)
+
# User flags options
if(NOT USER_CMAKE_LD_FLAGS STREQUAL "")
target_link_libraries(${Output} "${USER_CMAKE_LD_FLAGS}")
diff --git a/plugins/USBnull/CMakeLists.txt b/plugins/USBnull/CMakeLists.txt
index cec09e425..55cfa8aef 100644
--- a/plugins/USBnull/CMakeLists.txt
+++ b/plugins/USBnull/CMakeLists.txt
@@ -76,6 +76,11 @@ add_library(${Output} SHARED
${USBnullLinuxSources}
${USBnullLinuxHeaders})
+if(Linux)
+ # link target with gtk2
+ target_link_libraries(${Output} ${GTK2_LIBRARIES})
+endif(Linux)
+
# User flags options
if(NOT USER_CMAKE_LD_FLAGS STREQUAL "")
target_link_libraries(${Output} "${USER_CMAKE_LD_FLAGS}")
diff --git a/plugins/dev9null/CMakeLists.txt b/plugins/dev9null/CMakeLists.txt
index e21929d0f..3d53e8121 100644
--- a/plugins/dev9null/CMakeLists.txt
+++ b/plugins/dev9null/CMakeLists.txt
@@ -73,6 +73,11 @@ add_library(${Output} SHARED
${dev9nullLinuxSources}
${dev9nullLinuxHeaders})
+if(Linux)
+ # link target with gtk2
+ target_link_libraries(${Output} ${GTK2_LIBRARIES})
+endif(Linux)
+
# User flags options
if(NOT USER_CMAKE_LD_FLAGS STREQUAL "")
target_link_libraries(${Output} "${USER_CMAKE_LD_FLAGS}")
diff --git a/plugins/onepad/CMakeLists.txt b/plugins/onepad/CMakeLists.txt
index 12247e384..4f24cb52c 100644
--- a/plugins/onepad/CMakeLists.txt
+++ b/plugins/onepad/CMakeLists.txt
@@ -85,6 +85,14 @@ add_library(${Output} SHARED
# link target with SDL
target_link_libraries(${Output} ${SDL_LIBRARY})
+if(Linux)
+ # link target with gtk2
+ target_link_libraries(${Output} ${GTK2_LIBRARIES})
+endif(Linux)
+
+# link target with X11
+target_link_libraries(${Output} ${X11_LIBRARIES})
+
# User flags options
if(NOT USER_CMAKE_LD_FLAGS STREQUAL "")
target_link_libraries(${Output} "${USER_CMAKE_LD_FLAGS}")
diff --git a/plugins/spu2-x/src/ADSR.cpp b/plugins/spu2-x/src/ADSR.cpp
index c4eb4b00d..0e902bd53 100644
--- a/plugins/spu2-x/src/ADSR.cpp
+++ b/plugins/spu2-x/src/ADSR.cpp
@@ -196,21 +196,23 @@ void V_VolumeSlide::Update()
if( Increment == 0x7f ) return;
+ s32 value = abs(Value);
+
if (Mode & VOLFLAG_DECREMENT)
{
// Decrement
if(Mode & VOLFLAG_EXPONENTIAL)
{
- u32 off = InvExpOffsets[(Value>>28)&7];
- Value -= PsxRates[(Increment^0x7f)-0x1b+off+32];
+ u32 off = InvExpOffsets[(value>>28)&7];
+ value -= PsxRates[(Increment^0x7f)-0x1b+off+32];
}
else
- Value -= PsxRates[(Increment^0x7f)-0xf+32];
+ value -= PsxRates[(Increment^0x7f)-0xf+32];
- if (Value < 0)
+ if (value < 0)
{
- Value = 0;
+ value = 0;
Mode = 0; // disable slide
}
}
@@ -220,16 +222,18 @@ void V_VolumeSlide::Update()
// Pseudo-exponential increments, as done by the SPU2 (really!)
// Above 75% slides slow, below 75% slides fast. It's exponential, pseudo'ly speaking.
- if( (Mode & VOLFLAG_EXPONENTIAL) && (Value>=0x60000000))
- Value += PsxRates[(Increment^0x7f)-0x18+32];
+ if( (Mode & VOLFLAG_EXPONENTIAL) && (value>=0x60000000))
+ value += PsxRates[(Increment^0x7f)-0x18+32];
else
// linear / Pseudo below 75% (they're the same)
- Value += PsxRates[(Increment^0x7f)-0x10+32];
+ value += PsxRates[(Increment^0x7f)-0x10+32];
- if( Value < 0 ) // wrapped around the "top"?
+ if( value < 0 ) // wrapped around the "top"?
{
- Value = 0x7fffffff;
+ value = 0x7fffffff;
Mode = 0; // disable slide
}
}
+
+ Value = (Value < 0) ? -value : value;
}
diff --git a/plugins/spu2-x/src/CMakeLists.txt b/plugins/spu2-x/src/CMakeLists.txt
index 8395a9a88..9d523e6b6 100644
--- a/plugins/spu2-x/src/CMakeLists.txt
+++ b/plugins/spu2-x/src/CMakeLists.txt
@@ -121,6 +121,11 @@ target_link_libraries(${Output} ${PORTAUDIO_LIBRARIES})
# link target with SoundTouch
target_link_libraries(${Output} ${SOUNDTOUCH_LIBRARIES})
+if(Linux)
+ # link target with gtk2
+ target_link_libraries(${Output} ${GTK2_LIBRARIES})
+endif(Linux)
+
# User flags options
if(NOT USER_CMAKE_LD_FLAGS STREQUAL "")
target_link_libraries(${Output} "${USER_CMAKE_LD_FLAGS}")
diff --git a/plugins/spu2-x/src/DecodeDPLII.cpp b/plugins/spu2-x/src/DecodeDPLII.cpp
index bd219ca8d..57e89ba3b 100644
--- a/plugins/spu2-x/src/DecodeDPLII.cpp
+++ b/plugins/spu2-x/src/DecodeDPLII.cpp
@@ -5,7 +5,7 @@
*
* This library 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 Foundation; either version 2.1 of the the License, or (at your
+ * Software Foundation; either version 2.1 of the License, or (at your
* option) any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
diff --git a/plugins/spu2-x/src/DplIIdecoder.cpp b/plugins/spu2-x/src/DplIIdecoder.cpp
index afe054679..4fad8137a 100644
--- a/plugins/spu2-x/src/DplIIdecoder.cpp
+++ b/plugins/spu2-x/src/DplIIdecoder.cpp
@@ -1,3 +1,23 @@
+/* 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]
+ *
+ * This library 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 Foundation; either version 2.1 of the License, or (at your
+ * option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License along
+ * with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
#include "Global.h"
static const u8 sLogTable[256] = {
diff --git a/plugins/spu2-x/src/Linux/ConfigSoundTouch.cpp b/plugins/spu2-x/src/Linux/ConfigSoundTouch.cpp
index ccc23215b..d1535fffc 100644
--- a/plugins/spu2-x/src/Linux/ConfigSoundTouch.cpp
+++ b/plugins/spu2-x/src/Linux/ConfigSoundTouch.cpp
@@ -5,7 +5,7 @@
*
* This library 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 Foundation; either version 2.1 of the the License, or (at your
+ * Software Foundation; either version 2.1 of the License, or (at your
* option) any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
diff --git a/plugins/spu2-x/src/PS2E-spu2.cpp b/plugins/spu2-x/src/PS2E-spu2.cpp
index bfdb9e848..eeba13ebf 100644
--- a/plugins/spu2-x/src/PS2E-spu2.cpp
+++ b/plugins/spu2-x/src/PS2E-spu2.cpp
@@ -656,6 +656,13 @@ EXPORT_C_(int) SPU2setupRecording(int start, void* pData)
EXPORT_C_(s32) SPU2freeze(int mode, freezeData *data)
{
+ jASSUME( data != NULL );
+ if ( !data )
+ {
+ printf("SPU2-X savestate null pointer!\n");
+ return -1;
+ }
+
if( mode == FREEZE_SIZE )
{
data->size = Savestate::SizeIt();
@@ -663,9 +670,13 @@ EXPORT_C_(s32) SPU2freeze(int mode, freezeData *data)
}
jASSUME( mode == FREEZE_LOAD || mode == FREEZE_SAVE );
- jASSUME( data != NULL );
- if( data->data == NULL ) return -1;
+ if( data->data == NULL )
+ {
+ printf("SPU2-X savestate null pointer!\n");
+ return -1;
+ }
+
Savestate::DataBlock& spud = (Savestate::DataBlock&)*(data->data);
switch( mode )
diff --git a/plugins/spu2-x/src/spu2sys.cpp b/plugins/spu2-x/src/spu2sys.cpp
index ce9b10bd7..84e3c37f7 100644
--- a/plugins/spu2-x/src/spu2sys.cpp
+++ b/plugins/spu2-x/src/spu2sys.cpp
@@ -134,7 +134,7 @@ void V_Core::Init( int index )
if (!c)
{
WetGate.ExtL = 0;
- WetGate.ExtL = 0;
+ WetGate.ExtR = 0;
}
Regs.MMIX = c ? 0xFFC : 0xFF0; // PS2 confirmed (f3c and f30 after BIOS ran, ffc and ff0 after sdinit)
diff --git a/plugins/zzogl-pg-cg/opengl/CMakeLists.txt b/plugins/zzogl-pg-cg/opengl/CMakeLists.txt
new file mode 100644
index 000000000..4b8848766
--- /dev/null
+++ b/plugins/zzogl-pg-cg/opengl/CMakeLists.txt
@@ -0,0 +1,232 @@
+# Check that people use the good file
+if(NOT TOP_CMAKE_WAS_SOURCED)
+ message(FATAL_ERROR "
+ You did not 'cmake' the good CMakeLists.txt file. Use the one in the top dir.
+ It is advice to delete all wrongly generated cmake stuff => CMakeFiles & CMakeCache.txt")
+endif(NOT TOP_CMAKE_WAS_SOURCED)
+
+# Allow to build the shader files
+if(EXISTS "${PROJECT_SOURCE_DIR}/plugins/zzogl-pg/opengl/ZeroGSShaders")
+ add_subdirectory(ZeroGSShaders)
+endif(EXISTS "${PROJECT_SOURCE_DIR}/plugins/zzogl-pg/opengl/ZeroGSShaders")
+
+# plugin name
+set(Output zzogl-cg-0.3.0)
+
+set(CommonFlags
+ -pthread
+ -DZEROGS_SSE2
+ -fno-regmove
+ -fno-strict-aliasing
+ -Wstrict-aliasing # Allow to track strict aliasing issue.
+ -Wunused-variable
+ )
+
+set(OptimizationFlags
+ -O2
+ -DNDEBUG
+ )
+
+# Debug - Build
+if(CMAKE_BUILD_TYPE STREQUAL Debug)
+ # add defines
+ add_definitions(${CommonFlags} -g -Wall -D_DEBUG)
+endif(CMAKE_BUILD_TYPE STREQUAL Debug)
+
+# Devel - Build
+if(CMAKE_BUILD_TYPE STREQUAL Devel)
+ # add defines
+ add_definitions(${CommonFlags} ${OptimizationFlags} -g -W -DZEROGS_DEVBUILD)
+endif(CMAKE_BUILD_TYPE STREQUAL Devel)
+
+# Release - Build
+if(CMAKE_BUILD_TYPE STREQUAL Release)
+ # add defines
+ add_definitions(${CommonFlags} ${OptimizationFlags} -W)
+endif(CMAKE_BUILD_TYPE STREQUAL Release)
+
+# zzogl sources
+set(zzoglSources
+ GifTransfer.cpp
+ GLWin32.cpp
+ GLWinX11.cpp
+ GSDump.cpp
+ GSmain.cpp
+ HostMemory.cpp
+ Mem.cpp
+ # memcpy_amd.cpp
+ Mem_Swizzle.cpp
+ Mem_Tables.cpp
+ Profile.cpp
+ rasterfont.cpp
+ NewRegs.cpp
+ Regs.cpp
+ targets.cpp
+ x86.cpp
+ zerogs.cpp
+ zpipe.cpp
+ ZZClut.cpp
+ ZZHacks.cpp
+ ZZKeyboard.cpp
+ ZZoglDrawing.cpp
+ ZZLog.cpp
+ ZZoglCreate.cpp
+ ZZoglCRTC.cpp
+ ZZoglFlush.cpp
+ ZZoglFlushHack.cpp
+ ZZoglSave.cpp
+ ZZoglShaders.cpp
+ ZZoglShoots.cpp
+ ZZoglVB.cpp
+ )
+
+# zzogl headers
+set(zzoglHeaders
+ common.h
+ CRC.h
+ GifTransfer.h
+ # glprocs.h
+ GS.h
+ GSDump.h
+ HostMemory.h
+ Mem.h
+ Mem_Swizzle.h
+ Mem_Transmit.h
+ Profile.h
+ rasterfont.h
+ NewRegs.h
+ Regs.h
+ targets.h
+ Util.h
+ x86.h
+ zerogs.h
+ zpipe.h
+ ZZClut.h
+ ZZGl.h
+ ZZHacks.h
+ ZZoglDrawing.h
+ ZZLog.h
+ ZZoglCRTC.h
+ ZZoglMath.h
+ ZZoglShaders.h
+ ZZoglShoots.h
+ ZZoglVB.h
+ )
+
+# zzogl S sources
+set(zzoglSSources
+ x86-32.S)
+
+# zzogl shader sources
+set(zzoglShaderSources
+ ctx0/ps2hw_ctx.fx
+ ctx1/ps2hw_ctx.fx)
+
+# zzogl Linux sources
+set(zzoglLinuxSources
+ Linux/Conf.cpp
+ Linux/Linux.cpp)
+
+# zzogl Linux headers
+set(zzoglLinuxHeaders
+ Linux/Linux.h)
+
+# change language of .S-files to c++
+set_source_files_properties(${zzoglSSources} PROPERTIES LANGUAGE CXX)
+
+# add additional include directories
+include_directories(.
+ Linux)
+
+# add library
+add_library(${Output} SHARED
+ ${zzoglSources}
+ ${zzoglHeaders}
+ ${zzoglSSources}
+ ${zzoglShaderSources}
+ ${zzoglLinuxSources}
+ ${zzoglLinuxHeaders})
+
+# Trick that allow to compile zzogl with GSOPEN2 and the replayer with GSOPEN
+set_target_properties(${Output} PROPERTIES COMPILE_DEFINITIONS USE_GSOPEN2)
+
+# link target with project internal libraries
+target_link_libraries(${Output} Utilities)
+
+# link target with Cg
+target_link_libraries(${Output} ${CG_LIBRARIES})
+
+# link target with glew
+target_link_libraries(${Output} ${GLEW_LIBRARY})
+
+# link target with opengl
+target_link_libraries(${Output} ${OPENGL_LIBRARIES})
+
+# link target with X11
+target_link_libraries(${Output} ${X11_LIBRARIES})
+
+# link target with jpeg
+target_link_libraries(${Output} ${JPEG_LIBRARIES})
+
+if(Linux)
+ # link target with gtk2
+ target_link_libraries(${Output} ${GTK2_LIBRARIES})
+endif(Linux)
+
+# link target with zlib
+target_link_libraries(${Output} ${ZLIB_LIBRARIES})
+
+# User flags options
+if(NOT USER_CMAKE_LD_FLAGS STREQUAL "")
+ target_link_libraries(${Output} "${USER_CMAKE_LD_FLAGS}")
+endif(NOT USER_CMAKE_LD_FLAGS STREQUAL "")
+
+if(PACKAGE_MODE)
+ install(TARGETS ${Output} DESTINATION ${PLUGIN_DIR})
+ install(FILES ${PROJECT_SOURCE_DIR}/plugins/zzogl-pg/opengl/ps2hw.dat DESTINATION ${PLUGIN_DIR})
+else(PACKAGE_MODE)
+ install(TARGETS ${Output} DESTINATION ${CMAKE_SOURCE_DIR}/bin/plugins)
+ install(FILES ${PROJECT_SOURCE_DIR}/plugins/zzogl-pg/opengl/ps2hw.dat DESTINATION ${CMAKE_SOURCE_DIR}/bin/plugins)
+endif(PACKAGE_MODE)
+
+################################### Replay Loader
+set(Replay pcsx2_ZZCGReplayLoader)
+set(Static zzogl-cg-static)
+
+add_library(${Static} STATIC
+ ${zzoglSources}
+ ${zzoglHeaders}
+ ${zzoglSSources}
+ ${zzoglShaderSources}
+ ${zzoglLinuxSources}
+ ${zzoglLinuxHeaders})
+
+target_link_libraries(${Static} Utilities)
+target_link_libraries(${Static} ${CG_LIBRARIES})
+target_link_libraries(${Static} ${GLEW_LIBRARY})
+target_link_libraries(${Static} ${OPENGL_LIBRARIES})
+target_link_libraries(${Static} ${X11_LIBRARIES})
+target_link_libraries(${Static} ${JPEG_LIBRARIES})
+
+add_executable(${Replay} linux_replay.cpp)
+
+target_link_libraries(${Replay} ${Static})
+target_link_libraries(${Replay} Utilities)
+target_link_libraries(${Replay} ${CG_LIBRARIES})
+target_link_libraries(${Replay} ${GLEW_LIBRARY})
+target_link_libraries(${Replay} ${OPENGL_LIBRARIES})
+target_link_libraries(${Replay} ${X11_LIBRARIES})
+target_link_libraries(${Replay} ${JPEG_LIBRARIES})
+
+target_link_libraries(${Replay} ${GTK2_LIBRARIES})
+target_link_libraries(${Replay} ${ZLIB_LIBRARIES})
+
+if(NOT USER_CMAKE_LD_FLAGS STREQUAL "")
+ target_link_libraries(${Replay} "${USER_CMAKE_LD_FLAGS}")
+endif(NOT USER_CMAKE_LD_FLAGS STREQUAL "")
+
+if(PACKAGE_MODE)
+ install(TARGETS ${Replay} DESTINATION bin)
+else(PACKAGE_MODE)
+ install(TARGETS ${Replay} DESTINATION ${CMAKE_SOURCE_DIR}/bin)
+endif(PACKAGE_MODE)
diff --git a/plugins/zzogl-pg-cg/opengl/CRC.h b/plugins/zzogl-pg-cg/opengl/CRC.h
new file mode 100644
index 000000000..207e2faa3
--- /dev/null
+++ b/plugins/zzogl-pg-cg/opengl/CRC.h
@@ -0,0 +1,408 @@
+/* ZZ Open GL graphics plugin
+ * Copyright (c)2009-2010 zeydlitz@gmail.com, arcum42@gmail.com
+ * Based on Zerofrog's ZeroGS KOSMOS (c)2005-2008
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef CRC_H_INCLUDED
+#define CRC_H_INCLUDED
+
+#include "ZZHacks.h"
+
+// CRC Information
+enum Title_Info
+{
+ Unknown_Title,
+ MetalSlug6,
+ TomoyoAfter,
+ Clannad,
+ Lamune,
+ KyuuketsuKitanMoonties,
+ PiaCarroteYoukosoGPGakuenPrincess,
+ KazokuKeikakuKokoroNoKizuna,
+ DuelSaviorDestiny,
+ FFX,
+ FFX2,
+ FFXII,
+ ShadowHearts,
+ Okami,
+ MetalGearSolid3,
+ DBZBT2,
+ DBZBT3,
+ SFEX3,
+ Bully,
+ BullyCC,
+ SoTC,
+ OnePieceGrandAdventure,
+ OnePieceGrandBattle,
+ ICO,
+ GT4,
+ WildArms4,
+ WildArms5,
+ Manhunt2,
+ CrashBandicootWoC,
+ ResidentEvil4,
+ Spartan,
+ AceCombat4,
+ Drakengard2,
+ Tekken5,
+ IkkiTousen,
+ GodOfWar,
+ GodOfWar2,
+ JackieChanAdv,
+ HarvestMoon,
+ NamcoXCapcom,
+ GiTS,
+ Onimusha3,
+ MajokkoALaMode2,
+ TalesOfAbyss,
+ SonicUnleashed,
+ SimpsonsGame,
+ Genji,
+ StarOcean3,
+ ValkyrieProfile2,
+ RadiataStories,
+ SMTNocturne,
+ SMTDDS1,
+ SMTDDS2,
+ RozenMaidenGebetGarden,
+ Xenosaga,
+ Espgaluda,
+ OkageShadowKing,
+ ShadowTheHedgehog,
+ AtelierIris1,
+ AtelierIris2,
+ AtelierIris3,
+ AtelierJudie,
+ AtelierLilie,
+ AtelierViorate,
+ ArTonelico1,
+ ArTonelico2,
+ ManaKhemia1,
+ ManaKhemia2,
+ DarkCloud1,
+ DarkCloud2,
+ GhostInTheShell,
+ TitleCount,
+ Disgaea,
+ Disgaea2,
+ Gradius,
+ KingdomHearts,
+ KingdomHeartsFM,
+ KingdomHearts2,
+ KingdomHearts2FM,
+ KingdomHeartsCOM,
+ Tekken4,
+ Kaena,
+ Sims_The_Urbz,
+ MarvelxCapcom2,
+ NeoPets_Darkest_Faerie,
+ CrashnBurn,
+ Xenosaga2,
+ HauntingGround,
+ NightmareBeforeChristmas,
+ PowershotPinball,
+ BioHazard4,
+ NUMBER_OF_TITLES
+};
+
+enum Region_Info
+{
+ Unknown_Region,
+ US,
+ EU,
+ JP,
+ JPUNDUB,
+ RU,
+ FR,
+ DE,
+ IT,
+ ES,
+ ASIA,
+ RegionCount,
+};
+
+struct Game_Info
+{
+ u32 crc;
+ Title_Info title;
+ Region_Info region;
+ u32 flags;
+ s32 v_thresh, t_thresh;
+};
+
+static const Game_Info crc_game_list[] =
+{
+ // This section is straight from GSdx. Ones that also have ZZOgl hacks are commented out.
+
+ {0x00000000, Unknown_Title, Unknown_Region, 0, -1, -1},
+ {0x2113EA2E, MetalSlug6, Unknown_Region, 0, -1, -1},
+ {0x42E05BAF, TomoyoAfter, JP, 0, -1, -1},
+ {0x7800DC84, Clannad, JP, 0, -1, -1},
+ {0xA6167B59, Lamune, JP, 0, -1, -1},
+ {0xDDB59F46, KyuuketsuKitanMoonties, JP, 0, -1, -1},
+ {0xC8EE2562, PiaCarroteYoukosoGPGakuenPrincess, JP, 0, -1, -1},
+ {0x6CF94A43, KazokuKeikakuKokoroNoKizuna, JP, 0, -1, -1},
+ {0xEDAF602D, DuelSaviorDestiny, JP, 0, -1, -1},
+ {0xa39517ab, FFX, EU, 0, -1, -1},
+ {0xa39517ae, FFX, FR, 0, -1, -1},
+ {0x941bb7d9, FFX, DE, 0, -1, -1},
+ {0xa39517a9, FFX, IT, 0, -1, -1},
+ {0x941bb7de, FFX, ES, 0, -1, -1},
+ {0xb4414ea1, FFX, RU, 0, -1, -1},
+ {0xee97db5b, FFX, RU, 0, -1, -1},
+ {0xaec495cc, FFX, RU, 0, -1, -1},
+ {0xbb3d833a, FFX, US, 0, -1, -1},
+ {0x6a4efe60, FFX, JP, 0, -1, -1},
+ {0x3866ca7e, FFX, ASIA, 0, -1, -1}, // int.
+ {0x658597e2, FFX, JP, 0, -1, -1}, // int.
+ {0x9aac5309, FFX2, EU, 0, -1, -1},
+ {0x9aac530c, FFX2, FR, 0, -1, -1},
+ {0x9aac530a, FFX2, FR, 0, -1, -1}, // ?
+ {0x9aac530d, FFX2, DE, 0, -1, -1},
+ {0x9aac530b, FFX2, IT, 0, -1, -1},
+ {0x48fe0c71, FFX2, US, 0, -1, -1},
+ {0xe1fd9a2d, FFX2, JP, 0, -1, -1}, // int.
+ {0x78da0252, FFXII, EU, 0, -1, -1},
+ {0xc1274668, FFXII, EU, 0, -1, -1},
+ {0xdc2a467e, FFXII, EU, 0, -1, -1},
+ {0xca284668, FFXII, EU, 0, -1, -1},
+ {0x280AD120, FFXII, JP, 0, -1, -1},
+ {0x08C1ED4D, HauntingGround, Unknown_Region, 0, -1, -1},
+ {0x2CD5794C, HauntingGround, EU, 0, -1, -1},
+ {0x867BB945, HauntingGround, JP, 0, -1, -1},
+ {0xE263BC4B, HauntingGround, JP, 0, -1, -1},
+ {0x901AAC09, HauntingGround, US, 0, -1, -1},
+ {0x8BE3D7B2, ShadowHearts, Unknown_Region, 0, -1, -1},
+ {0xDEFA4763, ShadowHearts, US, 0, -1, -1},
+ //{0x21068223, Okami, US, 0, -1, -1},
+ //{0x891f223f, Okami, FR, 0, -1, -1},
+ //{0xC5DEFEA0, Okami, JP, 0, -1, -1},
+ {0x053D2239, MetalGearSolid3, US, 0, -1, -1},
+ {0x086273D2, MetalGearSolid3, FR, 0, -1, -1},
+ {0x26A6E286, MetalGearSolid3, EU, 0, -1, -1},
+ {0xAA31B5BF, MetalGearSolid3, Unknown_Region, 0, -1, -1},
+ {0x9F185CE1, MetalGearSolid3, Unknown_Region, 0, -1, -1},
+ {0x98D4BC93, MetalGearSolid3, EU, 0, -1, -1},
+ {0x86BC3040, MetalGearSolid3, US, 0, -1, -1}, //Subsistance disc 1
+ {0x0481AD8A, MetalGearSolid3, JP, 0, -1, -1},
+ {0x79ED26AD, MetalGearSolid3, EU, 0, -1, -1},
+ {0x5E31EA42, MetalGearSolid3, EU, 0, -1, -1},
+ {0xD7ED797D, MetalGearSolid3, EU, 0, -1, -1},
+ {0x278722BF, DBZBT2, US, 0, -1, -1},
+ {0xFE961D28, DBZBT2, US, 0, -1, -1},
+ {0x0393B6BE, DBZBT2, EU, 0, -1, -1},
+ {0xE2F289ED, DBZBT2, JP, 0, -1, -1}, // Sparking Neo!
+ {0x35AA84D1, DBZBT2, Unknown_Region, 0, -1, -1},
+ {0x428113C2, DBZBT3, US, 0, -1, -1},
+ {0xA422BB13, DBZBT3, EU, 0, -1, -1},
+ {0x983C53D2, DBZBT3, Unknown_Region, 0, -1, -1},
+ {0x983C53D3, DBZBT3, Unknown_Region, 0, -1, -1},
+ {0x72B3802A, SFEX3, US, 0, -1, -1},
+ {0x71521863, SFEX3, US, 0, -1, -1},
+ {0x28703748, Bully, US, 0, -1, -1},
+ {0xC78A495D, BullyCC, US, 0, -1, -1},
+ {0xC19A374E, SoTC, US, 0, -1, -1},
+ {0x7D8F539A, SoTC, EU, 0, -1, -1},
+ {0x3122B508, OnePieceGrandAdventure, US, 0, -1, -1},
+ {0x8DF14A24, OnePieceGrandAdventure, EU, 0, -1, -1},
+ {0xB049DD5E, OnePieceGrandBattle, US, 0, -1, -1},
+ {0x5D02CC5B, OnePieceGrandBattle, Unknown_Region, 0, -1, -1},
+ {0x6F8545DB, ICO, US, 0, -1, -1},
+ {0xB01A4C95, ICO, JP, 0, -1, -1},
+ {0x5C991F4E, ICO, Unknown_Region, 0, -1, -1},
+ // FIXME multiple CRC
+ {0x7ACF7E03, ICO, Unknown_Region, 0, -1, -1},
+ {0xAEAD1CA3, GT4, JP, 0, -1, -1},
+ {0x44A61C8F, GT4, Unknown_Region, 0, -1, -1},
+ {0x0086E35B, GT4, Unknown_Region, 0, -1, -1},
+ {0x77E61C8A, GT4, Unknown_Region, 0, -1, -1},
+ {0xC164550A, WildArms5, JPUNDUB, 0, -1, -1},
+ {0xC1640D2C, WildArms5, US, 0, -1, -1},
+ {0x0FCF8FE4, WildArms5, EU, 0, -1, -1},
+ {0x2294D322, WildArms5, JP, 0, -1, -1},
+ {0x565B6170, WildArms5, JP, 0, -1, -1},
+ {0xBBC3EFFA, WildArms4, US, 0, -1, -1},
+ {0xBBC396EC, WildArms4, US, 0, -1, -1}, //hmm such a small diff in the CRC..
+ {0x8B029334, Manhunt2, Unknown_Region, 0, -1, -1},
+ {0x09F49E37, CrashBandicootWoC, Unknown_Region, 0, -1, -1},
+ {0x013E349D, ResidentEvil4, US, 0, -1, -1},
+ {0x6BA2F6B9, ResidentEvil4, Unknown_Region, 0, -1, -1},
+ {0x60FA8C69, ResidentEvil4, JP, 0, -1, -1},
+ {0x72E1E60E, Spartan, Unknown_Region, 0, -1, -1},
+ {0x5ED8FB53, AceCombat4, JP, 0, -1, -1},
+ {0x1B9B7563, AceCombat4, Unknown_Region, 0, -1, -1},
+ {0xEC432B24, Drakengard2, Unknown_Region, 0, -1, -1},
+ {0xFC46EA61, Tekken5, JP, 0, -1, -1},
+ {0x1F88EE37, Tekken5, Unknown_Region, 0, -1, -1},
+ {0x652050D2, Tekken5, Unknown_Region, 0, -1, -1},
+ {0x9E98B8AE, IkkiTousen, JP, 0, -1, -1},
+ //{0xD6385328, GodOfWar, US, 0, -1, -1},
+ //{0xFB0E6D72, GodOfWar, EU, 0, -1, -1},
+ //{0xEB001875, GodOfWar, EU, 0, -1, -1},
+ //{0xA61A4C6D, GodOfWar, Unknown_Region, 0, -1, -1},
+ //{0xE23D532B, GodOfWar, Unknown_Region, 0, -1, -1},
+ //{0xDF1AF973, GodOfWar, Unknown_Region, 0, -1, -1},
+ //{0xD6385328, GodOfWar, Unknown_Region, 0, -1, -1},
+ {0x2F123FD8, GodOfWar2, RU, 0, -1, -1},
+ {0x2F123FD8, GodOfWar2, US, 0, -1, -1},
+ {0x44A8A22A, GodOfWar2, EU, 0, -1, -1},
+ {0x4340C7C6, GodOfWar2, Unknown_Region, 0, -1, -1},
+ {0xF8CD3DF6, GodOfWar2, Unknown_Region, 0, -1, -1},
+ {0x0B82BFF7, GodOfWar2, Unknown_Region, 0, -1, -1},
+ {0x5D482F18, JackieChanAdv, Unknown_Region, 0, -1, -1},
+ //{0xf0a6d880, HarvestMoon, US, 0, -1, -1},
+ {0x75c01a04, NamcoXCapcom, US, 0, -1, -1},
+ {0xBF6F101F, GiTS, US, 0, -1, -1},
+ {0xA5768F53, GiTS, JP, 0, -1, -1},
+ {0x6BF11378, Onimusha3, US, 0, -1, -1},
+ {0xF442260C, MajokkoALaMode2, JP, 0, -1, -1},
+ {0x14FE77F7, TalesOfAbyss, US, 0, -1, -1},
+ {0x045D77E9, TalesOfAbyss, JPUNDUB, 0, -1, -1},
+ {0xAA5EC3A3, TalesOfAbyss, JP, 0, -1, -1},
+ //{0xFB236A46, SonicUnleashed, US, 0, -1, -1},
+ {0x4C7BB3C8, SimpsonsGame, Unknown_Region, 0, -1, -1},
+ {0x4C94B32C, SimpsonsGame, Unknown_Region, 0, -1, -1},
+ {0xD71B57F4, Genji, Unknown_Region, 0, -1, -1},
+ {0x23A97857, StarOcean3, US, 0, -1, -1},
+ {0xBEC32D49, StarOcean3, JP, 0, -1, -1},
+ {0x8192A241, StarOcean3, JP, 0, -1, -1}, //NTSC JP special directors cut limited extra sugar on top edition (the special one :p)
+ {0x23A97857, StarOcean3, JPUNDUB, 0, -1, -1},
+ {0xCC96CE93, ValkyrieProfile2, US, 0, -1, -1},
+ {0x774DE8E2, ValkyrieProfile2, JP, 0, -1, -1},
+ {0x04CCB600, ValkyrieProfile2, EU, 0, -1, -1},
+ {0xB65E141B, ValkyrieProfile2, EU, 0, -1, -1}, // PAL German
+ {0x47B9B2FD, RadiataStories, US, 0, -1, -1},
+ {0xE8FCF8EC, SMTNocturne, US, 0, -1, -1}, // GSdx saves/reloads z buffer around shadow drawing, same issue with all the SMT games following
+ {0xF0A31EE3, SMTNocturne, EU, 0, -1, -1}, // SMTNocturne (Lucifers Call in EU)
+ {0xAE0DE7B7, SMTNocturne, EU, 0, -1, -1}, // SMTNocturne (Lucifers Call in EU)
+ {0xD60DA6D4, SMTNocturne, JP, 0, -1, -1}, // SMTNocturne
+ {0x0e762e8d, SMTNocturne, JP, 0, -1, -1}, // SMTNocturne Maniacs
+ {0x47BA9034, SMTNocturne, JP, 0, -1, -1}, // SMTNocturne Maniacs Chronicle
+ {0xD7273511, SMTDDS1, US, 0, -1, -1}, // SMT Digital Devil Saga
+ {0x1683A6BE, SMTDDS1, EU, 0, -1, -1}, // SMT Digital Devil Saga
+ {0x44865CE1, SMTDDS1, JP, 0, -1, -1}, // SMT Digital Devil Saga
+ {0xD382C164, SMTDDS2, US, 0, -1, -1}, // SMT Digital Devil Saga 2
+ {0xD568B684, SMTDDS2, EU, 0, -1, -1}, // SMT Digital Devil Saga 2
+ {0xE47C1A9C, SMTDDS2, JP, 0, -1, -1}, // SMT Digital Devil Saga 2
+ {0x0B8AB37B, RozenMaidenGebetGarden, JP, 0, -1, -1},
+
+ // And these are here for ZZogl hacks.
+ {0xA3D63039, Xenosaga, JP, GAME_DOPARALLELCTX, 64, 32},
+ {0x0E7807B2, Xenosaga, US, GAME_DOPARALLELCTX, 64, 32},
+ {0x7D2FE035, Espgaluda, JP, 0/*GAME_BIGVALIDATE*/, 24, -1},
+ {0x21068223, Okami, US, GAME_XENOSPECHACK, -1, -1},
+ {0x891f223f, Okami, FR, GAME_XENOSPECHACK, -1, -1},
+ {0xC5DEFEA0, Okami, JP, GAME_XENOSPECHACK, -1, -1},
+ {0xe0426fc6, OkageShadowKing, Unknown_Region, GAME_XENOSPECHACK, -1, -1},
+
+ {0xD6385328, GodOfWar, US, GAME_FULL16BITRES, -1, -1},
+ {0xFB0E6D72, GodOfWar, EU, GAME_FULL16BITRES, -1, -1},
+ {0xEB001875, GodOfWar, EU, GAME_FULL16BITRES, -1, -1},
+ {0xA61A4C6D, GodOfWar, Unknown_Region, GAME_FULL16BITRES, -1, -1},
+ {0xE23D532B, GodOfWar, Unknown_Region, GAME_FULL16BITRES, -1, -1},
+ {0xDF1AF973, GodOfWar, Unknown_Region, GAME_FULL16BITRES, -1, -1},
+ {0xD6385328, GodOfWar, Unknown_Region, GAME_FULL16BITRES, -1, -1},
+
+ //{0x2F123FD8, GodOfWar2, Unknown_Region, GAME_FULL16BITRES, -1, -1},
+ //{0x44A8A22A, GodOfWar2, Unknown_Region, GAME_FULL16BITRES, -1, -1},
+ //{0x4340C7C6, GodOfWar2, Unknown_Region, GAME_FULL16BITRES, -1, -1},
+ //{0xF8CD3DF6, GodOfWar2, Unknown_Region, GAME_FULL16BITRES, -1, -1},
+ //{0x0B82BFF7, GodOfWar2, Unknown_Region, GAME_FULL16BITRES, -1, -1},
+
+ {0xF0A6D880, HarvestMoon, US, GAME_NOSTENCIL, -1, -1},
+ //{0x304C115C, HarvestMoon, Unknown, GAME_NOSTENCIL, -1, -1},
+ {0xFB236A46, SonicUnleashed, US, GAME_FASTUPDATE | GAME_NOALPHAFAIL, -1, -1},
+ {0xa5d29941, ShadowTheHedgehog, US, GAME_FASTUPDATE | GAME_NOALPHAFAIL, -1, -1},
+
+ {0x7acf7e03, AtelierIris1, Unknown_Region, GAME_GUSTHACK, -1, -1},
+ {0xF0457CEF, AtelierIris1, Unknown_Region, GAME_GUSTHACK, -1, -1},
+ {0xE3981DBB, AtelierIris1, US, GAME_GUSTHACK, -1, -1},
+ {0x9AC65D6A, AtelierIris2, US, GAME_GUSTHACK, -1, -1},
+ {0x4CCC9212, AtelierIris3, US, GAME_GUSTHACK, -1, -1},
+ {0xCA295E61, AtelierIris3, JP, GAME_GUSTHACK, -1, -1},
+ //{0x4437F4B1, ArTonelico1, US, GAME_GUSTHACK, -1, -1},
+ {0xF95F37EE, ArTonelico2, US, GAME_GUSTHACK, -1, -1},
+ {0xF46142D3, ArTonelico2, JPUNDUB, GAME_GUSTHACK, -1, -1},
+
+ // According to Zeydlitz, Mana Khemia no longer needs the Gust Hack.
+ //{0x77b0236f, ManaKhemia1, US, GAME_GUSTHACK, -1, -1},
+ //{0x433951e7, ManaKhemia2, US, GAME_GUSTHACK, -1, -1},
+ //{0xda11c6d4, AtelierJudie, JP, GAME_GUSTHACK, -1, -1},
+ //{0x3e72c085, AtelierLilie, JP, GAME_GUSTHACK, -1, -1},
+ //{0x6eac076b, AtelierViorate, JP, GAME_GUSTHACK, -1, -1},
+
+ {0xbaa8dd8, DarkCloud1, US, GAME_NOTARGETRESOLVE, -1, -1},
+ {0xA5C05C78, DarkCloud1, Unknown_Region, GAME_NOTARGETRESOLVE, -1, -1},
+ //{0x1DF41F33, DarkCloud2, US, 0, -1, -1},
+ {0x95cc86ef, GhostInTheShell, Unknown_Region, GAME_NOALPHAFAIL, -1, -1}
+
+// Game settings that used to be in the Patches folder. Commented out until I decide what to do with them.
+// {0x951555A0, Disgaea2, US, GAME_NODEPTHRESOLVE, -1, -1},
+// {0x4334E17D, Disgaea2, JP, GAME_NODEPTHRESOLVE, -1, -1},
+//
+// {0x5EB127E7, Gradius, JP, GAME_INTERLACE2X, -1, -1},
+// {0x6ADBC24B, Gradius, EU, GAME_INTERLACE2X, -1, -1},
+// {0xF22CDDAF, Gradius, US, GAME_INTERLACE2X, -1, -1},
+//
+// {0xF52FB2BE, KingdomHearts, EU, GAME_QUICKRESOLVE1, -1, -1},
+// {0xAE3EAA05, KingdomHearts, DE, GAME_QUICKRESOLVE1, -1, -1},
+// {0xF6DC728D, KingdomHearts, FR, GAME_QUICKRESOLVE1, -1, -1},
+// {0x0F6B6315, KingdomHearts, US, GAME_QUICKRESOLVE1, -1, -1},
+// {0x3E68955A, KingdomHeartsFM, JP, GAME_QUICKRESOLVE1, -1, -1},
+//
+// {0xC398F477, KingdomHearts2, EU, GAME_NODEPTHRESOLVE, -1, -1},
+// {0xDA0535FD, KingdomHearts2, US, GAME_NODEPTHRESOLVE, -1, -1},
+// {0x93F8A60B, KingdomHearts2, JP, GAME_NODEPTHRESOLVE, -1, -1},
+// {0xF266B00B, KingdomHearts2FM, JP, GAME_NODEPTHRESOLVE, -1, -1},
+//
+// //The patch claimed to stop characters appearing as wigs on GeForce 8x00 series cards (Disable Alpha Testing)
+// {0x2251E14D, Tekken4, EU, GAME_NOALPHATEST, -1, -1},
+//
+// // This one is supposed to fix a refresh bug.
+// {0x51F91783, Kaena, JP, GAME_NOTARGETRESOLVE, -1, -1},
+//
+// {0xDEFA4763, ShadowHearts, EU, GAME_NODEPTHRESOLVE | GAME_NOQUICKRESOLVE | GAME_NOTARGETRESOLVE | GAME_AUTORESET, -1, -1},
+// {0x8BE3D7B2, ShadowHearts, US, GAME_NODEPTHUPDATE | GAME_AUTORESET | GAME_NOQUICKRESOLVE, -1, -1},
+//
+// {0x015314A2, Sims_The_Urbz, US, GAME_NOQUICKRESOLVE, -1, -1},
+//
+// // "Required fixes to visuals"
+// {0x086273D2, MetalGearSolid3, US, GAME_FULL16BITRES | GAME_NODEPTHRESOLVE, -1, -1},
+//
+// {0x4D228733, MarvelxCapcom2, US, GAME_QUICKRESOLVE1, -1, -1},
+// {0x934F9081, NeoPets_Darkest_Faerie, US, GAME_RESOLVEPROMOTED | GAME_FULL16BITRES | GAME_NODEPTHRESOLVE, -1, -1},
+//
+// {0x21068223, Okami, US, GAME_FULL16BITRES|GAME_NODEPTHRESOLVE|GAME_FASTUPDATE, -1, -1},
+// {0xC5DEFEA0, Okami, JP, GAME_FULL16BITRES|GAME_NODEPTHRESOLVE|GAME_FASTUPDATE, -1, -1},
+//
+// // Speed up
+// {0x6BA2F6B9, ResidentEvil4, EU, GAME_NOTARGETRESOLVE | GAME_32BITTARGS, -1, -1},
+// {0x013E349D, ResidentEvil4, US, GAME_NOTARGETCLUT, -1, -1},
+//
+// {0x2088950A, Xenosaga2, JP, GAME_FULL16BITRES | GAME_NODEPTHRESOLVE, -1, -1},
+// {0x901AAC09, HauntingGround, US, GAME_FULL16BITRES | GAME_NODEPTHRESOLVE, -1, -1},
+// {0x625AF967, NightmareBeforeChristmas, JP, GAME_TEXAHACK, -1, -1},
+//
+// {0x3CFE3B37, PowershotPinball, EU, GAME_AUTORESET, -1, -1},
+// {0x60FA8C69, BioHazard4, JP, GAME_NOTARGETCLUT, -1, -1}
+// End of game settings from the patch folder.
+};
+
+#define GAME_INFO_INDEX (sizeof(crc_game_list)/sizeof(Game_Info))
+
+
+#endif // CRC_H_INCLUDED
diff --git a/plugins/zzogl-pg-cg/opengl/GLWin.h b/plugins/zzogl-pg-cg/opengl/GLWin.h
new file mode 100644
index 000000000..0a314b25c
--- /dev/null
+++ b/plugins/zzogl-pg-cg/opengl/GLWin.h
@@ -0,0 +1,89 @@
+/* ZZ Open GL graphics plugin
+ * Copyright (c)2009-2010 zeydlitz@gmail.com, arcum42@gmail.com
+ * Based on Zerofrog's ZeroGS KOSMOS (c)2005-2008
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef GLWIN_H_INCLUDED
+#define GLWIN_H_INCLUDED
+
+#ifdef _WIN32
+#define GL_WIN32_WINDOW
+#else
+#define GL_X11_WINDOW
+#endif
+
+#undef CreateWindow // Undo Windows.h global namespace pollution
+
+extern void SetDeviceSize(int nNewWidth, int nNewHeight);
+extern void OnFKey(int key, int shift);
+
+class GLWindow
+{
+ private:
+#ifdef GL_X11_WINDOW
+ Display *glDisplay;
+ GLXContext context;
+ XVisualInfo *vi;
+
+ Window glWindow;
+ XSetWindowAttributes attr;
+
+ bool CreateVisual();
+ void GetGLXVersion();
+ void GetWindowSize();
+ void UpdateGrabKey();
+ void Force43Ratio();
+ void CreateContextGL();
+#endif
+ bool fullScreen, doubleBuffered;
+ u32 width, height, depth;
+
+ public:
+ char title[256];
+ Size backbuffer;
+
+ void SwapGLBuffers();
+ bool ReleaseContext();
+
+#ifdef GL_X11_WINDOW
+ void ToggleFullscreen();
+#endif
+
+ bool CreateWindow(void *pDisplay);
+ void CloseWindow();
+ bool DisplayWindow(int _width, int _height);
+ void SetTitle(char *strtitle);
+ void ResizeCheck();
+ void ProcessEvents();
+
+ void UpdateWindowSize(int nNewWidth, int nNewHeight)
+ {
+ FUNCLOG
+ backbuffer.w = std::max(nNewWidth, 16);
+ backbuffer.h = std::max(nNewHeight, 16);
+
+ if (!(conf.fullscreen()))
+ {
+ conf.width = nNewWidth;
+ conf.height = nNewHeight;
+ }
+ }
+};
+
+extern GLWindow GLWin;
+
+#endif // GLWIN_H_INCLUDED
diff --git a/plugins/zzogl-pg-cg/opengl/GLWin32.cpp b/plugins/zzogl-pg-cg/opengl/GLWin32.cpp
new file mode 100644
index 000000000..d71ca84ae
--- /dev/null
+++ b/plugins/zzogl-pg-cg/opengl/GLWin32.cpp
@@ -0,0 +1,400 @@
+/* ZZ Open GL graphics plugin
+ * Copyright (c)2009-2010 zeydlitz@gmail.com, arcum42@gmail.com
+ * Based on Zerofrog's ZeroGS KOSMOS (c)2005-2008
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "GS.h"
+#include "GLWin.h"
+
+#ifdef GL_WIN32_WINDOW
+
+HWND GShwnd = NULL;
+HDC hDC = NULL; // Private GDI Device Context
+HGLRC hRC = NULL; // Permanent Rendering Context
+
+LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ static int nWindowWidth = 0, nWindowHeight = 0;
+
+ switch (msg)
+ {
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ return 0;
+
+ case WM_KEYDOWN:
+// switch(wParam) {
+// case VK_ESCAPE:
+// SendMessage(hWnd, WM_DESTROY, 0L, 0L);
+// break;
+// }
+ break;
+
+ case WM_SIZE:
+ nWindowWidth = lParam & 0xffff;
+ nWindowHeight = lParam >> 16;
+ GLWin.UpdateWindowSize(nWindowWidth, nWindowHeight);
+ break;
+
+ case WM_SIZING:
+ // if button is 0, then just released so can resize
+ if (GetSystemMetrics(SM_SWAPBUTTON) ? !GetAsyncKeyState(VK_RBUTTON) : !GetAsyncKeyState(VK_LBUTTON))
+ {
+ SetDeviceSize(nWindowWidth, nWindowHeight);
+ }
+ break;
+
+ case WM_SETCURSOR:
+ SetCursor(NULL);
+ break;
+ }
+
+ return DefWindowProc(hWnd, msg, wParam, lParam);
+}
+
+bool GLWindow::CreateWindow(void *pDisplay)
+{
+ RECT rc, rcdesktop;
+ rc.left = 0;
+ rc.top = 0;
+ rc.right = conf.width;
+ rc.bottom = conf.height;
+
+ WNDCLASSEX wc;
+ HINSTANCE hInstance = GetModuleHandle(NULL); // Grab An Instance For Our Window
+ DWORD dwExStyle, dwStyle;
+
+ wc.cbSize = sizeof(WNDCLASSEX);
+ wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Redraw On Move, And Own DC For Window
+ wc.lpfnWndProc = (WNDPROC) MsgProc; // MsgProc Handles Messages
+ wc.cbClsExtra = 0; // No Extra Window Data
+ wc.cbWndExtra = 0; // No Extra Window Data
+ wc.hInstance = hInstance; // Set The Instance
+ wc.hIcon = NULL;
+ wc.hIconSm = NULL; // Load The Default Icon
+ wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Load The Arrow Pointer
+ wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); // No Background Required For GL
+ wc.lpszMenuName = NULL; // We Don't Want A Menu
+ wc.lpszClassName = L"PS2EMU_ZEROGS"; // Set The Class Name
+
+ RegisterClassEx(&wc);
+
+ if (conf.fullscreen())
+ {
+ dwExStyle = WS_EX_APPWINDOW;
+ dwStyle = WS_POPUP;
+ }
+ else
+ {
+ dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
+ dwStyle = WS_OVERLAPPEDWINDOW | WS_BORDER;
+ }
+
+ dwStyle |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
+ AdjustWindowRectEx(&rc, dwStyle, false, dwExStyle);
+
+ GetWindowRect(GetDesktopWindow(), &rcdesktop);
+
+ GShwnd = CreateWindowEx( dwExStyle, // Extended Style For The Window
+ L"PS2EMU_ZEROGS", // Class Name
+ L"ZZOgl", // Window Title
+ dwStyle, // Selected Window Style
+ (rcdesktop.right - (rc.right - rc.left)) / 2, // Window Position
+ (rcdesktop.bottom - (rc.bottom - rc.top)) / 2, // Window Position
+ rc.right - rc.left, // Calculate Adjusted Window Width
+ rc.bottom - rc.top, // Calculate Adjusted Window Height
+ NULL, // No Parent Window
+ NULL, // No Menu
+ hInstance, // Instance
+ NULL); // Don't Pass Anything To WM_CREATE
+
+ if (GShwnd == NULL)
+ {
+ ZZLog::Error_Log("Failed to create window. Exiting...");
+ return false;
+ }
+
+ if (pDisplay != NULL) *(HWND*)pDisplay = GShwnd;
+
+ // set just in case
+ SetWindowLongPtr(GShwnd, GWLP_WNDPROC, (LPARAM)(WNDPROC)MsgProc);
+
+ ShowWindow(GShwnd, SW_SHOWDEFAULT);
+
+ UpdateWindow(GShwnd);
+
+ SetFocus(GShwnd);
+
+ if (pDisplay == NULL) ZZLog::Error_Log("Failed to create window. Exiting...");
+ return (pDisplay != NULL);
+}
+
+bool GLWindow::ReleaseContext()
+{
+ if (hRC) // Do We Have A Rendering Context?
+ {
+ if (!wglMakeCurrent(NULL, NULL)) // Are We Able To Release The DC And RC Contexts?
+ {
+ MessageBox(NULL, L"Release Of DC And RC Failed.", L"SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION);
+ }
+
+ if (!wglDeleteContext(hRC)) // Are We Able To Delete The RC?
+ {
+ MessageBox(NULL, L"Release Rendering Context Failed.", L"SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION);
+ }
+
+ hRC = NULL; // Set RC To NULL
+ }
+
+ if (hDC && !ReleaseDC(GShwnd, hDC)) // Are We Able To Release The DC
+ {
+ MessageBox(NULL, L"Release Device Context Failed.", L"SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION);
+ hDC = NULL; // Set DC To NULL
+ }
+
+ return true;
+}
+
+void GLWindow::CloseWindow()
+{
+ if (GShwnd != NULL)
+ {
+ DestroyWindow(GShwnd);
+ GShwnd = NULL;
+ }
+}
+
+bool GLWindow::DisplayWindow(int _width, int _height)
+{
+ GLuint PixelFormat; // Holds The Results After Searching For A Match
+ DWORD dwExStyle; // Window Extended Style
+ DWORD dwStyle; // Window Style
+
+ RECT rcdesktop;
+ GetWindowRect(GetDesktopWindow(), &rcdesktop);
+
+ if (conf.fullscreen())
+ {
+ backbuffer.w = rcdesktop.right - rcdesktop.left;
+ backbuffer.h = rcdesktop.bottom - rcdesktop.top;
+
+ dwExStyle = WS_EX_APPWINDOW;
+ dwStyle = WS_POPUP;
+ ShowCursor(false);
+ }
+ else
+ {
+ dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
+ dwStyle = WS_OVERLAPPEDWINDOW;
+ backbuffer.w = _width;
+ backbuffer.h = _height;
+ }
+ dwStyle |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
+
+ RECT rc;
+
+ rc.left = 0;
+ rc.top = 0;
+ rc.right = backbuffer.w;
+ rc.bottom = backbuffer.h;
+ AdjustWindowRectEx(&rc, dwStyle, false, dwExStyle);
+ int X = (rcdesktop.right - rcdesktop.left) / 2 - (rc.right - rc.left) / 2;
+ int Y = (rcdesktop.bottom - rcdesktop.top) / 2 - (rc.bottom - rc.top) / 2;
+
+ SetWindowLong(GShwnd, GWL_STYLE, dwStyle);
+ SetWindowLong(GShwnd, GWL_EXSTYLE, dwExStyle);
+
+ SetWindowPos(GShwnd, HWND_TOP, X, Y, rc.right - rc.left, rc.bottom - rc.top, SWP_SHOWWINDOW);
+
+ if (conf.fullscreen())
+ {
+ DEVMODE dmScreenSettings;
+ memset(&dmScreenSettings, 0, sizeof(dmScreenSettings));
+ dmScreenSettings.dmSize = sizeof(dmScreenSettings);
+ dmScreenSettings.dmPelsWidth = backbuffer.w;
+ dmScreenSettings.dmPelsHeight = backbuffer.h;
+ dmScreenSettings.dmBitsPerPel = 32;
+ dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
+
+ // Try To Set Selected Mode And Get Results. NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
+
+ if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
+ {
+ if (MessageBox(NULL,
+ L"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?",
+ L"NeHe GL",
+ MB_YESNO | MB_ICONEXCLAMATION) == IDYES)
+ conf.setFullscreen(false);
+ else
+ return false;
+ }
+ }
+ else
+ {
+ // change to default resolution
+ ChangeDisplaySettings(NULL, 0);
+ }
+
+ PIXELFORMATDESCRIPTOR pfd = // pfd Tells Windows How We Want Things To Be
+
+ {
+ sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor
+ 1, // Version Number
+ PFD_DRAW_TO_WINDOW | // Format Must Support Window
+ PFD_SUPPORT_OPENGL | // Format Must Support OpenGL
+ PFD_DOUBLEBUFFER, // Must Support Double Buffering
+ PFD_TYPE_RGBA, // Request An RGBA Format
+ 32, // Select Our Color Depth
+ 0, 0, 0, 0, 0, 0, // Color Bits Ignored
+ 0, // 8bit Alpha Buffer
+ 0, // Shift Bit Ignored
+ 0, // No Accumulation Buffer
+ 0, 0, 0, 0, // Accumulation Bits Ignored
+ 24, // 24Bit Z-Buffer (Depth Buffer)
+ 8, // 8bit Stencil Buffer
+ 0, // No Auxiliary Buffer
+ PFD_MAIN_PLANE, // Main Drawing Layer
+ 0, // Reserved
+ 0, 0, 0 // Layer Masks Ignored
+ };
+
+ if (!(hDC = GetDC(GShwnd)))
+ {
+ MessageBox(NULL, L"(1) Can't Create A GL Device Context.", L"ERROR", MB_OK | MB_ICONEXCLAMATION);
+ return false;
+ }
+
+ if (!(PixelFormat = ChoosePixelFormat(hDC, &pfd)))
+ {
+ MessageBox(NULL, L"(2) Can't Find A Suitable PixelFormat.", L"ERROR", MB_OK | MB_ICONEXCLAMATION);
+ return false;
+ }
+
+ if (!SetPixelFormat(hDC, PixelFormat, &pfd))
+ {
+ MessageBox(NULL, L"(3) Can't Set The PixelFormat.", L"ERROR", MB_OK | MB_ICONEXCLAMATION);
+ return false;
+ }
+
+ if (!(hRC = wglCreateContext(hDC)))
+ {
+ MessageBox(NULL, L"(4) Can't Create A GL Rendering Context.", L"ERROR", MB_OK | MB_ICONEXCLAMATION);
+ return false;
+ }
+
+ if (!wglMakeCurrent(hDC, hRC))
+ {
+ MessageBox(NULL, L"(5) Can't Activate The GL Rendering Context.", L"ERROR", MB_OK | MB_ICONEXCLAMATION);
+ return false;
+ }
+
+ UpdateWindow(GShwnd);
+
+ return true;
+}
+
+void GLWindow::SwapGLBuffers()
+{
+ static u32 lastswaptime = 0;
+
+ if (glGetError() != GL_NO_ERROR) ZZLog::Debug_Log("glError before swap!");
+
+ SwapBuffers(hDC);
+ lastswaptime = timeGetTime();
+}
+
+void GLWindow::SetTitle(char *strtitle)
+{
+ if (!conf.fullscreen()) SetWindowText(GShwnd, wxString::FromUTF8(strtitle));
+}
+
+void GLWindow::ResizeCheck()
+{
+
+}
+
+
+extern void ChangeDeviceSize(int nNewWidth, int nNewHeight);
+
+void GLWindow::ProcessEvents()
+{
+ MSG msg;
+
+ ZeroMemory(&msg, sizeof(msg));
+
+ while (1)
+ {
+ if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
+ {
+ switch (msg.message)
+ {
+ case WM_KEYDOWN :
+ int my_KeyEvent = msg.wParam;
+ bool my_bShift = !!(GetKeyState(VK_SHIFT) & 0x8000);
+
+ switch (msg.wParam)
+ {
+ case VK_F5:
+ case VK_F6:
+ case VK_F7:
+ case VK_F9:
+ OnFKey(msg.wParam - VK_F1 + 1, my_bShift);
+ break;
+
+ case VK_ESCAPE:
+
+ if (conf.fullscreen())
+ {
+ // destroy that msg
+ conf.setFullscreen(false);
+ ChangeDeviceSize(conf.width, conf.height);
+ UpdateWindow(GShwnd);
+ continue; // so that msg doesn't get sent
+ }
+ else
+ {
+ SendMessage(GShwnd, WM_DESTROY, 0, 0);
+ return;
+ }
+
+ break;
+ }
+
+ break;
+ }
+
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ if ((GetKeyState(VK_MENU) & 0x8000) && (GetKeyState(VK_RETURN) & 0x8000))
+ {
+ conf.zz_options.fullscreen = !conf.zz_options.fullscreen;
+
+ SetDeviceSize(
+ (conf.fullscreen()) ? 1280 : conf.width,
+ (conf.fullscreen()) ? 960 : conf.height);
+ }
+}
+
+
+#endif
diff --git a/plugins/zzogl-pg-cg/opengl/GLWinX11.cpp b/plugins/zzogl-pg-cg/opengl/GLWinX11.cpp
new file mode 100644
index 000000000..0730acc21
--- /dev/null
+++ b/plugins/zzogl-pg-cg/opengl/GLWinX11.cpp
@@ -0,0 +1,478 @@
+/* ZZ Open GL graphics plugin
+ * Copyright (c)2009-2010 zeydlitz@gmail.com, arcum42@gmail.com
+ * Based on Zerofrog's ZeroGS KOSMOS (c)2005-2008
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "Util.h"
+#include "GLWin.h"
+
+#ifdef GL_X11_WINDOW
+
+#include
+#include
+
+#ifdef USE_GSOPEN2
+bool GLWindow::CreateWindow(void *pDisplay)
+{
+ glWindow = (Window)*((u32*)(pDisplay)+1);
+ // Do not take the display which come from pcsx2 neither change it.
+ // You need a new one to do the operation in the GS thread
+ glDisplay = XOpenDisplay(NULL);
+
+ return true;
+}
+#else
+bool GLWindow::CreateWindow(void *pDisplay)
+{
+ // init support of multi thread
+ if (!XInitThreads())
+ ZZLog::Error_Log("Failed to init the xlib concurent threads");
+
+ glDisplay = XOpenDisplay(NULL);
+
+ if (pDisplay == NULL)
+ {
+ ZZLog::Error_Log("Failed to create window. Exiting...");
+ return false;
+ }
+
+ // Allow pad to use the display
+ *(Display**)pDisplay = glDisplay;
+ // Pad can use the window to grab the input. For the moment just set to 0 to avoid
+ // to grab an unknow window... Anyway GSopen1 might be dropped in the future
+ *((u32*)(pDisplay)+1) = 0;
+
+ return true;
+}
+#endif
+
+bool GLWindow::ReleaseContext()
+{
+ bool status = true;
+ if (!glDisplay) return status;
+
+ // free the context
+ if (context)
+ {
+ if (!glXMakeCurrent(glDisplay, None, NULL)) {
+ ZZLog::Error_Log("Could not release drawing context.");
+ status = false;
+ }
+
+ glXDestroyContext(glDisplay, context);
+ context = NULL;
+ }
+
+ // free the visual
+ if (vi) {
+ XFree(vi);
+ vi = NULL;
+ }
+
+ return status;
+}
+
+void GLWindow::CloseWindow()
+{
+ SaveConfig();
+ if (!glDisplay) return;
+
+ XCloseDisplay(glDisplay);
+ glDisplay = NULL;
+}
+
+bool GLWindow::CreateVisual()
+{
+ // attributes for a single buffered visual in RGBA format with at least
+ // 8 bits per color and a 24 bit depth buffer
+ int attrListSgl[] = {GLX_RGBA, GLX_RED_SIZE, 8,
+ GLX_GREEN_SIZE, 8,
+ GLX_BLUE_SIZE, 8,
+ GLX_DEPTH_SIZE, 24,
+ None
+ };
+
+ // attributes for a double buffered visual in RGBA format with at least
+ // 8 bits per color and a 24 bit depth buffer
+ int attrListDbl[] = { GLX_RGBA, GLX_DOUBLEBUFFER,
+ GLX_RED_SIZE, 8,
+ GLX_GREEN_SIZE, 8,
+ GLX_BLUE_SIZE, 8,
+ GLX_DEPTH_SIZE, 24,
+ None
+ };
+
+ /* get an appropriate visual */
+ vi = glXChooseVisual(glDisplay, DefaultScreen(glDisplay), attrListDbl);
+
+ if (vi == NULL)
+ {
+ vi = glXChooseVisual(glDisplay, DefaultScreen(glDisplay), attrListSgl);
+ doubleBuffered = false;
+ ZZLog::Error_Log("Only Singlebuffered Visual!");
+ }
+ else
+ {
+ doubleBuffered = true;
+ ZZLog::Error_Log("Got Doublebuffered Visual!");
+ }
+
+ if (vi == NULL)
+ {
+ ZZLog::Error_Log("Failed to get buffered Visual!");
+ return false;
+ }
+ return true;
+}
+
+void GLWindow::GetWindowSize()
+{
+ if (!glDisplay or !glWindow) return;
+
+ unsigned int borderDummy;
+ Window winDummy;
+ s32 xDummy;
+ s32 yDummy;
+
+ XLockDisplay(glDisplay);
+ XGetGeometry(glDisplay, glWindow, &winDummy, &xDummy, &yDummy, &width, &height, &borderDummy, &depth);
+ XUnlockDisplay(glDisplay);
+
+ // update the gl buffer size
+ UpdateWindowSize(width, height);
+
+#ifndef USE_GSOPEN2
+ // too verbose!
+ ZZLog::Dev_Log("Resolution %dx%d. Depth %d bpp. Position (%d,%d)", width, height, depth, conf.x, conf.y);
+#endif
+}
+
+void GLWindow::GetGLXVersion()
+{
+ int glxMajorVersion, glxMinorVersion;
+
+ glXQueryVersion(glDisplay, &glxMajorVersion, &glxMinorVersion);
+
+ if (glXIsDirect(glDisplay, context))
+ ZZLog::Error_Log("glX-Version %d.%d with Direct Rendering", glxMajorVersion, glxMinorVersion);
+ else
+ ZZLog::Error_Log("glX-Version %d.%d with Indirect Rendering !!! It will be slow", glxMajorVersion, glxMinorVersion);
+
+}
+
+void GLWindow::CreateContextGL()
+{
+ if (!glDisplay) return;
+
+ // Create a 2.0 opengl context. My understanding, you need it to call the gl function to get the 3.0 context
+ context = glXCreateContext(glDisplay, vi, NULL, GL_TRUE);
+
+ // FIXME
+ // On Geforce7, the context 3.0 creation crashes with BadAlloc (insufficient resources for operation)
+ // So until a better solution is found, keep the 2.0 context -- Gregory
+ return;
+
+ PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC) glXGetProcAddress((GLubyte *) "glXCreateContextAttribsARB");
+ PFNGLXCHOOSEFBCONFIGPROC glXChooseFBConfig = (PFNGLXCHOOSEFBCONFIGPROC) glXGetProcAddress((GLubyte *) "glXChooseFBConfig");
+ if (!glXCreateContextAttribsARB or !glXChooseFBConfig) {
+ ZZLog::Error_Log("No support of OpenGL 3.0\n");
+ return;
+ }
+
+ // Note this part seems linux specific
+ int fbcount = 0;
+ GLXFBConfig *framebuffer_config = glXChooseFBConfig(glDisplay, DefaultScreen(glDisplay), NULL, &fbcount);
+ if (!framebuffer_config or !fbcount) return;
+
+ // At least create a 3.0 context with compatibility profile
+ int attribs[] = {
+ GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
+ GLX_CONTEXT_MINOR_VERSION_ARB, 0,
+ GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB,
+ 0
+ };
+ GLXContext context_temp = glXCreateContextAttribsARB(glDisplay, framebuffer_config[0], NULL, true, attribs);
+ if (context_temp) {
+ ZZLog::Error_Log("Create a 3.0 opengl context");
+ glXDestroyContext(glDisplay, context);
+ context = context_temp;
+ }
+}
+
+#ifdef USE_GSOPEN2
+bool GLWindow::DisplayWindow(int _width, int _height)
+{
+ GetWindowSize();
+
+ if (!CreateVisual()) return false;
+
+ // connect the glx-context to the window
+ CreateContextGL();
+ glXMakeCurrent(glDisplay, glWindow, context);
+
+ GetGLXVersion();
+
+ return true;
+}
+#else
+bool GLWindow::DisplayWindow(int _width, int _height)
+{
+ backbuffer.w = _width;
+ backbuffer.h = _height;
+
+ if (!CreateVisual()) return false;
+
+ /* create a color map */
+ attr.colormap = XCreateColormap(glDisplay, RootWindow(glDisplay, vi->screen),
+ vi->visual, AllocNone);
+ attr.border_pixel = 0;
+ attr.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask |
+ StructureNotifyMask | SubstructureRedirectMask | SubstructureNotifyMask |
+ EnterWindowMask | LeaveWindowMask | FocusChangeMask ;
+
+ // Create a window at the last position/size
+ glWindow = XCreateWindow(glDisplay, RootWindow(glDisplay, vi->screen),
+ conf.x , conf.y , _width, _height, 0, vi->depth, InputOutput, vi->visual,
+ CWBorderPixel | CWColormap | CWEventMask,
+ &attr);
+
+ /* Allow to kill properly the window */
+ Atom wmDelete = XInternAtom(glDisplay, "WM_DELETE_WINDOW", True);
+ XSetWMProtocols(glDisplay, glWindow, &wmDelete, 1);
+
+ // Set icon name
+ XSetIconName(glDisplay, glWindow, "ZZogl-pg");
+
+ // Draw the window
+ XMapRaised(glDisplay, glWindow);
+ XSync(glDisplay, false);
+
+ // connect the glx-context to the window
+ CreateContextGL();
+ glXMakeCurrent(glDisplay, glWindow, context);
+
+ GetGLXVersion();
+
+ // Always start in window mode
+ fullScreen = 0;
+ GetWindowSize();
+
+ return true;
+}
+#endif
+
+void GLWindow::SwapGLBuffers()
+{
+ if (glGetError() != GL_NO_ERROR) ZZLog::Debug_Log("glError before swap!");
+ // FIXME I think we need to flush when there is only 1 visual buffer
+ glXSwapBuffers(glDisplay, glWindow);
+ // glClear(GL_COLOR_BUFFER_BIT);
+}
+
+u32 THR_KeyEvent = 0; // Value for key event processing between threads
+bool THR_bShift = false;
+bool THR_bCtrl = false;
+
+void GLWindow::ProcessEvents()
+{
+ FUNCLOG
+
+#ifdef USE_GSOPEN2
+ GetWindowSize();
+#else
+ ResizeCheck();
+#endif
+
+ if (THR_KeyEvent) // This value was passed from GSKeyEvents which could be in another thread
+ {
+ int my_KeyEvent = THR_KeyEvent;
+ bool my_bShift = THR_bShift;
+ bool my_bCtrl = THR_bCtrl;
+ THR_KeyEvent = 0;
+
+ switch (my_KeyEvent)
+ {
+ case XK_F5:
+ case XK_F6:
+ case XK_F7:
+ case XK_F9:
+ // Note: to avoid some clash with PCSX2 shortcut in GSOpen2.
+ // GS shortcut will only be activated when ctrl is press
+ if (my_bCtrl)
+ OnFKey(my_KeyEvent - XK_F1 + 1, my_bShift);
+ break;
+ }
+ }
+}
+
+
+// ************************** Function that are either stub or useless in GSOPEN2
+#define _NET_WM_STATE_REMOVE 0
+#define _NET_WM_STATE_ADD 1
+#define _NET_WM_STATE_TOGGLE 2
+
+void GLWindow::Force43Ratio()
+{
+#ifndef USE_GSOPEN2
+ // avoid black border in fullscreen
+ if (fullScreen && conf.isWideScreen) {
+ conf.width = width;
+ conf.height = height;
+ }
+
+ if(!fullScreen && !conf.isWideScreen) {
+ // Compute the width based on height
+ s32 new_width = (4*height)/3;
+ // do not bother to resize for 5 pixels. Avoid a loop
+ // due to round value
+ if ( ABS(new_width - width) > 5) {
+ width = new_width;
+ conf.width = new_width;
+ // resize the window
+ XLockDisplay(glDisplay);
+ XResizeWindow(glDisplay, glWindow, new_width, height);
+ XSync(glDisplay, False);
+ XUnlockDisplay(glDisplay);
+ }
+ }
+#endif
+}
+
+void GLWindow::UpdateGrabKey()
+{
+ // Do not stole the key in debug mode. It is not breakpoint friendly...
+#ifndef _DEBUG
+ XLockDisplay(glDisplay);
+ if (fullScreen) {
+ XGrabPointer(glDisplay, glWindow, True, ButtonPressMask, GrabModeAsync, GrabModeAsync, glWindow, None, CurrentTime);
+ XGrabKeyboard(glDisplay, glWindow, True, GrabModeAsync, GrabModeAsync, CurrentTime);
+ } else {
+ XUngrabPointer(glDisplay, CurrentTime);
+ XUngrabKeyboard(glDisplay, CurrentTime);
+ }
+ XUnlockDisplay(glDisplay);
+#endif
+}
+
+void GLWindow::ToggleFullscreen()
+{
+#ifndef USE_GSOPEN2
+ if (!glDisplay or !glWindow) return;
+
+ Force43Ratio();
+
+ u32 mask = SubstructureRedirectMask | SubstructureNotifyMask;
+ // Setup a new event structure
+ XClientMessageEvent cme;
+ cme.type = ClientMessage;
+ cme.send_event = True;
+ cme.display = glDisplay;
+ cme.window = glWindow;
+ cme.message_type = XInternAtom(glDisplay, "_NET_WM_STATE", False);
+ cme.format = 32;
+ // Note: can not use _NET_WM_STATE_TOGGLE because the WM can change the fullscreen state
+ // and screw up the fullscreen variable... The test on fulscreen restore a sane configuration
+ cme.data.l[0] = fullScreen ? _NET_WM_STATE_REMOVE : _NET_WM_STATE_ADD;
+ cme.data.l[1] = (u32)XInternAtom(glDisplay, "_NET_WM_STATE_FULLSCREEN", False);
+ cme.data.l[2] = 0;
+ cme.data.l[3] = 0;
+
+ // send the event
+ XLockDisplay(glDisplay);
+ if (!XSendEvent(glDisplay, RootWindow(glDisplay, vi->screen), False, mask, (XEvent*)(&cme)))
+ ZZLog::Error_Log("Failed to send event: toggle fullscreen");
+ else {
+ fullScreen = (!fullScreen);
+ conf.setFullscreen(fullScreen);
+ }
+ XUnlockDisplay(glDisplay);
+
+ // Apply the change
+ XSync(glDisplay, false);
+
+ // Wait a little that the VM does his joes. Actually the best is to check some WM event
+ // but it not sure it will appear so a time out is necessary.
+ usleep(100*1000); // 100 us should be far enough for old computer and unnoticeable for users
+
+ // update info structure
+ GetWindowSize();
+
+ UpdateGrabKey();
+
+ // avoid black border in widescreen fullscreen
+ if (fullScreen && conf.isWideScreen) {
+ conf.width = width;
+ conf.height = height;
+ }
+
+ // Hide the cursor in the right bottom corner
+ if(fullScreen)
+ XWarpPointer(glDisplay, None, glWindow, 0, 0, 0, 0, 2*width, 2*height);
+
+#endif
+}
+
+void GLWindow::ResizeCheck()
+{
+ XEvent event;
+ if (!glDisplay or !glWindow) return;
+
+ XLockDisplay(glDisplay);
+ while (XCheckTypedWindowEvent(glDisplay, glWindow, ConfigureNotify, &event))
+ {
+ if ((event.xconfigure.width != width) || (event.xconfigure.height != height))
+ {
+ width = event.xconfigure.width;
+ height = event.xconfigure.height;
+ Force43Ratio();
+ UpdateWindowSize(width, height);
+ }
+
+ if (!fullScreen) {
+ if ((event.xconfigure.x != conf.x) || (event.xconfigure.y != conf.y))
+ {
+ // Fixme; x&y occassionally gives values near the top left corner rather then the real values,
+ // causing the window to change positions when adjusting ZZOgl's settings.
+ conf.x = event.xconfigure.x;
+ conf.y = event.xconfigure.y;
+ }
+ }
+ }
+ XUnlockDisplay(glDisplay);
+}
+
+void GLWindow::SetTitle(char *strtitle)
+{
+#ifndef USE_GSOPEN2
+ if (!glDisplay or !glWindow) return;
+ if (fullScreen) return;
+
+ XTextProperty prop;
+ memset(&prop, 0, sizeof(prop));
+
+ char* ptitle = strtitle;
+ if (XStringListToTextProperty(&ptitle, 1, &prop)) {
+ XLockDisplay(glDisplay);
+ XSetWMName(glDisplay, glWindow, &prop);
+ XUnlockDisplay(glDisplay);
+ }
+
+ XFree(prop.value);
+#endif
+}
+
+#endif
diff --git a/plugins/zzogl-pg-cg/opengl/GS.h b/plugins/zzogl-pg-cg/opengl/GS.h
new file mode 100644
index 000000000..8bded3f4c
--- /dev/null
+++ b/plugins/zzogl-pg-cg/opengl/GS.h
@@ -0,0 +1,987 @@
+/* ZZ Open GL graphics plugin
+ * Copyright (c)2009-2010 zeydlitz@gmail.com, arcum42@gmail.com
+ * Based on Zerofrog's ZeroGS KOSMOS (c)2005-2008
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef __GS_H__
+#define __GS_H__
+
+
+#define USE_OLD_REGS
+
+#include "Util.h"
+#include "GifTransfer.h"
+#include "HostMemory.h"
+
+using namespace std;
+
+extern float fFPS;
+
+#ifdef _MSC_VER
+#define EXPORT_C_(type) extern "C" type CALLBACK
+#else
+#define EXPORT_C_(type) extern "C" __attribute__((externally_visible,visibility("default"))) type
+#endif
+
+extern int g_LastCRC;
+
+struct Vector_16F
+{
+ u16 x, y, z, w;
+};
+
+// PS2 vertex
+
+// Almost same as VertexGPU, controlled by prim.fst flags
+
+struct Vertex
+{
+ u16 x, y, f, resv0; // note: xy is 12d3
+ u32 rgba;
+ u32 z;
+ float s, t, q;
+ // Texel coordinate of vertex. Used if prim.fst == 1
+ // Bits 0-14 and 16-30 of UV
+ u16 u, v;
+};
+
+struct VertexGPU
+{
+ // gained from XYZ2, XYZ3, XYZF2, XYZF3,
+ // X -- bits 0-15, Y-16-31. Z - 32-63 if no F used, 32-55 otherwise, F (fog) - 56-63
+ // X, Y stored in 12d3 format,
+ s16 x, y;
+ s16 f, resv0;
+
+ // Vertex color settings. RGB -- luminance of red/green/blue, A -- alpha. 1.0 == 0x80.
+ // Goes grom RGBAQ register, bits 0-7, 8-15, 16-23 and 24-31 accordingly
+ u32 rgba;
+ u32 z;
+ // Texture coordinates. S & T going from ST register (bits 0-31, and 32-63).
+ // Q goes from RGBAQ register, bits 32-63
+ float s, t, q;
+
+ void move_x(Vertex v, int offset)
+ {
+ x = ((((int)v.x - offset) >> 1) & 0xffff);
+ }
+
+ void move_y(Vertex v, int offset)
+ {
+ y = ((((int)v.y - offset) >> 1) & 0xffff);
+ }
+
+ void move_z(Vertex v, int mask)
+ {
+ z = (mask == 0xffff) ? min((u32)0xffff, v.z) : v.z;
+ }
+
+ void move_fog(Vertex v)
+ {
+ f = ((s16)(v).f << 7) | 0x7f;
+ }
+
+ void set_xy(s16 x1, s16 y1)
+ {
+ x = x1;
+ y = y1;
+ }
+ void set_xyz(s16 x1, s16 y1, u32 z1)
+ {
+ x = x1;
+ y = y1;
+ z = z1;
+ }
+
+ void set_st(float s1, float t1)
+ {
+ s = s1;
+ t = t1;
+ }
+
+ void set_stq(float s1, float t1, float q1)
+ {
+ s = s1;
+ t = t1;
+ q = q1;
+ }
+
+ void set_xyzst(s16 x1, s16 y1, u32 z1, float s1, float t1)
+ {
+ set_xyz(x1, y1, z1);
+ set_st(s1, t1);
+ }
+
+};
+
+extern GSconf conf;
+
+// PSM values
+// PSM types == Texture Storage Format
+enum PSM_value
+{
+ PSMCT32 = 0, // 00 0000
+ PSMCT24 = 1, // 00 0001
+ PSMCT16 = 2, // 00 0010
+ PSMCT16S = 10, // 00 1010
+ PSMT8 = 19, // 01 0011
+ PSMT4 = 20, // 01 0100
+ PSMT8H = 27, // 01 1011
+ PSMT4HL = 36, // 10 0100
+ PSMT4HH = 44, // 10 1100
+ PSMT32Z = 48, // 11 0000
+ PSMT24Z = 49, // 11 0001
+ PSMT16Z = 50, // 11 0010
+ PSMT16SZ = 58, // 11 1010
+};
+
+// Check target bit mode. PSMCT32 and 32Z return 0, 24 and 24Z - 1
+// 16, 16S, 16Z, 16SZ -- 2, PSMT8 and 8H - 3, PSMT4, 4HL, 4HH -- 4.
+// This code returns the same value on Z-textures, so texel storage mode is (BITMODE and !ISZTEX).
+inline int PSMT_BITMODE(int psm) {return (psm & 0x7);}
+
+inline int PSMT_BITS_NUM(int psm)
+{
+ // Treat these as 32 bit.
+ if ((psm == PSMT8H) || (psm == PSMT4HL) || (psm == PSMT4HH))
+ {
+ return 4;
+ }
+
+ switch (PSMT_BITMODE(psm))
+ {
+ case 4:
+ return 0;
+
+ case 3:
+ return 1;
+
+ case 2:
+ return 2;
+
+ default:
+ return 4;
+ }
+}
+
+// CLUT = Color look up table. Set proper color to table according CLUT table.
+// Used for PSMT8, PSMT8H, PSMT4, PSMT4HH, PSMT4HL textures
+inline bool PSMT_ISCLUT(int psm) { return (PSMT_BITMODE(psm) > 2);}
+
+// PSMCT16, PSMCT16S, PSMT16Z, PSMT16SZ is 16-bit targets and usually there is
+// two of them in each 32-bit word.
+inline bool PSMT_IS16BIT(int psm) { return (PSMT_BITMODE(psm) == 2);}
+
+// PSMT32Z, PSMT24Z, PSMT16Z, PSMT16SZ is Z-buffer textures
+inline bool PSMT_ISZTEX(int psm) {return ((psm & 0x30) == 0x30);}
+
+// PSMCT16, PSMCT16S, PSMT8, PSMT8H, PSMT16Z and PSMT16SZ use only half 16 bit per pixel.
+inline bool PSMT_ISHALF(int psm) {return ((psm & 2) == 2);}
+
+// PSMT8 and PSMT8H use IDTEX8 CLUT, PSMT4H, PSMT4HL, PSMT4HH -- IDTEX4.
+// Don't use it on non clut entries, please!
+inline bool PSMT_IS8CLUT(int psm) {return ((psm & 3) == 3);}
+
+// PSM16Z and PSMT16SZ use -1 offset to z-buff. Need to check this thesis.
+inline bool PSMT_IS16Z(int psm) {return ((psm & 0x32) == 0x32);}
+
+// Check to see if it is 32 bits. According to code comments, anyways.
+// I'll have to look closer at it, because it'd seem like it'd return true for 24 bits.
+// Note: the function only works for clut format. Clut PSM is 4 bits only. The possible value are PSMCT32, PSMCT16, PSMCT16S
+inline bool PSMT_IS32BIT(int psm) {return !!(psm <= 1);}
+
+// When color format is RGB24 (PSMCT24) or RGBA16 (PSMCT16 & 16S) alpha value expanded, based on
+// TEXA register and AEM status.
+inline int PSMT_ALPHAEXP(int psm) {return (psm == PSMCT24 || psm == PSMCT16 || psm == PSMCT16S);}
+
+
+// This function updates the 6th and 5th bit of psm
+// 00 or 11 -> 00 ; 01 -> 10 ; 10 -> 01
+inline int Switch_Top_Bytes (int X) {
+ if ( ( X & 0x30 ) == 0 )
+ return X;
+ else
+ return (X ^ 0x30);
+}
+
+// How many pixel stored in 1 word.
+// PSMT8 has 4 pixels per 32bit, PSMT4 has 8. All 16-bit textures are 2 pixel per bit. And all others are 1 pixel in texture.
+inline int PIXELS_PER_WORD(int psm)
+{
+ if (psm == PSMT8)
+ return 4;
+ if (psm == PSMT4)
+ return 8;
+ if (PSMT_IS16BIT(psm))
+ return 2;
+ return 1;
+}
+
+// Some storage formats could share the same memory block (2 textures in 1 format). This include following combinations:
+// PSMT24(24Z) with either 8H, 4HL, 4HH and PSMT4HL with PSMT4HH.
+// We use slightly different versions of this function on comparison with GSDX, Storage format XOR 0x30 made Z-textures
+// similar to normal ones and change higher bits on short (8 and 4 bits) textures.
+inline bool PSMT_HAS_SHARED_BITS (int fpsm, int tpsm) {
+ int SUM = Switch_Top_Bytes(fpsm) + Switch_Top_Bytes(tpsm) ;
+ return (SUM == 0x15 || SUM == 0x1D || SUM == 0x2C || SUM == 0x30);
+}
+
+// If a clut is in 32-bit color, its size is 4 bytes, and 16-bit clut has a 2 byte size.
+inline int CLUT_PIXEL_SIZE(int cpsm) {return ((cpsm <= 1) ? 4 : 2); }
+
+//----------------------- Data from registers -----------------------
+
+typedef union
+{
+ s64 SD;
+ u64 UD;
+ s32 SL[2];
+ u32 UL[2];
+ s16 SS[4];
+ u16 US[4];
+ s8 SC[8];
+ u8 UC[8];
+} reg64;
+
+/* general purpose regs structs */
+
+typedef struct
+{
+ int fbp;
+ int fbw;
+ int fbh;
+ int psm;
+ u32 fbm;
+} frameInfo;
+
+// Create frame structure from known data
+inline frameInfo CreateFrame(int fbp, int fbw, int fbh, int psm, u32 fbm)
+{
+ frameInfo frame;
+ frame.fbp = fbp;
+ frame.fbw = fbw;
+ frame.fbh = fbh;
+ frame.psm = psm;
+ frame.fbm = fbm;
+ return frame;
+}
+
+typedef struct
+{
+ u16 prim;
+
+ union
+ {
+ struct
+ {
+ u16 iip : 1;
+ u16 tme : 1;
+ u16 fge : 1;
+ u16 abe : 1;
+ u16 aa1 : 1;
+ u16 fst : 1;
+ u16 ctxt : 1;
+ u16 fix : 1;
+ u16 resv : 8;
+ };
+ u16 _val;
+ };
+} primInfo;
+
+extern primInfo *prim;
+
+typedef union
+{
+ struct
+ {
+ u32 ate : 1;
+ u32 atst : 3;
+ u32 aref : 8;
+ u32 afail : 2;
+ u32 date : 1;
+ u32 datm : 1;
+ u32 zte : 1;
+ u32 ztst : 2;
+ u32 resv : 13;
+ };
+ u32 _val;
+} pixTest;
+
+typedef struct
+{
+ int bp;
+ int bw;
+ int psm;
+} bufInfo;
+
+typedef struct
+{
+ int tbp0;
+ int tbw;
+ int cbp;
+ u16 tw, th;
+ u8 psm;
+ u8 tcc;
+ u8 tfx;
+ u8 cpsm;
+ u8 csm;
+ u8 csa;
+ u8 cld;
+} tex0Info;
+
+union tex_0_info
+{
+ struct
+ {
+ u64 tbp0 : 14;
+ u64 tbw : 6;
+ u64 psm : 6;
+ u64 tw : 4;
+ u64 th : 4;
+ u64 tcc : 1;
+ u64 tfx : 2;
+ u64 cbp : 14;
+ u64 cpsm : 4;
+ u64 csm : 1;
+ u64 csa : 5;
+ u64 cld : 3;
+ };
+
+ u64 _u64;
+ u32 _u32[2];
+ u16 _u16[4];
+ u8 _u8[8];
+
+ tex_0_info(u64 data) { _u64 = data; }
+ tex_0_info(u32 data) { _u32[0] = data; _u32[1] = 0; }
+ tex_0_info(u32 data0, u32 data1) { _u32[0] = data0; _u32[1] = data1; }
+
+ u32 tbw_mult()
+ {
+ if (tbw == 0)
+ return 64;
+ else
+ return ((u32)tbw << 6);
+ }
+
+ u32 psm_fix()
+ {
+ // ZZLog::Debug_Log("psm %d\n", psm);
+ if (psm == 9) return 1;
+
+ return psm;
+ }
+
+ u32 tw_exp()
+ {
+ if (tw > 10) return (1 << 10);
+
+ return (1 << tw);
+ }
+
+ u32 th_exp()
+ {
+ if (th > 10) return (1 << 10);
+
+ return (1 << th);
+ }
+
+ u32 cpsm_fix()
+ {
+ return cpsm & 0xe;
+ }
+
+ u32 csa_fix()
+ {
+ if (cpsm < 2)
+ return (csa & 0xf);
+ else
+ return (csa & 0x1f);
+ }
+};
+
+#define TEX_MODULATE 0
+#define TEX_DECAL 1
+#define TEX_HIGHLIGHT 2
+#define TEX_HIGHLIGHT2 3
+
+bool SaveTexture(const char* filename, u32 textarget, u32 tex, int width, int height);
+extern void SaveTex(tex0Info* ptex, int usevid);
+extern char* NamedSaveTex(tex0Info* ptex, int usevid);
+
+typedef struct
+{
+ int lcm;
+ int mxl;
+ int mmag;
+ int mmin;
+ int mtba;
+ int l;
+ int k;
+} tex1Info;
+
+typedef struct
+{
+ int wms;
+ int wmt;
+ int minu;
+ int maxu;
+ int minv;
+ int maxv;
+} clampInfo;
+
+typedef struct
+{
+ int cbw;
+ int cou;
+ int cov;
+} clutInfo;
+
+typedef struct
+{
+ int tbp[3];
+ int tbw[3];
+} miptbpInfo;
+
+typedef struct
+{
+ u16 aem;
+ u8 ta[2];
+ float fta[2];
+} texaInfo;
+
+typedef struct
+{
+ int sx;
+ int sy;
+ int dx;
+ int dy;
+ int diry;
+ int dirx;
+} trxposInfo;
+
+typedef struct
+{
+ union
+ {
+ struct
+ {
+ u8 a : 2;
+ u8 b : 2;
+ u8 c : 2;
+ u8 d : 2;
+ };
+ u8 abcd;
+ };
+
+ u8 fix : 8;
+} alphaInfo;
+
+typedef struct
+{
+ u16 zbp; // u16 address / 64
+ u8 psm;
+ u8 zmsk;
+} zbufInfo;
+
+typedef struct
+{
+ int fba;
+} fbaInfo;
+
+typedef struct
+{
+ Vertex gsvertex[4]; // circular buffer that contains the vertex
+ Vertex gsTriFanVertex; // Base of triangle fan primitive vertex
+ u32 rgba; // global color for flat shading texture
+ float q;
+ Vertex vertexregs; // accumulation buffer that collect current vertex data
+
+ int primC; // number of verts current storing
+ int primIndex; // current prim index
+ int nTriFanVert; // remember the index of the base of triangle fan
+ int new_tri_fan; // 1 if we process a new triangle fan primitive. 0 otherwise
+
+ int prac;
+ int dthe;
+ int colclamp;
+ int fogcol;
+ int smask;
+ int pabe;
+ u64 buff[2];
+ int buffsize;
+ int cbp[2]; // internal cbp registers
+
+ u32 CSRw;
+
+ primInfo _prim[2];
+ bufInfo srcbuf, srcbufnew;
+ bufInfo dstbuf, dstbufnew;
+
+ clutInfo clut;
+
+ texaInfo texa;
+ trxposInfo trxpos, trxposnew;
+
+ int imageWtemp, imageHtemp;
+
+ int imageTransfer;
+ int imageWnew, imageHnew, imageX, imageY, imageEndX, imageEndY;
+
+ pathInfo path[4];
+ GIFRegDIMX dimx;
+ GSMemory mem;
+ GSClut clut_buffer;
+ int primNext(int inc = 1)
+ {
+ // Note: ArraySize(gsvertex) == 2^n => modulo is replaced by an and instruction
+ return ((primIndex + inc) % ArraySize(gsvertex));
+ }
+
+ int primPrev(int dec = 1)
+ {
+ // Note: assert( dec <= ArraySize(gsvertex) );
+ // Note: ArraySize(gsvertex) == 2^n => modulo is replaced by an and instruction
+ return ((primIndex + (ArraySize(gsvertex) - dec)) % ArraySize(gsvertex));
+ }
+
+ void setRGBA(u32 r, u32 g, u32 b, u32 a)
+ {
+ rgba = (r & 0xff) |
+ ((g & 0xff) << 8) |
+ ((b & 0xff) << 16) |
+ ((a & 0xff) << 24);
+ }
+
+ inline void add_vertex(u16 x, u16 y, u32 z, u16 f)
+ {
+ vertexregs.x = x;
+ vertexregs.y = y;
+ vertexregs.z = z;
+ vertexregs.f = f;
+ if (likely(!new_tri_fan)) {
+ gsvertex[primIndex] = vertexregs;
+ } else {
+ gsTriFanVertex = vertexregs;
+ new_tri_fan = false;
+ }
+ }
+
+ inline void add_vertex(u16 x, u16 y, u32 z)
+ {
+ vertexregs.x = x;
+ vertexregs.y = y;
+ vertexregs.z = z;
+ if (likely(!new_tri_fan)) {
+ gsvertex[primIndex] = vertexregs;
+ } else {
+ gsTriFanVertex = vertexregs;
+ new_tri_fan = false;
+ }
+ }
+} GSinternal;
+
+extern GSinternal gs;
+
+// Note the function is used in a template parameter so it must be declared extern
+// Note2: In this case extern is not compatible with __forceinline so just inline it...
+extern inline u16 RGBA32to16(u32 c)
+{
+ return (u16)((((c) & 0x000000f8) >> 3) |
+ (((c) & 0x0000f800) >> 6) |
+ (((c) & 0x00f80000) >> 9) |
+ (((c) & 0x80000000) >> 16));
+}
+
+static __forceinline u32 RGBA16to32(u16 c)
+{
+ return (((c) & 0x001f) << 3) |
+ (((c) & 0x03e0) << 6) |
+ (((c) & 0x7c00) << 9) |
+ (((c) & 0x8000) ? 0xff000000 : 0);
+}
+
+#if 0
+// converts float16 [0,1] to BYTE [0,255] (assumes value is in range, otherwise will take lower 8bits)
+// f is a u16
+static __forceinline u16 Float16ToBYTE(u16 f)
+{
+ //assert( !(f & 0x8000) );
+ if (f & 0x8000) return 0;
+
+ u16 d = ((((f & 0x3ff) | 0x400) * 255) >> (10 - ((f >> 10) & 0x1f) + 15));
+
+ return d > 255 ? 255 : d;
+}
+
+static __forceinline u16 Float16ToALPHA(u16 f)
+{
+ //assert( !(f & 0x8000) );
+ if (f & 0x8000) return 0;
+
+ // round up instead of down (crash and burn), too much and charlie breaks
+ u16 d = (((((f & 0x3ff) | 0x400)) * 255) >> (10 - ((f >> 10) & 0x1f) + 15));
+
+ d = (d) >> 1;
+
+ return d > 255 ? 255 : d;
+}
+
+#ifndef COLOR_ARGB
+#define COLOR_ARGB(a,r,g,b) \
+ ((u32)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff)))
+#endif
+
+// assumes that positive in [1,2] (then extracts fraction by just looking at the specified bits)
+#define Float16ToBYTE_2(f) ((u8)(*(u16*)&f>>2))
+#define Float16To5BIT(f) (Float16ToBYTE(f)>>3)
+
+#define Float16Alpha(f) (((*(u16*)&f&0x7c00)>=0x3900)?0x8000:0) // alpha is >= 1
+
+// converts an array of 4 u16s to a u32 color
+// f is a pointer to a u16
+#define Float16ToARGB(f) COLOR_ARGB(Float16ToALPHA(f.w), Float16ToBYTE(f.x), Float16ToBYTE(f.y), Float16ToBYTE(f.z));
+
+#define Float16ToARGB16(f) (Float16Alpha(f.w)|(Float16To5BIT(f.x)<<10)|(Float16To5BIT(f.y)<<5)|Float16To5BIT(f.z))
+
+// used for Z values
+#define Float16ToARGB_Z(f) COLOR_ARGB((u32)Float16ToBYTE_2(f.w), Float16ToBYTE_2(f.x), Float16ToBYTE_2(f.y), Float16ToBYTE_2(f.z))
+#define Float16ToARGB16_Z(f) ((Float16ToBYTE_2(f.y)<<8)|Float16ToBYTE_2(f.z))
+#endif
+
+
+inline float Clamp(float fx, float fmin, float fmax)
+{
+ if (fx < fmin) return fmin;
+
+ return fx > fmax ? fmax : fx;
+}
+
+// Get pixel storage format from tex0. Clutted textures store pixels in cpsm format.
+inline int PIXEL_STORAGE_FORMAT(const tex0Info& tex) {
+ if (PSMT_ISCLUT(tex.psm))
+ return tex.cpsm;
+ else
+ return tex.psm;
+ }
+
+// If pixel storage format not PSMCT24 ot PSMCT32, then it is 16-bit.
+// Z-textures have 0x30 upper bits, so we eliminate them by &&(~0x30)
+inline bool PSMT_ISHALF_STORAGE(const tex0Info& tex0) { return ((PIXEL_STORAGE_FORMAT(tex0) & (~0x30)) > 1); }
+
+//--------------------------- Inlines for bitwise ops
+//--------------------------- textures
+// Tex0Info (TEXD_x registers) bits, lower word
+// The register is really 64-bit, but we use 2 32bit ones to represent it
+// Obtain tbp0 -- Texture Buffer Base Pointer (Word Address/64) -- from data. Bits 0-13.
+static __forceinline int ZZOglGet_tbp0_TexBits(u32 data)
+{
+ //return tex_0_info(data).tbp0;
+ return (data) & 0x3fff;
+}
+
+// Obtain tbw -- Texture Buffer Width (Texels/64) -- from data, do not multiply to 64. Bits 14-19
+// ( data & 0xfc000 ) >> 14
+static __forceinline int ZZOglGet_tbw_TexBits(u32 data)
+{
+ //return tex_0_info(data).tbw;
+ return (data >> 14) & 0x3f;
+}
+
+// Obtain tbw -- Texture Buffer Width (Texels) -- from data, do multiply to 64, never return 0.
+static __forceinline int ZZOglGet_tbw_TexBitsMult(u32 data)
+{
+ //return text_0_info(data).tbw_mult();
+ int result = ZZOglGet_tbw_TexBits(data);
+
+ if (result == 0)
+ return 64;
+ else
+ return (result << 6);
+}
+
+// Obtain psm -- Pixel Storage Format -- from data. Bits 20-25.
+// (data & 0x3f00000) >> 20
+static __forceinline int ZZOglGet_psm_TexBits(u32 data)
+{
+ //return tex_0_info(data).psm;
+ return ((data >> 20) & 0x3f);
+}
+
+// Obtain psm -- Pixel Storage Format -- from data. Bits 20-25. Fix incorrect psm == 9
+static __forceinline int ZZOglGet_psm_TexBitsFix(u32 data)
+{
+ //return tex_0_info(data).psm_fix();
+ int result = ZZOglGet_psm_TexBits(data) ;
+// ZZLog::Debug_Log("result %d", result);
+
+ if (result == 9) result = 1;
+
+ return result;
+}
+
+// Obtain tw -- Texture Width (Width = 2^TW) -- from data. Bits 26-29
+// (data & 0x3c000000)>>26
+static __forceinline u16 ZZOglGet_tw_TexBits(u32 data)
+{
+ //return tex_0_info(data).tw;
+ return ((data >> 26) & 0xf);
+}
+
+// Obtain tw -- Texture Width (Width = TW) -- from data. Width could newer be more than 1024.
+static __forceinline u16 ZZOglGet_tw_TexBitsExp(u32 data)
+{
+ //return tex_0_info(data).tw_exp();
+ u16 result = ZZOglGet_tw_TexBits(data);
+
+ if (result > 10) result = 10;
+
+ return (1 << result);
+}
+
+// TH set at the border of upper and higher words.
+// Obtain th -- Texture Height (Height = 2^TH) -- from data. Bits 30-31 lower, 0-1 higher
+// (dataLO & 0xc0000000) >> 30 + (dataHI & 0x3) * 0x4
+static __forceinline u16 ZZOglGet_th_TexBits(u32 dataLO, u32 dataHI)
+{
+ //return tex_0_info(dataLO, dataHI).th;
+ return (((dataLO >> 30) & 0x3) | ((dataHI & 0x3) << 2));
+}
+
+// Obtain th --Texture Height (Height = 2^TH) -- from data. Height could newer be more than 1024.
+static __forceinline u16 ZZOglGet_th_TexBitsExp(u32 dataLO, u32 dataHI)
+{
+ //return tex_0_info(dataLO, dataHI).th_exp();
+ u16 result = ZZOglGet_th_TexBits(dataLO, dataHI);
+
+ if (result > 10) result = 10;
+
+ return (1 << result);
+}
+
+// Tex0Info bits, higher word.
+// Obtain tcc -- Texture Color Component 0=RGB, 1=RGBA + use Alpha from TEXA reg when not in PSM -- from data. Bit 3
+// (data & 0x4)>>2
+static __forceinline u8 ZZOglGet_tcc_TexBits(u32 data)
+{
+ //return tex_0_info(0, data).tcc;
+ return ((data >> 2) & 0x1);
+}
+
+// Obtain tfx -- Texture Function (0=modulate, 1=decal, 2=hilight, 3=hilight2) -- from data. Bit 4-5
+// (data & 0x18)>>3
+static __forceinline u8 ZZOglGet_tfx_TexBits(u32 data)
+{
+ //return tex_0_info(0, data).tfx;
+ return ((data >> 3) & 0x3);
+}
+
+// Obtain cbp from data -- Clut Buffer Base Pointer (Address/256) -- Bits 5-18
+// (data & 0x7ffe0)>>5
+static __forceinline int ZZOglGet_cbp_TexBits(u32 data)
+{
+ //return tex_0_info(0, data).cbp;
+ return ((data >> 5) & 0x3fff);
+}
+
+// Obtain cpsm from data -- Clut pixel Storage Format -- Bits 19-22. 22nd is at no use.
+// (data & 0x700000)>>19
+// 0000 - psmct32; 0010 - psmct16; 1010 - psmct16s.
+static __forceinline u8 ZZOglGet_cpsm_TexBits(u32 data)
+{
+ //return (tex_0_info(0, data).cpsm & 0xe);
+ return ((data >> 19) & 0xe);
+}
+
+// Obtain csm -- I don't know what is it -- from data. Bit 23
+// (data & 0x800000)>>23
+// csm is the clut storage mode. 0 for CSM1, 1 for CSM2.
+static __forceinline u8 ZZOglGet_csm_TexBits(u32 data)
+{
+ //return tex_0_info(0, data).csm;
+ return ((data >> 23) & 0x1);
+}
+
+// Obtain csa -- -- from data. Bits 24-28
+// (data & 0x1f000000)>>24
+static __forceinline u8 ZZOglGet_csa_TexBits(u32 data)
+{
+ //return tex_0_info(0, data).csa_fix();
+
+ if ((data & 0x700000) == 0) // it is cpsm < 2 check
+ return ((data >> 24) & 0xf);
+ else
+ return ((data >> 24) & 0x1f);
+}
+
+// Obtain cld -- -- from data. Bits 29-31
+// (data & 0xe0000000)>>29
+static __forceinline u8 ZZOglGet_cld_TexBits(u32 data)
+{
+ //return tex_0_info(0, data).cld;
+ return ((data >> 29) & 0x7);
+}
+
+//-------------------------- frames
+// FrameInfo bits.
+// Obtain fbp -- frame Buffer Base Pointer (Word Address/2048) -- from data. Bits 0-15
+inline int ZZOglGet_fbp_FrameBits(u32 data)
+{
+ return ((data) & 0x1ff);
+}
+
+// So we got address / 64, henceby frame fbp and tex tbp have the same dimension -- "real address" is x64.
+inline int ZZOglGet_fbp_FrameBitsMult(u32 data)
+{
+ return (ZZOglGet_fbp_FrameBits(data) << 5);
+}
+
+// Obtain fbw -- width (Texels/64) -- from data. Bits 16-23
+inline int ZZOglGet_fbw_FrameBits(u32 data)
+{
+ return ((data >> 16) & 0x3f);
+}
+
+inline int ZZOglGet_fbw_FrameBitsMult(u32 data)
+{
+ return (ZZOglGet_fbw_FrameBits(data) << 6);
+}
+
+
+// Obtain psm -- Pixel Storage Format -- from data. Bits 24-29.
+// (data & 0x3f000000) >> 24
+inline int ZZOglGet_psm_FrameBits(u32 data)
+{
+ return ((data >> 24) & 0x3f);
+}
+
+// Function for calculating overal height from frame data.
+inline int ZZOgl_fbh_Calc(int fbp, int fbw, int psm)
+{
+ int fbh = (1024 * 1024 - 64 * fbp) / fbw;
+ fbh &= ~0x1f;
+
+ if (PSMT_ISHALF(psm)) fbh *= 2;
+ if (fbh > 1024) fbh = 1024;
+
+ //ZZLog::Debug_Log("ZZOgl_fbh_Calc: 0x%x", fbh);
+ return fbh;
+}
+
+inline int ZZOgl_fbh_Calc(frameInfo frame)
+{
+ return ZZOgl_fbh_Calc(frame.fbp, frame.fbw, frame.psm);
+}
+
+// Calculate fbh from data, It does not set in register
+inline int ZZOglGet_fbh_FrameBitsCalc(u32 data)
+{
+ int fbh = 0;
+ int fbp = ZZOglGet_fbp_FrameBits(data);
+ int fbw = ZZOglGet_fbw_FrameBits(data);
+ int psm = ZZOglGet_psm_FrameBits(data);
+
+ if (fbw > 0) fbh = ZZOgl_fbh_Calc(fbp, fbw, psm) ;
+
+ return fbh ;
+}
+
+// Obtain fbm -- frame mask -- from data. All higher word.
+inline u32 ZZOglGet_fbm_FrameBits(u32 data)
+{
+ return (data);
+}
+
+// Obtain fbm -- frame mask -- from data. All higher word. Fixed from psm == PCMT24 (without alpha)
+inline u32 ZZOglGet_fbm_FrameBitsFix(u32 dataLO, u32 dataHI)
+{
+ if (PSMT_BITMODE(ZZOglGet_psm_FrameBits(dataLO)) == 1)
+ return (dataHI | 0xff000000);
+ else
+ return dataHI;
+}
+
+// obtain colormask RED
+inline u32 ZZOglGet_fbmRed_FrameBits(u32 data)
+{
+ return (data & 0xff);
+}
+
+// obtain colormask Green
+inline u32 ZZOglGet_fbmGreen_FrameBits(u32 data)
+{
+ return ((data >> 8) & 0xff);
+}
+
+// obtain colormask Blue
+inline u32 ZZOglGet_fbmBlue_FrameBits(u32 data)
+{
+ return ((data >> 16) & 0xff);
+}
+
+// obtain colormask Alpha
+inline u32 ZZOglGet_fbmAlpha_FrameBits(u32 data)
+{
+ return ((data >> 24) & 0xff);
+}
+
+// obtain colormask Alpha
+inline u32 ZZOglGet_fbmHighByte(u32 data)
+{
+ return (!!(data & 0x80000000));
+}
+
+//-------------------------- tex0 comparison
+// Check if old and new tex0 registers have only clut difference
+inline bool ZZOglAllExceptClutIsSame(const u32* oldtex, const u32* newtex)
+{
+ return ((oldtex[0] == newtex[0]) && ((oldtex[1] & 0x1f) == (newtex[1] & 0x1f)));
+}
+
+// Check if the CLUT registers are same, except CLD
+inline bool ZZOglClutMinusCLDunchanged(const u32* oldtex, const u32* newtex)
+{
+ return ((oldtex[1] & 0x1fffffe0) == (newtex[1] & 0x1fffffe0));
+}
+
+// Check if CLUT storage mode is not changed (CSA, CSM and CSPM)
+inline bool ZZOglClutStorageUnchanged(const u32* oldtex, const u32* newtex)
+{
+ return ((oldtex[1] & 0x1ff10000) == (newtex[1] & 0x1ff10000));
+}
+
+// call to load CLUT data (depending on CLD)
+void texClutWrite(int ctx);
+
+// Perform clutting for flushed texture. Better check if it needs a prior call.
+inline void CluttingForFlushedTex(tex0Info* tex0, u32 Data, int ictx)
+{
+ tex0->cbp = ZZOglGet_cbp_TexBits(Data);
+ tex0->cpsm = ZZOglGet_cpsm_TexBits(Data);
+ tex0->csm = ZZOglGet_csm_TexBits(Data);
+ tex0->csa = ZZOglGet_csa_TexBits(Data);
+ tex0->cld = ZZOglGet_cld_TexBits(Data);
+
+ texClutWrite(ictx);
+ };
+
+// CSA and CPSM bitmask 0001 1111 0111 1000 ...
+// 60 56 52
+#define CPSM_CSA_BITMASK 0x1f780000
+#define CPSM_CSA_NOTMASK 0xe0870000
+
+#endif
diff --git a/plugins/zzogl-pg-cg/opengl/GSDump.cpp b/plugins/zzogl-pg-cg/opengl/GSDump.cpp
new file mode 100644
index 000000000..1da9a63fd
--- /dev/null
+++ b/plugins/zzogl-pg-cg/opengl/GSDump.cpp
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2007-2009 Gabest
+ * http://www.gabest.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, 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 GNU Make; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ */
+
+#include "GSDump.h"
+
+GSDump::GSDump()
+ : m_gs(NULL)
+ , m_frames(0)
+{
+}
+
+GSDump::~GSDump()
+{
+ Close();
+}
+
+void GSDump::Open(const string& fn, u32 crc, const freezeData& fd, u8* regs)
+{
+ if (m_gs) return;
+
+ m_gs = fopen(fn.c_str(), "wb");
+
+ m_frames = 0;
+
+ if(m_gs)
+ {
+ fwrite(&crc, 4, 1, m_gs);
+ fwrite(&fd.size, 4, 1, m_gs);
+ fwrite(fd.data, fd.size, 1, m_gs);
+ fwrite(regs, 0x2000, 1, m_gs);
+ }
+}
+
+void GSDump::Close()
+{
+ if(m_gs) {
+ fclose(m_gs);
+ m_gs = NULL;
+ fprintf(stderr, "Closing GS dump");
+ }
+}
+
+void GSDump::Transfer(int index, const u8* mem, size_t size)
+{
+ if(m_gs && size > 0)
+ {
+ fputc(0, m_gs);
+ fputc(index, m_gs);
+ fwrite(&size, 4, 1, m_gs);
+ fwrite(mem, size, 1, m_gs);
+ }
+}
+
+void GSDump::ReadFIFO(u32 size)
+{
+ if(m_gs && size > 0)
+ {
+ fputc(2, m_gs);
+ fwrite(&size, 4, 1, m_gs);
+ }
+}
+
+void GSDump::VSync(int field, bool last, u8* regs)
+{
+ if(m_gs)
+ {
+ fputc(3, m_gs);
+ fwrite(regs, 0x2000, 1, m_gs);
+
+ fputc(1, m_gs);
+ fputc(field, m_gs);
+
+ if((++m_frames & 1) == 0 && last)
+ {
+ Close();
+ }
+ }
+}
diff --git a/plugins/zzogl-pg-cg/opengl/GSDump.h b/plugins/zzogl-pg-cg/opengl/GSDump.h
new file mode 100644
index 000000000..68c2a5c19
--- /dev/null
+++ b/plugins/zzogl-pg-cg/opengl/GSDump.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2007-2009 Gabest
+ * http://www.gabest.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, 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 GNU Make; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ */
+
+#pragma once
+
+#include "Util.h"
+
+using namespace std;
+
+/*
+
+Dump file format:
+- [crc/4] [state size/4] [state data/size] [PMODE/0x2000] [id/1] [data/?] .. [id/1] [data/?]
+
+Transfer data (id == 0)
+- [0/1] [path index/1] [size/4] [data/size]
+
+VSync data (id == 1)
+- [1/1] [field/1]
+
+ReadFIFO2 data (id == 2)
+- [2/1] [size/?]
+
+Regs data (id == 3)
+- [PMODE/0x2000]
+
+*/
+
+class GSDump
+{
+ FILE* m_gs;
+ int m_frames;
+
+public:
+ GSDump();
+ virtual ~GSDump();
+
+ void Open(const string& fn, u32 crc, const freezeData& fd, u8* regs);
+ void Close();
+ void ReadFIFO(u32 size);
+ void Transfer(int index, const u8* mem, size_t size);
+ void VSync(int field, bool last, u8* regs);
+ operator bool() {return m_gs != NULL;}
+};
+
+extern GSDump g_dump;
+
diff --git a/plugins/zzogl-pg-cg/opengl/GSmain.cpp b/plugins/zzogl-pg-cg/opengl/GSmain.cpp
new file mode 100644
index 000000000..56f4ee765
--- /dev/null
+++ b/plugins/zzogl-pg-cg/opengl/GSmain.cpp
@@ -0,0 +1,801 @@
+/* ZZ Open GL graphics plugin
+ * Copyright (c)2009-2010 zeydlitz@gmail.com, arcum42@gmail.com
+ * Based on Zerofrog's ZeroGS KOSMOS (c)2005-2008
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "Util.h"
+#include "GS.h"
+#include "Profile.h"
+#include "GLWin.h"
+#include "ZZoglFlushHack.h"
+
+
+using namespace std;
+
+extern void SaveSnapshot(const char* filename);
+
+#ifdef _MSC_VER
+#pragma warning(disable:4244)
+#endif
+
+GLWindow GLWin;
+GSinternal gs;
+GSconf conf;
+GSDump g_dump;
+
+int ppf, g_GSMultiThreaded, CurrentSavestate = 0;
+int g_LastCRC = 0, g_TransferredToGPU = 0, s_frameskipping = 0;
+int g_SkipFlushFrame = 0;
+GetSkipCount GetSkipCount_Handler = 0;
+
+int UPDATE_FRAMES = 16, g_nFrame = 0, g_nRealFrame = 0;
+float fFPS = 0;
+
+void (*GSirq)();
+u8* g_pBasePS2Mem = NULL;
+wxString s_strIniPath(L"inis"); // Air's new ini path (r2361)
+
+bool SaveStateExists = true; // We could not know save slot status before first change occured
+const char* SaveStateFile = NULL; // Name of SaveFile for access check.
+
+extern const char* s_aa[5];
+extern const char* pbilinear[];
+// statistics
+u32 g_nGenVars = 0, g_nTexVars = 0, g_nAlphaVars = 0, g_nResolve = 0;
+
+#define VER 3
+const unsigned char zgsversion = PS2E_GS_VERSION;
+unsigned char zgsrevision = 0; // revision and build gives plugin version
+unsigned char zgsbuild = VER;
+unsigned char zgsminor = 0;
+
+#ifdef _DEBUG
+char *libraryName = "ZZ Ogl PG CG (Debug) ";
+#elif defined(ZEROGS_DEVBUILD)
+char *libraryName = "ZZ Ogl PG CG (Dev) ";
+#else
+char *libraryName = "ZZ Ogl PG CG ";
+#endif
+
+extern int g_nPixelShaderVer, g_nFrameRender, g_nFramesSkipped;
+
+extern void WriteAA();
+extern void WriteBilinear();
+extern void ZZDestroy();
+extern bool ZZCreate(int width, int height);
+extern void ZZGSStateReset();
+extern int ZZSave(s8* pbydata);
+extern bool ZZLoad(s8* pbydata);
+
+// switches the render target to the real target, flushes the current render targets and renders the real image
+extern void RenderCRTC(int interlace);
+
+#if defined(_WIN32) && defined(_DEBUG)
+HANDLE g_hCurrentThread = NULL;
+#endif
+
+extern int VALIDATE_THRESH;
+extern u32 TEXDESTROY_THRESH;
+
+u32 CALLBACK PS2EgetLibType()
+{
+ return PS2E_LT_GS;
+}
+
+char* CALLBACK PS2EgetLibName()
+{
+ return libraryName;
+}
+
+u32 CALLBACK PS2EgetLibVersion2(u32 type)
+{
+ return (zgsversion << 16) | (zgsrevision << 8) | zgsbuild | (zgsminor << 24);
+}
+
+void CALLBACK GSsetBaseMem(void* pmem)
+{
+ g_pBasePS2Mem = (u8*)pmem;
+}
+
+void CALLBACK GSsetSettingsDir(const char* dir)
+{
+ s_strIniPath = (dir == NULL) ? wxString(L"inis") : wxString(dir, wxConvFile);
+}
+
+void CALLBACK GSsetLogDir(const char* dir)
+{
+ ZZLog::SetDir(dir);
+}
+
+void CALLBACK GSsetGameCRC(int crc, int options)
+{
+ // build a list of function pointer for GetSkipCount (SkipDraw)
+ static GetSkipCount GSC_list[NUMBER_OF_TITLES];
+ static bool inited = false;
+
+ if (!inited)
+ {
+ inited = true;
+
+ memset(GSC_list, 0, sizeof(GSC_list));
+
+ GSC_list[Okami] = GSC_Okami;
+ GSC_list[MetalGearSolid3] = GSC_MetalGearSolid3;
+ GSC_list[DBZBT2] = GSC_DBZBT2;
+ GSC_list[DBZBT3] = GSC_DBZBT3;
+ GSC_list[SFEX3] = GSC_SFEX3;
+ GSC_list[Bully] = GSC_Bully;
+ GSC_list[BullyCC] = GSC_BullyCC;
+ GSC_list[SoTC] = GSC_SoTC;
+ GSC_list[OnePieceGrandAdventure] = GSC_OnePieceGrandAdventure;
+ GSC_list[OnePieceGrandBattle] = GSC_OnePieceGrandBattle;
+ GSC_list[ICO] = GSC_ICO;
+ GSC_list[GT4] = GSC_GT4;
+ GSC_list[WildArms4] = GSC_WildArms4;
+ GSC_list[WildArms5] = GSC_WildArms5;
+ GSC_list[Manhunt2] = GSC_Manhunt2;
+ GSC_list[CrashBandicootWoC] = GSC_CrashBandicootWoC;
+ GSC_list[ResidentEvil4] = GSC_ResidentEvil4;
+ GSC_list[Spartan] = GSC_Spartan;
+ GSC_list[AceCombat4] = GSC_AceCombat4;
+ GSC_list[Drakengard2] = GSC_Drakengard2;
+ GSC_list[Tekken5] = GSC_Tekken5;
+ GSC_list[IkkiTousen] = GSC_IkkiTousen;
+ GSC_list[GodOfWar] = GSC_GodOfWar;
+ GSC_list[GodOfWar2] = GSC_GodOfWar2;
+ GSC_list[GiTS] = GSC_GiTS;
+ GSC_list[Onimusha3] = GSC_Onimusha3;
+ GSC_list[TalesOfAbyss] = GSC_TalesOfAbyss;
+ GSC_list[SonicUnleashed] = GSC_SonicUnleashed;
+ GSC_list[Genji] = GSC_Genji;
+ GSC_list[StarOcean3] = GSC_StarOcean3;
+ GSC_list[ValkyrieProfile2] = GSC_ValkyrieProfile2;
+ GSC_list[RadiataStories] = GSC_RadiataStories;
+ }
+
+ // TEXDESTROY_THRESH starts out at 16.
+ VALIDATE_THRESH = 8;
+ conf.mrtdepth = (conf.settings().disable_mrt_depth != 0);
+
+ if (!conf.mrtdepth)
+ ZZLog::WriteLn("Disabling MRT depth writing.");
+ else
+ ZZLog::WriteLn("Enabling MRT depth writing.");
+
+ bool CRCValueChanged = (g_LastCRC != crc);
+
+ g_LastCRC = crc;
+
+ if (crc != 0) ZZLog::WriteLn("Current game CRC is %x.", crc);
+
+ if (CRCValueChanged && (crc != 0))
+ {
+ for (int i = 0; i < GAME_INFO_INDEX; i++)
+ {
+ if (crc_game_list[i].crc == crc)
+ {
+ ZZLog::WriteLn("Found CRC[%x] in crc game list.", crc);
+
+ if (crc_game_list[i].v_thresh > 0)
+ {
+ VALIDATE_THRESH = crc_game_list[i].v_thresh;
+ ZZLog::WriteLn("Setting VALIDATE_THRESH to %d", VALIDATE_THRESH);
+ }
+
+ if (crc_game_list[i].t_thresh > 0)
+ {
+ TEXDESTROY_THRESH = crc_game_list[i].t_thresh;
+ ZZLog::WriteLn("Setting TEXDESTROY_THRESH to %d", TEXDESTROY_THRESH);
+ }
+
+ // FIXME need to check SkipDraw is positive (enabled by users)
+ GetSkipCount_Handler = GSC_list[crc_game_list[i].title];
+
+ if (!conf.disableHacks)
+ {
+ conf.def_hacks._u32 |= crc_game_list[i].flags;
+ ListHacks();
+ }
+ return;
+ }
+ }
+ }
+ ListHacks();
+}
+
+void CALLBACK GSsetFrameSkip(int frameskip)
+{
+ FUNCLOG
+ s_frameskipping |= frameskip;
+
+ if (frameskip && g_nFrameRender > 1)
+ {
+ SetFrameSkip(true);
+ }
+ else if (!frameskip && g_nFrameRender <= 0)
+ {
+ SetFrameSkip(false);
+ }
+}
+
+void CALLBACK GSreset()
+{
+ FUNCLOG
+
+ memset(&gs, 0, sizeof(gs));
+
+ ZZGSStateReset();
+
+ gs.prac = 1;
+ prim = &gs._prim[0];
+ gs.imageTransfer = -1;
+ gs.q = 1;
+}
+
+void CALLBACK GSgifSoftReset(u32 mask)
+{
+ FUNCLOG
+
+ if (mask & 1) memset(&gs.path[0], 0, sizeof(gs.path[0]));
+ if (mask & 2) memset(&gs.path[1], 0, sizeof(gs.path[1]));
+ if (mask & 4) memset(&gs.path[2], 0, sizeof(gs.path[2]));
+
+ gs.imageTransfer = -1;
+ gs.q = 1;
+}
+
+s32 CALLBACK GSinit()
+{
+ FUNCLOG
+
+ ZZLog::Open();
+ ZZLog::WriteLn("Calling GSinit.");
+
+ WriteTempRegs();
+ GSreset();
+
+ ZZLog::WriteLn("GSinit finished.");
+ return 0;
+}
+
+__forceinline void InitMisc()
+{
+ WriteBilinear();
+ WriteAA();
+ InitProfile();
+ InitPath();
+ ResetRegs();
+}
+
+s32 CALLBACK GSopen(void *pDsp, char *Title, int multithread)
+{
+ FUNCLOG
+
+ g_GSMultiThreaded = multithread;
+
+ ZZLog::WriteLn("Calling GSopen.");
+
+#if defined(_WIN32) && defined(_DEBUG)
+ g_hCurrentThread = GetCurrentThread();
+#endif
+
+ LoadConfig();
+ strcpy(GLWin.title, Title);
+
+ ZZLog::GS_Log("Using %s:%d.%d.%d.", libraryName, zgsrevision, zgsbuild, zgsminor);
+
+ ZZLog::WriteLn("Creating ZZOgl window.");
+ if ((!GLWin.CreateWindow(pDsp)) || (!ZZCreate(conf.width, conf.height))) return -1;
+
+ ZZLog::WriteLn("Initialization successful.");
+
+ InitMisc();
+ ZZLog::GS_Log("GSopen finished.");
+ return 0;
+}
+
+#ifdef USE_GSOPEN2
+EXPORT_C_(s32) GSopen2( void* pDsp, u32 flags )
+{
+ FUNCLOG
+
+ g_GSMultiThreaded = true;
+
+ ZZLog::WriteLn("Calling GSopen2.");
+
+#if defined(_WIN32) && defined(_DEBUG)
+ g_hCurrentThread = GetCurrentThread();
+#endif
+
+ LoadConfig();
+
+ ZZLog::GS_Log("Using %s:%d.%d.%d.", libraryName, zgsrevision, zgsbuild, zgsminor);
+
+ ZZLog::WriteLn("Capturing ZZOgl window.");
+ if ((!GLWin.CreateWindow(pDsp)) || (!ZZCreate(conf.width, conf.height))) return -1;
+
+ ZZLog::WriteLn("Initialization successful.");
+
+ InitMisc();
+ ZZLog::GS_Log("GSopen2 finished.");
+ return 0;
+
+}
+#endif
+
+void CALLBACK GSshutdown()
+{
+ FUNCLOG
+
+ ZZLog::Close();
+}
+void CALLBACK GSclose()
+{
+ FUNCLOG
+
+ ZZDestroy();
+ GLWin.CloseWindow();
+
+ SaveStateFile = NULL;
+ SaveStateExists = true; // default value
+ g_LastCRC = 0;
+}
+
+void CALLBACK GSirqCallback(void (*callback)())
+{
+ FUNCLOG
+
+ GSirq = callback;
+}
+
+void CALLBACK GSwriteCSR(u32 write)
+{
+ FUNCLOG
+
+ gs.CSRw = write;
+}
+
+#ifdef _WIN32
+#define access _access
+#endif
+
+void CALLBACK GSchangeSaveState(int newstate, const char* filename)
+{
+ FUNCLOG
+
+ char str[255];
+ sprintf(str, "save state %d", newstate);
+ ZZAddMessage(str);
+ CurrentSavestate = newstate;
+
+ SaveStateFile = filename;
+ SaveStateExists = (access(SaveStateFile, 0) == 0);
+}
+
+static bool get_snapshot_filename(char *filename, char* path, const char* extension)
+{
+ FUNCLOG
+
+ FILE *bmpfile;
+ u32 snapshotnr = 0;
+
+ // increment snapshot value & try to get filename
+
+ for (;;)
+ {
+ snapshotnr++;
+
+ sprintf(filename, "%s/snap%03ld.%s", path, snapshotnr, extension);
+
+ bmpfile = fopen(filename, "rb");
+
+ if (bmpfile == NULL) break;
+
+ fclose(bmpfile);
+ }
+
+ // try opening new snapshot file
+ if ((bmpfile = fopen(filename, "wb")) == NULL)
+ {
+ char strdir[255];
+ sprintf(strdir, "%s", path);
+
+#ifdef _WIN32
+ CreateDirectory(wxString::FromUTF8(strdir), NULL);
+#else
+ mkdir(path, 0777);
+#endif
+
+ if ((bmpfile = fopen(filename, "wb")) == NULL) return false;
+ }
+
+ fclose(bmpfile);
+
+ return true;
+}
+
+void CALLBACK GSmakeSnapshot(char *path)
+{
+ FUNCLOG
+
+ char filename[256];
+ if (get_snapshot_filename(filename, path, (conf.zz_options.tga_snap) ? "bmp" : "jpg"))
+ SaveSnapshot(filename);
+}
+
+// I'll probably move this somewhere else later, but it's got a ton of dependencies.
+static __forceinline void SetGSTitle()
+{
+ char strtitle[256];
+
+#if !defined(ZEROGS_DEVBUILD)
+ const char* g_pShaders[4] = { "full", "reduced", "accurate", "accurate-reduced" };
+ const char* g_pInterlace[3] = { "interlace 0 |", "interlace 1 |", "" };
+ const char* g_pBilinear[3] = { "", "bilinear |", "forced bilinear |" };
+
+ if (SaveStateFile != NULL && !SaveStateExists)
+ SaveStateExists = (access(SaveStateFile, 0) == 0);
+ else
+ SaveStateExists = true;
+
+ sprintf(strtitle, "ZZ Open GL 0.%d.%d | %.1f fps | %s%s%s savestate %d%s | shaders %s | (%.1f)", zgsbuild, zgsminor, fFPS,
+ g_pInterlace[conf.interlace], g_pBilinear[conf.bilinear], (conf.aa ? s_aa[conf.aa] : ""),
+ CurrentSavestate, (SaveStateExists ? "" : "*"),
+ g_pShaders[g_nPixelShaderVer], (ppf&0xfffff) / (float)UPDATE_FRAMES);
+
+#else
+ sprintf(strtitle, "%d | %.1f fps (sk:%d%%) | g: %.1f, t: %.1f, a: %.1f, r: %.1f | p: %.1f | tex: %d %d (%d kbpf)", g_nFrame, fFPS,
+ 100*g_nFramesSkipped / g_nFrame,
+ g_nGenVars / (float)UPDATE_FRAMES, g_nTexVars / (float)UPDATE_FRAMES, g_nAlphaVars / (float)UPDATE_FRAMES,
+ g_nResolve / (float)UPDATE_FRAMES, (ppf&0xfffff) / (float)UPDATE_FRAMES,
+ g_MemTargs.listTargets.size(), g_MemTargs.listClearedTargets.size(), g_TransferredToGPU >> 10);
+
+ //_snprintf(strtitle, 512, "%x %x", *(int*)(g_pbyGSMemory + 256 * 0x3e0c + 4), *(int*)(g_pbyGSMemory + 256 * 0x3e04 + 4));
+#endif
+
+// if( g_nFrame > 100 && fFPS > 60.0f ) {
+// ZZLog::Debug_Log("Set profile.");
+// g_bWriteProfile = 1;
+// }
+ GLWin.SetTitle(strtitle);
+}
+
+void CALLBACK GSvsync(int interlace)
+{
+ FUNCLOG
+
+ //ZZLog::GS_Log("Calling GSvsync.");
+
+ static u32 dwTime = timeGetTime();
+ static int nToNextUpdate = 1;
+#ifdef _DEBUG
+ if (conf.dump & 0x1) {
+ freezeData fd;
+ fd.size = ZZSave(NULL);
+ s8* payload = (s8*)malloc(fd.size);
+ fd.data = payload;
+
+ ZZSave(fd.data);
+
+ char filename[256];
+ // FIXME, there is probably a better solution than /tmp ...
+ // A possibility will be to save the path from GSmakeSnapshot but you still need to call
+ // GSmakeSnapshot first.
+ if (get_snapshot_filename(filename, "/tmp", "gs"))
+ g_dump.Open(filename, g_LastCRC, fd, g_pBasePS2Mem);
+ conf.dump--;
+ }
+ g_dump.VSync(interlace, (conf.dump == 0), g_pBasePS2Mem);
+#endif
+
+ GL_REPORT_ERRORD();
+
+ g_nRealFrame++;
+
+ // !interlace? Hmmm... Fixme.
+ RenderCRTC(!interlace);
+
+ GLWin.ProcessEvents();
+
+ if (--nToNextUpdate <= 0)
+ {
+ u32 d = timeGetTime();
+ fFPS = UPDATE_FRAMES * 1000.0f / (float)max(d - dwTime, (u32)1);
+ dwTime = d;
+ g_nFrame += UPDATE_FRAMES;
+#ifndef USE_GSOPEN2
+ // let PCSX2 manage the title
+ SetGSTitle();
+#endif
+
+// if( g_nFrame > 100 && fFPS > 60.0f ) {
+// ZZLog::Debug_Log("Set profile.");
+// g_bWriteProfile = 1;
+// }
+
+ if (fFPS < 16)
+ UPDATE_FRAMES = 4;
+ else if (fFPS < 32)
+ UPDATE_FRAMES = 8;
+ else
+ UPDATE_FRAMES = 16;
+
+ nToNextUpdate = UPDATE_FRAMES;
+
+ ppf = 0;
+ g_TransferredToGPU = 0;
+ g_nGenVars = 0;
+ g_nTexVars = 0;
+ g_nAlphaVars = 0;
+ g_nResolve = 0;
+ g_nFramesSkipped = 0;
+ g_SkipFlushFrame = 0;
+ }
+
+#if defined(ZEROGS_DEVBUILD)
+ if (g_bWriteProfile)
+ {
+ //g_bWriteProfile = 0;
+ DVProfWrite("prof.txt", UPDATE_FRAMES);
+ DVProfClear();
+ }
+
+#endif
+ GL_REPORT_ERRORD();
+
+}
+
+void CALLBACK GSreadFIFO(u64 *pMem)
+{
+ FUNCLOG
+
+ //ZZLog::GS_Log("Calling GSreadFIFO.");
+#ifdef _DEBUG
+ g_dump.ReadFIFO(1);
+#endif
+
+ TransferLocalHost((u32*)pMem, 1);
+}
+
+void CALLBACK GSreadFIFO2(u64 *pMem, int qwc)
+{
+ FUNCLOG
+
+ //ZZLog::GS_Log("Calling GSreadFIFO2.");
+#ifdef _DEBUG
+ g_dump.ReadFIFO(qwc);
+#endif
+
+ TransferLocalHost((u32*)pMem, qwc);
+}
+
+int CALLBACK GSsetupRecording(int start, void* pData)
+{
+ FUNCLOG
+
+ if (start)
+ StartCapture();
+ else
+ StopCapture();
+
+ return 1;
+}
+
+s32 CALLBACK GSfreeze(int mode, freezeData *data)
+{
+ FUNCLOG
+
+ switch (mode)
+ {
+ case FREEZE_LOAD:
+ if (!ZZLoad(data->data)) ZZLog::Error_Log("GS: Bad load format!");
+ g_nRealFrame += 100;
+ break;
+
+ case FREEZE_SAVE:
+ ZZSave(data->data);
+ break;
+
+ case FREEZE_SIZE:
+ data->size = ZZSave(NULL);
+ break;
+
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+#ifdef __LINUX__
+
+struct Packet
+{
+ u8 type, param;
+ u32 size, addr;
+ vector buff;
+};
+
+EXPORT_C_(void) GSReplay(char* lpszCmdLine)
+{
+ if(FILE* fp = fopen(lpszCmdLine, "rb"))
+ {
+ GSinit();
+
+ u8 regs[0x2000];
+ GSsetBaseMem(regs);
+
+ //s_vsync = !!theApp.GetConfig("vsync", 0);
+
+ void* hWnd = NULL;
+
+ //_GSopen((void**)&hWnd, "", renderer);
+ GSopen((void**)&hWnd, "", 0);
+
+ u32 crc;
+ fread(&crc, 4, 1, fp);
+ GSsetGameCRC(crc, 0);
+
+ freezeData fd;
+ fread(&fd.size, 4, 1, fp);
+ fd.data = new s8[fd.size];
+ fread(fd.data, fd.size, 1, fp);
+ GSfreeze(FREEZE_LOAD, &fd);
+ delete [] fd.data;
+
+ fread(regs, 0x2000, 1, fp);
+
+ long start = ftell(fp);
+
+ GSvsync(1);
+
+ list packets;
+ vector buff;
+ int type;
+
+ while((type = fgetc(fp)) != EOF)
+ {
+ Packet* p = new Packet();
+
+ p->type = (u8)type;
+
+ switch(type)
+ {
+ case 0:
+
+ p->param = (u8)fgetc(fp);
+
+ fread(&p->size, 4, 1, fp);
+
+ switch(p->param)
+ {
+ case 0:
+ p->buff.resize(0x4000);
+ p->addr = 0x4000 - p->size;
+ fread(&p->buff[p->addr], p->size, 1, fp);
+ break;
+ case 1:
+ case 2:
+ case 3:
+ p->buff.resize(p->size);
+ fread(&p->buff[0], p->size, 1, fp);
+ break;
+ }
+
+ break;
+
+ case 1:
+
+ p->param = (u8)fgetc(fp);
+
+ break;
+
+ case 2:
+
+ fread(&p->size, 4, 1, fp);
+
+ break;
+
+ case 3:
+
+ p->buff.resize(0x2000);
+
+ fread(&p->buff[0], 0x2000, 1, fp);
+
+ break;
+
+ default: assert(0);
+ }
+
+ packets.push_back(p);
+ }
+
+ sleep(1);
+
+ //while(IsWindowVisible(hWnd))
+ //FIXME map?
+ int finished = 2;
+ while(finished > 0)
+ {
+ unsigned long start = timeGetTime();
+ unsigned long frame_number = 0;
+ for(list::iterator i = packets.begin(); i != packets.end(); i++)
+ {
+ Packet* p = *i;
+
+ switch(p->type)
+ {
+ case 0:
+
+ switch(p->param)
+ {
+ case 0: GSgifTransfer1(&p->buff[0], p->addr); break;
+ case 1: GSgifTransfer2(&p->buff[0], p->size / 16); break;
+ case 2: GSgifTransfer3(&p->buff[0], p->size / 16); break;
+ case 3: GSgifTransfer(&p->buff[0], p->size / 16); break;
+ }
+
+ break;
+
+ case 1:
+
+ GSvsync(p->param);
+ frame_number++;
+
+ break;
+
+ case 2:
+
+ if(buff.size() < p->size) buff.resize(p->size);
+
+ // FIXME
+ // GSreadFIFO2(&buff[0], p->size / 16);
+
+ break;
+
+ case 3:
+
+ memcpy(regs, &p->buff[0], 0x2000);
+
+ break;
+ }
+ }
+ unsigned long end = timeGetTime();
+ fprintf(stderr, "The %d frames of the scene was render on %dms\n", frame_number, end - start);
+ fprintf(stderr, "A means of %fms by frame\n", (float)(end - start)/(float)frame_number);
+
+ sleep(1);
+ finished--;
+ }
+
+
+ for(list::iterator i = packets.begin(); i != packets.end(); i++)
+ {
+ delete *i;
+ }
+
+ packets.clear();
+
+ sleep(1);
+
+ GSclose();
+ GSshutdown();
+
+ fclose(fp);
+ }
+}
+#endif
diff --git a/plugins/zzogl-pg-cg/opengl/GifTransfer.cpp b/plugins/zzogl-pg-cg/opengl/GifTransfer.cpp
new file mode 100644
index 000000000..f8be40629
--- /dev/null
+++ b/plugins/zzogl-pg-cg/opengl/GifTransfer.cpp
@@ -0,0 +1,284 @@
+/* ZZ Open GL graphics plugin
+ * Copyright (c)2009-2010 zeydlitz@gmail.com, arcum42@gmail.com
+ * Based on Zerofrog's ZeroGS KOSMOS (c)2005-2008
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "GS.h"
+#include "Mem.h"
+#include "GifTransfer.h"
+
+#ifdef _DEBUG
+static int path1_count = 0;
+#endif
+
+static int nPath3Hack = 0;
+
+void CALLBACK GSgetLastTag(u64* ptag)
+{
+ FUNCLOG
+
+ *(u32*)ptag = nPath3Hack;
+ nPath3Hack = 0;
+}
+
+#ifdef _WIN32
+// for debug assertion checks (thread affinity checks)
+extern HANDLE g_hCurrentThread;
+#endif
+
+__forceinline void gifTransferLog(int index, const u32 *pMem, u32 size)
+{
+#ifdef DEBUG_TRANSFER
+
+ if (conf.log)
+ {
+ static int nSaveIndex = 0;
+ ZZLog::Debug_Log("%d: p:%d %x", nSaveIndex++, index + 1, size);
+ int vals[4] = {0};
+
+ for (u32 i = 0; i < size; i++)
+ {
+ for (u32 j = 0; j < 4; ++j)
+ vals[j] ^= pMem[4*i+j];
+ }
+
+ ZZLog::Debug_Log("%x %x %x %x", vals[0], vals[1], vals[2], vals[3]);
+ }
+
+#endif
+}
+
+extern int g_GSMultiThreaded;
+
+template void _GSgifTransfer(const u32 *pMem, u32 size)
+{
+ FUNCLOG
+
+ pathInfo *path = &gs.path[index];
+
+#ifdef _WIN32
+ assert(g_hCurrentThread == GetCurrentThread());
+#endif
+
+#ifdef _DEBUG
+ gifTransferLog(index, pMem, size);
+
+ g_dump.Transfer(index, (const u8*)pMem, size);
+#endif
+
+ while (size > 0)
+ {
+ //LOG(_T("Transfer(%08x, %d) START\n"), pMem, size);
+ if (path->nloop == 0)
+ {
+ path->setTag(pMem);
+ pMem += 4;
+ size--;
+
+ // eeuser 7.2.2. GIFtag: "... when NLOOP is 0, the GIF does not output anything, and
+ // values other than the EOP field are disregarded."
+ if (path->nloop > 0)
+ {
+ gs.q = 1.0f;
+
+ if (path->tag.PRE && (path->tag.FLG == GIF_FLG_PACKED))
+ {
+ u32 tagprim = path->tag.PRIM;
+ GIFRegHandlerPRIM((u32*)&tagprim);
+ }
+ }
+ }
+ else
+ {
+ switch (path->mode)
+ {
+ case GIF_FLG_PACKED:
+ {
+ // Needs to be looked at.
+
+ // first try a shortcut for a very common case
+
+ if (path->adonly && size >= path->nloop)
+ {
+ size -= path->nloop;
+
+ do
+ {
+ GIFPackedRegHandlerA_D(pMem);
+
+ pMem += 4; //sizeof(GIFPackedReg)/4;
+ }
+ while(--path->nloop > 0);
+ break;
+ }
+
+ do
+ {
+ u32 reg = path->GetReg();
+ g_GIFPackedRegHandlers[reg](pMem);
+
+ pMem += 4; //sizeof(GIFPackedReg)/4;
+ size--;
+ }
+ while (path->StepReg() && (size > 0));
+
+ break;
+ }
+
+ case GIF_FLG_REGLIST:
+ {
+ // Needs to be looked at.
+ //ZZLog::GS_Log("%8.8x%8.8x %d L", ((u32*)&gs.regs)[1], *(u32*)&gs.regs, path->tag.nreg/4);
+
+ size *= 2;
+
+ do
+ {
+ g_GIFRegHandlers[path->GetReg()](pMem);
+
+ pMem += 2;
+ size--;
+ }
+ while (path->StepReg() && (size > 0));
+
+ if (size & 1) pMem += 2;
+ size /= 2;
+ break;
+ }
+
+ case GIF_FLG_IMAGE: // FROM_VFRAM
+ case GIF_FLG_IMAGE2: // Used in the DirectX version, so we'll use it here too.
+ {
+ int len = min(size, path->nloop);
+ //ZZLog::Error_Log("GIF_FLG_IMAGE(%d)=%d", gs.imageTransfer, len);
+
+ switch (gs.imageTransfer)
+ {
+ case 0:
+ TransferHostLocal(pMem, len * 4);
+ break;
+
+ case 1:
+ // This can't happen; downloads can not be started or performed as part of
+ // a GIFtag operation. They're an entirely separate process that can only be
+ // done through the ReverseFIFO transfer (aka ReadFIFO). --air
+ assert(0);
+ //TransferLocalHost(pMem, len);
+ break;
+
+ case 2:
+ //TransferLocalLocal();
+ break;
+
+ case 3:
+ //assert(0);
+ break;
+
+ default:
+ //assert(0);
+ break;
+ }
+
+ pMem += len * 4;
+
+ path->nloop -= len;
+ size -= len;
+
+ break;
+ }
+
+ default: // GIF_IMAGE
+ ZZLog::GS_Log("*** WARNING **** Unexpected GIFTag flag.");
+ assert(0);
+ path->nloop = 0;
+ break;
+ }
+ }
+
+ if (index == 0)
+ {
+ if (path->tag.EOP && path->nloop == 0)
+ {
+ break;
+ }
+ }
+ }
+
+ // This is the case when not all data was readed from one try: VU1 has too much data.
+ // So we should redo reading from the start.
+ if (index == 0)
+ {
+ if (size == 0 && path->nloop > 0)
+ {
+ if (g_GSMultiThreaded)
+ {
+ path->nloop = 0;
+ }
+ else
+ {
+ _GSgifTransfer<0>(pMem - 0x4000, 0x4000 / 16);
+ }
+ }
+ }
+}
+
+void CALLBACK GSgifTransfer1(u32 *pMem, u32 addr)
+{
+ FUNCLOG
+
+ //ZZLog::GS_Log("GSgifTransfer1 0x%x (mode %d).", addr, path->mode);
+
+#ifdef _DEBUG
+ ZZLog::Prim_Log("count: %d\n", path1_count);
+ path1_count++;
+#endif
+
+ _GSgifTransfer<0>((u32*)((u8*)pMem + addr), (0x4000 - addr) / 16);
+}
+
+void CALLBACK GSgifTransfer2(u32 *pMem, u32 size)
+{
+ FUNCLOG
+
+ //ZZLog::GS_Log("GSgifTransfer2 size = %lx (mode %d, gs.path2.tag.nloop = %d).", size, gs.path[1].mode, gs.path[1].tag.nloop);
+
+ _GSgifTransfer<1>(const_cast(pMem), size);
+}
+
+void CALLBACK GSgifTransfer3(u32 *pMem, u32 size)
+{
+ FUNCLOG
+
+ //ZZLog::GS_Log("GSgifTransfer3 size = %lx (mode %d, gs.path3.tag.nloop = %d).", size, gs.path[2].mode, gs.path[2].tag.nloop);
+
+ _GSgifTransfer<2>(const_cast(pMem), size);
+}
+
+void CALLBACK GSgifTransfer(const u32 *pMem, u32 size)
+{
+ FUNCLOG
+
+ //ZZLog::GS_Log("GSgifTransfer3 size = %lx (mode %d, gs.path3.tag.nloop = %d).", size, gs.path[2].mode, gs.path[2].tag.nloop);
+
+ _GSgifTransfer<3>(pMem, size);
+}
+
+void InitPath()
+{
+ gs.path[0].mode = gs.path[1].mode = gs.path[2].mode = gs.path[3].mode = 0;
+}
+
diff --git a/plugins/zzogl-pg-cg/opengl/GifTransfer.h b/plugins/zzogl-pg-cg/opengl/GifTransfer.h
new file mode 100644
index 000000000..533733ed0
--- /dev/null
+++ b/plugins/zzogl-pg-cg/opengl/GifTransfer.h
@@ -0,0 +1,134 @@
+/* ZZ Open GL graphics plugin
+ * Copyright (c)2009-2010 zeydlitz@gmail.com, arcum42@gmail.com
+ * Based on Zerofrog's ZeroGS KOSMOS (c)2005-2008
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef GIFTRANSFER_H_INCLUDED
+#define GIFTRANSFER_H_INCLUDED
+
+#include "Util.h"
+#include "GS.h"
+#include "Regs.h"
+
+enum GIF_FLG
+{
+ GIF_FLG_PACKED = 0,
+ GIF_FLG_REGLIST = 1,
+ GIF_FLG_IMAGE = 2,
+ GIF_FLG_IMAGE2 = 3
+};
+
+//
+// GIFTag
+union GIFTag
+{
+ u64 ai64[2];
+ u32 ai32[4];
+
+ struct
+ {
+ u32 NLOOP : 15;
+ u32 EOP : 1;
+ u32 _PAD1 : 16;
+ u32 _PAD2 : 14;
+ u32 PRE : 1;
+ u32 PRIM : 11;
+ u32 FLG : 2; // enum GIF_FLG
+ u32 NREG : 4;
+ u64 REGS : 64;
+ };
+
+ void set(const u32 *data)
+ {
+ for (int i = 0; i <= 3; i++)
+ {
+ ai32[i] = data[i];
+ }
+ }
+
+ GIFTag(u32 *data)
+ {
+ set(data);
+ }
+
+ GIFTag(){ ai64[0] = 0; ai64[1] = 0; }
+};
+
+// EE part. Data transfer packet description
+
+typedef struct
+{
+ u32 mode;
+ int reg;
+ u64 regs;
+ u32 nloop;
+ int eop;
+ int nreg;
+ u32 adonly;
+ GIFTag tag;
+
+ void setTag(const u32 *data)
+ {
+ tag.set(data);
+
+ nloop = tag.NLOOP;
+ eop = tag.EOP;
+ mode = tag.FLG;
+ adonly = false;
+
+ // Hmm....
+ nreg = tag.NREG << 2;
+ if (nreg == 0) nreg = 64;
+ regs = tag.REGS;
+ reg = 0;
+ if ((nreg == 4) && (regs == GIF_REG_A_D)) adonly = true;
+
+ // ZZLog::GS_Log("GIFtag: %8.8lx_%8.8lx_%8.8lx_%8.8lx: EOP=%d, NLOOP=%x, FLG=%x, NREG=%d, PRE=%d",
+ // data[3], data[2], data[1], data[0],
+ // path->eop, path->nloop, mode, path->nreg, tag.PRE);
+ }
+
+ u32 GetReg()
+ {
+ return (regs >> reg) & 0xf;
+ }
+
+ bool StepReg()
+ {
+ reg += 4;
+
+ if (reg == nreg)
+ {
+ reg = 0;
+ nloop--;
+
+ if (nloop == 0) return false;
+ }
+
+ return true;
+ }
+
+} pathInfo;
+
+extern void _GSgifPacket(pathInfo *path, const u32 *pMem);
+extern void _GSgifRegList(pathInfo *path, const u32 *pMem);
+extern void _GSgifTransfer(pathInfo *path, const u32 *pMem, u32 size);
+
+extern GIFRegHandler g_GIFPackedRegHandlers[];
+extern GIFRegHandler g_GIFRegHandlers[];
+extern void InitPath();
+#endif // GIFTRANSFER_H_INCLUDED
diff --git a/plugins/zzogl-pg-cg/opengl/HostMemory.cpp b/plugins/zzogl-pg-cg/opengl/HostMemory.cpp
new file mode 100644
index 000000000..9b762e943
--- /dev/null
+++ b/plugins/zzogl-pg-cg/opengl/HostMemory.cpp
@@ -0,0 +1,578 @@
+/* ZZ Open GL graphics plugin
+ * Copyright (c)2009-2010 zeydlitz@gmail.com, arcum42@gmail.com
+ * Based on Zerofrog's ZeroGS KOSMOS (c)2005-2008
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "GS.h"
+#include
+#include
+
+#include
+#include "Mem.h"
+#include "x86.h"
+#include "targets.h"
+#include "ZZoglVB.h"
+
+// flush current vertices, call before setting new registers (the main render method)
+extern void Flush(int context);
+
+u8* g_pbyGSMemory = NULL; // 4Mb GS system mem
+
+void GSMemory::init()
+{
+ const u32 mem_size = MEMORY_END + 0x10000; // leave some room for out of range accesses (saves on the checks)
+
+ // clear
+ g_pbyGSMemory = (u8*)_aligned_malloc(mem_size, 1024);
+ memset(g_pbyGSMemory, 0, mem_size);
+}
+
+void GSMemory::destroy()
+{
+ _aligned_free(g_pbyGSMemory);
+ g_pbyGSMemory = NULL;
+}
+
+u8* GSMemory::get()
+{
+ return g_pbyGSMemory;
+}
+
+u8* GSMemory::get(u32 addr)
+{
+ return &g_pbyGSMemory[addr*8];
+}
+u8* GSMemory::get_raw(u32 addr)
+{
+ return &g_pbyGSMemory[addr];
+}
+
+u8* g_pbyGSClut = NULL; // ZZ
+
+void GSClut::init()
+{
+ g_pbyGSClut = (u8*)_aligned_malloc(256 * 8, 1024); // need 512 alignment!
+ memset(g_pbyGSClut, 0, 256*8);
+}
+
+void GSClut::destroy()
+{
+ _aligned_free(g_pbyGSClut);
+ g_pbyGSClut = NULL;
+}
+
+u8* GSClut::get()
+{
+ return g_pbyGSClut;
+}
+
+u8* GSClut::get(u32 addr)
+{
+ return &g_pbyGSClut[addr*8];
+}
+u8* GSClut::get_raw(u32 addr)
+{
+ return &g_pbyGSClut[addr];
+}
+
+extern _getPixelAddress getPixelFun[64];
+
+extern CRangeManager s_RangeMngr; // manages overwritten memory
+extern void ResolveInRange(int start, int end);
+
+static vector s_vTempBuffer, s_vTransferCache;
+static int gs_imageEnd = 0;
+
+// From the start of monster labs. In all 3 cases, psm == 0.
+// ZZogl-PG: GetRectMemAddress(0x3f4000, 0x404000, 0x0, 0x0, 0x0, 0x100, 0x40, 0x3f40, 0x100);
+// ZZogl-PG: GetRectMemAddress(0x3f8000, 0x408000, 0x0, 0x0, 0x0, 0x100, 0x40, 0x3f80, 0x100);
+// ZZogl-PG: GetRectMemAddress(0x3fc000, 0x40c000, 0x0, 0x0, 0x0, 0x100, 0x40, 0x3fc0, 0x100);
+
+void GetRectMemAddress(int& start, int& end, int psm, int x, int y, int w, int h, int bp, int bw)
+{
+ FUNCLOG
+ u32 bits = 0;
+
+ if (m_Blocks[psm].bpp == 0)
+ {
+ ZZLog::Error_Log("ZeroGS: Bad psm 0x%x.", psm);
+ start = 0;
+ end = MEMORY_END;
+ return;
+ }
+
+ if (PSMT_ISZTEX(psm))
+ {
+ // Somehow, I doubt this code is right. I'll have to look into it. For the moment, I'm keeping it the
+ // way it was. --arcum42
+
+ const BLOCK& b = m_Blocks[psm];
+
+ bw = (bw + b.width - 1) / b.width;
+ start = bp * 256 + ((y / b.height) * bw + (x / b.width)) * 0x2000;
+ end = bp * 256 + (((y + h - 1) / b.height) * bw + (x + w + b.width - 1) / b.width) * 0x2000;
+ return;
+ }
+
+ bits = PSMT_BITS_NUM(psm);
+ start = getPixelFun[psm](x, y, bp, bw);
+ end = getPixelFun[psm](x + w - 1, y + h - 1, bp, bw) + 1;
+
+ if (bits > 0)
+ {
+ start *= bits;
+ end *= bits;
+ }
+ else
+ {
+ // This is what it used to do, which doesn't seem right.
+ // Keeping it for reference, in case removing it breaks anything.
+
+ //int newx = ((x + w - 1 + 31) & ~31) - 1;
+ //int newy = ((y + h - 1 + 15) & ~15) - 1;
+ //start = getPixelAddress4(x, y, bp, bw) / 2;
+ //end = (getPixelAddress4(max(newx, x), max(newy, y), bp, bw) + 2) / 2;
+
+ start /= 2;
+ end /= 2;
+ }
+}
+
+void InitTransferHostLocal()
+{
+ FUNCLOG
+
+#if defined(_DEBUG)
+ // Xenosaga 1.
+ if (gs.trxpos.dx + gs.imageWnew > gs.dstbuf.bw)
+ ZZLog::Debug_Log("Transfer error, width exceeded. (0x%x > 0X%x)", gs.trxpos.dx + gs.imageWnew, gs.dstbuf.bw);
+#endif
+
+ //bool bHasFlushed = false;
+
+ gs.imageX = gs.trxpos.dx;
+ gs.imageY = gs.trxpos.dy;
+
+ gs.imageEndX = gs.imageX + gs.imageWnew;
+ gs.imageEndY = gs.imageY + gs.imageHnew;
+
+ assert(gs.imageEndX < 2048 && gs.imageEndY < 2048);
+
+ // This needs to be looked in to, since psm should *not* be 63.
+ // hack! viewful joe
+ if (gs.dstbuf.psm == 63) gs.dstbuf.psm = 0;
+
+ int start, end;
+
+ GetRectMemAddress(start, end, gs.dstbuf.psm, gs.trxpos.dx, gs.trxpos.dy, gs.imageWnew, gs.imageHnew, gs.dstbuf.bp, gs.dstbuf.bw);
+
+ if (end > MEMORY_END)
+ {
+ // Monster Lab - the screwed up title screen
+ // Init host local out of bounds! (end == 0x404000)
+ // Init host local out of bounds! (end == 0x408000)
+ // Init host local out of bounds! (end == 0x40c000)
+ // MEMORY_END is 0x400000...
+
+ ZZLog::Warn_Log("Init host local out of bounds! (end == 0x%x)", end);
+ //gs.imageTransfer = -1;
+ end = MEMORY_END;
+ }
+
+ gs_imageEnd = end;
+
+ if (vb[0].nCount > 0) Flush(0);
+ if (vb[1].nCount > 0) Flush(1);
+
+ //ZZLog::Prim_Log("trans: bp:%x x:%x y:%x w:%x h:%x\n", gs.dstbuf.bp, gs.trxpos.dx, gs.trxpos.dy, gs.imageWnew, gs.imageHnew);
+}
+
+void TransferHostLocal(const void* pbyMem, u32 nQWordSize)
+{
+ FUNCLOG
+
+ int start, end;
+
+ GetRectMemAddress(start, end, gs.dstbuf.psm, gs.imageX, gs.imageY, gs.imageWnew, gs.imageHnew, gs.dstbuf.bp, gs.dstbuf.bw);
+
+ assert(start < gs_imageEnd);
+ end = gs_imageEnd;
+
+ // sometimes games can decompress to alpha channel of render target only, in this case
+ // do a resolve right away. wolverine x2
+ if (((gs.dstbuf.psm == PSMT8H) || (gs.dstbuf.psm == PSMT4HL) || (gs.dstbuf.psm == PSMT4HH)) && !(conf.settings().gust))
+ {
+ list listTransmissionUpdateTargs;
+ s_RTs.GetTargs(start, end, listTransmissionUpdateTargs);
+
+ for (list::iterator it = listTransmissionUpdateTargs.begin(); it != listTransmissionUpdateTargs.end(); ++it)
+ {
+ CRenderTarget* ptarg = *it;
+
+ if ((ptarg->status & CRenderTarget::TS_Virtual)) continue;
+
+ //ZZLog::Error_Log("Resolving to alpha channel.");
+ ptarg->Resolve();
+ }
+ }
+
+ s_RangeMngr.Insert(start, min(end, start + (int)nQWordSize*16));
+
+ const u8* porgend = (const u8*)pbyMem + 4 * nQWordSize;
+
+ if (s_vTransferCache.size() > 0)
+ {
+
+ int imagecache = s_vTransferCache.size();
+ s_vTempBuffer.resize(imagecache + nQWordSize*4);
+ memcpy(&s_vTempBuffer[0], &s_vTransferCache[0], imagecache);
+ memcpy(&s_vTempBuffer[imagecache], pbyMem, nQWordSize*4);
+
+ pbyMem = (const void*) & s_vTempBuffer[0];
+ porgend = &s_vTempBuffer[0] + s_vTempBuffer.size();
+
+ int wordinc = imagecache / 4;
+
+ if ((nQWordSize * 4 + imagecache) / 3 == ((nQWordSize + wordinc) * 4) / 3)
+ {
+ // can use the data
+ nQWordSize += wordinc;
+ }
+ }
+
+ int leftover = m_Blocks[gs.dstbuf.psm].TransferHostLocal(pbyMem, nQWordSize);
+
+ if (leftover > 0)
+ {
+ // copy the last gs.image24bitOffset to the cache
+ s_vTransferCache.resize(leftover);
+ memcpy(&s_vTransferCache[0], porgend - leftover, leftover);
+ }
+ else
+ {
+ s_vTransferCache.resize(0);
+ }
+
+#if defined(_DEBUG)
+ if (g_bSaveTrans)
+ {
+ tex0Info t;
+ t.tbp0 = gs.dstbuf.bp;
+ t.tw = gs.imageWnew;
+ t.th = gs.imageHnew;
+ t.tbw = gs.dstbuf.bw;
+ t.psm = gs.dstbuf.psm;
+ SaveTex(&t, 0);
+ }
+
+#endif
+}
+
+void InitTransferLocalHost()
+{
+ FUNCLOG
+ assert(gs.trxpos.sx + gs.imageWnew <= 2048 && gs.trxpos.sy + gs.imageHnew <= 2048);
+
+#if defined(_DEBUG)
+ if (gs.trxpos.sx + gs.imageWnew > gs.srcbuf.bw)
+ ZZLog::Debug_Log("Transfer error, width exceeded. (0x%x > 0x%x)", gs.trxpos.sx + gs.imageWnew, gs.srcbuf.bw);
+#endif
+
+ gs.imageX = gs.trxpos.sx;
+ gs.imageY = gs.trxpos.sy;
+
+ gs.imageEndX = gs.imageX + gs.imageWnew;
+ gs.imageEndY = gs.imageY + gs.imageHnew;
+
+ s_vTransferCache.resize(0);
+
+ int start, end;
+
+ GetRectMemAddress(start, end, gs.srcbuf.psm, gs.trxpos.sx, gs.trxpos.sy, gs.imageWnew, gs.imageHnew, gs.srcbuf.bp, gs.srcbuf.bw);
+
+ ResolveInRange(start, end);
+}
+
+template
+void TransferLocalHost(void* pbyMem, u32 nQWordSize, int& x, int& y, u8 *pstart)
+{
+ _readPixel_0 rp = readPixelFun_0[gs.srcbuf.psm];
+
+ int i = x, j = y;
+ T* pbuf = (T*)pbyMem;
+ u32 nSize = nQWordSize * 16 / sizeof(T);
+
+ for (; i < gs.imageEndY; ++i)
+ {
+ for (; j < gs.imageEndX && nSize > 0; ++j, --nSize)
+ {
+ *pbuf++ = rp(pstart, j % 2048, i % 2048, gs.srcbuf.bw);
+ }
+
+ if (j >= gs.imageEndX)
+ {
+ assert(j == gs.imageEndX);
+ j = gs.trxpos.sx;
+ }
+ else
+ {
+ assert(nSize == 0);
+ break;
+ }
+ }
+}
+
+void TransferLocalHost_24(void* pbyMem, u32 nQWordSize, int& x, int& y, u8 *pstart)
+{
+ _readPixel_0 rp = readPixelFun_0[gs.srcbuf.psm];
+
+ int i = x, j = y;
+ u8* pbuf = (u8*)pbyMem;
+ u32 nSize = nQWordSize * 16 / 3;
+
+ for (; i < gs.imageEndY; ++i)
+ {
+ for (; j < gs.imageEndX && nSize > 0; ++j, --nSize)
+ {
+ u32 p = rp(pstart, j % 2048, i % 2048, gs.srcbuf.bw);
+ pbuf[0] = (u8)p;
+ pbuf[1] = (u8)(p >> 8);
+ pbuf[2] = (u8)(p >> 16);
+ pbuf += 3;
+ }
+
+ if (j >= gs.imageEndX)
+ {
+ assert(j == gs.imageEndX);
+ j = gs.trxpos.sx;
+ }
+ else
+ {
+ assert(nSize == 0);
+ break;
+ }
+ }
+}
+
+// left/right, top/down
+void TransferLocalHost(void* pbyMem, u32 nQWordSize)
+{
+ FUNCLOG
+ assert(gs.imageTransfer == 1);
+
+ u8* pstart = g_pbyGSMemory + 256 * gs.srcbuf.bp;
+
+ switch(PSMT_BITMODE(gs.srcbuf.psm))
+ {
+ case 0:
+ TransferLocalHost(pbyMem, nQWordSize, gs.imageY, gs.imageX, pstart);
+ break;
+ case 1:
+ TransferLocalHost_24(pbyMem, nQWordSize, gs.imageY, gs.imageX, pstart);
+ break;
+ case 2:
+ TransferLocalHost(pbyMem, nQWordSize, gs.imageY, gs.imageX, pstart);
+ break;
+ case 3:
+ TransferLocalHost(pbyMem, nQWordSize, gs.imageY, gs.imageX, pstart);
+ break;
+ default:
+ assert(0);
+ break;
+ }
+
+ if (gs.imageY >= gs.imageEndY)
+ {
+ ZZLog::Error_Log("gs.imageY >= gs.imageEndY!");
+ assert(gs.imageY == gs.imageEndY);
+ gs.imageTransfer = -1;
+ }
+}
+
+__forceinline void _TransferLocalLocal()
+{
+ //ZZLog::Error_Log("TransferLocalLocal(0x%x, 0x%x)", gs.srcbuf.psm, gs.dstbuf.psm);
+ _writePixel_0 wp = writePixelFun_0[gs.srcbuf.psm];
+ _readPixel_0 rp = readPixelFun_0[gs.dstbuf.psm];
+ u8* pSrcBuf = g_pbyGSMemory + gs.srcbuf.bp * 256;
+ u8* pDstBuf = g_pbyGSMemory + gs.dstbuf.bp * 256;
+ u32 widthlimit = 4;
+ u32 maxX = gs.trxpos.sx + gs.imageWnew;
+ u32 maxY = gs.trxpos.sy + gs.imageHnew;
+
+ if (PSMT_BITMODE(gs.srcbuf.psm) == 0) widthlimit = 2;
+ if ((gs.imageWnew & widthlimit) != 0) return;
+
+ for(u32 i = gs.trxpos.sy, i2 = gs.trxpos.dy; i < maxY; i++, i2++)
+ {
+ for(u32 j = gs.trxpos.sx, j2 = gs.trxpos.dx; j < maxX; j += widthlimit, j2 += widthlimit)
+ {
+ wp(pDstBuf, j2%2048, i2%2048,
+ rp(pSrcBuf, j%2048, i%2048, gs.srcbuf.bw), gs.dstbuf.bw);
+
+ wp(pDstBuf, (j2+1)%2048, i2%2048,
+ rp(pSrcBuf, (j+1)%2048, i%2048, gs.srcbuf.bw), gs.dstbuf.bw);
+
+ if (widthlimit > 2)
+ {
+ // Then widthlimit == 4.
+ wp(pDstBuf, (j2+2)%2048, i2%2048,
+ rp(pSrcBuf, (j+2)%2048, i%2048, gs.srcbuf.bw), gs.dstbuf.bw);
+
+ wp(pDstBuf, (j2+3)%2048, i2%2048,
+ rp(pSrcBuf, (j+3)%2048, i%2048, gs.srcbuf.bw), gs.dstbuf.bw);
+ }
+ }
+ }
+}
+
+__forceinline void _TransferLocalLocal_4()
+{
+ //ZZLog::Error_Log("TransferLocalLocal_4(0x%x, 0x%x)", gs.srcbuf.psm, gs.dstbuf.psm);
+ _getPixelAddress_0 gsp = getPixelFun_0[gs.srcbuf.psm];
+ _getPixelAddress_0 gdp = getPixelFun_0[gs.dstbuf.psm];
+ u8* pSrcBuf = g_pbyGSMemory + gs.srcbuf.bp * 256;
+ u8* pDstBuf = g_pbyGSMemory + gs.dstbuf.bp * 256;
+ u32 maxX = gs.trxpos.sx + gs.imageWnew;
+ u32 maxY = gs.trxpos.sy + gs.imageHnew;
+
+ assert((gs.imageWnew % 8) == 0);
+
+ for(u32 i = gs.trxpos.sy, i2 = gs.trxpos.dy; i < maxY; ++i, ++i2)
+ {
+ for(u32 j = gs.trxpos.sx, j2 = gs.trxpos.dx; j < maxX; j += 8, j2 += 8)
+ {
+ /* NOTE: the 2 conseq 4bit values are in NOT in the same byte */
+ u32 read = gsp(j%2048, i%2048, gs.srcbuf.bw);
+ u32 write = gdp(j2%2048, i2%2048, gs.dstbuf.bw);
+ pDstBuf[write] = (pDstBuf[write]&0xf0)|(pSrcBuf[read]&0x0f);
+
+ read = gsp((j+1)%2048, i%2048, gs.srcbuf.bw);
+ write = gdp((j2+1)%2048, i2%2048, gs.dstbuf.bw);
+ pDstBuf[write] = (pDstBuf[write]&0x0f)|(pSrcBuf[read]&0xf0);
+
+ read = gsp((j+2)%2048, i%2048, gs.srcbuf.bw);
+ write = gdp((j2+2)%2048, i2%2048, gs.dstbuf.bw);
+ pDstBuf[write] = (pDstBuf[write]&0xf0)|(pSrcBuf[read]&0x0f);
+
+ read = gsp((j+3)%2048, i%2048, gs.srcbuf.bw);
+ write = gdp((j2+3)%2048, i2%2048, gs.dstbuf.bw);
+ pDstBuf[write] = (pDstBuf[write]&0x0f)|(pSrcBuf[read]&0xf0);
+
+ read = gsp((j+4)%2048, i%2048, gs.srcbuf.bw);
+ write = gdp((j2+4)%2048, i2%2048, gs.dstbuf.bw);
+ pDstBuf[write] = (pDstBuf[write]&0xf0)|(pSrcBuf[read]&0x0f);
+
+ read = gsp((j+5)%2048, i%2048, gs.srcbuf.bw);
+ write = gdp((j2+5)%2048, i2%2048, gs.dstbuf.bw);
+ pDstBuf[write] = (pDstBuf[write]&0x0f)|(pSrcBuf[read]&0xf0);
+
+ read = gsp((j+6)%2048, i%2048, gs.srcbuf.bw);
+ write = gdp((j2+6)%2048, i2%2048, gs.dstbuf.bw);
+ pDstBuf[write] = (pDstBuf[write]&0xf0)|(pSrcBuf[read]&0x0f);
+
+ read = gsp((j+7)%2048, i%2048, gs.srcbuf.bw);
+ write = gdp((j2+7)%2048, i2%2048, gs.dstbuf.bw);
+ pDstBuf[write] = (pDstBuf[write]&0x0f)|(pSrcBuf[read]&0xf0);
+ }
+ }
+}
+
+// dir depends on trxpos.dirx & trxpos.diry
+void TransferLocalLocal()
+{
+ FUNCLOG
+
+ //ZZLog::Error_Log("I'z in your code, transferring your memory...");
+ assert(gs.imageTransfer == 2);
+ assert(gs.trxpos.sx + gs.imageWnew < 2048 && gs.trxpos.sy + gs.imageHnew < 2048);
+ assert(gs.trxpos.dx + gs.imageWnew < 2048 && gs.trxpos.dy + gs.imageHnew < 2048);
+ assert((gs.srcbuf.psm&0x7) == (gs.dstbuf.psm&0x7));
+
+ if (gs.trxpos.sx + gs.imageWnew > gs.srcbuf.bw)
+ ZZLog::Debug_Log("Transfer error, src width exceeded.(0x%x > 0x%x)", gs.trxpos.sx + gs.imageWnew, gs.srcbuf.bw);
+
+ if (gs.trxpos.dx + gs.imageWnew > gs.dstbuf.bw)
+ ZZLog::Debug_Log("Transfer error, dst width exceeded.(0x%x > 0x%x)", gs.trxpos.dx + gs.imageWnew, gs.dstbuf.bw);
+
+ int srcstart, srcend, dststart, dstend;
+
+ GetRectMemAddress(srcstart, srcend, gs.srcbuf.psm, gs.trxpos.sx, gs.trxpos.sy, gs.imageWnew, gs.imageHnew, gs.srcbuf.bp, gs.srcbuf.bw);
+ GetRectMemAddress(dststart, dstend, gs.dstbuf.psm, gs.trxpos.dx, gs.trxpos.dy, gs.imageWnew, gs.imageHnew, gs.dstbuf.bp, gs.dstbuf.bw);
+
+ // resolve the targs
+ ResolveInRange(srcstart, srcend);
+
+ list listTargs;
+
+ s_RTs.GetTargs(dststart, dstend, listTargs);
+
+ for (list::iterator it = listTargs.begin(); it != listTargs.end(); ++it)
+ {
+ if (!((*it)->status & CRenderTarget::TS_Virtual))
+ {
+ (*it)->Resolve();
+ //(*it)->status |= CRenderTarget::TS_NeedUpdate;
+ }
+ }
+
+ if (PSMT_BITMODE(gs.srcbuf.psm) != 4)
+ {
+ _TransferLocalLocal();
+ }
+ else
+ {
+ _TransferLocalLocal_4();
+ }
+
+ g_MemTargs.ClearRange(dststart, dstend);
+
+#ifdef ZEROGS_DEVBUILD
+
+ if (g_bSaveTrans)
+ {
+ tex0Info t;
+ t.tbp0 = gs.dstbuf.bp;
+ t.tw = gs.imageWnew;
+ t.th = gs.imageHnew;
+ t.tbw = gs.dstbuf.bw;
+ t.psm = gs.dstbuf.psm;
+ SaveTex(&t, 0);
+
+ t.tbp0 = gs.srcbuf.bp;
+ t.tw = gs.imageWnew;
+ t.th = gs.imageHnew;
+ t.tbw = gs.srcbuf.bw;
+ t.psm = gs.srcbuf.psm;
+ SaveTex(&t, 0);
+ }
+
+#endif
+}
+
+__forceinline void TerminateLocalHost()
+{
+ FUNCLOG
+ //ZZLog::Error_Log("Terminate Local Host!");
+}
+
+__forceinline void TerminateHostLocal()
+{
+ FUNCLOG
+ gs.imageTransfer = -1;
+}
+
diff --git a/plugins/zzogl-pg-cg/opengl/HostMemory.h b/plugins/zzogl-pg-cg/opengl/HostMemory.h
new file mode 100644
index 000000000..e9217685d
--- /dev/null
+++ b/plugins/zzogl-pg-cg/opengl/HostMemory.h
@@ -0,0 +1,114 @@
+/* ZZ Open GL graphics plugin
+ * Copyright (c)2009-2010 zeydlitz@gmail.com, arcum42@gmail.com
+ * Based on Zerofrog's ZeroGS KOSMOS (c)2005-2008
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef HOSTMEMORY_H_INCLUDED
+#define HOSTMEMORY_H_INCLUDED
+
+#include "GLWin.h"
+
+#define MEMORY_END 0x00400000
+
+extern int GPU_TEXWIDTH;
+
+extern u8* g_pBasePS2Mem;
+extern u8* g_pbyGSMemory;
+
+class GSMemory
+{
+ public:
+ void init();
+ void destroy();
+ u8* get();
+ u8* get(u32 addr);
+ u8* get_raw(u32 addr);
+};
+
+extern u8* g_pbyGSClut; // the temporary clut buffer
+
+class GSClut
+{
+ public:
+ void init();
+ void destroy();
+ u8* get();
+ u8* get(u32 addr);
+ u8* get_raw(u32 addr);
+};
+
+class ZeroGSInit
+{
+
+ public:
+ ZeroGSInit()
+ {
+ const u32 mem_size = MEMORY_END + 0x10000; // leave some room for out of range accesses (saves on the checks)
+ // clear
+ g_pbyGSMemory = (u8*)_aligned_malloc(mem_size, 1024);
+ memset(g_pbyGSMemory, 0, mem_size);
+
+ g_pbyGSClut = (u8*)_aligned_malloc(256 * 8, 1024); // need 512 alignment!
+ memset(g_pbyGSClut, 0, 256*8);
+ memset(&GLWin, 0, sizeof(GLWin));
+ }
+
+ ~ZeroGSInit()
+ {
+ _aligned_free(g_pbyGSMemory);
+ g_pbyGSMemory = NULL;
+
+ _aligned_free(g_pbyGSClut);
+ g_pbyGSClut = NULL;
+ }
+};
+
+// The size in bytes of x strings (of texture).
+inline int MemorySize(int x)
+{
+ return 4 * GPU_TEXWIDTH * x;
+}
+
+// Return the address in memory of data block for string x.
+inline u8* MemoryAddress(int x)
+{
+ return g_pbyGSMemory + MemorySize(x);
+}
+
+template
+inline u8* _MemoryAddress(int x)
+{
+ return g_pbyGSMemory + mult * x;
+}
+
+extern void GetRectMemAddress(int& start, int& end, int psm, int x, int y, int w, int h, int bp, int bw);
+
+
+// called when trxdir is accessed. If host is involved, transfers memory to temp buffer byTransferBuf.
+// Otherwise performs the transfer. TODO: Perhaps divide the transfers into chunks?
+extern void InitTransferHostLocal();
+extern void TransferHostLocal(const void* pbyMem, u32 nQWordSize);
+
+extern void InitTransferLocalHost();
+extern void TransferLocalHost(void* pbyMem, u32 nQWordSize);
+
+extern void TransferLocalLocal();
+
+extern void TerminateLocalHost();
+extern void TerminateHostLocal();
+
+#endif // HOSTMEMORY_H_INCLUDED
diff --git a/plugins/zzogl-pg-cg/opengl/Linux/Conf.cpp b/plugins/zzogl-pg-cg/opengl/Linux/Conf.cpp
new file mode 100644
index 000000000..67f51a6dc
--- /dev/null
+++ b/plugins/zzogl-pg-cg/opengl/Linux/Conf.cpp
@@ -0,0 +1,121 @@
+/* GSsoft
+ * Copyright (C) 2002-2004 GSsoft Team
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include "GS.h"
+#include "Utilities/Path.h"
+
+void SaveConfig()
+{
+ const wxString iniFile_s(Path::Combine(s_strIniPath, L"zzogl-pg-cg.ini"));
+ std::string iniFile = std::string(iniFile_s.mb_str());
+
+ FILE* f = fopen(iniFile.c_str(), "w");
+
+ if (f == NULL)
+ {
+ ZZLog::Error_Log("Failed to open '%s'", iniFile.c_str());
+ return;
+ }
+
+ fprintf(f, "interlace = %hhx\n", conf.interlace);
+
+ fprintf(f, "mrtdepth = %hhx\n", conf.mrtdepth);
+ fprintf(f, "zzoptions = %x\n", conf.zz_options._u32);
+ fprintf(f, "options = %x\n", conf.hacks._u32);
+ fprintf(f, "bilinear = %hhx\n", conf.bilinear);
+ fprintf(f, "aliasing = %hhx\n", conf.aa);
+ fprintf(f, "width = %x\n", conf.width);
+ fprintf(f, "height = %x\n", conf.height);
+ fprintf(f, "x = %x\n", conf.x);
+ fprintf(f, "y = %x\n", conf.y);
+ fprintf(f, "log = %x\n", conf.log);
+ fprintf(f, "skipdraw = %x\n", conf.SkipDraw);
+ fprintf(f, "disablehacks = %x\n", conf.disableHacks);
+ fclose(f);
+}
+
+void LoadConfig()
+{
+ int err = 0;
+ memset(&conf, 0, sizeof(conf));
+ conf.interlace = 0; // on, mode 1
+ conf.mrtdepth = 1;
+ conf.bilinear = 1;
+ conf.log = 1;
+ conf.SkipDraw = 0;
+ conf.width = 800;
+ conf.height = 600;
+ conf.disableHacks = 0;
+
+ const wxString iniFile_s(Path::Combine(s_strIniPath, L"zzogl-pg-cg.ini"));
+ std::string iniFile = std::string(iniFile_s.mb_str());
+
+ FILE* f = fopen(iniFile.c_str(), "r");
+
+ if (f == NULL)
+ {
+ ZZLog::Error_Log("Failed to open '%s'", iniFile.c_str());
+ SaveConfig();//save and return
+ return;
+ }
+
+ err = fscanf(f, "interlace = %hhx\n", &conf.interlace);
+
+ err = fscanf(f, "mrtdepth = %hhx\n", &conf.mrtdepth);
+ err = fscanf(f, "zzoptions = %x\n", &conf.zz_options._u32);
+ err = fscanf(f, "options = %x\n", &conf.hacks._u32);
+ err = fscanf(f, "bilinear = %hhx\n", &conf.bilinear);
+ err = fscanf(f, "aliasing = %hhx\n", &conf.aa);
+ err = fscanf(f, "width = %x\n", &conf.width);
+ err = fscanf(f, "height = %x\n", &conf.height);
+ err = fscanf(f, "x = %x\n", &conf.x);
+ err = fscanf(f, "y = %x\n", &conf.y);
+ err = fscanf(f, "log = %x\n", &conf.log);
+ err = fscanf(f, "skipdraw = %x\n", &conf.SkipDraw);
+ err = fscanf(f, "disablehacks = %x\n", &conf.disableHacks);
+ fclose(f);
+
+ // turn off all hacks by default
+ conf.setWireframe(false);
+ conf.setCaptureAvi(false);
+ conf.setLoaded(true);
+
+ conf.isWideScreen = conf.widescreen();
+
+ // filter bad files
+ if (conf.interlace > 2) conf.interlace = 0;
+ if (conf.aa > 4) conf.aa = 0;
+ if (conf.width <= 0 || conf.height <= 0)
+ {
+ conf.width = 800;
+ conf.height = 600;
+ }
+
+ if (conf.x < 0 || conf.y < 0)
+ {
+ conf.x = 0;
+ conf.y = 0;
+ }
+}
+
diff --git a/plugins/zzogl-pg-cg/opengl/Linux/Linux.cpp b/plugins/zzogl-pg-cg/opengl/Linux/Linux.cpp
new file mode 100644
index 000000000..3d5609f95
--- /dev/null
+++ b/plugins/zzogl-pg-cg/opengl/Linux/Linux.cpp
@@ -0,0 +1,519 @@
+/* ZeroGS
+ * Copyright (C) 2002-2004 GSsoft Team
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include
+#include
+#include
+#include
+#include
+
+#include "GS.h"
+#include "Linux.h"
+#include "GLWin.h"
+
+#include