* Latest commit info axamal structure
* Link latest commit to text
* Added localization for About>Last commit info
* Made the commit hash a button that redirects you to the commit in github
* Reorder about section
* Commit and update icon in about section to have consistency in section
* [Host] Abstract audio output behind IHostAudioOutput
Add IHostAudioOutput (opens streams, names the backend for diagnostics)
and IHostAudioStream (submit interleaved stereo 16-bit PCM, Dispose) to
the host seam, with the winmm waveOut implementation moving whole into
Host/Windows/WindowsWaveOutAudio — same device open, queueing,
32 KB backpressure wait, and buffer lifetime as WinMmAudioPort had. The
DllImports become source-generated LibraryImports in the move, matching
the other Windows backends.
The guest-format conversion (mono/stereo/7.1, s16/float32 -> stereo
PCM16) is platform policy, not device code, so it stays in Libs as
AudioPcmConversion; AudioOutOutput converts into a pooled buffer and
submits the result through the stream. Open failures still degrade to
the silent paced port with the same warning, and the port log line now
takes its backend name from the platform instead of a hardcoded string.
* [Host] Abstract pad and keyboard input behind IHostInput
Add IHostInput to the host seam: gamepad state snapshots, rumble /
trigger-rumble / lightbar sinks, and the keyboard-fallback queries
(window focus, key state). Gamepad state crosses the seam as the new
unmanaged HostGamepadState with HostGamepadButtons flags — named after
the PlayStation layout the guest API exposes but with the seam's own
values, so SCE_PAD_BUTTON bits never leak into host backends and the
per-frame poll can stackalloc its snapshot buffer.
The DualSense raw-HID reader, the XInput reader, and the Win32 HID
interop move whole into Host/Windows (report parsing, hot-plug loops,
rumble/lightbar output reports, and log strings unchanged), translating
to the neutral flags instead of ORBIS bits and converting their
DllImports to source-generated LibraryImports. WindowsHostInput
composes them plus the user32 keyboard queries; rumble still fans out
to both readers, trigger rumble stays XInput-only, lightbar stays
DualSense-only.
PadExports keeps all policy: the keyboard mapping (now via named
OrbisPadButton constants instead of raw hex), the controller-beats-
keyboard-past-deadzone merge, and the new host->ORBIS button
translation. The GUI's source-linked reader copies re-point to the
moved files (it still cannot reference SharpEmu.HLE wholesale), which
requires AllowUnsafeBlocks for the generated marshalling stubs; its
navigation code switches to the neutral flags.
* [Host] Move the timer-resolution request behind IHostThreading
IHostThreading gains RequestTimerResolution (idempotent, best-effort
~1 ms timed-wait granularity; a no-op wherever the platform default is
already fine). The winmm timeBeginPeriod call, its once-only latch, and
both warning strings move from the Libs-level HostTimerResolution
helper into WindowsHostThreading as a source-generated LibraryImport;
the vblank pump requests it through the platform instead.
HostSystemInfo in SharpEmu.Logging keeps its direct user32/kernel32
imports deliberately: Logging sits below HLE in the dependency chain so
it cannot see the host seam, every path is already OS-gated with
fallbacks, and it only runs once for the diagnostics banner.
* Added about tab with github and discord
* Added discord & github svgs and svg support
* Changed svg to pngs and localization text in english & spanish
* [GUI] Added Atrac9 audio decoder and improved GUI with audio preview and controller support
* fix: package.lock.json for SharpEmu.CLI to match the other projects
* fix: packages.lock.json file to include new dependencies for GUI improvements
* rollForward: "disable"
* GUI: redesign library as a cover-art grid with game management
Replace the sidebar game list with a full-width grid of cover tiles.
Cover art is loaded automatically from each game's sce_sys/icon0.png
(pic0.png fallback) and decoded off the UI thread; games without art
get a deterministic gradient placeholder with the title's initials.
- New layout: search/scan toolbar, tile grid with hover and selection
states, bottom launch bar with cover thumbnail, collapsible launch
options and console panels (console auto-opens on launch)
- Right-click context menu on tiles: launch, open game folder, copy
path/title ID, remove from library
- Removed games persist in an ExcludedGames settings list; re-adding
a folder restores any removed games beneath it
- Search now also matches title IDs
- Fix: placeholder brushes were constructed on the scan thread, which
throws in Avalonia and was silently swallowed, yielding empty scans
* GUI: show full install folder size instead of eboot.bin size
The library previously displayed the size of eboot.bin alone, which
wildly understates a game's real footprint. The install folder is now
totaled recursively in the existing background pass (after cover art,
which is cheaper and more visible), and each tile updates live once
its size is ready.
* GUI: selection backdrop, smaller tiles, controller navigation
Address review feedback on the library redesign:
- Selecting a game fades its key art (sce_sys/pic0.png, pic1.png
fallback) in as the window backdrop, dimmed by a gradient scrim;
decoded off the UI thread and cached per entry
- Cover tiles reduced from 156px to 128px
- The library can be driven with a DualSense: d-pad/left stick moves
the selection (hold-to-repeat, row-aware), Cross launches, Circle
stops; input is ignored while the launcher window is unfocused.
Reuses the pad HID reader by compile-linking its dependency-free
sources instead of referencing all of SharpEmu.Libs
* [gui] Add Avalonia desktop frontend
Adds SharpEmu.GUI, a dark-themed desktop frontend that drives the
SharpEmu CLI as a child process:
- Game library with folder scanning for eboot.bin, search, and
persisted settings (%APPDATA%/SharpEmu/gui-settings.json)
- Launch options mapped to CLI flags (log level, strict dynlib
resolution, import trace limit)
- Live console with severity color-coding, bounded buffer, and
crash-safe deferred auto-scroll
- EmulatorProcess launches the CLI via CreateProcessW with the same
CET/CFG mitigation opt-outs the CLI applies to its own relaunched
child (suppressed via SHARPEMU_DISABLE_MITIGATION_RELAUNCH so
output is not lost to a detached console), inheritable pipes for
stdout/stderr capture, a kill-on-close job object, and a fallback
to an unmitigated launch on Windows builds that reject the policy
bits
Also pins Tmds.DBus.Protocol 0.21.3 (transitive of Avalonia.Desktop)
to fix GHSA-xrw6-gwf8-vvr9.
* [gui] Integrate GUI into the SharpEmu executable
Per review feedback, the GUI is no longer a separate application.
SharpEmu.exe now opens the desktop frontend when started without
arguments and behaves exactly as the existing CLI when given any
argument:
- SharpEmu.GUI becomes a class library exposing GuiLauncher.Run(),
hosted by SharpEmu.CLI
- The console window is hidden in GUI mode only when the process is
its sole owner (double-click launch), never a terminal the user
launched from
- In GUI mode the frontend spawns this same executable (with
arguments) as the emulator child process, so the existing launch,
piping, and mitigation machinery is unchanged
* [gui] Address review feedback: no console, single-file, param.json, portable settings
- Switch SharpEmu.exe to the GUI subsystem so no console window appears
at startup. CLI mode attaches to the parent terminal console (or
allocates one when started with arguments but no terminal) and
rebinds missing std handles to CONOUT$; piped/redirected output is
used as-is, so scripted and GUI-spawned runs are unaffected.
- Publish as a true single file: native libraries are embedded and
self-extracted, with glfw kept as the only loose DLL next to the
executable.
- The game library reads sce_sys/param.json and shows the game title
with the title id beneath it, falling back to the folder name.
- GUI settings and the crash log now live next to the executable,
matching the emulator convention, instead of %APPDATA%.
* [build] Add win-x64 sections to package lock files
Generated by dotnet publish -r win-x64 with locked restore enabled.
* [build] Regenerate lock files from project configuration
dotnet restore --force-evaluate; removes the win-x64 runtime sections
that a local RID-specific publish had written into projects that do
not declare a runtime identifier, which broke locked-mode restore in
CI. Verified with dotnet restore -p:RestoreLockedMode=true.
---------