* pad: send DualSense speaker and haptic audio over Bluetooth
* ci: fix Opus clang-cl build and macOS memory tracker test
* docs: remove Bluetooth notes from project README
* pad: keep Bluetooth audio work off emulation timing path
* pad: smooth DualSense speaker audio on USB and Bluetooth
* tests: find available macOS guest range for page manager
* pad: keep haptic waveform when Bluetooth queue overflows
* audio: reject zero output sample frequency
* Simplify DualSense audio routing and fix Bluetooth batching
---------
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: nmzik <Nmzik@mail.ru>
* network: handle SO_NBIO on non-Windows hosts
Setsockopt only translated the guest SOL_SOCKET/SO_NBIO (0x1200) option
under _WIN32; other hosts rejected it with ENOPROTOOPT. FMOD Studio's Live
Update listener sets SO_NBIO, so on Linux its socket setup failed and the
Studio async manager latched FMOD_ERR_NET_CONNECT. Every blocking Studio
call then failed: loadBankFile returned FMOD_ERR_NOTREADY for all banks,
leaving the game silent and stuck on the splash screen waiting for
RuntimeManager.HaveAllBanksLoaded (PPSA28997).
Toggle O_NONBLOCK with fcntl on non-Windows hosts.
* network: map connection errors from POSIX socket calls
ConvertHostSocketError only covered a handful of errno values on
non-Windows hosts, so anything else reached the guest as EIO. With
SO_NBIO now honoured there, a nonblocking connect() that is still in
progress returned EIO instead of EINPROGRESS (and EALREADY on retry).
Map the same connection and network errors the Windows branch already
translates.
* network: share nonblocking socket error handling
---------
Co-authored-by: nmzik <Nmzik@mail.ru>
launcher: configure and preview controller lightbar color
Add an optional lightbar color to launcher settings and pass it to the emulator with --controller-color. Preview changes on RGB gamepads, handle controller hotplug events, and restore the saved color when settings dialogs close. Release launcher preview handles when starting a game.
Co-authored-by: m66401970-eng <m66401970@gmail.com>
* window: explain why each GPU was rejected in device selection
"Could not find suitable device" gave no hint of what was missing; the
reasons only went to the log file, which users often cannot find (#489).
Device selection now records each rejection reason and the fatal error
lists every GPU with its reasons, for example:
Could not find suitable device:
AMD BC-250 (RADV GFX1013): fragmentShaderBarycentric is not supported
The missing-extension check also names each missing extension instead of
stopping at the first one without saying which. Device requirements and
selection are unchanged; the log keeps the same messages.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* window: simplify GPU rejection reporting and capability checks
* window: identify storage-image format failures accurately
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: nmzik <Nmzik@mail.ru>