mirror of
https://github.com/par274/sharpemu.git
synced 2026-07-22 19:06:15 +08:00
72645cb373
* [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.
47 lines
1.2 KiB
C#
47 lines
1.2 KiB
C#
// Copyright (C) 2026 SharpEmu Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
namespace SharpEmu.HLE.Host;
|
|
|
|
/// <summary>
|
|
/// Host-neutral gamepad button flags. Named after the PlayStation layout the guest API
|
|
/// exposes, but the numeric values are the seam's own — the HLE pad exports translate
|
|
/// them to SCE_PAD_BUTTON bits, so guest ABI values never leak into host backends.
|
|
/// </summary>
|
|
[Flags]
|
|
public enum HostGamepadButtons : uint
|
|
{
|
|
None = 0,
|
|
Up = 1 << 0,
|
|
Down = 1 << 1,
|
|
Left = 1 << 2,
|
|
Right = 1 << 3,
|
|
Cross = 1 << 4,
|
|
Circle = 1 << 5,
|
|
Square = 1 << 6,
|
|
Triangle = 1 << 7,
|
|
L1 = 1 << 8,
|
|
R1 = 1 << 9,
|
|
L2 = 1 << 10,
|
|
R2 = 1 << 11,
|
|
L3 = 1 << 12,
|
|
R3 = 1 << 13,
|
|
Options = 1 << 14,
|
|
TouchPad = 1 << 15,
|
|
}
|
|
|
|
/// <summary>
|
|
/// Snapshot of one host gamepad: sticks are 0..255 with 128 centered and Y growing
|
|
/// downward; triggers 0..255. Unmanaged on purpose so per-frame polls can stackalloc
|
|
/// snapshot buffers.
|
|
/// </summary>
|
|
public readonly record struct HostGamepadState(
|
|
bool Connected,
|
|
HostGamepadButtons Buttons,
|
|
byte LeftX,
|
|
byte LeftY,
|
|
byte RightX,
|
|
byte RightY,
|
|
byte LeftTrigger,
|
|
byte RightTrigger);
|