Merge pull request #96 from libretro/master

update
This commit is contained in:
alphanu1 2019-01-30 19:23:12 +00:00 committed by GitHub
commit e533dda94a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1363 changed files with 118084 additions and 24130 deletions

12
.gitignore vendored
View File

@ -11,6 +11,8 @@
.tmp .tmp
.tmp.c .tmp.c
.tmp.cxx .tmp.cxx
.moc.h
.moc.cpp
config.log config.log
/.project /.project
/.externalToolBuilders/ /.externalToolBuilders/
@ -163,3 +165,13 @@ retroarch_switch.lst
retroarch_switch.nacp retroarch_switch.nacp
retroarch_switch.nro retroarch_switch.nro
retroarch_switch.nso retroarch_switch.nso
# Wayland
gfx/common/wayland/idle-inhibit-unstable-v1.c
gfx/common/wayland/idle-inhibit-unstable-v1.h
gfx/common/wayland/xdg-shell-unstable-v6.c
gfx/common/wayland/xdg-shell-unstable-v6.h
gfx/common/wayland/xdg-decoration-unstable-v1.h
gfx/common/wayland/xdg-decoration-unstable-v1.c
gfx/common/wayland/xdg-shell.c
gfx/common/wayland/xdg-shell.h

View File

@ -10,7 +10,9 @@ matrix:
- g++-mingw-w64-i686 - g++-mingw-w64-i686
- mingw-w64-i686-dev - mingw-w64-i686-dev
script: script:
- CROSS_COMPILE=i686-w64-mingw32- CFLAGS="-D_WIN32_WINNT=0x0501" ./configure --disable-d3d8 --disable-d3d9 --disable-d3d10 --disable-d3d11 --disable-d3d12 && make HAVE_ZLIB=1 HAVE_BUILTINZLIB=1 HAVE_RPNG=1 - ./configure --disable-d3d8 --disable-d3d9 --disable-d3d10 --disable-d3d11 --disable-d3d12 --enable-builtinzlib
- make
env: CROSS_COMPILE=i686-w64-mingw32- CFLAGS="-D_WIN32_WINNT=0x0501"
- compiler: mingw-x64 - compiler: mingw-x64
addons: addons:
apt: apt:
@ -18,41 +20,33 @@ matrix:
- g++-mingw-w64-x86-64 - g++-mingw-w64-x86-64
- mingw-w64-x86-64-dev - mingw-w64-x86-64-dev
script: script:
- CROSS_COMPILE=x86_64-w64-mingw32- CFLAGS="-D_WIN32_WINNT=0x0501" ./configure --disable-d3d8 --disable-d3d9 --disable-d3d10 --disable-d3d11 --disable-d3d12 && make HAVE_ZLIB=1 HAVE_BUILTINZLIB=1 HAVE_RPNG=1 - ./configure --disable-d3d8 --disable-d3d9 --disable-d3d10 --disable-d3d11 --disable-d3d12 --enable-builtinzlib
- make
env: CROSS_COMPILE=x86_64-w64-mingw32- CFLAGS="-D_WIN32_WINNT=0x0501"
- compiler: gcc - compiler: gcc
addons:
# Install a more recent gcc than the default # Install a more recent gcc than the default
apt: before_install:
packages: - sudo apt-get install -y g++-8
- g++-7 env: CC=gcc-8 CXX=g++-8
sources:
- ubuntu-toolchain-r-test
- compiler: clang - compiler: clang
addons:
# Install a more recent clang than the default # Install a more recent clang than the default
apt: before_install:
sources: - sudo apt-get install -y libstdc++-7-dev
- ubuntu-toolchain-r-test - sudo apt-get install -y clang-6.0
- llvm-toolchain-precise-3.8 env: CC=clang-6.0 CXX=clang++-6.0
packages:
- clang-3.8
env: COMPILER_NAME=clang-3.8 CXX=clang++-3.8 CC=clang-3.8
- os: osx - os: osx
osx_image: xcode7.3 osx_image: xcode8
script: script:
- xcodebuild -target RetroArch -configuration Release -project pkg/apple/RetroArch.xcodeproj - xcodebuild -target RetroArch -configuration Release -project pkg/apple/RetroArch.xcodeproj
- os: osx - os: osx
osx_image: xcode9.3 osx_image: xcode10.1
script: script:
- cd ~/
- brew install --force-bottle qt5 - brew install --force-bottle qt5
- git clone --depth=50 https://github.com/libretro/libretro-super - xcodebuild -target RetroArchQt -configuration Release -project pkg/apple/RetroArch_Metal.xcodeproj
- cd libretro-super/travis
- ./build-retroarch-metal.sh
deploy: deploy:
skip_cleanup: true skip_cleanup: true
provider: script provider: script
script: cd ../retroarch; bash travis_metal_deploy.sh script: bash travis_metal_deploy.sh
on: on:
branch: master branch: master
@ -67,19 +61,13 @@ env:
addons: addons:
apt: apt:
packages: packages:
- curl - libsdl2-dev
- pkg-config
- libglu1-mesa-dev
- freeglut3-dev
- mesa-common-dev
- libsdl1.2-dev
- libsdl-image1.2-dev
- libsdl-mixer1.2-dev
- libsdl-ttf2.0-dev
- libusb-1.0-0-dev - libusb-1.0-0-dev
- qt5-default - qtbase5-dev
- qt5-qmake - qtdeclarative5-dev
- qtbase5-dev-tools sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-trusty-6.0
coverity_scan: coverity_scan:
project: project:
name: "RetroArch" name: "RetroArch"

View File

@ -29,7 +29,9 @@
"includePath": [ "includePath": [
"/usr/include", "/usr/include",
"/usr/local/include", "/usr/local/include",
"${workspaceRoot}" "${workspaceRoot}",
"${workspaceFolder}/libretro-common/include",
"${workspaceRoot}/libretro-common/include"
], ],
"defines": [], "defines": [],
"intelliSenseMode": "clang-x64", "intelliSenseMode": "clang-x64",
@ -50,7 +52,8 @@
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/ucrt", "C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/ucrt",
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/shared", "C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/shared",
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/winrt", "C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/winrt",
"${workspaceRoot}" "${workspaceRoot}",
"${workspaceFolder}/libretro-common/include"
], ],
"defines": [ "defines": [
"_DEBUG", "_DEBUG",

2
.vscode/launch.json vendored
View File

@ -13,7 +13,7 @@
"stopAtEntry": false, "stopAtEntry": false,
"cwd": "${workspaceFolder}", "cwd": "${workspaceFolder}",
"environment": [], "environment": [],
"externalConsole": false, "externalConsole": true,
"MIMode": "gdb", "MIMode": "gdb",
"miDebuggerPath": "c:\\msys64\\mingw64\\bin\\gdb.exe", "miDebuggerPath": "c:\\msys64\\mingw64\\bin\\gdb.exe",
"setupCommands": [ "setupCommands": [

25
.vscode/settings.json vendored
View File

@ -7,6 +7,7 @@
"terminal.integrated.cursorBlinking": true, "terminal.integrated.cursorBlinking": true,
"editor.tabSize": 3, "editor.tabSize": 3,
"editor.detectIndentation": false,
"editor.renderWhitespace": "all", "editor.renderWhitespace": "all",
"editor.insertSpaces": true, "editor.insertSpaces": true,
"files.associations": { "files.associations": {
@ -19,7 +20,29 @@
"iosfwd": "c", "iosfwd": "c",
"xlocbuf": "c", "xlocbuf": "c",
"xmemory0": "c", "xmemory0": "c",
"ios": "c" "ios": "c",
"list": "c",
"input_driver.h": "c",
"video_driver.h": "c",
"menu_driver.h": "c",
"file_path.h": "c",
"unordered_map": "c",
"unordered_set": "c",
"sstream": "cpp",
"hash_map": "c",
"hash_set": "c",
"initializer_list": "c",
"string_view": "c",
"utility": "c",
"menu_input.h": "c",
"tasks_internal.h": "c",
"ozone.h": "c",
"ozone_theme.h": "c",
"ozone_texture.h": "c",
"string_list.h": "c",
"core_info.h": "c"
"thread": "c",
"xlocale": "c"
}, },
"C_Cpp.dimInactiveRegions": false, "C_Cpp.dimInactiveRegions": false,
} }

57
.vscode/tasks.json vendored
View File

@ -4,12 +4,49 @@
"version": "2.0.0", "version": "2.0.0",
"tasks": [ "tasks": [
{ {
"taskName": "msys2-mingw64 build", "label": "linux clean build",
"type": "shell",
"group": "build",
"command": "make clean && ./configure && make -j12"
},
{
"label": "linux clean",
"type": "shell",
"group": "build",
"command": "make clean"
},
{
"label": "linux build with debug symbols",
"type": "shell",
"group": "build",
"command": "DEBUG=1 make -j12"
},
{
"label": "linux build",
"type": "shell",
"group": "build",
"command": "make -j12"
},
{
"label": "linux build and run",
"type": "shell",
"group": "build",
"command": "make -j12 && ./retroarch -v"
},
{
"label": "linux build and run with debug symbols",
"type": "shell",
"group": "build",
"command": "DEBUG=1 make -j12 && ./retroarch -v"
},
{
"label": "msys2-mingw64 build",
"type": "shell", "type": "shell",
"group": { "group": {
"kind": "build", "kind": "build",
"isDefault": true }, "isDefault": true
},
"command": "./configure; make -j2", "command": "./configure; make -j2",
"options": { "options": {
@ -20,9 +57,9 @@
] ]
} }
} }
} },
{ {
"taskName": "msys2-mingw64 build with debug symbols", "label": "msys2-mingw64 build with debug symbols",
"type": "shell", "type": "shell",
"group": "build", "group": "build",
@ -36,9 +73,9 @@
] ]
} }
} }
} },
{ {
"taskName": "msys2-mingw64 rebuild", "label": "msys2-mingw64 rebuild",
"type": "shell", "type": "shell",
"group": "build", "group": "build",
@ -52,9 +89,9 @@
] ]
} }
} }
} },
{ {
"taskName": "msys2-mingw64 clean", "label": "msys2-mingw64 clean",
"type": "shell", "type": "shell",
"group": "build", "group": "build",
@ -68,9 +105,9 @@
] ]
} }
} }
} },
{ {
"taskName": "msys2-mingw64 run", "label": "msys2-mingw64 run",
"type": "shell", "type": "shell",
"group": { "group": {

96
10bpc-gl.diff Normal file
View File

@ -0,0 +1,96 @@
diff --git a/gfx/drivers_context/wgl_ctx.c b/gfx/drivers_context/wgl_ctx.c
index b90a8e40c3..e57c4df194 100644
--- a/gfx/drivers_context/wgl_ctx.c
+++ b/gfx/drivers_context/wgl_ctx.c
@@ -78,6 +78,47 @@
#ifndef WGL_CONTEXT_DEBUG_BIT_ARB
#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001
#endif
+
+#ifndef WGL_ACCELERATION_ARB
+#define WGL_ACCELERATION_ARB 0x2003
+#endif
+
+#ifndef WGL_FULL_ACCELERATION_ARB
+#define WGL_FULL_ACCELERATION_ARB 0x2027
+#endif
+
+#ifndef WGL_DRAW_TO_WINDOW_ARB
+#define WGL_DRAW_TO_WINDOW_ARB 0x2001
+#endif
+
+#ifndef WGL_DOUBLE_BUFFER_ARB
+#define WGL_DOUBLE_BUFFER_ARB 0x2011
+#endif
+
+#ifndef WGL_RED_BITS_ARB
+#define WGL_RED_BITS_ARB 0x2015
+#endif
+
+#ifndef WGL_GREEN_BITS_ARB
+#define WGL_GREEN_BITS_ARB 0x2017
+#endif
+
+#ifndef WGL_BLUE_BITS_ARB
+#define WGL_BLUE_BITS_ARB 0x2019
+#endif
+
+#ifndef WGL_ALPHA_BITS_ARB
+#define WGL_ALPHA_BITS_ARB 0x201B
+#endif
+
+#ifndef WGL_PIXEL_TYPE_ARB
+#define WGL_PIXEL_TYPE_ARB 0x2013
+#endif
+
+#ifndef WGL_TYPE_RGBA_ARB
+#define WGL_TYPE_RGBA_ARB 0x202B
+#endif
+
#endif
#if defined(HAVE_OPENGL)
@@ -313,6 +354,43 @@ static void create_gl_context(HWND hwnd, bool *quit)
RARCH_LOG("[WGL]: Adaptive VSync supported.\n");
wgl_adaptive_vsync = true;
}
+ if (wgl_has_extension("WGL_ARB_pixel_format", extensions))
+ {
+ BOOL (WINAPI * wglChoosePixelFormatARB)
+ (HDC hdc,
+ const int *piAttribIList,
+ const FLOAT *pfAttribFList,
+ UINT nMaxFormats,
+ int *piFormats,
+ UINT *nNumFormats);
+ UINT nMatchingFormats;
+ int index = 0;
+ int attribsDesired[] = {
+ WGL_DRAW_TO_WINDOW_ARB, 1,
+ WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB,
+ WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB,
+ WGL_RED_BITS_ARB, 10,
+ WGL_GREEN_BITS_ARB, 10,
+ WGL_BLUE_BITS_ARB, 10,
+ WGL_ALPHA_BITS_ARB, 2,
+ WGL_DOUBLE_BUFFER_ARB, 1,
+ 0,0
+ };
+ wglChoosePixelFormatARB = (BOOL (WINAPI *) (HDC, const int *,
+ const FLOAT*, UINT, int*, UINT*))
+ gfx_ctx_wgl_get_proc_address("wglChoosePixelFormatARB");
+
+ RARCH_LOG("[WGL]: ARB pixel format supported.\n");
+
+ if (wglChoosePixelFormatARB(win32_hdc, attribsDesired,
+ NULL, 1, &index, &nMatchingFormats))
+ {
+ if (nMatchingFormats == 0)
+ {
+ RARCH_WARN("No 10bpc WGL_ARB_pixel_formats found!\n");
+ }
+ }
+ }
}
}
#endif

View File

@ -25,6 +25,7 @@ Amiga1200Gamer (amigagamer)
Andre Leiradella (leiradel) Andre Leiradella (leiradel)
Andrés (fr500) Andrés (fr500)
Anthony J. Bentley (bentley) Anthony J. Bentley (bentley)
Antonio Jose Ramos Marquez (psxdev)
AridRayne AridRayne
Arto Vainiolehto (arakerlu) Arto Vainiolehto (arakerlu)
asako (asakous) asako (asakous)
@ -94,6 +95,7 @@ FIX94
Flame Sage (chris062689) Flame Sage (chris062689)
flyinghead flyinghead
Francisco José García García (frangarcj) Francisco José García García (frangarcj)
Francisco Javier Trujillo Mata (fjtrujy)
GameDragon2k GameDragon2k
Garrett Brown (garbear) Garrett Brown (garbear)
gblues gblues
@ -141,6 +143,7 @@ JuanVCS
Justin Jacobs (dorkster) Justin Jacobs (dorkster)
Justin Weiss (justinweiss) Justin Weiss (justinweiss)
Ken Rossato (rossato) Ken Rossato (rossato)
Krzysztof Haładyn (krzys_h)
kurumushi kurumushi
kwyxz kwyxz
l3iggs l3iggs

View File

@ -1,13 +1,83 @@
# 1.7.5 (future) # 1.7.6 (future)
- ANDROID: Fix Xperia Play input binding
- CHEEVOS: Reset when hardcore mode is toggled
- CHEEVOS: Update the hashing methods to identify NES, SNES and Lynx games (more accurate and accepting headerless ROMs).
- COMMON: Add new JSON playlist format
- COMMON: Fix playlist corruption when deleting items
- COMMON: Fix archive progress display calculation
- COMMON: Fix playlist entries appearing with previously used names
- COMMON: Fix screenshot filename with no core or content
- COMMON: Allow compiling without menu support
- CORE UPDATER: Allow sideloading cores from the menu
- CPU FILTERS: Add Normal2x filter.
- DATE: Add Date / Time style options.
- DEBUGGING: Add an integrated crash handler for debug builds (see https://docs.libretro.com/tech/debugging)
- DISCORD: Register the application name properly.
- DISK CONTROL: Remember the last used folder / current active folder to make disk-swapping faster.
- INPUT: Add new menu toggle (hold start button for 2 seconds)
- INPUT: Fix arrow keys being incorrectly bound as numpad keys
- INPUT/SDL: Flush the joypad events. Decreases cpu usage over time with the SDL joypad driver.
- LOCALIZATION: Add Greek translation.
- LOCALIZATION: Update German translation.
- LOCALIZATION: Update Italian translation.
- LOCALIZATION: Update Japanese translation.
- LOCALIZATION: Update Simplified Chinese translation.
- LOCALIZATION: Update Spanish translation.
- MENU: New "ozone" menu driver.
- MENU: Only show CRT SwitchRes if video display server is implemented (Windows/Linux for now)
- MENU: User Interface -> Appearance -> 'Menu Font Green/Blue Color' settings now work properly.
- MENU: Add option to enable in-menu sound effects
- MENU/QT/WIMP: Allow building with MSVC2017
- MENU/QT/WIMP: Add detailed file browser table
- MENU/QT/WIMP: New grid view implementation that is faster and loads thumbnails on-demand
- MIDI: Add a Linux ALSA driver for MIDI.
- NETPLAY: Force fast-save-states when netlay is enabled
- NETPLAY: Allow quick joining subsystem lobbies
- PS2: Initial PlayStation2 port.
- PS4: Initial PlayStation4 port.
- RECORDING: Implement recording options in the menu complete with quality profiles, streaming, and proper file naming
- SCANNER: Fix GDI disc scanning.
- SHADERS: Fix auto shader preset loading on D3D10, D3D11, D3D12
- SUBSYSTEM: Allow more than 10 subsystems
- SUBSYSTEM: Cores that use subsystem for complex scenarios can now load content without starting a regular content first
- SUBSYSTEM: Remember the last used folder to make loading subsystem type content faster
- SWITCH/LIBNX: Improve touch scaling calculation.
- SWITCH: Proper button labels.
- VULKAN: Fix RGUI crashing at startup.
- VULKAN: Fix secondary screens in overlays not working.
- WAYLAND: Implement idle-inhibit support (needed for screensaver suspend).
- WAYLAND: Fix fullscreen toggle
- WIIU: Initial netplay peer-to-peer support. Network information working.
- WINDOWS/WSA: Network Information info is blank until first network operation.
- WINDOWS: Fix an ancient bug that caused wrong mappings for keyboard arrows
- WINDOWS: Remember window size and position if so desired
- WINDOWS: SSL/TLS connections now work properly.
- UWP: Initial UWP port.
- VFS: Update to version 3
- XBONE: Initial Xbox One port.
- XMB/OZONE: Add more icons
- ???: Easter Egg
# 1.7.5
- CAMERA: Fix Video4Linux2 driver that broke years ago. - CAMERA: Fix Video4Linux2 driver that broke years ago.
- CHEEVOS: Support headerless NES hashing. - CONFIG: Add 'Reset To Defaults' setting in Configurations. Thi will reset your config file to defaults.
- CHEATS: Add support for Rumble when increase or decrease by the rumble value.
- CHEATS: Add cheat variables to allow for updating large portions of memory.
- CHEEVOS: Prevent loading states before achievements are fully loaded.
- CRT: New porches and interlaced bug fix. - CRT: New porches and interlaced bug fix.
- CRT: New functionality, ability to switch between 15KHz and 31KHz, etc.
- COMMON: Support for "OEM-102" key (usually '\' on Euro keyboards). - COMMON: Support for "OEM-102" key (usually '\' on Euro keyboards).
- DISCORD: Add 'Ask To Join' Feature. - DISCORD: Add 'Ask To Join' Feature.
- EMSCRIPTEN: Add stb_font support.
- INPUT: Add new menu toggle combos 'L3 + R' and 'L + R' (useful for Switch).
- IOS: Use safe area to account for notch for iPhone X and adjust main view.
- LOCALIZATION: Update Portuguese / Brazilian translation. - LOCALIZATION: Update Portuguese / Brazilian translation.
- LOCALIZATION: Update Japanese translation. - LOCALIZATION: Update Japanese translation.
- LOCALIZATION: Update Polish translation. - LOCALIZATION: Update Polish translation.
- LOCALIZATION: Update Spanish translation. - LOCALIZATION: Update Spanish translation.
- MENU: Add dropdown lists for many settings.
- MENU: Fix crash that could happen when changing core's options on Android.
- MENU/QT/WIMP: Add option to rename playlists.
- MENU/QT/WIMP: Add option to filter extensions inside archives when adding to a playlist. - MENU/QT/WIMP: Add option to filter extensions inside archives when adding to a playlist.
- MENU/QT/WIMP: Rename playlist entries with 2 single clicks. - MENU/QT/WIMP: Rename playlist entries with 2 single clicks.
- MENU/QT/WIMP: Fix shader parameter checkboxes not working - MENU/QT/WIMP: Fix shader parameter checkboxes not working
@ -15,9 +85,16 @@
- NETPLAY: Save lobby details received back from server after first announcement. - NETPLAY: Save lobby details received back from server after first announcement.
- OPENGL/GLX: Implement Adaptive VSync - GLX_EXT_swap_control_tear. - OPENGL/GLX: Implement Adaptive VSync - GLX_EXT_swap_control_tear.
- OPENGL/WGL: Implement Adaptive VSync - WGL_EXT_swap_control_tear. - OPENGL/WGL: Implement Adaptive VSync - WGL_EXT_swap_control_tear.
- RUNAHEAD: Fix performance degradation that could happen over time (after approx. 30 mins). Fixed input IDs outside of range 0-35 causing slow performance in runahead.
- SWITCH: Add stb_font support.
- SWITCH: Add Retro Achievements support.
- SWITCH: Add networking support.
- SWITCH: Add touchscreen support.
- SWITCH: Add OpenGL support.
- SWITCH: Merging of RetroNX Nintendo Switch port, based on libnx SDK. - SWITCH: Merging of RetroNX Nintendo Switch port, based on libnx SDK.
- VULKAN: Fix race condition in threaded mailbox emulation. - VULKAN: Fix race condition in threaded mailbox emulation.
- VULKAN: Maintenance fixes. - VULKAN: Maintenance fixes.
- WIIU: Fix menu lag when built with DevKitPro r32.
# 1.7.4 # 1.7.4
- ANDROID: Add sustained performance mode, can be turned on/off in Power Management settings menu. - ANDROID: Add sustained performance mode, can be turned on/off in Power Management settings menu.

2482
Doxyfile Normal file

File diff suppressed because it is too large Load Diff

View File

@ -16,26 +16,35 @@ include config.mk
TARGET = retroarch TARGET = retroarch
OBJ :=
LIBS :=
DEF_FLAGS :=
DEFINES := -DHAVE_CONFIG_H -DRARCH_INTERNAL -D_FILE_OFFSET_BITS=64
DEFINES += -DGLOBAL_CONFIG_DIR='"$(GLOBAL_CONFIG_DIR)"'
OBJDIR_BASE := obj-unix OBJDIR_BASE := obj-unix
ifeq ($(DEBUG), 1) ifeq ($(DEBUG), 1)
OBJDIR := $(OBJDIR_BASE)/debug OBJDIR := $(OBJDIR_BASE)/debug
CFLAGS ?= -O0 -g
CXXFLAGS ?= -O0 -g
DEFINES += -DDEBUG -D_DEBUG
else else
OBJDIR := $(OBJDIR_BASE)/release OBJDIR := $(OBJDIR_BASE)/release
CFLAGS ?= -O3
CXXFLAGS ?= -O3
DEF_FLAGS += -ffast-math
endif endif
OBJ :=
LIBS :=
DEFINES := -DHAVE_CONFIG_H -DRARCH_INTERNAL -D_FILE_OFFSET_BITS=64
DEFINES += -DGLOBAL_CONFIG_DIR='"$(GLOBAL_CONFIG_DIR)"'
ifneq ($(findstring BSD,$(OS)),) ifneq ($(findstring BSD,$(OS)),)
CFLAGS += -DBSD DEF_FLAGS += -DBSD
LDFLAGS += -L/usr/local/lib LDFLAGS += -L/usr/local/lib
UDEV_CFLAGS += -I/usr/local/include/libepoll-shim
UDEV_LIBS += -lepoll-shim
endif endif
ifneq ($(findstring DOS,$(OS)),) ifneq ($(findstring DOS,$(OS)),)
CFLAGS += -march=i386 DEF_FLAGS += -march=i386
LDFLAGS += -lemu LDFLAGS += -lemu
endif endif
@ -75,21 +84,19 @@ ifneq ($(V),1)
Q := @ Q := @
endif endif
ifeq ($(DEBUG), 1) ifeq ($(HAVE_DRMINGW), 1)
OPTIMIZE_FLAG = -O0 -g DEF_FLAGS += -DHAVE_DRMINGW
DEFINES += -DDEBUG -D_DEBUG LDFLAGS += $(DRMINGW_LIBS)
else
OPTIMIZE_FLAG = -O3 -ffast-math
endif endif
ifneq ($(findstring Win32,$(OS)),) ifneq ($(findstring Win32,$(OS)),)
LDFLAGS += -mwindows LDFLAGS += -mwindows
endif endif
CFLAGS += -Wall $(OPTIMIZE_FLAG) $(INCLUDE_DIRS) -I. -Ideps -Ideps/stb DEF_FLAGS += -Wall $(INCLUDE_DIRS) -I. -Ideps -Ideps/stb
APPEND_CFLAGS := $(CFLAGS) CFLAGS += $(DEF_FLAGS)
CXXFLAGS += $(APPEND_CFLAGS) -std=c++11 -D__STDC_CONSTANT_MACROS CXXFLAGS += $(DEF_FLAGS) -std=c++11 -D__STDC_CONSTANT_MACROS
OBJCFLAGS := $(CFLAGS) -D__STDC_CONSTANT_MACROS OBJCFLAGS := $(CFLAGS) -D__STDC_CONSTANT_MACROS
ifeq ($(HAVE_CXX), 1) ifeq ($(HAVE_CXX), 1)
@ -164,7 +171,7 @@ all: $(TARGET) config.mk
$(MOC_SRC): $(MOC_SRC):
@$(if $(Q), $(shell echo echo MOC $<),) @$(if $(Q), $(shell echo echo MOC $<),)
$(eval MOC_TMP := $(patsubst %.h,%_moc.cpp,$@)) $(eval MOC_TMP := $(patsubst %.h,%_moc.cpp,$@))
$(Q)$(MOC) -o $(MOC_TMP) $< $(Q)QT_SELECT=$(QT_VERSION) $(MOC) -o $(MOC_TMP) $<
$(foreach x,$(join $(addsuffix :,$(MOC_SRC)),$(MOC_HEADERS)),$(eval $x)) $(foreach x,$(join $(addsuffix :,$(MOC_SRC)),$(MOC_HEADERS)),$(eval $x))
@ -243,12 +250,24 @@ install: $(TARGET)
chmod 644 $(DESTDIR)$(MAN_DIR)/man6/retroarch.6 chmod 644 $(DESTDIR)$(MAN_DIR)/man6/retroarch.6
chmod 644 $(DESTDIR)$(MAN_DIR)/man6/retroarch-cg2glsl.6 chmod 644 $(DESTDIR)$(MAN_DIR)/man6/retroarch-cg2glsl.6
chmod 644 $(DESTDIR)$(DATA_DIR)/pixmaps/retroarch.svg chmod 644 $(DESTDIR)$(DATA_DIR)/pixmaps/retroarch.svg
@if test -d media/assets; then \ @if test -d media/assets && test $(HAVE_ASSETS); then \
echo "Installing media assets..."; \ echo "Installing media assets..."; \
mkdir -p $(DESTDIR)$(ASSETS_DIR)/assets/xmb; \ mkdir -p $(DESTDIR)$(ASSETS_DIR)/assets; \
mkdir -p $(DESTDIR)$(ASSETS_DIR)/assets/glui; \ if test $(HAVE_ZARCH) = 1; then \
cp -r media/assets/xmb/ $(DESTDIR)$(ASSETS_DIR)/assets; \ cp -r media/assets/zarch/ $(DESTDIR)$(ASSETS_DIR)/assets; \
fi; \
if test $(HAVE_MATERIALUI) = 1; then \
cp -r media/assets/glui/ $(DESTDIR)$(ASSETS_DIR)/assets; \ cp -r media/assets/glui/ $(DESTDIR)$(ASSETS_DIR)/assets; \
fi; \
if test $(HAVE_NUKLEAR) = 1; then \
cp -r media/assets/nuklear/ $(DESTDIR)$(ASSETS_DIR)/assets; \
fi; \
if test $(HAVE_XMB) = 1; then \
cp -r media/assets/xmb/ $(DESTDIR)$(ASSETS_DIR)/assets; \
fi; \
if test $(HAVE_OZONE) = 1; then \
cp -r media/assets/ozone/ $(DESTDIR)$(ASSETS_DIR)/assets; \
fi; \
cp media/assets/COPYING $(DESTDIR)$(DOC_DIR)/COPYING.assets; \ cp media/assets/COPYING $(DESTDIR)$(DOC_DIR)/COPYING.assets; \
echo "Asset copying done."; \ echo "Asset copying done."; \
fi fi

113
Makefile.classic_armv7_a7 Normal file
View File

@ -0,0 +1,113 @@
# This build was put together and is maintained by ModMyClassic.com for Libretro.
# The purpose is to give Libretro a proper "official" build platform for classic consoles.
# If you need any help in building for the classics or have any questions then please visit
# https://modmyclassic.com/comp and we will help in any way possible!
# Building Prerequisites ##############
# arm-linux-gnueabihf-gcc-8
# arm-linux-gnueabihf-g++-8
# arm-linux-gnueabihf-as
# arm-linux-gnueabihf-strip
# patchelf
# bc
include version.all
# Classic Readme Variables ############
CLASSIC_ALT_VER := $(shell echo $(RARCH_VERSION) | tr . _)
CLASSIC_MODS_VER := Official_Retroarch_v$(CLASSIC_ALT_VER)c_COptimised
CLASSIC_MODS_NAME := RetroArch v$(RARCH_VERSION)c \(Official Classic Optimised\)
CLASSIC_VERSION := $(RARCH_VERSION)c \(Classic+\)
MOD_CREATOR := Libretro + ModMyClassic
MOD_CATEGORY := RetroArch
GIT_COMMIT := $(shell echo "`git rev-parse --short HEAD``git diff-index --quiet HEAD -- || echo '-dirty'`")
# Platform dependant Variables ########
HAKCHI_DIR := RA_Platform-Hakchi
HAKCHI_GIT := https://github.com/Classicmods/RA_Platform-Hakchi
# General Shared Variables ############
TARGET := retroarch
CC_V = arm-linux-gnueabihf-gcc-8
CXX_V = arm-linux-gnueabihf-g++-8
AS_V = arm-linux-gnueabihf-as
CC_AS_V = arm-linux-gnueabihf-gcc-8
# Libretro Defines ####################
#HAVE_CLASSIC = Classic Hook, disable some features
#HAVE_C_A7A7 = Classic Armv7 Cortex A7 optimisation override
#HAVE_HAKCHI = Hakchi Hook, change default configurations etc (TODO)
all: $(TARGET)
retroarch:
#Backup vanilla version files + ammend version
cp version.all version_BACKUP.all && cp version.dtd version_BACKUP.dtd
sed -i -e 's/RARCH_VERSION="[^"]*"/RARCH_VERSION="$(CLASSIC_VERSION)"/g' version.all
sed -i -e 's/PACKAGE_VERSION "[^"]*"/PACKAGE_VERSION "$(CLASSIC_VERSION)"/g' version.all
sed -i -e 's/ENTITY version "[^"]*"/ENTITY version "$(CLASSIC_VERSION)"/g' version.dtd
#Build the RetroArch Binary for cross platform classics (ARMv7 Cortex A7)
patchelf --version #Check if you have patchelf installed... (sudo apt-get install patchelf)
./configure --host=arm-linux-gnueabihf --enable-mali_fbdev --disable-freetype --enable-opengles --enable-udev --enable-alsa --enable-neon --enable-floathard --disable-discord
make CC=$(CC_V) CXX=$(CXX_V) AS=$(AS_V) CC_AS=$(CC_AS_V) LDFLAGS_SDL=-lSDL2 HAVE_CLASSIC=1 HAVE_C_A7A7=1 HAVE_HAKCHI=1 -j #Cook it
arm-linux-gnueabihf-strip -v retroarch
patchelf --replace-needed libSDL2-2.0.so.0 libSDL2.so retroarch #libSDL2-2.0.so.0 sym link doesn't exist on native build. Just patch the binary...
#HAKCHI BUILD (NESC, SNESC)
#FYI this build was originally known as RetroArch 'Neo' for Hakchi.
@echo "** BUILDING CLASSIC_MODS HAKCHI - $(CLASSIC_MODS_VER) HMOD PACKAGE **"
rm -fr /tmp/$(HAKCHI_DIR)
cd /tmp/; git clone $(HAKCHI_GIT)
cp retroarch /tmp/$(HAKCHI_DIR)/bin/retroarch
echo $$(echo "Built by: " $$USER @ $$(date) \\\\\\ Git Commit: $(GIT_COMMIT)) > /tmp/$(HAKCHI_DIR)/etc/libretro/retroarch_version
cp /tmp/$(HAKCHI_DIR)/readme.md /tmp/$(HAKCHI_DIR)/readme_COPY.md
printf "%s\n" \
"---" \
"Name: $(CLASSIC_MODS_NAME)" \
"Creator: $(MOD_CREATOR)" \
"Category: $(MOD_CATEGORY)" \
"Version: $(CLASSIC_MODS_VER)" \
"Built on: $(shell date)" \
"Git commit: $(GIT_COMMIT)" \
"---" > /tmp/$(HAKCHI_DIR)/readme.md
cat /tmp/$(HAKCHI_DIR)/readme_COPY.md >> /tmp/$(HAKCHI_DIR)/readme.md
rm /tmp/$(HAKCHI_DIR)/readme_COPY.md
@echo "** COMPRESSING $(CLASSIC_MODS_VER) HMOD PACKAGE **"
cd /tmp/$(HAKCHI_DIR)/; tar -czvf "$(CLASSIC_MODS_VER).hmod" *
mv /tmp/$(HAKCHI_DIR)/$(CLASSIC_MODS_VER).hmod .
@echo "** BUILT CLASSIC_MODS HAKCHI - $(CLASSIC_MODS_VER) HMOD PACKAGE **"
rm -fr /tmp/$(HAKCHI_DIR) #clean up tmp
#COMMODORE 64 MINI BUILD (WIP)
#Clean down dirty files
rm -f version.all version.dtd
mv version_BACKUP.all version.all && mv version_BACKUP.dtd version.dtd
@echo "*********************************************************************"
@echo "*** Classic ARM7 Cortex A7 build and packages built successfully! ***"
@echo "****************** Winner, Winner, Chicken Dinner! ******************"
@echo "*********************************************************************"
clean:
rm -rf obj-unix
rm -f *.d
rm -f *.o
rm -f audio/*.o
rm -f conf/*.o
rm -f gfx/*.o
rm -f gfx/drivers_font/*.o
rm -f gfx/drivers_font_renderer/*.o
rm -f gfx/drivers_context/*.o
rm -f gfx/py_state/*.o
rm -f compat/*.o
rm -f record/*.o
rm -f input/*.o
rm -f tools/*.o
rm -f $(BINDIR)/retroarch
rm -f $(BINDIR)/retroarch-joyconfig
rm -f $(PNDDIR)/readme.html
rm -f retroarch
rm -f $(CLASSIC_MODS_VER).hmod
rm -f version.all version.dtd
mv -f version_BACKUP.all version.all || echo "Backup Doesn't Exist - Ignoring..."
mv -f version_BACKUP.dtd version.dtd || echo "Backup Doesn't Exist - Ignoring..."
rm -f *_BACKUP*

File diff suppressed because it is too large Load Diff

View File

@ -52,8 +52,8 @@ ifeq ($(GRIFFIN_BUILD), 1)
OBJ += griffin/griffin.o OBJ += griffin/griffin.o
DEFINES += -DHAVE_GRIFFIN=1 -DHAVE_MENU -DHAVE_RGUI -DHAVE_XMB -DHAVE_MATERIALUI -DHAVE_LIBRETRODB -DHAVE_CC_RESAMPLER DEFINES += -DHAVE_GRIFFIN=1 -DHAVE_MENU -DHAVE_RGUI -DHAVE_XMB -DHAVE_MATERIALUI -DHAVE_LIBRETRODB -DHAVE_CC_RESAMPLER
DEFINES += -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DWANT_ZLIB DEFINES += -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DWANT_ZLIB
DEFINES += -DHAVE_NETWORKING -DHAVE_CHEEVOS -DHAVE_SOCKET_LEGACY -DHAVE_THREADS #DEFINES += -DHAVE_NETWORKING -DHAVE_CHEEVOS -DRC_DISABLE_LUA -DHAVE_SOCKET_LEGACY -DHAVE_THREADS
#-DHAVE_SSL -DMBEDTLS_SSL_DEBUG_ALL #-DHAVE_SSL -DHAVE_BUILTINMBEDTLS -DMBEDTLS_SSL_DEBUG_ALL
#ssl is currently incompatible with griffin due to use of the "static" flag on repeating functions that will conflict when included in one file #ssl is currently incompatible with griffin due to use of the "static" flag on repeating functions that will conflict when included in one file
else else
HAVE_CC_RESAMPLER = 1 HAVE_CC_RESAMPLER = 1
@ -62,6 +62,7 @@ else
HAVE_RPNG = 1 HAVE_RPNG = 1
HAVE_RJPEG = 1 HAVE_RJPEG = 1
HAVE_RBMP = 1 HAVE_RBMP = 1
HAVE_MENU = 1
HAVE_RGUI = 1 HAVE_RGUI = 1
HAVE_ZLIB = 1 HAVE_ZLIB = 1
HAVE_7ZIP = 1 HAVE_7ZIP = 1
@ -72,13 +73,15 @@ else
HAVE_XMB = 1 HAVE_XMB = 1
HAVE_STATIC_VIDEO_FILTERS = 1 HAVE_STATIC_VIDEO_FILTERS = 1
HAVE_STATIC_AUDIO_FILTERS = 1 HAVE_STATIC_AUDIO_FILTERS = 1
HAVE_NETWORKING = 1 #HAVE_NETWORKING = 1
HAVE_CHEEVOS = 1 #HAVE_CHEEVOS = 1
HAVE_SOCKET_LEGACY = 1 #HAVE_SOCKET_LEGACY = 1
HAVE_THREADS = 1 #HAVE_THREADS = 1
HAVE_SSL = 1 #HAVE_SSL = 1
#HAVE_BUILTINMBEDTLS = 1
include Makefile.common include Makefile.common
CFLAGS += $(DEF_FLAGS)
BLACKLIST := BLACKLIST :=
BLACKLIST += input/input_overlay.o BLACKLIST += input/input_overlay.o
BLACKLIST += tasks/task_overlay.o BLACKLIST += tasks/task_overlay.o
@ -104,7 +107,6 @@ MAKEROM_ARGS_COMMON = -rsf $(APP_RSF) -exefslogo -elf $(TARGET).elf -icon $(TARG
INCDIRS := -I$(CTRULIB)/include INCDIRS := -I$(CTRULIB)/include
LIBDIRS := -L. -L$(CTRULIB)/lib LIBDIRS := -L. -L$(CTRULIB)/lib
ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=hard -marm -mfpu=vfp -mtp=soft ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=hard -marm -mfpu=vfp -mtp=soft
CFLAGS += -mword-relocations \ CFLAGS += -mword-relocations \
@ -130,7 +132,12 @@ ifeq ($(WHOLE_ARCHIVE_LINK), 1)
WHOLE_END := -Wl,--no-whole-archive WHOLE_END := -Wl,--no-whole-archive
endif endif
CFLAGS += -I. -Ideps -Ideps/libz -Ideps/7zip -Ideps/stb -Ilibretro-common/include CFLAGS += -I. \
-Ideps \
-Ideps/libz \
-Ideps/7zip \
-Ideps/stb \
-Ilibretro-common/include
CFLAGS += -DRARCH_INTERNAL -DRARCH_CONSOLE CFLAGS += -DRARCH_INTERNAL -DRARCH_CONSOLE
CFLAGS += -DHAVE_FILTERS_BUILTIN $(DEFINES) CFLAGS += -DHAVE_FILTERS_BUILTIN $(DEFINES)
@ -142,7 +149,6 @@ LDFLAGS += -specs=ctr/3dsx_custom.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
CFLAGS += -std=gnu99 -ffast-math CFLAGS += -std=gnu99 -ffast-math
LIBS := $(WHOLE_START) -lretro_ctr $(WHOLE_END) -lm LIBS := $(WHOLE_START) -lretro_ctr $(WHOLE_END) -lm
ifeq ($(DEBUG), 1) ifeq ($(DEBUG), 1)
@ -151,7 +157,6 @@ else
LIBS += -lctru LIBS += -lctru
endif endif
ifeq ($(BUILD_3DSX), 1) ifeq ($(BUILD_3DSX), 1)
TARGET_3DSX := $(TARGET).3dsx $(TARGET).smdh TARGET_3DSX := $(TARGET).3dsx $(TARGET).smdh
endif endif
@ -261,7 +266,6 @@ $(TARGET).3ds: $(TARGET).elf $(TARGET).bnr $(TARGET).icn $(APP_RSF)
$(TARGET).cia: $(TARGET).elf $(TARGET).bnr $(TARGET).icn $(APP_RSF) $(TARGET).cia: $(TARGET).elf $(TARGET).bnr $(TARGET).icn $(APP_RSF)
$(MAKEROM) -f cia -o $@ $(MAKEROM_ARGS_COMMON) -DAPP_ENCRYPTED=false $(MAKEROM) -f cia -o $@ $(MAKEROM_ARGS_COMMON) -DAPP_ENCRYPTED=false
clean: clean:
rm -f $(OBJ) rm -f $(OBJ)
rm -f $(TARGET).3dsx rm -f $(TARGET).3dsx
@ -275,5 +279,3 @@ clean:
rm -f ctr/3dsx_custom_crt0.o rm -f ctr/3dsx_custom_crt0.o
.PHONY: clean .PHONY: clean

View File

@ -27,6 +27,7 @@ OBJ := ctr/ctr_system.o \
frontend/drivers/platform_null.o \ frontend/drivers/platform_null.o \
libretro-common/encodings/encoding_utf.o \ libretro-common/encodings/encoding_utf.o \
libretro-common/compat/compat_strcasestr.o \ libretro-common/compat/compat_strcasestr.o \
libretro-common/compat/fopen_utf8.o \
libretro-common/file/file_path.o \ libretro-common/file/file_path.o \
libretro-common/string/stdstring.o \ libretro-common/string/stdstring.o \
libretro-common/lists/string_list.o \ libretro-common/lists/string_list.o \
@ -94,10 +95,8 @@ LDFLAGS += -specs=ctr/3dsx_custom.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
CFLAGS += -std=gnu99 -ffast-math CFLAGS += -std=gnu99 -ffast-math
LIBS := -lctru -lm LIBS := -lctru -lm
ifeq ($(BUILD_3DSX), 1) ifeq ($(BUILD_3DSX), 1)
TARGET_3DSX := $(TARGET).3dsx $(TARGET).smdh TARGET_3DSX := $(TARGET).3dsx $(TARGET).smdh
endif endif
@ -220,5 +219,3 @@ clean:
rm -f ctr/3dsx_custom_crt0.o rm -f ctr/3dsx_custom_crt0.o
.PHONY: clean .PHONY: clean

View File

@ -7,7 +7,7 @@ PTHREAD = 0
OS = Emscripten OS = Emscripten
OBJ := OBJ :=
DEFINES := -DRARCH_INTERNAL -DHAVE_MAIN -s USE_PTHREADS=$(PTHREAD) DEFINES := -DRARCH_INTERNAL -DHAVE_MAIN -s USE_PTHREADS=$(PTHREAD)
DEFINES += -DHAVE_OPENGL -DHAVE_OPENGLES -DHAVE_OPENGLES2 -DHAVE_GLSL -DHAVE_FILTERS_BUILTIN DEFINES += -DHAVE_OPENGL -DHAVE_OPENGLES -DHAVE_OPENGLES2 -DHAVE_GLSL -DHAVE_FILTERS_BUILTIN -DHAVE_STB_FONT
HAVE_OVERLAY = 1 HAVE_OVERLAY = 1
HAVE_CC_RESAMPLER = 1 HAVE_CC_RESAMPLER = 1
@ -16,6 +16,7 @@ HAVE_OPENGLES = 1
HAVE_RJPEG = 0 HAVE_RJPEG = 0
HAVE_RPNG = 1 HAVE_RPNG = 1
HAVE_EMSCRIPTEN = 1 HAVE_EMSCRIPTEN = 1
HAVE_MENU = 1
HAVE_RGUI = 1 HAVE_RGUI = 1
HAVE_SDL = 0 HAVE_SDL = 0
HAVE_SDL2 = 0 HAVE_SDL2 = 0
@ -25,6 +26,7 @@ HAVE_SHADERPIPELINE = 1
HAVE_STATIC_VIDEO_FILTERS = 1 HAVE_STATIC_VIDEO_FILTERS = 1
HAVE_STATIC_AUDIO_FILTERS = 1 HAVE_STATIC_AUDIO_FILTERS = 1
MEMORY = 536870912 MEMORY = 536870912
HAVE_STB_FONT = 1
PRECISE_F32 = 1 PRECISE_F32 = 1
@ -56,7 +58,7 @@ endif
include Makefile.common include Makefile.common
CFLAGS += -Ideps/libz -Ideps -Ideps/stb CFLAGS += $(DEF_FLAGS) -Ideps/libz -Ideps -Ideps/stb
libretro = libretro_emscripten.bc libretro = libretro_emscripten.bc
ifneq ($(V), 1) ifneq ($(V), 1)

View File

@ -158,8 +158,6 @@ else ifeq ($(libogc_platform), 1)
endif endif
endif endif
LIBS += -logc
ifeq ($(EXTERNAL_LIBOGC), 1) ifeq ($(EXTERNAL_LIBOGC), 1)
LIBS += -lfat LIBS += -lfat
endif endif
@ -176,6 +174,8 @@ else ifeq ($(libogc_platform), 1)
endif endif
endif endif
LIBS += -logc
CFLAGS += -DGEKKO -U__INT32_TYPE__ -U __UINT32_TYPE__ -D__INT32_TYPE__=int CFLAGS += -DGEKKO -U__INT32_TYPE__ -U __UINT32_TYPE__ -D__INT32_TYPE__=int
HAVE_RUNAHEAD := 1 HAVE_RUNAHEAD := 1
@ -193,7 +193,7 @@ else ifeq ($(libogc_platform), 1)
RARCH_CONSOLE = 1 RARCH_CONSOLE = 1
ifeq ($(platform), wii) ifeq ($(platform), wii)
HAVE_LANGEXTRA := 1 #HAVE_LANGEXTRA := 1
HAVE_WIIUSB_HID := 1 HAVE_WIIUSB_HID := 1
HAVE_RARCH_EXEC := 1 HAVE_RARCH_EXEC := 1
HAVE_RSOUND := 1 HAVE_RSOUND := 1
@ -250,7 +250,7 @@ else ifeq ($(platform), psp1)
HAVE_RBMP := 1 HAVE_RBMP := 1
HAVE_RTGA := 1 HAVE_RTGA := 1
HAVE_KERNEL_PRX := 1 HAVE_KERNEL_PRX := 1
HAVE_LANGEXTRA := 1 #HAVE_LANGEXTRA := 1
RARCH_CONSOLE = 1 RARCH_CONSOLE = 1
ifeq ($(BUILD_PRX), 1) ifeq ($(BUILD_PRX), 1)
@ -320,6 +320,7 @@ else ifeq ($(platform), windows_msvc6_x86)
HAVE_7ZIP := 1 HAVE_7ZIP := 1
HAVE_NETWORKING := 0 HAVE_NETWORKING := 0
HAVE_NETWORK_CMD := 1 HAVE_NETWORK_CMD := 1
HAVE_NETPLAYDISCOVERY := 1
HAVE_OVERLAY := 1 HAVE_OVERLAY := 1
HAVE_MATERIALUI := 1 HAVE_MATERIALUI := 1
HAVE_XMB := 1 HAVE_XMB := 1
@ -361,6 +362,7 @@ else ifeq ($(platform), windows_msvc2003_x86)
HAVE_7ZIP := 1 HAVE_7ZIP := 1
HAVE_NETWORKING := 1 HAVE_NETWORKING := 1
HAVE_NETWORK_CMD := 1 HAVE_NETWORK_CMD := 1
HAVE_NETPLAYDISCOVERY := 1
HAVE_OVERLAY := 1 HAVE_OVERLAY := 1
HAVE_MATERIALUI := 1 HAVE_MATERIALUI := 1
HAVE_XMB := 1 HAVE_XMB := 1
@ -407,6 +409,7 @@ else ifeq ($(platform), windows_msvc2005_x86)
HAVE_7ZIP := 1 HAVE_7ZIP := 1
HAVE_NETWORKING := 1 HAVE_NETWORKING := 1
HAVE_NETWORK_CMD := 1 HAVE_NETWORK_CMD := 1
HAVE_NETPLAYDISCOVERY := 1
HAVE_OVERLAY := 1 HAVE_OVERLAY := 1
HAVE_MATERIALUI := 1 HAVE_MATERIALUI := 1
HAVE_XMB := 1 HAVE_XMB := 1
@ -427,8 +430,8 @@ else ifeq ($(platform), windows_msvc2005_x86)
CXX = cl.exe CXX = cl.exe
LD = link.exe LD = link.exe
PLATCFLAGS += -D_WIN32 -D_WIN32_WINNT=0x0410 -D__STDC_CONSTANT_MACROS -D_MBCS PLATCFLAGS += -D_WIN32 -D_WIN32_WINNT=0x0410 -D__STDC_CONSTANT_MACROS -D_MBCS -DHAVE_EASTEREGG
LDFLAGS += shell32.lib user32.lib gdi32.lib comdlg32.lib winmm.lib ole32.lib LDFLAGS += shell32.lib user32.lib gdi32.lib comdlg32.lib winmm.lib ole32.lib msimg32.lib
PATH := $(shell IFS=$$'\n'; cygpath "$(VS80COMNTOOLS)../../VC/bin"):$(PATH) PATH := $(shell IFS=$$'\n'; cygpath "$(VS80COMNTOOLS)../../VC/bin"):$(PATH)
PATH := $(PATH):$(shell IFS=$$'\n'; cygpath "$(VS80COMNTOOLS)../IDE") PATH := $(PATH):$(shell IFS=$$'\n'; cygpath "$(VS80COMNTOOLS)../IDE")
@ -454,6 +457,7 @@ else ifneq (,$(findstring windows_msvc2010,$(platform)))
HAVE_7ZIP := 1 HAVE_7ZIP := 1
HAVE_NETWORKING := 1 HAVE_NETWORKING := 1
HAVE_NETWORK_CMD := 1 HAVE_NETWORK_CMD := 1
HAVE_NETPLAYDISCOVERY := 1
HAVE_OVERLAY := 1 HAVE_OVERLAY := 1
HAVE_MATERIALUI := 1 HAVE_MATERIALUI := 1
HAVE_XMB := 1 HAVE_XMB := 1
@ -475,7 +479,7 @@ else ifneq (,$(findstring windows_msvc2010,$(platform)))
LD = link.exe LD = link.exe
PLATCFLAGS += -D_WIN32 -D__STDC_CONSTANT_MACROS -D_MBCS PLATCFLAGS += -D_WIN32 -D__STDC_CONSTANT_MACROS -D_MBCS
PLATCFLAGS += -D__i686__ -D__SSE__ -D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_WINDOWS -DHAVE_CC_RESAMPLER -DHAVE_GL_SYNC -DHAVE_GLSL -DHAVE_IMAGEVIEWER -DHAVE_LANGEXTRA -DHAVE_OPENGL -DHAVE_SHADERPIPELINE -DHAVE_UPDATE_ASSETS -DWIN32 PLATCFLAGS += -D__i686__ -D__SSE__ -D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_WINDOWS -DHAVE_CC_RESAMPLER -DHAVE_GL_SYNC -DHAVE_GLSL -DHAVE_IMAGEVIEWER -DHAVE_LANGEXTRA -DHAVE_OPENGL -DHAVE_SHADERPIPELINE -DHAVE_UPDATE_ASSETS -DWIN32 -DHAVE_EASTEREGG
LDFLAGS += shell32.lib user32.lib gdi32.lib comdlg32.lib winmm.lib ole32.lib iphlpapi.lib LDFLAGS += shell32.lib user32.lib gdi32.lib comdlg32.lib winmm.lib ole32.lib iphlpapi.lib
PlatformSuffix = $(subst windows_msvc2010_,,$(platform)) PlatformSuffix = $(subst windows_msvc2010_,,$(platform))
@ -524,6 +528,7 @@ else ifneq (,$(findstring windows_msvc2012,$(platform)))
HAVE_7ZIP := 1 HAVE_7ZIP := 1
HAVE_NETWORKING := 1 HAVE_NETWORKING := 1
HAVE_NETWORK_CMD := 1 HAVE_NETWORK_CMD := 1
HAVE_NETPLAYDISCOVERY := 1
HAVE_OVERLAY := 1 HAVE_OVERLAY := 1
HAVE_MATERIALUI := 1 HAVE_MATERIALUI := 1
HAVE_XMB := 1 HAVE_XMB := 1
@ -545,7 +550,7 @@ else ifneq (,$(findstring windows_msvc2012,$(platform)))
LD = link.exe LD = link.exe
PLATCFLAGS += -D_WIN32 -D__STDC_CONSTANT_MACROS -D_MBCS PLATCFLAGS += -D_WIN32 -D__STDC_CONSTANT_MACROS -D_MBCS
PLATCFLAGS += -D__i686__ -D__SSE__ -D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_WINDOWS -DHAVE_CC_RESAMPLER -DHAVE_GL_SYNC -DHAVE_GLSL -DHAVE_IMAGEVIEWER -DHAVE_LANGEXTRA -DHAVE_OPENGL -DHAVE_SHADERPIPELINE -DHAVE_UPDATE_ASSETS -DWIN32 PLATCFLAGS += -D__i686__ -D__SSE__ -D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_WINDOWS -DHAVE_CC_RESAMPLER -DHAVE_GL_SYNC -DHAVE_GLSL -DHAVE_IMAGEVIEWER -DHAVE_LANGEXTRA -DHAVE_OPENGL -DHAVE_SHADERPIPELINE -DHAVE_UPDATE_ASSETS -DWIN32 -DHAVE_EASTEREGG
LDFLAGS += shell32.lib user32.lib gdi32.lib comdlg32.lib winmm.lib ole32.lib iphlpapi.lib LDFLAGS += shell32.lib user32.lib gdi32.lib comdlg32.lib winmm.lib ole32.lib iphlpapi.lib
PlatformSuffix = $(subst windows_msvc2012_,,$(platform)) PlatformSuffix = $(subst windows_msvc2012_,,$(platform))
@ -598,6 +603,7 @@ else ifneq (,$(findstring windows_msvc2013,$(platform)))
HAVE_7ZIP := 1 HAVE_7ZIP := 1
HAVE_NETWORKING := 1 HAVE_NETWORKING := 1
HAVE_NETWORK_CMD := 1 HAVE_NETWORK_CMD := 1
HAVE_NETPLAYDISCOVERY := 1
HAVE_OVERLAY := 1 HAVE_OVERLAY := 1
HAVE_MATERIALUI := 1 HAVE_MATERIALUI := 1
HAVE_XMB := 1 HAVE_XMB := 1
@ -619,7 +625,7 @@ else ifneq (,$(findstring windows_msvc2013,$(platform)))
LD = link.exe LD = link.exe
PLATCFLAGS += -D_WIN32 -D__STDC_CONSTANT_MACROS -D_MBCS PLATCFLAGS += -D_WIN32 -D__STDC_CONSTANT_MACROS -D_MBCS
PLATCFLAGS += -D__i686__ -D__SSE__ -D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_WINDOWS -DHAVE_CC_RESAMPLER -DHAVE_GL_SYNC -DHAVE_GLSL -DHAVE_IMAGEVIEWER -DHAVE_LANGEXTRA -DHAVE_OPENGL -DHAVE_SHADERPIPELINE -DHAVE_UPDATE_ASSETS -DWIN32 PLATCFLAGS += -D__i686__ -D__SSE__ -D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_WINDOWS -DHAVE_CC_RESAMPLER -DHAVE_GL_SYNC -DHAVE_GLSL -DHAVE_IMAGEVIEWER -DHAVE_LANGEXTRA -DHAVE_OPENGL -DHAVE_SHADERPIPELINE -DHAVE_UPDATE_ASSETS -DWIN32 -DHAVE_EASTEREGG
LDFLAGS += shell32.lib user32.lib gdi32.lib comdlg32.lib winmm.lib ole32.lib iphlpapi.lib LDFLAGS += shell32.lib user32.lib gdi32.lib comdlg32.lib winmm.lib ole32.lib iphlpapi.lib
PlatformSuffix = $(subst windows_msvc2013_,,$(platform)) PlatformSuffix = $(subst windows_msvc2013_,,$(platform))
@ -672,6 +678,7 @@ else ifneq (,$(findstring windows_msvc2015,$(platform)))
HAVE_7ZIP := 1 HAVE_7ZIP := 1
HAVE_NETWORKING := 1 HAVE_NETWORKING := 1
HAVE_NETWORK_CMD := 1 HAVE_NETWORK_CMD := 1
HAVE_NETPLAYDISCOVERY := 1
HAVE_OVERLAY := 1 HAVE_OVERLAY := 1
HAVE_MATERIALUI := 1 HAVE_MATERIALUI := 1
HAVE_XMB := 1 HAVE_XMB := 1
@ -693,7 +700,7 @@ else ifneq (,$(findstring windows_msvc2015,$(platform)))
LD = link.exe LD = link.exe
PLATCFLAGS += -D_WIN32 -D__STDC_CONSTANT_MACROS -D_MBCS PLATCFLAGS += -D_WIN32 -D__STDC_CONSTANT_MACROS -D_MBCS
PLATCFLAGS += -D__i686__ -D__SSE__ -D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_WINDOWS -DHAVE_CC_RESAMPLER -DHAVE_GL_SYNC -DHAVE_GLSL -DHAVE_IMAGEVIEWER -DHAVE_LANGEXTRA -DHAVE_OPENGL -DHAVE_SHADERPIPELINE -DHAVE_UPDATE_ASSETS -DWIN32 PLATCFLAGS += -D__i686__ -D__SSE__ -D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_WINDOWS -DHAVE_CC_RESAMPLER -DHAVE_GL_SYNC -DHAVE_GLSL -DHAVE_IMAGEVIEWER -DHAVE_LANGEXTRA -DHAVE_OPENGL -DHAVE_SHADERPIPELINE -DHAVE_UPDATE_ASSETS -DWIN32 -DHAVE_EASTEREGG
LDFLAGS += shell32.lib user32.lib gdi32.lib comdlg32.lib winmm.lib ole32.lib iphlpapi.lib LDFLAGS += shell32.lib user32.lib gdi32.lib comdlg32.lib winmm.lib ole32.lib iphlpapi.lib
PlatformSuffix = $(subst windows_msvc2015_,,$(platform)) PlatformSuffix = $(subst windows_msvc2015_,,$(platform))
@ -857,6 +864,10 @@ ifeq ($(HAVE_NETWORKING), 1)
CFLAGS += -DHAVE_NETWORKING CFLAGS += -DHAVE_NETWORKING
endif endif
ifeq ($(HAVE_NETPLAYDISCOVERY), 1)
CFLAGS += -DHAVE_NETPLAYDISCOVERY
endif
ifeq ($(RARCH_CONSOLE), 1) ifeq ($(RARCH_CONSOLE), 1)
CFLAGS += -DRARCH_CONSOLE CFLAGS += -DRARCH_CONSOLE
endif endif
@ -1063,7 +1074,6 @@ overlays-checkout:
$(GIT) clone git://github.com/libretro/common-overlays.git $(OVERLAY_DIR); \ $(GIT) clone git://github.com/libretro/common-overlays.git $(OVERLAY_DIR); \
fi fi
clean: clean:
rm -f $(EXT_TARGET) rm -f $(EXT_TARGET)
rm -f $(EXT_INTER_TARGET) rm -f $(EXT_INTER_TARGET)

View File

@ -1,3 +1,5 @@
include version.all
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
.SUFFIXES: .SUFFIXES:
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
@ -20,7 +22,7 @@ OBJ :=
# For threading we need to overwrite some vars with global defines because devkitPro's includes # For threading we need to overwrite some vars with global defines because devkitPro's includes
# make it hard for us. This works for the pthread wrapper # make it hard for us. This works for the pthread wrapper
DEFINES_THREAD := -Dpthread_t=Thread -Dpthread_mutex_t=Mutex -Dpthread_mutexattr_t='void*' -Dpthread_attr_t=int -Dpthread_cond_t=CondVar -Dpthread_condattr_t='int' -D_SYS__PTHREADTYPES_H_ DEFINES_THREAD := -Dpthread_t=Thread -Dpthread_mutex_t=Mutex -Dpthread_mutexattr_t='void*' -Dpthread_attr_t=int -Dpthread_cond_t=CondVar -Dpthread_condattr_t='int' -D_SYS__PTHREADTYPES_H_
DEFINES := -U__linux__ -U__linux -DRARCH_INTERNAL -DGLOBAL_CONFIG_DIR='"/switch"' $(DEFINES_THREAD) DEFINES := -D__SWITCH__=1 -U__linux__ -U__linux -DGLM_FORCE_PURE=1 -DRARCH_CONSOLE -DRARCH_INTERNAL -DGLOBAL_CONFIG_DIR='"/switch"' $(DEFINES_THREAD) -DHAVE_STB_VORBIS
HAVE_CC_RESAMPLER = 1 HAVE_CC_RESAMPLER = 1
HAVE_MENU_COMMON = 1 HAVE_MENU_COMMON = 1
@ -28,30 +30,52 @@ HAVE_RTGA = 1
HAVE_RPNG = 1 HAVE_RPNG = 1
HAVE_RJPEG = 1 HAVE_RJPEG = 1
HAVE_RBMP = 1 HAVE_RBMP = 1
HAVE_RGUI = 1
HAVE_ZLIB = 1 HAVE_ZLIB = 1
HAVE_BUILTINZLIB = 1 HAVE_BUILTINZLIB = 1
HAVE_LIBRETRODB = 1 HAVE_LIBRETRODB = 1
HAVE_ZARCH = 0
HAVE_MATERIALUI = 0
HAVE_XMB = 0
HAVE_STATIC_VIDEO_FILTERS = 1 HAVE_STATIC_VIDEO_FILTERS = 1
HAVE_STATIC_AUDIO_FILTERS = 1 HAVE_STATIC_AUDIO_FILTERS = 1
HAVE_MENU = 1 HAVE_MENU = 1
HAVE_RUNAHEAD = 1 HAVE_RUNAHEAD = 1
HAVE_NETWORKING = 1
HAVE_NETPLAYDISCOVERY = 1
HAVE_STB_FONT = 1
HAVE_CHEEVOS = 1
HAVE_CHD = 1
HAVE_STB_VORBIS = 1
# RetroArch libnx useful flags # RetroArch libnx useful flags
HAVE_OVERLAY = 0
HAVE_THREADS = 1 HAVE_THREADS = 1
HAVE_PTHREADS = 1 HAVE_PTHREADS = 1
HAVE_FREETYPE = 0 HAVE_FREETYPE = 0
HAVE_SWITCH = 1 HAVE_SWITCH = 1
HAVE_LIBNX = 1 HAVE_LIBNX = 1
HAVE_OPENGL = 1
HAVE_LANGEXTRA = 1
ifeq ($(HAVE_OPENGL), 1)
HAVE_EGL = 1
HAVE_SHADERPIPELINE = 1
HAVE_RGUI = 1
HAVE_MATERIALUI = 1
HAVE_XMB = 1
HAVE_OZONE = 1
HAVE_OVERLAY = 1
else
HAVE_RGUI = 1
HAVE_ZARCH = 0
HAVE_MATERIALUI = 0
HAVE_XMB = 0
HAVE_OZONE = 0
HAVE_STRIPES = 0
endif
include Makefile.common include Makefile.common
BLACKLIST := BLACKLIST :=
#BLACKLIST += input/input_overlay.o
#BLACKLIST += tasks/task_overlay.o
OBJ := $(filter-out $(BLACKLIST),$(OBJ)) OBJ := $(filter-out $(BLACKLIST),$(OBJ))
@ -84,9 +108,9 @@ EXEFS_SRC := exefs_src
#ROMFS := switch/romfs #ROMFS := switch/romfs
APP_TITLE := RetroArch APP_TITLE := RetroArch
APP_VERSION := 1.0.0 APP_VERSION := $(RARCH_VERSION)
APP_AUTHOR := libretro Team APP_AUTHOR := libretro Team
NO_ICON := 1 APP_ICON := pkg/libnx/retroarch.jpg
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
# options for code generation # options for code generation
@ -94,16 +118,28 @@ NO_ICON := 1
ARCH := -march=armv8-a -mtune=cortex-a57 -mtp=soft -fPIE -mcpu=cortex-a57+crc+fp+simd ARCH := -march=armv8-a -mtune=cortex-a57 -mtp=soft -fPIE -mcpu=cortex-a57+crc+fp+simd
CFLAGS := -g -Wall -O3 -ffast-math -ffunction-sections \ CFLAGS := -g -Wall -O3 -ffast-math -ffunction-sections \
$(ARCH) $(DEFINES) -Ideps -Ideps/libz -Ilibretro-common/include -Ideps/stb -I$(LIBNX)/include -include $(LIBNX)/include/switch.h #$(shell $(DEVKITPRO)/portlibs/switch/bin/freetype-config --cflags) $(ARCH) $(DEFINES) -Ideps -Ideps/libz -Ilibretro-common/include -Ideps/stb -I$(LIBNX)/include -I$(PORTLIBS)/include/ -include $(LIBNX)/include/switch.h #$(shell $(PORTLIBS)/bin/freetype-config --cflags)
CFLAGS += $(INCLUDE) -DSWITCH=1 -DHAVE_LIBNX=1 -DNXLINK=1 CFLAGS += $(INCLUDE) -DSWITCH=1 -DHAVE_LIBNX=1 -DNXLINK=1 -DHAVE_SHADERPIPELINE -DHAVE_UPDATE_ASSETS -DHAVE_STB_FONT #-DHAVE_FREETYPE
ifeq ($(strip $(HAVE_STATIC_DUMMY)),1)
CFLAGS += -DHAVE_STATIC_DUMMY=1
endif
# The following line works around an issue in newlib that produces a compilation
# error in glm. It will be removed as soon as this issue is resolved.
CFLAGS += -D_GLIBCXX_USE_C99_MATH_TR1 -D_LDBL_EQ_DBL
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11
ASFLAGS := -g $(ARCH) ASFLAGS := -g $(ARCH)
LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs $(ARCH) -Wl,--allow-multiple-definition -Wl,-Map,$(notdir $*.map) LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs $(ARCH) -Wl,--allow-multiple-definition -Wl,-Map,$(notdir $*.map)
LIBS := -lnx -lm -lstdc++ -lbz2 -lpng -lz LIBS := -lstdc++ -lbz2 -lpng -lz -lnx -lm
ifeq ($(HAVE_OPENGL), 1)
LIBS := -lEGL -lglapi -ldrm_nouveau $(LIBS)
endif
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
# list of directories containing libraries, this must be the top level containing # list of directories containing libraries, this must be the top level containing
@ -145,7 +181,12 @@ else
endif endif
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
export OFILES := $(OBJ) libretro_switch.a export OFILES := $(OBJ)
ifeq ($(strip $(HAVE_STATIC_DUMMY)),)
OFILES += libretro_libnx.a
endif
export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES))) export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES)))
export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
@ -185,7 +226,8 @@ ifneq ($(ROMFS),)
export NROFLAGS += --romfsdir=$(CURDIR)/$(ROMFS) export NROFLAGS += --romfsdir=$(CURDIR)/$(ROMFS)
endif endif
DEPENDS := $(OFILES:.o=.d) DEPENDS_TMP := $(OFILES:.o=.d)
DEPENDS := $(filter-out libretro_libnx.a,$(DEPENDS_TMP))
.PHONY: clean all .PHONY: clean all
@ -207,7 +249,7 @@ endif
$(OUTPUT).elf : $(OBJ) $(OUTPUT).elf : $(OBJ)
clean: clean:
rm -f $(OBJ) $(OUTPUT).pfs0 $(OUTPUT).nro $(OUTPUT).elf rm -f $(DEPENDS) $(OBJ) $(OUTPUT).pfs0 $(OUTPUT).nro $(OUTPUT).elf
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
# you need a rule like this for each extension you use as binary data # you need a rule like this for each extension you use as binary data

View File

@ -45,7 +45,6 @@ export CXX := $(PREFIX)g++
export AR := $(PREFIX)ar export AR := $(PREFIX)ar
export OBJCOPY := $(PREFIX)objcopy export OBJCOPY := $(PREFIX)objcopy
ISVC=$(or $(VCBUILDHELPER_COMMAND),$(MSBUILDEXTENSIONSPATH32),$(MSBUILDEXTENSIONSPATH)) ISVC=$(or $(VCBUILDHELPER_COMMAND),$(MSBUILDEXTENSIONSPATH32),$(MSBUILDEXTENSIONSPATH))
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
@ -131,7 +130,6 @@ INCLUDES := $(DEFINCS) \
MACHDEP := -DBIGENDIAN -DGEKKO -mcpu=750 -meabi -msdata=eabi -mhard-float -ffunction-sections -fdata-sections MACHDEP := -DBIGENDIAN -DGEKKO -mcpu=750 -meabi -msdata=eabi -mhard-float -ffunction-sections -fdata-sections
ifeq ($(PLATFORM),wii) ifeq ($(PLATFORM),wii)
MACHDEP += -DHW_RVL MACHDEP += -DHW_RVL
endif endif
@ -159,7 +157,6 @@ VPATH := $(LWIPDIR) \
$(LIBWIIKEYB) \ $(LIBWIIKEYB) \
$(STUBSDIR) $(STUBSDIR)
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
SOURCES_LWIP := $(LWIPDIR)/network.c \ SOURCES_LWIP := $(LWIPDIR)/network.c \
$(LWIPDIR)/netio.c \ $(LWIPDIR)/netio.c \
@ -264,7 +261,6 @@ SOURCES_OGC_ASM := $(OGCDIR)/cache_asm.S \
$(OGCDIR)/system_asm.S \ $(OGCDIR)/system_asm.S \
$(OGCDIR)/video_asm.S $(OGCDIR)/video_asm.S
ifneq ($(BUILD_LITE), 1) ifneq ($(BUILD_LITE), 1)
SOURCES_OGC += $(OGCDIR)/dvd.c SOURCES_OGC += $(OGCDIR)/dvd.c
endif endif

View File

@ -7,7 +7,6 @@ ARCH = amd64
BUILD_DIR = objs/msvc BUILD_DIR = objs/msvc
CXX_BUILD = 0 CXX_BUILD = 0
WindowsSdkDir = C:\Program Files (x86)\Windows Kits\10\$(NOTHING) WindowsSdkDir = C:\Program Files (x86)\Windows Kits\10\$(NOTHING)
WindowsSDKVersion := 10.0.14393.0\$(NOTHING) WindowsSDKVersion := 10.0.14393.0\$(NOTHING)
VCINSTALLDIR := C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\$(NOTHING) VCINSTALLDIR := C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\$(NOTHING)
@ -30,6 +29,7 @@ HAVE_WINMM := 1
HAVE_RPNG := 1 HAVE_RPNG := 1
HAVE_ZLIB := 1 HAVE_ZLIB := 1
WANT_ZLIB := 1 WANT_ZLIB := 1
HAVE_MENU := 1
HAVE_RGUI := 1 HAVE_RGUI := 1
HAVE_XMB := 1 HAVE_XMB := 1
HAVE_MATERIALUI := 1 HAVE_MATERIALUI := 1
@ -59,7 +59,7 @@ HAVE_IMAGEVIEWER := 1
include Makefile.common include Makefile.common
INCLUDE_DIRS := $(patsubst -isystem%,-I%,$(INCLUDE_DIRS)) INCLUDE_DIRS := $(patsubst -isystem%,-I%,$(INCLUDE_DIRS))
CFLAGS := $(filter-out -Wno-unknown-pragmas,$(CFLAGS)) CFLAGS := $(filter-out -Wno-unknown-pragmas,$(DEF_FLAGS))
CXXFLAGS := $(filter-out -fpermissive -Wno-switch -Wno-sign-compare -fno-strict-aliasing -Wno-maybe-uninitialized -Wno-reorder -Wno-parentheses,$(CXXFLAGS)) CXXFLAGS := $(filter-out -fpermissive -Wno-switch -Wno-sign-compare -fno-strict-aliasing -Wno-maybe-uninitialized -Wno-reorder -Wno-parentheses,$(CXXFLAGS))
LIBS := $(filter-out -lstdc++,$(LIBS)) LIBS := $(filter-out -lstdc++,$(LIBS))
@ -90,14 +90,12 @@ ifeq ($(ARCH),x86)
CROSS = CROSS =
endif endif
INCLUDE := $(VCINSTALLDIR)include;$(VCINSTALLDIR)atlmfc\include;$(WindowsSdkDir)include\$(WindowsSDKVersion)ucrt;$(WindowsSdkDir)include\$(WindowsSDKVersion)shared;$(WindowsSdkDir)include\$(WindowsSDKVersion)um; INCLUDE := $(VCINSTALLDIR)include;$(VCINSTALLDIR)atlmfc\include;$(WindowsSdkDir)include\$(WindowsSDKVersion)ucrt;$(WindowsSdkDir)include\$(WindowsSDKVersion)shared;$(WindowsSdkDir)include\$(WindowsSDKVersion)um;
LIB := $(VCINSTALLDIR)LIB\$(CROSS);$(VCINSTALLDIR)atlmfc\lib\$(CROSS);$(WindowsSdkDir)lib\$(WindowsSDKVersion)ucrt\$(TARGET_ARCH2);$(WindowsSdkDir)lib\$(WindowsSDKVersion)um\$(TARGET_ARCH2);C:\Program Files (x86)\NVIDIA Corporation\Cg\lib.$(TARGET_ARCH2);C:\Program Files (x86)\Microsoft DirectX SDK (February 2010)\Lib\$(TARGET_ARCH2); LIB := $(VCINSTALLDIR)LIB\$(CROSS);$(VCINSTALLDIR)atlmfc\lib\$(CROSS);$(WindowsSdkDir)lib\$(WindowsSDKVersion)ucrt\$(TARGET_ARCH2);$(WindowsSdkDir)lib\$(WindowsSDKVersion)um\$(TARGET_ARCH2);C:\Program Files (x86)\NVIDIA Corporation\Cg\lib.$(TARGET_ARCH2);C:\Program Files (x86)\Microsoft DirectX SDK (February 2010)\Lib\$(TARGET_ARCH2);
LIBPATH := $(VCINSTALLDIR)LIB\$(CROSS);$(VCINSTALLDIR)atlmfc\lib\$(CROSS); LIBPATH := $(VCINSTALLDIR)LIB\$(CROSS);$(VCINSTALLDIR)atlmfc\lib\$(CROSS);
PATH := $(shell IFS=$$'\n'; cygpath "$(VCINSTALLDIR)bin\\$(CROSS)"):$(shell IFS=$$'\n'; cygpath "$(WindowsSdkDir)\bin\\$(ARCH2)"):$(PATH) PATH := $(shell IFS=$$'\n'; cygpath "$(VCINSTALLDIR)bin\\$(CROSS)"):$(shell IFS=$$'\n'; cygpath "$(WindowsSdkDir)\bin\\$(ARCH2)"):$(PATH)
export INCLUDE := $(INCLUDE) export INCLUDE := $(INCLUDE)
export LIB := $(LIB) export LIB := $(LIB)
export LIBPATH := $(LIBPATH) export LIBPATH := $(LIBPATH)
@ -144,7 +142,6 @@ RC = rc.exe
LIBS += shell32.lib user32.lib gdi32.lib comdlg32.lib winmm.lib ole32.lib LIBS += shell32.lib user32.lib gdi32.lib comdlg32.lib winmm.lib ole32.lib
LDFLAGS += -nologo -wx -nxcompat -machine:$(TARGET_ARCH2) LDFLAGS += -nologo -wx -nxcompat -machine:$(TARGET_ARCH2)
ifeq ($(DEBUG),1) ifeq ($(DEBUG),1)
FLAGS += -GS -Gy -Od -RTC1 -D_SECURE_SCL=1 -Zi FLAGS += -GS -Gy -Od -RTC1 -D_SECURE_SCL=1 -Zi
FLAGS += -MDd FLAGS += -MDd
@ -155,7 +152,6 @@ else
FLAGS += -MD FLAGS += -MD
endif endif
ifeq ($(DEBUG),1) ifeq ($(DEBUG),1)
BUILD_DIR := $(BUILD_DIR)-debug BUILD_DIR := $(BUILD_DIR)-debug
endif endif
@ -170,7 +166,6 @@ ifneq ($(V), 1)
Q := @ Q := @
endif endif
ifeq ($(GRIFFIN_BUILD), 1) ifeq ($(GRIFFIN_BUILD), 1)
OBJ := griffin/griffin.o griffin/griffin_cpp.o OBJ := griffin/griffin.o griffin/griffin_cpp.o
DEFINES += -DHAVE_GRIFFIN -DUSE_MATH_DEFINES DEFINES += -DHAVE_GRIFFIN -DUSE_MATH_DEFINES
@ -188,9 +183,6 @@ OBJ := $(patsubst %rarch.o,%rarch.res,$(OBJ))
OBJ := $(addprefix $(BUILD_DIR)/,$(OBJ)) OBJ := $(addprefix $(BUILD_DIR)/,$(OBJ))
OBJ := $(OBJ:.o=.obj) OBJ := $(OBJ:.o=.obj)
LDFLAGS += -WX -SUBSYSTEM:WINDOWS -ENTRY:mainCRTStartup LDFLAGS += -WX -SUBSYSTEM:WINDOWS -ENTRY:mainCRTStartup
DEFINES := $(patsubst -f%,,$(DEFINES)) DEFINES := $(patsubst -f%,,$(DEFINES))
@ -198,7 +190,6 @@ LDFLAGS := $(patsubst -l%,%.lib,$(LDFLAGS))
LIBS := $(filter-out -lm,$(LIBS)) LIBS := $(filter-out -lm,$(LIBS))
LIBS := $(patsubst -l%,%.lib,$(LIBS)) LIBS := $(patsubst -l%,%.lib,$(LIBS))
#$(info INCLUDE_DIRS : $(INCLUDE_DIRS)) #$(info INCLUDE_DIRS : $(INCLUDE_DIRS))
#$(info DEFINES : $(DEFINES)) #$(info DEFINES : $(DEFINES))
#$(info CFLAGS : $(CFLAGS)) #$(info CFLAGS : $(CFLAGS))

View File

@ -1,62 +0,0 @@
# Hakchi version added to ease confusion amongst Hakchi community due to messy past...
#
# Make sure you have readelf installed (sudo apt-get install readelf) to patch the binary
# Might not be needed for your build but it's a useful tool and for safety it should be
# run anyway to ensure the SDL2 link isn't broken...
HAKCHI_VER := Hakchi_Retroarch_Neo_v1_7_3b
HAKCHI_NAME := "Hakchi RetroArch 'Neo' v1.7.3b
MOD_CREATOR := TheOtherGuys
MOD_CATEGORY := RetroArch
HAKCHI_DIR := hakchi
TARGET := retroarch
GIT_COMMIT := $(shell echo "`git rev-parse --short HEAD``git diff-index --quiet HEAD -- || echo '-dirty'`")
all: $(TARGET)
retroarch:
readelf -v #Check if you have readelf installed... (sudo apt-get install readelf)
./configure --host=arm-linux-gnueabihf --disable-freetype --enable-opengles --enable-udev --enable-alsa --enable-neon --enable-floathard
make -f Makefile -j HAVE_HAKCHI=1
patchelf --replace-needed libSDL2-2.0.so.0 libSDL2.so retroarch #libSDL2-2.0.so.0 sym link doesn't exist on native build. Just patch the binary...
#/usr/bin/arm-linux-gnueabihf-strip retroarch
rm -f $(HAKCHI_DIR)/bin/retroarch
cp retroarch $(HAKCHI_DIR)/bin/retroarch
echo $$(echo "Built by: " $$USER @ $$(date) \\\\\\ Git Commit: $(GIT_COMMIT)) > $(HAKCHI_DIR)/etc/libretro/retroarch_version
cp $(HAKCHI_DIR)/readme.md $(HAKCHI_DIR)/readme_COPY.md
printf "%s\n" \
"---" \
"Name: $(HAKCHI_VER)" \
"Creator: $(MOD_CREATOR)" \
"Category: $(MOD_CATEGORY)" \
"Version: $(HAKCHI_VER)" \
"Built on: $(shell date)" \
"Git commit: $(GIT_COMMIT)" \
"---" > $(HAKCHI_DIR)/readme.md
cat $(HAKCHI_DIR)/readme_COPY.md >> $(HAKCHI_DIR)/readme.md
rm $(HAKCHI_DIR)/readme_COPY.md
@echo "** BUILDING HAKCHI $(HAKCHI_VER) HMOD PACKAGE **"
cd $(HAKCHI_DIR)/; tar -czvf "$(HAKCHI_VER).hmod" *
mv $(HAKCHI_DIR)/$(HAKCHI_VER).hmod .
@echo "** BUILT HAKCHI $(HAKCHI_VER) HMOD PACKAGE **"
clean:
rm -f *.o
rm -f audio/*.o
rm -f conf/*.o
rm -f gfx/*.o
rm -f gfx/drivers_font/*.o
rm -f gfx/drivers_font_renderer/*.o
rm -f gfx/drivers_context/*.o
rm -f gfx/py_state/*.o
rm -f compat/*.o
rm -f record/*.o
rm -f input/*.o
rm -f tools/*.o
rm -f $(BINDIR)/retroarch
rm -f $(BINDIR)/retroarch-joyconfig
rm -f $(PNDDIR)/readme.html
rm -f retroarch
rm -f $(HAKCHI_DIR)/bin/retroarch
rm -f $(HAKCHI_VER).hmod
rm -f $(HAKCHI_DIR)/etc/libretro/retroarch_version

167
Makefile.orbis Normal file
View File

@ -0,0 +1,167 @@
TARGET := retroarch_orbis
DEBUG ?= 0
GRIFFIN_BUILD = 0
WHOLE_ARCHIVE_LINK = 0
PS4_TITLE_ID := RETROARCH
PS4_TITLE_NAME := RetroArch
PC_DEVELOPMENT_IP_ADDRESS =
PC_DEVELOPMENT_UDP_PORT =
OBJ :=
DEFINES :=
ifeq ($(GRIFFIN_BUILD), 1)
OBJ += griffin/griffin.o
DEFINES += -DHAVE_GRIFFIN=1
DEFINES += -DHAVE_MENU -DHAVE_LIBRETRODB
DEFINES += -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DWANT_ZLIB -DHAVE_CC_RESAMPLER
ifeq ($(DEBUG), 1)
DEFINES += -DHAVE_NETLOGGER
endif
else
HAVE_FILTERS_BUILTIN := 1
HAVE_LANGEXTRA := 0
HAVE_RPNG := 1
HAVE_RJPEG := 1
HAVE_RBMP := 1
HAVE_RTGA := 1
HAVE_ZLIB := 1
HAVE_OVERLAY := 1
HAVE_7ZIP := 1
HAVE_EGL := 1
HAVE_OPENGLES := 1
HAVE_NETWORKING := 0
HAVE_SOCKET_LEGACY := 0
HAVE_MENU := 1
HAVE_MENU_COMMON := 1
HAVE_RGUI := 0
HAVE_MATERIALUI := 0
HAVE_XMB := 1
HAVE_ZARCH := 0
HAVE_THREADS := 1
HAVE_LIBRETRODB := 1
HAVE_CC_RESAMPLER := 1
HAVE_CHEEVOS := 1
RARCH_CONSOLE := 1
HAVE_STATIC_VIDEO_FILTERS = 1
HAVE_STATIC_AUDIO_FILTERS = 1
ifeq ($(DEBUG), 1)
HAVE_NETLOGGER = 1
endif
include Makefile.common
CFLAGS += $(DEF_FLAGS)
BLACKLIST :=
OBJ := $(filter-out $(BLACKLIST),$(OBJ))
OBJ += input/drivers/ps4_input.o
OBJ += input/drivers_joypad/ps4_joypad.o
OBJ += audio/drivers/psp_audio.o
#OBJ += frontend/drivers/platform_orbis.o
endif
ifeq ($(strip $(PS4SDK)),)
$(error "Please set PS4SDK in your environment. export PS4SDK=<path to>ps4sdk")
endif
export PATH := $(PATH):$(PS4SDK)/bin
PREFIX :=
CC := $(PREFIX)clang
CXX := $(PREFIX)clang
AS := $(PREFIX)clang
AR := $(PREFIX)ar
OBJCOPY := $(PREFIX)objcopy
STRIP := $(PREFIX)strip
NM := $(PREFIX)nm
LD := $(CXX)
INCDIRS := -I. -Ideps/libz -Ideps/7zip -Ilibretro-common/include -Ideps/stb
LIBDIRS := -L.
ARCHFLAGS := -m64 -DORBIS
CFLAGS += $(ARCHFLAGS) -std=c11 -mcmodel=large -ffreestanding -nostdlib -nostdinc -fno-builtin -fno-stack-protector
ifeq ($(DEBUG), 1)
CFLAGS += -O2 -g
else
CFLAGS += -O3
endif
ASFLAGS := $(ARCHFLAGS) -I$(PS4SDK)/include -target x86_64-scei-ps4-elf -fPIE
LDFLAGS := -O3 -Wall -m64 -nostartfiles -nostdlib -L$(PS4SDK)/lib -pie
ARFLAGS := rcs
CRTFILE ?= $(PS4SDK)/crt0.s
CFLAGS += -Wall -pedantic -Wno-zero-length-array -Wno-format-pedantic
CFLAGS += -D__PS4__ -I$(PS4SDK)/include -I $(PS4SDK)/include/sce
CFLAGS += -target x86_64-scei-ps4-elf -fPIE
CFLAGS += -DRARCH_INTERNAL -DRARCH_CONSOLE
CFLAGS += -DHAVE_FILTERS_BUILTIN $(DEFINES)
ifneq ($(PC_DEVELOPMENT_IP_ADDRESS),)
CFLAGS += -DPC_DEVELOPMENT_IP_ADDRESS='"$(PC_DEVELOPMENT_IP_ADDRESS)"'
endif
ifneq ($(PC_DEVELOPMENT_UDP_PORT),)
CFLAGS += -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT)
endif
ifeq ($(WHOLE_ARCHIVE_LINK), 1)
WHOLE_START := -Wl,--whole-archive
WHOLE_END := -Wl,--no-whole-archive
endif
CXXFLAGS := $(CFLAGS)
PS4_LIBS := -lps4link -ldebugnet -lorbisFile -lelfloader -lorbisKeyboard -lorbis2d -lpng -lz -lorbisGl -lorbisPad -lorbisAudio -lmod -lorbisFileBrowser -lorbisXbmFont -lSceNet_stub -lScePigletv2VSH_stub -lSceSystemService_stub -lSceUserService_stub -lScePad_stub -lSceAudioOut_stub -lSceIme_stub -lSceSysmodule_stub \
-lPs4_extension_kernel_call_standard -lPs4_extension_kernel_execute_dynlib_prepare_dlclose -lPs4_common_kernel -lPs4_common_user -lPs4_common_generic -lPs4LibCInternalAdaptive_stub -lPs4LibKernelAdaptive_stub -lSceLibcInternal_stub -lkernel_stub -lps4Kernel_stub -lPs4_base_stub_resolve_minimal -lPs4_base_kernel_dlsym_standard -lPs4_base_kernel_seek_elf_address_standard -lPs4_base_assembler_register_parameter_standard -lPs4_base_assembler_system_call_standard
LIBS := $(WHOLE_START) -lretro_orbis $(WHOLE_END) $(PS4_LIBS)
TARGETS := $(TARGET).elf
DEPFLAGS = -MT $@ -MMD -MP -MF $*.Tdepend
POSTCOMPILE = mv -f $*.Tdepend $*.depend
all: $(TARGETS)
%.o: %.cpp
%.o: %.cpp %.depend
$(CXX) -c -o $@ $< $(CXXFLAGS) $(INCDIRS) $(DEPFLAGS)
$(POSTCOMPILE)
%.o: %.c
%.o: %.c %.depend
$(CC) -c -o $@ $< $(CFLAGS) $(INCDIRS) $(DEPFLAGS)
$(POSTCOMPILE)
%.o: %.S
%.o: %.S %.depend
$(CC) -c -o $@ $< $(ASFLAGS) $(INCDIRS) $(DEPFLAGS)
$(POSTCOMPILE)
%.o: %.s
%.o: %.s %.depend
$(CC) -c -o $@ $< $(ASFLAGS) $(INCDIRS) $(DEPFLAGS)
$(POSTCOMPILE)
%.depend: ;
$(TARGET).elf: $(OBJ) libretro_orbis.a
$(LD) $(CRTFILE) $(OBJ) $(LDFLAGS) $(LIBDIRS) $(LIBS) -o $@
clean:
rm -f $(OBJ) $(TARGET).elf
rm -f $(OBJ:.o=.depend)
.PHONY: clean all
.PRECIOUS: %.depend
-include $(OBJ:.o=.depend)

View File

@ -52,4 +52,3 @@ clean:
rm -f $(BINDIR)/retroarch-joyconfig rm -f $(BINDIR)/retroarch-joyconfig
rm -f $(PNDDIR)/readme.html rm -f $(PNDDIR)/readme.html
rm -f retroarch rm -f retroarch

114
Makefile.ps2 Normal file
View File

@ -0,0 +1,114 @@
BUILD_PRX = 0
DEBUG = 0
HAVE_KERNEL_PRX = 0
HAVE_LOGGER = 0
HAVE_FILE_LOGGER = 0
HAVE_THREADS = 0
BIG_STACK = 0
MUTE_WARNINGS = 0
PS2_IP = 192.168.1.150
#Configuration for IRX
EE_BIN2O = bin2o
IRX_DIR = $(PS2SDK)/iop/irx
TARGET = retroarchps2.elf
TARGET_RELEASE = retroarchps2-release.elf
ifeq ($(DEBUG), 1)
OPTIMIZE_LV := -O0 -g
RARCH_DEFINES += -DDEBUG
else
OPTIMIZE_LV := -O2
LDFLAGS := -s
endif
ifeq ($(MUTE_WARNINGS), 1)
DISABLE_WARNINGS := -Wno-sign-compare -Wno-unused -Wno-parentheses
endif
INCDIR = -I$(PS2DEV)/gsKit/include -I$(PS2SDK)/ports/include
INCDIR += -Ips2 -Ips2/include -Ilibretro-common/include
INCDIR += -Ideps -Ideps/stb -Ideps/libz -Ideps/7zip -Ideps/pthreads -Ideps/pthreads/platform/ps2 -Ideps/pthreads/platform/helper
GPVAL = -G0
CFLAGS = $(OPTIMIZE_LV) $(DISABLE_WARNINGS) -ffast-math -fsingle-precision-constant
ASFLAGS = $(CFLAGS)
RARCH_DEFINES += -DPS2 -DUSE_IOP_CTYPE_MACRO -D_MIPS_ARCH_R5900 -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DWANT_ZLIB
RARCH_DEFINES += -DHAVE_GRIFFIN=1 -DRARCH_INTERNAL -DRARCH_CONSOLE -DHAVE_MENU -DHAVE_RGUI -DHAVE_FILTERS_BUILTIN -DHAVE_7ZIP -DHAVE_CC_RESAMPLER
LIBDIR =
LDFLAGS += -L$(PS2SDK)/ports/lib -L$(PS2DEV)/gsKit/lib -L$(PS2SDK)/ee/lib -L.
LIBS += -lretro_ps2 -lgskit -ldmakit -lgskit_toolkit -laudsrv -lpad -lmc -lhdd -lsdl -lfileXio -lpatches -lpoweroff
#IRX modules
# IRX modules - modules have to be in IRX_DIR
IRX = iomanX.irx fileXio.irx mcman.irx mcserv.irx usbd.irx usbhdfsd.irx freesd.irx audsrv.irx poweroff.irx ps2dev9.irx ps2atad.irx ps2hdd.irx ps2fs.irx
IRX_OBJ = $(IRX:.irx=.o)
EE_OBJS += $(IRX_OBJ)
ifeq ($(HAVE_THREADS), 1)
RARCH_DEFINES += -DHAVE_THREADS
endif
ifeq ($(HAVE_FILE_LOGGER), 1)
CFLAGS += -DHAVE_FILE_LOGGER
endif
ifeq ($(HAVE_KERNEL_PRX), 1)
CFLAGS += -DHAVE_KERNEL_PRX
endif
ifeq ($(BIG_STACK), 1)
CFLAGS += -DBIG_STACK
endif
CFLAGS += $(RARCH_DEFINES)
# Missing objecst on the PS2SDK
EE_OBJS += ps2/compat_files/compat_ctype.o ps2/compat_files/time.o
#EE_OBJS = griffin/griffin.o bootstrap/ps2/kernel_functions.o
EE_OBJS += griffin/griffin.o
EE_CFLAGS = $(CFLAGS)
EE_CXXFLAGS = $(CFLAGS)
EE_LDFLAGS = $(LDFLAGS)
EE_LIBS = $(LIBS)
EE_ASFLAGS = $(ASFLAGS)
EE_INCS = $(INCDIR)
EE_IRX_OBJ = $(IRX_OBJ)
EE_BIN = $(TARGET)
EE_GPVAL = $(GPVAL)
all: $(EE_IRX_OBJ) $(EE_BIN)
clean:
rm -f $(EE_BIN) $(EE_OBJS)
prepare:
ps2client -h $(PS2_IP) reset
ps2client -h $(PS2_IP) netdump
run:
ps2client -h $(PS2_IP) execee host:$(EE_BIN)
debug: clean prepare all run
package:
ps2-packer $(EE_BIN) $(TARGET_RELEASE)
release: clean all package
#Specific file name and output per IRX Module
$(EE_IRX_OBJ):
$(EE_BIN2O) $(EE_GPVAL) $(IRX_DIR)/$(@:.o=.irx) $@ $(@:.o=_irx)
#Include preferences
include $(PS2SDK)/samples/Makefile.pref
include $(PS2SDK)/samples/Makefile.eeglobal
#Linking with C++
$(EE_BIN): $(EE_OBJS) $(PS2SDK)/ee/startup/crt0.o
$(EE_CXX) $(EE_NO_CRT) -T$(PS2SDK)/ee/startup/linkfile $(EE_CXXFLAGS) \
-o $(EE_BIN) $(PS2SDK)/ee/startup/crt0.o $(CRTI_OBJ) $(CRTBEGIN_OBJ) $(EE_OBJS) $(CRTEND_OBJ) $(CRTN_OBJ) $(EE_LDFLAGS) $(EE_LIBS)

View File

@ -112,7 +112,7 @@ PPU_LDLIBS = $(FONT_LIBS) $(GL_LIBS) $(WHOLE_START) -lretro_ps3 $(WHOLE_END) -l
PPU_RANLIB = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-ranlib.exe PPU_RANLIB = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-ranlib.exe
DEFINES += -DHAVE_THREADS -DRARCH_CONSOLE -DHAVE_OPENGL -DHAVE_HEADSET -DHAVE_LANGEXTRA -DHAVE_OPENGLES -DHAVE_OPENGLES1 -DHAVE_PSGL -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_RSOUND -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DHAVE_7Z -DWANT_ZLIB -D__CELLOS_LV2__ -DHAVE_NETWORKING=1 -DHAVE_SOCKET_LEGACY=1 -DHAVE_MOUSE -DHAVE_GRIFFIN=1 -DHAVE_MULTIMAN=1 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) -DHAVE_FILTERS_BUILTIN -DHAVE_CHEEVOS DEFINES += -DHAVE_THREADS -DRARCH_CONSOLE -DHAVE_OPENGL -DHAVE_HEADSET -DHAVE_LANGEXTRA -DHAVE_OPENGLES -DHAVE_OPENGLES1 -DHAVE_PSGL -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_RSOUND -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DHAVE_7Z -DWANT_ZLIB -D__CELLOS_LV2__ -DHAVE_NETWORKING=1 -DHAVE_SOCKET_LEGACY=1 -DHAVE_MOUSE -DHAVE_GRIFFIN=1 -DHAVE_MULTIMAN=1 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) -DHAVE_FILTERS_BUILTIN -DHAVE_CHEEVOS -DRC_DISABLE_LUA
#DEFINES += -DHAVE_IMAGEVIEWER #DEFINES += -DHAVE_IMAGEVIEWER

View File

@ -55,6 +55,7 @@ PPU_SRCS = frontend/frontend_salamander.c \
libretro-common/encodings/encoding_utf.c \ libretro-common/encodings/encoding_utf.c \
libretro-common/compat/compat_strl.c \ libretro-common/compat/compat_strl.c \
libretro-common/compat/compat_strcasestr.c \ libretro-common/compat/compat_strcasestr.c \
libretro-common/compat/fopen_utf8.c \
libretro-common/streams/file_stream.c \ libretro-common/streams/file_stream.c \
libretro-common/vfs/vfs_implementation.c \ libretro-common/vfs/vfs_implementation.c \
libretro-common/file/config_file.c \ libretro-common/file/config_file.c \

View File

@ -128,4 +128,3 @@ clean:
rm -f $(OBJ) rm -f $(OBJ)
.PHONY: clean .PHONY: clean

View File

@ -49,7 +49,6 @@ endif
CFLAGS += $(RARCH_DEFINES) CFLAGS += $(RARCH_DEFINES)
EXTRA_TARGETS = EBOOT.PBP EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = RetroArch PSP1 PSP_EBOOT_TITLE = RetroArch PSP1

View File

@ -42,6 +42,7 @@ OBJS = frontend/frontend_salamander.o \
libretro-common/lists/dir_list.o \ libretro-common/lists/dir_list.o \
libretro-common/file/retro_dirent.o \ libretro-common/file/retro_dirent.o \
libretro-common/encodings/encoding_utf.o \ libretro-common/encodings/encoding_utf.o \
libretro-common/compat/fopen_utf8.o \
libretro-common/compat/compat_strl.o \ libretro-common/compat/compat_strl.o \
libretro-common/compat/compat_strcasestr.o \ libretro-common/compat/compat_strcasestr.o \
libretro-common/file/config_file.o \ libretro-common/file/config_file.o \

View File

@ -34,13 +34,13 @@ else
HAVE_DYNAMIC = 1 HAVE_DYNAMIC = 1
include Makefile.common include Makefile.common
CFLAGS += $(DEF_FLAGS)
BLACKLIST := BLACKLIST :=
BLACKLIST += input/input_overlay.o BLACKLIST += input/input_overlay.o
BLACKLIST += tasks/task_overlay.o BLACKLIST += tasks/task_overlay.o
OBJ := $(filter-out $(BLACKLIST),$(OBJ)) OBJ := $(filter-out $(BLACKLIST),$(OBJ))
endif endif
ifeq ($(strip $(LIBTRANSISTOR_HOME)),) ifeq ($(strip $(LIBTRANSISTOR_HOME)),)
$(error "Please set LIBTRANSISTOR_HOME in your environment. export LIBTRANSISTOR_HOME=<path/to/libtransistor/dist/>") $(error "Please set LIBTRANSISTOR_HOME in your environment. export LIBTRANSISTOR_HOME=<path/to/libtransistor/dist/>")
endif endif

View File

@ -55,6 +55,7 @@ else
endif endif
include Makefile.common include Makefile.common
CFLAGS += $(DEF_FLAGS)
BLACKLIST := BLACKLIST :=
OBJ := $(filter-out $(BLACKLIST),$(OBJ)) OBJ := $(filter-out $(BLACKLIST),$(OBJ))
@ -64,7 +65,6 @@ else
OBJ += frontend/drivers/platform_psp.o OBJ += frontend/drivers/platform_psp.o
endif endif
ifeq ($(strip $(VITASDK)),) ifeq ($(strip $(VITASDK)),)
$(error "Please set VITASDK in your environment. export VITASDK=<path to>vitasdk") $(error "Please set VITASDK in your environment. export VITASDK=<path to>vitasdk")
endif endif
@ -127,7 +127,6 @@ TARGETS := $(TARGET).vpk
DEPFLAGS = -MT $@ -MMD -MP -MF $*.Tdepend DEPFLAGS = -MT $@ -MMD -MP -MF $*.Tdepend
POSTCOMPILE = mv -f $*.Tdepend $*.depend POSTCOMPILE = mv -f $*.Tdepend $*.depend
all: $(TARGETS) all: $(TARGETS)
%.o: %.cpp %.o: %.cpp
@ -140,7 +139,6 @@ all: $(TARGETS)
$(CC) -c -o $@ $< $(CFLAGS) $(INCDIRS) $(DEPFLAGS) $(CC) -c -o $@ $< $(CFLAGS) $(INCDIRS) $(DEPFLAGS)
$(POSTCOMPILE) $(POSTCOMPILE)
%.o: %.S %.o: %.S
%.o: %.S %.depend %.o: %.S %.depend
$(CC) -c -o $@ $< $(ASFLAGS) $(INCDIRS) $(DEPFLAGS) $(CC) -c -o $@ $< $(ASFLAGS) $(INCDIRS) $(DEPFLAGS)

View File

@ -44,6 +44,7 @@ OBJS = frontend/frontend_salamander.o \
libretro-common/encodings/encoding_utf.o \ libretro-common/encodings/encoding_utf.o \
libretro-common/compat/compat_strl.o \ libretro-common/compat/compat_strl.o \
libretro-common/compat/compat_strcasestr.o \ libretro-common/compat/compat_strcasestr.o \
libretro-common/compat/fopen_utf8.o \
libretro-common/file/config_file.o \ libretro-common/file/config_file.o \
libretro-common/streams/file_stream.o \ libretro-common/streams/file_stream.o \
libretro-common/vfs/vfs_implementation.o \ libretro-common/vfs/vfs_implementation.o \

View File

@ -42,12 +42,13 @@ endif
MACHDEP := -DGEKKO -DHW_RVL -mrvl -mcpu=750 -meabi -mhard-float MACHDEP := -DGEKKO -DHW_RVL -mrvl -mcpu=750 -meabi -mhard-float
CFLAGS += -Wall -std=gnu99 $(MACHDEP) $(INCLUDE) CFLAGS += -Wall -std=gnu99 $(MACHDEP) $(INCLUDE)
LDFLAGS := $(MACHDEP) -Wl,-Map,$(notdir $(ELF_TARGET)).map LDFLAGS := $(MACHDEP) -Wl,-Map,$(notdir $(ELF_TARGET)).map
LIBS := -lwiiuse -logc -lbte
ifeq ($(EXTERNAL_LIBOGC), 1) ifeq ($(EXTERNAL_LIBOGC), 1)
LIBS += -lfat LIBS := -lfat
endif endif
LIBS += -lwiiuse -logc -lbte
APP_BOOTER_DIR = wii/app_booter APP_BOOTER_DIR = wii/app_booter
OBJ = frontend/frontend_salamander.o \ OBJ = frontend/frontend_salamander.o \
@ -66,6 +67,7 @@ OBJ = frontend/frontend_salamander.o \
libretro-common/encodings/encoding_utf.o \ libretro-common/encodings/encoding_utf.o \
libretro-common/compat/compat_strl.o \ libretro-common/compat/compat_strl.o \
libretro-common/compat/compat_strcasestr.o \ libretro-common/compat/compat_strcasestr.o \
libretro-common/compat/fopen_utf8.o \
libretro-common/file/config_file.o \ libretro-common/file/config_file.o \
file_path_str.o \ file_path_str.o \
verbosity.o \ verbosity.o \

View File

@ -64,6 +64,7 @@ ifeq ($(SALAMANDER_BUILD),1)
OBJ += frontend/drivers/platform_null.o OBJ += frontend/drivers/platform_null.o
OBJ += libretro-common/encodings/encoding_utf.o OBJ += libretro-common/encodings/encoding_utf.o
OBJ += libretro-common/compat/compat_strcasestr.o OBJ += libretro-common/compat/compat_strcasestr.o
OBJ += libretro-common/compat/fopen_utf8.o
OBJ += libretro-common/file/file_path.o OBJ += libretro-common/file/file_path.o
OBJ += libretro-common/string/stdstring.o OBJ += libretro-common/string/stdstring.o
OBJ += libretro-common/lists/string_list.o OBJ += libretro-common/lists/string_list.o
@ -105,7 +106,7 @@ endif
OBJ += griffin/griffin.o OBJ += griffin/griffin.o
DEFINES += -DHAVE_GRIFFIN=1 -DHAVE_MENU -DHAVE_RGUI -DHAVE_LIBRETRODB DEFINES += -DHAVE_GRIFFIN=1 -DHAVE_MENU -DHAVE_RGUI -DHAVE_LIBRETRODB
DEFINES += -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DWANT_ZLIB -DHAVE_CC_RESAMPLER DEFINES += -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DWANT_ZLIB -DHAVE_CC_RESAMPLER
DEFINES += -DHAVE_STB_FONT -DHAVE_STB_VORBIS -DHAVE_LANGEXTRA -DHAVE_LIBRETRODB -DHAVE_NETWORKING DEFINES += -DHAVE_STB_FONT -DHAVE_STB_VORBIS -DHAVE_LANGEXTRA -DHAVE_LIBRETRODB -DHAVE_NETWORKING -DHAVE_NETPLAYDISCOVERY
# DEFINES += -DWANT_IFADDRS # DEFINES += -DWANT_IFADDRS
# DEFINES += -DHAVE_FREETYPE # DEFINES += -DHAVE_FREETYPE
DEFINES += -DHAVE_XMB -DHAVE_MATERIALUI DEFINES += -DHAVE_XMB -DHAVE_MATERIALUI
@ -115,6 +116,7 @@ endif
HAVE_RPNG = 1 HAVE_RPNG = 1
HAVE_RJPEG = 1 HAVE_RJPEG = 1
HAVE_RBMP = 1 HAVE_RBMP = 1
HAVE_MENU = 1
HAVE_RGUI = 1 HAVE_RGUI = 1
HAVE_ZLIB = 1 HAVE_ZLIB = 1
HAVE_7ZIP = 1 HAVE_7ZIP = 1
@ -128,6 +130,7 @@ endif
HAVE_LANGEXTRA = 1 HAVE_LANGEXTRA = 1
HAVE_LIBRETRODB = 1 HAVE_LIBRETRODB = 1
HAVE_NETWORKING = 1 HAVE_NETWORKING = 1
HAVE_NETPLAYDISCOVERY = 1
HAVE_CHEEVOS = 1 HAVE_CHEEVOS = 1
# WANT_IFADDRS = 1 # WANT_IFADDRS = 1
HAVE_OVERLAY = 1 HAVE_OVERLAY = 1
@ -137,8 +140,6 @@ endif
WANT_IOSUHAX = 1 WANT_IOSUHAX = 1
include Makefile.common include Makefile.common
BLACKLIST := $(LIBRETRO_COMM_DIR)/net/net_ifinfo.o
OBJ := $(filter-out $(BLACKLIST),$(OBJ))
OBJ += gfx/drivers/gx2_gfx.o OBJ += gfx/drivers/gx2_gfx.o
OBJ += gfx/drivers_font/wiiu_font.o OBJ += gfx/drivers_font/wiiu_font.o
@ -242,7 +243,6 @@ ifneq ($(WANT_IOSUHAX), 1)
LIBS += -liosuhax LIBS += -liosuhax
endif endif
RPX_OBJ = $(BUILD_DIR)/wiiu/system/stubs_rpl.o RPX_OBJ = $(BUILD_DIR)/wiiu/system/stubs_rpl.o
HBL_ELF_OBJ = $(BUILD_DIR)/wiiu/system/dynamic.o $(BUILD_DIR)/wiiu/system/stubs_elf.o HBL_ELF_OBJ = $(BUILD_DIR)/wiiu/system/dynamic.o $(BUILD_DIR)/wiiu/system/stubs_elf.o
@ -264,13 +264,11 @@ endif
DEPFLAGS = -MT $@ -MMD -MP -MF $(BUILD_DIR)/$*.depend DEPFLAGS = -MT $@ -MMD -MP -MF $(BUILD_DIR)/$*.depend
all: $(TARGETS) all: $(TARGETS)
%: $(BUILD_DIR)/% %: $(BUILD_DIR)/%
cp $< $@ cp $< $@
$(BUILD_DIR)/%.o: %.cpp %.depend $(BUILD_DIR)/%.o: %.cpp %.depend
@$(if $(Q), echo CXX $<,) @$(if $(Q), echo CXX $<,)
@mkdir -p $(dir $@) @mkdir -p $(dir $@)

View File

@ -8,9 +8,11 @@ HAVE_OPENGL = 1
HAVE_DYLIB = 1 HAVE_DYLIB = 1
HAVE_D3D9 = 1 HAVE_D3D9 = 1
HAVE_NETWORKING = 1 HAVE_NETWORKING = 1
HAVE_NETPLAYDISCOVERY = 1
HAVE_STDIN_CMD = 1 HAVE_STDIN_CMD = 1
HAVE_COMMAND = 1 HAVE_COMMAND = 1
HAVE_THREADS = 1 HAVE_THREADS = 1
HAVE_MENU = 1
HAVE_RGUI = 1 HAVE_RGUI = 1
HAVE_MATERIALUI = 1 HAVE_MATERIALUI = 1
HAVE_7ZIP = 1 HAVE_7ZIP = 1
@ -101,7 +103,6 @@ else
WINDRES = windres WINDRES = windres
endif endif
libretro ?= -lretro libretro ?= -lretro
ifeq ($(DYNAMIC), 1) ifeq ($(DYNAMIC), 1)
@ -122,7 +123,7 @@ else
CXXFLAGS += -O3 -ffast-math CXXFLAGS += -O3 -ffast-math
endif endif
CFLAGS += -Wall -Wno-unused-result -Wno-unused-variable -I. -Ideps CFLAGS += $(DEF_FLAGS) -Wall -Wno-unused-result -Wno-unused-variable -I. -Ideps
CXXFLAGS += -Wall -Wno-unused-result -Wno-unused-variable -I. -Ideps -std=c++98 -D__STDC_CONSTANT_MACROS CXXFLAGS += -Wall -Wno-unused-result -Wno-unused-variable -I. -Ideps -std=c++98 -D__STDC_CONSTANT_MACROS
ifeq ($(CXX_BUILD), 1) ifeq ($(CXX_BUILD), 1)
CFLAGS += -std=c++98 -xc++ -D__STDC_CONSTANT_MACROS CFLAGS += -std=c++98 -xc++ -D__STDC_CONSTANT_MACROS
@ -171,4 +172,3 @@ clean:
rm -f *.d rm -f *.d
.PHONY: all install uninstall clean .PHONY: all install uninstall clean

View File

@ -189,46 +189,46 @@ The default super resolution is 2560. It is displayed just under the CRT switch
If native resolutions are activated you will need a whole new set of modelines: If native resolutions are activated you will need a whole new set of modelines:
- 512 x 240 @ 50.006977 SNESpal - 256 x 240 @ 50.006977 SNESpal
- 256 x 448 @ 50.006977 SNESpal
- 512 x 224 @ 50.006977 SNESpal - 512 x 224 @ 50.006977 SNESpal
- 512 x 240 @ 50.006977 SNESpal
- 512 x 448 @ 50.006977 SNESpal - 512 x 448 @ 50.006977 SNESpal
- 256 x 240 @ 60.098812 SNESntsc
- 256 x 448 @ 60.098812 SNESntsc
- 512 x 240 @ 60.098812 SNESntsc - 512 x 240 @ 60.098812 SNESntsc
- 512 x 224 @ 60.098812 SNESntsc - 512 x 224 @ 60.098812 SNESntsc
- 512 x 448 @ 60.098812 SNESntsc - 512 x 448 @ 60.098812 SNESntsc
- 256 x 240 @ 50.006977 SNESpal
- 256 x 448 @ 50.006977 SNESpal
- 256 x 240 @ 60.098812 SNESntsc
- 256 x 448 @ 60.098812 SNESntsc
- 320 x 240 @ 59.922745 MDntsc
- 320 x 448 @ 59.922745 MDntp
- 320 x 480 @ 59.922745 MDntsc
- 256 x 192 @ 59.922745 MDntsc - 256 x 192 @ 59.922745 MDntsc
- 320 x 224 @ 59.922745 MDntsc
- 256 x 224 @ 59.922745 MDntsc - 256 x 224 @ 59.922745 MDntsc
- 320 x 288 @ 49.701458 MDpal - 320 x 224 @ 59.922745 MDntsc
- 320 x 576 @ 49.701458 MDpal - 320 x 240 @ 59.922745 MDntsc
- 320 x 448 @ 59.922745 MDntsc
- 320 x 480 @ 59.922745 MDntsc
- 256 x 192 @ 49.701458 MDpal - 256 x 192 @ 49.701458 MDpal
- 256 x 224 @ 49.701458 MDpal
- 320 x 224 @ 49.701458 MDpal - 320 x 224 @ 49.701458 MDpal
- 320 x 240 @ 49.701458 MDpal - 320 x 240 @ 49.701458 MDpal
- 320 x 288 @ 49.701458 MDpal
- 320 x 448 @ 49.701458 MDpal - 320 x 448 @ 49.701458 MDpal
- 320 x 480 @ 49.701458 MDpal - 320 x 480 @ 49.701458 MDpal
- 256 x 224 @ 49.701458 MDpal - 320 x 576 @ 49.701458 MDpal
- 256 x 288 @ 49.701458 MSYSpal - 256 x 288 @ 49.701458 MSYSpal
- 256 x 240 @ 60.098812 NESntsc - 256 x 240 @ 60.098812 NESntsc
- 256 x 240 @ 50.006977 NESpal - 256 x 240 @ 50.006977 NESpal
- 640 x 480 @ 60.130001 N64ntsc
- 640 x 237 @ 60.130001 N64ntsc - 640 x 237 @ 60.130001 N64ntsc
- 640 x 240 @ 60.130001 N64ntsc - 640 x 240 @ 60.130001 N64ntsc
- 640 x 480 @ 60.130001 N64ntsc
- 640 x 288 @ 50.000000 N64pal
- 640 x 480 @ 50.000000 N64pal - 640 x 480 @ 50.000000 N64pal
- 640 x 576 @ 50.000000 n64pal - 640 x 576 @ 50.000000 N64pal
- 640 x 288 @ 50.000000 n64pal
- 256 x 252 @ 49.759998 PSXpal - 256 x 252 @ 49.759998 PSXpal
- 384 x 252 @ 49.759998 PSXpal
- 640 x 540 @ 49.759998 PSXpal
- 320 x 252 @ 49.759998 PSXpal - 320 x 252 @ 49.759998 PSXpal
- 384 x 252 @ 49.759998 PSXpal
- 640 x 252 @ 49.759998 PSXpal - 640 x 252 @ 49.759998 PSXpal
- 640 x 540 @ 49.759998 PSXpal
- 384 x 240 @ 59.941002 PSXntsc - 384 x 240 @ 59.941002 PSXntsc
- 256 x 480 @ 59.941002 PSXntsc - 256 x 480 @ 59.941002 PSXntsc

View File

@ -25,6 +25,7 @@
#include <file/file_path.h> #include <file/file_path.h>
#include <lists/dir_list.h> #include <lists/dir_list.h>
#include <string/stdstring.h> #include <string/stdstring.h>
#include <streams/file_stream.h>
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
#include "../config.h" #include "../config.h"
@ -35,6 +36,7 @@
#include "../gfx/video_driver.h" #include "../gfx/video_driver.h"
#include "../record/record_driver.h" #include "../record/record_driver.h"
#include "../frontend/frontend_driver.h" #include "../frontend/frontend_driver.h"
#include "../tasks/tasks_internal.h"
#include "../command.h" #include "../command.h"
#include "../driver.h" #include "../driver.h"
@ -42,9 +44,17 @@
#include "../retroarch.h" #include "../retroarch.h"
#include "../verbosity.h" #include "../verbosity.h"
#include "../list_special.h" #include "../list_special.h"
#include "../file_path_special.h"
#include "../content.h"
#ifdef HAVE_THREADS
#include <rthreads/rthreads.h>
#endif
#define AUDIO_BUFFER_FREE_SAMPLES_COUNT (8 * 1024) #define AUDIO_BUFFER_FREE_SAMPLES_COUNT (8 * 1024)
#define MENU_SOUND_FORMATS "ogg|mod|xm|s3m|mp3|flac"
/** /**
* db_to_gain: * db_to_gain:
* @db : Decibels. * @db : Decibels.
@ -65,6 +75,9 @@ static const audio_driver_t *audio_drivers[] = {
#ifdef HAVE_TINYALSA #ifdef HAVE_TINYALSA
&audio_tinyalsa, &audio_tinyalsa,
#endif #endif
#if defined(HAVE_AUDIOIO)
&audio_audioio,
#endif
#if defined(HAVE_OSS) || defined(HAVE_OSS_BSD) #if defined(HAVE_OSS) || defined(HAVE_OSS_BSD)
&audio_oss, &audio_oss,
#endif #endif
@ -116,22 +129,25 @@ static const audio_driver_t *audio_drivers[] = {
#ifdef EMSCRIPTEN #ifdef EMSCRIPTEN
&audio_rwebaudio, &audio_rwebaudio,
#endif #endif
#if defined(PSP) || defined(VITA) #if defined(PSP) || defined(VITA) || defined(ORBIS)
&audio_psp, &audio_psp,
#endif #endif
#if defined(PS2)
&audio_ps2,
#endif
#ifdef _3DS #ifdef _3DS
&audio_ctr_csnd, &audio_ctr_csnd,
&audio_ctr_dsp, &audio_ctr_dsp,
#endif #endif
#ifdef SWITCH #ifdef SWITCH
&audio_switch,
&audio_switch_thread, &audio_switch_thread,
&audio_switch,
#endif #endif
&audio_null, &audio_null,
NULL, NULL,
}; };
static struct audio_mixer_stream audio_mixer_streams[AUDIO_MIXER_MAX_STREAMS] = {{0}}; static struct audio_mixer_stream audio_mixer_streams[AUDIO_MIXER_MAX_SYSTEM_STREAMS] = {{0}};
static size_t audio_driver_chunk_size = 0; static size_t audio_driver_chunk_size = 0;
static size_t audio_driver_chunk_nonblock_size = 0; static size_t audio_driver_chunk_nonblock_size = 0;
@ -179,11 +195,34 @@ static const audio_driver_t *current_audio = NULL;
static void *audio_driver_context_audio_data = NULL; static void *audio_driver_context_audio_data = NULL;
static bool audio_suspended = false; static bool audio_suspended = false;
static bool audio_is_threaded = false;
#ifdef HAVE_THREADS
static slock_t* s_audio_driver_lock = NULL;
#endif
static void audio_mixer_play_stop_sequential_cb( static void audio_mixer_play_stop_sequential_cb(
audio_mixer_sound_t *sound, unsigned reason); audio_mixer_sound_t *sound, unsigned reason);
static void audio_mixer_play_stop_cb( static void audio_mixer_play_stop_cb(
audio_mixer_sound_t *sound, unsigned reason); audio_mixer_sound_t *sound, unsigned reason);
static void audio_mixer_menu_stop_cb(
audio_mixer_sound_t *sound, unsigned reason);
#ifdef HAVE_THREADS
#define audio_driver_lock() \
if (s_audio_driver_lock) \
slock_lock(s_audio_driver_lock)
#else
#define audio_driver_lock()
#endif
#ifdef HAVE_THREADS
#define audio_driver_unlock() \
if (s_audio_driver_lock) \
slock_unlock(s_audio_driver_lock)
#else
#define audio_driver_unlock()
#endif
enum resampler_quality audio_driver_get_resampler_quality(void) enum resampler_quality audio_driver_get_resampler_quality(void)
{ {
@ -197,14 +236,14 @@ enum resampler_quality audio_driver_get_resampler_quality(void)
audio_mixer_stream_t *audio_driver_mixer_get_stream(unsigned i) audio_mixer_stream_t *audio_driver_mixer_get_stream(unsigned i)
{ {
if (i > (AUDIO_MIXER_MAX_STREAMS-1)) if (i > (AUDIO_MIXER_MAX_SYSTEM_STREAMS-1))
return NULL; return NULL;
return &audio_mixer_streams[i]; return &audio_mixer_streams[i];
} }
const char *audio_driver_mixer_get_stream_name(unsigned i) const char *audio_driver_mixer_get_stream_name(unsigned i)
{ {
if (i > (AUDIO_MIXER_MAX_STREAMS-1)) if (i > (AUDIO_MIXER_MAX_SYSTEM_STREAMS-1))
return "N/A"; return "N/A";
if (!string_is_empty(audio_mixer_streams[i].name)) if (!string_is_empty(audio_mixer_streams[i].name))
return audio_mixer_streams[i].name; return audio_mixer_streams[i].name;
@ -386,12 +425,11 @@ static bool audio_driver_deinit_internal(void)
return true; return true;
} }
static void audio_driver_mixer_init(unsigned out_rate) static void audio_driver_mixer_init(unsigned audio_out_rate)
{ {
audio_mixer_init(out_rate); audio_mixer_init(audio_out_rate);
} }
static bool audio_driver_init_internal(bool audio_cb_inited) static bool audio_driver_init_internal(bool audio_cb_inited)
{ {
unsigned new_rate = 0; unsigned new_rate = 0;
@ -442,6 +480,7 @@ static bool audio_driver_init_internal(bool audio_cb_inited)
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
if (audio_cb_inited) if (audio_cb_inited)
{ {
audio_is_threaded = true;
RARCH_LOG("[Audio]: Starting threaded audio driver ...\n"); RARCH_LOG("[Audio]: Starting threaded audio driver ...\n");
if (!audio_init_thread( if (!audio_init_thread(
&current_audio, &current_audio,
@ -460,6 +499,7 @@ static bool audio_driver_init_internal(bool audio_cb_inited)
else else
#endif #endif
{ {
audio_is_threaded = false;
audio_driver_context_audio_data = audio_driver_context_audio_data =
current_audio->init(*settings->arrays.audio_device ? current_audio->init(*settings->arrays.audio_device ?
settings->arrays.audio_device : NULL, settings->arrays.audio_device : NULL,
@ -502,6 +542,15 @@ static bool audio_driver_init_internal(bool audio_cb_inited)
audio_source_ratio_original = audio_source_ratio_current = audio_source_ratio_original = audio_source_ratio_current =
(double)settings->uints.audio_out_rate / audio_driver_input; (double)settings->uints.audio_out_rate / audio_driver_input;
#ifdef HAVE_THREADS
if (s_audio_driver_lock)
slock_free(s_audio_driver_lock);
s_audio_driver_lock = slock_new();
#endif
audio_resampler_lock_init();
audio_resampler_lock();
if (!retro_resampler_realloc( if (!retro_resampler_realloc(
&audio_driver_resampler_data, &audio_driver_resampler_data,
&audio_driver_resampler, &audio_driver_resampler,
@ -514,6 +563,8 @@ static bool audio_driver_init_internal(bool audio_cb_inited)
audio_driver_active = false; audio_driver_active = false;
} }
audio_resampler_unlock();
aud_inp_data = (float*)malloc(max_bufsamples * sizeof(float)); aud_inp_data = (float*)malloc(max_bufsamples * sizeof(float));
retro_assert(aud_inp_data != NULL); retro_assert(aud_inp_data != NULL);
@ -584,9 +635,13 @@ void audio_driver_set_nonblocking_state(bool enable)
audio_driver_context_audio_data, audio_driver_context_audio_data,
settings->bools.audio_sync ? enable : true); settings->bools.audio_sync ? enable : true);
audio_driver_lock();
audio_driver_chunk_size = enable ? audio_driver_chunk_size = enable ?
audio_driver_chunk_nonblock_size : audio_driver_chunk_nonblock_size :
audio_driver_chunk_block_size; audio_driver_chunk_block_size;
audio_driver_unlock();
} }
/** /**
@ -604,6 +659,7 @@ static void audio_driver_flush(const int16_t *data, size_t samples)
bool is_paused = false; bool is_paused = false;
bool is_idle = false; bool is_idle = false;
bool is_slowmotion = false; bool is_slowmotion = false;
bool is_active = false;
const void *output_data = NULL; const void *output_data = NULL;
unsigned output_frames = 0; unsigned output_frames = 0;
float audio_volume_gain = !audio_driver_mute_enable ? float audio_volume_gain = !audio_driver_mute_enable ?
@ -612,9 +668,13 @@ static void audio_driver_flush(const int16_t *data, size_t samples)
src_data.data_out = NULL; src_data.data_out = NULL;
src_data.output_frames = 0; src_data.output_frames = 0;
recording_driver_lock();
if (recording_data) if (recording_data)
recording_push_audio(data, samples); recording_push_audio(data, samples);
recording_driver_unlock();
runloop_get_status(&is_paused, &is_idle, &is_slowmotion, runloop_get_status(&is_paused, &is_idle, &is_slowmotion,
&is_perfcnt_enable); &is_perfcnt_enable);
@ -624,13 +684,16 @@ static void audio_driver_flush(const int16_t *data, size_t samples)
!audio_driver_output_samples_buf) !audio_driver_output_samples_buf)
return; return;
audio_driver_lock();
convert_s16_to_float(audio_driver_input_data, data, samples, convert_s16_to_float(audio_driver_input_data, data, samples,
audio_volume_gain); audio_volume_gain);
audio_driver_unlock();
src_data.data_in = audio_driver_input_data; src_data.data_in = audio_driver_input_data;
src_data.input_frames = samples >> 1; src_data.input_frames = samples >> 1;
if (audio_driver_dsp) if (audio_driver_dsp)
{ {
struct retro_dsp_data dsp_data; struct retro_dsp_data dsp_data;
@ -691,9 +754,15 @@ static void audio_driver_flush(const int16_t *data, size_t samples)
src_data.ratio *= settings->floats.slowmotion_ratio; src_data.ratio *= settings->floats.slowmotion_ratio;
} }
audio_driver_resampler->process(audio_driver_resampler_data, &src_data); audio_driver_lock();
if (audio_mixer_active) audio_resampler_lock();
audio_driver_resampler->process(audio_driver_resampler_data, &src_data);
audio_resampler_unlock();
is_active = audio_mixer_active;
if (is_active)
{ {
bool override = audio_driver_mixer_mute_enable ? true : bool override = audio_driver_mixer_mute_enable ? true :
(audio_driver_mixer_volume_gain != 1.0f) ? true : false; (audio_driver_mixer_volume_gain != 1.0f) ? true : false;
@ -703,6 +772,8 @@ static void audio_driver_flush(const int16_t *data, size_t samples)
src_data.output_frames, mixer_gain, override); src_data.output_frames, mixer_gain, override);
} }
audio_driver_unlock();
output_data = audio_driver_output_samples_buf; output_data = audio_driver_output_samples_buf;
output_frames = (unsigned)src_data.output_frames; output_frames = (unsigned)src_data.output_frames;
@ -717,9 +788,13 @@ static void audio_driver_flush(const int16_t *data, size_t samples)
output_frames *= sizeof(int16_t); output_frames *= sizeof(int16_t);
} }
audio_driver_lock();
if (current_audio->write(audio_driver_context_audio_data, if (current_audio->write(audio_driver_context_audio_data,
output_data, output_frames * 2) < 0) output_data, output_frames * 2) < 0)
audio_driver_active = false; audio_driver_active = false;
audio_driver_unlock();
} }
/** /**
@ -731,14 +806,24 @@ static void audio_driver_flush(const int16_t *data, size_t samples)
**/ **/
void audio_driver_sample(int16_t left, int16_t right) void audio_driver_sample(int16_t left, int16_t right)
{ {
audio_driver_lock();
if (audio_suspended) if (audio_suspended)
{
audio_driver_unlock();
return; return;
}
audio_driver_output_samples_conv_buf[audio_driver_data_ptr++] = left; audio_driver_output_samples_conv_buf[audio_driver_data_ptr++] = left;
audio_driver_output_samples_conv_buf[audio_driver_data_ptr++] = right; audio_driver_output_samples_conv_buf[audio_driver_data_ptr++] = right;
if (audio_driver_data_ptr < audio_driver_chunk_size) if (audio_driver_data_ptr < audio_driver_chunk_size)
{
audio_driver_unlock();
return; return;
}
audio_driver_unlock();
audio_driver_flush(audio_driver_output_samples_conv_buf, audio_driver_flush(audio_driver_output_samples_conv_buf,
audio_driver_data_ptr); audio_driver_data_ptr);
@ -749,8 +834,7 @@ void audio_driver_sample(int16_t left, int16_t right)
void audio_driver_menu_sample(void) void audio_driver_menu_sample(void)
{ {
static int16_t samples_buf[1024] = {0}; static int16_t samples_buf[1024] = {0};
struct retro_system_av_info struct retro_system_av_info *av_info = video_viewport_get_system_av_info();
*av_info = video_viewport_get_system_av_info();
const struct retro_system_timing *info = const struct retro_system_timing *info =
(const struct retro_system_timing*)&av_info->timing; (const struct retro_system_timing*)&av_info->timing;
unsigned sample_count = (info->sample_rate / info->fps) * 2; unsigned sample_count = (info->sample_rate / info->fps) * 2;
@ -796,6 +880,9 @@ size_t audio_driver_sample_batch(const int16_t *data, size_t frames)
**/ **/
void audio_driver_sample_rewind(int16_t left, int16_t right) void audio_driver_sample_rewind(int16_t left, int16_t right)
{ {
if (audio_driver_rewind_ptr == 0)
return;
audio_driver_rewind_buf[--audio_driver_rewind_ptr] = right; audio_driver_rewind_buf[--audio_driver_rewind_ptr] = right;
audio_driver_rewind_buf[--audio_driver_rewind_ptr] = left; audio_driver_rewind_buf[--audio_driver_rewind_ptr] = left;
} }
@ -819,7 +906,10 @@ size_t audio_driver_sample_batch_rewind(const int16_t *data, size_t frames)
size_t samples = frames << 1; size_t samples = frames << 1;
for (i = 0; i < samples; i++) for (i = 0; i < samples; i++)
{
if (audio_driver_rewind_ptr > 0)
audio_driver_rewind_buf[--audio_driver_rewind_ptr] = data[i]; audio_driver_rewind_buf[--audio_driver_rewind_ptr] = data[i];
}
return frames; return frames;
} }
@ -905,9 +995,11 @@ void audio_driver_setup_rewind(void)
for (i = 0; i < audio_driver_data_ptr; i += 2) for (i = 0; i < audio_driver_data_ptr; i += 2)
{ {
if (audio_driver_rewind_ptr > 0)
audio_driver_rewind_buf[--audio_driver_rewind_ptr] = audio_driver_rewind_buf[--audio_driver_rewind_ptr] =
audio_driver_output_samples_conv_buf[i + 1]; audio_driver_output_samples_conv_buf[i + 1];
if (audio_driver_rewind_ptr > 0)
audio_driver_rewind_buf[--audio_driver_rewind_ptr] = audio_driver_rewind_buf[--audio_driver_rewind_ptr] =
audio_driver_output_samples_conv_buf[i + 0]; audio_driver_output_samples_conv_buf[i + 0];
} }
@ -954,10 +1046,13 @@ bool audio_driver_find_driver(void)
void audio_driver_deinit_resampler(void) void audio_driver_deinit_resampler(void)
{ {
audio_resampler_lock();
if (audio_driver_resampler && audio_driver_resampler_data) if (audio_driver_resampler && audio_driver_resampler_data)
audio_driver_resampler->free(audio_driver_resampler_data); audio_driver_resampler->free(audio_driver_resampler_data);
audio_driver_resampler = NULL; audio_driver_resampler = NULL;
audio_driver_resampler_data = NULL; audio_driver_resampler_data = NULL;
audio_resampler_unlock();
audio_resampler_lock_free();
} }
bool audio_driver_free_devices_list(void) bool audio_driver_free_devices_list(void)
@ -1041,7 +1136,7 @@ static int audio_mixer_find_index(audio_mixer_sound_t *sound)
{ {
unsigned i; unsigned i;
for (i = 0; i < AUDIO_MIXER_MAX_STREAMS; i++) for (i = 0; i < AUDIO_MIXER_MAX_SYSTEM_STREAMS; i++)
{ {
audio_mixer_sound_t *handle = audio_mixer_streams[i].handle; audio_mixer_sound_t *handle = audio_mixer_streams[i].handle;
if (handle == sound) if (handle == sound)
@ -1083,6 +1178,28 @@ static void audio_mixer_play_stop_cb(
} }
} }
static void audio_mixer_menu_stop_cb(
audio_mixer_sound_t *sound, unsigned reason)
{
int idx = audio_mixer_find_index(sound);
switch (reason)
{
case AUDIO_MIXER_SOUND_FINISHED:
if (idx >= 0)
{
unsigned i = (unsigned)idx;
audio_mixer_streams[i].state = AUDIO_STREAM_STATE_STOPPED;
audio_mixer_streams[i].volume = 0.0f;
}
break;
case AUDIO_MIXER_SOUND_STOPPED:
break;
case AUDIO_MIXER_SOUND_REPEATED:
break;
}
}
static void audio_mixer_play_stop_sequential_cb( static void audio_mixer_play_stop_sequential_cb(
audio_mixer_sound_t *sound, unsigned reason) audio_mixer_sound_t *sound, unsigned reason)
{ {
@ -1100,6 +1217,11 @@ static void audio_mixer_play_stop_sequential_cb(
if (!string_is_empty(audio_mixer_streams[i].name)) if (!string_is_empty(audio_mixer_streams[i].name))
free(audio_mixer_streams[i].name); free(audio_mixer_streams[i].name);
if (i < AUDIO_MIXER_MAX_STREAMS)
audio_mixer_streams[i].stream_type = AUDIO_STREAM_TYPE_USER;
else
audio_mixer_streams[i].stream_type = AUDIO_STREAM_TYPE_SYSTEM;
audio_mixer_streams[i].name = NULL; audio_mixer_streams[i].name = NULL;
audio_mixer_streams[i].state = AUDIO_STREAM_STATE_NONE; audio_mixer_streams[i].state = AUDIO_STREAM_STATE_NONE;
audio_mixer_streams[i].volume = 0.0f; audio_mixer_streams[i].volume = 0.0f;
@ -1110,7 +1232,7 @@ static void audio_mixer_play_stop_sequential_cb(
i++; i++;
for (; i < AUDIO_MIXER_MAX_STREAMS; i++) for (; i < AUDIO_MIXER_MAX_SYSTEM_STREAMS; i++)
{ {
if (audio_mixer_streams[i].state == AUDIO_STREAM_STATE_STOPPED) if (audio_mixer_streams[i].state == AUDIO_STREAM_STATE_STOPPED)
{ {
@ -1127,10 +1249,11 @@ static void audio_mixer_play_stop_sequential_cb(
} }
} }
bool audio_driver_mixer_get_free_stream_slot(unsigned *id) static bool audio_driver_mixer_get_free_stream_slot(unsigned *id, enum audio_mixer_stream_type type)
{ {
unsigned i; unsigned i = (type == AUDIO_STREAM_TYPE_USER) ? 0 : AUDIO_MIXER_MAX_STREAMS;
for (i = 0; i < AUDIO_MIXER_MAX_STREAMS; i++) unsigned count = (type == AUDIO_STREAM_TYPE_USER) ? AUDIO_MIXER_MAX_STREAMS : AUDIO_MIXER_MAX_SYSTEM_STREAMS;
for (; i < count; i++)
{ {
if (audio_mixer_streams[i].state == AUDIO_STREAM_STATE_NONE) if (audio_mixer_streams[i].state == AUDIO_STREAM_STATE_NONE)
{ {
@ -1151,9 +1274,22 @@ bool audio_driver_mixer_add_stream(audio_mixer_stream_params_t *params)
bool looped = false; bool looped = false;
void *buf = NULL; void *buf = NULL;
if (!audio_driver_mixer_get_free_stream_slot(&free_slot)) if (params->stream_type == AUDIO_STREAM_TYPE_NONE)
return false; return false;
switch (params->slot_selection_type)
{
case AUDIO_MIXER_SLOT_SELECTION_MANUAL:
free_slot = params->slot_selection_idx;
break;
case AUDIO_MIXER_SLOT_SELECTION_AUTOMATIC:
default:
if (!audio_driver_mixer_get_free_stream_slot(
&free_slot, params->stream_type))
return false;
break;
}
if (params->state == AUDIO_STREAM_STATE_NONE) if (params->state == AUDIO_STREAM_STATE_NONE)
return false; return false;
@ -1212,22 +1348,28 @@ bool audio_driver_mixer_add_stream(audio_mixer_stream_params_t *params)
break; break;
} }
audio_driver_lock();
audio_mixer_active = true; audio_mixer_active = true;
audio_mixer_streams[free_slot].name = !string_is_empty(params->basename) ? strdup(params->basename) : NULL; audio_mixer_streams[free_slot].name = !string_is_empty(params->basename) ? strdup(params->basename) : NULL;
audio_mixer_streams[free_slot].buf = buf; audio_mixer_streams[free_slot].buf = buf;
audio_mixer_streams[free_slot].handle = handle; audio_mixer_streams[free_slot].handle = handle;
audio_mixer_streams[free_slot].voice = voice; audio_mixer_streams[free_slot].voice = voice;
audio_mixer_streams[free_slot].stream_type = params->stream_type;
audio_mixer_streams[free_slot].type = params->type;
audio_mixer_streams[free_slot].state = params->state; audio_mixer_streams[free_slot].state = params->state;
audio_mixer_streams[free_slot].volume = params->volume; audio_mixer_streams[free_slot].volume = params->volume;
audio_mixer_streams[free_slot].stop_cb = stop_cb; audio_mixer_streams[free_slot].stop_cb = stop_cb;
audio_driver_unlock();
return true; return true;
} }
enum audio_mixer_state audio_driver_mixer_get_stream_state(unsigned i) enum audio_mixer_state audio_driver_mixer_get_stream_state(unsigned i)
{ {
if (i >= AUDIO_MIXER_MAX_STREAMS) if (i >= AUDIO_MIXER_MAX_SYSTEM_STREAMS)
return AUDIO_STREAM_STATE_NONE; return AUDIO_STREAM_STATE_NONE;
return audio_mixer_streams[i].state; return audio_mixer_streams[i].state;
@ -1237,7 +1379,7 @@ static void audio_driver_mixer_play_stream_internal(unsigned i, unsigned type)
{ {
bool set_state = false; bool set_state = false;
if (i >= AUDIO_MIXER_MAX_STREAMS) if (i >= AUDIO_MIXER_MAX_SYSTEM_STREAMS)
return; return;
switch (audio_mixer_streams[i].state) switch (audio_mixer_streams[i].state)
@ -1259,12 +1401,128 @@ static void audio_driver_mixer_play_stream_internal(unsigned i, unsigned type)
audio_mixer_streams[i].state = (enum audio_mixer_state)type; audio_mixer_streams[i].state = (enum audio_mixer_state)type;
} }
static void audio_driver_load_menu_bgm_callback(void *task_data, void *user_data, const char *error)
{
bool contentless = false;
bool is_inited = false;
content_get_status(&contentless, &is_inited);
if (!is_inited)
audio_driver_mixer_play_menu_sound_looped(AUDIO_MIXER_SYSTEM_SLOT_BGM);
}
void audio_driver_load_menu_sounds(void)
{
settings_t *settings = config_get_ptr();
char *sounds_path = NULL;
char *sounds_fallback_path = NULL;
const char *path_ok = NULL;
const char *path_cancel = NULL;
const char *path_notice = NULL;
const char *path_bgm = NULL;
struct string_list *list = NULL;
struct string_list *list_fallback = NULL;
int i = 0;
sounds_path = (char*)malloc(PATH_MAX_LENGTH * sizeof(char));
sounds_fallback_path = (char*)malloc(PATH_MAX_LENGTH * sizeof(char));
sounds_path[0] = sounds_fallback_path[0] = '\0';
fill_pathname_join(
sounds_fallback_path,
settings->paths.directory_assets,
"sounds",
PATH_MAX_LENGTH * sizeof(char)
);
fill_pathname_application_special(sounds_path, PATH_MAX_LENGTH * sizeof(char), APPLICATION_SPECIAL_DIRECTORY_ASSETS_SOUNDS);
list = dir_list_new(sounds_path, MENU_SOUND_FORMATS, false, false, false, false);
list_fallback = dir_list_new(sounds_fallback_path, MENU_SOUND_FORMATS, false, false, false, false);
if (!list)
{
list = list_fallback;
list_fallback = NULL;
}
if (!list || list->size == 0)
goto end;
if (list_fallback && list_fallback->size > 0)
{
for (i = 0; i < list_fallback->size; i++)
{
if (list->size == 0 || !string_list_find_elem(list, list_fallback->elems[i].data))
{
union string_list_elem_attr attr = {0};
string_list_append(list, list_fallback->elems[i].data, attr);
}
}
}
for (i = 0; i < list->size; i++)
{
const char *path = list->elems[i].data;
const char *ext = path_get_extension(path);
char basename_noext[PATH_MAX_LENGTH];
basename_noext[0] = '\0';
fill_pathname_base_noext(basename_noext, path, sizeof(basename_noext));
if (audio_driver_mixer_extension_supported(ext))
{
if (string_is_equal_noncase(basename_noext, "ok"))
path_ok = path;
if (string_is_equal_noncase(basename_noext, "cancel"))
path_cancel = path;
if (string_is_equal_noncase(basename_noext, "notice"))
path_notice = path;
if (string_is_equal_noncase(basename_noext, "bgm"))
path_bgm = path;
}
}
if (path_ok && settings->bools.audio_enable_menu_ok)
task_push_audio_mixer_load(path_ok, NULL, NULL, true, AUDIO_MIXER_SLOT_SELECTION_MANUAL, AUDIO_MIXER_SYSTEM_SLOT_OK);
if (path_cancel && settings->bools.audio_enable_menu_cancel)
task_push_audio_mixer_load(path_cancel, NULL, NULL, true, AUDIO_MIXER_SLOT_SELECTION_MANUAL, AUDIO_MIXER_SYSTEM_SLOT_CANCEL);
if (path_notice && settings->bools.audio_enable_menu_notice)
task_push_audio_mixer_load(path_notice, NULL, NULL, true, AUDIO_MIXER_SLOT_SELECTION_MANUAL, AUDIO_MIXER_SYSTEM_SLOT_NOTICE);
if (path_bgm && settings->bools.audio_enable_menu_bgm)
task_push_audio_mixer_load(path_bgm, audio_driver_load_menu_bgm_callback, NULL, true, AUDIO_MIXER_SLOT_SELECTION_MANUAL, AUDIO_MIXER_SYSTEM_SLOT_BGM);
end:
if (list)
string_list_free(list);
if (list_fallback)
string_list_free(list_fallback);
if (sounds_path)
free(sounds_path);
if (sounds_fallback_path)
free(sounds_fallback_path);
}
void audio_driver_mixer_play_stream(unsigned i) void audio_driver_mixer_play_stream(unsigned i)
{ {
audio_mixer_streams[i].stop_cb = audio_mixer_play_stop_cb; audio_mixer_streams[i].stop_cb = audio_mixer_play_stop_cb;
audio_driver_mixer_play_stream_internal(i, AUDIO_STREAM_STATE_PLAYING); audio_driver_mixer_play_stream_internal(i, AUDIO_STREAM_STATE_PLAYING);
} }
void audio_driver_mixer_play_menu_sound_looped(unsigned i)
{
audio_mixer_streams[i].stop_cb = audio_mixer_menu_stop_cb;
audio_driver_mixer_play_stream_internal(i, AUDIO_STREAM_STATE_PLAYING_LOOPED);
}
void audio_driver_mixer_play_menu_sound(unsigned i)
{
audio_mixer_streams[i].stop_cb = audio_mixer_menu_stop_cb;
audio_driver_mixer_play_stream_internal(i, AUDIO_STREAM_STATE_PLAYING);
}
void audio_driver_mixer_play_stream_looped(unsigned i) void audio_driver_mixer_play_stream_looped(unsigned i)
{ {
audio_mixer_streams[i].stop_cb = audio_mixer_play_stop_cb; audio_mixer_streams[i].stop_cb = audio_mixer_play_stop_cb;
@ -1279,7 +1537,7 @@ void audio_driver_mixer_play_stream_sequential(unsigned i)
float audio_driver_mixer_get_stream_volume(unsigned i) float audio_driver_mixer_get_stream_volume(unsigned i)
{ {
if (i >= AUDIO_MIXER_MAX_STREAMS) if (i >= AUDIO_MIXER_MAX_SYSTEM_STREAMS)
return 0.0f; return 0.0f;
return audio_mixer_streams[i].volume; return audio_mixer_streams[i].volume;
@ -1289,7 +1547,7 @@ void audio_driver_mixer_set_stream_volume(unsigned i, float vol)
{ {
audio_mixer_voice_t *voice = NULL; audio_mixer_voice_t *voice = NULL;
if (i >= AUDIO_MIXER_MAX_STREAMS) if (i >= AUDIO_MIXER_MAX_SYSTEM_STREAMS)
return; return;
audio_mixer_streams[i].volume = vol; audio_mixer_streams[i].volume = vol;
@ -1304,7 +1562,7 @@ void audio_driver_mixer_stop_stream(unsigned i)
{ {
bool set_state = false; bool set_state = false;
if (i >= AUDIO_MIXER_MAX_STREAMS) if (i >= AUDIO_MIXER_MAX_SYSTEM_STREAMS)
return; return;
switch (audio_mixer_streams[i].state) switch (audio_mixer_streams[i].state)
@ -1334,7 +1592,7 @@ void audio_driver_mixer_remove_stream(unsigned i)
{ {
bool destroy = false; bool destroy = false;
if (i >= AUDIO_MIXER_MAX_STREAMS) if (i >= AUDIO_MIXER_MAX_SYSTEM_STREAMS)
return; return;
switch (audio_mixer_streams[i].state) switch (audio_mixer_streams[i].state)
@ -1376,7 +1634,7 @@ static void audio_driver_mixer_deinit(void)
audio_mixer_active = false; audio_mixer_active = false;
for (i = 0; i < AUDIO_MIXER_MAX_STREAMS; i++) for (i = 0; i < AUDIO_MIXER_MAX_SYSTEM_STREAMS; i++)
{ {
audio_driver_mixer_stop_stream(i); audio_driver_mixer_stop_stream(i);
audio_driver_mixer_remove_stream(i); audio_driver_mixer_remove_stream(i);
@ -1389,6 +1647,11 @@ bool audio_driver_deinit(void)
{ {
audio_driver_mixer_deinit(); audio_driver_mixer_deinit();
audio_driver_free_devices_list(); audio_driver_free_devices_list();
#ifdef HAVE_THREADS
slock_free(s_audio_driver_lock);
s_audio_driver_lock = NULL;
#endif
if (!audio_driver_deinit_internal()) if (!audio_driver_deinit_internal())
return false; return false;
return true; return true;
@ -1490,7 +1753,6 @@ error:
return false; return false;
} }
bool audio_driver_stop(void) bool audio_driver_stop(void)
{ {
if (!current_audio || !current_audio->stop if (!current_audio || !current_audio->stop
@ -1580,7 +1842,6 @@ void audio_set_bool(enum audio_action action, bool val)
} }
} }
void audio_set_float(enum audio_action action, float val) void audio_set_float(enum audio_action action, float val)
{ {
switch (action) switch (action)

View File

@ -37,6 +37,17 @@ RETRO_BEGIN_DECLS
#define AUDIO_MIXER_MAX_STREAMS 16 #define AUDIO_MIXER_MAX_STREAMS 16
#define AUDIO_MIXER_MAX_SYSTEM_STREAMS (AUDIO_MIXER_MAX_STREAMS + 4)
/* do not define more than (MAX_SYSTEM_STREAMS - MAX_STREAMS) */
enum audio_mixer_system_slot
{
AUDIO_MIXER_SYSTEM_SLOT_OK = AUDIO_MIXER_MAX_STREAMS,
AUDIO_MIXER_SYSTEM_SLOT_CANCEL,
AUDIO_MIXER_SYSTEM_SLOT_NOTICE,
AUDIO_MIXER_SYSTEM_SLOT_BGM
};
enum audio_action enum audio_action
{ {
AUDIO_ACTION_NONE = 0, AUDIO_ACTION_NONE = 0,
@ -48,6 +59,19 @@ enum audio_action
AUDIO_ACTION_MIXER AUDIO_ACTION_MIXER
}; };
enum audio_mixer_slot_selection_type
{
AUDIO_MIXER_SLOT_SELECTION_AUTOMATIC = 0,
AUDIO_MIXER_SLOT_SELECTION_MANUAL
};
enum audio_mixer_stream_type
{
AUDIO_STREAM_TYPE_NONE = 0,
AUDIO_STREAM_TYPE_USER,
AUDIO_STREAM_TYPE_SYSTEM
};
enum audio_mixer_state enum audio_mixer_state
{ {
AUDIO_STREAM_STATE_NONE = 0, AUDIO_STREAM_STATE_NONE = 0,
@ -62,6 +86,8 @@ typedef struct audio_mixer_stream
audio_mixer_sound_t *handle; audio_mixer_sound_t *handle;
audio_mixer_voice_t *voice; audio_mixer_voice_t *voice;
audio_mixer_stop_cb_t stop_cb; audio_mixer_stop_cb_t stop_cb;
enum audio_mixer_stream_type stream_type;
enum audio_mixer_type type;
enum audio_mixer_state state; enum audio_mixer_state state;
float volume; float volume;
void *buf; void *buf;
@ -163,6 +189,9 @@ typedef struct audio_driver
typedef struct audio_mixer_stream_params typedef struct audio_mixer_stream_params
{ {
float volume; float volume;
enum audio_mixer_slot_selection_type slot_selection_type;
unsigned slot_selection_idx;
enum audio_mixer_stream_type stream_type;
enum audio_mixer_type type; enum audio_mixer_type type;
enum audio_mixer_state state; enum audio_mixer_state state;
void *buf; void *buf;
@ -295,6 +324,10 @@ bool audio_driver_mixer_add_stream(audio_mixer_stream_params_t *params);
void audio_driver_mixer_play_stream(unsigned i); void audio_driver_mixer_play_stream(unsigned i);
void audio_driver_mixer_play_menu_sound(unsigned i);
void audio_driver_mixer_play_menu_sound_looped(unsigned i);
void audio_driver_mixer_play_stream_sequential(unsigned i); void audio_driver_mixer_play_stream_sequential(unsigned i);
void audio_driver_mixer_play_stream_looped(unsigned i); void audio_driver_mixer_play_stream_looped(unsigned i);
@ -315,7 +348,10 @@ const char *audio_driver_mixer_get_stream_name(unsigned i);
bool compute_audio_buffer_statistics(audio_statistics_t *stats); bool compute_audio_buffer_statistics(audio_statistics_t *stats);
void audio_driver_load_menu_sounds(void);
extern audio_driver_t audio_rsound; extern audio_driver_t audio_rsound;
extern audio_driver_t audio_audioio;
extern audio_driver_t audio_oss; extern audio_driver_t audio_oss;
extern audio_driver_t audio_alsa; extern audio_driver_t audio_alsa;
extern audio_driver_t audio_alsathread; extern audio_driver_t audio_alsathread;
@ -335,6 +371,7 @@ extern audio_driver_t audio_ps3;
extern audio_driver_t audio_gx; extern audio_driver_t audio_gx;
extern audio_driver_t audio_ax; extern audio_driver_t audio_ax;
extern audio_driver_t audio_psp; extern audio_driver_t audio_psp;
extern audio_driver_t audio_ps2;
extern audio_driver_t audio_ctr_csnd; extern audio_driver_t audio_ctr_csnd;
extern audio_driver_t audio_ctr_dsp; extern audio_driver_t audio_ctr_dsp;
extern audio_driver_t audio_switch; extern audio_driver_t audio_switch;

View File

@ -43,4 +43,3 @@ bool audio_init_thread(const audio_driver_t **out_driver, void **out_data,
const audio_driver_t *driver); const audio_driver_t *driver);
#endif #endif

View File

@ -219,7 +219,6 @@ static int check_pcm_status(void *data, int channel_type)
return ret; return ret;
} }
static ssize_t alsa_qsa_write(void *data, const void *buf, size_t size) static ssize_t alsa_qsa_write(void *data, const void *buf, size_t size)
{ {
alsa_t *alsa = (alsa_t*)data; alsa_t *alsa = (alsa_t*)data;
@ -328,7 +327,6 @@ static void alsa_qsa_set_nonblock_state(void *data, bool state)
alsa->nonblock = state; alsa->nonblock = state;
} }
static bool alsa_qsa_use_float(void *data) static bool alsa_qsa_use_float(void *data)
{ {
alsa_t *alsa = (alsa_t*)data; alsa_t *alsa = (alsa_t*)data;

204
audio/drivers/audioio.c Normal file
View File

@ -0,0 +1,204 @@
/* RetroArch - A frontend for libretro.
* Copyright (C) 2010-2014 - Hans-Kristian Arntzen
* Copyright (C) 2011-2017 - Daniel De Matteis
*
* RetroArch 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 Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch 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 RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <errno.h>
#include <sys/audioio.h>
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "../audio_driver.h"
#include "../../verbosity.h"
#define DEFAULT_DEV "/dev/audio"
static void *audioio_init(const char *device, unsigned rate, unsigned latency,
unsigned block_frames,
unsigned *new_out_rate)
{
int *fd = (int*)calloc(1, sizeof(int));
const char *audiodev = device ? device : DEFAULT_DEV;
struct audio_info info;
if (!fd)
return NULL;
AUDIO_INITINFO(&info);
#ifdef AUMODE_PLAY_ALL
info.mode = AUMODE_PLAY_ALL;
#endif
info.play.sample_rate = rate;
info.play.channels = 2;
info.play.precision = 16;
#ifdef AUDIO_ENCODING_SLINEAR
info.play.encoding = AUDIO_ENCODING_SLINEAR;
#else
info.play.encoding = AUDIO_ENCODING_LINEAR;
#endif
if ((*fd = open(audiodev, O_WRONLY)) < 0)
{
free(fd);
perror("open");
return NULL;
}
if (ioctl(*fd, AUDIO_SETINFO, &info) < 0)
goto error;
if (ioctl(*fd, AUDIO_GETINFO, &info) < 0)
goto error;
*new_out_rate = info.play.sample_rate;
return fd;
error:
close(*fd);
free(fd);
perror("ioctl");
return NULL;
}
static ssize_t audioio_write(void *data, const void *buf, size_t size)
{
ssize_t ret;
int *fd = (int*)data;
if (size == 0)
return 0;
if ((ret = write(*fd, buf, size)) < 0)
{
if (errno == EAGAIN && (fcntl(*fd, F_GETFL) & O_NONBLOCK))
return 0;
return -1;
}
return ret;
}
static bool audioio_stop(void *data)
{
struct audio_info info;
int *fd = (int*)data;
if (ioctl(*fd, AUDIO_FLUSH, NULL) < 0)
return false;
if (ioctl(*fd, AUDIO_GETINFO, &info) < 0)
return false;
info.play.pause = true;
return ioctl(*fd, AUDIO_SETINFO, &info) == 0;
}
static bool audioio_start(void *data, bool is_shutdown)
{
struct audio_info info;
int *fd = (int*)data;
if (ioctl(*fd, AUDIO_FLUSH, NULL) < 0)
return false;
if (ioctl(*fd, AUDIO_GETINFO, &info) < 0)
return false;
info.play.pause = false;
return ioctl(*fd, AUDIO_SETINFO, &info) == 0;
}
static bool audioio_alive(void *data)
{
struct audio_info info;
int *fd = (int*)data;
if (ioctl(*fd, AUDIO_GETINFO, &info) < 0)
return false;
return !info.play.pause;
}
static void audioio_set_nonblock_state(void *data, bool state)
{
int rc;
int *fd = (int*)data;
if (state)
rc = fcntl(*fd, F_SETFL, fcntl(*fd, F_GETFL) | O_NONBLOCK);
else
rc = fcntl(*fd, F_SETFL, fcntl(*fd, F_GETFL) & (~O_NONBLOCK));
if (rc != 0)
RARCH_WARN("Could not set nonblocking on audio file descriptor. Will not be able to fast-forward.\n");
}
static void audioio_free(void *data)
{
int *fd = (int*)data;
(void)ioctl(*fd, AUDIO_FLUSH, NULL);
close(*fd);
free(fd);
}
static size_t audioio_buffer_size(void *data)
{
struct audio_info info;
int *fd = (int*)data;
if (ioctl(*fd, AUDIO_GETINFO, &info) < 0)
return false;
return info.play.buffer_size;
}
static size_t audioio_write_avail(void *data)
{
return audioio_buffer_size(data);
}
static bool audioio_use_float(void *data)
{
(void)data;
return false;
}
audio_driver_t audio_audioio = {
audioio_init,
audioio_write,
audioio_stop,
audioio_start,
audioio_alive,
audioio_set_nonblock_state,
audioio_free,
audioio_use_float,
"audioio",
NULL,
NULL,
audioio_write_avail,
audioio_buffer_size,
};

View File

@ -15,7 +15,6 @@
*/ */
#include <stdlib.h> #include <stdlib.h>
#if TARGET_OS_IPHONE #if TARGET_OS_IPHONE
#include <AudioToolbox/AudioToolbox.h> #include <AudioToolbox/AudioToolbox.h>
#else #else

View File

@ -56,7 +56,6 @@ static void ctr_csnd_audio_update_playpos(ctr_csnd_audio_t* ctr)
ctr->cpu_ticks_last += samples_played * CTR_CSND_CPU_TICKS_PER_SAMPLE; ctr->cpu_ticks_last += samples_played * CTR_CSND_CPU_TICKS_PER_SAMPLE;
} }
Result csndPlaySound_custom(int chn, u32 flags, float vol, float pan, Result csndPlaySound_custom(int chn, u32 flags, float vol, float pan,
void* data0, void* data1, u32 size) void* data0, void* data1, u32 size)
{ {
@ -289,7 +288,6 @@ static size_t ctr_csnd_audio_buffer_size(void *data)
return CTR_CSND_AUDIO_COUNT; return CTR_CSND_AUDIO_COUNT;
} }
audio_driver_t audio_ctr_csnd = { audio_driver_t audio_ctr_csnd = {
ctr_csnd_audio_init, ctr_csnd_audio_init,
ctr_csnd_audio_write, ctr_csnd_audio_write,

View File

@ -195,7 +195,6 @@ static size_t ctr_dsp_audio_buffer_size(void *data)
return CTR_DSP_AUDIO_COUNT; return CTR_DSP_AUDIO_COUNT;
} }
audio_driver_t audio_ctr_dsp = { audio_driver_t audio_ctr_dsp = {
ctr_dsp_audio_init, ctr_dsp_audio_init,
ctr_dsp_audio_write, ctr_dsp_audio_write,
@ -211,4 +210,3 @@ audio_driver_t audio_ctr_dsp = {
ctr_dsp_audio_write_avail, ctr_dsp_audio_write_avail,
ctr_dsp_audio_buffer_size ctr_dsp_audio_buffer_size
}; };

View File

@ -51,7 +51,6 @@
#pragma comment(lib, "dxguid") #pragma comment(lib, "dxguid")
#endif #endif
typedef struct dsound typedef struct dsound
{ {
LPDIRECTSOUND ds; LPDIRECTSOUND ds;
@ -174,7 +173,6 @@ static DWORD CALLBACK dsound_thread(PVOID data)
/* No space to write, or we don't have data in our fifo, /* No space to write, or we don't have data in our fifo,
* but we can wait some time before it underruns ... */ * but we can wait some time before it underruns ... */
/* We could opt for using the notification interface, /* We could opt for using the notification interface,
* but it is not guaranteed to work, so use high * but it is not guaranteed to work, so use high
* priority sleeping patterns. * priority sleeping patterns.

View File

@ -39,7 +39,6 @@ typedef struct
volatile unsigned dma_write; volatile unsigned dma_write;
size_t write_ptr; size_t write_ptr;
OSCond cond;
bool nonblock; bool nonblock;
bool is_paused; bool is_paused;
} gx_audio_t; } gx_audio_t;
@ -63,8 +62,6 @@ static void dma_callback(void)
DCFlushRange(wa->data[wa->dma_next], CHUNK_SIZE); DCFlushRange(wa->data[wa->dma_next], CHUNK_SIZE);
AIInitDMA((uint32_t)wa->data[wa->dma_next], CHUNK_SIZE); AIInitDMA((uint32_t)wa->data[wa->dma_next], CHUNK_SIZE);
OSSignalCond(wa->cond);
} }
static void *gx_audio_init(const char *device, static void *gx_audio_init(const char *device,
@ -95,8 +92,6 @@ static void *gx_audio_init(const char *device,
*new_rate = 48000; *new_rate = 48000;
} }
OSInitThreadQueue(&wa->cond);
wa->dma_write = BLOCKS - 1; wa->dma_write = BLOCKS - 1;
DCFlushRange(wa->data, sizeof(wa->data)); DCFlushRange(wa->data, sizeof(wa->data));
stop_audio = false; stop_audio = false;
@ -133,8 +128,7 @@ static ssize_t gx_audio_write(void *data, const void *buf_, size_t size)
/* FIXME: Nonblocking audio should break out of loop /* FIXME: Nonblocking audio should break out of loop
* when it has nothing to write. */ * when it has nothing to write. */
while ((wa->dma_write == wa->dma_next || while ((wa->dma_write == wa->dma_next ||
wa->dma_write == wa->dma_busy) && !wa->nonblock) wa->dma_write == wa->dma_busy) && !wa->nonblock);
OSSleepThread(wa->cond);
copy_swapped(wa->data[wa->dma_write] + wa->write_ptr, buf, to_write); copy_swapped(wa->data[wa->dma_write] + wa->write_ptr, buf, to_write);
@ -205,10 +199,6 @@ static void gx_audio_free(void *data)
AIStopDMA(); AIStopDMA();
AIRegisterDMACallback(NULL); AIRegisterDMACallback(NULL);
if (wa->cond)
OSCloseThreadQueue(wa->cond);
wa->cond = 0;
free(data); free(data);
} }

View File

@ -21,7 +21,7 @@ static void *null_audio_init(const char *device, unsigned rate, unsigned latency
unsigned block_frames, unsigned block_frames,
unsigned *new_rate) unsigned *new_rate)
{ {
RARCH_ERR("Using the null audio driver. RetroArch will be silent."); RARCH_ERR("Using the null audio driver. RetroArch will be silent.\n");
(void)device; (void)device;
(void)rate; (void)rate;

View File

@ -232,7 +232,6 @@ static bool sl_start(void *data, bool is_shutdown)
return sl->is_paused ? false : true; return sl->is_paused ? false : true;
} }
static ssize_t sl_write(void *data, const void *buf_, size_t size) static ssize_t sl_write(void *data, const void *buf_, size_t size)
{ {
sl_t *sl = (sl_t*)data; sl_t *sl = (sl_t*)data;

293
audio/drivers/ps2_audio.c Normal file
View File

@ -0,0 +1,293 @@
/* RetroArch - A frontend for libretro.
* Copyright (C) 2014-2017 - Francisco Javier Trujillo Mata
*
* RetroArch 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 Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch 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 RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include <malloc.h>
#include <stdio.h>
#include <string.h>
#include <kernel.h>
#include <audsrv.h>
#include "../audio_driver.h"
typedef struct ps2_audio
{
fifo_buffer_t* buffer;
bool nonblocking;
volatile bool running;
int worker_thread;
int lock;
int cond_lock;
} ps2_audio_t;
static ps2_audio_t *backup_ps2;
static u8 audioThreadStack[4 * 1024] __attribute__ ((aligned(16)));
#define AUDIO_OUT_BUFFER 2 * 1024
#define AUDIO_BUFFER 64 * 1024
#define AUDIO_CHANNELS 2
#define AUDIO_BITS 16
#define AUDIO_PRIORITY 0x7F /* LOWER VALUE GRATHER PRIORITY*/
static void audioMainLoop(void *data)
{
char out_tmp[AUDIO_OUT_BUFFER];
ps2_audio_t* ps2 = backup_ps2;
while (ps2->running)
{
size_t size;
WaitSema(ps2->lock);
size = MIN(fifo_read_avail(ps2->buffer), sizeof(out_tmp));
fifo_read(ps2->buffer, out_tmp, size);
iSignalSema(ps2->lock);
iSignalSema(ps2->cond_lock);
audsrv_wait_audio(size);
audsrv_play_audio(out_tmp, size);
}
audsrv_stop_audio();
ExitDeleteThread();
}
static void audioCreateThread(ps2_audio_t *ps2)
{
int ret;
ee_thread_t thread;
thread.func=&audioMainLoop;
thread.stack=audioThreadStack;
thread.stack_size=sizeof(audioThreadStack);
thread.gp_reg=&_gp;
thread.initial_priority=AUDIO_PRIORITY;
thread.attr=thread.option=0;
/*Backup the PS2 content to be used in the thread */
backup_ps2 = ps2;
ps2->running = true;
ps2->worker_thread = CreateThread(&thread);
if (ps2->worker_thread >= 0) {
ret = StartThread(ps2->worker_thread, NULL);
if (ret < 0) {
printf("sound_init: StartThread returned %d\n", ret);
}
} else {
printf("CreateThread failed: %d\n", ps2->worker_thread);
}
}
static void audioStopNDeleteThread(ps2_audio_t *ps2)
{
ps2->running = false;
if (ps2->worker_thread) {
ps2->worker_thread = 0;
}
}
static void audioConfigure(ps2_audio_t *ps2, unsigned rate)
{
int err;
struct audsrv_fmt_t format;
format.bits = AUDIO_BITS;
format.freq = rate;
format.channels = AUDIO_CHANNELS;
err = audsrv_set_format(&format);
if (err){
printf("set format returned %d\n", err);
printf("audsrv returned error string: %s\n", audsrv_get_error_string());
}
audsrv_set_volume(MAX_VOLUME);
}
static void audioCreateSemas(ps2_audio_t *ps2)
{
ee_sema_t lock_info;
ee_sema_t cond_lock_info;
lock_info.max_count = 1;
lock_info.init_count = 1;
lock_info.option = 0;
ps2->lock = CreateSema(&lock_info);
cond_lock_info.init_count = 1;
cond_lock_info.max_count = 1;
cond_lock_info.option = 0;
ps2->cond_lock = CreateSema(&cond_lock_info);
}
static void *ps2_audio_init(const char *device,
unsigned rate, unsigned latency,
unsigned block_frames,
unsigned *new_rate)
{
ps2_audio_t *ps2 = (ps2_audio_t*)calloc(1, sizeof(ps2_audio_t));
if (!ps2)
return NULL;
ps2->buffer = fifo_new(AUDIO_BUFFER);
audioConfigure(ps2, rate);
audioCreateSemas(ps2);
audioCreateThread(ps2);
return ps2;
}
static void ps2_audio_free(void *data)
{
ps2_audio_t* ps2 = (ps2_audio_t*)data;
if(!ps2)
return;
if(ps2->running){
audioStopNDeleteThread(ps2);
if (ps2->lock){
iDeleteSema(ps2->lock);
ps2->lock = 0;
}
if (ps2->cond_lock){
iDeleteSema(ps2->cond_lock);
ps2->cond_lock = 0;
}
}
fifo_free(ps2->buffer);
free(ps2);
}
static ssize_t ps2_audio_write(void *data, const void *buf, size_t size)
{
ps2_audio_t* ps2 = (ps2_audio_t*)data;
if (!ps2->running)
return -1;
if (ps2->nonblocking){
if (fifo_write_avail(ps2->buffer) < size)
return 0;
}
while (fifo_write_avail(ps2->buffer) < size) {
WaitSema(ps2->cond_lock);
}
WaitSema(ps2->lock);
fifo_write(ps2->buffer, buf, size);
iSignalSema(ps2->lock);
return size;
}
static bool ps2_audio_alive(void *data)
{
bool alive = false;
ps2_audio_t* ps2 = (ps2_audio_t*)data;
if (ps2) {
alive = ps2->running;
}
return alive;
}
static bool ps2_audio_stop(void *data)
{
bool stop = true;
ps2_audio_t* ps2 = (ps2_audio_t*)data;
if (ps2) {
audioStopNDeleteThread(ps2);
audsrv_stop_audio();
}
return stop;
}
static bool ps2_audio_start(void *data, bool is_shutdown)
{
ps2_audio_t* ps2 = (ps2_audio_t*)data;
bool start = true;
if (ps2) {
if (!ps2->running && !ps2->worker_thread) {
audioCreateThread(ps2);
}
}
return start;
}
static void ps2_audio_set_nonblock_state(void *data, bool toggle)
{
ps2_audio_t* ps2 = (ps2_audio_t*)data;
if (ps2) {
ps2->nonblocking = toggle;
}
}
static bool ps2_audio_use_float(void *data)
{
return false;
}
static size_t ps2_audio_write_avail(void *data)
{
ps2_audio_t* ps2 = (ps2_audio_t*)data;
if (ps2 && ps2->running) {
size_t size;
WaitSema(ps2->lock);
size = AUDIO_BUFFER - fifo_read_avail(ps2->buffer);
iSignalSema(ps2->lock);
return size;
}
return 0;
}
static size_t ps2_audio_buffer_size(void *data)
{
return AUDIO_BUFFER;
}
audio_driver_t audio_ps2 = {
ps2_audio_init,
ps2_audio_write,
ps2_audio_stop,
ps2_audio_start,
ps2_audio_alive,
ps2_audio_set_nonblock_state,
ps2_audio_free,
ps2_audio_use_float,
"ps2",
NULL,
NULL,
ps2_audio_write_avail,
ps2_audio_buffer_size
};

View File

@ -16,21 +16,28 @@
*/ */
#include <stdint.h> #include <stdint.h>
#if defined(VITA) || defined(PSP)
#include <malloc.h> #include <malloc.h>
#endif
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <rthreads/rthreads.h> #include <rthreads/rthreads.h>
#include <queues/fifo_queue.h> #include <queues/fifo_queue.h>
#ifdef VITA #if defined(VITA)
#include <psp2/kernel/processmgr.h> #include <psp2/kernel/processmgr.h>
#include <psp2/kernel/threadmgr.h> #include <psp2/kernel/threadmgr.h>
#include <psp2/kernel/sysmem.h> #include <psp2/kernel/sysmem.h>
#include <psp2/audioout.h> #include <psp2/audioout.h>
#else #elif defined(PSP)
#include <pspkernel.h> #include <pspkernel.h>
#include <pspaudio.h> #include <pspaudio.h>
#elif defined(ORBIS)
#include <audioout.h>
#define SCE_AUDIO_OUT_PORT_TYPE_MAIN 0
#define SCE_AUDIO_OUT_MODE_STEREO 1
#define SceUID uint32_t
#endif #endif
#include "../audio_driver.h" #include "../audio_driver.h"
@ -64,10 +71,14 @@ static void audioMainLoop(void *data)
{ {
psp_audio_t* psp = (psp_audio_t*)data; psp_audio_t* psp = (psp_audio_t*)data;
#ifdef VITA #if defined(VITA)
int port = sceAudioOutOpenPort( int port = sceAudioOutOpenPort(
SCE_AUDIO_OUT_PORT_TYPE_MAIN, AUDIO_OUT_COUNT, SCE_AUDIO_OUT_PORT_TYPE_MAIN, AUDIO_OUT_COUNT,
psp->rate, SCE_AUDIO_OUT_MODE_STEREO); psp->rate, SCE_AUDIO_OUT_MODE_STEREO);
#elif defined(ORBIS)
int port = sceAudioOutOpen(0xff,
SCE_AUDIO_OUT_PORT_TYPE_MAIN, 0, AUDIO_OUT_COUNT,
psp->rate, SCE_AUDIO_OUT_MODE_STEREO);
#else #else
sceAudioSRCChReserve(AUDIO_OUT_COUNT, psp->rate, 2); sceAudioSRCChReserve(AUDIO_OUT_COUNT, psp->rate, 2);
#endif #endif
@ -95,7 +106,7 @@ static void audioMainLoop(void *data)
scond_signal(psp->cond); scond_signal(psp->cond);
slock_unlock(psp->cond_lock); slock_unlock(psp->cond_lock);
#ifdef VITA #if defined(VITA) || defined(ORBIS)
sceAudioOutOutput(port, sceAudioOutOutput(port,
cond ? (psp->zeroBuffer) cond ? (psp->zeroBuffer)
: (psp->buffer + read_pos_2)); : (psp->buffer + read_pos_2));
@ -105,8 +116,10 @@ static void audioMainLoop(void *data)
#endif #endif
} }
#ifdef VITA #if defined(VITA)
sceAudioOutReleasePort(port); sceAudioOutReleasePort(port);
#elif defined(ORBIS)
sceAudioOutClose(port);
#else #else
sceAudioSRCChRelease(); sceAudioSRCChRelease();
#endif #endif
@ -127,12 +140,23 @@ static void *psp_audio_init(const char *device,
(void)device; (void)device;
(void)latency; (void)latency;
#ifdef ORBIS
psp->buffer = (uint32_t*)
malloc(AUDIO_BUFFER_SIZE * sizeof(uint32_t));
#else
/* Cache aligned, not necessary but helpful. */ /* Cache aligned, not necessary but helpful. */
psp->buffer = (uint32_t*) psp->buffer = (uint32_t*)
memalign(64, AUDIO_BUFFER_SIZE * sizeof(uint32_t)); memalign(64, AUDIO_BUFFER_SIZE * sizeof(uint32_t));
#endif
memset(psp->buffer, 0, AUDIO_BUFFER_SIZE * sizeof(uint32_t)); memset(psp->buffer, 0, AUDIO_BUFFER_SIZE * sizeof(uint32_t));
#ifdef ORBIS
psp->zeroBuffer = (uint32_t*)
malloc(AUDIO_OUT_COUNT * sizeof(uint32_t));
#else
psp->zeroBuffer = (uint32_t*) psp->zeroBuffer = (uint32_t*)
memalign(64, AUDIO_OUT_COUNT * sizeof(uint32_t)); memalign(64, AUDIO_OUT_COUNT * sizeof(uint32_t));
#endif
memset(psp->zeroBuffer, 0, AUDIO_OUT_COUNT * sizeof(uint32_t)); memset(psp->zeroBuffer, 0, AUDIO_OUT_COUNT * sizeof(uint32_t));
psp->read_pos = 0; psp->read_pos = 0;
@ -228,7 +252,6 @@ static bool psp_audio_alive(void *data)
return psp->running; return psp->running;
} }
static bool psp_audio_stop(void *data) static bool psp_audio_stop(void *data)
{ {
psp_audio_t* psp = (psp_audio_t*)data; psp_audio_t* psp = (psp_audio_t*)data;
@ -294,7 +317,6 @@ static size_t psp_buffer_size(void *data)
return AUDIO_BUFFER_SIZE /** sizeof(uint32_t)*/; return AUDIO_BUFFER_SIZE /** sizeof(uint32_t)*/;
} }
audio_driver_t audio_psp = { audio_driver_t audio_psp = {
psp_audio_init, psp_audio_init,
psp_audio_write, psp_audio_write,
@ -304,8 +326,10 @@ audio_driver_t audio_psp = {
psp_audio_set_nonblock_state, psp_audio_set_nonblock_state,
psp_audio_free, psp_audio_free,
psp_audio_use_float, psp_audio_use_float,
#ifdef VITA #if defined(VITA)
"vita", "vita",
#elif defined(ORBIS)
"orbis",
#else #else
"psp", "psp",
#endif #endif

View File

@ -94,8 +94,6 @@ static ssize_t switch_audio_write(void *data, const void *buf, size_t size)
{ {
if (swa->blocking) if (swa->blocking)
{ {
RARCH_LOG("No buffer, blocking...\n");
while(swa->current_buffer == NULL) while(swa->current_buffer == NULL)
{ {
uint32_t handle_idx = 0; uint32_t handle_idx = 0;

View File

@ -80,7 +80,6 @@ static void mainLoop(void* data)
RARCH_LOG("[Audio]: start mainLoop cpu %u tid %u\n", svcGetCurrentProcessorNumber(), swa->thread.handle); RARCH_LOG("[Audio]: start mainLoop cpu %u tid %u\n", svcGetCurrentProcessorNumber(), swa->thread.handle);
while (swa->running) while (swa->running)
{ {
size_t buf_avail, avail, to_write; size_t buf_avail, avail, to_write;

View File

@ -296,7 +296,6 @@
#define SNDRV_PCM_MMAP_OFFSET_STATUS 0x80000000 #define SNDRV_PCM_MMAP_OFFSET_STATUS 0x80000000
#define SNDRV_PCM_MMAP_OFFSET_CONTROL 0x81000000 #define SNDRV_PCM_MMAP_OFFSET_CONTROL 0x81000000
/** Audio sample format of a PCM. /** Audio sample format of a PCM.
* The first letter specifiers whether the sample is signed or unsigned. * The first letter specifiers whether the sample is signed or unsigned.
* The letter 'S' means signed. The letter 'U' means unsigned. * The letter 'S' means signed. The letter 'U' means unsigned.

View File

@ -29,6 +29,15 @@
#include <mmreg.h> #include <mmreg.h>
#include <audioclient.h> #include <audioclient.h>
#ifdef _MSC_VER
DEFINE_GUID(IID_IAudioClient, 0x1CB9AD4C, 0xDBFA, 0x4C32, 0xB1, 0x78, 0xC2, 0xF5, 0x68, 0xA7, 0x03, 0xB2);
DEFINE_GUID(IID_IAudioRenderClient, 0xF294ACFC, 0x3146, 0x4483, 0xA7, 0xBF, 0xAD, 0xDC, 0xA7, 0xC2, 0x60, 0xE2);
DEFINE_GUID(IID_IMMDeviceEnumerator, 0xA95664D2, 0x9614, 0x4F35, 0xA7, 0x46, 0xDE, 0x8D, 0xB6, 0x36, 0x17, 0xE6);
DEFINE_GUID(CLSID_MMDeviceEnumerator, 0xBCDE0395, 0xE52F, 0x467C, 0x8E, 0x3D, 0xC4, 0x57, 0x92, 0x91, 0x69, 0x2E);
#undef KSDATAFORMAT_SUBTYPE_IEEE_FLOAT
DEFINE_GUID(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, 0x00000003, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71);
#endif
#include <lists/string_list.h> #include <lists/string_list.h>
#include <queues/fifo_queue.h> #include <queues/fifo_queue.h>
@ -580,7 +589,6 @@ static void *wasapi_init(const char *dev_id, unsigned rate, unsigned latency,
unsigned u1, unsigned *u2) unsigned u1, unsigned *u2)
{ {
HRESULT hr; HRESULT hr;
bool com_initialized = false;
UINT32 frame_count = 0; UINT32 frame_count = 0;
REFERENCE_TIME dev_period = 0; REFERENCE_TIME dev_period = 0;
BYTE *dest = NULL; BYTE *dest = NULL;
@ -592,11 +600,6 @@ static void *wasapi_init(const char *dev_id, unsigned rate, unsigned latency,
WASAPI_CHECK(w, "Out of memory", return NULL); WASAPI_CHECK(w, "Out of memory", return NULL);
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
WASAPI_HR_CHECK(hr, "CoInitializeEx", goto error);
com_initialized = true;
w->device = wasapi_init_device(dev_id); w->device = wasapi_init_device(dev_id);
if (!w->device && dev_id) if (!w->device && dev_id)
w->device = wasapi_init_device(NULL); w->device = wasapi_init_device(NULL);
@ -676,8 +679,6 @@ error:
if (w->buffer) if (w->buffer)
fifo_free(w->buffer); fifo_free(w->buffer);
free(w); free(w);
if (com_initialized)
CoUninitialize();
return NULL; return NULL;
} }
@ -889,7 +890,6 @@ static void wasapi_free(void *wh)
_IAudioClient_Stop(w->client); _IAudioClient_Stop(w->client);
WASAPI_RELEASE(w->client); WASAPI_RELEASE(w->client);
WASAPI_RELEASE(w->device); WASAPI_RELEASE(w->device);
CoUninitialize();
if (w->buffer) if (w->buffer)
fifo_free(w->buffer); fifo_free(w->buffer);
free(w); free(w);

View File

@ -318,7 +318,6 @@ static size_t ax_audio_buffer_size(void* data)
return AX_AUDIO_COUNT; return AX_AUDIO_COUNT;
} }
audio_driver_t audio_ax = audio_driver_t audio_ax =
{ {
ax_audio_init, ax_audio_init,

View File

@ -202,10 +202,6 @@ static xaudio2_t *xaudio2_new(unsigned samplerate, unsigned channels,
xaudio2_t *handle = NULL; xaudio2_t *handle = NULL;
WAVEFORMATEX wfx = {0}; WAVEFORMATEX wfx = {0};
#ifndef _XBOX
CoInitializeEx(0, COINIT_MULTITHREADED);
#endif
#if defined(__cplusplus) && !defined(CINTERFACE) #if defined(__cplusplus) && !defined(CINTERFACE)
handle = new xaudio2; handle = new xaudio2;
#else #else
@ -222,8 +218,13 @@ static xaudio2_t *xaudio2_new(unsigned samplerate, unsigned channels,
if (FAILED(XAudio2Create(&handle->pXAudio2, 0, XAUDIO2_DEFAULT_PROCESSOR))) if (FAILED(XAudio2Create(&handle->pXAudio2, 0, XAUDIO2_DEFAULT_PROCESSOR)))
goto error; goto error;
#if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/)
if (FAILED(IXAudio2_CreateMasteringVoice(handle->pXAudio2, &handle->pMasterVoice, channels, samplerate, 0, device, NULL, AudioCategory_GameEffects)))
goto error;
#else
if (FAILED(IXAudio2_CreateMasteringVoice(handle->pXAudio2, &handle->pMasterVoice, channels, samplerate, 0, device, NULL))) if (FAILED(IXAudio2_CreateMasteringVoice(handle->pXAudio2, &handle->pMasterVoice, channels, samplerate, 0, device, NULL)))
goto error; goto error;
#endif
xaudio2_set_wavefmt(&wfx, channels, samplerate); xaudio2_set_wavefmt(&wfx, channels, samplerate);

View File

@ -1,7 +1,5 @@
/* RetroArch - A frontend for libretro. /* RetroArch - A frontend for libretro.
* Copyright (C) 2010-2014 - Hans-Kristian Arntzen * Copyright (C) 2018 - Krzysztof Haładyn
* Copyright (C) 2011-2017 - Daniel De Matteis
* Copyright (C) 2010-2014 - OV2
* *
* RetroArch is free software: you can redistribute it and/or modify it under the terms * RetroArch 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 Found- * of the GNU General Public License as published by the Free Software Found-
@ -15,350 +13,14 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
/* Kinda stripped down. Only contains the bare essentials used in RetroArch. */ #if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/)
/* XAudio 2.7 it part of the old DirectX SDKs. XAudio 2.8+ is part of the
#ifndef XAUDIO2_STRIPPED_H * Windows OS itself (starting from Windows 8). Since UWP lets you access
#define XAUDIO2_STRIPPED_H * only libraries that are built-in to the OS, the headers had to be
* upgraded to the newer version to get audio support working. */
#include <retro_inline.h> #include "xaudio29.h"
#include <retro_environment.h>
/* All structures defined in this file use tight field packing */
#pragma pack(push, 1)
#if defined(__cplusplus) && !defined(CINTERFACE)
#define X2DEFAULT(x) = (x)
#else #else
#define X2DEFAULT(x) /* The old version still has to be there since XAudio 2.8 is not available
* on Windows 7 and earlier */
#include "xaudio27.h"
#endif #endif
#ifdef _XBOX
#include <xtl.h>
#ifndef __cplusplus
#define OPAQUE interface
#endif
#define DEFINE_CLSID(className, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
DEFINE_GUID(CLSID_##className, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8)
#define DEFINE_IID(interfaceName, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
DEFINE_GUID(IID_##interfaceName, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8)
DEFINE_CLSID(XAudio2, 3eda9b49, 2085, 498b, 9b, b2, 39, a6, 77, 84, 93, de);
DEFINE_CLSID(XAudio2_Debug, 47199894, 7cc2, 444d, 98, 73, ce, d2, 56, 2c, c6, 0e);
DEFINE_IID(IXAudio2, 8bcf1f58, 9fe7, 4583, 8a, c6, e2, ad, c4, 65, c8, bb);
#include <audiodefs.h> /* Basic audio data types and constants */
#else
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <basetyps.h>
#include <objbase.h>
#include <mmreg.h>
#ifndef __cplusplus
#undef OPAQUE
#define OPAQUE struct
#endif
#define DEFINE_GUID_X(n, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
static const GUID n = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
#define DEFINE_CLSID_X(className, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
DEFINE_GUID_X(CLSID_##className, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8)
#define DEFINE_IID_X(interfaceName, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
DEFINE_GUID_X(IID_##interfaceName, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8)
#ifndef __cplusplus
#ifndef INTERFACE
#define INTERFACE void
#endif
#endif
DEFINE_CLSID_X(XAudio2, 5a508685, a254, 4fba, 9b, 82, 9a, 24, b0, 03, 06, af); /* 2.7 */
DEFINE_IID_X(IXAudio2, 8bcf1f58, 9fe7, 4583, 8a, c6, e2, ad, c4, 65, c8, bb);
#endif
#ifdef _XBOX
#define XAUDIO2_DEFAULT_FREQ_RATIO 2.0f
#else
#define XAUDIO2_DEFAULT_FREQ_RATIO 4.0f
#endif
#define XAUDIO2_COMMIT_NOW 0
#define XAUDIO2_DEFAULT_CHANNELS 0
#define XAUDIO2_DEFAULT_SAMPLERATE 0
#define XAUDIO2_DEBUG_ENGINE 0x0001
#define XAUDIO2_VOICE_NOSRC 0x0004
typedef enum XAUDIO2_DEVICE_ROLE
{
NotDefaultDevice = 0x0,
DefaultConsoleDevice = 0x1,
DefaultMultimediaDevice = 0x2,
DefaultCommunicationsDevice = 0x4,
DefaultGameDevice = 0x8,
GlobalDefaultDevice = 0xf,
InvalidDeviceRole = ~GlobalDefaultDevice
} XAUDIO2_DEVICE_ROLE;
#ifdef _XBOX
typedef enum XAUDIO2_XBOX_HWTHREAD_SPECIFIER
{
XboxThread0 = 0x01,
XboxThread1 = 0x02,
XboxThread2 = 0x04,
XboxThread3 = 0x08,
XboxThread4 = 0x10,
XboxThread5 = 0x20,
XAUDIO2_ANY_PROCESSOR = XboxThread4,
XAUDIO2_DEFAULT_PROCESSOR = XAUDIO2_ANY_PROCESSOR
} XAUDIO2_XBOX_HWTHREAD_SPECIFIER, XAUDIO2_PROCESSOR;
#else
typedef enum XAUDIO2_WINDOWS_PROCESSOR_SPECIFIER
{
#if defined(__STDC_C89__)
XAUDIO2_ANY_PROCESSOR = 0xffff,
#else
XAUDIO2_ANY_PROCESSOR = 0xffffffff,
#endif
XAUDIO2_DEFAULT_PROCESSOR = XAUDIO2_ANY_PROCESSOR
} XAUDIO2_WINDOWS_PROCESSOR_SPECIFIER, XAUDIO2_PROCESSOR;
#endif
typedef enum XAUDIO2_FILTER_TYPE {
LowPassFilter,
BandPassFilter,
HighPassFilter
} XAUDIO2_FILTER_TYPE;
typedef struct XAUDIO2_DEVICE_DETAILS
{
WCHAR DeviceID[256];
WCHAR DisplayName[256];
XAUDIO2_DEVICE_ROLE Role;
WAVEFORMATEXTENSIBLE OutputFormat;
} XAUDIO2_DEVICE_DETAILS;
/* Forward declarations. */
#ifdef __cplusplus
struct XAUDIO2_VOICE_DETAILS;
struct XAUDIO2_VOICE_SENDS;
struct XAUDIO2_EFFECT_DESCRIPTOR;
struct XAUDIO2_EFFECT_CHAIN;
struct XAUDIO2_FILTER_PARAMETERS;
struct XAUDIO2_BUFFER_WMA;
struct XAUDIO2_VOICE_STATE;
struct XAUDIO2_PERFORMANCE_DATA;
struct XAUDIO2_DEBUG_CONFIGURATION;
struct IXAudio2EngineCallback;
struct IXAudio2SubmixVoice;
#else
typedef OPAQUE XAUDIO2_VOICE_DETAILS XAUDIO2_VOICE_DETAILS;
typedef OPAQUE XAUDIO2_VOICE_SENDS XAUDIO2_VOICE_SENDS;
typedef OPAQUE XAUDIO2_EFFECT_DESCRIPTOR XAUDIO2_EFFECT_DESCRIPTOR;
typedef OPAQUE XAUDIO2_EFFECT_CHAIN XAUDIO2_EFFECT_CHAIN;
typedef OPAQUE XAUDIO2_FILTER_PARAMETERS XAUDIO2_FILTER_PARAMETERS;
typedef OPAQUE XAUDIO2_BUFFER_WMA XAUDIO2_BUFFER_WMA;
typedef OPAQUE XAUDIO2_VOICE_STATE XAUDIO2_VOICE_STATE;
typedef OPAQUE XAUDIO2_PERFORMANCE_DATA XAUDIO2_PERFORMANCE_DATA;
typedef OPAQUE XAUDIO2_DEBUG_CONFIGURATION XAUDIO2_DEBUG_CONFIGURATION;
typedef OPAQUE IXAudio2EngineCallback IXAudio2EngineCallback;
typedef OPAQUE IXAudio2SubmixVoice IXAudio2SubmixVoice;
#endif
typedef struct XAUDIO2_BUFFER
{
UINT32 Flags;
UINT32 AudioBytes;
const BYTE* pAudioData;
UINT32 PlayBegin;
UINT32 PlayLength;
UINT32 LoopBegin;
UINT32 LoopLength;
UINT32 LoopCount;
void *pContext;
} XAUDIO2_BUFFER;
#undef INTERFACE
#define INTERFACE IXAudio2VoiceCallback
DECLARE_INTERFACE(IXAudio2VoiceCallback)
{
STDMETHOD_(void, OnVoiceProcessingPassStart) (THIS_ UINT32 BytesRequired) PURE;
STDMETHOD_(void, OnVoiceProcessingPassEnd) (THIS) PURE;
STDMETHOD_(void, OnStreamEnd) (THIS) PURE;
STDMETHOD_(void, OnBufferStart) (THIS_ void *pBufferContext) PURE;
STDMETHOD_(void, OnBufferEnd) (THIS_ void *pBufferContext) PURE;
STDMETHOD_(void, OnLoopEnd) (THIS_ void *pBufferContext) PURE;
STDMETHOD_(void, OnVoiceError) (THIS_ void *pBufferContext, HRESULT Error) PURE;
};
#undef INTERFACE
#define INTERFACE IXAudio2Voice
DECLARE_INTERFACE(IXAudio2Voice)
{
#define Declare_IXAudio2Voice_Methods() \
STDMETHOD_(void, GetVoiceDetails) (THIS_ XAUDIO2_VOICE_DETAILS* pVoiceDetails) PURE; \
STDMETHOD(SetOutputVoices) (THIS_ const XAUDIO2_VOICE_SENDS* pSendList) PURE; \
STDMETHOD(SetEffectChain) (THIS_ const XAUDIO2_EFFECT_CHAIN* pEffectChain) PURE; \
STDMETHOD(EnableEffect) (THIS_ UINT32 EffectIndex, \
UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
STDMETHOD(DisableEffect) (THIS_ UINT32 EffectIndex, \
UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
STDMETHOD_(void, GetEffectState) (THIS_ UINT32 EffectIndex, BOOL* pEnabled) PURE; \
STDMETHOD(SetEffectParameters) (THIS_ UINT32 EffectIndex, \
const void *pParameters, \
UINT32 ParametersByteSize, \
UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
STDMETHOD(GetEffectParameters) (THIS_ UINT32 EffectIndex, void *pParameters, \
UINT32 ParametersByteSize) PURE; \
STDMETHOD(SetFilterParameters) (THIS_ const XAUDIO2_FILTER_PARAMETERS* pParameters, \
UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
STDMETHOD_(void, GetFilterParameters) (THIS_ XAUDIO2_FILTER_PARAMETERS* pParameters) PURE; \
STDMETHOD_(void, SetOutputFilterParameters) (THIS_ IXAudio2Voice *voice, const XAUDIO2_FILTER_PARAMETERS* param, \
UINT32 op X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
STDMETHOD_(void, GetOutputFilterParameters) (THIS_ IXAudio2Voice *voice, XAUDIO2_FILTER_PARAMETERS* param) PURE; \
STDMETHOD(SetVolume) (THIS_ float Volume, \
UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
STDMETHOD_(void, GetVolume) (THIS_ float* pVolume) PURE; \
STDMETHOD(SetChannelVolumes) (THIS_ UINT32 Channels, const float* pVolumes, \
UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
STDMETHOD_(void, GetChannelVolumes) (THIS_ UINT32 Channels, float* pVolumes) PURE; \
STDMETHOD(SetOutputMatrix) (THIS_ IXAudio2Voice* pDestinationVoice, \
UINT32 SourceChannels, UINT32 DestinationChannels, \
const float* pLevelMatrix, \
UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
STDMETHOD_(void, GetOutputMatrix) (THIS_ IXAudio2Voice* pDestinationVoice, \
UINT32 SourceChannels, UINT32 DestinationChannels, \
float* pLevelMatrix) PURE; \
STDMETHOD_(void, DestroyVoice) (THIS) PURE
Declare_IXAudio2Voice_Methods();
};
#undef INTERFACE
#define INTERFACE IXAudio2MasteringVoice
DECLARE_INTERFACE_(IXAudio2MasteringVoice, IXAudio2Voice)
{
Declare_IXAudio2Voice_Methods();
};
#undef INTERFACE
#define INTERFACE IXAudio2SourceVoice
DECLARE_INTERFACE_(IXAudio2SourceVoice, IXAudio2Voice)
{
Declare_IXAudio2Voice_Methods();
STDMETHOD(Start) (THIS_ UINT32 Flags, UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE;
STDMETHOD(Stop) (THIS_ UINT32 Flags, UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE;
STDMETHOD(SubmitSourceBuffer) (THIS_ const XAUDIO2_BUFFER* pBuffer, const XAUDIO2_BUFFER_WMA* pBufferWMA X2DEFAULT(NULL)) PURE;
STDMETHOD(FlushSourceBuffers) (THIS) PURE;
STDMETHOD(Discontinuity) (THIS) PURE;
STDMETHOD(ExitLoop) (THIS_ UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE;
STDMETHOD_(void, GetState) (THIS_ XAUDIO2_VOICE_STATE* pVoiceState) PURE;
STDMETHOD(SetFrequencyRatio) (THIS_ float Ratio,
UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE;
STDMETHOD_(void, GetFrequencyRatio) (THIS_ float* pRatio) PURE;
};
#undef INTERFACE
#define INTERFACE IXAudio2
DECLARE_INTERFACE_(IXAudio2, IUnknown)
{
STDMETHOD(QueryInterface) (THIS_ REFIID riid, void** ppvInterface) PURE;
STDMETHOD_(ULONG, AddRef) (THIS) PURE;
STDMETHOD_(ULONG, Release) (THIS) PURE;
STDMETHOD(GetDeviceCount) (THIS_ UINT32* pCount) PURE;
STDMETHOD(GetDeviceDetails) (THIS_ UINT32 Index, XAUDIO2_DEVICE_DETAILS* pDeviceDetails) PURE;
STDMETHOD(Initialize) (THIS_ UINT32 Flags X2DEFAULT(0),
XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR)) PURE;
STDMETHOD(RegisterForCallbacks) (IXAudio2EngineCallback* pCallback) PURE;
STDMETHOD_(void, UnregisterForCallbacks) (IXAudio2EngineCallback* pCallback) PURE;
STDMETHOD(CreateSourceVoice) (THIS_ IXAudio2SourceVoice** ppSourceVoice,
const WAVEFORMATEX* pSourceFormat,
UINT32 Flags X2DEFAULT(0),
float MaxFrequencyRatio X2DEFAULT(XAUDIO2_DEFAULT_FREQ_RATIO),
IXAudio2VoiceCallback* pCallback X2DEFAULT(NULL),
const XAUDIO2_VOICE_SENDS* pSendList X2DEFAULT(NULL),
const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE;
STDMETHOD(CreateSubmixVoice) (THIS_ IXAudio2SubmixVoice** ppSubmixVoice,
UINT32 InputChannels, UINT32 InputSampleRate,
UINT32 Flags X2DEFAULT(0), UINT32 ProcessingStage X2DEFAULT(0),
const XAUDIO2_VOICE_SENDS* pSendList X2DEFAULT(NULL),
const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE;
STDMETHOD(CreateMasteringVoice) (THIS_ IXAudio2MasteringVoice** ppMasteringVoice,
UINT32 InputChannels X2DEFAULT(XAUDIO2_DEFAULT_CHANNELS),
UINT32 InputSampleRate X2DEFAULT(XAUDIO2_DEFAULT_SAMPLERATE),
UINT32 Flags X2DEFAULT(0), UINT32 DeviceIndex X2DEFAULT(0),
const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE;
STDMETHOD(StartEngine) (THIS) PURE;
STDMETHOD_(void, StopEngine) (THIS) PURE;
STDMETHOD(CommitChanges) (THIS_ UINT32 OperationSet) PURE;
STDMETHOD_(void, GetPerformanceData) (THIS_ XAUDIO2_PERFORMANCE_DATA* pPerfData) PURE;
STDMETHOD_(void, SetDebugConfiguration) (THIS_ const XAUDIO2_DEBUG_CONFIGURATION* pDebugConfiguration,
void *pReserved X2DEFAULT(NULL)) PURE;
};
#if defined(__cplusplus) && !defined(CINTERFACE)
/* C++ hooks */
#define IXAudio2_Initialize(handle,a,b) handle->Initialize(a, b)
#define IXAudio2SourceVoice_SubmitSourceBuffer(handle, a, b) handle->SubmitSourceBuffer(a, b)
#define IXAudio2SourceVoice_Stop(handle, a, b) handle->Stop(a, b)
#define IXAudio2SourceVoice_DestroyVoice(handle) handle->DestroyVoice()
#define IXAudio2MasteringVoice_DestroyVoice(handle) handle->DestroyVoice()
#define IXAudio2_Release(handle) handle->Release()
#define IXAudio2_CreateSourceVoice(handle, a, b, c, d, e, f, g) handle->CreateSourceVoice(a, b, c, d, e, f, g)
#define IXAudio2_CreateMasteringVoice(handle, a, b, c, d, e, f) handle->CreateMasteringVoice(a, b, c, d, e, f)
#define IXAudio2SourceVoice_Start(handle, a, b) handle->Start(a, b)
#else
/* C hooks */
#define IXAudio2_Initialize(handle,a,b) (handle)->lpVtbl->Initialize(handle, a, b)
#define IXAudio2_Release(handle) (handle)->lpVtbl->Release(handle)
#define IXAudio2_CreateSourceVoice(handle,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain) (handle)->lpVtbl->CreateSourceVoice(handle, ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain)
#define IXAudio2_CreateMasteringVoice(handle,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceIndex,pEffectChain) (handle)->lpVtbl->CreateMasteringVoice(handle, ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceIndex,pEffectChain)
#define IXAudio2_GetDeviceCount(handle, puCount) (handle)->lpVtbl->GetDeviceCount(handle, puCount)
#define IXAudio2_GetDeviceDetails(handle, Index,pDeviceDetails) (handle)->lpVtbl->GetDeviceDetails(handle, Index, pDeviceDetails)
#define IXAudio2SourceVoice_Start(handle, Flags, OperationSet) (handle)->lpVtbl->Start(handle, Flags, OperationSet)
#define IXAudio2SourceVoice_Stop(handle, Flags, OperationSet) (handle)->lpVtbl->Stop(handle, Flags, OperationSet)
#define IXAudio2SourceVoice_SubmitSourceBuffer(handle, pBuffer, pBufferWMA) (handle)->lpVtbl->SubmitSourceBuffer(handle, pBuffer, pBufferWMA)
#define IXAudio2SourceVoice_DestroyVoice(handle) (handle)->lpVtbl->DestroyVoice(handle)
#define IXAudio2MasteringVoice_DestroyVoice(handle) (handle)->lpVtbl->DestroyVoice(handle)
#endif
#ifdef _XBOX
STDAPI XAudio2Create(__deref_out IXAudio2** ppXAudio2, UINT32 Flags X2DEFAULT(0),
XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR));
#else
static INLINE HRESULT XAudio2Create(IXAudio2 **ppXAudio2, UINT32 flags, XAUDIO2_PROCESSOR proc)
{
IXAudio2 *pXAudio2 = NULL;
#ifdef __cplusplus
HRESULT hr = CoCreateInstance(CLSID_XAudio2, NULL, CLSCTX_INPROC_SERVER, IID_IXAudio2, (void**)&pXAudio2);
#else
HRESULT hr = CoCreateInstance(&CLSID_XAudio2, NULL, CLSCTX_INPROC_SERVER, &IID_IXAudio2, (void**)&pXAudio2);
#endif
if (SUCCEEDED(hr))
{
hr = IXAudio2_Initialize(pXAudio2, 0, XAUDIO2_DEFAULT_PROCESSOR);
if (SUCCEEDED(hr))
*ppXAudio2 = pXAudio2;
else
IXAudio2_Release(pXAudio2);
}
return hr;
}
#endif
/* Undo the #pragma pack(push, 1) directive at the top of this file */
#pragma pack(pop)
#endif

362
audio/drivers/xaudio27.h Normal file
View File

@ -0,0 +1,362 @@
/* RetroArch - A frontend for libretro.
* Copyright (C) 2010-2014 - Hans-Kristian Arntzen
* Copyright (C) 2011-2017 - Daniel De Matteis
* Copyright (C) 2010-2014 - OV2
*
* RetroArch 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 Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch 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 RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
/* Kinda stripped down. Only contains the bare essentials used in RetroArch. */
#ifndef XAUDIO2_STRIPPED_H
#define XAUDIO2_STRIPPED_H
#include <retro_inline.h>
#include <retro_environment.h>
/* All structures defined in this file use tight field packing */
#pragma pack(push, 1)
#if defined(__cplusplus) && !defined(CINTERFACE)
#define X2DEFAULT(x) = (x)
#else
#define X2DEFAULT(x)
#endif
#ifdef _XBOX
#include <xtl.h>
#ifndef __cplusplus
#define OPAQUE interface
#endif
#define DEFINE_CLSID(className, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
DEFINE_GUID(CLSID_##className, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8)
#define DEFINE_IID(interfaceName, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
DEFINE_GUID(IID_##interfaceName, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8)
DEFINE_CLSID(XAudio2, 3eda9b49, 2085, 498b, 9b, b2, 39, a6, 77, 84, 93, de);
DEFINE_CLSID(XAudio2_Debug, 47199894, 7cc2, 444d, 98, 73, ce, d2, 56, 2c, c6, 0e);
DEFINE_IID(IXAudio2, 8bcf1f58, 9fe7, 4583, 8a, c6, e2, ad, c4, 65, c8, bb);
#include <audiodefs.h> /* Basic audio data types and constants */
#else
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <basetyps.h>
#include <objbase.h>
#include <mmreg.h>
#ifndef __cplusplus
#undef OPAQUE
#define OPAQUE struct
#endif
#define DEFINE_GUID_X(n, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
static const GUID n = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
#define DEFINE_CLSID_X(className, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
DEFINE_GUID_X(CLSID_##className, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8)
#define DEFINE_IID_X(interfaceName, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
DEFINE_GUID_X(IID_##interfaceName, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8)
#ifndef __cplusplus
#ifndef INTERFACE
#define INTERFACE void
#endif
#endif
DEFINE_CLSID_X(XAudio2, 5a508685, a254, 4fba, 9b, 82, 9a, 24, b0, 03, 06, af); /* 2.7 */
DEFINE_IID_X(IXAudio2, 8bcf1f58, 9fe7, 4583, 8a, c6, e2, ad, c4, 65, c8, bb);
#endif
#ifdef _XBOX
#define XAUDIO2_DEFAULT_FREQ_RATIO 2.0f
#else
#define XAUDIO2_DEFAULT_FREQ_RATIO 4.0f
#endif
#define XAUDIO2_COMMIT_NOW 0
#define XAUDIO2_DEFAULT_CHANNELS 0
#define XAUDIO2_DEFAULT_SAMPLERATE 0
#define XAUDIO2_DEBUG_ENGINE 0x0001
#define XAUDIO2_VOICE_NOSRC 0x0004
typedef enum XAUDIO2_DEVICE_ROLE
{
NotDefaultDevice = 0x0,
DefaultConsoleDevice = 0x1,
DefaultMultimediaDevice = 0x2,
DefaultCommunicationsDevice = 0x4,
DefaultGameDevice = 0x8,
GlobalDefaultDevice = 0xf,
InvalidDeviceRole = ~GlobalDefaultDevice
} XAUDIO2_DEVICE_ROLE;
#ifdef _XBOX
typedef enum XAUDIO2_XBOX_HWTHREAD_SPECIFIER
{
XboxThread0 = 0x01,
XboxThread1 = 0x02,
XboxThread2 = 0x04,
XboxThread3 = 0x08,
XboxThread4 = 0x10,
XboxThread5 = 0x20,
XAUDIO2_ANY_PROCESSOR = XboxThread4,
XAUDIO2_DEFAULT_PROCESSOR = XAUDIO2_ANY_PROCESSOR
} XAUDIO2_XBOX_HWTHREAD_SPECIFIER, XAUDIO2_PROCESSOR;
#else
typedef enum XAUDIO2_WINDOWS_PROCESSOR_SPECIFIER
{
#if defined(__STDC_C89__)
XAUDIO2_ANY_PROCESSOR = 0xffff,
#else
XAUDIO2_ANY_PROCESSOR = 0xffffffff,
#endif
XAUDIO2_DEFAULT_PROCESSOR = XAUDIO2_ANY_PROCESSOR
} XAUDIO2_WINDOWS_PROCESSOR_SPECIFIER, XAUDIO2_PROCESSOR;
#endif
typedef enum XAUDIO2_FILTER_TYPE {
LowPassFilter,
BandPassFilter,
HighPassFilter
} XAUDIO2_FILTER_TYPE;
typedef struct XAUDIO2_DEVICE_DETAILS
{
WCHAR DeviceID[256];
WCHAR DisplayName[256];
XAUDIO2_DEVICE_ROLE Role;
WAVEFORMATEXTENSIBLE OutputFormat;
} XAUDIO2_DEVICE_DETAILS;
/* Forward declarations. */
#ifdef __cplusplus
struct XAUDIO2_VOICE_DETAILS;
struct XAUDIO2_VOICE_SENDS;
struct XAUDIO2_EFFECT_DESCRIPTOR;
struct XAUDIO2_EFFECT_CHAIN;
struct XAUDIO2_FILTER_PARAMETERS;
struct XAUDIO2_BUFFER_WMA;
struct XAUDIO2_VOICE_STATE;
struct XAUDIO2_PERFORMANCE_DATA;
struct XAUDIO2_DEBUG_CONFIGURATION;
struct IXAudio2EngineCallback;
struct IXAudio2SubmixVoice;
#else
typedef OPAQUE XAUDIO2_VOICE_DETAILS XAUDIO2_VOICE_DETAILS;
typedef OPAQUE XAUDIO2_VOICE_SENDS XAUDIO2_VOICE_SENDS;
typedef OPAQUE XAUDIO2_EFFECT_DESCRIPTOR XAUDIO2_EFFECT_DESCRIPTOR;
typedef OPAQUE XAUDIO2_EFFECT_CHAIN XAUDIO2_EFFECT_CHAIN;
typedef OPAQUE XAUDIO2_FILTER_PARAMETERS XAUDIO2_FILTER_PARAMETERS;
typedef OPAQUE XAUDIO2_BUFFER_WMA XAUDIO2_BUFFER_WMA;
typedef OPAQUE XAUDIO2_VOICE_STATE XAUDIO2_VOICE_STATE;
typedef OPAQUE XAUDIO2_PERFORMANCE_DATA XAUDIO2_PERFORMANCE_DATA;
typedef OPAQUE XAUDIO2_DEBUG_CONFIGURATION XAUDIO2_DEBUG_CONFIGURATION;
typedef OPAQUE IXAudio2EngineCallback IXAudio2EngineCallback;
typedef OPAQUE IXAudio2SubmixVoice IXAudio2SubmixVoice;
#endif
typedef struct XAUDIO2_BUFFER
{
UINT32 Flags;
UINT32 AudioBytes;
const BYTE* pAudioData;
UINT32 PlayBegin;
UINT32 PlayLength;
UINT32 LoopBegin;
UINT32 LoopLength;
UINT32 LoopCount;
void *pContext;
} XAUDIO2_BUFFER;
#undef INTERFACE
#define INTERFACE IXAudio2VoiceCallback
DECLARE_INTERFACE(IXAudio2VoiceCallback)
{
STDMETHOD_(void, OnVoiceProcessingPassStart) (THIS_ UINT32 BytesRequired) PURE;
STDMETHOD_(void, OnVoiceProcessingPassEnd) (THIS) PURE;
STDMETHOD_(void, OnStreamEnd) (THIS) PURE;
STDMETHOD_(void, OnBufferStart) (THIS_ void *pBufferContext) PURE;
STDMETHOD_(void, OnBufferEnd) (THIS_ void *pBufferContext) PURE;
STDMETHOD_(void, OnLoopEnd) (THIS_ void *pBufferContext) PURE;
STDMETHOD_(void, OnVoiceError) (THIS_ void *pBufferContext, HRESULT Error) PURE;
};
#undef INTERFACE
#define INTERFACE IXAudio2Voice
DECLARE_INTERFACE(IXAudio2Voice)
{
#define Declare_IXAudio2Voice_Methods() \
STDMETHOD_(void, GetVoiceDetails) (THIS_ XAUDIO2_VOICE_DETAILS* pVoiceDetails) PURE; \
STDMETHOD(SetOutputVoices) (THIS_ const XAUDIO2_VOICE_SENDS* pSendList) PURE; \
STDMETHOD(SetEffectChain) (THIS_ const XAUDIO2_EFFECT_CHAIN* pEffectChain) PURE; \
STDMETHOD(EnableEffect) (THIS_ UINT32 EffectIndex, \
UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
STDMETHOD(DisableEffect) (THIS_ UINT32 EffectIndex, \
UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
STDMETHOD_(void, GetEffectState) (THIS_ UINT32 EffectIndex, BOOL* pEnabled) PURE; \
STDMETHOD(SetEffectParameters) (THIS_ UINT32 EffectIndex, \
const void *pParameters, \
UINT32 ParametersByteSize, \
UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
STDMETHOD(GetEffectParameters) (THIS_ UINT32 EffectIndex, void *pParameters, \
UINT32 ParametersByteSize) PURE; \
STDMETHOD(SetFilterParameters) (THIS_ const XAUDIO2_FILTER_PARAMETERS* pParameters, \
UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
STDMETHOD_(void, GetFilterParameters) (THIS_ XAUDIO2_FILTER_PARAMETERS* pParameters) PURE; \
STDMETHOD_(void, SetOutputFilterParameters) (THIS_ IXAudio2Voice *voice, const XAUDIO2_FILTER_PARAMETERS* param, \
UINT32 op X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
STDMETHOD_(void, GetOutputFilterParameters) (THIS_ IXAudio2Voice *voice, XAUDIO2_FILTER_PARAMETERS* param) PURE; \
STDMETHOD(SetVolume) (THIS_ float Volume, \
UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
STDMETHOD_(void, GetVolume) (THIS_ float* pVolume) PURE; \
STDMETHOD(SetChannelVolumes) (THIS_ UINT32 Channels, const float* pVolumes, \
UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
STDMETHOD_(void, GetChannelVolumes) (THIS_ UINT32 Channels, float* pVolumes) PURE; \
STDMETHOD(SetOutputMatrix) (THIS_ IXAudio2Voice* pDestinationVoice, \
UINT32 SourceChannels, UINT32 DestinationChannels, \
const float* pLevelMatrix, \
UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \
STDMETHOD_(void, GetOutputMatrix) (THIS_ IXAudio2Voice* pDestinationVoice, \
UINT32 SourceChannels, UINT32 DestinationChannels, \
float* pLevelMatrix) PURE; \
STDMETHOD_(void, DestroyVoice) (THIS) PURE
Declare_IXAudio2Voice_Methods();
};
#undef INTERFACE
#define INTERFACE IXAudio2MasteringVoice
DECLARE_INTERFACE_(IXAudio2MasteringVoice, IXAudio2Voice)
{
Declare_IXAudio2Voice_Methods();
};
#undef INTERFACE
#define INTERFACE IXAudio2SourceVoice
DECLARE_INTERFACE_(IXAudio2SourceVoice, IXAudio2Voice)
{
Declare_IXAudio2Voice_Methods();
STDMETHOD(Start) (THIS_ UINT32 Flags, UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE;
STDMETHOD(Stop) (THIS_ UINT32 Flags, UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE;
STDMETHOD(SubmitSourceBuffer) (THIS_ const XAUDIO2_BUFFER* pBuffer, const XAUDIO2_BUFFER_WMA* pBufferWMA X2DEFAULT(NULL)) PURE;
STDMETHOD(FlushSourceBuffers) (THIS) PURE;
STDMETHOD(Discontinuity) (THIS) PURE;
STDMETHOD(ExitLoop) (THIS_ UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE;
STDMETHOD_(void, GetState) (THIS_ XAUDIO2_VOICE_STATE* pVoiceState) PURE;
STDMETHOD(SetFrequencyRatio) (THIS_ float Ratio,
UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE;
STDMETHOD_(void, GetFrequencyRatio) (THIS_ float* pRatio) PURE;
};
#undef INTERFACE
#define INTERFACE IXAudio2
DECLARE_INTERFACE_(IXAudio2, IUnknown)
{
STDMETHOD(QueryInterface) (THIS_ REFIID riid, void** ppvInterface) PURE;
STDMETHOD_(ULONG, AddRef) (THIS) PURE;
STDMETHOD_(ULONG, Release) (THIS) PURE;
STDMETHOD(GetDeviceCount) (THIS_ UINT32* pCount) PURE;
STDMETHOD(GetDeviceDetails) (THIS_ UINT32 Index, XAUDIO2_DEVICE_DETAILS* pDeviceDetails) PURE;
STDMETHOD(Initialize) (THIS_ UINT32 Flags X2DEFAULT(0),
XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR)) PURE;
STDMETHOD(RegisterForCallbacks) (IXAudio2EngineCallback* pCallback) PURE;
STDMETHOD_(void, UnregisterForCallbacks) (IXAudio2EngineCallback* pCallback) PURE;
STDMETHOD(CreateSourceVoice) (THIS_ IXAudio2SourceVoice** ppSourceVoice,
const WAVEFORMATEX* pSourceFormat,
UINT32 Flags X2DEFAULT(0),
float MaxFrequencyRatio X2DEFAULT(XAUDIO2_DEFAULT_FREQ_RATIO),
IXAudio2VoiceCallback* pCallback X2DEFAULT(NULL),
const XAUDIO2_VOICE_SENDS* pSendList X2DEFAULT(NULL),
const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE;
STDMETHOD(CreateSubmixVoice) (THIS_ IXAudio2SubmixVoice** ppSubmixVoice,
UINT32 InputChannels, UINT32 InputSampleRate,
UINT32 Flags X2DEFAULT(0), UINT32 ProcessingStage X2DEFAULT(0),
const XAUDIO2_VOICE_SENDS* pSendList X2DEFAULT(NULL),
const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE;
STDMETHOD(CreateMasteringVoice) (THIS_ IXAudio2MasteringVoice** ppMasteringVoice,
UINT32 InputChannels X2DEFAULT(XAUDIO2_DEFAULT_CHANNELS),
UINT32 InputSampleRate X2DEFAULT(XAUDIO2_DEFAULT_SAMPLERATE),
UINT32 Flags X2DEFAULT(0), UINT32 DeviceIndex X2DEFAULT(0),
const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE;
STDMETHOD(StartEngine) (THIS) PURE;
STDMETHOD_(void, StopEngine) (THIS) PURE;
STDMETHOD(CommitChanges) (THIS_ UINT32 OperationSet) PURE;
STDMETHOD_(void, GetPerformanceData) (THIS_ XAUDIO2_PERFORMANCE_DATA* pPerfData) PURE;
STDMETHOD_(void, SetDebugConfiguration) (THIS_ const XAUDIO2_DEBUG_CONFIGURATION* pDebugConfiguration,
void *pReserved X2DEFAULT(NULL)) PURE;
};
#if defined(__cplusplus) && !defined(CINTERFACE)
/* C++ hooks */
#define IXAudio2_Initialize(handle,a,b) handle->Initialize(a, b)
#define IXAudio2SourceVoice_SubmitSourceBuffer(handle, a, b) handle->SubmitSourceBuffer(a, b)
#define IXAudio2SourceVoice_Stop(handle, a, b) handle->Stop(a, b)
#define IXAudio2SourceVoice_DestroyVoice(handle) handle->DestroyVoice()
#define IXAudio2MasteringVoice_DestroyVoice(handle) handle->DestroyVoice()
#define IXAudio2_Release(handle) handle->Release()
#define IXAudio2_CreateSourceVoice(handle, a, b, c, d, e, f, g) handle->CreateSourceVoice(a, b, c, d, e, f, g)
#define IXAudio2_CreateMasteringVoice(handle, a, b, c, d, e, f) handle->CreateMasteringVoice(a, b, c, d, e, f)
#define IXAudio2SourceVoice_Start(handle, a, b) handle->Start(a, b)
#else
/* C hooks */
#define IXAudio2_Initialize(handle,a,b) (handle)->lpVtbl->Initialize(handle, a, b)
#define IXAudio2_Release(handle) (handle)->lpVtbl->Release(handle)
#define IXAudio2_CreateSourceVoice(handle,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain) (handle)->lpVtbl->CreateSourceVoice(handle, ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain)
#define IXAudio2_CreateMasteringVoice(handle,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceIndex,pEffectChain) (handle)->lpVtbl->CreateMasteringVoice(handle, ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceIndex,pEffectChain)
#define IXAudio2_GetDeviceCount(handle, puCount) (handle)->lpVtbl->GetDeviceCount(handle, puCount)
#define IXAudio2_GetDeviceDetails(handle, Index,pDeviceDetails) (handle)->lpVtbl->GetDeviceDetails(handle, Index, pDeviceDetails)
#define IXAudio2SourceVoice_Start(handle, Flags, OperationSet) (handle)->lpVtbl->Start(handle, Flags, OperationSet)
#define IXAudio2SourceVoice_Stop(handle, Flags, OperationSet) (handle)->lpVtbl->Stop(handle, Flags, OperationSet)
#define IXAudio2SourceVoice_SubmitSourceBuffer(handle, pBuffer, pBufferWMA) (handle)->lpVtbl->SubmitSourceBuffer(handle, pBuffer, pBufferWMA)
#define IXAudio2SourceVoice_DestroyVoice(handle) (handle)->lpVtbl->DestroyVoice(handle)
#define IXAudio2MasteringVoice_DestroyVoice(handle) (handle)->lpVtbl->DestroyVoice(handle)
#endif
#ifdef _XBOX
STDAPI XAudio2Create(__deref_out IXAudio2** ppXAudio2, UINT32 Flags X2DEFAULT(0),
XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR));
#else
static INLINE HRESULT XAudio2Create(IXAudio2 **ppXAudio2, UINT32 flags, XAUDIO2_PROCESSOR proc)
{
IXAudio2 *pXAudio2 = NULL;
#ifdef __cplusplus
HRESULT hr = CoCreateInstance(CLSID_XAudio2, NULL, CLSCTX_INPROC_SERVER, IID_IXAudio2, (void**)&pXAudio2);
#else
HRESULT hr = CoCreateInstance(&CLSID_XAudio2, NULL, CLSCTX_INPROC_SERVER, &IID_IXAudio2, (void**)&pXAudio2);
#endif
if (SUCCEEDED(hr))
{
hr = IXAudio2_Initialize(pXAudio2, 0, XAUDIO2_DEFAULT_PROCESSOR);
if (SUCCEEDED(hr))
*ppXAudio2 = pXAudio2;
else
IXAudio2_Release(pXAudio2);
}
return hr;
}
#endif
/* Undo the #pragma pack(push, 1) directive at the top of this file */
#pragma pack(pop)
#endif

1306
audio/drivers/xaudio29.h Normal file

File diff suppressed because it is too large Load Diff

View File

@ -55,7 +55,6 @@ typedef struct rarch_CC_resampler
void (*process)(void *re, struct resampler_data *data); void (*process)(void *re, struct resampler_data *data);
} rarch_CC_resampler_t; } rarch_CC_resampler_t;
#ifdef _MIPS_ARCH_ALLEGREX #ifdef _MIPS_ARCH_ALLEGREX
static void resampler_CC_process(void *re_, struct resampler_data *data) static void resampler_CC_process(void *re_, struct resampler_data *data)
{ {
@ -115,7 +114,6 @@ static void resampler_CC_process(void *re_, struct resampler_data *data)
"vadd.q c720, c720, c620 \n" "vadd.q c720, c720, c620 \n"
"vadd.s s730, s730, s730[1] \n" "vadd.s s730, s730, s730[1] \n"
"mfv %0, s730 \n" "mfv %0, s730 \n"
@ -216,7 +214,6 @@ static void resampler_CC_downsample(void *re_, struct resampler_data *data)
vec_ww1 = _mm_mul_ps(vec_w1, vec_w1); vec_ww1 = _mm_mul_ps(vec_w1, vec_w1);
vec_ww2 = _mm_mul_ps(vec_w2, vec_w2); vec_ww2 = _mm_mul_ps(vec_w2, vec_w2);
vec_ww1 = _mm_mul_ps(vec_ww1, _mm_sub_ps(_mm_set_ps1(3.0),vec_ww1)); vec_ww1 = _mm_mul_ps(vec_ww1, _mm_sub_ps(_mm_set_ps1(3.0),vec_ww1));
vec_ww2 = _mm_mul_ps(vec_ww2, _mm_sub_ps(_mm_set_ps1(3.0),vec_ww2)); vec_ww2 = _mm_mul_ps(vec_ww2, _mm_sub_ps(_mm_set_ps1(3.0),vec_ww2));
@ -307,7 +304,6 @@ static void resampler_CC_upsample(void *re_, struct resampler_data *data)
vec_ww1 = _mm_mul_ps(vec_w1, vec_w1); vec_ww1 = _mm_mul_ps(vec_w1, vec_w1);
vec_ww2 = _mm_mul_ps(vec_w2, vec_w2); vec_ww2 = _mm_mul_ps(vec_w2, vec_w2);
vec_ww1 = _mm_mul_ps(vec_ww1,_mm_sub_ps(_mm_set_ps1(3.0),vec_ww1)); vec_ww1 = _mm_mul_ps(vec_ww1,_mm_sub_ps(_mm_set_ps1(3.0),vec_ww1));
vec_ww2 = _mm_mul_ps(vec_ww2,_mm_sub_ps(_mm_set_ps1(3.0),vec_ww2)); vec_ww2 = _mm_mul_ps(vec_ww2,_mm_sub_ps(_mm_set_ps1(3.0),vec_ww2));
@ -349,7 +345,6 @@ static void resampler_CC_upsample(void *re_, struct resampler_data *data)
data->output_frames = outp - (audio_frame_float_t*)data->data_out; data->output_frames = outp - (audio_frame_float_t*)data->data_out;
} }
#elif defined (__ARM_NEON__) && !defined(DONT_WANT_ARM_OPTIMIZATIONS) #elif defined (__ARM_NEON__) && !defined(DONT_WANT_ARM_OPTIMIZATIONS)
#define CC_RESAMPLER_IDENT "NEON" #define CC_RESAMPLER_IDENT "NEON"
@ -492,7 +487,6 @@ static void resampler_CC_process(void *re_, struct resampler_data *data)
re->process(re_, data); re->process(re_, data);
} }
static void *resampler_CC_init(const struct resampler_config *config, static void *resampler_CC_init(const struct resampler_config *config,
double bandwidth_mod, double bandwidth_mod,
enum resampler_quality quality, enum resampler_quality quality,

View File

@ -46,7 +46,6 @@
#define NETWORK_COMPAT_HEADERS 1 #define NETWORK_COMPAT_HEADERS 1
#endif #endif
#ifdef NETWORK_COMPAT_HEADERS #ifdef NETWORK_COMPAT_HEADERS
#include <sys/socket.h> #include <sys/socket.h>
#include <netdb.h> #include <netdb.h>
@ -158,7 +157,6 @@ static int rsnd_poll(struct pollfd *fd, int numfd, int timeout);
static void rsnd_cb_thread(void *thread_data); static void rsnd_cb_thread(void *thread_data);
static void rsnd_thread(void *thread_data); static void rsnd_thread(void *thread_data);
/* Determine whether we're running big- or little endian */ /* Determine whether we're running big- or little endian */
static INLINE int rsnd_is_little_endian(void) static INLINE int rsnd_is_little_endian(void)
{ {
@ -242,7 +240,6 @@ static int rsnd_connect_server( rsound_t *rd )
rd->conn_type = RSD_CONN_TCP; rd->conn_type = RSD_CONN_TCP;
rd->conn.socket = net_socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); rd->conn.socket = net_socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if ( rd->conn.socket < 0 ) if ( rd->conn.socket < 0 )
goto error; goto error;
@ -312,7 +309,6 @@ static int rsnd_send_header_info(rsound_t *rd)
#define FRAMESIZE 34 #define FRAMESIZE 34
#define FORMAT 42 #define FORMAT 42
uint32_t temp_rate = rd->rate; uint32_t temp_rate = rd->rate;
uint16_t temp_channels = rd->channels; uint16_t temp_channels = rd->channels;
@ -980,7 +976,6 @@ static int rsnd_close_ctl(rsound_t *rd)
return 0; return 0;
} }
// Sends delay info request to server on the ctl socket. This code section isn't critical, and will work if it works. // Sends delay info request to server on the ctl socket. This code section isn't critical, and will work if it works.
// It will never block. // It will never block.
static int rsnd_send_info_query(rsound_t *rd) static int rsnd_send_info_query(rsound_t *rd)
@ -1296,7 +1291,6 @@ static int rsnd_reset(rsound_t *rd)
return 0; return 0;
} }
int rsd_stop(rsound_t *rd) int rsd_stop(rsound_t *rd)
{ {
retro_assert(rd != NULL); retro_assert(rd != NULL);
@ -1403,7 +1397,6 @@ int rsd_exec(rsound_t *rsound)
return fd; return fd;
} }
/* ioctl()-ish param setting :D */ /* ioctl()-ish param setting :D */
int rsd_set_param(rsound_t *rd, enum rsd_settings option, void* param) int rsd_set_param(rsound_t *rd, enum rsd_settings option, void* param)
{ {
@ -1493,7 +1486,6 @@ void rsd_delay_wait(rsound_t *rd)
/* Latency of stream in ms */ /* Latency of stream in ms */
int latency_ms = rsd_delay_ms(rd); int latency_ms = rsd_delay_ms(rd);
/* Should we sleep for a while to keep the latency low? */ /* Should we sleep for a while to keep the latency low? */
if ( rd->max_latency < latency_ms ) if ( rd->max_latency < latency_ms )
{ {

View File

@ -46,7 +46,6 @@ void _init_vita_heap(void) {
_newlib_vm_memblock = 0; _newlib_vm_memblock = 0;
} }
// Create a mutex to use inside _sbrk_r // Create a mutex to use inside _sbrk_r
if (sceKernelCreateLwMutex((struct SceKernelLwMutexWork*)_newlib_sbrk_mutex, "sbrk mutex", 0, 0, 0) < 0) { if (sceKernelCreateLwMutex((struct SceKernelLwMutexWork*)_newlib_sbrk_mutex, "sbrk mutex", 0, 0, 0) < 0) {
goto failure; goto failure;

59
cheevos-new/badges.c Normal file
View File

@ -0,0 +1,59 @@
#include <file/file_path.h>
#include <string/stdstring.h>
#include <streams/file_stream.h>
#ifdef HAVE_MENU
#include "../menu/menu_driver.h"
#endif
#include "../file_path_special.h"
#include "../configuration.h"
#include "../verbosity.h"
#include "../network/net_http_special.h"
#include "badges.h"
badges_ctx_t badges_ctx;
bool badge_exists(const char* filepath)
{
return filestream_exists(filepath);
}
void set_badge_menu_texture(badges_ctx_t * badges, int i)
{
char badge_file[16];
char fullpath[PATH_MAX_LENGTH];
snprintf(badge_file, sizeof(badge_file), "%s%s", badges->badge_id_list[i],
badges->badge_locked[i] ? "_lock.png" : ".png");
fill_pathname_application_special(fullpath,
PATH_MAX_LENGTH * sizeof(char),
APPLICATION_SPECIAL_DIRECTORY_THUMBNAILS_CHEEVOS_BADGES);
#ifdef HAVE_MENU
menu_display_reset_textures_list(badge_file, fullpath,
&badges->menu_texture_list[i],TEXTURE_FILTER_MIPMAP_LINEAR);
#endif
}
void set_badge_info (badges_ctx_t *badge_struct, int id,
const char *badge_id, bool active)
{
if (!badge_struct)
return;
badge_struct->badge_id_list[id] = badge_id;
badge_struct->badge_locked[id] = active;
set_badge_menu_texture(badge_struct, id);
}
menu_texture_item get_badge_texture(int id)
{
settings_t *settings = config_get_ptr();
if (!settings || !settings->bools.cheevos_badges_enable)
return (menu_texture_item)NULL;
return badges_ctx.menu_texture_list[id];
}

44
cheevos-new/badges.h Normal file
View File

@ -0,0 +1,44 @@
/* RetroArch - A frontend for libretro.
* Copyright (C) 2015-2018 - Andre Leiradella
*
* RetroArch 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 Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch 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 RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __RARCH_CHEEVOS_BADGE_H
#define __RARCH_CHEEVOS_BADGE_H
#include "../menu/menu_driver.h"
#include <retro_common_api.h>
RETRO_BEGIN_DECLS
#define CHEEVOS_BADGE_LIMIT 256
typedef struct
{
bool badge_locked[CHEEVOS_BADGE_LIMIT];
const char * badge_id_list[CHEEVOS_BADGE_LIMIT];
menu_texture_item menu_texture_list[CHEEVOS_BADGE_LIMIT];
} badges_ctx_t;
bool badge_exists(const char* filepath);
void set_badge_menu_texture(badges_ctx_t * badges, int i);
extern void set_badge_info (badges_ctx_t *badge_struct, int id, const char *badge_id, bool active);
extern menu_texture_item get_badge_texture(int id);
extern badges_ctx_t badges_ctx;
static badges_ctx_t new_badges_ctx;
RETRO_END_DECLS
#endif

2110
cheevos-new/cheevos.c Normal file

File diff suppressed because it is too large Load Diff

76
cheevos-new/cheevos.h Normal file
View File

@ -0,0 +1,76 @@
/* RetroArch - A frontend for libretro.
* Copyright (C) 2015-2016 - Andre Leiradella
*
* RetroArch 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 Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch 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 RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __RARCH_CHEEVOS_CHEEVOS_H
#define __RARCH_CHEEVOS_CHEEVOS_H
#include <stdint.h>
#include <stdlib.h>
#include <boolean.h>
#include "../verbosity.h"
#include <retro_common_api.h>
RETRO_BEGIN_DECLS
typedef struct cheevos_ctx_desc
{
unsigned idx;
char *s;
size_t len;
} cheevos_ctx_desc_t;
enum
{
CHEEVOS_ACTIVE_SOFTCORE = 1 << 0,
CHEEVOS_ACTIVE_HARDCORE = 1 << 1
};
bool cheevos_load(const void *data);
void cheevos_reset_game(void);
void cheevos_populate_menu(void *data);
bool cheevos_get_description(cheevos_ctx_desc_t *desc);
bool cheevos_apply_cheats(bool *data_bool);
bool cheevos_unload(void);
bool cheevos_toggle_hardcore_mode(void);
void cheevos_test(void);
bool cheevos_set_cheats(void);
void cheevos_set_support_cheevos(bool state);
bool cheevos_get_support_cheevos(void);
int cheevos_get_console(void);
extern bool cheevos_loaded;
extern bool cheevos_hardcore_active;
extern bool cheevos_hardcore_paused;
extern bool cheevos_state_loaded_flag;
extern int cheats_are_enabled;
extern int cheats_were_enabled;
RETRO_END_DECLS
#endif /* __RARCH_CHEEVOS_CHEEVOS_H */

75
cheevos-new/coro.h Normal file
View File

@ -0,0 +1,75 @@
#ifndef __RARCH_CHEEVOS_CORO_H
#define __RARCH_CHEEVOS_CORO_H
/*
Released under the CC0: https://creativecommons.org/publicdomain/zero/1.0/
*/
/* Use at the beginning of the coroutine, you must have declared a variable coro_t* coro */
#define CORO_ENTER() \
{ \
CORO_again: ; \
switch ( coro->step ) { \
case CORO_BEGIN: ;
/* Use to define labels which are targets to GOTO and GOSUB */
#define CORO_SUB( x ) \
case x: ;
/* Use at the end of the coroutine */
#define CORO_LEAVE() \
} } \
do { return 0; } while ( 0 )
/* Go to the x label */
#define CORO_GOTO( x ) \
do { \
coro->step = ( x ); \
goto CORO_again; \
} while ( 0 )
/* Go to a subroutine, execution continues until the subroutine returns via RET */
#define CORO_GOSUB( x ) \
do { \
coro->stack[ coro->sp++ ] = __LINE__; \
coro->step = ( x ); \
goto CORO_again; \
case __LINE__: ; \
} while ( 0 )
/* Returns from a subroutine */
#define CORO_RET() \
do { \
coro->step = coro->stack[ --coro->sp ]; \
goto CORO_again; \
} while ( 0 )
/* Yields to the caller, execution continues from this point when the coroutine is resumed */
#define CORO_YIELD() \
do { \
coro->step = __LINE__; \
return 1; \
case __LINE__: ; \
} while ( 0 )
/* The coroutine entry point, never use 0 as a label */
#define CORO_BEGIN 0
/* Sets up the coroutine */
#define CORO_SETUP() \
do { \
coro->step = CORO_BEGIN; \
coro->sp = 0; \
} while ( 0 )
#define CORO_STOP() \
do { \
return 0; \
} while ( 0 )
/* Add this macro to your coro_t structure containing the variables for the coroutine */
#define CORO_FIELDS \
int step, sp; \
int stack[ 8 ];
#endif /* __RARCH_CHEEVOS_CORO_H */

264
cheevos-new/fixup.c Normal file
View File

@ -0,0 +1,264 @@
/* RetroArch - A frontend for libretro.
* Copyright (C) 2015-2018 - Andre Leiradella
*
* RetroArch 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 Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch 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 RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
#include "fixup.h"
#include "cheevos.h"
#include "util.h"
#include "../retroarch.h"
#include "../core.h"
#include <rcheevos.h>
static int cheevos_cmpaddr(const void* e1, const void* e2)
{
const cheevos_fixup_t* f1 = (const cheevos_fixup_t*)e1;
const cheevos_fixup_t* f2 = (const cheevos_fixup_t*)e2;
if (f1->address < f2->address)
{
return -1;
}
else if (f1->address > f2->address)
{
return 1;
}
else
{
return 0;
}
}
static size_t cheevos_var_reduce(size_t addr, size_t mask)
{
while (mask)
{
size_t tmp = (mask - 1) & ~mask;
addr = (addr & tmp) | ((addr >> 1) & ~tmp);
mask = (mask & (mask - 1)) >> 1;
}
return addr;
}
static size_t cheevos_var_highest_bit(size_t n)
{
n |= n >> 1;
n |= n >> 2;
n |= n >> 4;
n |= n >> 8;
n |= n >> 16;
return n ^ (n >> 1);
}
void cheevos_fixup_init(cheevos_fixups_t* fixups)
{
fixups->elements = NULL;
fixups->capacity = fixups->count = 0;
fixups->dirty = false;
}
void cheevos_fixup_destroy(cheevos_fixups_t* fixups)
{
CHEEVOS_FREE(fixups->elements);
cheevos_fixup_init(fixups);
}
const uint8_t* cheevos_fixup_find(cheevos_fixups_t* fixups, unsigned address, int console)
{
cheevos_fixup_t key;
cheevos_fixup_t* found;
const uint8_t* location;
if (fixups->dirty)
{
qsort(fixups->elements, fixups->count, sizeof(cheevos_fixup_t), cheevos_cmpaddr);
fixups->dirty = false;
}
key.address = address;
found = (cheevos_fixup_t*)bsearch(&key, fixups->elements, fixups->count, sizeof(cheevos_fixup_t), cheevos_cmpaddr);
if (found != NULL)
{
return found->location;
}
if (fixups->count == fixups->capacity)
{
unsigned new_capacity = fixups->capacity == 0 ? 16 : fixups->capacity * 2;
cheevos_fixup_t* new_elements = (cheevos_fixup_t*)
realloc(fixups->elements, new_capacity * sizeof(cheevos_fixup_t));
if (new_elements == NULL)
{
return NULL;
}
fixups->elements = new_elements;
fixups->capacity = new_capacity;
}
fixups->elements[fixups->count].address = address;
fixups->elements[fixups->count++].location = location =
cheevos_patch_address(address, console);
fixups->dirty = true;
return location;
}
const uint8_t* cheevos_patch_address(unsigned address, int console)
{
rarch_system_info_t* system = runloop_get_system_info();
const void* pointer = NULL;
if (console == RC_CONSOLE_NINTENDO)
{
if (address >= 0x0800 && address < 0x2000)
{
/* Address in the mirrorred RAM, adjust to real RAM. */
CHEEVOS_LOG(CHEEVOS_TAG "NES memory address in mirrorred RAM %X, adjusted to %X\n", address, address & 0x07ff);
address &= 0x07ff;
}
}
else if (console == RC_CONSOLE_GAMEBOY_COLOR)
{
if (address >= 0xe000 && address <= 0xfdff)
{
/* Address in the echo RAM, adjust to real RAM. */
CHEEVOS_LOG(CHEEVOS_TAG "GBC memory address in echo RAM %X, adjusted to %X\n", address, address - 0x2000);
address -= 0x2000;
}
}
if (system->mmaps.num_descriptors != 0)
{
/* We have memory descriptors, use it. */
const rarch_memory_descriptor_t* desc = NULL;
const rarch_memory_descriptor_t* end = NULL;
/* Patch the address to correctly map it to the mmaps. */
if (console == RC_CONSOLE_GAMEBOY_ADVANCE)
{
if (address < 0x8000)
{
/* Internal RAM. */
CHEEVOS_LOG(CHEEVOS_TAG "GBA memory address %X adjusted to %X\n", address, address + 0x3000000);
address += 0x3000000;
}
else
{
/* Work RAM. */
CHEEVOS_LOG(CHEEVOS_TAG "GBA memory address %X adjusted to %X\n", address, address + 0x2000000 - 0x8000);
address += 0x2000000 - 0x8000;
}
}
else if (console == RC_CONSOLE_PC_ENGINE)
{
/* RAM. */
CHEEVOS_LOG(CHEEVOS_TAG "PCE memory address %X adjusted to %X\n", address, address + 0x1f0000);
address += 0x1f0000;
}
else if (console == RC_CONSOLE_SUPER_NINTENDO)
{
if (address < 0x020000)
{
/* Work RAM. */
CHEEVOS_LOG(CHEEVOS_TAG "SNES memory address %X adjusted to %X\n", address, address + 0x7e0000);
address += 0x7e0000;
}
else
{
/* Save RAM. */
CHEEVOS_LOG(CHEEVOS_TAG "SNES memory address %X adjusted to %X\n", address, address + 0x006000 - 0x020000);
address += 0x006000 - 0x020000;
}
}
desc = system->mmaps.descriptors;
end = desc + system->mmaps.num_descriptors;
for (; desc < end; desc++)
{
if (((desc->core.start ^ address) & desc->core.select) == 0)
{
unsigned addr = address;
pointer = desc->core.ptr;
address = (unsigned)cheevos_var_reduce(
(addr - desc->core.start) & desc->disconnect_mask,
desc->core.disconnect);
if (address >= desc->core.len)
address -= cheevos_var_highest_bit(address);
address += desc->core.offset;
CHEEVOS_LOG(CHEEVOS_TAG "address %X set to descriptor %d at offset %X\n", addr, (int)((desc - system->mmaps.descriptors) + 1), address);
break;
}
}
}
else
{
unsigned i;
for (i = 0; i < 4; i++)
{
retro_ctx_memory_info_t meminfo;
switch (i)
{
case 0:
meminfo.id = RETRO_MEMORY_SYSTEM_RAM;
break;
case 1:
meminfo.id = RETRO_MEMORY_SAVE_RAM;
break;
case 2:
meminfo.id = RETRO_MEMORY_VIDEO_RAM;
break;
case 3:
meminfo.id = RETRO_MEMORY_RTC;
break;
}
core_get_memory(&meminfo);
if (address < meminfo.size)
{
pointer = meminfo.data;
break;
}
/**
* HACK Subtract the correct amount of bytes to reach the save RAM as
* it's size is not always set correctly in the core.
*/
if (i == 0 && console == RC_CONSOLE_NINTENDO)
address -= 0x6000;
else
address -= meminfo.size;
}
}
if (pointer == NULL)
{
return NULL;
}
return (const uint8_t*)pointer + address;
}

48
cheevos-new/fixup.h Normal file
View File

@ -0,0 +1,48 @@
/* RetroArch - A frontend for libretro.
* Copyright (C) 2015-2018 - Andre Leiradella
*
* RetroArch 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 Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch 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 RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __RARCH_CHEEVOS_FIXUP_H
#define __RARCH_CHEEVOS_FIXUP_H
#include <stdint.h>
#include <boolean.h>
#include <retro_common_api.h>
RETRO_BEGIN_DECLS
typedef struct
{
unsigned address;
const uint8_t* location;
} cheevos_fixup_t;
typedef struct
{
cheevos_fixup_t* elements;
unsigned capacity, count;
bool dirty;
} cheevos_fixups_t;
void cheevos_fixup_init(cheevos_fixups_t* fixups);
void cheevos_fixup_destroy(cheevos_fixups_t* fixups);
const uint8_t* cheevos_fixup_find(cheevos_fixups_t* fixups, unsigned address, int console);
const uint8_t* cheevos_patch_address(unsigned address, int console);
RETRO_END_DECLS
#endif

12
cheevos-new/hash.c Normal file
View File

@ -0,0 +1,12 @@
#include "hash.h"
uint32_t cheevos_djb2(const char* str, size_t length)
{
const unsigned char* aux = (const unsigned char*)str;
uint32_t hash = 5381;
while (length--)
hash = ( hash << 5 ) + hash + *aux++;
return hash;
}

30
cheevos-new/hash.h Normal file
View File

@ -0,0 +1,30 @@
/* RetroArch - A frontend for libretro.
* Copyright (C) 2015-2018 - Andre Leiradella
*
* RetroArch 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 Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch 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 RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __RARCH_CHEEVOS_HASH_H
#define __RARCH_CHEEVOS_HASH_H
#include <stdint.h>
#include <stddef.h>
#include <retro_common_api.h>
RETRO_BEGIN_DECLS
uint32_t cheevos_djb2(const char* str, size_t length);
RETRO_END_DECLS
#endif

674
cheevos-new/parser.c Normal file
View File

@ -0,0 +1,674 @@
#include "parser.h"
#include "hash.h"
#include "util.h"
#include <formats/jsonsax.h>
#include <string/stdstring.h>
#include <compat/strl.h>
/* C89 wants only int values in enums. */
#define CHEEVOS_JSON_KEY_GAMEID 0xb4960eecU
#define CHEEVOS_JSON_KEY_ACHIEVEMENTS 0x69749ae1U
#define CHEEVOS_JSON_KEY_ID 0x005973f2U
#define CHEEVOS_JSON_KEY_MEMADDR 0x1e76b53fU
#define CHEEVOS_JSON_KEY_TITLE 0x0e2a9a07U
#define CHEEVOS_JSON_KEY_DESCRIPTION 0xe61a1f69U
#define CHEEVOS_JSON_KEY_POINTS 0xca8fce22U
#define CHEEVOS_JSON_KEY_AUTHOR 0xa804edb8U
#define CHEEVOS_JSON_KEY_MODIFIED 0xdcea4fe6U
#define CHEEVOS_JSON_KEY_CREATED 0x3a84721dU
#define CHEEVOS_JSON_KEY_BADGENAME 0x887685d9U
#define CHEEVOS_JSON_KEY_CONSOLE_ID 0x071656e5U
#define CHEEVOS_JSON_KEY_TOKEN 0x0e2dbd26U
#define CHEEVOS_JSON_KEY_FLAGS 0x0d2e96b2U
#define CHEEVOS_JSON_KEY_LEADERBOARDS 0xf1247d2dU
#define CHEEVOS_JSON_KEY_MEM 0x0b8807e4U
#define CHEEVOS_JSON_KEY_FORMAT 0xb341208eU
#define CHEEVOS_JSON_KEY_SUCCESS 0x110461deU
#define CHEEVOS_JSON_KEY_ERROR 0x0d2011cfU
/*****************************************************************************
Gets a value in a JSON
*****************************************************************************/
typedef struct
{
unsigned key_hash;
int is_key;
const char* value;
size_t length;
} cheevos_getvalueud_t;
static int cheevos_getvalue_key(void* userdata,
const char* name, size_t length)
{
cheevos_getvalueud_t* ud = (cheevos_getvalueud_t*)userdata;
ud->is_key = cheevos_djb2(name, length) == ud->key_hash;
return 0;
}
static int cheevos_getvalue_string(void* userdata,
const char* string, size_t length)
{
cheevos_getvalueud_t* ud = (cheevos_getvalueud_t*)userdata;
if (ud->is_key)
{
ud->value = string;
ud->length = length;
ud->is_key = 0;
}
return 0;
}
static int cheevos_getvalue_boolean(void* userdata, int istrue)
{
cheevos_getvalueud_t* ud = (cheevos_getvalueud_t*)userdata;
if (ud->is_key)
{
if (istrue)
{
ud->value = "true";
ud->length = 4;
}
else
{
ud->value = "false";
ud->length = 5;
}
ud->is_key = 0;
}
return 0;
}
static int cheevos_getvalue_null(void* userdata)
{
cheevos_getvalueud_t* ud = (cheevos_getvalueud_t*)userdata;
if (ud->is_key )
{
ud->value = "null";
ud->length = 4;
ud->is_key = 0;
}
return 0;
}
static int cheevos_get_value(const char* json, unsigned key_hash,
char* value, size_t length)
{
static const jsonsax_handlers_t handlers =
{
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
cheevos_getvalue_key,
NULL,
cheevos_getvalue_string,
cheevos_getvalue_string, /* number */
cheevos_getvalue_boolean,
cheevos_getvalue_null
};
cheevos_getvalueud_t ud;
ud.key_hash = key_hash;
ud.is_key = 0;
ud.value = NULL;
ud.length = 0;
*value = 0;
if ((jsonsax_parse(json, &handlers, (void*)&ud) == JSONSAX_OK)
&& ud.value && ud.length < length)
{
strlcpy(value, ud.value, ud.length + 1);
return 0;
}
return -1;
}
/*****************************************************************************
Returns the token of the error message
*****************************************************************************/
int cheevos_get_token(const char* json, char* token, size_t length)
{
cheevos_get_value(json, CHEEVOS_JSON_KEY_ERROR, token, length);
if (!string_is_empty(token))
return -1;
return cheevos_get_value(json, CHEEVOS_JSON_KEY_TOKEN, token, length);
}
/*****************************************************************************
Count number of achievements in a JSON file
*****************************************************************************/
typedef struct
{
int in_cheevos;
int in_lboards;
uint32_t field_hash;
unsigned core_count;
unsigned unofficial_count;
unsigned lboard_count;
} cheevos_countud_t;
static int cheevos_count_end_array(void* userdata)
{
cheevos_countud_t* ud = (cheevos_countud_t*)userdata;
ud->in_cheevos = 0;
ud->in_lboards = 0;
return 0;
}
static int cheevos_count_key(void* userdata,
const char* name, size_t length)
{
cheevos_countud_t* ud = (cheevos_countud_t*)userdata;
ud->field_hash = cheevos_djb2(name, length);
if (ud->field_hash == CHEEVOS_JSON_KEY_ACHIEVEMENTS)
ud->in_cheevos = 1;
else if (ud->field_hash == CHEEVOS_JSON_KEY_LEADERBOARDS)
ud->in_lboards = 1;
return 0;
}
static int cheevos_count_number(void* userdata,
const char* number, size_t length)
{
cheevos_countud_t* ud = (cheevos_countud_t*)userdata;
if (ud->in_cheevos && ud->field_hash == CHEEVOS_JSON_KEY_FLAGS)
{
long flags = strtol(number, NULL, 10);
if (flags == 3)
ud->core_count++; /* Core achievements */
else if (flags == 5)
ud->unofficial_count++; /* Unofficial achievements */
}
else if (ud->in_lboards && ud->field_hash == CHEEVOS_JSON_KEY_ID)
ud->lboard_count++;
return 0;
}
static int cheevos_count_cheevos(const char* json,
unsigned* core_count, unsigned* unofficial_count,
unsigned* lboard_count)
{
static const jsonsax_handlers_t handlers =
{
NULL,
NULL,
NULL,
NULL,
NULL,
cheevos_count_end_array,
cheevos_count_key,
NULL,
NULL,
cheevos_count_number,
NULL,
NULL
};
int res;
cheevos_countud_t ud;
ud.in_cheevos = 0;
ud.in_lboards = 0;
ud.core_count = 0;
ud.unofficial_count = 0;
ud.lboard_count = 0;
res = jsonsax_parse(json, &handlers, (void*)&ud);
*core_count = ud.core_count;
*unofficial_count = ud.unofficial_count;
*lboard_count = ud.lboard_count;
return res;
}
/*****************************************************************************
Parses the cheevos in the JSON
*****************************************************************************/
typedef struct
{
const char* string;
size_t length;
} cheevos_field_t;
typedef struct
{
int in_cheevos;
int in_lboards;
int is_console_id;
unsigned core_count;
unsigned unofficial_count;
unsigned lboard_count;
cheevos_field_t* field;
cheevos_field_t id, memaddr, title, desc, points, author;
cheevos_field_t modified, created, badge, flags, format;
cheevos_rapatchdata_t* patchdata;
} cheevos_readud_t;
static const char* cheevos_dupstr(const cheevos_field_t* field)
{
char* string = (char*)malloc(field->length + 1);
if (!string)
return NULL;
memcpy((void*)string, (void*)field->string, field->length);
string[field->length] = 0;
return string;
}
static int cheevos_new_cheevo(cheevos_readud_t* ud)
{
cheevos_racheevo_t* cheevo = NULL;
unsigned flags = (unsigned)strtol(ud->flags.string, NULL, 10);
if (flags == 3)
cheevo = ud->patchdata->core + ud->core_count++;
else if (flags == 5)
cheevo = ud->patchdata->unofficial + ud->unofficial_count++;
else
return 0;
cheevo->title = cheevos_dupstr(&ud->title);
cheevo->description = cheevos_dupstr(&ud->desc);
cheevo->badge = cheevos_dupstr(&ud->badge);
cheevo->memaddr = cheevos_dupstr(&ud->memaddr);
cheevo->points = (unsigned)strtol(ud->points.string, NULL, 10);
cheevo->id = (unsigned)strtol(ud->id.string, NULL, 10);
if ( !cheevo->title
|| !cheevo->description
|| !cheevo->badge
|| !cheevo->memaddr)
{
CHEEVOS_FREE(cheevo->title);
CHEEVOS_FREE(cheevo->description);
CHEEVOS_FREE(cheevo->badge);
CHEEVOS_FREE(cheevo->memaddr);
return -1;
}
return 0;
}
static int cheevos_new_lboard(cheevos_readud_t* ud)
{
cheevos_ralboard_t* lboard = ud->patchdata->lboards + ud->lboard_count++;
lboard->title = cheevos_dupstr(&ud->title);
lboard->description = cheevos_dupstr(&ud->desc);
lboard->format = cheevos_dupstr(&ud->format);
lboard->mem = cheevos_dupstr(&ud->memaddr);
lboard->id = (unsigned)strtol(ud->id.string, NULL, 10);
if ( !lboard->title
|| !lboard->description
|| !lboard->format
|| !lboard->mem)
{
CHEEVOS_FREE(lboard->title);
CHEEVOS_FREE(lboard->description);
CHEEVOS_FREE(lboard->format);
CHEEVOS_FREE(lboard->mem);
return -1;
}
return 0;
}
static int cheevos_read_end_object(void* userdata)
{
cheevos_readud_t* ud = (cheevos_readud_t*)userdata;
if (ud->in_cheevos)
return cheevos_new_cheevo(ud);
if (ud->in_lboards)
return cheevos_new_lboard(ud);
return 0;
}
static int cheevos_read_end_array(void* userdata)
{
cheevos_readud_t* ud = (cheevos_readud_t*)userdata;
ud->in_cheevos = 0;
ud->in_lboards = 0;
return 0;
}
static int cheevos_read_key(void* userdata,
const char* name, size_t length)
{
cheevos_readud_t* ud = (cheevos_readud_t*)userdata;
int common = ud->in_cheevos || ud->in_lboards;
uint32_t hash = cheevos_djb2(name, length);
ud->field = NULL;
switch (hash)
{
case CHEEVOS_JSON_KEY_ACHIEVEMENTS:
ud->in_cheevos = 1;
break;
case CHEEVOS_JSON_KEY_LEADERBOARDS:
ud->in_lboards = 1;
break;
case CHEEVOS_JSON_KEY_CONSOLE_ID:
ud->is_console_id = 1;
break;
case CHEEVOS_JSON_KEY_ID:
if (common)
ud->field = &ud->id;
break;
case CHEEVOS_JSON_KEY_MEMADDR:
if (ud->in_cheevos)
ud->field = &ud->memaddr;
break;
case CHEEVOS_JSON_KEY_MEM:
if (ud->in_lboards)
ud->field = &ud->memaddr;
break;
case CHEEVOS_JSON_KEY_TITLE:
if (common)
ud->field = &ud->title;
break;
case CHEEVOS_JSON_KEY_DESCRIPTION:
if (common)
ud->field = &ud->desc;
break;
case CHEEVOS_JSON_KEY_POINTS:
if (ud->in_cheevos)
ud->field = &ud->points;
break;
case CHEEVOS_JSON_KEY_AUTHOR:
if (ud->in_cheevos)
ud->field = &ud->author;
break;
case CHEEVOS_JSON_KEY_MODIFIED:
if (ud->in_cheevos)
ud->field = &ud->modified;
break;
case CHEEVOS_JSON_KEY_CREATED:
if (ud->in_cheevos)
ud->field = &ud->created;
break;
case CHEEVOS_JSON_KEY_BADGENAME:
if (ud->in_cheevos)
ud->field = &ud->badge;
break;
case CHEEVOS_JSON_KEY_FLAGS:
if (ud->in_cheevos)
ud->field = &ud->flags;
break;
case CHEEVOS_JSON_KEY_FORMAT:
if (ud->in_lboards)
ud->field = &ud->format;
break;
default:
break;
}
return 0;
}
static int cheevos_read_string(void* userdata,
const char* string, size_t length)
{
cheevos_readud_t* ud = (cheevos_readud_t*)userdata;
if (ud->field)
{
ud->field->string = string;
ud->field->length = length;
}
return 0;
}
static int cheevos_read_number(void* userdata,
const char* number, size_t length)
{
cheevos_readud_t* ud = (cheevos_readud_t*)userdata;
if (ud->field)
{
ud->field->string = number;
ud->field->length = length;
}
else if (ud->is_console_id)
{
ud->patchdata->console_id = strtol(number, NULL, 10);
ud->is_console_id = 0;
}
return 0;
}
int cheevos_get_patchdata(const char* json, cheevos_rapatchdata_t* patchdata)
{
static const jsonsax_handlers_t handlers =
{
NULL,
NULL,
NULL,
cheevos_read_end_object,
NULL,
cheevos_read_end_array,
cheevos_read_key,
NULL,
cheevos_read_string,
cheevos_read_number,
NULL,
NULL
};
cheevos_readud_t ud;
int res;
/* Count the number of achievements in the JSON file. */
res = cheevos_count_cheevos(json, &patchdata->core_count,
&patchdata->unofficial_count, &patchdata->lboard_count);
if (res != JSONSAX_OK)
return -1;
/* Allocate the achievements. */
patchdata->core = (cheevos_racheevo_t*)
calloc(patchdata->core_count, sizeof(cheevos_racheevo_t));
patchdata->unofficial = (cheevos_racheevo_t*)
calloc(patchdata->unofficial_count, sizeof(cheevos_racheevo_t));
patchdata->lboards = (cheevos_ralboard_t*)
calloc(patchdata->lboard_count, sizeof(cheevos_ralboard_t));
if (!patchdata->core ||
!patchdata->unofficial ||
!patchdata->lboards)
{
CHEEVOS_FREE(patchdata->core);
CHEEVOS_FREE(patchdata->unofficial);
CHEEVOS_FREE(patchdata->lboards);
return -1;
}
/* Load the achievements. */
ud.in_cheevos = 0;
ud.in_lboards = 0;
ud.is_console_id = 0;
ud.field = NULL;
ud.core_count = 0;
ud.unofficial_count = 0;
ud.lboard_count = 0;
ud.patchdata = patchdata;
if (jsonsax_parse(json, &handlers, (void*)&ud) != JSONSAX_OK)
{
cheevos_free_patchdata(patchdata);
return -1;
}
return 0;
}
/*****************************************************************************
Frees the patchdata
*****************************************************************************/
void cheevos_free_patchdata(cheevos_rapatchdata_t* patchdata)
{
unsigned i = 0, count = 0;
const cheevos_racheevo_t* cheevo = NULL;
const cheevos_ralboard_t* lboard = NULL;
cheevo = patchdata->core;
for (i = 0, count = patchdata->core_count; i < count; i++, cheevo++)
{
CHEEVOS_FREE(cheevo->title);
CHEEVOS_FREE(cheevo->description);
CHEEVOS_FREE(cheevo->badge);
CHEEVOS_FREE(cheevo->memaddr);
}
cheevo = patchdata->unofficial;
for (i = 0, count = patchdata->unofficial_count; i < count; i++, cheevo++)
{
CHEEVOS_FREE(cheevo->title);
CHEEVOS_FREE(cheevo->description);
CHEEVOS_FREE(cheevo->badge);
CHEEVOS_FREE(cheevo->memaddr);
}
lboard = patchdata->lboards;
for (i = 0, count = patchdata->lboard_count; i < count; i++, lboard++)
{
CHEEVOS_FREE(lboard->title);
CHEEVOS_FREE(lboard->description);
CHEEVOS_FREE(lboard->format);
CHEEVOS_FREE(lboard->mem);
}
CHEEVOS_FREE(patchdata->core);
CHEEVOS_FREE(patchdata->unofficial);
CHEEVOS_FREE(patchdata->lboards);
patchdata->console_id = 0;
patchdata->core = NULL;
patchdata->unofficial = NULL;
patchdata->lboards = NULL;
patchdata->core_count = 0;
patchdata->unofficial_count = 0;
patchdata->lboard_count = 0;
}
/*****************************************************************************
Deactivates unlocked cheevos
*****************************************************************************/
typedef struct
{
int is_element;
cheevos_unlock_cb_t unlock_cb;
void* userdata;
} cheevos_deactivate_t;
static int cheevos_deactivate_index(void* userdata, unsigned int index)
{
cheevos_deactivate_t* ud = (cheevos_deactivate_t*)userdata;
ud->is_element = 1;
return 0;
}
static int cheevos_deactivate_number(void* userdata,
const char* number, size_t length)
{
cheevos_deactivate_t* ud = (cheevos_deactivate_t*)userdata;
unsigned id = 0;
if (ud->is_element)
{
ud->is_element = 0;
id = (unsigned)strtol(number, NULL, 10);
ud->unlock_cb(id, ud->userdata);
}
return 0;
}
void cheevos_deactivate_unlocks(const char* json, cheevos_unlock_cb_t unlock_cb, void* userdata)
{
static const jsonsax_handlers_t handlers =
{
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
cheevos_deactivate_index,
NULL,
cheevos_deactivate_number,
NULL,
NULL
};
cheevos_deactivate_t ud;
ud.is_element = 0;
ud.unlock_cb = unlock_cb;
ud.userdata = userdata;
jsonsax_parse(json, &handlers, (void*)&ud);
}
/*****************************************************************************
Returns the game ID
*****************************************************************************/
unsigned chevos_get_gameid(const char* json)
{
char gameid[32];
if (cheevos_get_value(json, CHEEVOS_JSON_KEY_GAMEID, gameid, sizeof(gameid)) != 0)
return 0;
return (unsigned)strtol(gameid, NULL, 10);
}

69
cheevos-new/parser.h Normal file
View File

@ -0,0 +1,69 @@
/* RetroArch - A frontend for libretro.
* Copyright (C) 2015-2018 - Andre Leiradella
*
* RetroArch 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 Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch 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 RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __RARCH_CHEEVOS_PARSER_H
#define __RARCH_CHEEVOS_PARSER_H
#include <stdint.h>
#include <stddef.h>
#include <boolean.h>
#include <retro_common_api.h>
RETRO_BEGIN_DECLS
typedef struct {
const char* title;
const char* description;
const char* badge;
const char* memaddr;
unsigned points;
unsigned id;
} cheevos_racheevo_t;
typedef struct {
const char* title;
const char* description;
const char* format;
const char* mem;
unsigned id;
} cheevos_ralboard_t;
typedef struct {
unsigned console_id;
cheevos_racheevo_t* core;
cheevos_racheevo_t* unofficial;
cheevos_ralboard_t* lboards;
unsigned core_count;
unsigned unofficial_count;
unsigned lboard_count;
} cheevos_rapatchdata_t;
typedef void (*cheevos_unlock_cb_t)(unsigned id, void* userdata);
int cheevos_get_token(const char* json, char* token, size_t length);
int cheevos_get_patchdata(const char* json, cheevos_rapatchdata_t* patchdata);
void cheevos_free_patchdata(cheevos_rapatchdata_t* patchdata);
void cheevos_deactivate_unlocks(const char* json, cheevos_unlock_cb_t unlock_cb, void* userdata);
unsigned chevos_get_gameid(const char* json);
RETRO_END_DECLS
#endif

53
cheevos-new/util.h Normal file
View File

@ -0,0 +1,53 @@
/* RetroArch - A frontend for libretro.
* Copyright (C) 2015-2016 - Andre Leiradella
*
* RetroArch 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 Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch 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 RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __RARCH_CHEEVOS_UTIL_H
#define __RARCH_CHEEVOS_UTIL_H
#include <retro_common_api.h>
RETRO_BEGIN_DECLS
/*****************************************************************************
Setup - mainly for debugging
*****************************************************************************/
/* Define this macro to get extra-verbose log for cheevos. */
#undef CHEEVOS_VERBOSE
/*****************************************************************************
End of setup
*****************************************************************************/
#define CHEEVOS_TAG "[CHEEVOS]: "
#define CHEEVOS_FREE(p) do { void* q = (void*)p; if (q != NULL) free(q); } while (0)
#ifdef CHEEVOS_VERBOSE
#define CHEEVOS_LOG RARCH_LOG
#define CHEEVOS_ERR RARCH_ERR
#else
#define CHEEVOS_LOG cheevos_log
#define CHEEVOS_ERR RARCH_ERR
void cheevos_log(const char *fmt, ...);
#endif
RETRO_END_DECLS
#endif /* __RARCH_CHEEVOS_UTIL_H */

View File

@ -1,3 +1,18 @@
/* RetroArch - A frontend for libretro.
* Copyright (C) 2015-2018 - Andre Leiradella
*
* RetroArch 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 Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch 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 RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
#include <file/file_path.h> #include <file/file_path.h>
#include <string/stdstring.h> #include <string/stdstring.h>
#include <streams/file_stream.h> #include <streams/file_stream.h>

View File

@ -1,5 +1,24 @@
#ifndef __RARCH_BADGE_H /* RetroArch - A frontend for libretro.
#define __RARCH_BADGE_H * Copyright (C) 2015-2018 - Andre Leiradella
*
* RetroArch 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 Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch 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 RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __RARCH_CHEEVOS_OLD_BADGE_H
#define __RARCH_CHEEVOS_OLD_BADGE_H
#ifdef HAVE_NEW_CHEEVOS
#include "../cheevos-new/badges.h"
#else
#include "../menu/menu_driver.h" #include "../menu/menu_driver.h"
@ -27,3 +46,5 @@ static badges_ctx_t new_badges_ctx;
RETRO_END_DECLS RETRO_END_DECLS
#endif #endif
#endif

View File

@ -1,5 +1,5 @@
/* RetroArch - A frontend for libretro. /* RetroArch - A frontend for libretro.
* Copyright (C) 2015-2016 - Andre Leiradella * Copyright (C) 2015-2018 - Andre Leiradella
* *
* RetroArch is free software: you can redistribute it and/or modify it under the terms * RetroArch 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 Found- * of the GNU General Public License as published by the Free Software Found-
@ -1666,7 +1666,7 @@ static void cheevos_test_cheevo_set(const cheevoset_t *set)
if (settings && settings->bools.cheevos_auto_screenshot) if (settings && settings->bools.cheevos_auto_screenshot)
{ {
char shotname[256]; char shotname[4200];
snprintf(shotname, sizeof(shotname), "%s/%s-cheevo-%u", snprintf(shotname, sizeof(shotname), "%s/%s-cheevo-%u",
settings->paths.directory_screenshot, settings->paths.directory_screenshot,
@ -2266,15 +2266,11 @@ bool cheevos_toggle_hardcore_mode(void)
return false; return false;
/* reset and deinit rewind to avoid cheat the score */ /* reset and deinit rewind to avoid cheat the score */
if (settings->bools.cheevos_hardcore_mode_enable if (settings->bools.cheevos_hardcore_mode_enable && !cheevos_hardcore_paused)
&& !cheevos_hardcore_paused)
{ {
const char *msg = msg_hash_to_str( const char *msg = msg_hash_to_str(
MSG_CHEEVOS_HARDCORE_MODE_ENABLE); MSG_CHEEVOS_HARDCORE_MODE_ENABLE);
/* reset the state loaded flag in case it was set */
cheevos_state_loaded_flag = false;
/* send reset core cmd to avoid any user /* send reset core cmd to avoid any user
* savestate previusly loaded. */ * savestate previusly loaded. */
command_event(CMD_EVENT_RESET, NULL); command_event(CMD_EVENT_RESET, NULL);
@ -2575,6 +2571,8 @@ enum
static int cheevos_iterate(coro_t *coro) static int cheevos_iterate(coro_t *coro)
{ {
const int snes_header_len = 0x200;
const int lynx_header_len = 0x40;
ssize_t num_read = 0; ssize_t num_read = 0;
size_t to_read = 4096; size_t to_read = 4096;
uint8_t *buffer = NULL; uint8_t *buffer = NULL;
@ -2616,18 +2614,16 @@ static int cheevos_iterate(coro_t *coro)
static cheevos_finder_t finders[] = static cheevos_finder_t finders[] =
{ {
{SNES_MD5, "SNES (8Mb padding)", snes_exts}, {SNES_MD5, "SNES (discards header)", snes_exts},
{GENESIS_MD5, "Genesis (6Mb padding)", genesis_exts}, {GENESIS_MD5, "Genesis (6Mb padding)", genesis_exts},
{LYNX_MD5, "Atari Lynx (only first 512 bytes)", lynx_exts}, {LYNX_MD5, "Atari Lynx (discards header)", lynx_exts},
{NES_MD5, "NES (discards VROM)", NULL}, {NES_MD5, "NES (discards header)", NULL},
{GENERIC_MD5, "Generic (plain content)", NULL}, {GENERIC_MD5, "Generic (plain content)", NULL},
{FILENAME_MD5, "Generic (filename)", NULL} {FILENAME_MD5, "Generic (filename)", NULL}
}; };
CORO_ENTER(); CORO_ENTER();
cheevos_locals.addrs_patched = false; cheevos_locals.addrs_patched = false;
coro->settings = config_get_ptr(); coro->settings = config_get_ptr();
@ -2906,30 +2902,21 @@ found:
MD5_Init(&coro->md5); MD5_Init(&coro->md5);
coro->offset = 0; /* Checks for the existence of a headered SNES file.
coro->count = 0; Unheadered files fall back to GENERIC_MD5. */
CORO_GOSUB(EVAL_MD5); if (coro->len < 0x2000 || coro->len % 0x2000 != snes_header_len)
if (coro->count == 0)
{ {
MD5_Final(coro->hash, &coro->md5);
coro->gameid = 0; coro->gameid = 0;
CORO_RET(); CORO_RET();
} }
if (coro->count < size_in_megabytes(8)) coro->offset = 512;
{ coro->count = 0;
/*
* Inputs: CHEEVOS_VAR_MD5, CHEEVOS_VAR_OFFSET, CHEEVOS_VAR_COUNT
* Outputs: CHEEVOS_VAR_MD5
*/
coro->offset = 0;
coro->count = size_in_megabytes(8) - coro->count;
CORO_GOSUB(FILL_MD5);
}
CORO_GOSUB(EVAL_MD5);
MD5_Final(coro->hash, &coro->md5); MD5_Final(coro->hash, &coro->md5);
CORO_GOTO(GET_GAMEID); CORO_GOTO(GET_GAMEID);
/************************************************************************** /**************************************************************************
@ -2969,16 +2956,19 @@ found:
*************************************************************************/ *************************************************************************/
CORO_SUB(LYNX_MD5) CORO_SUB(LYNX_MD5)
if (coro->len < 0x0240) /* Checks for the existence of a headered Lynx file.
Unheadered files fall back to GENERIC_MD5. */
if (coro->len <= lynx_header_len ||
memcmp("LYNX", (void *)coro->data, 5) != 0)
{ {
coro->gameid = 0; coro->gameid = 0;
CORO_RET(); CORO_RET();
} }
MD5_Init(&coro->md5); MD5_Init(&coro->md5);
coro->offset = lynx_header_len;
coro->offset = 0x0040; coro->count = coro->len - lynx_header_len;
coro->count = 0x0200;
CORO_GOSUB(EVAL_MD5); CORO_GOSUB(EVAL_MD5);
MD5_Final(coro->hash, &coro->md5); MD5_Final(coro->hash, &coro->md5);
@ -2991,12 +2981,8 @@ found:
*************************************************************************/ *************************************************************************/
CORO_SUB(NES_MD5) CORO_SUB(NES_MD5)
/* Note about the references to the FCEU emulator below. There is no /* Checks for the existence of a headered NES file.
* core-specific code in this function, it's rather Retro Achievements Unheadered files fall back to GENERIC_MD5. */
* specific code that must be followed to the letter so we compute
* the correct ROM hash. Retro Achievements does indeed use some
* FCEU related method to compute the hash, since its NES emulator
* is based on it. */
if (coro->len < sizeof(coro->header)) if (coro->len < sizeof(coro->header))
{ {
@ -3007,83 +2993,22 @@ found:
memcpy((void*)&coro->header, coro->data, memcpy((void*)&coro->header, coro->data,
sizeof(coro->header)); sizeof(coro->header));
if (coro->header.id[0] == 'N' if ( coro->header.id[0] != 'N'
&& coro->header.id[1] == 'E' || coro->header.id[1] != 'E'
&& coro->header.id[2] == 'S' || coro->header.id[2] != 'S'
&& coro->header.id[3] == 0x1a) || coro->header.id[3] != 0x1a)
{ {
size_t romsize = 256; coro->gameid = 0;
/* from FCEU core - compute size using the cart mapper */ CORO_RET();
int mapper = (coro->header.rom_type >> 4) | (coro->header.rom_type2 & 0xF0);
if (coro->header.rom_size)
romsize = next_pow2(coro->header.rom_size);
/* for games not to the power of 2, so we just read enough
* PRG rom from it, but we have to keep ROM_size to the power of 2
* since PRGCartMapping wants ROM_size to be to the power of 2
* so instead if not to power of 2, we just use head.ROM_size when
* we use FCEU_read. */
coro->round = mapper != 53 && mapper != 198 && mapper != 228;
coro->bytes = coro->round ? romsize : coro->header.rom_size;
coro->offset = sizeof(coro->header) + (coro->header.rom_type & 4
? sizeof(coro->header) : 0);
/* from FCEU core - check if Trainer included in ROM data */
MD5_Init(&coro->md5);
coro->count = 0x4000 * coro->bytes;
CORO_GOSUB(EVAL_MD5);
if (coro->count < 0x4000 * coro->bytes)
{
coro->offset = 0xff;
coro->count = 0x4000 * coro->bytes - coro->count;
CORO_GOSUB(FILL_MD5);
} }
MD5_Init(&coro->md5);
coro->offset = sizeof(coro->header);
coro->count = coro->len - coro->offset;
CORO_GOSUB(EVAL_MD5);
MD5_Final(coro->hash, &coro->md5); MD5_Final(coro->hash, &coro->md5);
CORO_GOTO(GET_GAMEID); CORO_GOTO(GET_GAMEID);
}
else
{
unsigned i;
size_t chunks = coro->len >> 14;
size_t chunk_size = 0x4000;
/* Fall back to headerless hashing
* PRG ROM size is unknown, so test by 16KB chunks */
coro->round = 0;
coro->offset = 0;
for (i = 0; i < chunks; i++)
{
MD5_Init(&coro->md5);
coro->bytes = i + 1;
coro->count = coro->bytes * chunk_size;
CORO_GOSUB(EVAL_MD5);
if (coro->count < 0x4000 * coro->bytes)
{
coro->offset = 0xff;
coro->count = 0x4000 * coro->bytes - coro->count;
CORO_GOSUB(FILL_MD5);
}
MD5_Final(coro->hash, &coro->md5);
CORO_GOSUB(GET_GAMEID);
if (coro->gameid > 0)
{
break;
}
}
CORO_RET();
}
/************************************************************************** /**************************************************************************
* Info Tries to identify a "generic" game * Info Tries to identify a "generic" game
@ -3268,7 +3193,10 @@ found:
{ {
settings_t *settings = config_get_ptr(); settings_t *settings = config_get_ptr();
if (!string_is_equal(settings->arrays.menu_driver, "xmb") || if (!(
string_is_equal(settings->arrays.menu_driver, "xmb") ||
string_is_equal(settings->arrays.menu_driver, "ozone")
) ||
!settings->bools.cheevos_badges_enable) !settings->bools.cheevos_badges_enable)
CORO_RET(); CORO_RET();
} }
@ -3429,7 +3357,7 @@ found:
/* Save token to config and clear pass on success */ /* Save token to config and clear pass on success */
*coro->settings->arrays.cheevos_password = '\0'; *coro->settings->arrays.cheevos_password = '\0';
strlcpy( strncpy(
coro->settings->arrays.cheevos_token, coro->settings->arrays.cheevos_token,
cheevos_locals.token, sizeof(coro->settings->arrays.cheevos_token) cheevos_locals.token, sizeof(coro->settings->arrays.cheevos_token)
); );

View File

@ -1,5 +1,5 @@
/* RetroArch - A frontend for libretro. /* RetroArch - A frontend for libretro.
* Copyright (C) 2015-2016 - Andre Leiradella * Copyright (C) 2015-2018 - Andre Leiradella
* *
* RetroArch is free software: you can redistribute it and/or modify it under the terms * RetroArch 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 Found- * of the GNU General Public License as published by the Free Software Found-
@ -13,8 +13,12 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef __RARCH_CHEEVOS_H #ifndef __RARCH_CHEEVOS_OLD_H
#define __RARCH_CHEEVOS_H #define __RARCH_CHEEVOS_OLD_H
#ifdef HAVE_NEW_CHEEVOS
#include "../cheevos-new/cheevos.h"
#else
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
@ -94,7 +98,8 @@ typedef enum
CHEEVOS_CONSOLE_VIRTUAL_BOY = 28, CHEEVOS_CONSOLE_VIRTUAL_BOY = 28,
CHEEVOS_CONSOLE_MSX = 29, CHEEVOS_CONSOLE_MSX = 29,
CHEEVOS_CONSOLE_COMMODORE_64 = 30, CHEEVOS_CONSOLE_COMMODORE_64 = 30,
CHEEVOS_CONSOLE_ZX81 = 31 CHEEVOS_CONSOLE_ZX81 = 31,
CHEEVOS_CONSOLE_ATARI_7800 = 51
} cheevos_console_t; } cheevos_console_t;
enum enum
@ -158,8 +163,9 @@ extern bool cheevos_hardcore_paused;
extern bool cheevos_state_loaded_flag; extern bool cheevos_state_loaded_flag;
extern int cheats_are_enabled; extern int cheats_are_enabled;
extern int cheats_were_enabled; extern int cheats_were_enabled;
;
RETRO_END_DECLS RETRO_END_DECLS
#endif
#endif /* __RARCH_CHEEVOS_H */ #endif /* __RARCH_CHEEVOS_H */

View File

@ -411,6 +411,5 @@ unsigned cheevos_var_get_value(cheevos_var_t* var)
if(var->is_bcd) if(var->is_bcd)
return (((value >> 4) & 0xf) * 10) + (value & 0xf); return (((value >> 4) & 0xf) * 10) + (value & 0xf);
else
return value; return value;
} }

View File

@ -1,5 +1,5 @@
/* RetroArch - A frontend for libretro. /* RetroArch - A frontend for libretro.
* Copyright (C) 2015-2017 - Andre Leiradella * Copyright (C) 2015-2018 - Andre Leiradella
* *
* RetroArch is free software: you can redistribute it and/or modify it under the terms * RetroArch 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 Found- * of the GNU General Public License as published by the Free Software Found-

286
command.c
View File

@ -41,8 +41,12 @@
#ifdef HAVE_CHEEVOS #ifdef HAVE_CHEEVOS
#include "cheevos/cheevos.h" #include "cheevos/cheevos.h"
#ifdef HAVE_NEW_CHEEVOS
#include "cheevos-new/fixup.h"
#else
#include "cheevos/var.h" #include "cheevos/var.h"
#endif #endif
#endif
#ifdef HAVE_DISCORD #ifdef HAVE_DISCORD
#include "discord/discord.h" #include "discord/discord.h"
@ -85,6 +89,7 @@
#include "managers/cheat_manager.h" #include "managers/cheat_manager.h"
#include "managers/state_manager.h" #include "managers/state_manager.h"
#include "ui/ui_companion_driver.h" #include "ui/ui_companion_driver.h"
#include "tasks/task_content.h"
#include "tasks/tasks_internal.h" #include "tasks/tasks_internal.h"
#include "list_special.h" #include "list_special.h"
@ -113,12 +118,14 @@ struct cmd_map
unsigned id; unsigned id;
}; };
#ifdef HAVE_COMMAND
struct cmd_action_map struct cmd_action_map
{ {
const char *str; const char *str;
bool (*action)(const char *arg); bool (*action)(const char *arg);
const char *arg_desc; const char *arg_desc;
}; };
#endif
struct command struct command
{ {
@ -133,9 +140,50 @@ struct command
#endif #endif
}; };
static bool command_version(const char *arg); #if defined(HAVE_COMMAND)
static enum cmd_source_t lastcmd_source;
#if defined(HAVE_NETWORK_CMD) && defined(HAVE_NETWORKING)
static int lastcmd_net_fd;
static struct sockaddr_storage lastcmd_net_source;
static socklen_t lastcmd_net_source_len;
#endif
#if defined(HAVE_COMMAND) && defined(HAVE_CHEEVOS) #if defined(HAVE_CHEEVOS) && (defined(HAVE_STDIN_CMD) || defined(HAVE_NETWORK_CMD) && defined(HAVE_NETWORKING))
static void command_reply(const char * data, size_t len)
{
switch (lastcmd_source)
{
case CMD_STDIN:
#ifdef HAVE_STDIN_CMD
fwrite(data, 1,len, stdout);
#endif
break;
case CMD_NETWORK:
#if defined(HAVE_NETWORKING) && defined(HAVE_NETWORK_CMD)
sendto(lastcmd_net_fd, data, len, 0,
(struct sockaddr*)&lastcmd_net_source, lastcmd_net_source_len);
#endif
break;
case CMD_NONE:
default:
break;
}
}
#endif
static bool command_version(const char* arg)
{
char reply[256] = {0};
sprintf(reply, "%s\n", PACKAGE_VERSION);
#if defined(HAVE_CHEEVOS) && (defined(HAVE_STDIN_CMD) || defined(HAVE_NETWORK_CMD) && defined(HAVE_NETWORKING))
command_reply(reply, strlen(reply));
#endif
return true;
}
#if defined(HAVE_CHEEVOS)
static bool command_read_ram(const char *arg); static bool command_read_ram(const char *arg);
static bool command_write_ram(const char *arg); static bool command_write_ram(const char *arg);
#endif #endif
@ -143,7 +191,7 @@ static bool command_write_ram(const char *arg);
static const struct cmd_action_map action_map[] = { static const struct cmd_action_map action_map[] = {
{ "SET_SHADER", command_set_shader, "<shader path>" }, { "SET_SHADER", command_set_shader, "<shader path>" },
{ "VERSION", command_version, "No argument"}, { "VERSION", command_version, "No argument"},
#if defined(HAVE_COMMAND) && defined(HAVE_CHEEVOS) #if defined(HAVE_CHEEVOS)
{ "READ_CORE_RAM", command_read_ram, "<address> <number of bytes>" }, { "READ_CORE_RAM", command_read_ram, "<address> <number of bytes>" },
{ "WRITE_CORE_RAM", command_write_ram, "<address> <byte1> <byte2> ..." }, { "WRITE_CORE_RAM", command_write_ram, "<address> <byte1> <byte2> ..." },
#endif #endif
@ -173,6 +221,7 @@ static const struct cmd_map map[] = {
{ "SCREENSHOT", RARCH_SCREENSHOT }, { "SCREENSHOT", RARCH_SCREENSHOT },
{ "MUTE", RARCH_MUTE }, { "MUTE", RARCH_MUTE },
{ "OSK", RARCH_OSK }, { "OSK", RARCH_OSK },
{ "FPS_TOGGLE", RARCH_FPS_TOGGLE },
{ "NETPLAY_GAME_WATCH", RARCH_NETPLAY_GAME_WATCH }, { "NETPLAY_GAME_WATCH", RARCH_NETPLAY_GAME_WATCH },
{ "VOLUME_UP", RARCH_VOLUME_UP }, { "VOLUME_UP", RARCH_VOLUME_UP },
{ "VOLUME_DOWN", RARCH_VOLUME_DOWN }, { "VOLUME_DOWN", RARCH_VOLUME_DOWN },
@ -194,40 +243,6 @@ static const struct cmd_map map[] = {
{ "MENU_B", RETRO_DEVICE_ID_JOYPAD_B }, { "MENU_B", RETRO_DEVICE_ID_JOYPAD_B },
{ "MENU_B", RETRO_DEVICE_ID_JOYPAD_B }, { "MENU_B", RETRO_DEVICE_ID_JOYPAD_B },
}; };
static enum cmd_source_t lastcmd_source;
#if defined(HAVE_NETWORKING) && defined(HAVE_NETWORK_CMD)
static int lastcmd_net_fd;
static struct sockaddr_storage lastcmd_net_source;
static socklen_t lastcmd_net_source_len;
#endif
#if defined(HAVE_CHEEVOS) && (defined(HAVE_STDIN_CMD) || defined(HAVE_NETWORK_CMD) && defined(HAVE_NETWORKING))
static bool command_reply(const char * data, size_t len)
{
switch (lastcmd_source)
{
case CMD_NONE:
break;
case CMD_STDIN:
#ifdef HAVE_STDIN_CMD
fwrite(data, 1,len, stdout);
return true;
#else
break;
#endif
case CMD_NETWORK:
#if defined(HAVE_NETWORKING) && defined(HAVE_NETWORK_CMD)
sendto(lastcmd_net_fd, data, len, 0,
(struct sockaddr*)&lastcmd_net_source, lastcmd_net_source_len);
return true;
#else
break;
#endif
}
return false;
}
#endif #endif
bool command_set_shader(const char *arg) bool command_set_shader(const char *arg)
@ -257,44 +272,23 @@ bool command_set_shader(const char *arg)
#endif #endif
} }
static bool command_version(const char* arg)
{
char reply[256] = {0};
sprintf(reply, "%s\n", PACKAGE_VERSION);
#if defined(HAVE_CHEEVOS) && (defined(HAVE_STDIN_CMD) || defined(HAVE_NETWORK_CMD) && defined(HAVE_NETWORKING))
command_reply(reply, strlen(reply));
#endif
return true;
}
#if defined(HAVE_COMMAND) && defined(HAVE_CHEEVOS) #if defined(HAVE_COMMAND) && defined(HAVE_CHEEVOS)
#define SMY_CMD_STR "READ_CORE_RAM" #define SMY_CMD_STR "READ_CORE_RAM"
static bool command_read_ram(const char *arg) static bool command_read_ram(const char *arg)
{ {
cheevos_var_t var; #if defined(HAVE_NEW_CHEEVOS)
unsigned i; unsigned i;
char *reply = NULL; char *reply = NULL;
const uint8_t * data = NULL; const uint8_t * data = NULL;
char *reply_at = NULL; char *reply_at = NULL;
unsigned int nbytes = 0; unsigned int nbytes = 0;
unsigned int alloc_size = 0; unsigned int alloc_size = 0;
int addr = -1; unsigned int addr = -1;
if (sscanf(arg, "%x %d", &addr, &nbytes) != 2) if (sscanf(arg, "%x %d", &addr, &nbytes) != 2)
return true; return true;
alloc_size = 40 + nbytes * 3; /* We alloc more than needed, saving 20 bytes is not really relevant */ data = cheevos_patch_address(addr, cheevos_get_console());
reply = (char*) malloc(alloc_size);
reply[0] = '\0';
reply_at = reply + sprintf(reply, SMY_CMD_STR " %x", addr);
var.value = addr;
cheevos_var_patch_addr(&var, cheevos_get_console());
data = cheevos_var_get_memory(&var);
if (data) if (data)
{ {
@ -309,6 +303,38 @@ static bool command_read_ram(const char *arg)
command_reply(reply, reply_at+strlen(" -1\n") - reply); command_reply(reply, reply_at+strlen(" -1\n") - reply);
} }
free(reply); free(reply);
#else
cheevos_var_t var;
unsigned i;
char reply[256] = {0};
const uint8_t * data = NULL;
char *reply_at = NULL;
reply[0] = '\0';
strlcpy(reply, "READ_CORE_RAM ", sizeof(reply));
reply_at = reply + strlen("READ_CORE_RAM ");
strlcpy(reply_at, arg, sizeof(reply)-strlen(reply));
var.value = strtoul(reply_at, (char**)&reply_at, 16);
cheevos_var_patch_addr(&var, cheevos_get_console());
data = cheevos_var_get_memory(&var);
if (data)
{
unsigned nbytes = strtol(reply_at, NULL, 10);
for (i=0;i<nbytes;i++)
sprintf(reply_at+3*i, " %.2X", data[i]);
reply_at[3*nbytes] = '\n';
command_reply(reply, reply_at+3*nbytes+1 - reply);
}
else
{
strlcpy(reply_at, " -1\n", sizeof(reply)-strlen(reply));
command_reply(reply, reply_at+strlen(" -1\n") - reply);
}
#endif
return true; return true;
} }
@ -316,14 +342,19 @@ static bool command_read_ram(const char *arg)
static bool command_write_ram(const char *arg) static bool command_write_ram(const char *arg)
{ {
cheevos_var_t var;
unsigned nbytes = 0; unsigned nbytes = 0;
#if defined(HAVE_NEW_CHEEVOS)
unsigned int addr = strtoul(arg, (char**)&arg, 16);
uint8_t *data = (uint8_t *)cheevos_patch_address(addr, cheevos_get_console());
#else
cheevos_var_t var;
uint8_t *data = NULL; uint8_t *data = NULL;
var.value = strtoul(arg, (char**)&arg, 16); var.value = strtoul(arg, (char**)&arg, 16);
cheevos_var_patch_addr(&var, cheevos_get_console()); cheevos_var_patch_addr(&var, cheevos_get_console());
data = cheevos_var_get_memory(&var); data = cheevos_var_get_memory(&var);
#endif
if (data) if (data)
{ {
@ -393,7 +424,6 @@ static bool command_network_init(command_t *handle, uint16_t port)
msg_hash_to_str(MSG_BRINGING_UP_COMMAND_INTERFACE_ON_PORT), msg_hash_to_str(MSG_BRINGING_UP_COMMAND_INTERFACE_ON_PORT),
(unsigned short)port); (unsigned short)port);
if (fd < 0) if (fd < 0)
goto error; goto error;
@ -614,7 +644,7 @@ bool command_network_new(
return true; return true;
#if (defined(HAVE_NETWORK_CMD) && defined(HAVE_NETWORKING)) || defined(HAVE_STDIN_CMD) #if defined(HAVE_NETWORKING) && defined(HAVE_NETWORK_CMD) && defined(HAVE_COMMAND) || defined(HAVE_STDIN_CMD)
error: error:
command_free(handle); command_free(handle);
return false; return false;
@ -1117,7 +1147,6 @@ static void command_event_init_cheats(void)
cheat_manager_alloc_if_empty() ; cheat_manager_alloc_if_empty() ;
cheat_manager_load_game_specific_cheats() ; cheat_manager_load_game_specific_cheats() ;
if (settings != NULL && settings->bools.apply_cheats_after_load) if (settings != NULL && settings->bools.apply_cheats_after_load)
cheat_manager_apply_cheats(); cheat_manager_apply_cheats();
} }
@ -1246,6 +1275,7 @@ static bool event_init_content(void)
{ {
bool contentless = false; bool contentless = false;
bool is_inited = false; bool is_inited = false;
settings_t *settings = config_get_ptr();
content_get_status(&contentless, &is_inited); content_get_status(&contentless, &is_inited);
@ -1272,7 +1302,18 @@ static bool event_init_content(void)
RARCH_LOG("%s.\n", RARCH_LOG("%s.\n",
msg_hash_to_str(MSG_SKIPPING_SRAM_LOAD)); msg_hash_to_str(MSG_SKIPPING_SRAM_LOAD));
/*
Since the operations are asynchronouse we can't guarantee users will not use auto_load_state to cheat on
achievements so we forbid auto_load_state from happening if cheevos_enable and cheevos_hardcode_mode_enable
are true
*/
#ifdef HAVE_CHEEVOS
if (!settings->bools.cheevos_enable || !settings->bools.cheevos_hardcore_mode_enable)
command_event_load_auto_state(); command_event_load_auto_state();
#else
command_event_load_auto_state();
#endif
command_event(CMD_EVENT_BSV_MOVIE_INIT, NULL); command_event(CMD_EVENT_BSV_MOVIE_INIT, NULL);
command_event(CMD_EVENT_NETPLAY_INIT, NULL); command_event(CMD_EVENT_NETPLAY_INIT, NULL);
@ -1302,7 +1343,6 @@ static bool command_event_init_core(enum rarch_core_type *data)
if(settings->bools.auto_shaders_enable) if(settings->bools.auto_shaders_enable)
config_load_shader_preset(); config_load_shader_preset();
/* reset video format to libretro's default */ /* reset video format to libretro's default */
video_driver_set_pixel_format(RETRO_PIXEL_FORMAT_0RGB1555); video_driver_set_pixel_format(RETRO_PIXEL_FORMAT_0RGB1555);
@ -1325,7 +1365,6 @@ static bool command_event_init_core(enum rarch_core_type *data)
if (!core_load(settings->uints.input_poll_type_behavior)) if (!core_load(settings->uints.input_poll_type_behavior))
return false; return false;
rarch_ctl(RARCH_CTL_SET_FRAME_LIMIT, NULL); rarch_ctl(RARCH_CTL_SET_FRAME_LIMIT, NULL);
return true; return true;
} }
@ -1589,7 +1628,6 @@ static void command_event_save_current_config(enum override_type type)
break; break;
} }
if (!string_is_empty(msg)) if (!string_is_empty(msg))
runloop_msg_queue_push(msg, 1, 180, true); runloop_msg_queue_push(msg, 1, 180, true);
} }
@ -1638,8 +1676,8 @@ static bool command_event_main_state(unsigned cmd)
{ {
retro_ctx_size_info_t info; retro_ctx_size_info_t info;
char msg[128]; char msg[128];
char *state_path = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); size_t state_path_size = 16384 * sizeof(char);
size_t state_path_size = PATH_MAX_LENGTH * sizeof(char); char *state_path = (char*)malloc(state_path_size);
global_t *global = global_get_ptr(); global_t *global = global_get_ptr();
bool ret = false; bool ret = false;
bool push_msg = true; bool push_msg = true;
@ -1729,56 +1767,6 @@ static bool command_event_resize_windowed_scale(void)
return true; return true;
} }
void command_playlist_push_write(
playlist_t *playlist,
const char *path,
const char *label,
const char *core_path,
const char *core_name)
{
if (!playlist)
return;
if (playlist_push(
playlist,
path,
label,
core_path,
core_name,
NULL,
NULL
))
playlist_write_file(playlist);
}
void command_playlist_update_write(
playlist_t *plist,
size_t idx,
const char *path,
const char *label,
const char *core_path,
const char *core_display_name,
const char *crc32,
const char *db_name)
{
playlist_t *playlist = plist ? plist : playlist_get_cached();
if (!playlist)
return;
playlist_update(
playlist,
idx,
path,
label,
core_path,
core_display_name,
crc32,
db_name);
playlist_write_file(playlist);
}
/** /**
* command_event: * command_event:
* @cmd : Event command index. * @cmd : Event command index.
@ -1789,18 +1777,10 @@ void command_playlist_update_write(
**/ **/
bool command_event(enum event_command cmd, void *data) bool command_event(enum event_command cmd, void *data)
{ {
#ifdef HAVE_DISCORD
static bool discord_inited = false;
#endif
bool boolean = false; bool boolean = false;
switch (cmd) switch (cmd)
{ {
case CMD_EVENT_MENU_REFRESH:
#ifdef HAVE_MENU
menu_driver_ctl(RARCH_MENU_CTL_REFRESH, NULL);
#endif
break;
case CMD_EVENT_SET_PER_GAME_RESOLUTION: case CMD_EVENT_SET_PER_GAME_RESOLUTION:
#if defined(GEKKO) #if defined(GEKKO)
{ {
@ -1860,7 +1840,10 @@ bool command_event(enum event_command cmd, void *data)
break; break;
case CMD_EVENT_LOAD_CORE: case CMD_EVENT_LOAD_CORE:
{ {
bool success = command_event(CMD_EVENT_LOAD_CORE_PERSIST, NULL); bool success = false;
subsystem_current_count = 0;
content_clear_subsystem();
success = command_event(CMD_EVENT_LOAD_CORE_PERSIST, NULL);
(void)success; (void)success;
#ifndef HAVE_DYNAMIC #ifndef HAVE_DYNAMIC
@ -1980,15 +1963,14 @@ bool command_event(enum event_command cmd, void *data)
command_event(CMD_EVENT_RESTORE_REMAPS, NULL); command_event(CMD_EVENT_RESTORE_REMAPS, NULL);
if (is_inited) if (is_inited)
{
if (!task_push_start_dummy_core(&content_info)) if (!task_push_start_dummy_core(&content_info))
return false; return false;
}
#ifdef HAVE_DYNAMIC #ifdef HAVE_DYNAMIC
path_clear(RARCH_PATH_CORE); path_clear(RARCH_PATH_CORE);
rarch_ctl(RARCH_CTL_SYSTEM_INFO_FREE, NULL); rarch_ctl(RARCH_CTL_SYSTEM_INFO_FREE, NULL);
#endif #endif
core_unload_game();
if (!rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL))
core_unload();
#ifdef HAVE_DISCORD #ifdef HAVE_DISCORD
if (discord_is_inited) if (discord_is_inited)
{ {
@ -1998,6 +1980,11 @@ bool command_event(enum event_command cmd, void *data)
command_event(CMD_EVENT_DISCORD_UPDATE, &userdata); command_event(CMD_EVENT_DISCORD_UPDATE, &userdata);
} }
#endif #endif
if (is_inited)
{
subsystem_current_count = 0;
content_clear_subsystem();
}
} }
break; break;
case CMD_EVENT_QUIT: case CMD_EVENT_QUIT:
@ -2138,6 +2125,12 @@ TODO: Add a setting for these tweaks */
RARCH_LOG("%s\n", msg); RARCH_LOG("%s\n", msg);
} }
break; break;
case CMD_EVENT_FPS_TOGGLE:
{
settings_t *settings = config_get_ptr();
settings->bools.video_fps_show = !(settings->bools.video_fps_show);
}
break;
case CMD_EVENT_OVERLAY_DEINIT: case CMD_EVENT_OVERLAY_DEINIT:
#ifdef HAVE_OVERLAY #ifdef HAVE_OVERLAY
input_overlay_free(overlay_ptr); input_overlay_free(overlay_ptr);
@ -2406,17 +2399,12 @@ TODO: Add a setting for these tweaks */
break; break;
case CMD_EVENT_ADD_TO_FAVORITES: case CMD_EVENT_ADD_TO_FAVORITES:
{ {
/* TODO/FIXME - does path_get(RARCH_PATH_CORE) depend on the system info struct? Investigate */
global_t *global = global_get_ptr(); global_t *global = global_get_ptr();
rarch_system_info_t *sys_info = runloop_get_system_info(); struct retro_system_info *system = runloop_get_libretro_system_info();
const char *core_name = NULL;
const char *core_path = NULL;
const char *label = NULL; const char *label = NULL;
const char *core_path = system ? path_get(RARCH_PATH_CORE) : NULL;
if (sys_info) const char *core_name = system ? system->library_name : NULL;
{
core_name = sys_info->info.library_name;
core_path = path_get(RARCH_PATH_CORE);
}
if (!string_is_empty(global->name.label)) if (!string_is_empty(global->name.label))
label = global->name.label; label = global->name.label;
@ -2459,6 +2447,9 @@ TODO: Add a setting for these tweaks */
command_event(CMD_EVENT_QUIT, NULL); command_event(CMD_EVENT_QUIT, NULL);
#endif #endif
break; break;
case CMD_EVENT_MENU_RESET_TO_DEFAULT_CONFIG:
config_set_defaults();
break;
case CMD_EVENT_MENU_SAVE_CURRENT_CONFIG: case CMD_EVENT_MENU_SAVE_CURRENT_CONFIG:
command_event_save_current_config(OVERRIDE_NONE); command_event_save_current_config(OVERRIDE_NONE);
break; break;
@ -2691,9 +2682,12 @@ TODO: Add a setting for these tweaks */
settings_t *settings = config_get_ptr(); settings_t *settings = config_get_ptr();
bool new_fullscreen_state = !settings->bools.video_fullscreen bool new_fullscreen_state = !settings->bools.video_fullscreen
&& !retroarch_is_forced_fullscreen(); && !retroarch_is_forced_fullscreen();
if (!video_driver_has_windowed()) if (!video_driver_has_windowed())
return false; return false;
retroarch_set_switching_display_mode();
/* we toggled manually, write the new value to settings */ /* we toggled manually, write the new value to settings */
configuration_set_bool(settings, settings->bools.video_fullscreen, configuration_set_bool(settings, settings->bools.video_fullscreen,
new_fullscreen_state); new_fullscreen_state);
@ -2709,6 +2703,8 @@ TODO: Add a setting for these tweaks */
video_driver_hide_mouse(); video_driver_hide_mouse();
else else
video_driver_show_mouse(); video_driver_show_mouse();
retroarch_unset_switching_display_mode();
} }
break; break;
case CMD_EVENT_COMMAND_DEINIT: case CMD_EVENT_COMMAND_DEINIT:
@ -2927,26 +2923,24 @@ TODO: Add a setting for these tweaks */
if (!settings->bools.discord_enable) if (!settings->bools.discord_enable)
return false; return false;
if (discord_inited) if (discord_is_ready())
return true; return true;
discord_init(); discord_init();
discord_inited = true;
} }
#endif #endif
break; break;
case CMD_EVENT_DISCORD_DEINIT: case CMD_EVENT_DISCORD_DEINIT:
#ifdef HAVE_DISCORD #ifdef HAVE_DISCORD
if (!discord_inited) if (!discord_is_ready())
return false; return false;
discord_shutdown(); discord_shutdown();
discord_inited = false;
#endif #endif
break; break;
case CMD_EVENT_DISCORD_UPDATE: case CMD_EVENT_DISCORD_UPDATE:
#ifdef HAVE_DISCORD #ifdef HAVE_DISCORD
if (!data || !discord_inited) if (!data || !discord_is_ready())
return false; return false;
{ {

View File

@ -27,8 +27,6 @@
#include "config.h" #include "config.h"
#endif #endif
#include "playlist.h"
RETRO_BEGIN_DECLS RETRO_BEGIN_DECLS
typedef struct command command_t; typedef struct command command_t;
@ -85,6 +83,8 @@ enum event_command
CMD_EVENT_AUDIO_START, CMD_EVENT_AUDIO_START,
/* Mutes audio. */ /* Mutes audio. */
CMD_EVENT_AUDIO_MUTE_TOGGLE, CMD_EVENT_AUDIO_MUTE_TOGGLE,
/* Toggles FPS counter. */
CMD_EVENT_FPS_TOGGLE,
/* Initializes overlay. */ /* Initializes overlay. */
CMD_EVENT_OVERLAY_INIT, CMD_EVENT_OVERLAY_INIT,
/* Deinitializes overlay. */ /* Deinitializes overlay. */
@ -149,6 +149,7 @@ enum event_command
/* Unpauses retroArch. */ /* Unpauses retroArch. */
CMD_EVENT_PAUSE, CMD_EVENT_PAUSE,
CMD_EVENT_PAUSE_CHECKS, CMD_EVENT_PAUSE_CHECKS,
CMD_EVENT_MENU_RESET_TO_DEFAULT_CONFIG,
CMD_EVENT_MENU_SAVE_CURRENT_CONFIG, CMD_EVENT_MENU_SAVE_CURRENT_CONFIG,
CMD_EVENT_MENU_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, CMD_EVENT_MENU_SAVE_CURRENT_CONFIG_OVERRIDE_CORE,
CMD_EVENT_MENU_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR, CMD_EVENT_MENU_SAVE_CURRENT_CONFIG_OVERRIDE_CONTENT_DIR,
@ -157,7 +158,6 @@ enum event_command
CMD_EVENT_MENU_PAUSE_LIBRETRO, CMD_EVENT_MENU_PAUSE_LIBRETRO,
/* Toggles menu on/off. */ /* Toggles menu on/off. */
CMD_EVENT_MENU_TOGGLE, CMD_EVENT_MENU_TOGGLE,
CMD_EVENT_MENU_REFRESH,
/* Applies shader changes. */ /* Applies shader changes. */
CMD_EVENT_SHADERS_APPLY_CHANGES, CMD_EVENT_SHADERS_APPLY_CHANGES,
/* A new shader preset has been loaded */ /* A new shader preset has been loaded */
@ -270,23 +270,6 @@ bool command_free(command_t *handle);
**/ **/
bool command_event(enum event_command action, void *data); bool command_event(enum event_command action, void *data);
void command_playlist_push_write(
playlist_t *playlist,
const char *path,
const char *label,
const char *core_path,
const char *core_name);
void command_playlist_update_write(
playlist_t *playlist,
size_t idx,
const char *path,
const char *label,
const char *core_path,
const char *core_display_name,
const char *crc32,
const char *db_name);
RETRO_END_DECLS RETRO_END_DECLS
#endif #endif

View File

@ -1,7 +1,7 @@
/* RetroArch - A frontend for libretro. /* RetroArch - A frontend for libretro.
* Copyright (C) 2010-2014 - Hans-Kristian Arntzen * Copyright (C) 2010-2014 - Hans-Kristian Arntzen
* Copyright (C) 2011-2016 - Daniel De Matteis * Copyright (C) 2011-2016 - Daniel De Matteis
* Copyright (C) 2016 - Brad Parker * Copyright (C) 2016-2019 - Brad Parker
* *
* RetroArch is free software: you can redistribute it and/or modify it under the terms * RetroArch 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 Found- * of the GNU General Public License as published by the Free Software Found-
@ -48,7 +48,7 @@
#define DEFAULT_ASPECT_RATIO -1.0f #define DEFAULT_ASPECT_RATIO -1.0f
#endif #endif
#ifdef RARCH_MOBILE #if defined(RARCH_MOBILE) || defined(HAVE_LIBNX)
static const bool pointer_enable = true; static const bool pointer_enable = true;
#else #else
static const bool pointer_enable = false; static const bool pointer_enable = false;
@ -117,14 +117,18 @@ static const unsigned monitor_index = 0;
/* Window */ /* Window */
/* Window size. A value of 0 uses window scale /* Window size. A value of 0 uses window scale
* multiplied by the core framebuffer size. */ * multiplied by the core framebuffer size. */
static const unsigned window_x = 0; static const unsigned window_width = 1280;
static const unsigned window_y = 0; static const unsigned window_height = 720;
/* Fullscreen resolution. A value of 0 uses the desktop /* Fullscreen resolution. A value of 0 uses the desktop
* resolution. */ * resolution. */
static const unsigned fullscreen_x = 0; static const unsigned fullscreen_x = 0;
static const unsigned fullscreen_y = 0; static const unsigned fullscreen_y = 0;
/* Number of threads to use for video recording */
static const unsigned video_record_threads = 2;
/* Amount of transparency to use for the main window. /* Amount of transparency to use for the main window.
* 1 is the most transparent while 100 is opaque. * 1 is the most transparent while 100 is opaque.
*/ */
@ -148,7 +152,7 @@ static const bool vsync = true;
static const unsigned max_swapchain_images = 3; static const unsigned max_swapchain_images = 3;
static const bool adaptive_vsync = true; static const bool adaptive_vsync = false;
/* Attempts to hard-synchronize CPU and GPU. /* Attempts to hard-synchronize CPU and GPU.
* Can reduce latency at cost of performance. */ * Can reduce latency at cost of performance. */
@ -181,10 +185,14 @@ static unsigned swap_interval = 1;
/* Threaded video. Will possibly increase performance significantly /* Threaded video. Will possibly increase performance significantly
* at the cost of worse synchronization and latency. * at the cost of worse synchronization and latency.
*/ */
#if defined(HAVE_LIBNX)
static const bool video_threaded = true;
#else
static const bool video_threaded = false; static const bool video_threaded = false;
#endif
#if defined(HAVE_THREADS) #if defined(HAVE_THREADS)
#if defined(GEKKO) || defined(PSP) #if defined(GEKKO) || defined(PSP) || defined(PS2)
/* For single-core consoles right now it's better to have this be disabled. */ /* For single-core consoles right now it's better to have this be disabled. */
static const bool threaded_data_runloop_enable = false; static const bool threaded_data_runloop_enable = false;
#else #else
@ -232,10 +240,15 @@ static const float aspect_ratio = DEFAULT_ASPECT_RATIO;
/* 1:1 PAR */ /* 1:1 PAR */
static const bool aspect_ratio_auto = false; static const bool aspect_ratio_auto = false;
#if defined(__CELLOS_LV2) || defined(_XBOX360) || defined(ANDROID_AARCH64) #if defined(__CELLOS_LV2) || defined(_XBOX360)
static unsigned aspect_ratio_idx = ASPECT_RATIO_16_9; static unsigned aspect_ratio_idx = ASPECT_RATIO_16_9;
#elif defined(PSP) #elif defined(PSP)
static unsigned aspect_ratio_idx = ASPECT_RATIO_CORE; static unsigned aspect_ratio_idx = ASPECT_RATIO_CORE;
#elif defined(_3DS)
/* Previously defaulted to ASPECT_RATIO_4_3.
* Non-4:3 content looks dreadful when stretched
* to 4:3 on the 3DS screen... */
static unsigned aspect_ratio_idx = ASPECT_RATIO_CORE;
#elif defined(RARCH_CONSOLE) #elif defined(RARCH_CONSOLE)
static unsigned aspect_ratio_idx = ASPECT_RATIO_4_3; static unsigned aspect_ratio_idx = ASPECT_RATIO_4_3;
#else #else
@ -262,10 +275,19 @@ static const float default_input_overlay_opacity = 0.7f;
static bool default_block_config_read = true; static bool default_block_config_read = true;
#ifdef HAVE_LIBNX
static bool menu_use_preferred_system_color_theme = true;
#else
static bool menu_use_preferred_system_color_theme = false;
#endif
static bool quick_menu_show_take_screenshot = true; static bool quick_menu_show_take_screenshot = true;
static bool quick_menu_show_save_load_state = true; static bool quick_menu_show_save_load_state = true;
static bool quick_menu_show_undo_save_load_state = true; static bool quick_menu_show_undo_save_load_state = true;
static bool quick_menu_show_add_to_favorites = true; static bool quick_menu_show_add_to_favorites = true;
static bool quick_menu_show_start_recording = true;
static bool quick_menu_show_start_streaming = true;
static bool quick_menu_show_reset_core_association = true;
static bool quick_menu_show_options = true; static bool quick_menu_show_options = true;
static bool quick_menu_show_controls = true; static bool quick_menu_show_controls = true;
static bool quick_menu_show_cheats = true; static bool quick_menu_show_cheats = true;
@ -280,6 +302,7 @@ static bool quick_menu_show_save_content_dir_overrides = true;
static bool kiosk_mode_enable = false; static bool kiosk_mode_enable = false;
static bool menu_horizontal_animation = true;
static bool menu_show_online_updater = true; static bool menu_show_online_updater = true;
static bool menu_show_load_core = true; static bool menu_show_load_core = true;
static bool menu_show_load_content = true; static bool menu_show_load_content = true;
@ -288,7 +311,11 @@ static bool menu_show_configurations = true;
static bool menu_show_help = true; static bool menu_show_help = true;
static bool menu_show_quit_retroarch = true; static bool menu_show_quit_retroarch = true;
static bool menu_show_reboot = true; static bool menu_show_reboot = true;
#ifdef HAVE_LAKKA_SWITCH
static bool menu_show_shutdown = false;
#else
static bool menu_show_shutdown = true; static bool menu_show_shutdown = true;
#endif
#if defined(HAVE_LAKKA) || defined(VITA) || defined(_3DS) #if defined(HAVE_LAKKA) || defined(VITA) || defined(_3DS)
static bool menu_show_core_updater = false; static bool menu_show_core_updater = false;
#else #else
@ -346,9 +373,7 @@ static unsigned menu_shader_pipeline = 2;
#endif #endif
static bool show_advanced_settings = false; static bool show_advanced_settings = false;
static const uint32_t menu_entry_normal_color = 0xffffffff; static unsigned rgui_color_theme = RGUI_THEME_CLASSIC_GREEN;
static const uint32_t menu_entry_hover_color = 0xff64ff64;
static const uint32_t menu_title_color = 0xff64ff64;
#else #else
static bool default_block_config_read = false; static bool default_block_config_read = false;
@ -370,9 +395,11 @@ static bool default_screenshots_in_content_dir = false;
#if defined(__CELLOS_LV2__) || defined(_XBOX1) || defined(_XBOX360) #if defined(__CELLOS_LV2__) || defined(_XBOX1) || defined(_XBOX360)
static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_L3_R3; static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_L3_R3;
#elif defined(PS2)
static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_HOLD_START;
#elif defined(VITA) #elif defined(VITA)
static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_L1_R1_START_SELECT; static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_L1_R1_START_SELECT;
#elif defined(SWITCH) #elif defined(SWITCH) || defined(ORBIS)
static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_START_SELECT; static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_START_SELECT;
#else #else
static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_NONE; static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_NONE;
@ -464,11 +491,23 @@ static const float crt_refresh_rate = 60/1.001;
* Used for setups where one manually rotates the monitor. */ * Used for setups where one manually rotates the monitor. */
static const bool allow_rotate = true; static const bool allow_rotate = true;
#ifdef _3DS
/* Enable bottom LCD screen */
static const bool video_3ds_lcd_bottom = true;
#endif
/* AUDIO */ /* AUDIO */
/* Will enable audio or not. */ /* Will enable audio or not. */
static const bool audio_enable = true; static const bool audio_enable = true;
/* Enable menu audio sounds. */
static const bool audio_enable_menu = false;
static const bool audio_enable_menu_ok = false;
static const bool audio_enable_menu_cancel = false;
static const bool audio_enable_menu_notice = false;
static const bool audio_enable_menu_bgm = false;
/* Output samplerate. */ /* Output samplerate. */
#ifdef GEKKO #ifdef GEKKO
static const unsigned out_rate = 32000; static const unsigned out_rate = 32000;
@ -526,8 +565,11 @@ static const int wasapi_sh_buffer_length = -16; /* auto */
/* Enables displaying the current frames per second. */ /* Enables displaying the current frames per second. */
static const bool fps_show = false; static const bool fps_show = false;
/* Show frame count on FPS display */ /* Enables displaying the current frame count. */
static const bool framecount_show = true; static const bool framecount_show = false;
/* Includes displaying the current memory usage/total with FPS/Frames. */
static const bool memory_show = false;
/* Enables use of rewind. This will incur some memory footprint /* Enables use of rewind. This will incur some memory footprint
* depending on the save state buffer. */ * depending on the save state buffer. */
@ -558,7 +600,13 @@ static const bool pause_nonactive = true;
/* Saves non-volatile SRAM at a regular interval. /* Saves non-volatile SRAM at a regular interval.
* It is measured in seconds. A value of 0 disables autosave. */ * It is measured in seconds. A value of 0 disables autosave. */
#if defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(__x86_64__) || defined(_M_X64) || defined(_WIN32) || defined(OSX) || defined(ANDROID) || defined(IOS)
/* Flush to file every 10 seconds on modern platforms by default */
static const unsigned autosave_interval = 10;
#else
/* Default to disabled on I/O-constrained platforms */
static const unsigned autosave_interval = 0; static const unsigned autosave_interval = 0;
#endif
/* Publicly announce netplay */ /* Publicly announce netplay */
static const bool netplay_public_announce = true; static const bool netplay_public_announce = true;
@ -641,6 +689,9 @@ static const uint16_t network_remote_base_port = 55400;
/* Number of entries that will be kept in content history playlist file. */ /* Number of entries that will be kept in content history playlist file. */
static const unsigned default_content_history_size = 100; static const unsigned default_content_history_size = 100;
/* File format to use when writing playlists to disk */
static const bool playlist_use_old_format = false;
/* Show Menu start-up screen on boot. */ /* Show Menu start-up screen on boot. */
static const bool default_menu_show_start_screen = true; static const bool default_menu_show_start_screen = true;
@ -697,8 +748,12 @@ static const unsigned menu_thumbnails_default = 3;
static const unsigned menu_left_thumbnails_default = 0; static const unsigned menu_left_thumbnails_default = 0;
static const unsigned menu_timedate_style = 5;
static const bool xmb_vertical_thumbnails = false; static const bool xmb_vertical_thumbnails = false;
static unsigned rgui_thumbnail_downscaler = RGUI_THUMB_SCALE_POINT;
#ifdef IOS #ifdef IOS
static const bool ui_companion_start_on_boot = false; static const bool ui_companion_start_on_boot = false;
#else #else
@ -715,7 +770,7 @@ static const bool desktop_menu_enable = true;
#if defined(__QNX__) || defined(_XBOX1) || defined(_XBOX360) || defined(__CELLOS_LV2__) || (defined(__MACH__) && defined(IOS)) || defined(ANDROID) || defined(WIIU) || defined(HAVE_NEON) || defined(GEKKO) || defined(__ARM_NEON__) #if defined(__QNX__) || defined(_XBOX1) || defined(_XBOX360) || defined(__CELLOS_LV2__) || (defined(__MACH__) && defined(IOS)) || defined(ANDROID) || defined(WIIU) || defined(HAVE_NEON) || defined(GEKKO) || defined(__ARM_NEON__)
static enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_LOWER; static enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_LOWER;
#elif defined(PSP) || defined(_3DS) || defined(VITA) #elif defined(PSP) || defined(_3DS) || defined(VITA) || defined(PS2)
static enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_LOWEST; static enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_LOWEST;
#else #else
static enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_NORMAL; static enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_NORMAL;
@ -758,7 +813,23 @@ static char buildbot_server_url[] = "http://bot.libretro.com/nightly/apple/osx/x
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/apple/osx/ppc/latest/"; static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/apple/osx/ppc/latest/";
#endif #endif
#elif defined(_WIN32) && !defined(_XBOX) #elif defined(_WIN32) && !defined(_XBOX)
#if _MSC_VER == 1600 #if _MSC_VER >= 1910
#ifndef __WINRT__
#if defined(__x86_64__) || defined(_M_X64)
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-desktop/x86_64/latest/";
#elif defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(_M_IX86) || defined(_M_IA64)
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-desktop/x86/latest/";
#endif
#else
#if defined(__x86_64__) || defined(_M_X64)
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/x86_64/latest/";
#elif defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(_M_IX86) || defined(_M_IA64)
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/x86/latest/";
#elif defined(__arm__) || defined(_M_ARM)
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/arm/latest/";
#endif
#endif
#elif _MSC_VER == 1600
#if defined(__x86_64__) || defined(_M_X64) #if defined(__x86_64__) || defined(_M_X64)
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2010/x86_64/latest/"; static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2010/x86_64/latest/";
#elif defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(_M_IX86) || defined(_M_IA64) #elif defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(_M_IX86) || defined(_M_IA64)
@ -787,6 +858,8 @@ static char buildbot_server_url[] = "";
#endif #endif
#elif defined(WIIU) #elif defined(WIIU)
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/nintendo/wiiu/latest/"; static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/nintendo/wiiu/latest/";
#elif defined(HAVE_LIBNX)
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/nintendo/switch/libnx/latest/";
#elif defined(__CELLOS_LV2__) && defined(DEX_BUILD) #elif defined(__CELLOS_LV2__) && defined(DEX_BUILD)
static char buildbot_server_url[] = "http://libretro.xbins.org/libretro/nightly/playstation/ps3/latest/dex-ps3/"; static char buildbot_server_url[] = "http://libretro.xbins.org/libretro/nightly/playstation/ps3/latest/dex-ps3/";
#elif defined(__CELLOS_LV2__) && defined(CEX_BUILD) #elif defined(__CELLOS_LV2__) && defined(CEX_BUILD)
@ -799,4 +872,6 @@ static char buildbot_server_url[] = "";
static char buildbot_assets_server_url[] = "http://buildbot.libretro.com/assets/"; static char buildbot_assets_server_url[] = "http://buildbot.libretro.com/assets/";
static char default_discord_app_id[] = "475456035851599874";
#endif #endif

View File

@ -87,6 +87,7 @@ static const struct retro_keybind retro_keybinds_1[] = {
{ true, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
{ true, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
{ true, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
{ true, RARCH_FPS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_FPS_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
{ true, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
{ true, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
{ true, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
@ -165,6 +166,7 @@ static const struct retro_keybind retro_keybinds_1[] = {
{ true, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, RETROK_F8, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, RETROK_F8, NO_BTN, NO_BTN, 0, AXIS_NONE },
{ true, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, RETROK_F9, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, RETROK_F9, NO_BTN, NO_BTN, 0, AXIS_NONE },
{ true, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, RETROK_F12, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, RETROK_F12, NO_BTN, NO_BTN, 0, AXIS_NONE },
{ true, RARCH_FPS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_FPS_TOGGLE, RETROK_F3, NO_BTN, NO_BTN, 0, AXIS_NONE },
{ true, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, RETROK_i, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, RETROK_i, NO_BTN, NO_BTN, 0, AXIS_NONE },
{ true, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
{ true, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, RETROK_KP_PLUS, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, RETROK_KP_PLUS, NO_BTN, NO_BTN, 0, AXIS_NONE },

View File

@ -290,6 +290,12 @@ static const bool _freetype_supp = true;
static const bool _freetype_supp = false; static const bool _freetype_supp = false;
#endif #endif
#ifdef HAVE_STB_FONT
static const bool _stbfont_supp = true;
#else
static const bool _stbfont_supp = false;
#endif
#ifdef HAVE_NETWORKING #ifdef HAVE_NETWORKING
static const bool _netplay_supp = true; static const bool _netplay_supp = true;
#else #else
@ -302,7 +308,7 @@ static const bool _python_supp = true;
static const bool _python_supp = false; static const bool _python_supp = false;
#endif #endif
#if defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH) #if defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH) || defined(HAVE_COCOA_METAL)
static const bool _cocoa_supp = true; static const bool _cocoa_supp = true;
#else #else
static const bool _cocoa_supp = false; static const bool _cocoa_supp = false;

View File

@ -3,7 +3,7 @@
* Copyright (C) 2011-2017 - Daniel De Matteis * Copyright (C) 2011-2017 - Daniel De Matteis
* Copyright (C) 2014-2017 - Jean-André Santoni * Copyright (C) 2014-2017 - Jean-André Santoni
* Copyright (C) 2015-2017 - Andrés Suárez * Copyright (C) 2015-2017 - Andrés Suárez
* Copyright (C) 2016-2017 - Brad Parker * Copyright (C) 2016-2019 - Brad Parker
* *
* RetroArch is free software: you can redistribute it and/or modify it under the terms * RetroArch 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 Found- * of the GNU General Public License as published by the Free Software Found-
@ -50,10 +50,17 @@
#include "verbosity.h" #include "verbosity.h"
#include "lakka.h" #include "lakka.h"
#include "tasks/task_content.h"
#include "tasks/tasks_internal.h" #include "tasks/tasks_internal.h"
#include "../list_special.h" #include "../list_special.h"
#include "record/record_driver.h"
#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
#include "uwp/uwp_func.h"
#endif
static const char* invalid_filename_chars[] = { static const char* invalid_filename_chars[] = {
/* https://support.microsoft.com/en-us/help/905231/information-about-the-characters-that-you-cannot-use-in-site-names--fo */ /* https://support.microsoft.com/en-us/help/905231/information-about-the-characters-that-you-cannot-use-in-site-names--fo */
"~", "#", "%", "&", "*", "{", "}", "\\", ":", "[", "]", "?", "/", "|", "\'", "\"", "~", "#", "%", "&", "*", "{", "}", "\\", ":", "[", "]", "?", "/", "|", "\'", "\"",
@ -146,6 +153,7 @@ enum video_driver_enum
VIDEO_XENON360, VIDEO_XENON360,
VIDEO_PSP1, VIDEO_PSP1,
VIDEO_VITA2D, VIDEO_VITA2D,
VIDEO_PS2,
VIDEO_CTR, VIDEO_CTR,
VIDEO_SWITCH, VIDEO_SWITCH,
VIDEO_D3D8, VIDEO_D3D8,
@ -189,6 +197,7 @@ enum audio_driver_enum
AUDIO_WIIU, AUDIO_WIIU,
AUDIO_RWEBAUDIO, AUDIO_RWEBAUDIO,
AUDIO_PSP, AUDIO_PSP,
AUDIO_PS2,
AUDIO_CTR, AUDIO_CTR,
AUDIO_SWITCH, AUDIO_SWITCH,
AUDIO_NULL AUDIO_NULL
@ -210,14 +219,17 @@ enum input_driver_enum
INPUT_X, INPUT_X,
INPUT_WAYLAND, INPUT_WAYLAND,
INPUT_DINPUT, INPUT_DINPUT,
INPUT_PS4,
INPUT_PS3, INPUT_PS3,
INPUT_PSP, INPUT_PSP,
INPUT_PS2,
INPUT_CTR, INPUT_CTR,
INPUT_SWITCH, INPUT_SWITCH,
INPUT_XENON360, INPUT_XENON360,
INPUT_WII, INPUT_WII,
INPUT_WIIU, INPUT_WIIU,
INPUT_XINPUT, INPUT_XINPUT,
INPUT_UWP,
INPUT_UDEV, INPUT_UDEV,
INPUT_LINUXRAW, INPUT_LINUXRAW,
INPUT_COCOA, INPUT_COCOA,
@ -234,7 +246,9 @@ enum joypad_driver_enum
JOYPAD_GX, JOYPAD_GX,
JOYPAD_WIIU, JOYPAD_WIIU,
JOYPAD_XDK, JOYPAD_XDK,
JOYPAD_PS4,
JOYPAD_PSP, JOYPAD_PSP,
JOYPAD_PS2,
JOYPAD_CTR, JOYPAD_CTR,
JOYPAD_SWITCH, JOYPAD_SWITCH,
JOYPAD_DINPUT, JOYPAD_DINPUT,
@ -286,6 +300,7 @@ enum menu_driver_enum
MENU_XMB, MENU_XMB,
MENU_STRIPES, MENU_STRIPES,
MENU_NUKLEAR, MENU_NUKLEAR,
MENU_OZONE,
MENU_NULL MENU_NULL
}; };
@ -298,6 +313,7 @@ enum record_driver_enum
enum midi_driver_enum enum midi_driver_enum
{ {
MIDI_WINMM = RECORD_NULL + 1, MIDI_WINMM = RECORD_NULL + 1,
MIDI_ALSA,
MIDI_NULL MIDI_NULL
}; };
@ -311,6 +327,13 @@ static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_WII;
static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_WIIU; static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_WIIU;
#elif defined(XENON) #elif defined(XENON)
static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_XENON360; static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_XENON360;
#elif defined(HAVE_D3D12) && false
/* FIXME: DX12 performance on Xbox is horrible for some reason, so use d3d11 as default */
static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_D3D12;
#elif defined(HAVE_D3D11)
static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_D3D11;
#elif defined(HAVE_D3D10)
static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_D3D10;
#elif defined(HAVE_D3D9) #elif defined(HAVE_D3D9)
static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_D3D9; static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_D3D9;
#elif defined(HAVE_D3D8) #elif defined(HAVE_D3D8)
@ -321,6 +344,8 @@ static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_VG;
static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_VITA2D; static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_VITA2D;
#elif defined(PSP) #elif defined(PSP)
static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_PSP1; static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_PSP1;
#elif defined(PS2)
static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_PS2;
#elif defined(_3DS) #elif defined(_3DS)
static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_CTR; static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_CTR;
#elif defined(SWITCH) #elif defined(SWITCH)
@ -349,8 +374,10 @@ static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_XENON360;
static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_WII; static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_WII;
#elif defined(WIIU) #elif defined(WIIU)
static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_WIIU; static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_WIIU;
#elif defined(PSP) || defined(VITA) #elif defined(PSP) || defined(VITA) || defined(ORBIS)
static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_PSP; static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_PSP;
#elif defined(PS2)
static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_PS2;
#elif defined(_3DS) #elif defined(_3DS)
static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_CTR; static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_CTR;
#elif defined(SWITCH) #elif defined(SWITCH)
@ -409,11 +436,15 @@ static enum record_driver_enum RECORD_DEFAULT_DRIVER = RECORD_NULL;
#ifdef HAVE_WINMM #ifdef HAVE_WINMM
static enum midi_driver_enum MIDI_DEFAULT_DRIVER = MIDI_WINMM; static enum midi_driver_enum MIDI_DEFAULT_DRIVER = MIDI_WINMM;
#elif defined HAVE_ALSA
static enum midi_driver_enum MIDI_DEFAULT_DRIVER = MIDI_ALSA;
#else #else
static enum midi_driver_enum MIDI_DEFAULT_DRIVER = MIDI_NULL; static enum midi_driver_enum MIDI_DEFAULT_DRIVER = MIDI_NULL;
#endif #endif
#if defined(XENON) #if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_UWP;
#elif defined(XENON)
static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_XENON360; static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_XENON360;
#elif defined(_XBOX360) || defined(_XBOX) || defined(HAVE_XINPUT2) || defined(HAVE_XINPUT_XBOX1) #elif defined(_XBOX360) || defined(_XBOX) || defined(HAVE_XINPUT2) || defined(HAVE_XINPUT_XBOX1)
static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_XINPUT; static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_XINPUT;
@ -425,10 +456,14 @@ static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_SDL2;
static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_RWEBINPUT; static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_RWEBINPUT;
#elif defined(_WIN32) #elif defined(_WIN32)
static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_DINPUT; static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_DINPUT;
#elif defined(ORBIS)
static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_PS4;
#elif defined(__CELLOS_LV2__) #elif defined(__CELLOS_LV2__)
static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_PS3; static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_PS3;
#elif defined(PSP) || defined(VITA) #elif defined(PSP) || defined(VITA)
static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_PSP; static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_PSP;
#elif defined(PS2)
static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_PS2;
#elif defined(_3DS) #elif defined(_3DS)
static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_CTR; static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_CTR;
#elif defined(SWITCH) #elif defined(SWITCH)
@ -445,7 +480,7 @@ static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_UDEV;
static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_LINUXRAW; static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_LINUXRAW;
#elif defined(HAVE_WAYLAND) #elif defined(HAVE_WAYLAND)
static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_WAYLAND; static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_WAYLAND;
#elif defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH) #elif defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH) || defined(HAVE_COCOA_METAL)
static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_COCOA; static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_COCOA;
#elif defined(__QNX__) #elif defined(__QNX__)
static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_QNX; static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_QNX;
@ -469,8 +504,12 @@ static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_GX;
static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_WIIU; static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_WIIU;
#elif defined(_XBOX) #elif defined(_XBOX)
static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_XDK; static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_XDK;
#elif defined(ORBIS)
static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_PS4;
#elif defined(PSP) || defined(VITA) #elif defined(PSP) || defined(VITA)
static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_PSP; static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_PSP;
#elif defined(PS2)
static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_PS2;
#elif defined(_3DS) #elif defined(_3DS)
static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_CTR; static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_CTR;
#elif defined(SWITCH) #elif defined(SWITCH)
@ -505,7 +544,7 @@ static enum camera_driver_enum CAMERA_DEFAULT_DRIVER = CAMERA_V4L2;
static enum camera_driver_enum CAMERA_DEFAULT_DRIVER = CAMERA_RWEBCAM; static enum camera_driver_enum CAMERA_DEFAULT_DRIVER = CAMERA_RWEBCAM;
#elif defined(ANDROID) #elif defined(ANDROID)
static enum camera_driver_enum CAMERA_DEFAULT_DRIVER = CAMERA_ANDROID; static enum camera_driver_enum CAMERA_DEFAULT_DRIVER = CAMERA_ANDROID;
#elif defined(HAVE_AVFOUNDATION) && (defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH)) #elif defined(HAVE_AVFOUNDATION) && (defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH) || defined(HAVE_COCOA_METAL))
static enum camera_driver_enum CAMERA_DEFAULT_DRIVER = CAMERA_AVFOUNDATION; static enum camera_driver_enum CAMERA_DEFAULT_DRIVER = CAMERA_AVFOUNDATION;
#else #else
static enum camera_driver_enum CAMERA_DEFAULT_DRIVER = CAMERA_NULL; static enum camera_driver_enum CAMERA_DEFAULT_DRIVER = CAMERA_NULL;
@ -519,16 +558,21 @@ static enum wifi_driver_enum WIFI_DEFAULT_DRIVER = WIFI_NULL;
#if defined(ANDROID) #if defined(ANDROID)
static enum location_driver_enum LOCATION_DEFAULT_DRIVER = LOCATION_ANDROID; static enum location_driver_enum LOCATION_DEFAULT_DRIVER = LOCATION_ANDROID;
#elif defined(HAVE_CORELOCATION) && (defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH)) #elif defined(HAVE_CORELOCATION) && (defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH) || defined(HAVE_COCOA_METAL))
static enum location_driver_enum LOCATION_DEFAULT_DRIVER = LOCATION_CORELOCATION; static enum location_driver_enum LOCATION_DEFAULT_DRIVER = LOCATION_CORELOCATION;
#else #else
static enum location_driver_enum LOCATION_DEFAULT_DRIVER = LOCATION_NULL; static enum location_driver_enum LOCATION_DEFAULT_DRIVER = LOCATION_NULL;
#endif #endif
#if defined(_3DS) && defined(HAVE_RGUI)
static enum menu_driver_enum MENU_DEFAULT_DRIVER = MENU_RGUI;
#else
#if defined(HAVE_XUI) #if defined(HAVE_XUI)
static enum menu_driver_enum MENU_DEFAULT_DRIVER = MENU_XUI; static enum menu_driver_enum MENU_DEFAULT_DRIVER = MENU_XUI;
#elif defined(HAVE_MATERIALUI) && defined(RARCH_MOBILE) #elif defined(HAVE_MATERIALUI) && defined(RARCH_MOBILE)
static enum menu_driver_enum MENU_DEFAULT_DRIVER = MENU_MATERIALUI; static enum menu_driver_enum MENU_DEFAULT_DRIVER = MENU_MATERIALUI;
#elif defined(HAVE_OZONE) && defined(HAVE_LIBNX)
static enum menu_driver_enum MENU_DEFAULT_DRIVER = MENU_OZONE;
#elif defined(HAVE_XMB) && !defined(_XBOX) #elif defined(HAVE_XMB) && !defined(_XBOX)
static enum menu_driver_enum MENU_DEFAULT_DRIVER = MENU_XMB; static enum menu_driver_enum MENU_DEFAULT_DRIVER = MENU_XMB;
#elif defined(HAVE_RGUI) #elif defined(HAVE_RGUI)
@ -536,7 +580,7 @@ static enum menu_driver_enum MENU_DEFAULT_DRIVER = MENU_RGUI;
#else #else
static enum menu_driver_enum MENU_DEFAULT_DRIVER = MENU_NULL; static enum menu_driver_enum MENU_DEFAULT_DRIVER = MENU_NULL;
#endif #endif
#endif
#define GENERAL_SETTING(key, configval, default_enable, default_setting, type, handle_setting) \ #define GENERAL_SETTING(key, configval, default_enable, default_setting, type, handle_setting) \
{ \ { \
@ -650,13 +694,17 @@ const char *config_get_default_audio(void)
case AUDIO_WIIU: case AUDIO_WIIU:
return "AX"; return "AX";
case AUDIO_PSP: case AUDIO_PSP:
#ifdef VITA #if defined(VITA)
return "vita"; return "vita";
#elif defined(ORBIS)
return "orbis";
#else #else
return "psp"; return "psp";
#endif #endif
case AUDIO_PS2:
return "ps2";
case AUDIO_CTR: case AUDIO_CTR:
return "csnd"; return "dsp";
case AUDIO_SWITCH: case AUDIO_SWITCH:
return "switch"; return "switch";
case AUDIO_RWEBAUDIO: case AUDIO_RWEBAUDIO:
@ -750,6 +798,8 @@ const char *config_get_default_video(void)
return "d3d12"; return "d3d12";
case VIDEO_PSP1: case VIDEO_PSP1:
return "psp1"; return "psp1";
case VIDEO_PS2:
return "ps2";
case VIDEO_VITA2D: case VIDEO_VITA2D:
return "vita2d"; return "vita2d";
case VIDEO_CTR: case VIDEO_CTR:
@ -802,6 +852,8 @@ const char *config_get_default_input(void)
{ {
case INPUT_ANDROID: case INPUT_ANDROID:
return "android"; return "android";
case INPUT_PS4:
return "ps4";
case INPUT_PS3: case INPUT_PS3:
return "ps3"; return "ps3";
case INPUT_PSP: case INPUT_PSP:
@ -810,6 +862,8 @@ const char *config_get_default_input(void)
#else #else
return "psp"; return "psp";
#endif #endif
case INPUT_PS2:
return "ps2";
case INPUT_CTR: case INPUT_CTR:
return "ctr"; return "ctr";
case INPUT_SWITCH: case INPUT_SWITCH:
@ -828,6 +882,8 @@ const char *config_get_default_input(void)
return "xenon360"; return "xenon360";
case INPUT_XINPUT: case INPUT_XINPUT:
return "xinput"; return "xinput";
case INPUT_UWP:
return "uwp";
case INPUT_WII: case INPUT_WII:
return "gx"; return "gx";
case INPUT_WIIU: case INPUT_WIIU:
@ -864,6 +920,8 @@ const char *config_get_default_joypad(void)
switch (default_driver) switch (default_driver)
{ {
case JOYPAD_PS4:
return "ps4";
case JOYPAD_PS3: case JOYPAD_PS3:
return "ps3"; return "ps3";
case JOYPAD_XINPUT: case JOYPAD_XINPUT:
@ -880,6 +938,8 @@ const char *config_get_default_joypad(void)
#else #else
return "psp"; return "psp";
#endif #endif
case JOYPAD_PS2:
return "ps2";
case JOYPAD_CTR: case JOYPAD_CTR:
return "ctr"; return "ctr";
case JOYPAD_SWITCH: case JOYPAD_SWITCH:
@ -915,7 +975,6 @@ const char *config_get_default_joypad(void)
return "null"; return "null";
} }
/** /**
* config_get_default_camera: * config_get_default_camera:
* *
@ -1023,6 +1082,8 @@ const char *config_get_default_menu(void)
return "rgui"; return "rgui";
case MENU_XUI: case MENU_XUI:
return "xui"; return "xui";
case MENU_OZONE:
return "ozone";
case MENU_MATERIALUI: case MENU_MATERIALUI:
return "glui"; return "glui";
case MENU_XMB: case MENU_XMB:
@ -1047,6 +1108,8 @@ const char *config_get_default_midi(void)
{ {
case MIDI_WINMM: case MIDI_WINMM:
return "winmm"; return "winmm";
case MIDI_ALSA:
return "alsa";
case MIDI_NULL: case MIDI_NULL:
break; break;
} }
@ -1071,6 +1134,9 @@ static struct config_array_setting *populate_settings_array(settings_t *settings
unsigned count = 0; unsigned count = 0;
struct config_array_setting *tmp = (struct config_array_setting*)calloc(1, (*size + 1) * sizeof(struct config_array_setting)); struct config_array_setting *tmp = (struct config_array_setting*)calloc(1, (*size + 1) * sizeof(struct config_array_setting));
if (!tmp)
return NULL;
/* Arrays */ /* Arrays */
SETTING_ARRAY("playlist_names", settings->arrays.playlist_names, false, NULL, true); SETTING_ARRAY("playlist_names", settings->arrays.playlist_names, false, NULL, true);
SETTING_ARRAY("playlist_cores", settings->arrays.playlist_cores, false, NULL, true); SETTING_ARRAY("playlist_cores", settings->arrays.playlist_cores, false, NULL, true);
@ -1103,6 +1169,8 @@ static struct config_array_setting *populate_settings_array(settings_t *settings
SETTING_ARRAY("midi_driver", settings->arrays.midi_driver, false, NULL, true); SETTING_ARRAY("midi_driver", settings->arrays.midi_driver, false, NULL, true);
SETTING_ARRAY("midi_input", settings->arrays.midi_input, true, midi_input, true); SETTING_ARRAY("midi_input", settings->arrays.midi_input, true, midi_input, true);
SETTING_ARRAY("midi_output", settings->arrays.midi_output, true, midi_output, true); SETTING_ARRAY("midi_output", settings->arrays.midi_output, true, midi_output, true);
SETTING_ARRAY("youtube_stream_key", settings->arrays.youtube_stream_key, true, NULL, true);
SETTING_ARRAY("discord_app_id", settings->arrays.discord_app_id, true, default_discord_app_id, true);
*size = count; *size = count;
return tmp; return tmp;
@ -1114,6 +1182,9 @@ static struct config_path_setting *populate_settings_path(settings_t *settings,
global_t *global = global_get_ptr(); global_t *global = global_get_ptr();
struct config_path_setting *tmp = (struct config_path_setting*)calloc(1, (*size + 1) * sizeof(struct config_path_setting)); struct config_path_setting *tmp = (struct config_path_setting*)calloc(1, (*size + 1) * sizeof(struct config_path_setting));
if (!tmp)
return NULL;
/* Paths */ /* Paths */
#ifdef HAVE_XMB #ifdef HAVE_XMB
SETTING_PATH("xmb_font", settings->paths.path_menu_xmb_font, false, NULL, true); SETTING_PATH("xmb_font", settings->paths.path_menu_xmb_font, false, NULL, true);
@ -1145,6 +1216,8 @@ static struct config_path_setting *populate_settings_path(settings_t *settings,
#ifdef HAVE_MENU #ifdef HAVE_MENU
SETTING_PATH("menu_wallpaper", SETTING_PATH("menu_wallpaper",
settings->paths.path_menu_wallpaper, false, NULL, true); settings->paths.path_menu_wallpaper, false, NULL, true);
SETTING_PATH("rgui_menu_theme_preset",
settings->paths.path_rgui_theme_preset, false, NULL, true);
#endif #endif
SETTING_PATH("content_history_path", SETTING_PATH("content_history_path",
settings->paths.path_content_history, false, NULL, true); settings->paths.path_content_history, false, NULL, true);
@ -1160,14 +1233,12 @@ static struct config_path_setting *populate_settings_path(settings_t *settings,
SETTING_PATH("input_overlay", SETTING_PATH("input_overlay",
settings->paths.path_overlay, false, NULL, true); settings->paths.path_overlay, false, NULL, true);
#endif #endif
#ifdef HAVE_FFMPEG
SETTING_PATH("video_record_config", SETTING_PATH("video_record_config",
settings->paths.path_record_config, false, NULL, true); settings->paths.path_record_config, false, NULL, true);
SETTING_PATH("video_stream_config", SETTING_PATH("video_stream_config",
settings->paths.path_stream_config, false, NULL, true); settings->paths.path_stream_config, false, NULL, true);
SETTING_PATH("video_stream_url", SETTING_PATH("video_stream_url",
settings->paths.path_stream_url, false, NULL, true); settings->paths.path_stream_url, false, NULL, true);
#endif
SETTING_PATH("video_font_path", SETTING_PATH("video_font_path",
settings->paths.path_font, false, NULL, true); settings->paths.path_font, false, NULL, true);
SETTING_PATH("cursor_directory", SETTING_PATH("cursor_directory",
@ -1285,7 +1356,8 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings,
SETTING_BOOL("builtin_imageviewer_enable", &settings->bools.multimedia_builtin_imageviewer_enable, true, true, false); SETTING_BOOL("builtin_imageviewer_enable", &settings->bools.multimedia_builtin_imageviewer_enable, true, true, false);
SETTING_BOOL("fps_show", &settings->bools.video_fps_show, true, false, false); SETTING_BOOL("fps_show", &settings->bools.video_fps_show, true, false, false);
SETTING_BOOL("statistics_show", &settings->bools.video_statistics_show, true, false, false); SETTING_BOOL("statistics_show", &settings->bools.video_statistics_show, true, false, false);
SETTING_BOOL("framecount_show", &settings->bools.video_framecount_show, true, true, false); SETTING_BOOL("framecount_show", &settings->bools.video_framecount_show, true, false, false);
SETTING_BOOL("memory_show", &settings->bools.video_memory_show, true, false, false);
SETTING_BOOL("ui_menubar_enable", &settings->bools.ui_menubar_enable, true, true, false); SETTING_BOOL("ui_menubar_enable", &settings->bools.ui_menubar_enable, true, true, false);
SETTING_BOOL("suspend_screensaver_enable", &settings->bools.ui_suspend_screensaver_enable, true, true, false); SETTING_BOOL("suspend_screensaver_enable", &settings->bools.ui_suspend_screensaver_enable, true, true, false);
SETTING_BOOL("rewind_enable", &settings->bools.rewind_enable, true, rewind_enable, false); SETTING_BOOL("rewind_enable", &settings->bools.rewind_enable, true, rewind_enable, false);
@ -1325,7 +1397,11 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings,
SETTING_BOOL("keyboard_gamepad_enable", &settings->bools.input_keyboard_gamepad_enable, true, true, false); SETTING_BOOL("keyboard_gamepad_enable", &settings->bools.input_keyboard_gamepad_enable, true, true, false);
SETTING_BOOL("core_set_supports_no_game_enable", &settings->bools.set_supports_no_game_enable, true, true, false); SETTING_BOOL("core_set_supports_no_game_enable", &settings->bools.set_supports_no_game_enable, true, true, false);
SETTING_BOOL("audio_enable", &settings->bools.audio_enable, true, audio_enable, false); SETTING_BOOL("audio_enable", &settings->bools.audio_enable, true, audio_enable, false);
SETTING_BOOL("audio_enable_menu", &settings->bools.audio_enable_menu, true, false, false); SETTING_BOOL("audio_enable_menu", &settings->bools.audio_enable_menu, true, audio_enable_menu, false);
SETTING_BOOL("audio_enable_menu_ok", &settings->bools.audio_enable_menu_ok, true, audio_enable_menu_ok, false);
SETTING_BOOL("audio_enable_menu_cancel", &settings->bools.audio_enable_menu_cancel, true, audio_enable_menu_cancel, false);
SETTING_BOOL("audio_enable_menu_notice", &settings->bools.audio_enable_menu_notice, true, audio_enable_menu_notice, false);
SETTING_BOOL("audio_enable_menu_bgm", &settings->bools.audio_enable_menu_bgm, true, audio_enable_menu_bgm, false);
SETTING_BOOL("audio_mute_enable", audio_get_bool_ptr(AUDIO_ACTION_MUTE_ENABLE), true, false, false); SETTING_BOOL("audio_mute_enable", audio_get_bool_ptr(AUDIO_ACTION_MUTE_ENABLE), true, false, false);
SETTING_BOOL("audio_mixer_mute_enable", audio_get_bool_ptr(AUDIO_ACTION_MIXER_MUTE_ENABLE), true, false, false); SETTING_BOOL("audio_mixer_mute_enable", audio_get_bool_ptr(AUDIO_ACTION_MIXER_MUTE_ENABLE), true, false, false);
SETTING_BOOL("location_allow", &settings->bools.location_allow, true, false, false); SETTING_BOOL("location_allow", &settings->bools.location_allow, true, false, false);
@ -1343,11 +1419,11 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings,
#ifdef GEKKO #ifdef GEKKO
SETTING_BOOL("video_vfilter", &settings->bools.video_vfilter, true, video_vfilter, false); SETTING_BOOL("video_vfilter", &settings->bools.video_vfilter, true, video_vfilter, false);
#endif #endif
#ifdef HAVE_MENU
SETTING_BOOL("menu_unified_controls", &settings->bools.menu_unified_controls, true, false, false);
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
SETTING_BOOL("threaded_data_runloop_enable", &settings->bools.threaded_data_runloop_enable, true, threaded_data_runloop_enable, false); SETTING_BOOL("threaded_data_runloop_enable", &settings->bools.threaded_data_runloop_enable, true, threaded_data_runloop_enable, false);
#endif #endif
#ifdef HAVE_MENU
SETTING_BOOL("menu_unified_controls", &settings->bools.menu_unified_controls, true, false, false);
SETTING_BOOL("menu_throttle_framerate", &settings->bools.menu_throttle_framerate, true, true, false); SETTING_BOOL("menu_throttle_framerate", &settings->bools.menu_throttle_framerate, true, true, false);
SETTING_BOOL("menu_linear_filter", &settings->bools.menu_linear_filter, true, true, false); SETTING_BOOL("menu_linear_filter", &settings->bools.menu_linear_filter, true, true, false);
SETTING_BOOL("menu_horizontal_animation", &settings->bools.menu_horizontal_animation, true, true, false); SETTING_BOOL("menu_horizontal_animation", &settings->bools.menu_horizontal_animation, true, true, false);
@ -1366,6 +1442,9 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings,
SETTING_BOOL("quick_menu_show_save_load_state", &settings->bools.quick_menu_show_save_load_state, true, quick_menu_show_save_load_state, false); SETTING_BOOL("quick_menu_show_save_load_state", &settings->bools.quick_menu_show_save_load_state, true, quick_menu_show_save_load_state, false);
SETTING_BOOL("quick_menu_show_undo_save_load_state", &settings->bools.quick_menu_show_undo_save_load_state, true, quick_menu_show_undo_save_load_state, false); SETTING_BOOL("quick_menu_show_undo_save_load_state", &settings->bools.quick_menu_show_undo_save_load_state, true, quick_menu_show_undo_save_load_state, false);
SETTING_BOOL("quick_menu_show_add_to_favorites", &settings->bools.quick_menu_show_add_to_favorites, true, quick_menu_show_add_to_favorites, false); SETTING_BOOL("quick_menu_show_add_to_favorites", &settings->bools.quick_menu_show_add_to_favorites, true, quick_menu_show_add_to_favorites, false);
SETTING_BOOL("quick_menu_show_start_recording", &settings->bools.quick_menu_show_start_recording, true, quick_menu_show_start_recording, false);
SETTING_BOOL("quick_menu_show_start_streaming", &settings->bools.quick_menu_show_start_streaming, true, quick_menu_show_start_streaming, false);
SETTING_BOOL("quick_menu_show_reset_core_association", &settings->bools.quick_menu_show_reset_core_association, true, quick_menu_show_reset_core_association, false);
SETTING_BOOL("quick_menu_show_options", &settings->bools.quick_menu_show_options, true, quick_menu_show_options, false); SETTING_BOOL("quick_menu_show_options", &settings->bools.quick_menu_show_options, true, quick_menu_show_options, false);
SETTING_BOOL("quick_menu_show_controls", &settings->bools.quick_menu_show_controls, true, quick_menu_show_controls, false); SETTING_BOOL("quick_menu_show_controls", &settings->bools.quick_menu_show_controls, true, quick_menu_show_controls, false);
SETTING_BOOL("quick_menu_show_cheats", &settings->bools.quick_menu_show_cheats, true, quick_menu_show_cheats, false); SETTING_BOOL("quick_menu_show_cheats", &settings->bools.quick_menu_show_cheats, true, quick_menu_show_cheats, false);
@ -1375,6 +1454,7 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings,
SETTING_BOOL("quick_menu_show_save_content_dir_overrides", &settings->bools.quick_menu_show_save_content_dir_overrides, true, quick_menu_show_save_content_dir_overrides, false); SETTING_BOOL("quick_menu_show_save_content_dir_overrides", &settings->bools.quick_menu_show_save_content_dir_overrides, true, quick_menu_show_save_content_dir_overrides, false);
SETTING_BOOL("quick_menu_show_information", &settings->bools.quick_menu_show_information, true, quick_menu_show_information, false); SETTING_BOOL("quick_menu_show_information", &settings->bools.quick_menu_show_information, true, quick_menu_show_information, false);
SETTING_BOOL("kiosk_mode_enable", &settings->bools.kiosk_mode_enable, true, kiosk_mode_enable, false); SETTING_BOOL("kiosk_mode_enable", &settings->bools.kiosk_mode_enable, true, kiosk_mode_enable, false);
SETTING_BOOL("menu_use_preferred_system_color_theme", &settings->bools.menu_use_preferred_system_color_theme, true, menu_use_preferred_system_color_theme, false);
SETTING_BOOL("content_show_settings", &settings->bools.menu_content_show_settings, true, content_show_settings, false); SETTING_BOOL("content_show_settings", &settings->bools.menu_content_show_settings, true, content_show_settings, false);
SETTING_BOOL("content_show_favorites", &settings->bools.menu_content_show_favorites, true, content_show_favorites, false); SETTING_BOOL("content_show_favorites", &settings->bools.menu_content_show_favorites, true, content_show_favorites, false);
#ifdef HAVE_IMAGEVIEWER #ifdef HAVE_IMAGEVIEWER
@ -1481,9 +1561,16 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings,
SETTING_BOOL("video_msg_bgcolor_enable", &settings->bools.video_msg_bgcolor_enable, true, message_bgcolor_enable, false); SETTING_BOOL("video_msg_bgcolor_enable", &settings->bools.video_msg_bgcolor_enable, true, message_bgcolor_enable, false);
SETTING_BOOL("video_window_show_decorations", &settings->bools.video_window_show_decorations, true, window_decorations, false); SETTING_BOOL("video_window_show_decorations", &settings->bools.video_window_show_decorations, true, window_decorations, false);
SETTING_BOOL("video_window_save_positions", &settings->bools.video_window_save_positions, true, false, false);
SETTING_BOOL("sustained_performance_mode", &settings->bools.sustained_performance_mode, true, sustained_performance_mode, false); SETTING_BOOL("sustained_performance_mode", &settings->bools.sustained_performance_mode, true, sustained_performance_mode, false);
#ifdef _3DS
SETTING_BOOL("video_3ds_lcd_bottom", &settings->bools.video_3ds_lcd_bottom, true, video_3ds_lcd_bottom, false);
#endif
SETTING_BOOL("playlist_use_old_format", &settings->bools.playlist_use_old_format, true, playlist_use_old_format, false);
*size = count; *size = count;
return tmp; return tmp;
@ -1494,6 +1581,9 @@ static struct config_float_setting *populate_settings_float(settings_t *settings
unsigned count = 0; unsigned count = 0;
struct config_float_setting *tmp = (struct config_float_setting*)calloc(1, (*size + 1) * sizeof(struct config_float_setting)); struct config_float_setting *tmp = (struct config_float_setting*)calloc(1, (*size + 1) * sizeof(struct config_float_setting));
if (!tmp)
return NULL;
SETTING_FLOAT("video_aspect_ratio", &settings->floats.video_aspect_ratio, true, aspect_ratio, false); SETTING_FLOAT("video_aspect_ratio", &settings->floats.video_aspect_ratio, true, aspect_ratio, false);
SETTING_FLOAT("video_scale", &settings->floats.video_scale, false, 0.0f, false); SETTING_FLOAT("video_scale", &settings->floats.video_scale, false, 0.0f, false);
SETTING_FLOAT("crt_video_refresh_rate", &settings->floats.crt_video_refresh_rate, true, crt_refresh_rate, false); SETTING_FLOAT("crt_video_refresh_rate", &settings->floats.crt_video_refresh_rate, true, crt_refresh_rate, false);
@ -1530,6 +1620,12 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings,
unsigned count = 0; unsigned count = 0;
struct config_uint_setting *tmp = (struct config_uint_setting*)malloc((*size + 1) * sizeof(struct config_uint_setting)); struct config_uint_setting *tmp = (struct config_uint_setting*)malloc((*size + 1) * sizeof(struct config_uint_setting));
if (!tmp)
return NULL;
#ifdef HAVE_NETWORKING
SETTING_UINT("streaming_mode", &settings->uints.streaming_mode, true, STREAMING_MODE_TWITCH, false);
#endif
SETTING_UINT("crt_switch_resolution", &settings->uints.crt_switch_resolution, true, crt_switch_resolution, false); SETTING_UINT("crt_switch_resolution", &settings->uints.crt_switch_resolution, true, crt_switch_resolution, false);
SETTING_UINT("input_bind_timeout", &settings->uints.input_bind_timeout, true, input_bind_timeout, false); SETTING_UINT("input_bind_timeout", &settings->uints.input_bind_timeout, true, input_bind_timeout, false);
SETTING_UINT("input_bind_hold", &settings->uints.input_bind_hold, true, input_bind_hold, false); SETTING_UINT("input_bind_hold", &settings->uints.input_bind_hold, true, input_bind_hold, false);
@ -1549,8 +1645,6 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings,
SETTING_UINT("video_monitor_index", &settings->uints.video_monitor_index, true, monitor_index, false); SETTING_UINT("video_monitor_index", &settings->uints.video_monitor_index, true, monitor_index, false);
SETTING_UINT("video_fullscreen_x", &settings->uints.video_fullscreen_x, true, fullscreen_x, false); SETTING_UINT("video_fullscreen_x", &settings->uints.video_fullscreen_x, true, fullscreen_x, false);
SETTING_UINT("video_fullscreen_y", &settings->uints.video_fullscreen_y, true, fullscreen_y, false); SETTING_UINT("video_fullscreen_y", &settings->uints.video_fullscreen_y, true, fullscreen_y, false);
SETTING_UINT("video_window_x", &settings->uints.video_window_x, true, fullscreen_x, false);
SETTING_UINT("video_window_y", &settings->uints.video_window_y, true, fullscreen_y, false);
SETTING_UINT("video_window_opacity", &settings->uints.video_window_opacity, true, window_opacity, false); SETTING_UINT("video_window_opacity", &settings->uints.video_window_opacity, true, window_opacity, false);
#ifdef HAVE_COMMAND #ifdef HAVE_COMMAND
SETTING_UINT("network_cmd_port", &settings->uints.network_cmd_port, true, network_cmd_port, false); SETTING_UINT("network_cmd_port", &settings->uints.network_cmd_port, true, network_cmd_port, false);
@ -1564,6 +1658,19 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings,
#ifdef HAVE_MENU #ifdef HAVE_MENU
SETTING_UINT("dpi_override_value", &settings->uints.menu_dpi_override_value, true, menu_dpi_override_value, false); SETTING_UINT("dpi_override_value", &settings->uints.menu_dpi_override_value, true, menu_dpi_override_value, false);
SETTING_UINT("menu_thumbnails", &settings->uints.menu_thumbnails, true, menu_thumbnails_default, false); SETTING_UINT("menu_thumbnails", &settings->uints.menu_thumbnails, true, menu_thumbnails_default, false);
SETTING_UINT("menu_timedate_style", &settings->uints.menu_timedate_style, true, menu_timedate_style, false);
SETTING_UINT("rgui_menu_color_theme", &settings->uints.menu_rgui_color_theme, true, rgui_color_theme, false);
SETTING_UINT("rgui_thumbnail_downscaler", &settings->uints.menu_rgui_thumbnail_downscaler, true, rgui_thumbnail_downscaler, false);
#ifdef HAVE_LIBNX
SETTING_UINT("split_joycon_p1", &settings->uints.input_split_joycon[0], true, 0, false);
SETTING_UINT("split_joycon_p2", &settings->uints.input_split_joycon[1], true, 0, false);
SETTING_UINT("split_joycon_p3", &settings->uints.input_split_joycon[2], true, 0, false);
SETTING_UINT("split_joycon_p4", &settings->uints.input_split_joycon[3], true, 0, false);
SETTING_UINT("split_joycon_p5", &settings->uints.input_split_joycon[4], true, 0, false);
SETTING_UINT("split_joycon_p6", &settings->uints.input_split_joycon[5], true, 0, false);
SETTING_UINT("split_joycon_p7", &settings->uints.input_split_joycon[6], true, 0, false);
SETTING_UINT("split_joycon_p8", &settings->uints.input_split_joycon[7], true, 0, false);
#endif
#ifdef HAVE_XMB #ifdef HAVE_XMB
SETTING_UINT("menu_left_thumbnails", &settings->uints.menu_left_thumbnails, true, menu_left_thumbnails_default, false); SETTING_UINT("menu_left_thumbnails", &settings->uints.menu_left_thumbnails, true, menu_left_thumbnails_default, false);
SETTING_UINT("xmb_alpha_factor", &settings->uints.menu_xmb_alpha_factor, true, xmb_alpha_factor, false); SETTING_UINT("xmb_alpha_factor", &settings->uints.menu_xmb_alpha_factor, true, xmb_alpha_factor, false);
@ -1577,6 +1684,9 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings,
#endif #endif
SETTING_UINT("materialui_menu_color_theme", &settings->uints.menu_materialui_color_theme, true, MATERIALUI_THEME_BLUE, false); SETTING_UINT("materialui_menu_color_theme", &settings->uints.menu_materialui_color_theme, true, MATERIALUI_THEME_BLUE, false);
SETTING_UINT("menu_shader_pipeline", &settings->uints.menu_xmb_shader_pipeline, true, menu_shader_pipeline, false); SETTING_UINT("menu_shader_pipeline", &settings->uints.menu_xmb_shader_pipeline, true, menu_shader_pipeline, false);
#ifdef HAVE_OZONE
SETTING_UINT("ozone_menu_color_theme", &settings->uints.menu_ozone_color_theme, true, 0, false);
#endif
#endif #endif
SETTING_UINT("audio_out_rate", &settings->uints.audio_out_rate, true, out_rate, false); SETTING_UINT("audio_out_rate", &settings->uints.audio_out_rate, true, out_rate, false);
SETTING_UINT("custom_viewport_width", &settings->video_viewport_custom.width, false, 0 /* TODO */, false); SETTING_UINT("custom_viewport_width", &settings->video_viewport_custom.width, false, 0 /* TODO */, false);
@ -1593,7 +1703,6 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings,
SETTING_UINT("aspect_ratio_index", &settings->uints.video_aspect_ratio_idx, true, aspect_ratio_idx, false); SETTING_UINT("aspect_ratio_index", &settings->uints.video_aspect_ratio_idx, true, aspect_ratio_idx, false);
#ifdef HAVE_NETWORKING #ifdef HAVE_NETWORKING
SETTING_UINT("netplay_ip_port", &settings->uints.netplay_port, true, RARCH_DEFAULT_PORT, false); SETTING_UINT("netplay_ip_port", &settings->uints.netplay_port, true, RARCH_DEFAULT_PORT, false);
SETTING_UINT("video_stream_port", &settings->uints.video_stream_port, true, RARCH_STREAM_DEFAULT_PORT, false);
SETTING_OVERRIDE(RARCH_OVERRIDE_SETTING_NETPLAY_IP_PORT); SETTING_OVERRIDE(RARCH_OVERRIDE_SETTING_NETPLAY_IP_PORT);
SETTING_UINT("netplay_input_latency_frames_min",&settings->uints.netplay_input_latency_frames_min, true, 0, false); SETTING_UINT("netplay_input_latency_frames_min",&settings->uints.netplay_input_latency_frames_min, true, 0, false);
SETTING_UINT("netplay_input_latency_frames_range",&settings->uints.netplay_input_latency_frames_range, true, 0, false); SETTING_UINT("netplay_input_latency_frames_range",&settings->uints.netplay_input_latency_frames_range, true, 0, false);
@ -1614,6 +1723,22 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings,
SETTING_UINT("midi_volume", &settings->uints.midi_volume, true, midi_volume, false); SETTING_UINT("midi_volume", &settings->uints.midi_volume, true, midi_volume, false);
SETTING_UINT("video_stream_port", &settings->uints.video_stream_port, true, RARCH_STREAM_DEFAULT_PORT, false);
SETTING_UINT("video_record_quality", &settings->uints.video_record_quality, true, RECORD_CONFIG_TYPE_RECORDING_LOSSLESS_QUALITY, false);
SETTING_UINT("video_stream_quality", &settings->uints.video_stream_quality, true, RECORD_CONFIG_TYPE_STREAMING_LOW_QUALITY, false);
SETTING_UINT("video_record_scale_factor", &settings->uints.video_record_scale_factor, true, 1, false);
SETTING_UINT("video_stream_scale_factor", &settings->uints.video_stream_scale_factor, true, 1, false);
SETTING_UINT("video_windowed_position_x", &settings->uints.window_position_x, true, 0, false);
SETTING_UINT("video_windowed_position_y", &settings->uints.window_position_y, true, 0, false);
SETTING_UINT("video_windowed_position_width", &settings->uints.window_position_width, true, window_width, false);
SETTING_UINT("video_windowed_position_height", &settings->uints.window_position_height, true, window_height, false);
SETTING_UINT("video_record_threads", &settings->uints.video_record_threads, true, video_record_threads, false);
#ifdef HAVE_LIBNX
SETTING_UINT("libnx_overclock", &settings->uints.libnx_overclock, true, SWITCH_DEFAULT_CPU_PROFILE, false);
#endif
*size = count; *size = count;
return tmp; return tmp;
@ -1624,6 +1749,9 @@ static struct config_size_setting *populate_settings_size(settings_t *settings,
unsigned count = 0; unsigned count = 0;
struct config_size_setting *tmp = (struct config_size_setting*)calloc((*size + 1), sizeof(struct config_size_setting)); struct config_size_setting *tmp = (struct config_size_setting*)calloc((*size + 1), sizeof(struct config_size_setting));
if (!tmp)
return NULL;
SETTING_SIZE("rewind_buffer_size", &settings->sizes.rewind_buffer_size, true, rewind_buffer_size, false); SETTING_SIZE("rewind_buffer_size", &settings->sizes.rewind_buffer_size, true, rewind_buffer_size, false);
*size = count; *size = count;
@ -1636,6 +1764,9 @@ static struct config_int_setting *populate_settings_int(settings_t *settings, in
unsigned count = 0; unsigned count = 0;
struct config_int_setting *tmp = (struct config_int_setting*)calloc((*size + 1), sizeof(struct config_int_setting)); struct config_int_setting *tmp = (struct config_int_setting*)calloc((*size + 1), sizeof(struct config_int_setting));
if (!tmp)
return NULL;
SETTING_INT("state_slot", &settings->ints.state_slot, false, 0 /* TODO */, false); SETTING_INT("state_slot", &settings->ints.state_slot, false, 0 /* TODO */, false);
#ifdef HAVE_NETWORKING #ifdef HAVE_NETWORKING
SETTING_INT("netplay_check_frames", &settings->ints.netplay_check_frames, true, netplay_check_frames, false); SETTING_INT("netplay_check_frames", &settings->ints.netplay_check_frames, true, netplay_check_frames, false);
@ -1656,7 +1787,7 @@ static struct config_int_setting *populate_settings_int(settings_t *settings, in
* *
* Set 'default' configuration values. * Set 'default' configuration values.
**/ **/
static void config_set_defaults(void) void config_set_defaults(void)
{ {
unsigned i, j; unsigned i, j;
#ifdef HAVE_MENU #ifdef HAVE_MENU
@ -1788,6 +1919,9 @@ static void config_set_defaults(void)
*settings->paths.path_menu_xmb_font = '\0'; *settings->paths.path_menu_xmb_font = '\0';
#endif #endif
strlcpy(settings->arrays.discord_app_id,
default_discord_app_id, sizeof(settings->arrays.discord_app_id));
#ifdef HAVE_MATERIALUI #ifdef HAVE_MATERIALUI
if (g_defaults.menu.materialui.menu_color_theme_enable) if (g_defaults.menu.materialui.menu_color_theme_enable)
settings->uints.menu_materialui_color_theme = g_defaults.menu.materialui.menu_color_theme; settings->uints.menu_materialui_color_theme = g_defaults.menu.materialui.menu_color_theme;
@ -1833,9 +1967,6 @@ static void config_set_defaults(void)
#ifdef HAVE_MENU #ifdef HAVE_MENU
if (first_initialized) if (first_initialized)
settings->bools.menu_show_start_screen = default_menu_show_start_screen; settings->bools.menu_show_start_screen = default_menu_show_start_screen;
settings->uints.menu_entry_normal_color = menu_entry_normal_color;
settings->uints.menu_entry_hover_color = menu_entry_hover_color;
settings->uints.menu_title_color = menu_title_color;
#endif #endif
#ifdef HAVE_CHEEVOS #ifdef HAVE_CHEEVOS
@ -1869,7 +2000,11 @@ static void config_set_defaults(void)
for (i = 0; i < MAX_USERS; i++) for (i = 0; i < MAX_USERS; i++)
{ {
settings->uints.input_joypad_map[i] = i; settings->uints.input_joypad_map[i] = i;
#ifdef SWITCH /* Switch prefered default dpad mode */
settings->uints.input_analog_dpad_mode[i] = ANALOG_DPAD_LSTICK;
#else
settings->uints.input_analog_dpad_mode[i] = ANALOG_DPAD_NONE; settings->uints.input_analog_dpad_mode[i] = ANALOG_DPAD_NONE;
#endif
input_config_set_device(i, RETRO_DEVICE_JOYPAD); input_config_set_device(i, RETRO_DEVICE_JOYPAD);
settings->uints.input_mouse_index[i] = 0; settings->uints.input_mouse_index[i] = 0;
} }
@ -1934,6 +2069,7 @@ static void config_set_defaults(void)
#endif #endif
*settings->paths.path_cheat_database = '\0'; *settings->paths.path_cheat_database = '\0';
*settings->paths.path_menu_wallpaper = '\0'; *settings->paths.path_menu_wallpaper = '\0';
*settings->paths.path_rgui_theme_preset = '\0';
*settings->paths.path_content_database = '\0'; *settings->paths.path_content_database = '\0';
*settings->paths.path_overlay = '\0'; *settings->paths.path_overlay = '\0';
*settings->paths.path_record_config = '\0'; *settings->paths.path_record_config = '\0';
@ -2135,8 +2271,13 @@ static config_file_t *open_default_config_file(void)
(void)path_size; (void)path_size;
#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__) #if defined(_WIN32) && !defined(_XBOX)
fill_pathname_application_path(app_path, path_size); #if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
/* On UWP, the app install directory is not writable so use the writable LocalState dir instead */
fill_pathname_home_dir(app_path, path_size);
#else
fill_pathname_application_dir(app_path, path_size);
#endif
fill_pathname_resolve_relative(conf_path, app_path, fill_pathname_resolve_relative(conf_path, app_path,
file_path_str(FILE_PATH_MAIN_CONFIG), path_size); file_path_str(FILE_PATH_MAIN_CONFIG), path_size);
@ -2160,7 +2301,6 @@ static config_file_t *open_default_config_file(void)
/* Try to create a new config file. */ /* Try to create a new config file. */
conf = config_file_new(NULL); conf = config_file_new(NULL);
if (conf) if (conf)
{ {
/* Since this is a clean config file, we can /* Since this is a clean config file, we can
@ -2168,7 +2308,7 @@ static config_file_t *open_default_config_file(void)
fill_pathname_resolve_relative(conf_path, app_path, fill_pathname_resolve_relative(conf_path, app_path,
file_path_str(FILE_PATH_MAIN_CONFIG), path_size); file_path_str(FILE_PATH_MAIN_CONFIG), path_size);
config_set_bool(conf, "config_save_on_exit", true); config_set_bool(conf, "config_save_on_exit", true);
saved = config_file_write(conf, conf_path); saved = config_file_write(conf, conf_path, true);
} }
if (!saved) if (!saved)
@ -2204,7 +2344,7 @@ static config_file_t *open_default_config_file(void)
if (conf) if (conf)
{ {
config_set_bool(conf, "config_save_on_exit", true); config_set_bool(conf, "config_save_on_exit", true);
saved = config_file_write(conf, conf_path); saved = config_file_write(conf, conf_path, true);
} }
if (!saved) if (!saved)
@ -2279,7 +2419,7 @@ static config_file_t *open_default_config_file(void)
{ {
/* Since this is a clean config file, we can safely use config_save_on_exit. */ /* Since this is a clean config file, we can safely use config_save_on_exit. */
config_set_bool(conf, "config_save_on_exit", true); config_set_bool(conf, "config_save_on_exit", true);
saved = config_file_write(conf, conf_path); saved = config_file_write(conf, conf_path, true);
} }
if (!saved) if (!saved)
@ -2321,6 +2461,36 @@ error:
return NULL; return NULL;
} }
#if defined(HAVE_MENU) && defined(HAVE_RGUI)
static bool check_menu_driver_compatibility(void)
{
settings_t *settings = config_get_ptr();
char *video_driver = settings->arrays.video_driver;
char *menu_driver = settings->arrays.menu_driver;
if (string_is_equal (menu_driver, "rgui") ||
string_is_equal(menu_driver, "null") ||
string_is_equal(video_driver, "null"))
return true;
/* TODO/FIXME - maintenance hazard */
if (string_is_equal(video_driver, "d3d9") ||
string_is_equal(video_driver, "d3d10") ||
string_is_equal(video_driver, "d3d11") ||
string_is_equal(video_driver, "d3d12") ||
string_is_equal(video_driver, "gdi") ||
string_is_equal(video_driver, "gl") ||
string_is_equal(video_driver, "gx2") ||
string_is_equal(video_driver, "vulkan") ||
string_is_equal(video_driver, "metal") ||
string_is_equal(video_driver, "ctr") ||
string_is_equal(video_driver, "vita2d"))
return true;
return false;
}
#endif
static void read_keybinds_keyboard(config_file_t *conf, unsigned user, static void read_keybinds_keyboard(config_file_t *conf, unsigned user,
unsigned idx, struct retro_keybind *bind) unsigned idx, struct retro_keybind *bind)
{ {
@ -2484,6 +2654,8 @@ static void config_file_dump_all(config_file_t *conf)
} }
#endif #endif
/*
* This is no longer used, so comment out to silence warnings...
#ifdef HAVE_MENU #ifdef HAVE_MENU
static void config_get_hex_base(config_file_t *conf, static void config_get_hex_base(config_file_t *conf,
const char *key, unsigned *base) const char *key, unsigned *base)
@ -2495,7 +2667,7 @@ static void config_get_hex_base(config_file_t *conf,
*base = tmp; *base = tmp;
} }
#endif #endif
*/
/** /**
* config_load: * config_load:
@ -2571,11 +2743,11 @@ static bool config_load_file(const char *path, bool set_defaults,
while (extra_path) while (extra_path)
{ {
bool ret = config_append_file(conf, extra_path); bool result = config_append_file(conf, extra_path);
RARCH_LOG("Config: appending config \"%s\"\n", extra_path); RARCH_LOG("Config: appending config \"%s\"\n", extra_path);
if (!ret) if (!result)
RARCH_ERR("Config: failed to append config \"%s\"\n", extra_path); RARCH_ERR("Config: failed to append config \"%s\"\n", extra_path);
extra_path = strtok_r(NULL, "|", &save); extra_path = strtok_r(NULL, "|", &save);
} }
@ -2703,7 +2875,6 @@ static bool config_load_file(const char *path, bool set_defaults,
CONFIG_GET_INT_BASE(conf, settings, uints.led_map[i], buf); CONFIG_GET_INT_BASE(conf, settings, uints.led_map[i], buf);
} }
/* Hexadecimal settings */ /* Hexadecimal settings */
if (config_get_hex(conf, "video_message_color", &msg_color)) if (config_get_hex(conf, "video_message_color", &msg_color))
@ -2712,14 +2883,6 @@ static bool config_load_file(const char *path, bool set_defaults,
settings->floats.video_msg_color_g = ((msg_color >> 8) & 0xff) / 255.0f; settings->floats.video_msg_color_g = ((msg_color >> 8) & 0xff) / 255.0f;
settings->floats.video_msg_color_b = ((msg_color >> 0) & 0xff) / 255.0f; settings->floats.video_msg_color_b = ((msg_color >> 0) & 0xff) / 255.0f;
} }
#ifdef HAVE_MENU
config_get_hex_base(conf, "menu_entry_normal_color",
&settings->uints.menu_entry_normal_color);
config_get_hex_base(conf, "menu_entry_hover_color",
&settings->uints.menu_entry_hover_color);
config_get_hex_base(conf, "menu_title_color",
&settings->uints.menu_title_color);
#endif
/* Float settings */ /* Float settings */
for (i = 0; i < (unsigned)float_settings_size; i++) for (i = 0; i < (unsigned)float_settings_size; i++)
@ -2879,7 +3042,6 @@ static bool config_load_file(const char *path, bool set_defaults,
} }
} }
if (!string_is_empty(settings->paths.directory_screenshot)) if (!string_is_empty(settings->paths.directory_screenshot))
{ {
if (string_is_equal(settings->paths.directory_screenshot, "default")) if (string_is_equal(settings->paths.directory_screenshot, "default"))
@ -2909,6 +3071,8 @@ static bool config_load_file(const char *path, bool set_defaults,
if (string_is_equal(settings->paths.path_menu_wallpaper, "default")) if (string_is_equal(settings->paths.path_menu_wallpaper, "default"))
*settings->paths.path_menu_wallpaper = '\0'; *settings->paths.path_menu_wallpaper = '\0';
if (string_is_equal(settings->paths.path_rgui_theme_preset, "default"))
*settings->paths.path_rgui_theme_preset = '\0';
if (string_is_equal(settings->paths.directory_video_shader, "default")) if (string_is_equal(settings->paths.directory_video_shader, "default"))
*settings->paths.directory_video_shader = '\0'; *settings->paths.directory_video_shader = '\0';
if (string_is_equal(settings->paths.directory_video_filter, "default")) if (string_is_equal(settings->paths.directory_video_filter, "default"))
@ -2946,7 +3110,6 @@ static bool config_load_file(const char *path, bool set_defaults,
if (settings->floats.fastforward_ratio < 0.0f) if (settings->floats.fastforward_ratio < 0.0f)
configuration_set_float(settings, settings->floats.fastforward_ratio, 0.0f); configuration_set_float(settings, settings->floats.fastforward_ratio, 0.0f);
#ifdef HAVE_LAKKA #ifdef HAVE_LAKKA
settings->bools.ssh_enable = filestream_exists(LAKKA_SSH_PATH); settings->bools.ssh_enable = filestream_exists(LAKKA_SSH_PATH);
settings->bools.samba_enable = filestream_exists(LAKKA_SAMBA_PATH); settings->bools.samba_enable = filestream_exists(LAKKA_SAMBA_PATH);
@ -3026,11 +3189,22 @@ static bool config_load_file(const char *path, bool set_defaults,
} }
} }
#if defined(HAVE_MENU) && defined(HAVE_RGUI)
if (!check_menu_driver_compatibility())
strlcpy(settings->arrays.menu_driver, "rgui", sizeof(settings->arrays.menu_driver));
#endif
#ifdef HAVE_LIBNX
// Apply initial clocks
extern void libnx_apply_overclock();
libnx_apply_overclock();
#endif
frontend_driver_set_sustained_performance_mode(settings->bools.sustained_performance_mode); frontend_driver_set_sustained_performance_mode(settings->bools.sustained_performance_mode);
recording_driver_update_streaming_url();
ret = true; ret = true;
end: end:
if (conf) if (conf)
config_file_free(conf); config_file_free(conf);
@ -3341,7 +3515,6 @@ bool config_load_remap(void)
malloc(PATH_MAX_LENGTH * sizeof(char)); malloc(PATH_MAX_LENGTH * sizeof(char));
remap_directory[0] = core_path[0] = game_path[0] = '\0'; remap_directory[0] = core_path[0] = game_path[0] = '\0';
strlcpy(remap_directory, strlcpy(remap_directory,
settings->paths.directory_input_remapping, settings->paths.directory_input_remapping,
path_size); path_size);
@ -3408,7 +3581,6 @@ bool config_load_remap(void)
input_remapping_set_defaults(false); input_remapping_set_defaults(false);
} }
/* Create a new config file from core_path */ /* Create a new config file from core_path */
new_conf = config_file_new(core_path); new_conf = config_file_new(core_path);
@ -3634,8 +3806,6 @@ static void parse_config_file(void)
path_get(RARCH_PATH_CONFIG)); path_get(RARCH_PATH_CONFIG));
} }
static void save_keybind_key(config_file_t *conf, const char *prefix, static void save_keybind_key(config_file_t *conf, const char *prefix,
const char *base, const struct retro_keybind *bind) const char *base, const struct retro_keybind *bind)
{ {
@ -3889,13 +4059,12 @@ static bool config_save_keybinds_file(const char *path)
for (i = 0; i < MAX_USERS; i++) for (i = 0; i < MAX_USERS; i++)
save_keybinds_user(conf, i); save_keybinds_user(conf, i);
ret = config_file_write(conf, path); ret = config_file_write(conf, path, true);
config_file_free(conf); config_file_free(conf);
return ret; return ret;
} }
#endif #endif
/** /**
* config_save_autoconf_profile: * config_save_autoconf_profile:
* @path : Path that shall be written to. * @path : Path that shall be written to.
@ -3998,7 +4167,7 @@ bool config_save_autoconf_profile(const char *path, unsigned user)
&input_config_binds[user][i], false, false); &input_config_binds[user][i], false, false);
} }
ret = config_file_write(conf, autoconf_file); ret = config_file_write(conf, autoconf_file, false);
config_file_free(conf); config_file_free(conf);
free(buf); free(buf);
@ -4013,7 +4182,6 @@ error:
return false; return false;
} }
/** /**
* config_save_file: * config_save_file:
* @path : Path that shall be written to. * @path : Path that shall be written to.
@ -4204,15 +4372,6 @@ bool config_save_file(const char *path)
/* Hexadecimal settings */ /* Hexadecimal settings */
config_set_hex(conf, "video_message_color", msg_color); config_set_hex(conf, "video_message_color", msg_color);
#ifdef HAVE_MENU
config_set_hex(conf, "menu_entry_normal_color",
settings->uints.menu_entry_normal_color);
config_set_hex(conf, "menu_entry_hover_color",
settings->uints.menu_entry_hover_color);
config_set_hex(conf, "menu_title_color",
settings->uints.menu_title_color);
#endif
video_driver_save_settings(conf); video_driver_save_settings(conf);
@ -4240,7 +4399,7 @@ bool config_save_file(const char *path)
for (i = 0; i < MAX_USERS; i++) for (i = 0; i < MAX_USERS; i++)
save_keybinds_user(conf, i); save_keybinds_user(conf, i);
ret = config_file_write(conf, path); ret = config_file_write(conf, path, true);
config_file_free(conf); config_file_free(conf);
return ret; return ret;
@ -4486,7 +4645,6 @@ bool config_save_overrides(int override_type)
config_set_int(conf, cfg, overrides->uints.input_joypad_map[i]); config_set_int(conf, cfg, overrides->uints.input_joypad_map[i]);
} }
/* blacklist these since they are handled by remaps */ /* blacklist these since they are handled by remaps */
/* to-do: add setting to control blacklisting /* to-do: add setting to control blacklisting
if (settings->uints.input_libretro_device[i] if (settings->uints.input_libretro_device[i]
@ -4512,17 +4670,17 @@ bool config_save_overrides(int override_type)
case OVERRIDE_CORE: case OVERRIDE_CORE:
/* Create a new config file from core_path */ /* Create a new config file from core_path */
RARCH_LOG ("[overrides] path %s\n", core_path); RARCH_LOG ("[overrides] path %s\n", core_path);
ret = config_file_write(conf, core_path); ret = config_file_write(conf, core_path, true);
break; break;
case OVERRIDE_GAME: case OVERRIDE_GAME:
/* Create a new config file from core_path */ /* Create a new config file from core_path */
RARCH_LOG ("[overrides] path %s\n", game_path); RARCH_LOG ("[overrides] path %s\n", game_path);
ret = config_file_write(conf, game_path); ret = config_file_write(conf, game_path, true);
break; break;
case OVERRIDE_CONTENT_DIR: case OVERRIDE_CONTENT_DIR:
/* Create a new config file from content_path */ /* Create a new config file from content_path */
RARCH_LOG ("[overrides] path %s\n", content_path); RARCH_LOG ("[overrides] path %s\n", content_path);
ret = config_file_write(conf, content_path); ret = config_file_write(conf, content_path, true);
break; break;
default: default:
break; break;
@ -4571,7 +4729,7 @@ bool config_save_overrides(int override_type)
/* Replaces currently loaded configuration file with /* Replaces currently loaded configuration file with
* another one. Will load a dummy core to flush state * another one. Will load a dummy core to flush state
* properly. */ * properly. */
bool config_replace(bool config_save_on_exit, char *path) bool config_replace(bool config_replace_save_on_exit, char *path)
{ {
content_ctx_info_t content_info = {0}; content_ctx_info_t content_info = {0};
@ -4583,7 +4741,7 @@ bool config_replace(bool config_save_on_exit, char *path)
if (string_is_equal(path, path_get(RARCH_PATH_CONFIG))) if (string_is_equal(path, path_get(RARCH_PATH_CONFIG)))
return false; return false;
if (config_save_on_exit && !path_is_empty(RARCH_PATH_CONFIG)) if (config_replace_save_on_exit && !path_is_empty(RARCH_PATH_CONFIG))
config_save_file(path_get(RARCH_PATH_CONFIG)); config_save_file(path_get(RARCH_PATH_CONFIG));
path_set(RARCH_PATH_CONFIG, path); path_set(RARCH_PATH_CONFIG, path);

View File

@ -2,7 +2,7 @@
* Copyright (C) 2010-2014 - Hans-Kristian Arntzen * Copyright (C) 2010-2014 - Hans-Kristian Arntzen
* Copyright (C) 2011-2016 - Daniel De Matteis * Copyright (C) 2011-2016 - Daniel De Matteis
* Copyright (C) 2014-2016 - Jean-André Santoni * Copyright (C) 2014-2016 - Jean-André Santoni
* Copyright (C) 2016 - Brad Parker * Copyright (C) 2016-2019 - Brad Parker
* *
* RetroArch is free software: you can redistribute it and/or modify it under the terms * RetroArch 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 Found- * of the GNU General Public License as published by the Free Software Found-
@ -103,11 +103,17 @@ typedef struct settings
bool video_fps_show; bool video_fps_show;
bool video_statistics_show; bool video_statistics_show;
bool video_framecount_show; bool video_framecount_show;
bool video_memory_show;
bool video_msg_bgcolor_enable; bool video_msg_bgcolor_enable;
bool video_3ds_lcd_bottom;
/* Audio */ /* Audio */
bool audio_enable; bool audio_enable;
bool audio_enable_menu; bool audio_enable_menu;
bool audio_enable_menu_ok;
bool audio_enable_menu_cancel;
bool audio_enable_menu_notice;
bool audio_enable_menu_bgm;
bool audio_sync; bool audio_sync;
bool audio_rate_control; bool audio_rate_control;
bool audio_wasapi_exclusive_mode; bool audio_wasapi_exclusive_mode;
@ -175,11 +181,16 @@ typedef struct settings
bool menu_content_show_history; bool menu_content_show_history;
bool menu_content_show_add; bool menu_content_show_add;
bool menu_content_show_playlists; bool menu_content_show_playlists;
bool menu_use_preferred_system_color_theme;
bool menu_preferred_system_color_theme_set;
bool menu_unified_controls; bool menu_unified_controls;
bool quick_menu_show_take_screenshot; bool quick_menu_show_take_screenshot;
bool quick_menu_show_save_load_state; bool quick_menu_show_save_load_state;
bool quick_menu_show_undo_save_load_state; bool quick_menu_show_undo_save_load_state;
bool quick_menu_show_add_to_favorites; bool quick_menu_show_add_to_favorites;
bool quick_menu_show_start_recording;
bool quick_menu_show_start_streaming;
bool quick_menu_show_reset_core_association;
bool quick_menu_show_options; bool quick_menu_show_options;
bool quick_menu_show_controls; bool quick_menu_show_controls;
bool quick_menu_show_cheats; bool quick_menu_show_cheats;
@ -290,8 +301,10 @@ typedef struct settings
bool automatically_add_content_to_playlist; bool automatically_add_content_to_playlist;
bool video_window_show_decorations; bool video_window_show_decorations;
bool video_window_save_positions;
bool sustained_performance_mode; bool sustained_performance_mode;
bool playlist_use_old_format;
} bools; } bools;
struct struct
@ -369,8 +382,6 @@ typedef struct settings
unsigned network_cmd_port; unsigned network_cmd_port;
unsigned network_remote_base_port; unsigned network_remote_base_port;
unsigned keymapper_port; unsigned keymapper_port;
unsigned video_window_x;
unsigned video_window_y;
unsigned video_window_opacity; unsigned video_window_opacity;
unsigned crt_switch_resolution; unsigned crt_switch_resolution;
unsigned crt_switch_resolution_super; unsigned crt_switch_resolution_super;
@ -388,13 +399,17 @@ typedef struct settings
unsigned video_msg_bgcolor_green; unsigned video_msg_bgcolor_green;
unsigned video_msg_bgcolor_blue; unsigned video_msg_bgcolor_blue;
unsigned video_stream_port; unsigned video_stream_port;
unsigned video_record_quality;
unsigned video_stream_quality;
unsigned video_record_scale_factor;
unsigned video_stream_scale_factor;
unsigned menu_timedate_style;
unsigned menu_thumbnails; unsigned menu_thumbnails;
unsigned menu_left_thumbnails; unsigned menu_left_thumbnails;
unsigned menu_rgui_thumbnail_downscaler;
unsigned menu_dpi_override_value; unsigned menu_dpi_override_value;
unsigned menu_entry_normal_color; unsigned menu_rgui_color_theme;
unsigned menu_entry_hover_color;
unsigned menu_title_color;
unsigned menu_xmb_layout; unsigned menu_xmb_layout;
unsigned menu_xmb_shader_pipeline; unsigned menu_xmb_shader_pipeline;
unsigned menu_xmb_scale_factor; unsigned menu_xmb_scale_factor;
@ -402,6 +417,7 @@ typedef struct settings
unsigned menu_xmb_theme; unsigned menu_xmb_theme;
unsigned menu_xmb_color_theme; unsigned menu_xmb_color_theme;
unsigned menu_materialui_color_theme; unsigned menu_materialui_color_theme;
unsigned menu_ozone_color_theme;
unsigned menu_font_color_red; unsigned menu_font_color_red;
unsigned menu_font_color_green; unsigned menu_font_color_green;
unsigned menu_font_color_blue; unsigned menu_font_color_blue;
@ -411,6 +427,7 @@ typedef struct settings
unsigned input_overlay_show_physical_inputs_port; unsigned input_overlay_show_physical_inputs_port;
unsigned input_split_joycon[MAX_USERS];
unsigned input_joypad_map[MAX_USERS]; unsigned input_joypad_map[MAX_USERS];
unsigned input_device[MAX_USERS]; unsigned input_device[MAX_USERS];
unsigned input_mouse_index[MAX_USERS]; unsigned input_mouse_index[MAX_USERS];
@ -428,6 +445,16 @@ typedef struct settings
unsigned run_ahead_frames; unsigned run_ahead_frames;
unsigned midi_volume; unsigned midi_volume;
unsigned streaming_mode;
unsigned window_position_x;
unsigned window_position_y;
unsigned window_position_width;
unsigned window_position_height;
unsigned video_record_threads;
unsigned libnx_overclock;
} uints; } uints;
struct struct
@ -472,6 +499,11 @@ typedef struct settings
char midi_input[32]; char midi_input[32];
char midi_output[32]; char midi_output[32];
char youtube_stream_key[PATH_MAX_LENGTH];
char twitch_stream_key[PATH_MAX_LENGTH];
char discord_app_id[PATH_MAX_LENGTH];
} arrays; } arrays;
struct struct
@ -494,7 +526,7 @@ typedef struct settings
char path_overlay[PATH_MAX_LENGTH]; char path_overlay[PATH_MAX_LENGTH];
char path_record_config[PATH_MAX_LENGTH]; char path_record_config[PATH_MAX_LENGTH];
char path_stream_config[PATH_MAX_LENGTH]; char path_stream_config[PATH_MAX_LENGTH];
char path_stream_url[PATH_MAX_LENGTH]; char path_stream_url[8192];
char path_menu_wallpaper[PATH_MAX_LENGTH]; char path_menu_wallpaper[PATH_MAX_LENGTH];
char path_audio_dsp_plugin[PATH_MAX_LENGTH]; char path_audio_dsp_plugin[PATH_MAX_LENGTH];
char path_softfilter_plugin[PATH_MAX_LENGTH]; char path_softfilter_plugin[PATH_MAX_LENGTH];
@ -508,6 +540,7 @@ typedef struct settings
char path_cheat_settings[PATH_MAX_LENGTH]; char path_cheat_settings[PATH_MAX_LENGTH];
char path_shader[PATH_MAX_LENGTH]; char path_shader[PATH_MAX_LENGTH];
char path_font[PATH_MAX_LENGTH]; char path_font[PATH_MAX_LENGTH];
char path_rgui_theme_preset[PATH_MAX_LENGTH];
char directory_audio_filter[PATH_MAX_LENGTH]; char directory_audio_filter[PATH_MAX_LENGTH];
char directory_autoconfig[PATH_MAX_LENGTH]; char directory_autoconfig[PATH_MAX_LENGTH];
@ -530,6 +563,7 @@ typedef struct settings
char directory_thumbnails[PATH_MAX_LENGTH]; char directory_thumbnails[PATH_MAX_LENGTH];
char directory_menu_config[PATH_MAX_LENGTH]; char directory_menu_config[PATH_MAX_LENGTH];
char directory_menu_content[PATH_MAX_LENGTH]; char directory_menu_content[PATH_MAX_LENGTH];
char streaming_title[PATH_MAX_LENGTH];
} paths; } paths;
bool modified; bool modified;
@ -711,6 +745,8 @@ bool config_init(void);
bool config_overlay_enable_default(void); bool config_overlay_enable_default(void);
void config_set_defaults(void);
void config_free(void); void config_free(void);
settings_t *config_get_ptr(void); settings_t *config_get_ptr(void);

6
configure vendored
View File

@ -4,6 +4,8 @@ PACKAGE_NAME=retroarch
cat /dev/null > config.log cat /dev/null > config.log
. qb/qb.init.sh
. qb/qb.system.sh . qb/qb.system.sh
. qb/qb.params.sh . qb/qb.params.sh
@ -11,3 +13,7 @@ cat /dev/null > config.log
. qb/qb.comp.sh . qb/qb.comp.sh
. qb/qb.libs.sh . qb/qb.libs.sh
. qb/qb.moc.sh
. qb/qb.make.sh

View File

@ -82,10 +82,13 @@ bool content_reset_savestate_backups(void);
bool content_undo_load_buf_is_empty(void); bool content_undo_load_buf_is_empty(void);
bool content_undo_save_buf_is_empty(void); bool content_undo_save_buf_is_empty(void);
/* Clears the pending subsystem rom buffer*/ /* Checks if launched from the commandline */
bool content_launched_from_cli(void);
/* Clears the pending subsystem rom buffer */
bool content_is_subsystem_pending_load(void); bool content_is_subsystem_pending_load(void);
/* Clears the pending subsystem rom buffer*/ /* Clears the pending subsystem rom buffer */
void content_clear_subsystem(void); void content_clear_subsystem(void);
/* Set the current subsystem*/ /* Set the current subsystem*/
@ -103,6 +106,12 @@ unsigned content_get_subsystem_rom_id(void);
/* Set environment variables before a subsystem load */ /* Set environment variables before a subsystem load */
void content_set_subsystem_info(void); void content_set_subsystem_info(void);
/* Get the path to the last selected subsystem rom */
char* content_get_subsystem_rom(unsigned index);
/* Sets the subsystem by name */
bool content_set_subsystem_by_name(const char* subsystem_name);
RETRO_END_DECLS RETRO_END_DECLS
#endif #endif

2
core.h
View File

@ -65,6 +65,8 @@ typedef struct rarch_system_info
const char *input_desc_btn[MAX_USERS][RARCH_FIRST_META_KEY]; const char *input_desc_btn[MAX_USERS][RARCH_FIRST_META_KEY];
char valid_extensions[255]; char valid_extensions[255];
bool supports_vfs;
struct retro_disk_control_callback disk_control_cb; struct retro_disk_control_callback disk_control_cb;
struct retro_location_callback location_cb; struct retro_location_callback location_cb;

View File

@ -134,7 +134,6 @@ bool core_set_default_callbacks(struct retro_callbacks *cbs)
return true; return true;
} }
bool core_deinit(void *data) bool core_deinit(void *data)
{ {
struct retro_callbacks *cbs = (struct retro_callbacks*)data; struct retro_callbacks *cbs = (struct retro_callbacks*)data;
@ -396,20 +395,23 @@ bool core_unload(void)
{ {
video_driver_set_cached_frame_ptr(NULL); video_driver_set_cached_frame_ptr(NULL);
if (current_core.inited)
current_core.retro_deinit(); current_core.retro_deinit();
return true; return true;
} }
bool core_unload_game(void) bool core_unload_game(void)
{ {
video_driver_free_hw_context(); video_driver_free_hw_context();
video_driver_set_cached_frame_ptr(NULL); video_driver_set_cached_frame_ptr(NULL);
if (current_core.game_loaded)
{
current_core.retro_unload_game(); current_core.retro_unload_game();
current_core.game_loaded = false; current_core.game_loaded = false;
}
audio_driver_stop(); audio_driver_stop();

View File

@ -32,6 +32,10 @@
#include "core_info.h" #include "core_info.h"
#include "file_path_special.h" #include "file_path_special.h"
#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
#include "uwp/uwp_func.h"
#endif
static const char *core_info_tmp_path = NULL; static const char *core_info_tmp_path = NULL;
static const struct string_list *core_info_tmp_list = NULL; static const struct string_list *core_info_tmp_list = NULL;
static core_info_t *core_info_current = NULL; static core_info_t *core_info_current = NULL;
@ -197,7 +201,7 @@ static bool core_info_list_iterate(
if (!current_path) if (!current_path)
return false; return false;
info_path_base = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); info_path_base = (char*)malloc(info_path_base_size);
info_path_base[0] = '\0'; info_path_base[0] = '\0';
@ -205,7 +209,7 @@ static bool core_info_list_iterate(
current_path, current_path,
info_path_base_size); info_path_base_size);
#if defined(RARCH_MOBILE) || (defined(RARCH_CONSOLE) && !defined(PSP) && !defined(_3DS) && !defined(VITA) && !defined(HW_WUP)) #if defined(RARCH_MOBILE) || (defined(RARCH_CONSOLE) && !defined(PSP) && !defined(_3DS) && !defined(VITA) && !defined(PS2) && !defined(HW_WUP))
substr = strrchr(info_path_base, '_'); substr = strrchr(info_path_base, '_');
if (substr) if (substr)
*substr = '\0'; *substr = '\0';
@ -226,17 +230,35 @@ static bool core_info_list_iterate(
static core_info_list_t *core_info_list_new(const char *path, static core_info_list_t *core_info_list_new(const char *path,
const char *libretro_info_dir, const char *libretro_info_dir,
const char *exts, const char *exts,
bool show_hidden_files) bool dir_show_hidden_files)
{ {
size_t i; size_t i;
core_info_t *core_info = NULL; core_info_t *core_info = NULL;
core_info_list_t *core_info_list = NULL; core_info_list_t *core_info_list = NULL;
const char *path_basedir = libretro_info_dir; const char *path_basedir = libretro_info_dir;
struct string_list *contents = dir_list_new( struct string_list *contents = string_list_new();
path, exts, bool ok = dir_list_append(contents, path, exts,
false, false, dir_show_hidden_files, false, false);
show_hidden_files,
false, false); #if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
/* UWP: browse the optional packages for additional cores */
struct string_list *core_packages = string_list_new();
uwp_fill_installed_core_packages(core_packages);
for (i = 0; i < core_packages->size; i++)
{
dir_list_append(contents, core_packages->elems[i].data, exts,
false, dir_show_hidden_files, false, false);
}
string_list_free(core_packages);
#else
/* Keep the old 'directory not found' behavior */
if (!ok)
{
string_list_free(contents);
contents = NULL;
}
#endif
if (!contents) if (!contents)
return NULL; return NULL;
@ -430,12 +452,12 @@ static core_info_list_t *core_info_list_new(const char *path,
core_info_list_resolve_all_firmware(core_info_list); core_info_list_resolve_all_firmware(core_info_list);
} }
dir_list_free(contents); string_list_free(contents);
return core_info_list; return core_info_list;
error: error:
if (contents) if (contents)
dir_list_free(contents); string_list_free(contents);
core_info_list_free(core_info_list); core_info_list_free(core_info_list);
return NULL; return NULL;
} }
@ -550,7 +572,11 @@ static bool core_info_list_update_missing_firmware_internal(
if (!info) if (!info)
return false; return false;
path = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); path = (char*)malloc(path_size);
if (!path)
return false;
path[0] = '\0'; path[0] = '\0';
for (i = 0; i < info->firmware_count; i++) for (i = 0; i < info->firmware_count; i++)
@ -652,12 +678,12 @@ void core_info_deinit_list(void)
} }
bool core_info_init_list(const char *path_info, const char *dir_cores, bool core_info_init_list(const char *path_info, const char *dir_cores,
const char *exts, bool show_hidden_files) const char *exts, bool dir_show_hidden_files)
{ {
if (!(core_info_curr_list = core_info_list_new(dir_cores, if (!(core_info_curr_list = core_info_list_new(dir_cores,
!string_is_empty(path_info) ? path_info : dir_cores, !string_is_empty(path_info) ? path_info : dir_cores,
exts, exts,
show_hidden_files))) dir_show_hidden_files)))
return false; return false;
return true; return true;
} }
@ -773,13 +799,13 @@ void core_info_list_get_supported_cores(core_info_list_t *core_info_list,
void core_info_get_name(const char *path, char *s, size_t len, void core_info_get_name(const char *path, char *s, size_t len,
const char *path_info, const char *dir_cores, const char *path_info, const char *dir_cores,
const char *exts, bool show_hidden_files) const char *exts, bool dir_show_hidden_files)
{ {
size_t i; size_t i;
const char *path_basedir = !string_is_empty(path_info) ? const char *path_basedir = !string_is_empty(path_info) ?
path_info : dir_cores; path_info : dir_cores;
struct string_list *contents = dir_list_new( struct string_list *contents = dir_list_new(
dir_cores, exts, false, show_hidden_files, false, false); dir_cores, exts, false, dir_show_hidden_files, false, false);
if (!contents) if (!contents)
return; return;

View File

@ -24,7 +24,8 @@ enum rarch_core_type
CORE_TYPE_MPV, CORE_TYPE_MPV,
CORE_TYPE_IMAGEVIEWER, CORE_TYPE_IMAGEVIEWER,
CORE_TYPE_NETRETROPAD, CORE_TYPE_NETRETROPAD,
CORE_TYPE_VIDEO_PROCESSOR CORE_TYPE_VIDEO_PROCESSOR,
CORE_TYPE_GONG
}; };
#endif #endif

View File

@ -25,6 +25,34 @@
static uint16_t *dummy_frame_buf; static uint16_t *dummy_frame_buf;
#if defined(HAVE_LIBNX) && defined(HAVE_STATIC_DUMMY)
void retro_init(void) { libretro_dummy_retro_init(); }
void retro_deinit(void) { libretro_dummy_retro_deinit(); }
unsigned retro_api_version(void) { return libretro_dummy_retro_api_version(); }
void retro_set_controller_port_device(unsigned port, unsigned device) { libretro_dummy_retro_set_controller_port_device(port, device); }
void retro_get_system_info(struct retro_system_info *info) { libretro_dummy_retro_get_system_info(info); }
void retro_get_system_av_info(struct retro_system_av_info *info) { retro_get_system_av_info(info); }
void retro_set_environment(retro_environment_t cb) { libretro_dummy_retro_set_environment(cb); }
void retro_set_audio_sample(retro_audio_sample_t cb) { libretro_dummy_retro_set_audio_sample(cb); }
void retro_set_audio_sample_batch(retro_audio_sample_batch_t cb) { libretro_dummy_retro_set_audio_sample_batch(cb); }
void retro_set_input_poll(retro_input_poll_t cb) { libretro_dummy_retro_set_input_poll(cb); }
void retro_set_input_state(retro_input_state_t cb) { libretro_dummy_retro_set_input_state(cb); }
void retro_set_video_refresh(retro_video_refresh_t cb) { libretro_dummy_retro_set_video_refresh(cb); }
void retro_reset(void) { libretro_dummy_retro_reset(); }
void retro_run(void) { libretro_dummy_retro_run(); }
bool retro_load_game(const struct retro_game_info *info) { return libretro_dummy_retro_load_game(info); }
void retro_unload_game(void) { libretro_dummy_retro_unload_game(); }
unsigned retro_get_region(void) { return libretro_dummy_retro_get_region(); }
bool retro_load_game_special(unsigned type, const struct retro_game_info *info, size_t num) { return libretro_dummy_retro_load_game_special(type, info, num); }
size_t retro_serialize_size(void) { return libretro_dummy_retro_serialize_size(); }
bool retro_serialize(void *data, size_t size) { return libretro_dummy_retro_serialize(data, size); }
bool retro_unserialize(const void *data, size_t size) { return libretro_dummy_retro_unserialize(data, size); }
void *retro_get_memory_data(unsigned id) { return libretro_dummy_retro_get_memory_data(id); }
size_t retro_get_memory_size(unsigned id) { return libretro_dummy_retro_get_memory_size(id); }
void retro_cheat_reset(void) { libretro_dummy_retro_cheat_reset(); }
void retro_cheat_set(unsigned idx, bool enabled, const char *code) { libretro_dummy_retro_cheat_set(idx, enabled, code); }
#endif
void libretro_dummy_retro_init(void) void libretro_dummy_retro_init(void)
{ {
unsigned i; unsigned i;
@ -195,5 +223,3 @@ void libretro_dummy_retro_cheat_set(unsigned idx,
(void)enabled; (void)enabled;
(void)code; (void)code;
} }

View File

@ -360,6 +360,62 @@ size_t libretro_videoprocessor_retro_get_memory_size(unsigned id);
#endif #endif
#ifdef HAVE_EASTEREGG
/* Internal gong core. */
void libretro_gong_retro_init(void);
void libretro_gong_retro_deinit(void);
unsigned libretro_gong_retro_api_version(void);
void libretro_gong_retro_get_system_info(struct retro_system_info *info);
void libretro_gong_retro_get_system_av_info(struct retro_system_av_info *info);
void libretro_gong_retro_set_environment(retro_environment_t cb);
void libretro_gong_retro_set_video_refresh(retro_video_refresh_t cb);
void libretro_gong_retro_set_audio_sample(retro_audio_sample_t cb);
void libretro_gong_retro_set_audio_sample_batch(retro_audio_sample_batch_t cb);
void libretro_gong_retro_set_input_poll(retro_input_poll_t cb);
void libretro_gong_retro_set_input_state(retro_input_state_t cb);
void libretro_gong_retro_set_controller_port_device(unsigned port, unsigned device);
void libretro_gong_retro_reset(void);
void libretro_gong_retro_run(void);
size_t libretro_gong_retro_serialize_size(void);
bool libretro_gong_retro_serialize(void *data, size_t size);
bool libretro_gong_retro_unserialize(const void *data, size_t size);
void libretro_gong_retro_cheat_reset(void);
void libretro_gong_retro_cheat_set(unsigned index, bool enabled, const char *code);
bool libretro_gong_retro_load_game(const struct retro_game_info *game);
bool libretro_gong_retro_load_game_special(unsigned game_type,
const struct retro_game_info *info, size_t num_info);
void libretro_gong_retro_unload_game(void);
unsigned libretro_gong_retro_get_region(void);
void *libretro_gong_retro_get_memory_data(unsigned id);
size_t libretro_gong_retro_get_memory_size(unsigned id);
#endif
RETRO_END_DECLS RETRO_END_DECLS
#endif #endif

View File

@ -195,7 +195,7 @@ CFLAGS += -D__LIBRETRO__
include Makefile.common include Makefile.common
CFLAGS += $(DEFINES) $(INCFLAGS) $(GLFLAGS) CFLAGS += $(DEFINES) $(INCFLAGS) $(GLFLAGS) $(DEF_FLAGS)
CFLAGS += -Wall $(fpic) CFLAGS += -Wall $(fpic)
ifeq ($(DEBUG), 1) ifeq ($(DEBUG), 1)
@ -226,4 +226,3 @@ clean:
rm -f $(TARGET) rm -f $(TARGET)
.PHONY: clean .PHONY: clean

View File

@ -16,7 +16,6 @@ AVUTIL_DIR := $(BASE_DIR)/libavutil
SWSCALE_DIR := $(BASE_DIR)/libswscale SWSCALE_DIR := $(BASE_DIR)/libswscale
SWRESAMPLE_DIR := $(BASE_DIR)/libswresample SWRESAMPLE_DIR := $(BASE_DIR)/libswresample
INCFLAGS += -I$(BASE_DIR) -I$(CORE_DIR) -I$(LIBRETRO_COMM_DIR)/include -I$(LIBRETRO_COMM_DIR)/include/compat INCFLAGS += -I$(BASE_DIR) -I$(CORE_DIR) -I$(LIBRETRO_COMM_DIR)/include -I$(LIBRETRO_COMM_DIR)/include/compat
LIBRETRO_SOURCE += $(CORE_DIR)/ffmpeg_core.c \ LIBRETRO_SOURCE += $(CORE_DIR)/ffmpeg_core.c \

View File

@ -134,7 +134,6 @@ endif
LIBS += -lm LIBS += -lm
ifeq ($(HAVE_NEON),1) ifeq ($(HAVE_NEON),1)
DEFINES += -DHAVE_NEON=1 DEFINES += -DHAVE_NEON=1
else else
@ -163,7 +162,6 @@ CPUOPTS += -DARCH_BFIN=0
#We can reasonably assume MMX will be there on all x86 CPUs from 1997 and up at least #We can reasonably assume MMX will be there on all x86 CPUs from 1997 and up at least
#SSE2 can be assumed from Pentium 4 and up - can be switched on or off with the switch HAVE_SSE2 #SSE2 can be assumed from Pentium 4 and up - can be switched on or off with the switch HAVE_SSE2
ifeq ($(ARCH_X86),1) ifeq ($(ARCH_X86),1)
CPUOPTS += -DHAVE_AMD3DNOW_INLINE=0 CPUOPTS += -DHAVE_AMD3DNOW_INLINE=0
CPUOPTS += -DHAVE_AMD3DNOWEXT_EXTERNAL=0 CPUOPTS += -DHAVE_AMD3DNOWEXT_EXTERNAL=0
@ -756,7 +754,6 @@ else
DEFINES += -DCONFIG_LIBSPEEX_ENCODER=0 DEFINES += -DCONFIG_LIBSPEEX_ENCODER=0
endif endif
ifeq ($(HAVE_LIBOPUS),1) ifeq ($(HAVE_LIBOPUS),1)
DEFINES += -DCONFIG_LIBOPUS_ENCODER=1 \ DEFINES += -DCONFIG_LIBOPUS_ENCODER=1 \
-DCONFIG_OPUS_PARSER=1 \ -DCONFIG_OPUS_PARSER=1 \
@ -1265,7 +1262,6 @@ DEFINES += -DCONFIG_LIBOPUS_DECODER=0
DEFINES += -DCONFIG_OPUS_MUXER=0 DEFINES += -DCONFIG_OPUS_MUXER=0
endif endif
#libavutil #libavutil
ifeq ($(INTERNAL_LIBAVUTIL),1) ifeq ($(INTERNAL_LIBAVUTIL),1)
DEFINES += -DHAVE_AV_CONFIG_H DEFINES += -DHAVE_AV_CONFIG_H
@ -1336,7 +1332,6 @@ ifeq ($(ARCH_ARM),1)
LIBAVUTIL_SOURCE += $(filter-out $(AVUTIL_BLACKLIST),$(wildcard $(AVUTIL_DIR)/arm/*.c)) LIBAVUTIL_SOURCE += $(filter-out $(AVUTIL_BLACKLIST),$(wildcard $(AVUTIL_DIR)/arm/*.c))
endif endif
ifeq ($(ARCH_PPC),1) ifeq ($(ARCH_PPC),1)
LIBAVUTIL_SOURCE += $(AVUTIL_DIR)/ppc/cpu.c \ LIBAVUTIL_SOURCE += $(AVUTIL_DIR)/ppc/cpu.c \
$(AVUTIL_DIR)/ppc/float_dsp_init.c $(AVUTIL_DIR)/ppc/float_dsp_init.c
@ -1468,7 +1463,6 @@ else
DEFINES += -DCONFIG_XVMC=0 DEFINES += -DCONFIG_XVMC=0
endif endif
AVCODEC_BLACKLIST := \ AVCODEC_BLACKLIST := \
$(AVCODEC_DIR)/arm/neontest.c \ $(AVCODEC_DIR)/arm/neontest.c \
$(AVCODEC_DIR)/vda.c \ $(AVCODEC_DIR)/vda.c \

View File

@ -693,7 +693,6 @@ void CORE_PREFIX(retro_run)(void)
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, frames[0].tex); glBindTexture(GL_TEXTURE_2D, frames[0].tex);
glBindBuffer(GL_ARRAY_BUFFER, vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo);
glVertexAttribPointer(vertex_loc, 2, GL_FLOAT, GL_FALSE, glVertexAttribPointer(vertex_loc, 2, GL_FLOAT, GL_FALSE,
4 * sizeof(GLfloat), (const GLvoid*)(0 * sizeof(GLfloat))); 4 * sizeof(GLfloat), (const GLvoid*)(0 * sizeof(GLfloat)));
@ -1664,7 +1663,6 @@ error:
return false; return false;
} }
unsigned CORE_PREFIX(retro_get_region)(void) unsigned CORE_PREFIX(retro_get_region)(void)
{ {
return RETRO_REGION_NTSC; return RETRO_REGION_NTSC;

View File

@ -10,4 +10,3 @@ static const char *fragment_source = GLSL(
gl_FragColor = vec4(pow(mix(pow(texture2D(sTex0, vTex).rgb, vec3(2.2)), pow(texture2D(sTex1, vTex).rgb, vec3(2.2)), uMix), vec3(1.0 / 2.2)), 1.0); gl_FragColor = vec4(pow(mix(pow(texture2D(sTex0, vTex).rgb, vec3(2.2)), pow(texture2D(sTex1, vTex).rgb, vec3(2.2)), uMix), vec3(1.0 / 2.2)), 1.0);
} }
); );

Some files were not shown because too many files have changed in this diff Show More