Skip to content

Latest commit

 

History

History
1265 lines (1138 loc) · 82.3 KB

File metadata and controls

1265 lines (1138 loc) · 82.3 KB

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[Unreleased] — 3.4.0 (in development, March 2026)

Changed

  • VirtualInputState lifted to tvOSvirtualInputState and core capability helpers (coreSupportsVirtualKeyboard, coreSupportsVirtualMouse) moved to a new cross-platform extension (PVEmulatorViewController+VirtualInputState.swift) with no #if !os(tvOS) guard. EmulatorWrapperView now receives a non-nil virtualInputState on tvOS. Siri Remote keyboard/mouse handlers update isKeyboardVisible / isMouseVisible on activation, and onToggleKeyboard / onToggleMouse closures are wired to new toggleSiriRemoteKeyboard() / toggleSiriRemoteMouse() methods so future tvOS UI can flip input modes through the same typed interface as iOS (#3066, Part of #2575)
  • Virtual Input State Management — Replaced NSNotificationCenter toggle/show/hide notifications (pvToggleVirtualKeyboard, pvShowVirtualMouse, etc.) with a type-safe VirtualInputState ObservableObject injected via SwiftUI's environment. SwiftUI overlay buttons and UIKit OSD buttons now observe @Published properties directly; toggle actions are wired via closures, eliminating runtime selector mismatch risks and ensuring all observers stay in sync regardless of which code path changes overlay visibility (#3061)

Added

  • Screenshot Browser in Pause Menu — New "SCREENSHOTS" button in the CAPTURE section of the pause menu STATES tab opens an inline sheet that lists all captured screenshots for the current game. Each row shows a thumbnail, filename, and share button (UIActivityViewController). Swipe-to-delete removes the file from disk and from the Realm database. An "Auto-Save to Photos" toggle at the top maps to the new saveScreenshotsToPhotoLibrary setting (default on). Screenshots captured with "SAVE SCREENSHOT" now respect this setting rather than always writing to the Photo Library (#pause-menu)
  • Save State Browser in Pause Menu — Replaced the old UIKit save-state flow with an inline SwiftUI sheet that stays within the pause menu stack. Dismissing without loading returns to the pause menu (no stale dismissal). Save states display thumbnail, date/time, relative age, and core name; swipe-to-delete supported. Section headers ("SAVE STATES", "CAPTURE") and a live info row (save count · last saved N ago) added to the STATES tab (#pause-menu)
  • Pause Menu quick-load and distinct load actions — "QUICK LOAD" immediately loads the most recent save state; "BROWSE SAVES" opens the new inline browser. Replaced the duplicate "LOAD STATE"/"SAVE STATES" buttons that previously pointed to the same UIKit screen with properly labeled, distinctly styled actions (#pause-menu)
  • Virtual keyboard opens expanded on user toggle — Toggling the virtual keyboard from the skin overlay button or pause menu now opens it fully expanded. Auto-shown keyboards (cores that require keyboard, DeltaSkin autoShow) still open collapsed to a minimal drag handle to preserve screen space. Swipe-to-collapse gesture scoped to the drag handle only — no longer intercepts key-press touches (#3117)
  • saveScreenshotsToPhotoLibrary setting — New Defaults.Keys.saveScreenshotsToPhotoLibrary (default true) controls whether takeScreenshot() auto-saves to the device Photo Library. Exposed via the "Auto-Save to Photos" toggle in the screenshot browser sheet (#pause-menu)

Fixed

  • Pause Menu CORE tab dimmed for RetroArch cores — The CORE category header was incorrectly dimmed when only CoreOptional (core options) was available. The opacity condition was widened to cover all hasCoreFeatures cases, so RA cores always show the tab at full opacity (#pause-menu)

  • Save-state Realm thread-safety crash (lastOpened)PVEmulatorViewController.loadSaveState(_:) now resolves a live PVSaveState from the same Realm instance before writing lastOpened, avoiding cross-context/frozen-object writes seen in 3.3.0 crash reports.

  • Disabled-core registration/filtering correctness — Core registration now handles PVDisabled consistently with the "Unsupported Cores" setting, fixing the 3.3.0 inverted condition so experimental cores are only exposed when explicitly enabled.

  • Desmume2015 remains experimental-onlyPVDesmume2015 stays behind the Unsupported Cores gate (PVDisabled = true), preserving current policy while reducing unintended exposure from prior disabled-core filtering issues.

  • RetroArch Netplay enabled — Added -DHAVE_NETPLAY compiler flag to BuildFlags.xcconfig, enabling RetroArch's full rollback netplay engine for all 60+ RetroArch-backed cores (NES, SNES, GBA, GB, N64, DS, Genesis, PS1, Dreamcast, Saturn, and more). Netplay accessible via RetroArch in-game menu → Settings → Network → Netplay; relay support via RA.ME built-in. Part of #2483 (#3083)

  • Libretro Cheat DB format detectiongenerate_cheatdb.py now populates a format column in the cheats table using code-string pattern heuristics (GameShark, Game Genie, Action Replay v2, Raw AR/GS v3, etc.). LibretroCheatEntry exposes the new format field; LibretroCheatDatabase reads it with backward-compatibility for old bundles (no format column → nil). CheatDatabaseEntry.deviceFormat is now populated for libretro-sourced cheats, and the iOS/tvOS cheat search UI displays the format badge instead of the generic device name (#3067, Part of #2505)

  • GeckoCodes Cheat Lookup (GameCube/Wii) — New GeckoCodesLookup actor fetches Gecko cheat codes from the RiiConnect24/GeckoCodes database using the ROM disc serial (e.g. RMCE01). Integrated into searchAllCheats automatically when a serial is available. 24h disk+memory cache. (#3069, Part of #2505)

  • GameHacking.org Cheat Lookup — New GameHackingOrgLookup actor scrapes GameHacking.org via a multi-strategy HTML parser (table rows, definition lists, inline patterns). Runs concurrently with the libretro online lookup; results are merged and deduplicated. System slug mapping added via SystemIdentifier.gameHackingOrgSlug. Middleware proxy tracked in #3072. (#3069, Part of #2505)

  • RetroArch Netplay enabled — Added -DHAVE_NETPLAY compiler flag to BuildFlags.xcconfig, enabling RetroArch's full rollback netplay engine for all 60+ RetroArch-backed cores (NES, SNES, GBA, GB, N64, DS, Genesis, PS1, Dreamcast, Saturn, and more). Netplay accessible via RetroArch in-game menu → Network; relay support via RA.ME built-in. Part of #2483 (#3083)

  • Skin Install Deep Linkprovenance://install-skin?url=<encoded-url> downloads and installs a .deltaskin/.manicskin directly from the web. Powers the "Install in Provenance" button on the provenance-emu.com skin catalog (Part of #3097)

  • Atari ST Virtual Keyboard Layout — Added a dedicated atariST keyboard overlay variant with 7 rows covering F1–F10, Help, Undo, Esc, Delete, Insert, Clr/Home, Ctrl, Alt, all cursor keys, and a numeric keypad — matching the physical Atari ST layout. DeltaSkinDefaults now assigns this variant to .atarist game types instead of the generic compact layout (#2822)

  • Save State Conversion Spike — Research spike documents that libretro cores expose no version metadata (opaque blobs), making generic state conversion infeasible. Mednafen-based cores already handle version migration internally. Recommendations and future roadmap documented in docs/save-state-conversion-spike.md (#3078, Part of #2951)

  • Save State Version Mismatch Detection & UX — All save-state launch paths (SceneCoordinator, GameLaunchingViewController, PVEmulatorViewController) now check whether the save state was created with the same core version before loading. A "Load Anyway / Cancel" alert is shown when a mismatch is detected. SaveStateVersionChecker provides the shared helper. createdWithCoreVersion is now propagated through SaveStateRowViewModel, RetroSaveStateItem, and PVPrimitives.SaveState (#3074, #3075, #3076, Part of #2951)

  • Thin libretro frontend (PVThinLibretroFrontend) — New RetroArch-free libretro frontend in PVCoreBridgeRetro that depends only on libretro.h. Loads cores via dlopen/dlsym, handles the full libretro environment callback API (including GLES3 hw-render via IOSurface-backed FBO), and provides all 5 core callbacks without any RetroArch internal headers. Foundation for running libretro buildbot dylibs without the full RetroArch binary. Part of #2624 / #2639

  • Dynamic libretro core scanner (PVDynamicLibretroCoreScanner) — New PVCoreLoader class that scans the app's Frameworks/ directory at runtime for *.libretro.framework and bare .dylib cores not already registered via static plists. Discovered cores are synthesised as EmulatorCoreInfoPlist sub-cores of a PVThinLibretro virtual parent, allowing buildbot dylibs to appear in the core-picker automatically. Includes CoreLoader.mergeDiscoveredLibretroCores(into:) integration point. Guarded by the dynamicLibretroScanner feature flag (off by default; enable via UserDefaults.standard.set(true, forKey: "dynamicLibretroScanner")). Part of #2639 (#3080)

  • dynamicLibretroScanner feature flag — Added PVFeature.dynamicLibretroScanner to PVFeatureFlags (all build types, disabled by default; enable via the PVFeatureFlags debug-override UI or UserDefaults.standard.set(true, forKey: "dynamicLibretroScanner")). Enables zero-config testing of buildbot libretro dylibs placed in Frameworks/ without modifying static plists. (#3080)

  • Missing libretro env callbacks — Added RETRO_ENVIRONMENT_GET_VFS_INTERFACE (45), RETRO_ENVIRONMENT_GET_LED_INTERFACE (46), RETRO_ENVIRONMENT_GET_CURRENT_SOFTWARE_FRAMEBUFFER (40), and RETRO_ENVIRONMENT_GET_MIDI_INTERFACE (48) to PVLibRetroCore.m; all return false (not supported) with descriptive log messages so cores fall back gracefully instead of hitting the unsupported default. Part of #2624

  • LibraryNavigator routing system — New LibraryNavigator (PVUIBase) provides a typed, DRY routing hub for library-level UI actions. Replaces scattered AppState.pendingSearchQuery observations with a LibraryAction enum (.search, .console, .game) observed uniformly by ConsolesWrapperView, RetroMainView, RetroGameLibraryView, and HomeView. Supports provenance://screen/search?q=<query> deep links via AppRoute.search and LibraryRouteProvider (auto-registered at startup). Part of #3056 (#3064)

  • Virtual Input Quick-Toggle Buttons — Keyboard and mouse-cursor toggle buttons now appear directly in the game overlay (both UIKit legacy and SwiftUI default skin) for cores that support virtual keyboard or mouse input (e.g. DOSBox, Doom). Buttons are shown only when the active core reports support, sit in the top-leading HUD corner, and visually indicate active/inactive state (#3057)

  • Delta/Manic Skin File Association — Registered .deltaskin (com.provenance.deltaskin) and .manicskin (com.provenance.manicskin) UTI declarations and document type handlers across all build schemes so Provenance now appears in the iOS "Open with…" sheet when tapping these skin files in Safari or Files (#3058)

  • Wolf3D Dedicated Input Responder — Created PVWolf3DButton enum and PVWolf3DSystemResponderClient protocol with correct ECWolf libretro button constants (run maps to JOYPAD_X/north, strafeOn maps to JOYPAD_Y/west). Added PVWolf3DControllerViewController with Wolf3D-specific button labels (Shoot, Open, Run, Map, Menu). Fixes incorrect button mapping inherited from the generic DOS responder (#3054)

  • Wolf3D BIOS Setup Guidance — Wolf3D system now declares ecwolf.pk3 as a required BIOS file (PVRequiresBIOS = true). When the file is missing, the app shows an in-app alert with the correct BIOS path and a link to the ECWolf download page (#3054)

  • MetricKit Hang Reporting — Passive MXMetricManagerSubscriber added to PVAppDelegate; hang, crash, and CPU-exception diagnostic call stacks are now logged via PVLogging on the next app launch after an event, enabling real-world hang analysis without user action (#3046)

Fixed

  • GeckoCodes system gating — GeckoCodes lookup is now only triggered for valid 6-character alphanumeric disc IDs (GC/Wii format) and when the system identifier is known to be GameCube or Wii, preventing unnecessary network requests for ROMs on unrelated platforms (#3073)

  • Online cheat search robustness — A libretro online lookup failure no longer silently cancels the concurrent GameHacking.org task; each source is now awaited and errors captured independently so partial results are always merged. Libretro lookup is also skipped (rather than throwing) when no system identifier is available, allowing GameHacking.org title-only search to proceed (#3073)

  • HTML cheat parser performanceparseTableCheats now compiles the <td>/<th> regex once before iterating table rows instead of per-row, reducing redundant NSRegularExpression compilation overhead (#3073)

  • Skin Browser: hide "unofficial" system label — Filter chips and skin-card badges in the catalog browser no longer show the legacy unofficial placeholder; corrected entries for Game Gear, Master System, SG-1000, PC Engine, and MAME now display with proper system names after a catalog refresh (Part of #3097)

  • Skin Catalog: VirtualBoy system codeSystemIdentifier.VirtualBoy.skinCatalogSystemCode updated from "vb" to "virtualboy" to match the remote catalog, so browsing skins from a Virtual Boy game now correctly pre-filters the catalog (Part of #3097)

  • Hatari/Atari ST: correct colors and display layout — Removed a TOS ROM byte-patching hack (SPIKE #2823) that wrote the wrong byte order ([0x00, 0x00, 0xFC, 0x00] instead of big-endian [0x00, 0xFC, 0x00, 0x00]) for the TOS load address, corrupting the ROM and causing the pink/magenta startup palette and split/mirrored screen layout. TOS is now copied unmodified. Also corrected hatari.cfg resolution settings (nMaxWidth=832, nMaxHeight=576, bAllowOverscan=FALSE) (#2822, #2823)

  • Hatari/Atari ST: virtual mouse now moves the cursorTouchTrackpadView sends normalized 0–1 coordinates; casting these to int16_t for DOSBox-style window_pos_x/y always yielded 0. Hatari libretro uses RETRO_DEVICE_MOUSE (relative delta), not RETRO_DEVICE_POINTER (absolute window position). Added st_ra_update_mouse_rel() that computes per-event deltas between consecutive normalized positions, scales by 300, and writes to mouse_rel_x/y in the Cocoa input driver. AtariST and non-AtariST mouse paths now branch correctly in PVRetroArchCore+Controls+DOS.m (#2822, #2825)

  • Hatari/Atari ST: keyboard and button routing — Corrected Controls+SystemIdentifier.swift (.AtariST now maps to PVDOSButton.self) and both AtariST routing sites in DeltaSkinInputHandler.swift (from PVA8SystemResponderClient/PVA8Button to PVDOSSystemResponderClient/PVDOSButton) so physical and virtual keyboard presses reach the core (#2822)

  • Reset Game after failed save state load — When loading a save state fails (e.g. PicoDrive 32X after a core update), a "Reset Game / Continue" dialog is now offered. Choosing "Reset Game" calls core.resetEmulation() to attempt to restore a playable state (best effort; may not fully recover all cores) instead of leaving the core in an inconsistent state (#3077, Part of #2951)

  • Siri "Search in App" now populates search fieldhandleSiriSearchActivity sets pendingSearchQuery correctly; LibraryNavigator now bridges AppState.pendingSearchQuery into a .search LibraryAction observed by HomeView, avoiding the @Published willSet race, and ConsolesWrapperView navigates to the Home tab on both cold- and hot-launch so the search results are immediately visible (#3056)

  • Doom/PrBoom Dedicated Input Responder — Added PVDoomButton enum and PVDoomSystemResponderClient protocol (mirroring the Wolf3D pattern) so Doom has its own fully independent input path. PVDoomControllerViewController now uses PVDoomButton exclusively. Removed Doom-specific branching from the generic DOS responder. PVDoomButton.map (SELECT/automap) intentionally does not fire buttonHome so the automap press never accidentally opens the RetroArch menu (#3053)

  • Doom Input Conformance & Fallback RoutingPVRetroArchCoreCore now conforms to PVDoomSystemResponderClient, mapping PVDoomButton events through the DOS bridge; this ensures PVCoreFactory correctly routes Doom sessions to PVDoomControllerViewController instead of silently falling back. Added PVDOSSystemResponderClient fallback paths in PVCoreFactory and DeltaSkinInputHandler for any core that does not yet implement the Doom-specific protocol. Shoulder/trigger buttons in PVDoomControllerViewController are now assigned by OSD label (L/R/L2/R2) rather than iteration order, preventing strafe and weapon-cycle buttons from being silently swapped when the control layout lists R2 before R (#3062)

  • Auto-Save Crash on ReplayKit Recording Start — Fixed a crash where tapping "Record Game" triggered an appWillResignActive event that attempted an auto-save during ReplayKit's setup window. Added an isPreparingRecording flag to PVRecordingManager (set during startRecording()) so appWillResignActive can skip the auto-save. Also added a realm.isInvalidated pre-flight guard in RomDatabase.registerSaveState to prevent an uncatchable ObjC NSException from beginAsyncWriteTransaction (#3051)

  • Virtual Mouse Touch OverlayTouchTrackpadView.hitTest no longer captures touches outside the game display area; fixes inability to tap skin overlay buttons, the pause menu, or any UI element when virtual mouse is active (DOSBox, PrBoom, etc.). Added explicitGameViewRect property updated by applyFrameToGPUView so the correct viewport rect is always used, even before the first skin-repositioning callback (#3052)

  • Library View Main-Thread Blocking — Removed 4 redundant @ObservedResults observers (games, favorites, mostPlayed, recentlyPlayedGames) from ConsoleGamesView that each fired a main-thread callback on every CloudKit write; ConsoleGamesViewModel already serves the same data via a background-queue observer. Also replaced a live Realm console.games.count relationship traversal in titleBar() with the cached allGamesModels.count value (#3046)

  • Controller Skin Browser & Documentation in Settings — Settings → Controller tab now includes a "Skin Browser" row (opens the community skin catalog) and a "Skin Documentation" row (opens the built-in wiki page for skins) (#2975)

  • Keyboard Input for 11 Cores — Physical keyboard (Bluetooth/USB) now forwarded via apple_input_keyboard_event in Dreamcast (Flycast), PSX, SNES, CDi, 3DO, Saturn, N64, ColecoVision, Atari 8-bit, EP128, and MAME RetroArch cores. Atari 8-bit and EP128 set requiresKeyboard = YES as keyboard-primary systems (#2841–#2851, Part of #2425)

  • TGBDual Force Monochromatic Mode — New "Force Monochromatic Mode" console option renders GBC games in greyscale (DMG style) for both player screens via RGB565 luma conversion (#2863, Part of #60)

  • Cheat Code Library — Online search across 1.2M cheat codes from the libretro database covering 44 systems (N64, SNES, PSX, GBA, and more). Enabled via features.json flag. Stale cache detection ensures DB is always fresh on first use (#2618, #2619, #2641, #2642)

  • RetroAchievements — Foundation layer: PVCheevosProtocol + per-core conformance stubs wired into emulator lifecycle (#2722, #2747, #2748)

  • Virtual Keyboard & Mouse — Full QWERTY on-screen overlay with haptics, platform-specific layouts (C64, ZX Spectrum, Amstrad CPC), Siri Remote passthrough on tvOS, and mouse cursor overlay for pointer-based computer cores (#2587–#2595, #2620–#2622)

  • DS Dual-Screen Skins — Phases 1-3: supportsSkins flag, DefaultDeltaSkin dual-screen layout, touch input routing for native DS cores (#2612)

  • Haptics System (Tier 1+2)PVRumbleProtocol in PVPrimitives (platform-agnostic, no GameController/UIKit import); PVHapticsLocality enum; refactored HapticsManager in PVCoreBridge with full rumble(lowFrequency:highFrequency:duration:player:) API; completed EmulatorCoreRumbleDataSource.rumble(player:) implementation; N64 RumblePak (Mupen64Plus) wired to CHHapticEngine via player-aware rumbleForPlayer: dispatch (#2742, #2743)

  • N64 Transfer PakTransferPakSupport protocol enabling Pokémon Stadium and other Transfer Pak games (#2751)

  • Per-Game Core Options — MD5 wired through valueForOption reads; scoped reset helpers (resetOptionsForGame, resetAllOptions) (#2728, #2753, #2757)

  • Quick OSD Controls — Quick Save, Quick Load, and Fast Forward buttons in the on-screen controller overlay (#2626)

  • Screen Recording — Screenshot pipeline milestones 1 & 3; Provenance Plus gated (#2613)

  • SwiftData Models — New Game_Data and related models for Realm → SwiftData migration Phase 1 (#2522)

  • Auto-Pause on Headphone Disconnect — Game pauses automatically when AirPods or Bluetooth headphones disconnect (#2750)

  • FCEU Famicom Mic — Famicom controller microphone support via AVAudioEngine (#2702)

  • Dolphin Options — DSP HLE/Thread, GPU Sync, Fast Disc Speed exposed as user settings; improved JIT detection (#2630)

  • Configurable PSX Region — Default region option for PSX/Mednafen core (#2661)

  • Manual Backup & Restore — Manually back up and restore the full game library (#2662)

  • Controller Guide — In-app controller guide for iOS, tvOS, and on-screen controls (#2527–#2534)

  • Skin Catalog Refresh — Updated skin catalog seed from upstream repository (#2561)

  • Netplay Architecture — Research document and design for native Swift/SwiftUI netplay system (#2544, #2558)

Changed

  • Mednafen: Remove non-functional "Fullscreen" and "Use OpenGL" core options — Both settings had no effect on iOS (no windowing system; Mednafen driver calls were commented out). rendersToOpenGL now correctly returns NO for the software renderer (#3024)
  • Lock modernization in PVLibrary — Replaced all NSLock instances with OSAllocatedUnfairLock (iOS/tvOS 16+), eliminating bare .lock() / .unlock() pairs in favour of deadlock-safe withLock { } closures across GameImporter, DirectoryWatcher, CloudKitRemoteApplyGuard, CloudSyncManager, CloudKitSubscriptionManager, iCloudDriveSync, CloudKitSwiftDataSyncManager, PVSwiftDataSchema, and PVSaveState (Part of #1681, #2807)

Fixed

  • CloudKit/GameImporter Pause During Gameplay — Fixed regressions where CloudKitRomsSyncer, GameImporter, and DirectoryWatcher continued running I/O work during active gameplay. Introduced PausableService protocol with ServiceLifecycleReason enum and BackgroundServiceRegistry for centralized service lifecycle management. All background services (CloudSyncManager, GameImporter, CloudKitDownloadQueue, DirectoryWatcherService) now conform to PausableService and self-register, so callers use a single BackgroundServiceRegistry.shared.pauseAll(reason: .emulation) instead of reaching out to each singleton. Reason-based tracking prevents one caller's resume from undoing another caller's pause. setupSaveStateObserver skips enqueueing uploads while emulation is active; performMetadataBootstrap exits early when paused; syncer-owned workQueues are suspended alongside manager queues. (#3014)
  • Cheat Sheet Crash on Open — Fixed crash when opening the cheat sheet from the RetroMenuView pause menu. recoverCheatCodes() was calling @ThreadSafe on an unmanaged Realm object returned by asRealm(); ThreadSafeReference requires a managed object and would fire a fatal error immediately. Replaced with a synchronous realm.write on the main actor. Also added a nil guard for game in showCheatsMenu() to prevent force-unwrap crashes (#3042)
  • Doom Face Button 1 (Shoot) Fix — Corrected the PrBoom/RetroArch button mapping so face button 1 fires/shoots (JOYPAD_B via buttonA south) instead of silently triggering the unmapped strafe action; face button 2 correctly triggers Use/Interact (JOYPAD_A via buttonB east). On-screen button labels updated: "1"→"Shoot", "2"→"Use", "Start"→"Map" (select/automap), "Reset"→"Pause" (#3043)
  • ReplayKit Record-Game Crash — Fixed an immediate crash when tapping "Record Game" in the pause menu. The withCheckedThrowingContinuation closure passed to RPScreenRecorder.startRecording/stopRecording is @Sendable/non-isolated in Swift's concurrency model; on iOS 17+ the runtime may schedule it off the main actor, violating ReplayKit's main-thread requirement and crashing. Both calls are now explicitly dispatched via DispatchQueue.main.async inside the continuation body, ensuring the handler always fires on the main queue (#3025)
  • Overlay Quick-Action Buttons — Fast-forward, quick-save, and quick-load buttons in the legacy UIKit controller overlay are now always tappable, correctly alpha-matched, and no longer obscured by game-control views. Root causes: indicator overlay had no hit-test passthrough so it swallowed all touches in empty areas; quickActionsContainer was never brought to front after setupTouchControls() stacked game controls on top of it; and controller-opacity was incorrectly applied to quick-action buttons. Also fixed an operator-precedence bug in adjustDPadPosition that pushed the D-Pad off-screen on every layout pass. (#3018)
  • JIT Status Indicator Popover — Tapping the JIT status indicator in the emulator HUD now shows a compact .popover instead of an inline expanding banner that overlapped game content (#3020)
  • GameMoreInfoView Glass Borders — Suppressed unwanted liquid glass borders on the DONE, Play, and web-reference toolbar buttons in GameMoreInfoView on iOS/tvOS 26+. Custom stroke borders and glow shadows are now conditionally skipped via legacyStrokeBorder/legacyGlowShadow helpers so the system provides its own glass treatment without visual doubling (#3017)
  • Wiki Viewer — GitBook tag and HTML rendering — GitBook liquid tab tags ({% tabs %}, {% tab title="..." %}, {% endtab %}, {% endtabs %}) now render as Markdown section headers and separators instead of raw strings. HTML <table>, <strong>, <em>, <details>/<summary>, and <br> blocks are converted to their Markdown equivalents before rendering. External links in wiki content open in an in-app Safari sheet; internal .md links navigate to the corresponding local wiki page (#3013)
  • Springboard Quick Actions — Long-pressing the Provenance app icon now correctly shows recently-played games and favorites again; fixed by ensuring UIApplication.shared.shortcutItems is always updated on the main thread via MainScheduler.instance (#3026)
  • Browse Skins Done Button — Moved the "Done" dismiss button in the Browse Skins sheet from the trailing (right) toolbar position to the leading (left) position (#3011)
  • Settings Help Button Opens Internal Wiki — The always-visible HELP button in the Settings header now opens the in-app WikiHelpView sheet instead of launching an external URL in Safari (#3028)
  • Skin Catalog Selection Update — Downloading and selecting a skin from the catalog now reactively updates the active skin shown in the pause menu Skins tab (#3012)
  • Siri/Spotlight Save State Thumbnails — Save states launched from Siri or Spotlight now display their screenshot thumbnail (falling back to game artwork) instead of appearing without artwork in search results (#3023)
  • Skin Catalog System Pre-filter — Opening the skin downloader from the pause menu now pre-selects the active game's system so only relevant skins are shown; the filter bar is revealed automatically (#3010)
  • Empty Library Flash on LaunchHomeView no longer flashes the "Your library is empty" / cloud sync upsell state before async Realm queries complete; the empty state is now gated on bootupStateManager.isBootupCompleted (#3016)
  • DOS-style FPS Touch Controls — Doom, Wolf3D, Quake, and Quake II now reuse the DOS controller overlay path so their UIKit touch controls honor run/strafe/weapon mappings, and Quake-family default layouts now expose shoulder + Run buttons like Doom (#3001)
  • Import Queue Glass Borders — Removed unwanted iOS/tvOS 26 liquid glass interference on custom-themed import queue rows and buttons. The gradient strokeBorder is now drawn as a top-level .overlay() rather than nested inside a .background(), ensuring retro borders remain visible above any system glass material. The "Select System" button uses a solid tinted background to prevent double-border artifacts (#2981)
  • PVGME Boot Crash — Removed erroneously copy-pasted PVDOSSystemResponderClient conformance from PVGMECore; force-casting the bridge to a DOS responder it doesn't implement caused an immediate crash on boot (#2977)
  • DS/3DS Skin Support DisabledsupportsSkins set to false in melonDS and Desmume2015 cores to prevent broken display when users select skins with no dual-screen layout (#2973)
  • Cheat Search Crash on First Add — Removed unsafe @ThreadSafe game fallback inside realm.write; game is now looked up strictly from the current Realm instance to prevent cross-Realm relationship crash. Added guard for empty MD5 hash to surface the error cleanly instead of crashing (#2966)
  • Controller Skin "Default" Revert — Selecting "Default" in the skin picker now correctly clears the skin for all orientations (portrait + landscape) instead of only the currently-visible tab; fixes cases where the third-party skin remained active after reverting. The Default option is now always visible even when no third-party skins are installed. (#2972)
  • Library/Gameplay Hangs (Deadlock) — Fixed three lock-safety regressions introduced by the NSLockOSAllocatedUnfairLock refactor (#2887) that caused random UI and gameplay freezes (#2982):
    1. RealmSaveStateDriver.convertRealmResultsSync was calling PVFile.size (file I/O + realm.write) inside cacheLock.withLock, causing priority inversion on the unfair spin-lock.
    2. RealmSaveStateDriver.updateSaveStates cancelled currentConversionTask outside taskLock, creating a TSan data race with concurrent callers.
    3. PVGPUViewController.timeSinceLastDraw / calculatedFramesPerSecond called super.* (GLKit) inside frameTimestampsLock.withLock, risking lock-order inversion with GLKit internals.
  • No-ROMs Empty State FlickerNoConsolesView and the per-console cloudSyncUpsell are now guarded by bootupStateManager.isBootupCompleted, preventing a jarring flash of the "No Games Found" empty state while the library is still loading on launch (#2976)
  • Siri "Search in App" Handoff — Tapping "Search in App" from a Siri or Spotlight search result now opens the app and pre-populates the search field with the query; fixed by handling CSQueryContinuationActionType in both the SwiftUI lifecycle and UIKit delegate, routing the CSSearchQueryString through AppState.pendingSearchQuery to HomeView (#2979). Follow-up: HomeView.onAppear now also consumes any already-set pendingSearchQuery so cold-launch Siri handoffs (where the query is set before the view subscribes) correctly populate the search field (#3021)
  • Siri/Spotlight — Games Not Surfacing — Fixed four bugs causing only save states (not games) to appear when searching in Siri/Spotlight: (1) IndexRequestHandler.getGames(withIdentifiers:) now extracts the MD5 from the full org.provenance-emu.game.<MD5> URI before querying Realm (previously comparing the full URI against the md5Hash field, never matching); (2) PVGame.spotlightContentSet migrated from the deprecated itemContentType: initializer to contentType: .data and now sets displayName in addition to title; (3) SpotlightHelper.reindexAllSaveStates() now sets title on save-state attribute sets (was only setting displayName, which Spotlight ignores for matching); (4) All main-app Info.plist files now declare org.provenance-emu.game-search and com.provenance-emu.provenance.openMD5 in NSUserActivityTypes so OS-level NSUserActivity donations from gameplay are eligible for Siri search (#2980)
  • Clear Artwork Cache SF Symbol — Replace photo.badge.minus (iOS 18+) with photo.badge.xmark (iOS 16+) so the icon renders on iOS 17 devices (#2971)
  • Doom Controls — Added missing critical input mappings for Doom (PrBoom via RetroArch): Strafe Left (L), Strafe Right (R), Weapon Prev (L2), Weapon Next (R2), and Run. Also added these buttons to the Doom on-screen control layout so they appear in the default skin. Fire and Use were already mapped; strafe, run, and weapon cycling now work correctly on touch and hardware controllers (#2974)
  • Boot Hang on "Loading game library"initializeLibrary() in AppState now wraps GameImporter.initSystems() (45 s) and RomDatabase.reloadCache() (30 s) in individual timeouts so a stalled task transitions to an error state instead of hanging forever. BootstrapOrchestrator gains a configurable per-task timeout (default 30 s) using the same pattern, preventing any stalled side-service task from blocking the wave scheduler (#2965)
  • Boot Screen Fake ProgressRetroProgressBar now accepts a real progress: Double value and smoothly animates to it; the bouncing fake animation is retained only when no real value is supplied. BootupViewRetroWave passes AppBootupState.stateProgress (derived from the current boot stage) and displays the active task name instead of blinking state text. AppBootupState gains stateProgress, currentTaskName, and updateTaskProgress(_:fraction:) for fine-grained sub-step reporting (#2965)
  • Missing "Scanning games…" StateinitializeLibrary() now correctly transitions to .initializingLibrary at entry, so the boot screen shows "Scanning games…" during the library scan phase rather than staying on "Loading game library…" (#2965)
  • Settings Systems Navigation — "Systems" in Settings now pushes as a navigation link (with back button) instead of presenting as a dismissable sheet (#2970)
  • Siri/Spotlight Save State Thumbnail — Save state Spotlight entries now include the screenshot thumbnail image in search results (#2978)
  • Siri/Spotlight Save State Launch — Tapping a save state result in Siri/Spotlight now correctly boots and resumes that specific save state instead of starting the game from scratch (#2978)
  • Controller Skin Toolbar Animation — Toolbar items in SystemSkinBrowserView and SkinCatalogBrowserView no longer animate their coordinates during view transitions on iOS/tvOS 26 (liquid glass); fixed by consolidating toolbar blocks and suppressing layout animations via .transaction { $0.animation = nil } (#2967)
  • Skin Catalog from Pause Menu — Added "BROWSE CATALOG" button to the Skins tab in the pause menu (RetroMenuView), allowing direct access to the skin catalog without exiting to Settings (#2967)
  • PVVecX Hardware Rendering Blank Screen — Fixed enumeration option accessors in VecxOptions returning integer indices instead of the expected label strings. vecx_use_hw now returns "Hardware"/"Software" (not "0"/"1"), enabling the C libretro core to activate its GL rendering path; vecx_res_hw now returns the resolution string (e.g. "824x1024") so WIDTH/HEIGHT are parsed correctly; scale/shift options now return float strings for correct viewport math (#2984)
  • PVDisabled/PVAppStoreDisabled Core Filtering — Fixed inverted core registration logic that caused PVDisabled cores to be silently skipped when "Enable Unsupported Cores" was ON (and incorrectly registered when OFF). Also fixed PVAppStoreDisabled filtering across all UI layers so these cores are now hard-hidden in App Store builds regardless of the "unsupported cores" setting, matching the documented intent (#2962)
  • CrabEMU Input Map (SMS/GG/SG-1000)MasterSystemMap[] array reordered to match PVMasterSystemButton/PVSG1000Button enum raw values (b=0, c=1, start=2, up=3, down=4, left=5, right=6); previously the d-pad Up press sent SMS_RIGHT (index mismatch), making all directional and face-button inputs incorrect for Master System, Game Gear, and SG-1000 games (#2983)
  • HUD Touch Blocking — Quick-action buttons (Fast Forward, Quick Save, Quick Load) now use a pass-through container view; touches in the dead-zone around the buttons are forwarded to the game instead of being consumed by the overlay (#2964)
  • JIT Indicator on Non-JIT Cores — JIT status indicator only appears for cores that actually require JIT (Dolphin/GameCube/Wii); all other cores skip the overlay entirely (#2964)
  • Menu Toggle Button Placement — Toggle button now anchors to the safe area (avoids home indicator on modern iPhones), is always visible even when a hardware controller is connected, and is always rendered at the highest z-order (#2964)
  • Pause Menu Button StylingmenuButton() and menuToggleRow() in RetroMenuView now use per-button semantic retrowave accent colors (green/orange/blue/purple/pink/cyan/yellow) with neon icon glow, matching the AudioVisualizerButton reference style. "CHEAT CODES" is always rendered at position 4 (dimmed when not supported) so the QUIT button stays at a fixed position, improving muscle-memory navigation (#2969)
  • Pause Menu Tab Bar Lock-up — Category tab scroll bar in the pause menu intermittently stopped responding to taps; fixed by replacing @State + manual DispatchQueue.asyncAfter reset with @GestureState, ensuring the drag flag is always cleared even when a gesture is cancelled mid-render (#2968)
  • Recording: Game Unpauses Behind Preview Sheet — Stopping a screen recording via the pause menu used to resume emulation before the ReplayKit preview sheet appeared; the game now stays paused while the preview is visible and resumes automatically when the sheet is dismissed (#2968)
  • Recording: Stuck ReplayKit Sheet — ReplayKit preview sheet sometimes had untappable buttons after stopping a recording; resolved by sequencing the menu dismissal before sheet presentation so no competing UI layers block interaction (#2968)
  • Virtual Mouse Overlay Touch StealingTouchTrackpadView.hitTest now only captures touches within the GPU/game-screen viewport; touches on controller-skin buttons, the virtual keyboard, or any other overlay outside the game display area pass through correctly. Replaces the broken sibling-iteration approach (#2963, Part of #2575)
  • Virtual Keyboard Renders Behind Skin ButtonsviewDidLayoutSubviews now calls bringVirtualInputOverlaysToFront() after re-stacking the skin container, keeping the keyboard, trackpad, and cursor overlay above skin buttons on every layout pass (#2963, Part of #2575)
  • Virtual Keyboard Boots Expanded — Keyboard overlay now defaults to isCollapsed = true; a tappable drag-handle toggles expand/collapse. Swipe-down collapses instead of dismissing; the X button remains the only way to fully close the overlay (#2963, Part of #2575)
  • RetroArch Mouse Overlay Shown for Non-Mouse CoresgameSupportsMouse / requiresMouse in PVRetroArchCoreCore now gate on systemIdentifier before delegating to the ObjC bridge, preventing the virtual-mouse overlay from appearing for CPS1, MAME, and other non-mouse RetroArch systems (#2963, Part of #2575)
  • RetroArch Virtual Input Capability DetectionPVRetroArchCoreCore now resolves keyboard/mouse support from the loaded systemIdentifier, with conservative coreIdentifier fallback when RetroArch is still in its generic session bucket. This prevents false-positive mouse overlays on CPS1/MAME-style cores without regressing keyboard/mouse support for RetroArch computer and keyboard-capable systems (#2963, Part of #2575)
  • PVVecX Hardware Rendering Blank Screen — Fixed enumeration option accessors in VecxOptions returning integer indices instead of the expected label strings. vecx_use_hw now returns "Hardware"/"Software" (not "0"/"1"), enabling the C libretro core to activate its GL rendering path; vecx_res_hw now returns the resolution string (e.g. "824x1024") so WIDTH/HEIGHT are parsed correctly; scale/shift options now return float strings for correct viewport math (#2984)
  • PVDisabled/PVAppStoreDisabled Core Filtering — Fixed inverted core registration logic that caused PVDisabled cores to be silently skipped when "Enable Unsupported Cores" was ON (and incorrectly registered when OFF). Also fixed PVAppStoreDisabled filtering across all UI layers so these cores are now hard-hidden in App Store builds regardless of the "unsupported cores" setting, matching the documented intent (#2962)
  • Cheats & MultiDisc Pause LeakonDone closures in Cheats (tvOS + iOS) and error/cancel handlers in the disc-swap menu no longer call setPauseEmulation(false) or isShowingMenu = false directly, preventing the emulator from unpausing while the pause menu is still visible (Part of #2909)
  • Virtual Mouse Cursor Z-Order — Mouse cursor overlay now stays above the emulator surface and all other layers by calling bringSubviewToFront after insertion (#2925, Part of #2575)
  • Virtual Keyboard Z-Order — Keyboard overlay now renders above skin controller buttons; bringSubviewToFront called on show and after every skin change (#2926, Part of #2575)
  • TouchTrackpadView Touch StealingTouchTrackpadView now yields to interactive sibling views (e.g. controller skin buttons) via hitTest override, preventing it from blocking on-screen button presses (#2924, Part of #2575)
  • RetroArch gameSupportsMouse Force-Cast — Replaced as! with safe as? casting in PVRetroArchCoreCore DOS extension; non-DOS cores now correctly return false for gameSupportsMouse/gameSupportsKeyboard instead of crashing (#2927, Part of #2575)
  • UTType.bios IdentifierUTType.bios and UTI.bios now use the dedicated com.provenance.bios identifier (previously shared com.provenance.rom); added com.provenance.bios exported type declaration to all 7 app Info.plist files (#2864 follow-up)
  • Script Permissions — UTI generator scripts (gen_uti.swift, generate_uti_declarations.py) marked executable
  • Controller Profile Scope ResolutionSceneCoordinator.loadControllerProfiles now passes coreIdentifier to loadActiveProfile, enabling game+core and system+core profile scopes to match correctly at game launch (#2879 follow-up)
  • RarExtractor Path Traversal — Sanitize entry filenames in RAR archives to prevent ../ path traversal outside the destination directory (Part of #2663)
  • CRC Lookup Error LoggingPVLookup.searchROM(byCRC:) now logs database errors via ELOG instead of silently swallowing them with try? (Part of #2663)
  • XZExtractor Memory Warning — Log a warning when extracting XZ archives larger than 200 MB, since the entire file is loaded into memory (Part of #2663)
  • PVCoreLoader Deadlock Risk — Replaced NSLock with OSAllocatedUnfairLock in CoreLoader and LibretroMetadataReader; all bare .lock()/.unlock() pairs replaced with .withLock { } closures, eliminating the early-return deadlock path in getCorePlists (#2809)
  • Cheat System Name Mismatches — Added libretroCheatSystemName mappings for MSX, MAME, ZX Spectrum, Atari 8-bit, and others; title tag stripping for region codes (#2617)
  • Cheat DB MD5 Detection — Detects MD5 data presence (not just column existence) to correctly disable MD5-based lookup when DB was built without --dat-dir (#2641)
  • Cheats Not Showing — Feature flag cheatsOnlineLookup now enabled; stale cached DB re-extracted when bundle zip is newer (#2619, #2618)
  • Cheat Code Persistence — Fixed codeType field separator, SwiftData model alignment, and file path for saved cheats (#2597)
  • MelonDS Color Issues — Fixed display color calibration in MelonDS core (#2557)
  • DosBox Graphics — Graphics glitch resolved in native DosBox core (#2559)
  • GLideN64 Texture Path — Corrected hi-res texture pack path for Mupen64Plus (#2708)
  • m3u Import — Associated disc files now moved to system dir when importing m3u (#2660)
  • Skin Browser Device Filter — Fixed device filter returning 0 results (#2603)
  • D-pad Diagonal Tokens — Resolved D-pad diagonal tokens from directional mapping (#2640)
  • iPadOS 26 Search Bar — Fixed search bar placement regression (#2613)
  • Settings Menu Delegate — Added fallback notifications when menuDelegate is nil (#2749)
  • App Group Container Check — Simplified check for readable app group container (#2623)
  • Crash-Save SafetyuncaughtExceptionHandler now calls stopEmulation() synchronously (removes the Task.detached { @MainActor } that would never execute during crash recovery); save-state screenshot writes use .atomic option to prevent partial/corrupt files (#2766)

Changed

  • Save-State Persistence Abstraction — Extracted Realm write for save states into SaveStatePersistenceServiceProtocol / RomDatabase conformance; createNewSaveState now calls the abstracted service rather than Realm directly, preparing for SwiftData backend swap in #2510 without touching PVUI call sites (#2888)
  • Cheats UI — Moved Cheat Codes to main tab in pause menu for faster access (#2608)
  • Lock Patterns — Converted bare NSLock.lock()/unlock() to withLock throughout audio engines and emulator VC (#2688, #2750)
  • Lock Patterns (PVUI GPU/Metal/SaveState) — Replaced all NSLock bare pairs and objc_sync_enter/exit in PVGPUViewController, PVMetalViewController, PVGLViewController, and RealmSaveStateDriver with OSAllocatedUnfairLock + withLock {}. Eliminates deadlock risk from bare lock/unlock; removes ObjC runtime sync overhead on render threads (#2808, Part of #1681)
  • Library Management UX — Reworked library management settings labels and architecture (#2706)
  • WhatsNew — Moved release notes from hardcoded Swift to whats-new.json metadata file; agents can add new releases by editing JSON only

CI / Infrastructure

  • Selective IPA Builds — PR builds only for external contributors or opt-in via build-ipa label / /build comment; develop push always builds alpha release
  • AI Review Cycle Fix — Fixed silent review gap: GITHUB_TOKEN pushes don't fire pull_request events; claude-code.yml now explicitly dispatches ai-review.yml after fix and rebase cycles
  • GitHub Issue Relationships — Agent instructions updated to wire sub-issues and blocked-by relationships via API when creating epics and sub-tasks

[3.0.6] - 2025-03-16

Special thanks to all contributors and testers who helped make this release possible.

Added

  • Core Options Menu for RetroArch cores
  • Enhanced search functionality with auto-hiding search bars
  • Improved disc selection menu for multi-disc games
  • Support for custom textures in 3DS games
  • RAR archive support in file enumeration

Improved

  • Major 3DS performance optimizations:
    • NEON-optimized shader interpreter
    • Enhanced Vulkan rendering pipeline
    • Audio processing improvements with NEON optimizations
    • Camera, gyro, and microphone support
    • Async presentation for smoother gameplay
  • Updated Mednafen to version 1.32.1
  • Improved RetroArch cores with better Vulkan support
  • Enhanced continues section with optimized paging
  • Threaded rendering and realtime improvements
  • Fixed CPU deadlock issues

Fixed

  • Fixed search functionality in Home and Console views
  • Fixed tvOS build issues
  • Resolved logging issues
  • Fixed immediate import on conflict resolution
  • Various crash fixes and stability improvements

[3.0.5] - 2025-03-11

Special thanks to @mrjschulte, @yippeeeyay, and @pabloarista for their contributions to this release.

Added

  • Core Options Menu for RetroArch cores
  • Custom textures support for 3DS games
  • Onscreen controls toggle button
  • RetroArch support for FFMPEG, CoreMIDI, CoreLocation, and AVFoundation camera drivers
  • Support for additional systems: CPS1, CPS2, CPS3, Doom, Quake, Quake2
  • Additional RetroArch cores: melondsds, desmume, mesen, mesen-s
  • ROM deletion confirmation dialog
  • Contributors list in settings

Improved

  • Metal performance optimizations
  • Realm threading and performance
  • Artwork loading and caching system
  • Save state management and performance
  • SwiftUI components with reduced redraws
  • Native scale enabled by default
  • Continues section with optimized paging
  • Threaded rendering for better performance
  • Marquee text animation and performance
  • Protocol-oriented refactoring of EmulatorVC

Fixed

  • Fixed tvOS build issues
  • Fixed crash in core close operations
  • Fixed save state loading and renaming
  • Fixed threading crashes in PVFile MD5 cache
  • Fixed Metal shader issues (megaTron, ulTron)
  • Fixed rotation misalignment in Metal view controller
  • Fixed Atari core MFi controllers without L3/R3 buttons
  • Fixed multi-disc/track file deletion
  • Fixed artwork search and database lookups for various systems

[3.0.4] - 2025-02-08

Special thanks to all contributors and testers who helped make this release possible.

Added

  • Core Options Menu for RetroArch cores
  • Audio switch monitoring
  • Protocol-oriented refactoring of EmulatorVC
  • Additional UTI types for ROMs

Improved

  • Game cells alignment by title
  • Improved threading for database operations
  • Refactored emulator state into observed actor
  • Parallelized bootup of PVSystems for faster startup

Fixed

  • Fixed crash in core close operations
  • Fixed Metal shader issues (megaTron, ulTron)
  • Fixed rotation misalignment in Metal view controller
  • Fixed nil texture crash in PVMetalVC
  • Fixed tvOS WebServer UX flow
  • Fixed artwork search for various systems

[3.0.3] - 2025-01-23

Added

  • Added Crashalytics for better crash reporting
  • Added support for ZIP format BIOS files
  • Added system name display on custom selection screen

Improved

  • Improved Metal rendering for various cores
  • Improved EmuThree settings and options
  • Updated core loading system to use plists
  • Improved BIOS directory handling and caching

Fixed

  • Fixed Intellivision button layout
  • Fixed Vectrex rendering options
  • Fixed Metal color rendering for Jaguar and other systems
  • Fixed missing Molten framework for Catalyst builds
  • Removed broken Opera core from build
  • Fixed various core configuration issues

[3.0.2] - 2025-01-16

Added

  • Added Sentry crash reporting SDK
  • Added BIOS scanner with support for subdirectories
  • Added Discord and Twitter links in App Store version

Improved

  • Improved EmuThree core options with better restart handling
  • Improved settings UI navigation style
  • Enhanced BIOS scanning and UI for force scanning

Fixed

  • Fixed bootup locking from cache async calls
  • Fixed potential TopShelf crash
  • Fixed potential nil crash on boot
  • Fixed SystemPlist entry for NeoGeo.zip
  • Fixed Saturn controls using RetroArch controls
  • Updated Jaguar core for buttons 1-8
  • Fixed PVFile crash on duplicate write

[3.0.1] - 2025-01-07

Added

  • Added WhatsNewKit for displaying new features
  • Added PVJit module to fix missing module issues

Improved

  • Improved EmuThree core options and settings
  • Improved theme system with better UI updates
  • Enhanced navigation bar theming
  • Improved RetroArch configuration paths on tvOS

Fixed

  • Fixed crash in save state menu
  • Fixed theme changes not updating navigation bar
  • Fixed Realm bootup crash on iOS 16
  • Fixed tvOS build issues
  • Fixed potential crash in PVFile size caching
  • Fixed Vectrex compilation without GLES
  • Fixed RetroArch config paths on tvOS
  • Fixed controller issues with Atari 5200 and Nintendo 64

[2.2.0] - 2022-12-02

Super special thanks to @Carter1190 @dnicolson @ianclawson @mrjschulte @stuartcarnie for providing pull requests. Special thanks for all the Patreon and Discord members that provided testing feedback and support.

Added

  • Light/Dark theme
  • tvOS artwork options
  • Saturn Core options
  • Option for onscreen joystick with keyboard on/off, or never.
  • add build.yml for github actions
  • stella: joystick deadzone

Fixed

  • tvOS various layout, styling improvements
  • fixes #1915 joystick layout busted
  • BoxArt fix nil crash
  • add sfc extension
  • Catalyst, fix crash on game load
  • catalyst: remove broken bliss
  • fixes #1973 incorrect paths in xcworkspace
  • fixes #1991 Fixes mupen plugin paths
  • fixes #1997 update ios launch storyboard
  • fixes #2010 remove unused codesign settings
  • disable broken contributors.yml
  • fix various tvos targets with wrong target platfrm
  • fixes #1814 Use documents for image cache
  • Fixes #1814, lib deletion and icloud fixes
  • fixes #1986 adds ways to press start in SS
  • fixes #1986 Saturn start MFi, I think.
  • fixes #2019 Mednafen SNES A/B swap
  • fixes #2026 joyPad move works, clear BG
  • fixes #2027 importer double run and deleting
  • fix archive step
  • fix artwork download
  • stella: don't crash on 2nd load
  • stella: updated and cheats,save support
  • closes #1765 map dualsense home to pause on saturn
  • closes #1765 map dualsense home to pause on saturn
  • closes #1888 fix n64 scaling
  • closes #1903 tvos build broken
  • conflicts manager add delete option

Updated

  • Min target iOS 13 all around
  • More localised strings and xib's
  • SwiftUI additions and fixes

PRs

  • Merge branch 'feature/dos-box' into develop
  • Merge branch 'remove-unneeded-styling' into develop
  • Merge branch 'remove-unneeded-table-generics' into develop
  • Merge pull request #1919 from Provenance-Emu/feature/dos-box
  • Merge pull request #1995 from dnicolson/style-fixes
  • Merge pull request #2006 from Provenance-Emu/pullrequests/dnicolson/general-cleanup
  • Merge pull request #2015 from dnicolson/fix-constraint-warnings
  • Merge pull request #2016 from dnicolson/use-tvalertcontroller
  • Merge pull request #2017 from dnicolson/remove-unneeded-styling
  • Merge pull request #2018 from dnicolson/use-system-background-for-settings
  • Merge pull request #2025 from Provenance-Emu/largeGameArt-Support
  • Merge pull request #2028 from dnicolson/add-light-theme
  • Merge pull request #2029 from Provenance-Emu/tvOS-GameInfo-Tweaks
  • Merge pull request #2030 from Provenance-Emu/feature/JoystickFixes
  • Merge pull request #2033 from dnicolson/fix-library-bottom-separators
  • Merge pull request #2036 from Provenance-Emu/feature/gh_build_action
  • Merge pull request #2038 from Provenance-Emu/mrjschulte_section_header_fix_tvOS

GitLog

  • Add theme switcher
  • Add ThemeOptions enum
  • Adjust cell height as needed
  • AppDelegate refactor code, improve URL open
  • AppDelegate start of save open
  • azure 14.1
  • azure pipeline macos-12
  • azure turn off xcode pretty
  • azure update to newer xcode/macos
  • cdx4 fix submodule
  • cicd remove UIBrackgroundModes processing
  • citra: combine platforms
  • core 4do updates to fix tvos
  • cores framework don't embed
  • cores table view, hide unsupported cores unless on
  • Cores, add .core.name to ones that didn't
  • cxd4 fix submodule bs
  • delete dup schemes, new shaders, blissemu framewk
  • delete old tvos schemes and rename others
  • desmume2015 readd and fix debug
  • duckstation: fix some build stuff
  • entitlements remove ones that break xc cloud
  • Extend navigation bar
  • Extensions placeholders for new ones
  • fastlane update
  • Fix 4do build and almost works, bad gfx freedo
  • Fix and update Marketing Version 2.1.2
  • Fix button height constraint warning
  • fix catalyst builds
  • Fix cell background color
  • Fix cell font sizes
  • Fix controller selection table cell focus
  • Fix entitlement paths for 2 extions
  • Fix extensions in build
  • Fix iCade controller cell background
  • Fix iCloud, Spotlight entitlement, re-import path
  • fix ios/tvos build
  • Fix library options cell background color
  • Fix logs crash
  • fix macos/catalyst build and export
  • Fix navigation bar tint color
  • Fix PVFile iCloud paths incorrect
  • Fix slider cell text alignment
  • fix some warnings and self capture
  • Fix stack spacing constraint warning
  • fix submodules
  • Fix SwiftUI crash on iOS 16
  • fix tvos availability
  • Fix tvOS build
  • flycast builds
  • flycast, fbneo, dolphin fix some build stuff
  • Frameworks combined into single multi-platform!
  • fuse fix some build stuff
  • game view cell, hide delete text on start
  • GameLibVC fix potential crash
  • gba remove driverkit
  • gcdweb fix QOS
  • genesis: reflector2static libs, submodule 4 upstrm
  • gh action fix xcodebuild command
  • gh action macos-12
  • git insists on touching these submodules
  • github action build test
  • GitHub actions disable broken ones
  • gitignore .xcarchive
  • Hide unsupported cores from conflicts unless on
  • iCloud containers fix thread issue/warning
  • icloud sync catch exception
  • Improve how theme is set
  • Info.plist add ITSAppUsesNonExemptEncryption
  • Info.plist fix xcode cloud issues
  • Install the CodeSee workflow. Learn more at https://docs.codesee.io
  • intellivision respond protocol fixes
  • ios fix gliden compile
  • iOS settings menu replace (i) with >
  • jaguar: core update video fixes
  • Launch screen add brazil locale
  • libretro build flags update
  • Make web server alerts consistent
  • mednafen fix targeted device families
  • mednafen refactor controls to catagory
  • mednafen: refactor compiler flags to xcconfig
  • mednafen: remove broken options,controller reorder
  • melon DLOG for nslog
  • melonds build flags update
  • MetalVC minor catalyst chagnes
  • mu fixed embedded framework
  • mupen audio on/off callbacks
  • mupen speed option
  • mupen: fix crash on load
  • mupen: hi res off by default, fix catalyst
  • n64 controller fix warning
  • obscure cores various build fixes
  • On screen controller adjustments
  • option lcd filter
  • Patreon features
  • pcsx reamred builds
  • pcsx submodule
  • pcsx, fix submodule again
  • PCSXRearmed added to build
  • play: builds with gfx and audio callbacks
  • play: fix build
  • play: fix release build
  • Prevent bottom separators from disappearing
  • project remove nil file
  • ps2: add bios info
  • PVGenesis -Os
  • PVLIBRARY fix copy/embed
  • PVLogVC fix tvOS color error
  • Reduce width of log buttons
  • Remove Bliss, its breaking CI
  • remove broken cores from build
  • Remove cancel action from alert
  • Remove cell background color
  • remove duckstation from build
  • Remove forced dark interface style
  • Remove iOS 11 conditional
  • Remove iOS 13 conditionals
  • remove old vibrate for xccloud
  • Remove PVRadioOptionRow and PVRadioOptionCell
  • Remove red cell background
  • Remove redundant style
  • Remove SettingsTableView class
  • Remove styles in favor of defaults
  • Remove SystemSettingsCell
  • Remove SystemSettingsHeaderCell
  • Remove unimplimented extensions from app target
  • Remove unneeded code
  • Remove unneeded guard clause
  • Remove unneeded ifdef
  • Remove unneeded QuickTableView generics (#2031)
  • Remove unneeded section header styles
  • Remove unneeded styling
  • Remove unused code
  • Remove unused file
  • remove unused macos xib
  • Remove unused styling
  • Remove unused variable
  • Remove VecXGL submodule
  • rename o2em and jaguar cores to PV..
  • Replace remaining com.provenance-emu with org
  • Replace sync network with async for artwork
  • Replace UIWebView with WKWebView
  • retro: add bliss, 4do, some organization
  • retro: add game music and vicx
  • retro: all the cores
  • retro: fix build missing #endif
  • retro: fix framework dyload
  • retro: fix tvos bitcode
  • retro: gme builds and links
  • retro: gme fix tvos build
  • retro: gme loads
  • retro: gme plays
  • retro: ios biulds
  • retro: metal video doesn't crash but still odd
  • retro: potator loads, fix static rom buffer copy
  • retro: remove VecXGL for libretro version
  • retro: software fb callback and pixl fmt fixes
  • retro: split core into categories, add cores
  • retro: the final cores! for now
  • retro: tvOS builds
  • retro: update core submodules
  • retro: video callback pitchshift work
  • rice: use newer branch, fixes catalyst
  • Set library header background
  • Set navigation bar style only for game library
  • Set overrideUserInterfaceStyle
  • Set settings button font only on tvOS
  • Settings webDav always tvOS and sim
  • Settings, disable swiftUI in iOS 13
  • shaders add support for lcd/crt screen option
  • Simplify code
  • Single frameworks, catalyst, macos
  • snes n64 fix a/b and deadzone
  • snesticle builds
  • snesticle: remove from app, needs work
  • snesticle: tvos, add to ios build
  • spotlight scheme update depends
  • stella module fix
  • stella snapshot
  • stella xcconfig
  • stella: delete duplicate files
  • stella: use a submodule and static libs
  • submodules: Single framework, macos
  • swap experimentalCores option with unsupported
  • swiftpm updates
  • swiftpm update depends
  • SwiftUI flow — make landing screen the console carousel if any consoles available, reduce side menu open width
  • systems.plist update ext and bios for new cores
  • tic80 add submodule
  • tic80 submodule
  • tvos add missing enums
  • tvOS don't copy glsl to docs
  • tvOS fix duplicate symbols in mupen/gliden
  • tvOS Fix jaguar compile
  • tvOS fix missing target warnings, introspect err
  • tvOS hide metadata edit behind #if TVOS_HAS_EDIT
  • tweak previous commit
  • update bliss
  • Update bliss submodule, 2 targets
  • Update deployment targets
  • Update MednafenGameCore.mm
  • Update PVGameLibrarySectionHeaderView.swift
  • Update PVGameLibraryViewController.swift
  • Update PVGameLibraryViewController.swift
  • Update PVGameLibraryViewController.swift
  • Update PVGameLibraryViewController+CollectionView.swift
  • Update PVGameLibraryViewController+CollectionView.swift
  • Update PVGameMoreInfoViewController.swift
  • Update PVMetalViewController.m
  • Update PVSettingsModel.swift
  • Update PVSettingsModel.swift
  • Update realm schema version
  • Update rebase.yml
  • Update save game alert
  • update some core repos
  • Update stella to upstream
  • Update styles on theme change
  • Update various cores and ios target includes
  • Use different yellow that works with both themes
  • Use ellipsis
  • Use system alert system background color
  • Use system background color for game library
  • Use system background for game info
  • Use system background for settings
  • Use system color for "Game library empty"
  • Use system colors for file logs
  • Use system colors for live log
  • Use system colors for save states
  • Use system gear image
  • Use system sort libray options background colors
  • Use theme for section header style
  • Use TVAlertController everywhere
  • uupdate cores ios version and target platforms
  • WebServer fix hardcoded 8080
  • webserver fix queue QOS warning
  • webserver nslog to logger
  • whitespace
  • xcodebuild action remove cache clear
  • yabause: update c flags
  • Add .all-contributorsrc config file
  • add a working project for dosbox
  • Add dosbox-pure
  • Add fceux netplay server
  • add framework targets for cores and expermnt cores
  • add libretro framework
  • add libretro target to framework
  • beetle: it runs but no video
  • bridging-header remove superfulous import availaiblity
  • bump version to 2.1.1
  • Cancel as localized string
  • clean up window rootViewController assignment for SwiftUI path
  • desmume use prov upstream
  • desume builds with libretro
  • dosbox add libretro library
  • dosbox builds
  • dosbox technically it builds
  • dosbox: av tweaks
  • dosbox: link correclty
  • dosbox: some overwrides
  • ds: add controls callbacks
  • ds: melon and extensions tweaks
  • duckstation: rebase
  • Emu VC defer gesture .bottom to b,l,r
  • Enable MTL fast math support
  • ep128: fix c++ issue
  • fbneo minor shit
  • fceux add upstream submodule
  • fceux update core to 2.6.2
  • filters: add simple crt demo
  • filters: metal filter menu
  • First version of movable buttons
  • Fix broken wiki link, minor UX improvements
  • fix build
  • fix compile
  • fix gles shaders and add other framework core targetrs
  • fix some tvos build issues
  • fixes #1849 tgbdual crash on ios fixed
  • fuck git sometimes
  • fucking around with app clips and associated domai
  • fxeux swift to 2.2.3
  • gameimporter hacky override 4 updated gamefaq url
  • gameimporter throw less by pre-checking
  • gitignore dsstore
  • gitignore newrelic file
  • glescore: did i loop wrong?
  • hacks: placeholder 4 volumebutton and carplay hax
  • include assets
  • iOS 13 target in xcconfig
  • jag: add CD library support and loading
  • jaguar: update core for memory fix
  • libretro refactor and add files
  • make a libretro and it builds
  • mednafen: fix a build issue with switch statement
  • Merge branch 'feature/dos-box' into develop
  • Merge branch 'release/2.1.0' into develop
  • Merge pull request #1761 from ianclawson/ian/swiftui-menu-path
  • Merge pull request #1764 from Provenance-Emu/feature/MoveableButtons
  • Merge pull request #1810 from Provenance-Emu/feature/fceuxUpdate
  • Merge pull request #1900 from Provenance-Emu/feature/1888_N64_19x9
  • Merge pull request #1901 from Provenance-Emu/feature/snes9xControllerFix
  • Merge pull request #1909 from rrroyal/develop
  • Merge pull request #1926 from Provenance-Emu/feature/JoystickLayoutFix
  • Merge pull request #1933 from Provenance-Emu/feature/filtermanager
  • movebuttons: fix some buttons from resetting
  • mupen add more core options
  • mupen fix type-o in option
  • mupenx: core compile updates
  • NOTICKET core options enum default fixed
  • NOTICKET Options tableview popover rect fixed
  • options onscreen joypad as beta setting
  • package resolve update
  • pblibretro base code
  • prov: yabause hacks
  • pvdosbox use retro core as base
  • pvgenesis m68kcpu.c compiler flags
  • pvretrocore start point
  • refs #1765 fix non-dualshock start in Saturn
  • refs #1797 refactor fceux into static libs
  • refs #1915 fixes psx start button layout
  • remove appclip from build
  • reto: video init code
  • retro add more files
  • retro: start to add mupenNX
  • retro: a bunch of fixes, build flag updates, controllers, gles core
  • retro: add a beetle core cause y not
  • retro: add hatari build
  • retro: Add melonDS start of core
  • retro: add minivmac core
  • retro: add Mupen64Plus-NX
  • retro: add potator cause y not
  • retro: add potator core
  • retro: add proper projects for test forks
  • retro: add submodules and blank projects for more
  • retro: add vmac and fix other stuff
  • retro: add Yabause core
  • retro: beetle builds?!
  • retro: beetlepsx builds
  • retro: better code to find cores
  • retro: better wrapper
  • retro: callbacks set
  • retro: CORES OPEN MSX!
  • retro: desmeme2015 prov patches
  • retro: desmume, dosbox, neo, msx, genesis udates
  • retro: double buffer and real screen dimensions
  • retro: fbneo builds
  • retro: fbneo builds shockingly
  • retro: fix embedding framework
  • retro: fix loading gles cores
  • retro: fix paths, desumeme runs now
  • retro: fix release builds
  • retro: fix tvos build with melon,msx
  • retro: i more linking stuff, fbneo start
  • retro: kind of loads
  • retro: more cores
  • retro: more fb neo
  • retro: more linking, libretro.h into build
  • retro: mupen-nx has proper build, though errors
  • retro: pbbeetle additions
  • retro: pcsx rearmed some progress
  • retro: remove broken beetle from build
  • retro: reset targets, builds but empty
  • retro: schemes for ep128, msx
  • retro: stuff almost runs
  • retro: submodules update
  • retro: supervision works with new callbacks
  • retro: tvos builds, refactor cores into frameworks
  • retro: various fixes, tvos builds
  • retro: vecrex
  • retro: video work
  • retro: yabause update
  • shader manager
  • shaders metal are wrong
  • swiftlint corrections
  • SwiftUI menu design revamp - bulk add all changes from fubar'ed branch
  • systems.plist add DOS
  • systems.plist fill in all openvgdb system ids
  • systems.plist psx add compresed formats
  • test adding dos to build
  • Themes.swift cleanup some re-used code
  • tvOS add debug setting to use themes
  • tvOS fix swift ui build
  • Update Atari8bit bios sizes
  • Update blit_ps.metal
  • Update PVSearchViewController.swift
  • Update PVSNESEmulatorCore.mm
  • xcconfig: GLES_SILENCE_DEPRECATION=1
  • yabause: fix release build

[2.1.1] - 2022-06-15

Added

  • Controls: PSX on-screen joystick can be disabled in settings. No longer shows when controller is connected
  • Swift UI beta for tvOS
  • tvOS theme support
  • Metal shader 200% speedup 👉 @mrjschulte
  • early dosbox testing code (no running yet)

Fixed

  • tgbdual crash on ios fixed

Updated

  • fceux update core to 2.6.2

[2.1.0] - 2022-02-14

Special thanks to contributors on this release; 👉 @mrjschulte 👉 @ToddLa 👉 @ac90b671 👉 @nenge123 👉 @david.nicolson 👉 @davidmuzi 👉 @amoorecodes

Added

  • Controllers:
    • On Screen Joystick Controls for N64 and PSX
    • APIs for keyboard, mouse, rumble, on-screen joystick. (coming in future release)
    • Apple TV: Support new Siri remote (MicroGamepad and DirectionalGamepad)
  • Code Signing is now managed with an XCConfig file. See CodeSigning.xcconfig.example for instructions. (Only applies to developers/xcode source installs)
  • Enumeration type menu options UI
  • FPS debug label now includes total CPU and Memory usage.
  • GameBoy Advanced cheat code support
  • Jaguar options exposed
  • Long press a ROM for quick access to Core Options
  • Mednafen
    • many more sub-core options added
    • SNESFaust 1 frame render ahead option (on by default. VERY SNAPPY!)
  • Metal Shaders (CRT, LCD, etc.)
  • N64:
    • mupen/gliden/rice options exposed
    • Dual Shock 4 touchpad as pause
    • option for Dual Joysticks on DualShock4 as dual controllers (allows Goldeneye dual controller joystick layout from 1 physical dualshock)
  • Native Metal renderer option [WIP/Buggy]
  • per-game option overrides
  • radio selection options
  • Sega Saturn Mutli-CD support
  • Swift UI/UIKit optional code paths at app start (SwiftUI currernly empty, for easier development in future)
  • VirtualBoy side by side mode (for 3D tv's with Side by Side mode. Google Cardboard coming later)
  • XCode will present a warning message if it detects a device build but CodeSigning.xcconfig isn't setup.
  • Localizations (Only Partially translated WIP)
    • NSLocalizedString for most strings in main app source
    • Chinese Simplified by @nenge123
    • Spanish
    • Russian by @amoorecodes
    • Dutch by @mrjschulte
    • Portuguese (Brazil) by Stéfano Santos

Improved

  • Mupen:
    • wrapper code organized, refactored
    • faster controller polling, various other code speedup tweaks.
    • mupen llvm optimization flags improved (was incorrectly -O2, now -Os)
  • On-Screen Controls
    • N64 layout improved
    • PSX layout improved
  • Branch prediction compiler hints for tight loops, possibly faster.
  • Catalyst: All cores build now for Intel and M1.
  • check if file exists before attempt to delete, reduces superfluous throws trapping in the debugger
  • Converted more app code from ObjC to Swift
  • Dark Mode UI always on, fixes some color issues
  • Fix some excessive thread blocks
  • Hide/Show systems chevron location tweaks
  • If multiple cores support a system, cores are listed in recommended order.
  • Improved logo/header bar for iOS & tvOS
  • Jaguar button layout tweaks
  • Mark various ObjC classes objc_direct_members. Should improve Swift to ObjC calls bypassing dynamic dispatch for function pointers (in theory)
  • Replace all spinlocks with atomic operations for better thread performance
  • replaced some sloppy force unwraps with proper nil checks and logging
  • Shaders are copied to Documents at load and read from thereafter. This allows locally editing / developing shaders without rebuilding.

Fixed

  • Conflicts better detected
  • tvOS top buttons sometimes couldn't be selected
  • Faster compile times (improved header imports, compiler flags)
  • Fixed some improper retain cycles in ObjC blocks
  • Fixed rare audio engine nil reference race condition crash
  • Cheat entry UI fixes

Updated

  • N64:
    • Swap left and right triggers to L:Start R:Z Button from other way around prior
    • mupen cxd4 plugin to latest upstream version
    • mupen rsp-hle plugin to latest upstream version
  • Updated Swift Packages (RxRealm, Realm, Cocoalumberjack)
  • Improved tvOS UI (top buttons, search, icons, more consistent styling)

Removed

  • Removed SteamController support (no one used it and the code caused too many compilations, plus steam controllers are kind of trash, sorry.)

[2.0.4] - 2021-12-24

Fixed

  • #1651 Fixed N64 / Mupen blank video @mrjschulte
  • #1652 Update TVL in crt_fragment.glsl to reduce moirée effects at UHD @mrjschulte
  • #1654 Remove absolute path to file from .xcodeproj @davidmuzi
  • mupen replace consts with define, whole module for archive builds @JoeMatt

[2.0.3] - 2021-12-22

Added

  • Odyssey2 core
  • Mac Catalyst early support (M1 and Intel) (not for public use yet)
  • SNES FAST and PCE FAST core options for Mednafen
  • watch os demo target
  • Odyssey add and use od2 extension
  • Add odyssey to build
  • Tentative support for VecX and CrabEMU
  • macOS testing catalyst
  • Add nitotv methods for tvOS
  • Override openURL for tvOS
  • Add Patron link to readme
  • Add Desmume2015 core
  • DuckStation initial commit
  • Cores add plist feature to ignore
  • Add PPSSPP Source
  • Play! PS2 initial commit
  • Add Dolphin project
  • Add GameCube support classes and metadata (WIP)
  • Add flycast core (WIP)
  • Add a Chinese loading example
  • Add localized strings file and example

Fixed

  • #1621 GBC palette options crashed gambatte
  • #1414 smarter exceptions in PVSystem
  • #1645 PCE Audio setting tweaks to match real hardware
  • #1637 Cheats label name cut off fixed
  • #1649 two PCE module audio related setting tweaks that enable Provenance's PCE Audio output to match much closer to the measured MDFourier output of a real system, as tested with @artemio from the MDFourier project.
  • Fixed rare crash in OERingBuffer
  • Cores that don't support saves no loner display save actions in menu
  • OpenVGDB Update (fixes artwork and metadata not loading)
  • Fixed strong self refs in some classes, closures
  • Fixed MD5 mismatch log message
  • Add back a crash logger #1605 add crash logger and fix minor build settings
  • switch jaguar to upstream branch
  • core option as bool for objc
  • RxDataSources switch to SPM package
  • Fix some implicit self block refs
  • closes Conflicts not reported #1601 conflicts reporting correctly
  • fixes Gambatte core immediately crashes #1621 GBC palette options crashed gambatte
  • refs After Resolving an "Import Conflict", subsequent imports no longer work #1414 smarter expecptions in PVSystem
  • refs WebDav Server Always-On broken #822 add small main queue delay 4webdav start
  • tvOS add multi micro gamepad to infoplist
  • tvOS fix target order setting error
  • Fix minor iCloud warning
  • Fix random warnings
  • Fix force unwraps in appdeleagte
  • Fix finicky tvOS schemes
  • Fix whole/single compilation for rel/arch targets
  • Mednafen, proper ELOG in swift
  • Mednafen remove dead file ref
  • RxSwift fix some threading issues Remove flycast from build i dunno xcode beta stuff package.resolved altkit update Localization, start basic support Remove base localization
  • Fix GL_SILENCE_DEPRECATION=1
  • Fix PS2 stealing PS1 bios
  • Fix gamecube stealing n64 roms
  • add nintendo DS enums
  • Replace QuickTableViewController SPM with source
  • PicoDrive fix naming
  • altkit not in catalyst
  • Remove reicast from build
  • Fix catalyst and other build tweaks

Updated

  • Jaguar core upstream & custom performance hacks
  • Mupen/GlideN64/Rice... updated to latest upstream
  • All SPM packages to upstream

Removed

  • Delete Romefile
  • dolphini remove used parent project

[2.0.2] - 2021-09-14

More Bug fixes mostly.

Added

  • XCode will detect missing git submodules and auto-clone recursive before building the rest of the project

Fixed

  • #1586 Running same care twice in a row would crash
  • #1593 Cheat codes menu crash fixes and other cheat code quality improvements

Updated

  • #1564 SteamController native SPM package port
  • Jaguar core updated with libretro upstream + my performance hacks. PR made libretro/virtualjaguar-libretro#53 (comment)
  • Fix many static analyzer warnigns about possible nil pointer/un-malloc'd memory usage, now we check and log nils or early exit where applicable
  • SQLite.swift updated
  • RxRealm updated from 5.0.2 to 5.0.3
  • realm-cocoa updated from 10.14.0 to 10.15.0

[2.0.1] - 2021-09-09

Bug fixes mostly. Special thanks to contributors on this release; 👉 @mrjschulte 👉 @dnicolson 👉 @cheif

Updated

  • #1545 Update Mednafen to 1.27.1 (Changelog)
  • #1587 Clarify Refresh Game Library Ui Dialog text
  • TGBDual updated to latest upstream 1e0c4f931d8c5e859e6d3255d67247d7a2987434

Fixed

  • #1555 VirtualBoy crash on open
  • #1559 Mednafen build error on tvOS
  • #1583 NSLogger build issues on tvOS
  • #1584 TvOS Release does NOT build due to 'searchController' is unavailable in tvOS
  • #1585 Module 'AltKit' not found
  • #1550 Provenance for Apple TV adds "private" part to "partialPath" in PVFile
  • #1551 #1575 Fix missing roms on rescan
  • #1556 Fix VirtualBoy Crash
  • #1568 On screen buttons do not work with mednafen core

[2.0.0] - 2021-08-02

Special thanks and shout-outs to @braindx, @error404-na, @zydeco, @mrjschulte, @yoshisuga, the Mupen team and all of the additional contributors.

N64 Release! with Mupen64Plus + GlideN64 — a non-jailbreak emulation first. A lot in this update: Swift codebase conversion, Atari Jaguar support, Saturn, Dreamcast…full multi-disc support for all of you RPG fans out there, dark theme default, 60 FPS optimizations, core updates, new touch controls, iOS 12, iPhone X, WebDAV support and much more…

⚠️ Breaking ⚠️

2.0 does not support upgrading from 1.4 libraries. It MAY work with some versions of 1.5beta's but not all betas are the same. Your mileage may vary. For this reason we're updating the version to 2.0, to indicate the lack of upgrade path.

ℹ️ You can install 2.0 along side 1.x by using a different bundle id

Added

New Cores

  • N64 Core: Mupen64Plus
    • GlideN64 Preview (only non-jailbreak app to do this)
    • High-Resolution Texture Support
      • Gliden64 & Rice
    • 4 players
    • Rumble support
  • Sega Saturn Core: Mednafen
  • Atari Jaguar Core: Virtual Jaguar custom Alpha ** Note: requires additional steps for BIOS, very unstable **
  • Sege Dreamcast Core: Reicast custom Alpha ** Note: Unplayable, sync issues. For dev testing only **
  • [Additional] Nintendo GameBoy Core: TGBDual Beta

New Features

  • Multi-disc Support (disc-swapping)
  • iOS 11-15 Support Including Smart Invert Support so cover art and emulator view won't invert
  • iPhone X Support Full-screen Support, Home Indicator: Hides with controller, Dims while playing
  • MFi+ (Instant Button Swap Modes) to access to missing buttons on MFi Controllers (MFi Controls)
  • iCloud Syncing for Save States and Battery Saves Beta
  • New Dark Theme Default
  • tvOS Ui sync up w iOS.
  • Timed Auto Saves (default: every 10 minutes)
  • Game Info View & Game Info Preview View (on 3D Touch)
    • Extended editable ROM meta data (Customizing ROMs) cover art, title, description, genre, release date, publisher, play history…
    • Single ROM Browsing (swipe left/right)
    • Links to Game Manuals
  • Share Button
    • Export ROM, Saves, Screenshot and custom artwork
  • WebDAV Support (access from the Finder or other WebDAV clients)
  • Optional Touch/Overlay Controls Additions:
    • Start/Select Always On-screen (for MFi usage with iOS)
    • All-Right Shoulders (moves L1, L2, and Z to right side)
  • Save/Load Save States View with Screenshots
  • Add ROM to Home Screen (like web apps from Safari)
  • Native resolution support
    • Optional: Renders OpenGL at native retina sizes
    • Some cores support internal up-scaling (Mupen)
  • System details in settings
    • Lists supported cores, library info
    • List required BIOS's if they're installed and easy copy MD5 to the clipboard by tapping for easier Google searches
  • Improved volume HUD
  • Enhanced build information
    • In settings, see info about the installed build (version and build #, built source, date and more)
  • In-app logs
    • In settings, view the logging output to help track down bugs. Export and e-mail.
  • GameBoy multi-player via: TGB Dual

Changed

Core Updates

App Improvements

  • 60 FPS Rendering & Performance Optimizations
  • Controller Improvements:
    • Consistent Cross-System MFi Button Mappings (MFi Controls]
    • New iCade Support Additions
    • Steam Controller Bluetooh LE Mode support
    • Rumble support (N64, PokeMini)
    • New Direct 8Bitdo M30 mapping support for all of the Sega and PC Engine/TG16 consoles.
  • Touch/Overlay Controls:
    • New minimal, and less obstructive controller theme default (preview 1.5 edition as a teaser for UI 2.0's Overlay Overhaul project)
    • Improved button styles
    • Improved layout and ergonomics (start, select, shoulders within reach)
    • Extended controls to include L2, R2
    • Visual Feedback
    • Button Color Tinting (Optional)
  • Game Importer Improvements:
    • Conflict Resolution
    • Better ROM Matching
    • Imports combined 'roms' and 'cover art' directories into one universal drop directory
  • Game Library Improvements
    • Side Scrolling Collection Views:
      • Recent Saves with Screenshots
      • Recently Played
      • Favorites
    • Library Sorting
    • Cover Badges (New/Unplayed, Favorite, Disc Count, Missing ROM)
    • Swipe to Delete
  • 3D Touch

New Controllers

  • Steam Controller
  • 2018.Q4+ MFi Controllers (supporting R3/L3) (Controllers)
  • 8Bitdo M30

Behind the Scenes:

  • Conversion to Swift codebase
  • Dynamic Core Loading
  • Extended ROM metadata
  • Extended System metadata
  • Full Codable support for games, saves, library etc, models

Bugfixes

  • Fixed Atari 5200 screen clipping
  • Fixed iPhone X margins
  • PC Engine CD Support restored
  • and more…

Etc…

  • New Icon!

[1.4.0] - 2018-03-13

Huge thanks to @JoeMatt, @leolobato, @braindx and everyone else who contributed.

Added

  • PlayStation core
  • Pokémon mini core
  • Virtual Boy core
  • Atari 7800 & Lynx core
  • Neo Geo Pocket / Neo Geo Pocket Color core
  • PC Engine / TurboGrafx-16 (CD) core
  • SuperGrafx core
  • PC-FX core
  • WonderSwan core
  • CRT Shader

Updated

  • Importer improvements (MD5 matching and performance improvements)

[1.3.2] - 2017-02-12

[1.3.1] - 2016-12-17

[1.3.0] - 2016-11-28

[1.2.6] - 2015-11-17

[1.2.5] - 2015-11-11

[1.2.4] - 2015-11-06