From dbe7dbf63b6264958f0dbca2979929c3904d2198 Mon Sep 17 00:00:00 2001 From: Adrien Beudin Date: Mon, 8 Apr 2024 21:22:10 +0200 Subject: [PATCH] feat: add visual pinball standalone --- Config.in | 15 ++ .../fsoverlay/etc/init.d/S12populateshare | 2 +- .../system/configs/vpinball/pinmame/README | 0 .../x86/fsoverlay/etc/X11/xinit/xinitrc | 1 + .../etc/udev/rules.d/96-monitor.rules | 2 + .../recalbox/x86/fsoverlay/usr/bin/pinball.sh | 31 ++++ configs/recalbox-rpi5_64_defconfig | 2 + configs/recalbox-x86_64_defconfig | 2 + custom/list.hash | 2 + custom/package/alsa-plugins/Config.in | 9 + custom/package/alsa-plugins/Config.in.patch | 12 ++ custom/package/alsa-plugins/alsa-plugins.mk | 41 +++++ .../alsa-plugins/alsa-plugins.mk.patch | 29 +++ package/cargs/Config.in | 9 + package/cargs/cargs.mk | 19 ++ package/libaltsound/Config.in | 10 + package/libaltsound/libaltsound.mk | 43 +++++ package/libdmdutil/Config.in | 14 ++ package/libdmdutil/libdmdutil.mk | 38 ++++ package/libdof/Config.in | 11 ++ package/libdof/libdof.mk | 32 ++++ package/libpinmame/Config.in | 8 + package/libpinmame/libpinmame.mk | 34 ++++ package/libpupdmd/Config.in | 7 + package/libpupdmd/libpupdmd.mk | 32 ++++ package/libserum/Config.in | 6 + package/libserum/libserum.mk | 31 ++++ package/libzedmd/Config.in | 7 + package/libzedmd/libzedmd.mk | 32 ++++ .../systems/vpinball/init/roms/.keep | 0 .../systems/vpinball/system.ini | 54 ++++++ .../vpinball/upgrade/roms/.readme.placeholder | 0 package/sockpp/Config.in | 6 + package/sockpp/sockpp.mk | 19 ++ package/vpinball/001-default-path.patch | 13 ++ package/vpinball/Config.in | 15 ++ package/vpinball/p2k.cfg | 14 ++ package/vpinball/vpinball.mk | 60 ++++++ .../configgen/configgen/emulatorlauncher.py | 4 + .../configgen/generators/vpinball/__init__.py | 0 .../vpinball/vpinballControllers.py | 19 ++ .../generators/vpinball/vpinballGenerator.py | 173 ++++++++++++++++++ projects/configgen/configgen/recalboxFiles.py | 4 + projects/configgen/setup.py | 1 + projects/frontend/data/resources/menu.xml | 10 + .../frontend/es-app/src/guis/MenuMessages.h | 3 + .../es-app/src/guis/menus/MenuBuilder.cpp | 5 + .../es-app/src/guis/menus/MenuItemType.cpp | 6 + .../es-app/src/guis/menus/MenuItemType.h | 6 + .../src/guis/menus/MenuPinballSettings.cpp | 104 +++++++++++ .../src/guis/menus/MenuPinballSettings.h | 56 ++++++ .../es-app/src/guis/menus/MenuProvider.cpp | 5 + .../menus/vault/MenuAdvancedSettings.cpp_ | 8 +- .../guis/menus/vault/MenuAdvancedSettings.h_ | 1 + projects/frontend/es-core/src/RecalboxConf.h | 12 ++ 55 files changed, 1077 insertions(+), 2 deletions(-) create mode 100644 board/recalbox/fsoverlay/recalbox/share_init/system/configs/vpinball/pinmame/README create mode 100755 board/recalbox/x86/fsoverlay/etc/udev/rules.d/96-monitor.rules create mode 100755 board/recalbox/x86/fsoverlay/usr/bin/pinball.sh create mode 100644 custom/package/alsa-plugins/Config.in create mode 100644 custom/package/alsa-plugins/Config.in.patch create mode 100644 custom/package/alsa-plugins/alsa-plugins.mk create mode 100644 custom/package/alsa-plugins/alsa-plugins.mk.patch create mode 100644 package/cargs/Config.in create mode 100644 package/cargs/cargs.mk create mode 100644 package/libaltsound/Config.in create mode 100644 package/libaltsound/libaltsound.mk create mode 100644 package/libdmdutil/Config.in create mode 100644 package/libdmdutil/libdmdutil.mk create mode 100644 package/libdof/Config.in create mode 100644 package/libdof/libdof.mk create mode 100644 package/libpinmame/Config.in create mode 100644 package/libpinmame/libpinmame.mk create mode 100644 package/libpupdmd/Config.in create mode 100644 package/libpupdmd/libpupdmd.mk create mode 100644 package/libserum/Config.in create mode 100644 package/libserum/libserum.mk create mode 100644 package/libzedmd/Config.in create mode 100644 package/libzedmd/libzedmd.mk create mode 100644 package/recalbox-romfs2/systems/vpinball/init/roms/.keep create mode 100644 package/recalbox-romfs2/systems/vpinball/system.ini create mode 100644 package/recalbox-romfs2/systems/vpinball/upgrade/roms/.readme.placeholder create mode 100644 package/sockpp/Config.in create mode 100644 package/sockpp/sockpp.mk create mode 100644 package/vpinball/001-default-path.patch create mode 100644 package/vpinball/Config.in create mode 100644 package/vpinball/p2k.cfg create mode 100644 package/vpinball/vpinball.mk create mode 100644 projects/configgen/configgen/generators/vpinball/__init__.py create mode 100644 projects/configgen/configgen/generators/vpinball/vpinballControllers.py create mode 100644 projects/configgen/configgen/generators/vpinball/vpinballGenerator.py create mode 100644 projects/frontend/es-app/src/guis/menus/MenuPinballSettings.cpp create mode 100644 projects/frontend/es-app/src/guis/menus/MenuPinballSettings.h diff --git a/Config.in b/Config.in index 8d475ff6f4..64455cc056 100644 --- a/Config.in +++ b/Config.in @@ -168,6 +168,7 @@ menu "Emulators" source "$BR2_EXTERNAL_RECALBOX_PATH/package/xemu/Config.in" source "$BR2_EXTERNAL_RECALBOX_PATH/package/xroar/Config.in" source "$BR2_EXTERNAL_RECALBOX_PATH/package/vvvvvv/Config.in" + source "$BR2_EXTERNAL_RECALBOX_PATH/package/vpinball/Config.in" if BR2_PACKAGE_RETROARCH menu "Libretro Cores" @@ -379,4 +380,18 @@ endmenu menu "Pi Hats" source "$BR2_EXTERNAL_RECALBOX_PATH/package/recalbox-wpaf/Config.in" endmenu +if BR2_PACKAGE_VPINBALL +menu "Libraries" + source "$BR2_EXTERNAL_RECALBOX_PATH/package/libaltsound/Config.in" + source "$BR2_EXTERNAL_RECALBOX_PATH/package/libdmdutil/Config.in" + source "$BR2_EXTERNAL_RECALBOX_PATH/package/libdmdutil/Config.in" + source "$BR2_EXTERNAL_RECALBOX_PATH/package/libpupdmd/Config.in" + source "$BR2_EXTERNAL_RECALBOX_PATH/package/libserum/Config.in" + source "$BR2_EXTERNAL_RECALBOX_PATH/package/libzedmd/Config.in" + source "$BR2_EXTERNAL_RECALBOX_PATH/package/sockpp/Config.in" + source "$BR2_EXTERNAL_RECALBOX_PATH/package/libdof/Config.in" + source "$BR2_EXTERNAL_RECALBOX_PATH/package/libpinmame/Config.in" + source "$BR2_EXTERNAL_RECALBOX_PATH/package/cargs/Config.in" +endmenu +endif endmenu diff --git a/board/recalbox/fsoverlay/etc/init.d/S12populateshare b/board/recalbox/fsoverlay/etc/init.d/S12populateshare index 23ffc77972..d12afea07b 100755 --- a/board/recalbox/fsoverlay/etc/init.d/S12populateshare +++ b/board/recalbox/fsoverlay/etc/init.d/S12populateshare @@ -84,7 +84,7 @@ for FILE in music bios extractions kodi saves saves/amiga screenshots userscript system/.config/scummvm/scummvm.ini \ system/.emulationstation/{es_input.cfg,es_settings.cfg} \ system/{.hatari,.kodi,.atari800.cfg} \ - system/configs/{advancemame,daphne,dolphin-emu,dosbox,fba,kodi,moonlight,mupen64,openbor,ppsspp,reicast,retroarch,sdlpop,shadersets,xarcade2jstick,scummvm} \ + system/configs/{advancemame,daphne,dolphin-emu,dosbox,fba,kodi,moonlight,mupen64,openbor,ppsspp,reicast,retroarch,sdlpop,shadersets,xarcade2jstick,scummvm,vpinball} \ system/configs/mupen64/{GLideN64.custom.ini,GLideN64.ini,Glide64mk2.ini,InputAutoCfg.ini,RiceVideoLinux.ini,font.ttf,gles2n64.conf,gles2n64rom.conf} \ system/recalbox.conf \ bios/{amiga,Databases,dc,fba,fbneo,keropi,Machines,mame,mame2000,mame2003,mame2003-plus,mame2010,mame2015,mame2016,np2kai,oricutron,prboom,quasi88,xmil,scummvm} diff --git a/board/recalbox/fsoverlay/recalbox/share_init/system/configs/vpinball/pinmame/README b/board/recalbox/fsoverlay/recalbox/share_init/system/configs/vpinball/pinmame/README new file mode 100644 index 0000000000..e69de29bb2 diff --git a/board/recalbox/x86/fsoverlay/etc/X11/xinit/xinitrc b/board/recalbox/x86/fsoverlay/etc/X11/xinit/xinitrc index 98a31e5950..1588f85a39 100644 --- a/board/recalbox/x86/fsoverlay/etc/X11/xinit/xinitrc +++ b/board/recalbox/x86/fsoverlay/etc/X11/xinit/xinitrc @@ -21,6 +21,7 @@ xset s off # xrandr --output output_name --off /usr/bin/externalscreen.sh +/usr/bin/pinball.sh # auto hide cursor each 5 sec of inactivity hhpc -i 5 & diff --git a/board/recalbox/x86/fsoverlay/etc/udev/rules.d/96-monitor.rules b/board/recalbox/x86/fsoverlay/etc/udev/rules.d/96-monitor.rules new file mode 100755 index 0000000000..691289bded --- /dev/null +++ b/board/recalbox/x86/fsoverlay/etc/udev/rules.d/96-monitor.rules @@ -0,0 +1,2 @@ +ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/usr/bin/externalscreen.sh" +ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/usr/bin/pinball.sh" diff --git a/board/recalbox/x86/fsoverlay/usr/bin/pinball.sh b/board/recalbox/x86/fsoverlay/usr/bin/pinball.sh new file mode 100755 index 0000000000..f5e102c3b2 --- /dev/null +++ b/board/recalbox/x86/fsoverlay/usr/bin/pinball.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +export DISPLAY=:0 + +CABINET=$(recalbox_settings -command load -key pinball.cabinet) +SCREEN1=$(recalbox_settings -command load -key system.externalscreen.prefered) +SCREEN2=$(recalbox_settings -command load -key pinball.screen2) + +echo "Pinball : Dualscreen configuration" + +if [[ $(xrandr | grep $SCREEN1 | awk '{print $2}') == disconnected ]];then + echo "Pinball : No screen 1 disconnected" + xrandr --output $SCREEN1 --off + exit 0 +fi + +RES=$(xrandr | grep $SCREEN1 | sed 's/.* \([0-9]*x[0-9]*\)+.*/\1/') + +if [[ "$CABINET" -eq 1 ]]; then + if [[ -z "$SCREEN1" ]]; then + echo "Pinball : No screen 1 configured" + exit 0 + fi + if [[ -z "$SCREEN2" ]]; then + echo "Pinball : No screen 2 configured" + exit 0 + fi + echo "Pinball : turn on second screen" + xrandr --output $SCREEN2 + xrandr --output $SCREEN1 --primary -r $RES --output $SCREEN2 --right-of $SCREEN1 --auto +fi diff --git a/configs/recalbox-rpi5_64_defconfig b/configs/recalbox-rpi5_64_defconfig index 4ca1dae374..eba19b30d5 100644 --- a/configs/recalbox-rpi5_64_defconfig +++ b/configs/recalbox-rpi5_64_defconfig @@ -369,3 +369,5 @@ BR2_PACKAGE_VVVVVV=y BR2_PACKAGE_LIBRETRO_TAMALIBRETRO=y BR2_PACKAGE_LIBRETRO_HATARIB=y BR2_PACKAGE_LIBRETRO_MAME0258=y +BR2_PACKAGE_VPINBALL=y +BR2_PACKAGE_ALSA_PLUGINS=y diff --git a/configs/recalbox-x86_64_defconfig b/configs/recalbox-x86_64_defconfig index da75e3a5f9..8eb39ba89f 100644 --- a/configs/recalbox-x86_64_defconfig +++ b/configs/recalbox-x86_64_defconfig @@ -405,6 +405,8 @@ BR2_PACKAGE_XPADNEO=y BR2_PACKAGE_XONE=y BR2_PACKAGE_XPAD_NOONE=y BR2_PACKAGE_WII_U_GC_ADAPTER=y +BR2_PACKAGE_VPINBALL=y +BR2_PACKAGE_ALSA_PLUGINS=y BR2_PACKAGE_VVVVVV=y BR2_PACKAGE_LIBRETRO_TAMALIBRETRO=y BR2_PACKAGE_LIBRETRO_HATARIB=y diff --git a/custom/list.hash b/custom/list.hash index 535a98da39..b6c80641a7 100644 --- a/custom/list.hash +++ b/custom/list.hash @@ -14,6 +14,8 @@ 4c323a0fc6461ab2af66e1282fe4585a linux/Config.in cb5b6a8c509a930d8e9815f97855613b linux/linux.mk e18acb2d94df50bf67ca15ebc33ef590 package/Config.in +5f30589736a71c2887e7b61aaa21ed40 package/alsa-plugins/Config.in +6e5035da8b70ae310585a1d61a412bd6 package/alsa-plugins/alsa-plugins.mk c17b2548c35cffbd487ade70e272015c package/bcm2835/Config.in 5a9deb88e7e597a746ee333e858caaca package/binutils/binutils.mk 62255bb520c60a3864a16c6e9fb3940b package/bluez5_utils/bluez5_utils.hash diff --git a/custom/package/alsa-plugins/Config.in b/custom/package/alsa-plugins/Config.in new file mode 100644 index 0000000000..0897e9c1bf --- /dev/null +++ b/custom/package/alsa-plugins/Config.in @@ -0,0 +1,9 @@ +config BR2_PACKAGE_ALSA_PLUGINS + bool "alsa-plugins" + depends on BR2_PACKAGE_ALSA_LIB + depends on BR2_PACKAGE_PULSEAUDIO + select BR2_PACKAGE_ALSA_LIB_HWDEP + help + Advanced Linux Sound Architecture Plugins + + http://www.alsa-project.org/ diff --git a/custom/package/alsa-plugins/Config.in.patch b/custom/package/alsa-plugins/Config.in.patch new file mode 100644 index 0000000000..dea96da4be --- /dev/null +++ b/custom/package/alsa-plugins/Config.in.patch @@ -0,0 +1,12 @@ +diff --git a/package/alsa-plugins/Config.in b/package/alsa-plugins/Config.in +index ee0fb4c1d5..0897e9c1bf 100644 +--- a/package/alsa-plugins/Config.in ++++ b/package/alsa-plugins/Config.in +@@ -1,6 +1,7 @@ + config BR2_PACKAGE_ALSA_PLUGINS + bool "alsa-plugins" + depends on BR2_PACKAGE_ALSA_LIB ++ depends on BR2_PACKAGE_PULSEAUDIO + select BR2_PACKAGE_ALSA_LIB_HWDEP + help + Advanced Linux Sound Architecture Plugins diff --git a/custom/package/alsa-plugins/alsa-plugins.mk b/custom/package/alsa-plugins/alsa-plugins.mk new file mode 100644 index 0000000000..06c0269764 --- /dev/null +++ b/custom/package/alsa-plugins/alsa-plugins.mk @@ -0,0 +1,41 @@ +################################################################################ +# +# alsa-plugins +# +################################################################################ + +ALSA_PLUGINS_VERSION = 1.2.7.1 +ALSA_PLUGINS_SOURCE = alsa-plugins-$(ALSA_PLUGINS_VERSION).tar.bz2 +ALSA_PLUGINS_SITE = https://www.alsa-project.org/files/pub/plugins +ALSA_PLUGINS_LICENSE = LGPL-2.1+ +ALSA_PLUGINS_LICENSE_FILES = COPYING +ALSA_PLUGINS_DEPENDENCIES = host-pkgconf alsa-lib pulseaudio + +ALSA_PLUGINS_CONF_OPTS = \ + --disable-jack \ + --disable-usbstream \ + --disable-libav \ + --disable-maemo-plugin \ + --disable-maemo-resource-manager \ + --with-speex=no + +ifeq ($(BR2_PACKAGE_ALSA_UTILS),y) +ALSA_PLUGINS_DEPENDENCIES += alsa-utils +endif + +ifeq ($(BR2_PACKAGE_LIBSAMPLERATE),y) +ALSA_PLUGINS_CONF_OPTS += --enable-samplerate +ALSA_PLUGINS_DEPENDENCIES += libsamplerate +ALSA_PLUGINS_LICENSE += , GPL-2.0+ (samplerate plugin) +ALSA_PLUGINS_LICENSE_FILES += COPYING.GPL +else +ALSA_PLUGINS_CONF_OPTS += --disable-samplerate +endif + +define ALSA_PLUGINS_ADD_DEFAULT_CONF + mv $(TARGET_DIR)/etc/alsa/conf.d/99-pulseaudio-default.conf.example \ + $(TARGET_DIR)/etc/alsa/conf.d/99-pulseaudio-default.conf +endef + +ALSA_PLUGINS_POST_INSTALL_TARGET_HOOKS += ALSA_PLUGINS_ADD_DEFAULT_CONF +$(eval $(autotools-package)) diff --git a/custom/package/alsa-plugins/alsa-plugins.mk.patch b/custom/package/alsa-plugins/alsa-plugins.mk.patch new file mode 100644 index 0000000000..5fcc9a0f7b --- /dev/null +++ b/custom/package/alsa-plugins/alsa-plugins.mk.patch @@ -0,0 +1,29 @@ +diff --git a/package/alsa-plugins/alsa-plugins.mk b/package/alsa-plugins/alsa-plugins.mk +index d23a81c5ee..06c0269764 100644 +--- a/package/alsa-plugins/alsa-plugins.mk ++++ b/package/alsa-plugins/alsa-plugins.mk +@@ -9,12 +9,11 @@ ALSA_PLUGINS_SOURCE = alsa-plugins-$(ALSA_PLUGINS_VERSION).tar.bz2 + ALSA_PLUGINS_SITE = https://www.alsa-project.org/files/pub/plugins + ALSA_PLUGINS_LICENSE = LGPL-2.1+ + ALSA_PLUGINS_LICENSE_FILES = COPYING +-ALSA_PLUGINS_DEPENDENCIES = host-pkgconf alsa-lib ++ALSA_PLUGINS_DEPENDENCIES = host-pkgconf alsa-lib pulseaudio + + ALSA_PLUGINS_CONF_OPTS = \ + --disable-jack \ + --disable-usbstream \ +- --disable-pulseaudio \ + --disable-libav \ + --disable-maemo-plugin \ + --disable-maemo-resource-manager \ +@@ -33,4 +32,10 @@ else + ALSA_PLUGINS_CONF_OPTS += --disable-samplerate + endif + ++define ALSA_PLUGINS_ADD_DEFAULT_CONF ++ mv $(TARGET_DIR)/etc/alsa/conf.d/99-pulseaudio-default.conf.example \ ++ $(TARGET_DIR)/etc/alsa/conf.d/99-pulseaudio-default.conf ++endef ++ ++ALSA_PLUGINS_POST_INSTALL_TARGET_HOOKS += ALSA_PLUGINS_ADD_DEFAULT_CONF + $(eval $(autotools-package)) diff --git a/package/cargs/Config.in b/package/cargs/Config.in new file mode 100644 index 0000000000..ee91fd2209 --- /dev/null +++ b/package/cargs/Config.in @@ -0,0 +1,9 @@ +config BR2_PACKAGE_CARGS + bool "cargs" + help + cargs - A lightweight cross-platform getopt alternative that + is tested on Linux, Windows, FreeBSD and macOS. Command line + argument parser library for C/C++. Can be used to parse argv + and argc parameters. + + https://github.com/likle/cargs diff --git a/package/cargs/cargs.mk b/package/cargs/cargs.mk new file mode 100644 index 0000000000..a1be198080 --- /dev/null +++ b/package/cargs/cargs.mk @@ -0,0 +1,19 @@ +################################################################################ +# +# cargs +# +################################################################################ + +# Version: Commits on Mar 11, 2024 +CARGS_VERSION = 82b51a3fd781ba978ab9bb6a05306ce777ecb2a1 +CARGS_SITE = $(call github,likle,cargs,$(CARGS_VERSION)) +CARGS_LICENSE = MIT +CARGS_LICENSE_FILES = LICENSE +CARGS_DEPENDENCIES = +CARGS_SUPPORTS_IN_SOURCE_BUILD = NO + +CARGS_CONF_OPTS += -DBUILD_SHARED_LIBS=On -DCMAKE_BUILD_TYPE=Release + +CARGS_INSTALL_STAGING = YES + +$(eval $(cmake-package)) diff --git a/package/libaltsound/Config.in b/package/libaltsound/Config.in new file mode 100644 index 0000000000..d51eae42f0 --- /dev/null +++ b/package/libaltsound/Config.in @@ -0,0 +1,10 @@ +config BR2_PACKAGE_LIBALTSOUND + bool "libaltsound" + select BR2_PACKAGE_ZLIB + select BR2_HOST_CMAKE_AT_LEAST_3_26 + help + libaltsound - A cross platform compilation of altsound that + is baked directly into VPinMAME. + + https://github.com/vpinball/libaltsound + www.vpforums.org diff --git a/package/libaltsound/libaltsound.mk b/package/libaltsound/libaltsound.mk new file mode 100644 index 0000000000..cf5c69ce6d --- /dev/null +++ b/package/libaltsound/libaltsound.mk @@ -0,0 +1,43 @@ +################################################################################ +# +# libaltsound +# +################################################################################ + +LIBALTSOUND_VERSION = b8f397858cbc7a879f7392c14a509f00c8bdc7dd +LIBALTSOUND_SITE = $(call github,vpinball,libaltsound,$(LIBALTSOUND_VERSION)) +LIBALTSOUND_LICENSE = BSD-3-Clause +LIBALTSOUND_LICENSE_FILES = LICENSE +LIBALTSOUND_DEPENDENCIES = +LIBALTSOUND_SUPPORTS_IN_SOURCE_BUILD = NO +LIBALTSOUND_EXTRA_DOWNLOADS = https://www.un4seen.com/files/bass24-linux.zip + +LIBALTSOUND_CONF_OPTS += -DCMAKE_BUILD_TYPE=Release +LIBALTSOUND_CONF_OPTS += -DBUILD_STATIC=OFF +LIBALTSOUND_CONF_OPTS += -DPLATFORM=linux +LIBALTSOUND_CONF_OPTS += -DARCH=$(BUILD_ARCH) + +ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_X86_64),y) + BUILD_ARCH = x64 + BASS_ARCH = x86_64 +endif + +ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_RPI5_64),y) + BUILD_ARCH = aarch64 + BASS_ARCH = aarch64 +endif + +define LIBALTSOUND_BASS_HACKS + ls $(LIBALTSOUND_DL_DIR) + cd $(LIBALTSOUND_DL_DIR) && unzip -o -x bass24-linux.zip -d bass24 + cp $(LIBALTSOUND_DL_DIR)/bass24/bass.h $(@D)/third-party/include + cp $(LIBALTSOUND_DL_DIR)/bass24/libs/$(BASS_ARCH)/libbass.so \ + $(@D)/third-party/runtime-libs/linux/$(BUILD_ARCH) +endef + +# Install to staging to build Visual Pinball Standalone +LIBALTSOUND_INSTALL_STAGING = YES + +LIBALTSOUND_PRE_CONFIGURE_HOOKS += LIBALTSOUND_BASS_HACKS + +$(eval $(cmake-package)) diff --git a/package/libdmdutil/Config.in b/package/libdmdutil/Config.in new file mode 100644 index 0000000000..faab67bfe2 --- /dev/null +++ b/package/libdmdutil/Config.in @@ -0,0 +1,14 @@ +config BR2_PACKAGE_LIBDMDUTIL + bool "libdmdutil" + select BR2_PACKAGE_LIBSERIALPORT + select BR2_PACKAGE_SOCKPP + select BR2_PACKAGE_CARGS + select BR2_PACKAGE_LIBZEDMD + select BR2_PACKAGE_LIBSERUM + select BR2_PACKAGE_LIBPUPDMD + help + libdmdutil - A cross platform library for performing + DMD tasks. + + https://github.com/vpinball/libdmdutil + www.vpforums.org diff --git a/package/libdmdutil/libdmdutil.mk b/package/libdmdutil/libdmdutil.mk new file mode 100644 index 0000000000..cb1d39fcb0 --- /dev/null +++ b/package/libdmdutil/libdmdutil.mk @@ -0,0 +1,38 @@ +################################################################################ +# +# libdmdutil +# +################################################################################ + +# Version: Commits on Apr 5, 2024 +LIBDMDUTIL_VERSION = bad83bc73e635d18524ca07753e6770be124cd71 +LIBDMDUTIL_SITE = $(call github,vpinball,libdmdutil,$(LIBDMDUTIL_VERSION)) +LIBDMDUTIL_LICENSE = BSD-3-Clause +LIBDMDUTIL_LICENSE_FILES = LICENSE +LIBDMDUTIL_DEPENDENCIES = libserialport sockpp cargs libzedmd libserum libpupdmd +LIBDMDUTIL_SUPPORTS_IN_SOURCE_BUILD = NO + +LIBDMDUTIL_CONF_OPTS += -DCMAKE_BUILD_TYPE=Release +LIBDMDUTIL_CONF_OPTS += -DBUILD_STATIC=OFF +LIBDMDUTIL_CONF_OPTS += -DPLATFORM=linux +LIBDMDUTIL_CONF_OPTS += -DARCH=$(BUILD_ARCH) +LIBDMDUTIL_CONF_OPTS += -DPOST_BUILD_COPY_EXT_LIBS=OFF + +ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_X86_64),y) + BUILD_ARCH = x64 +endif + +ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_RPI5_64),y) + BUILD_ARCH = aarch64 +endif + +# Install to staging to build Visual Pinball Standalone +LIBDMDUTIL_INSTALL_STAGING = YES + +define LIBDMDUTIL_INSTALL_SERVER + $(INSTALL) -D -m 0755 $(LIBDMDUTIL_BUILDDIR)/dmdserver $(TARGET_DIR)/usr/bin/dmdserver +endef + +LIBDMDUTIL_POST_INSTALL_TARGET_HOOKS += LIBDMDUTIL_INSTALL_SERVER + +$(eval $(cmake-package)) diff --git a/package/libdof/Config.in b/package/libdof/Config.in new file mode 100644 index 0000000000..9b545c3e04 --- /dev/null +++ b/package/libdof/Config.in @@ -0,0 +1,11 @@ +config BR2_PACKAGE_LIBDOF + bool "libdof" + select BR2_PACKAGE_LIBSERIALPORT + select BR2_PACKAGE_HIDAPI + select BR2_PACKAGE_SOCKPP + select BR2_PACKAGE_CARGS + help + libdof - A cross platform library for performing Direct + Output Framework tasks. + + https://github.com/jsm174/libdof diff --git a/package/libdof/libdof.mk b/package/libdof/libdof.mk new file mode 100644 index 0000000000..8d96e566fe --- /dev/null +++ b/package/libdof/libdof.mk @@ -0,0 +1,32 @@ +################################################################################ +# +# libdof +# +################################################################################ + +# Version: Commits on Apr 3, 2024 +LIBDOF_VERSION = 5c43c99ea28b44bb58b74554c4303a505e208148 +LIBDOF_SITE = $(call github,jsm174,libdof,$(LIBDOF_VERSION)) +LIBDOF_LICENSE = BSD-3-Clause +LIBDOF_LICENSE_FILES = LICENSE +LIBDOF_DEPENDENCIES = libserialport hidapi sockpp cargs +LIBDOF_SUPPORTS_IN_SOURCE_BUILD = NO + +LIBDOF_CONF_OPTS += -DCMAKE_BUILD_TYPE=Release +LIBDOF_CONF_OPTS += -DBUILD_STATIC=OFF +LIBDOF_CONF_OPTS += -DPLATFORM=linux +LIBDOF_CONF_OPTS += -DARCH=$(BUILD_ARCH) +LIBDOF_CONF_OPTS += -DPOST_BUILD_COPY_EXT_LIBS=OFF + +ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_X86_64),y) + BUILD_ARCH = x64 +endif + +ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_RPI5_64),y) + BUILD_ARCH = aarch64 +endif + +# Install to staging to build Visual Pinball Standalone +LIBDOF_INSTALL_STAGING = YES + +$(eval $(cmake-package)) diff --git a/package/libpinmame/Config.in b/package/libpinmame/Config.in new file mode 100644 index 0000000000..4bae616157 --- /dev/null +++ b/package/libpinmame/Config.in @@ -0,0 +1,8 @@ +config BR2_PACKAGE_LIBPINMAME + bool "libpinmame" + select BR2_PACKAGE_ZLIB + help + PinMAME - Pinball Multiple Arcade Machine Emulator. + + https://github.com/vpinball/pinmame + www.vpforums.org diff --git a/package/libpinmame/libpinmame.mk b/package/libpinmame/libpinmame.mk new file mode 100644 index 0000000000..71187158f8 --- /dev/null +++ b/package/libpinmame/libpinmame.mk @@ -0,0 +1,34 @@ +################################################################################ +# +# libpinmame +# +################################################################################ + +# Version: Commits on Mar 23, 2024 +LIBPINMAME_VERSION = 1a2f0a14cd6edd76d579552e009b5d49811d495f +LIBPINMAME_SITE = $(call github,vpinball,pinmame,$(LIBPINMAME_VERSION)) +LIBPINMAME_LICENSE = BSD-3-Clause +LIBPINMAME_LICENSE_FILES = LICENSE +LIBPINMAME_DEPENDENCIES = zlib +LIBPINMAME_SUPPORTS_IN_SOURCE_BUILD = NO + +define LIBPINMAME_RENAME_CMAKE + cp $(@D)/cmake/libpinmame/CMakeLists_linux-x64.txt $(@D)/CMakeLists.txt + rm $(@D)/makefile +endef + +LIBPINMAME_CONF_OPTS += -DCMAKE_BUILD_TYPE=Release + +define LIBPINMAME_INSTALL_TARGET_CMDS + # staging files + $(INSTALL) -D -m 0755 $(@D)/buildroot-build/libpinmame.so.3.6 \ + $(STAGING_DIR)/usr/lib + cp $(@D)/src/libpinmame/libpinmame.h $(STAGING_DIR)/usr/include + # copy to target + $(INSTALL) -D -m 0755 $(@D)/buildroot-build/libpinmame.so.3.6 \ + $(TARGET_DIR)/usr/lib +endef + +LIBPINMAME_PRE_CONFIGURE_HOOKS += LIBPINMAME_RENAME_CMAKE + +$(eval $(cmake-package)) diff --git a/package/libpupdmd/Config.in b/package/libpupdmd/Config.in new file mode 100644 index 0000000000..ede909e725 --- /dev/null +++ b/package/libpupdmd/Config.in @@ -0,0 +1,7 @@ +config BR2_PACKAGE_LIBPUPDMD + bool "libpupdmd" + help + libpupdmd - cross-platform library for matching PUP triggers + in DMD frames. + + https://github.com/ppuc/libpupdmd diff --git a/package/libpupdmd/libpupdmd.mk b/package/libpupdmd/libpupdmd.mk new file mode 100644 index 0000000000..64539cc8ae --- /dev/null +++ b/package/libpupdmd/libpupdmd.mk @@ -0,0 +1,32 @@ +################################################################################ +# +# libpupdmd +# +################################################################################ + +# Version: Commits on Apr 3, 2024 +LIBPUPDMD_VERSION = c640ea2cec94097e8baefee9dab39266970e4405 +LIBPUPDMD_SITE = $(call github,ppuc,LIBPUPDMD,$(LIBPUPDMD_VERSION)) +LIBPUPDMD_LICENSE = GPL-3.0 license +LIBPUPDMD_LICENSE_FILES = LICENSE +LIBPUPDMD_DEPENDENCIES = +LIBPUPDMD_SUPPORTS_IN_SOURCE_BUILD = NO + +LIBPUPDMD_CONF_OPTS += -DCMAKE_BUILD_TYPE=Release +LIBPUPDMD_CONF_OPTS += -DBUILD_STATIC=OFF +LIBPUPDMD_CONF_OPTS += -DPLATFORM=linux +LIBPUPDMD_CONF_OPTS += -DARCH=$(BUILD_ARCH) +LIBPUPDMD_CONF_OPTS += -DPOST_BUILD_COPY_EXT_LIBS=OFF + +ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_X86_64),y) + BUILD_ARCH = x64 +endif + +ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_RPI5_64),y) + BUILD_ARCH = aarch64 +endif + +# Install to staging to build Visual Pinball Standalone +LIBPUPDMD_INSTALL_STAGING = YES + +$(eval $(cmake-package)) diff --git a/package/libserum/Config.in b/package/libserum/Config.in new file mode 100644 index 0000000000..bb20a20f8e --- /dev/null +++ b/package/libserum/Config.in @@ -0,0 +1,6 @@ +config BR2_PACKAGE_LIBSERUM + bool "libserum" + help + Cross platform dynamic library code for Serum file format. + + https://github.com/zesinger/libserum diff --git a/package/libserum/libserum.mk b/package/libserum/libserum.mk new file mode 100644 index 0000000000..d3930523a6 --- /dev/null +++ b/package/libserum/libserum.mk @@ -0,0 +1,31 @@ +################################################################################ +# +# libserum +# +################################################################################ + +# Version: Commits on Jan 8, 2024 +LIBSERUM_VERSION = 5329017fe093ecd46e382c3fd7f08da0c5b84797 +LIBSERUM_SITE = $(call github,zesinger,libserum,$(LIBSERUM_VERSION)) +LIBSERUM_LICENSE = GPLv2+ +LIBSERUM_LICENSE_FILES = LICENSE.md +LIBSERUM_DEPENDENCIES = +LIBSERUM_SUPPORTS_IN_SOURCE_BUILD = NO + +LIBSERUM_CONF_OPTS += -DCMAKE_BUILD_TYPE=Release +LIBSERUM_CONF_OPTS += -DBUILD_STATIC=OFF +LIBSERUM_CONF_OPTS += -DPLATFORM=linux +LIBSERUM_CONF_OPTS += -DARCH=$(BUILD_ARCH) + +ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_X86_64),y) + BUILD_ARCH = x64 +endif + +ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_RPI5_64),y) + BUILD_ARCH = aarch64 +endif + +# Install to staging to build Visual Pinball Standalone +LIBSERUM_INSTALL_STAGING = YES + +$(eval $(cmake-package)) diff --git a/package/libzedmd/Config.in b/package/libzedmd/Config.in new file mode 100644 index 0000000000..84ec0fd94c --- /dev/null +++ b/package/libzedmd/Config.in @@ -0,0 +1,7 @@ +config BR2_PACKAGE_LIBZEDMD + bool "libzedmd" + select BR2_PACKAGE_LIBSERIALPORT + help + ZeDMD communication library. + + https://github.com/PPUC/libzedmd diff --git a/package/libzedmd/libzedmd.mk b/package/libzedmd/libzedmd.mk new file mode 100644 index 0000000000..c18bcfae28 --- /dev/null +++ b/package/libzedmd/libzedmd.mk @@ -0,0 +1,32 @@ +################################################################################ +# +# libzedmd +# +################################################################################ + +# Version: Commits on Apr 5, 2024 +LIBZEDMD_VERSION = d7e79b09f82144ee6a017bbea074efc23316201e +LIBZEDMD_SITE = $(call github,PPUC,libzedmd,$(LIBZEDMD_VERSION)) +LIBZEDMD_LICENSE = GPLv3 +LIBZEDMD_LICENSE_FILES = LICENSE +LIBZEDMD_DEPENDENCIES = libserialport +LIBZEDMD_SUPPORTS_IN_SOURCE_BUILD = NO + +LIBZEDMD_CONF_OPTS += -DCMAKE_BUILD_TYPE=Release +LIBZEDMD_CONF_OPTS += -DBUILD_STATIC=OFF +LIBZEDMD_CONF_OPTS += -DPLATFORM=linux +LIBZEDMD_CONF_OPTS += -DARCH=$(BUILD_ARCH) +LIBZEDMD_CONF_OPTS += -DPOST_BUILD_COPY_EXT_LIBS=OFF + +ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_X86_64),y) + BUILD_ARCH = x64 +endif + +ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_RPI5_64),y) + BUILD_ARCH = aarch64 +endif + +# Install to staging to build Visual Pinball Standalone +LIBZEDMD_INSTALL_STAGING = YES + +$(eval $(cmake-package)) diff --git a/package/recalbox-romfs2/systems/vpinball/init/roms/.keep b/package/recalbox-romfs2/systems/vpinball/init/roms/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/package/recalbox-romfs2/systems/vpinball/system.ini b/package/recalbox-romfs2/systems/vpinball/system.ini new file mode 100644 index 0000000000..397f81620a --- /dev/null +++ b/package/recalbox-romfs2/systems/vpinball/system.ini @@ -0,0 +1,54 @@ +; =========================== +; vpinball +; =========================== + +; all keys can be overridden for a particular board using key. +; example: +; priority = 0 +; priority.rpi4 = 3 +; Complete sections may be overridden. In such cases, all key from the global section are ignored, +; you must redefine them all +; example +; [core.0] +; [core.0.rpi4] +; Board tags are defined by BR2_PACKAGE_RECALBOX_TARGET_ + +[system] +uuid = "353a53f6-0d82-470f-9a74-3252d10336f9" +name = "vpinball" +fullname = "Visual Pinball Standalone" +theme.folder = "vpinball" +roms.folder = "%ROOT%/vpinball" +screenscraper.id = 198 +doc.link.fr = "https://wiki.recalbox.com/fr/emulators/engine/vpinball" +doc.link.en = "https://wiki.recalbox.com/en/emulators/engine/vpinball" +doc.link.es = "https://wiki.recalbox.com/es/emulators/engine/vpinball" +port = 0 +readonly = 0 +downloader = 0 +icon.unicode = $F25e +extension.types = "*=file" + +[properties] +type = engine +device.pad = mandatory +device.keyboard = optional +device.mouse = no +device.lightgun = no +release.date = "2000-01" +manufacturer = "Randy Davis" +retroachievements = 0 +crt.multiresolution = 0 +crt.multiregion = 0 + +[core.0] +package = BR2_PACKAGE_VPINBALL +priority = 1 +emulator = "vpinball" +core = "vpinball" +extensions = ".vpx" +netplay = 0 +softpatching = 0 +compatibility = good +speed = high +video.backend.rpi5_64 = wayland diff --git a/package/recalbox-romfs2/systems/vpinball/upgrade/roms/.readme.placeholder b/package/recalbox-romfs2/systems/vpinball/upgrade/roms/.readme.placeholder new file mode 100644 index 0000000000..e69de29bb2 diff --git a/package/sockpp/Config.in b/package/sockpp/Config.in new file mode 100644 index 0000000000..caf4056616 --- /dev/null +++ b/package/sockpp/Config.in @@ -0,0 +1,6 @@ +config BR2_PACKAGE_SOCKPP + bool "sockpp" + help + sockpp - Modern C++ socket library. + + https://github.com/fpagliughi/sockpp diff --git a/package/sockpp/sockpp.mk b/package/sockpp/sockpp.mk new file mode 100644 index 0000000000..de038af62c --- /dev/null +++ b/package/sockpp/sockpp.mk @@ -0,0 +1,19 @@ +################################################################################ +# +# sockpp +# +################################################################################ + +# Version: Commits on Mar 11, 2024 +SOCKPP_VERSION = e6c4688a576d95f42dd7628cefe68092f6c5cd0f +SOCKPP_SITE = $(call github,fpagliughi,sockpp,$(SOCKPP_VERSION)) +SOCKPP_LICENSE = BSD-3-Clause +SOCKPP_LICENSE_FILES = LICENSE +SOCKPP_DEPENDENCIES = +SOCKPP_SUPPORTS_IN_SOURCE_BUILD = NO + +SOCKPP_CONF_OPTS += -DCMAKE_BUILD_TYPE=Release + +SOCKPP_INSTALL_STAGING = YES + +$(eval $(cmake-package)) diff --git a/package/vpinball/001-default-path.patch b/package/vpinball/001-default-path.patch new file mode 100644 index 0000000000..063a449b84 --- /dev/null +++ b/package/vpinball/001-default-path.patch @@ -0,0 +1,13 @@ +diff --git a/standalone/inc/vpinmame/VPinMAMEController.cpp b/standalone/inc/vpinmame/VPinMAMEController.cpp +index 69ca58b8..0c912c2a 100644 +--- a/standalone/inc/vpinmame/VPinMAMEController.cpp ++++ b/standalone/inc/vpinmame/VPinMAMEController.cpp +@@ -302,7 +302,7 @@ VPinMAMEController::VPinMAMEController() + #if (defined(__APPLE__) && ((defined(TARGET_OS_IOS) && TARGET_OS_IOS) || (defined(TARGET_OS_TV) && TARGET_OS_TV))) || defined(__ANDROID__) + m_szPath = g_pvp->m_szMyPath + "pinmame" + PATH_SEPARATOR_CHAR; + #else +- m_szPath = string(getenv("HOME")) + PATH_SEPARATOR_CHAR + ".pinmame" + PATH_SEPARATOR_CHAR; ++ m_szPath = g_pvp->m_szMyPrefPath + "pinmame" + PATH_SEPARATOR_CHAR; + #endif + } + } diff --git a/package/vpinball/Config.in b/package/vpinball/Config.in new file mode 100644 index 0000000000..8e0553fdda --- /dev/null +++ b/package/vpinball/Config.in @@ -0,0 +1,15 @@ +config BR2_PACKAGE_VPINBALL + bool "vpinball" + select BR2_PACKAGE_LIBFREEIMAGE + select BR2_PACKAGE_LIBPINMAME + select BR2_PACKAGE_LIBDMDUTIL + select BR2_PACKAGE_LIBALTSOUND + select BR2_PACKAGE_LIBDOF + select BR2_PACKAGE_SDL2 + select BR2_PACKAGE_SDL2_IMAGE + select BR2_PACKAGE_SDL2_TTF + select BR2_PACKAGE_FFMPEG + help + Visual Pinball. + + www.vpforums.org diff --git a/package/vpinball/p2k.cfg b/package/vpinball/p2k.cfg new file mode 100644 index 0000000000..783462796f --- /dev/null +++ b/package/vpinball/p2k.cfg @@ -0,0 +1,14 @@ +# Recalbox's Pad-to-Keyboard configuration +# VPINBALL + +0:+start = q ;; Quit +0:start = 1 ;; Start Game +0:select = 5 ;; Insert coin +0:b = enter ;; Pull plunger +0:l2 = leftshift ;; Left flipper +0:r2 = rightshift ;; Right flipper +0:up = space ;; Nudge up +0:left = z ;; Nudge left +0:right = kpslash ;; Nudge right +0:l3 = leftctrl ;; Left magna save +0:r3 = rightctrl ;; Right magna save diff --git a/package/vpinball/vpinball.mk b/package/vpinball/vpinball.mk new file mode 100644 index 0000000000..ecb1b590d5 --- /dev/null +++ b/package/vpinball/vpinball.mk @@ -0,0 +1,60 @@ +################################################################################ +# +# vpinball +# +################################################################################ + +VPINBALL_VERSION = bee8834ea050b347f7dc91aeb1f2a0d43ad04d10 +VPINBALL_SITE = $(call github,vpinball,vpinball,$(VPINBALL_VERSION)) +VPINBALL_LICENSE = GPLv3+ +VPINBALL_LICENSE_FILES = LICENSE +VPINBALL_DEPENDENCIES = libfreeimage libpinmame libaltsound libdmdutil libdof sdl2 sdl2_image sdl2_ttf ffmpeg +VPINBALL_SUPPORTS_IN_SOURCE_BUILD = NO +VPINBALL_EXTRA_DOWNLOADS = https://www.un4seen.com/files/bass24-linux.zip + +ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_X86_64),y) + SOURCE = CMakeLists_gl-linux-x64.txt + SOURCE_DIR = linux-x64 + ARCH = x86_64 +endif + +ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_RPI5_64),y) + SOURCE = CMakeLists_gl-linux-aarch64.txt + SOURCE_DIR = linux-aarch64 + ARCH = aarch64 + VPINBALL_CONF_OPTS += "-DBUILD_RPI=ON" +endif + +define VPINBALL_CMAKE_HACKS + ## derived from standalone/linux/external.sh ## + # copy linux x64 + cp $(@D)/standalone/cmake/$(SOURCE) $(@D)/CMakeLists.txt + $(SED) 's:$${CMAKE_SOURCE_DIR}/standalone/$(SOURCE_DIR)/external/include:$(STAGING_DIR)/usr/include/:g' $(@D)/CMakeLists.txt + $(SED) 's:$${CMAKE_SOURCE_DIR}/standalone/$(SOURCE_DIR)/external/lib/:$(STAGING_DIR)/usr/lib/:g' $(@D)/CMakeLists.txt + cd $(VPINBALL_DL_DIR) && unzip -o -x bass24-linux.zip -d bass24 + $(INSTALL) -D -m 0755 $(VPINBALL_DL_DIR)/bass24/libs/$(ARCH)/libbass.so $(STAGING_DIR)/usr/lib + $(INSTALL) -D -m 0755 $(VPINBALL_DL_DIR)/bass24/libs/$(ARCH)/libbass.so $(TARGET_DIR)/usr/lib +endef + +VPINBALL_CONF_OPTS += -DCMAKE_BUILD_TYPE=Release +VPINBALL_CONF_OPTS += -DBUILD_SHARED_LIBS=OFF +VPINBALL_CONF_OPTS += -DPOST_BUILD_COPY_EXT_LIBS=OFF + +define VPINBALL_INSTALL_TARGET_CMDS + mkdir -p $(TARGET_DIR)/usr/bin/vpinball + # install binary + $(INSTALL) -D -m 0755 $(@D)/buildroot-build/VPinballX_GL \ + $(TARGET_DIR)/usr/bin/vpinball + # copy folders + cp -R $(@D)/buildroot-build/flexdmd $(TARGET_DIR)/usr/bin/vpinball/ + cp -R $(@D)/buildroot-build/assets $(TARGET_DIR)/usr/bin/vpinball/ + cp -R $(@D)/buildroot-build/scripts $(TARGET_DIR)/usr/bin/vpinball/ + cp -R $(@D)/buildroot-build/shader10.8.0 $(TARGET_DIR)/usr/bin/vpinball/ + cp $(BR2_EXTERNAL_RECALBOX_PATH)/package/vpinball/p2k.cfg \ + $(TARGET_DIR)/recalbox/share_upgrade/roms/vpinball/.p2k.cfg + +endef + +VPINBALL_PRE_CONFIGURE_HOOKS += VPINBALL_CMAKE_HACKS + +$(eval $(cmake-package)) diff --git a/projects/configgen/configgen/emulatorlauncher.py b/projects/configgen/configgen/emulatorlauncher.py index 9a3815ec40..2153d508fe 100644 --- a/projects/configgen/configgen/emulatorlauncher.py +++ b/projects/configgen/configgen/emulatorlauncher.py @@ -153,6 +153,10 @@ def getGenerator(emulator): module = __import__("configgen.generators.xemu.xemuGenerator", fromlist=["XemuGenerator"]) generatorClass = getattr(module, "XemuGenerator") return generatorClass() + elif emulator == "vpinball": + module = __import__("configgen.generators.vpinball.vpinballGenerator", fromlist=["VpinballGenerator"]) + generatorClass = getattr(module, "VpinballGenerator") + return generatorClass() else: print("Missing generator for {}".format(emulator)) raise ValueError diff --git a/projects/configgen/configgen/generators/vpinball/__init__.py b/projects/configgen/configgen/generators/vpinball/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/projects/configgen/configgen/generators/vpinball/vpinballControllers.py b/projects/configgen/configgen/generators/vpinball/vpinballControllers.py new file mode 100644 index 0000000000..8ef6370f65 --- /dev/null +++ b/projects/configgen/configgen/generators/vpinball/vpinballControllers.py @@ -0,0 +1,19 @@ +from configgen.controllers.controller import ControllerPerPlayer + + +class VpinballControllers: + + def __init__(self, controllers: ControllerPerPlayer): + self.controllers = controllers + + def Start(self): + for index, controller in self.controllers.items(): + if controller.HasStart: + return controller.Start.Id + return -1 + + def HotKey(self): + for index, controller in self.controllers.items(): + if controller.HasHotkey: + return controller.Hotkey.Id + return -1 diff --git a/projects/configgen/configgen/generators/vpinball/vpinballGenerator.py b/projects/configgen/configgen/generators/vpinball/vpinballGenerator.py new file mode 100644 index 0000000000..0e6a1b632d --- /dev/null +++ b/projects/configgen/configgen/generators/vpinball/vpinballGenerator.py @@ -0,0 +1,173 @@ +import os +import configparser +import shutil +from configgen.Command import Command +import configgen.recalboxFiles as recalboxFiles +from configgen.Emulator import Emulator +from configgen.controllers.controller import ControllerPerPlayer +from configgen.generators.Generator import Generator +from configgen.generators.vpinball.vpinballControllers import VpinballControllers +from configgen.settings.keyValueSettings import keyValueSettings +from configgen.utils.recallog import recallog + + +class VpinballGenerator(Generator): + def get_b2s_size(self, xsize): + size = [290, 75] + width = size[0] * xsize + height = size[1] * xsize + return width, height + + def get_b2s_x(self, scr1Res, scr2Res, b2sXsize): + windowx = (int(scr1Res) + (int(scr2Res) / 2)) - (int(b2sXsize / 2)) + return windowx + + def generate(self, system: Emulator, playersControllers: ControllerPerPlayer, recalboxOptions: keyValueSettings, args) -> Command: + """ + Load, override keys and save back emulator's configuration file + This way, any modification is kept accross emulator launhes + """ + + conf = keyValueSettings(recalboxFiles.recalboxConf) + conf.loadFile(True) + have_custom = False + + if not os.path.exists(recalboxFiles.vpinballRootFolder): + os.makedirs(recalboxFiles.vpinballRootFolder) + + if not os.path.exists(recalboxFiles.vpinballConfigFile): + shutil.copy( + "/usr/bin/vpinball/assets/Default_VPinballX.ini", + recalboxFiles.vpinballConfigFile, + ) + + if os.path.exists(recalboxFiles.vpinballRootFolder + '/VPinballX-custom.ini'): + recallog("*** Using Custom VPinballX.ini file ***") + have_custom = True + recalboxFiles.vpinballConfigFile = recalboxFiles + '/VPinballX-custom.ini' + + if not have_custom: + try: + vpinballSettings = configparser.ConfigParser( + strict=False, allow_no_value=True, empty_lines_in_values=False + ) + vpinballSettings.optionxform = str + vpinballSettings.read(recalboxFiles.vpinballConfigFile) + except configparser.DuplicateOptionError: + recallog("*** Using default VPinballX.ini file ***") + shutil.copy( + "/usr/bin/vpinball/assets/Default_VPinballX.ini", + recalboxFiles.vpinballConfigFile, + ) + + if not vpinballSettings.has_section("Standalone"): + vpinballSettings.add_section("Standalone") + if not vpinballSettings.has_section("Player"): + vpinballSettings.add_section("Player") + + soundOutput = conf.getString("pinball.output", "-1") + ballTrail = int(conf.getString("pinball.trail", "0")) + cabinetMode = int(conf.getString("pinball.cabinet", "1")) + b2sSize = int(conf.getString("pinball.b2sxsize", "1")) + screen1Resolution = conf.getString("system.externalscreen.forceresolution", "1920x1080").split("x") + screen2Resolution = conf.getString("pinball.screen2.resolution", "$").split("x") + screen2 = conf.getString("pinball.screen2", "$") + profile = conf.getString("pinball.profile", "1") + + if soundOutput != "-1": + vpinballSettings.set("Player", "SoundDevice", soundOutput) + vpinballSettings.set("Player", "SoundDeviceBG", soundOutput) + else: + vpinballSettings.set("Player", "SoundDevice", "") + vpinballSettings.set("Player", "SoundDeviceBG", "") + + if bool(ballTrail): + vpinballSettings.set("Player", "BallTrail", "1") + vpinballSettings.set("Player", "BallTrailStrength", "0.5") + else: + vpinballSettings.set("Player", "BallTrail", "") + vpinballSettings.set("Player", "BallTrailStrength", "") + + vpinballSettings.set("Player", "BGSet", "0") + vpinballSettings.set("Standalone", "PinMAMEWindow", "") + vpinballSettings.set("Standalone", "PinMAMEWindowX", "") + vpinballSettings.set("Standalone", "PinMAMEWindowY", "") + vpinballSettings.set("Standalone", "PinMAMEWindowWidth", "0") + vpinballSettings.set("Standalone", "PinMAMEWindowHeight", "0") + vpinballSettings.set("Standalone", "B2SHideB2SDMD", "1") + vpinballSettings.set("Standalone", "B2SHideDMD", "1") + vpinballSettings.set("Standalone", "B2SWindows", "1") + vpinballSettings.set("Standalone", "B2SBackglassX", "") + vpinballSettings.set("Standalone", "B2SBackglassY", "") + vpinballSettings.set("Standalone", "B2SBackglassWidth", "0") + vpinballSettings.set("Standalone", "B2SBackglassHeight", "0") + + if screen2 != "$": + vpinballSettings.set("Standalone", "B2SBackglassX", screen1Resolution[0]) + vpinballSettings.set("Standalone", "B2SBackglassY", "0") + vpinballSettings.set("Standalone", "B2SBackglassWidth", screen2Resolution[0]) + vpinballSettings.set("Standalone", "B2SBackglassHeight", screen2Resolution[1]) + + if bool(cabinetMode) and system.Rotation.value > 0: + if b2sSize != 1: + xB2sSize = self.get_b2s_size(b2sSize) + else: + xB2sSize = [290, 75] + B2sWindowX = self.get_b2s_x(screen1Resolution[0], screen2Resolution[0], xB2sSize[0]) + vpinballSettings.set("Player", "BGSet", "1") + vpinballSettings.set("Standalone", "PinMAMEWindowX", str(int(B2sWindowX))) + vpinballSettings.set("Standalone", "PinMAMEWindowY", str(int(screen2Resolution[1]) * 0.8)) + vpinballSettings.set("Standalone", "PinMAMEWindowWidth", str(xB2sSize[0])) + vpinballSettings.set("Standalone", "PinMAMEWindowHeight", str(xB2sSize[1])) + vpinballSettings.set("Standalone", "B2SWindows", "1") + + if profile == "1": + vpinballSettings.set("Player", "FXAA", "0") + vpinballSettings.set("Player", "Sharpen", "0") + vpinballSettings.set("Player", "DisableAO", "1") + vpinballSettings.set("Player", "DynamicAO", "0") + vpinballSettings.set("Player", "SSRefl", "0") + vpinballSettings.set("Player", "PFReflection", "3") + vpinballSettings.set("Player", "ForceAnisotropicFiltering", "0") + vpinballSettings.set("Player", "AlphaRampAccuracy", "5") + elif profile == "2": + vpinballSettings.set("Player", "FXAA", "") + vpinballSettings.set("Player", "Sharpen", "") + vpinballSettings.set("Player", "DisableAO", "") + vpinballSettings.set("Player", "DynamicAO", "") + vpinballSettings.set("Player", "SSRefl", "") + vpinballSettings.set("Player", "PFReflection", "") + vpinballSettings.set("Player", "ForceAnisotropicFiltering", "") + vpinballSettings.set("Player", "AlphaRampAccuracy", "") + elif profile == "3": + vpinballSettings.set("Player", "FXAA", "3") + vpinballSettings.set("Player", "Sharpen", "2") + vpinballSettings.set("Player", "DisableAO", "0") + vpinballSettings.set("Player", "DynamicAO", "1") + vpinballSettings.set("Player", "SSRefl", "1") + vpinballSettings.set("Player", "PFReflection", "5") + vpinballSettings.set("Player", "ForceAnisotropicFiltering", "1") + vpinballSettings.set("Player", "AlphaRampAccuracy", "10") + + with open(recalboxFiles.vpinballConfigFile, "w") as configfile: + vpinballSettings.write(configfile) + + # Default args + arguments = [ + "-PrefPath", + recalboxFiles.vpinballRootFolder, + "-Ini", + recalboxFiles.vpinballConfigFile, + "-play", + ] + + # Rom + arguments.append(args.rom) + + commandArray = [recalboxFiles.recalboxBins[system.Emulator]] + commandArray.extend(arguments) + + if system.HasArgs: + commandArray.extend(system.Args) + + return Command(videomode=system.VideoMode, array=commandArray) diff --git a/projects/configgen/configgen/recalboxFiles.py b/projects/configgen/configgen/recalboxFiles.py index 56834472f9..067534a57f 100644 --- a/projects/configgen/configgen/recalboxFiles.py +++ b/projects/configgen/configgen/recalboxFiles.py @@ -58,6 +58,7 @@ recalboxBins =\ 'xemu' : '/usr/bin/xemu', 'xroar' : '/usr/bin/xroar', 'vvvvvv' : '/usr/bin/vvvvvv/VVVVVV', + 'vpinball' : '/usr/bin/vpinball/VPinballX_GL', } @@ -188,3 +189,6 @@ sdlpopConfigFile = CONF + '/sdlpop/sdlpop.ini' sdlpopControllersFile = CONF + '/sdlpop/gamecontrollerdb.txt' xemuConfig = CONF + '/xemu/xemu.toml' + +vpinballRootFolder = CONF + '/vpinball' +vpinballConfigFile = vpinballRootFolder + '/VPinballX-configgen.ini' diff --git a/projects/configgen/setup.py b/projects/configgen/setup.py index fa9ed6011d..e3ddd1ef6b 100644 --- a/projects/configgen/setup.py +++ b/projects/configgen/setup.py @@ -46,6 +46,7 @@ setup(name='recalbox-configgen', 'configgen.generators.sdlpop', 'configgen.generators.vvvvvv', 'configgen.generators.xemu', + 'configgen.generators.vpinball', 'configgen.settings', 'configgen.utils'], scripts=['emulatorlauncher.py'] diff --git a/projects/frontend/data/resources/menu.xml b/projects/frontend/data/resources/menu.xml index 7c8265d4d5..4562a0e279 100644 --- a/projects/frontend/data/resources/menu.xml +++ b/projects/frontend/data/resources/menu.xml @@ -255,6 +255,16 @@ + + + + + + + + diff --git a/projects/frontend/es-app/src/guis/MenuMessages.h b/projects/frontend/es-app/src/guis/MenuMessages.h index 50aa6cf517..94b8571fe9 100755 --- a/projects/frontend/es-app/src/guis/MenuMessages.h +++ b/projects/frontend/es-app/src/guis/MenuMessages.h @@ -218,6 +218,9 @@ class MenuMessages #define MENUMESSAGE_ADVANCED_KODI_AT_START_HELP_MSG "Automatically start into Kodi on boot." #define MENUMESSAGE_ADVANCED_RESOLUTION_KODI_HELP_MSG "Select the resolution for Kodi interface and videos" + #define MENUMESSAGE_ADVANCED_PINBALL_HELP_MSG "Customize the Visual Pinball" + #define MENUMESSAGE_ADVANCED_PINBALL_CABINET_HELP_MSG "Enable cabinet mode" + #define MENUMESSAGE_ADVANCED_CASES_HELP_MSG "If you installed a case on your Recalbox, you can install or uninstall it in this. Some cases are detected automatically and will also be reported here." #define MENUMESSAGE_ADVANCED_FRAMERATE_HELP_MSG "Show the framerate in EmulationStation and in game." diff --git a/projects/frontend/es-app/src/guis/menus/MenuBuilder.cpp b/projects/frontend/es-app/src/guis/menus/MenuBuilder.cpp index 3060ffacb9..e5f461f85b 100644 --- a/projects/frontend/es-app/src/guis/menus/MenuBuilder.cpp +++ b/projects/frontend/es-app/src/guis/menus/MenuBuilder.cpp @@ -837,6 +837,11 @@ void MenuBuilder::AddItem(const InheritableContext& context, const ItemDefinitio AddAction(InheritableContext(context).Merge(InheritableContext(system)), item, true, defaultGrayed, true); break; } + case MenuItemType::VPCabinetMode: { AddSwitch(context, item, mConf.GetPinballCabinet(), false); break; } + case MenuItemType::VPEnableBallTrail: { AddSwitch(context, item, mConf.GetPinballTrail(), false); break; } + case MenuItemType::VPBackglassScreen: { AddList(context, item, { { _("Screen #1"), "1"}, { _("Screen#2"), "2"} }, mConf.GetPinballBackglassScreen(), "1", false); break; } + case MenuItemType::VPBackglassResolution: { AddList(context, item, { {_("1920x1080"), "1920x1080" }, {_("1280x1024"), "1280x1024" } }, mConf.GetPinballBackglassResolution(), "1920x1080", false); break; } + case MenuItemType::VPProfile: { AddList(context, item, { { _("light"), "1" }, { _("normal"), "2" }, { _("max"), "3" } }, mConf.GetPinballProfile(), "1", false); break; } case MenuItemType::_Settings_: case MenuItemType::_Error_: default: { LOG(LogFatal) << "[MenuProvider] Cannot create menu item: " << MenuConverters::ItemToString(item.Type()); break; } diff --git a/projects/frontend/es-app/src/guis/menus/MenuItemType.cpp b/projects/frontend/es-app/src/guis/menus/MenuItemType.cpp index 6d4204858d..7a93c13ca1 100644 --- a/projects/frontend/es-app/src/guis/menus/MenuItemType.cpp +++ b/projects/frontend/es-app/src/guis/menus/MenuItemType.cpp @@ -49,6 +49,7 @@ MenuContainerType MenuConverters::MenuFromString(const String& type) { "NetplayHost", MenuContainerType::NetplayHost }, { "NetplayClient", MenuContainerType::NetplayClient }, { "EmulatorSpecificSettings", MenuContainerType::EmulatorSpecificSettings }, + { "PinballSettings", MenuContainerType::PinballSettings }, }; if (type == "auto") { static int autoInc =0xFFFF; return (MenuContainerType)(++autoInc); } if (MenuContainerType* t = sStringToMenuType.try_get(type); t != nullptr) return *t; @@ -297,6 +298,11 @@ static const HashMap sStringToItemType { "NetplayJoinAsViewer", MenuItemType::NetplayJoinAsViewer }, { "NetplayUsePassword", MenuItemType::NetplayUsePassword }, { "DownloadGamePack", MenuItemType::DownloadGamePack }, + { "VPCabinetMode", MenuItemType::VPCabinetMode }, + { "VPEnableBallTrail", MenuItemType::VPEnableBallTrail }, + { "VPBackglassScreen", MenuItemType::VPBackglassScreen }, + { "VPBackglassResolution", MenuItemType::VPBackglassResolution }, + { "VPProfile", MenuItemType::VPProfile }, }; MenuItemType MenuConverters::ItemFromString(const String& type) diff --git a/projects/frontend/es-app/src/guis/menus/MenuItemType.h b/projects/frontend/es-app/src/guis/menus/MenuItemType.h index f1476bc5db..bf19a1bb41 100644 --- a/projects/frontend/es-app/src/guis/menus/MenuItemType.h +++ b/projects/frontend/es-app/src/guis/menus/MenuItemType.h @@ -49,6 +49,7 @@ enum class MenuContainerType NetplayHost, NetplayClient, EmulatorSpecificSettings, + PinballSettings, }; enum class MenuItemType @@ -297,6 +298,11 @@ enum class MenuItemType NetplayJoinAsViewer, NetplayUsePassword, DownloadGamePack, + VPCabinetMode, + VPEnableBallTrail, + VPBackglassScreen, + VPBackglassResolution, + VPProfile, }; class MenuConverters diff --git a/projects/frontend/es-app/src/guis/menus/MenuPinballSettings.cpp b/projects/frontend/es-app/src/guis/menus/MenuPinballSettings.cpp new file mode 100644 index 0000000000..6e71522e18 --- /dev/null +++ b/projects/frontend/es-app/src/guis/menus/MenuPinballSettings.cpp @@ -0,0 +1,104 @@ +// +// Created by bkg2k on 04/01/2021. +// +// As part of the RECALBOX Project +// http://www.recalbox.com +// + +#include "MenuPinballSettings.h" +#include + +MenuPinballSettings::MenuPinballSettings(WindowManager& window) + : Menu(window, InheritableContext(), _("PINBALL SETTINGS")) +{ +} + +void MenuPinballSettings::BuildMenuItems() +{ + // Enable Pinball Cabinet + AddSwitch(_("ENABLE CABINET MODE"), RecalboxConf::Instance().GetPinballCabinet(), (int)Components::Cabinet, this, _(MENUMESSAGE_ADVANCED_PINBALL_CABINET_HELP_MSG)); + + // Enable Pinball Trail + AddSwitch(_("ENABLE BALL TRAIL"), RecalboxConf::Instance().GetPinballTrail(), (int)Components::Trail, this, _(MENUMESSAGE_ADVANCED_PINBALL_CABINET_HELP_MSG)); + + // Select Backglass Screen + AddList(_("BACKGLASS SCREEN"), (int)Components::BackglassScreen, this, GetPinballBackglassScreenEntries(), RecalboxConf::Instance().GetPinballBackglassScreen(), "1", _(MENUMESSAGE_ADVANCED_PINBALL_CABINET_HELP_MSG)); + + // Select Backglass resolution + AddList(_("BACKGLASS RESOLUTION"), (int)Components::BackglassResolution, this, GetPinballBackglassResolutionEntries(), RecalboxConf::Instance().GetPinballBackglassResolution(), "1920x1080", _(MENUMESSAGE_ADVANCED_PINBALL_CABINET_HELP_MSG)); + + // Select Profile + AddList(_("PROFILE"), (int)Components::Profile, this, GetPinballProfileEntries(), RecalboxConf::Instance().GetPinballProfile(), "1", _(MENUMESSAGE_ADVANCED_PINBALL_CABINET_HELP_MSG)); +} + +void MenuPinballSettings::MenuSwitchChanged(const ItemSwitch& item, bool& status, int id) +{ + (void)item; + switch((Components)id) + { + case Components::Cabinet: RecalboxConf::Instance().SetPinballCabinet(status).Save(); break; + case Components::Trail: RecalboxConf::Instance().SetPinballTrail(status).Save(); break; + case Components::BackglassScreen: + case Components::BackglassResolution: + case Components::Profile: + default: break; + } +} + +SelectorEntry::List MenuPinballSettings::GetPinballBackglassResolutionEntries() +{ + return SelectorEntry::List + { + {_("1920x1080"), "1920x1080" }, + {_("1280x1024"), "1280x1024" }, + }; +} + +SelectorEntry::List MenuPinballSettings::GetPinballBackglassScreenEntries() +{ + return SelectorEntry::List + { + { _("1"), "1"}, + { _("2"), "2"}, + }; +} + +SelectorEntry::List MenuPinballSettings::GetPinballProfileEntries() +{ + return SelectorEntry::List + { + { _("light"), "1" }, + { _("normal"), "2" }, + { _("max"), "3" }, + }; +} + +void MenuPinballSettings::MenuSingleChanged(ItemSelectorBase& item, int id, int index, const String& value) +{ + (void)item; + (void)index; + switch((Components)id) + { + case Components::BackglassResolution: + { + if (value.empty()) RecalboxConf::Instance().DeletePinballBackglassResolution().Save(); + else RecalboxConf::Instance().SetPinballBackglassResolution(value).Save(); + break; + } + case Components::BackglassScreen: + { + if (value.empty()) RecalboxConf::Instance().DeletePinballBackglassScreen().Save(); + else RecalboxConf::Instance().SetPinballBackglassScreen(value).Save(); + break; + } + case Components::Profile: + { + if (value.empty()) RecalboxConf::Instance().DeletePinballProfile().Save(); + else RecalboxConf::Instance().SetPinballProfile(value).Save(); + break; + } + case Components::Cabinet: + case Components::Trail: + default: break; + } +} diff --git a/projects/frontend/es-app/src/guis/menus/MenuPinballSettings.h b/projects/frontend/es-app/src/guis/menus/MenuPinballSettings.h new file mode 100644 index 0000000000..699ec48059 --- /dev/null +++ b/projects/frontend/es-app/src/guis/menus/MenuPinballSettings.h @@ -0,0 +1,56 @@ +// +// Created by bkg2k on 04/01/2021. +// +// As part of the RECALBOX Project +// http://www.recalbox.com +// +#pragma once + +#include +#include "ResolutionAdapter.h" + +// Forward declaration +class SystemManager; + +class MenuPinballSettings : public Menu + , private ISingleSelectorChanged + , private ISwitchChanged +{ + public: + /*! + * @brief Default constructor + * @param window Global window + */ + explicit MenuPinballSettings(WindowManager& window); + + void BuildMenuItems() final; + + private: + enum class Components + { + Cabinet, + Trail, + BackglassScreen, + BackglassResolution, + Profile, + }; + + SelectorEntry::List GetPinballBackglassResolutionEntries(); + SelectorEntry::List GetPinballBackglassScreenEntries(); + SelectorEntry::List GetPinballProfileEntries(); + + /* + * ISwitchChanged implementation + */ + + void MenuSwitchChanged(const ItemSwitch& item, bool& status, int id) final; + + /* + * ISingleSelectorChanged implementation + */ + + void MenuSingleChanged(ItemSelectorBase& item, int id, int index, const String& value) final; +}; + + + diff --git a/projects/frontend/es-app/src/guis/menus/MenuProvider.cpp b/projects/frontend/es-app/src/guis/menus/MenuProvider.cpp index 4a4835efe2..360d8594cf 100644 --- a/projects/frontend/es-app/src/guis/menus/MenuProvider.cpp +++ b/projects/frontend/es-app/src/guis/menus/MenuProvider.cpp @@ -970,6 +970,8 @@ void MenuProvider::MenuSwitchChanged(const ItemSwitch& item, bool& value, int id case MenuItemType::EnableFavorites: mConf.SetEnableEditFavorites(value); break; case MenuItemType::FlattenFolders: assert(item.Context().HasSystem() && "No system context"); mConf.SetSystemFlatFolders(*item.Context().System(), value); break; case MenuItemType::ScrapeAuto: mConf.SetScraperAuto(value); break; + case MenuItemType::VPCabinetMode: mConf.SetPinballCabinet(value).Save(); break; + case MenuItemType::VPEnableBallTrail: mConf.SetPinballTrail(value).Save(); break; case MenuItemType::_Settings_: assert(item.Context().HasSetting() && "No setting context"); SettingChanged(*item.Context().Setting(), value ? "1" : "0"); break; default: mWindow.displayMessage("[MenuProcessor] Unprocessed id " + MenuConverters::ItemToString((MenuItemType)id) + " in MenuSwitchChanged !"); @@ -1108,6 +1110,9 @@ void MenuProvider::MenuSingleChanged(ItemSelectorBase& item, int id, int break; } case MenuItemType::MetadataRatio: { assert(item.Context().HasGame() && "No game context"); item.Context().Game()->Metadata().SetRatio(value); mSystemManager.UpdateSystemsOnGameChange(item.Context().Game(), MetadataType::Ratio, false); break; } + case MenuItemType::VPBackglassResolution: mConf.SetPinballBackglassResolution(value).Save(); break; + case MenuItemType::VPBackglassScreen: mConf.SetPinballBackglassScreen(value).Save(); break; + case MenuItemType::VPProfile: mConf.SetPinballProfile(value).Save(); break; case MenuItemType::_Settings_: assert(item.Context().HasSetting() && "No setting context"); SettingChanged(*item.Context().Setting(), value); break; default: mWindow.displayMessage("[MenuProcessor] Unprocessed id " + MenuConverters::ItemToString((MenuItemType)id) + " in MenuSingleChanged !"); diff --git a/projects/frontend/es-app/src/guis/menus/vault/MenuAdvancedSettings.cpp_ b/projects/frontend/es-app/src/guis/menus/vault/MenuAdvancedSettings.cpp_ index 9cc8a4e118..06e0f9fb63 100644 --- a/projects/frontend/es-app/src/guis/menus/vault/MenuAdvancedSettings.cpp_ +++ b/projects/frontend/es-app/src/guis/menus/vault/MenuAdvancedSettings.cpp_ @@ -11,7 +11,8 @@ #include "MenuSystemList.h" #include "MenuKodiSettings.h" #include "MenuCRT.h" -#include "guis/menus/vault/MenuResolutionSettings.h" +#include "MenuResolutionSettings.h" +#include "MenuPinballSettings.h" #include "hardware/RPiEepromUpdater.h" #include "views/MenuFilter.h" #include "MenuUserScripts.h" @@ -45,6 +46,9 @@ void MenuAdvancedSettings::BuildMenuItems() // Virtual systems AddSubMenu(_("VIRTUAL SYSTEMS"), (int)Components::VirtualSubMenu, this, _(MENUMESSAGE_ADVANCED_VIRTUALSYSTEMS_HELP_MSG)); + // Visual Pinball + if (Board::Instance().GetBoardType() == BoardType::Pi5 || Board::Instance().GetBoardType() == BoardType::PCx64) + AddSubMenu(_("PINBALL SETTINGS"), (int)Components::PinballSubMenu, this, _(MENUMESSAGE_ADVANCED_PINBALL_HELP_MSG)); // CRT if (Board::Instance().CanHaveCRTBoard()) @@ -254,6 +258,7 @@ void MenuAdvancedSettings::MenuSwitchChanged(const ItemSwitch& item, bool& statu case Components::VirtualSubMenu: case Components::AdvancedSubMenu: case Components::KodiSubMenu: + case Components::PinballSubMenu: case Components::Cases: case Components::SecuritySubMenu: case Components::FactoryReset: @@ -277,6 +282,7 @@ void MenuAdvancedSettings::SubMenuSelected(const ItemSubMenu& item, int id) case Components::KodiSubMenu: mWindow.pushGui(new MenuKodiSettings(mWindow)); break; case Components::ResolutionSubMenu: mWindow.pushGui(new MenuResolutionSettings(mWindow, mSystemManager)); break; case Components::UserScripts: mWindow.pushGui(new MenuUserScripts(mWindow)); break; + case Components::PinballSubMenu: mWindow.pushGui(new MenuPinballSettings(mWindow)); break; case Components::FactoryReset: ResetFactory(); break; case Components::EepromUpdate: EepromUpdate(); break; case Components::OverclockList: diff --git a/projects/frontend/es-app/src/guis/menus/vault/MenuAdvancedSettings.h_ b/projects/frontend/es-app/src/guis/menus/vault/MenuAdvancedSettings.h_ index b4f83627f0..1eb4d341d8 100644 --- a/projects/frontend/es-app/src/guis/menus/vault/MenuAdvancedSettings.h_ +++ b/projects/frontend/es-app/src/guis/menus/vault/MenuAdvancedSettings.h_ @@ -44,6 +44,7 @@ class MenuAdvancedSettings : public Menu ResolutionSubMenu, AdvancedSubMenu, KodiSubMenu, + PinballSubMenu, Cases, SecuritySubMenu, ShowFPS, diff --git a/projects/frontend/es-core/src/RecalboxConf.h b/projects/frontend/es-core/src/RecalboxConf.h index 39f1ea19af..f9ebf00005 100644 --- a/projects/frontend/es-core/src/RecalboxConf.h +++ b/projects/frontend/es-core/src/RecalboxConf.h @@ -318,6 +318,12 @@ class RecalboxConf: public IniFile, public StaticLifeCycleControler