TV emulation: RetroArch setup on the Philips Android TV (ES-DE impossible, 32-bit)
Last updated 05/11/2026 · tv, retroarch, emulation, philips, romm
Why not EmulationStation
- Only maintained ES is ES-DE (es-de.org, v3.5.0 2026-09-30). Android build is paid (Patreon, Samsung Galaxy Store, Huawei AppGallery; not on Google Play) and requires 64-bit Android 10+; Android TV is supported (e.g. Nvidia Shield).
- The 55OLED706 is 32-bit (
armeabi-v7a, nosecondaryCpuAbi, no/system/lib64) → ES-DE cannot run. Classic EmulationStation is desktop-only (Batocera/ROCKNIX/JEOS/RetroPie); no Android APK exists. - Remaining routes if a real ES frontend is ever wanted: dedicated HDMI hardware running Batocera, or streaming from metis (Wolf) to the Moonlight app on the TV — the latter untested and doubtful on AMD Strix Halo (no Linux AMD hardware encoder in Sunshine).
ROM source
- RomM library:
**/zfsdata/apps/romm/library/roms**on handtrixxx.com (~66 GB, 29 system dirs, clean per-file ROM names). Big modern systems (switch 32 GB, pc 8 GB, arcade 2.9 GB) sit there too. /zfsdata/media/games/BIOS_FILES(~1.2 GB, libretro bios pack incl.neogeo.zip,syscard3.pce, MSX ROMs, psx/dreamcast/genesis bios)./zfsdata/media/games/<System>= modern systems only (Xbox, Xbox 360, GC, Switch, Wii, Dreamcast, Saturn, PS2, PSP) - not usable on this TV.- Old
/data/sources/ROMSon metis (61 GB) is GameCube ISOs plus ~190 empty skeleton dirs; GameCube is not viable on this 32-bit MT5895 set.
What is on the TV now (set up 2026-10-27, relocated 2026-10-29)
- Scoped-storage gotcha: RetroArch (Android port) reads everything from its own media folder
**/storage/emulated/0/Android/media/com.retroarch.aarch64/RetroArch/**(playlist_directory,core_assets_directory, saves/states/config/system all point there inAndroid/data/com.retroarch.aarch64/files/retroarch.cfg). ROMs/playlists pushed to the plain/storage/emulated/0/RetroArch/folder are invisible to the app — this was the 2026-10-29 “no games show / can’t add any” bug. Fix applied:mvroms/playlists/bios/saves/states/layouts into the media folder, thensed -i 's|/storage/emulated/0/RetroArch/roms|/storage/emulated/0/Android/media/com.retroarch.aarch64/RetroArch/roms|g' playlists/*.lpl; old folder deleted. Only ONE RetroArch package exists (com.retroarch.aarch64, APK in/data/app) — the “installed twice” impression is just APK on internal vs data on the adopted USB. .../Android/media/com.retroarch.aarch64/RetroArch/roms/<system>/— 24 systems, 4986 ROM files, 11.4 GB: nes 419, snes 484, gb 381, gbc 393, gba 265, megadrive 540, mastersystem 368, gamegear 341, tg16 302, msx 268, arcade 751, neogeo 69, n64 35, atari2600 102, wonderswan 62, atarijaguar 24, dos 98 (nested per-game dirs), megacd 4, turbografx-cd 3, c64 9, sega32x 9, virtualboy 18, capcomplaysystem2 35, capcomplaysystem3 5..../RetroArch/playlists/*.lpl— 24 content playlists (JSON, RetroArch 1.22 format{"version":"1.5", … "items":[…]}), core fields intentionally empty so RetroArch picks the core on first launch; each hasscan_content_dir/scan_file_extsso “Scan directories” can refresh them (and fetch thumbnails)..../RetroArch/system/bios/— neogeo.zip, syscard3.pce, MSX.ROM/MSX2*.ROM.- Cores already installed on TV (split APKs): nes/snes/gb/gba/genesis/smsplus/fbneo/picodrive/mednafen_pce/psx_rearmed/mupen64plus/gambatte/mgba/bluemsx/fmsx/vice_x64/dosbox_pure/potator/mednafen_wswan/mednafen_vb/virtualjaguar/handy/stella/ppsspp/desmume/melondsds/dolphin/cemu + ~40 more.
- Not copied (no usable core on 32-bit): switch, pc, atom (Acorn), gameandwatch, pico.
32-bit core availability (verified 2026-10-27 on buildbot.libretro.com/nightly/android/latest/armeabi-v7a/)
- RetroArch’s core downloader serves
armeabi-v7abuilds, so N64/PSX/PSP cores exist for this TV:mupen64plus_next_gles2+_gles3,pcsx_rearmed,swanstation,mednafen_psx(_hw),ppsspp. No loose.sofiles on/storage/emulated/0— cores live inside the installed APK (com.retroarch.aarch64package name despite the TV being 32-bit). - Practical perf on MT5895 (Cortex-A53 class): PSX good (PCSX ReARMed/SwanStation, occasional frame skipping on heavy titles); N64 partial (simple/2D-ish games OK, heavy 3D titles like Goldeneye/Majora’s poor — use gles2 core + internal resolution down + frameskipping); PSP mostly not (PPSSPP too demanding on 32-bit A53 for 3D games; light 2D titles playable).
- Save-state/savestate dirs:
.../Android/media/com.retroarch.aarch64/RetroArch/{saves,states}.
Per-system test titles (2026-10-27)
- N64:
Super Mario 64.n64(8 MB) already in/storage/emulated/0/RetroArch/roms/n64/. - PSP:
FIFA 12 (Europe).iso(1.29 GB) pushed from/zfsdata/media/games/Sony Playstation Portable/toroms/psp/; playlistSony - PlayStation Portable.lpladded.roms/psx/created empty. - No PSX ROMs anywhere (verified 2026-10-27, incl. metis): RomM library has no
psxdir;/zfsdata/media/games/holds only PSP/PS2 (plus Switch/Wii/GC/Dreamcast/Saturn/Xbox); metis/data/sources/ROMS/(59 GB) is GameCube ISOs + ~190 empty skeleton dirs each holding just asysteminfo.txt(psx included); metis Wolf/ES-DE profile (/data/docker/wolf/data/profile-data/user/WolfES-DE/ES-DE/gamelists) has only agcgamelist; metis ZFS snapshots (data@autosnap_2026-10-2{5,6,7}) contain no*tekken*. Tekken 3 can only be copied once Niklas supplies a dump (.bin/.cue, .chd, .zip). Tekken Advance (GBA) and Tekken 5/6 (PSP ISOs) do exist. - BIOS:
psxonpsp660.bin(524288 B, md5 c53ca590…, the PSP’s PS1 BIOS dump) in.../Android/media/com.retroarch.aarch64/RetroArch/system/bios/. PCSX ReARMed/SwanStation do not need a BIOS (built-in); PPSSPP needs none. /data/maintenance/tv-playlists.py(run on iris, staged ROMs in/home/handtrixxx/tv-roms) now haspsxandpspentries; playlists are named after the libretro database titles (e.g.Nintendo - Nintendo 64.lpl).
USB stick = adopted internal storage, not a second volume
The 1 TB stick plugged into the TV (2026-10-27) was formatted/adopted by the TV itself (dumpsys mount: flags=ADOPTABLE|USB, PRIVATE ext4 volume, nickname “USB-Speichergerät”, mounted at /mnt/expand/51831912-a6cb-4490-a244-f7b3e002aa28) and became the primary /storage/emulated — now ~984 GB with ~963 GB free. There is no separate /storage/<UUID> external volume, so app paths stay /storage/emulated/0/.... If a stick is instead just plugged in unformatted-for-adoption, note the kernel has no exFAT (ext2/3/4, vfat, ntfs, udf, fuse only) and Philips docs say FAT32.
Transfer workflow (iris is the ADB hub)
handtrixxx.com cannot reach the TV (no LAN route); iris can.
rsync -a <system>/ handtrixxx@100.64.0.3:/home/handtrixxx/tv-roms/<system>/ # from handtrixxx.com
ssh iris 'adb connect 192.168.68.62:5555; adb -s 192.168.68.62:5555 push /home/handtrixxx/tv-roms/<system> /storage/emulated/0/Android/media/com.retroarch.aarch64/RetroArch/roms/<system>'
Batch pushes ran at 20-27 MB/s, small dirs ~4-6 MB/s. Staging + full copy took ~20 min.
- Gotcha:
adb push dir targetwheretargetalready exists nests the source inside it (roms/nes/nes/…) - push into a non-existent target, or check afterwards. - Playlist generator:
/data/maintenance/tv-playlists.py(stdlib json, extension allow-list per system; expects staged ROMs in/home/handtrixxx/tv-roms/, run it on iris, then push the generatedplaylists/dir to the TV). - USB debugging must be re-enabled on the TV for any of this (Settings → Device Preferences → About → tap Build 7× → Developer options → USB debugging) and should be turned off afterwards (5555 is open to the LAN).
Source: Wiki.js