Commit Graph
12 Commits
Author SHA1 Message Date
Henrik RydgårdandClaude Opus 5.5 a5c90b61df Android: Use OpenSL ES for audio on TVs, add audio API and MMAP settings
An Android 11 TV played nothing over a Bluetooth headset since the switch
to Oboe, while its speakers worked. Testing on it showed AAudio with MMAP
is silent there and AAudio without MMAP works, as does OpenSL ES (also
when the headset is connected mid-game), whatever the stream usage. MMAP
should never be used for a Bluetooth route, so it's a firmware bug.

Audio settings get an Audio API choice and a Low-latency audio (MMAP)
checkbox, with hints, so other devices with the same kind of bug can be
worked around. The API defaults to OpenSL ES on TVs and before Android
8.1, where the choice isn't offered, and AAudio elsewhere. Changing them
reopens the streams right away. System Information shows the output
stream that got opened (API, MMAP or not, rate, buffers, device) and any
audio error.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 23:58:42 +02:00
Henrik RydgårdandClaude Opus 5.5 6cf4872e78 Android: Hand microphone input over on the CPU thread, like the other hosts
The Oboe input callback used to call Microphone::addAudioData directly,
writing PSP memory from the audio thread. Now it only pushes samples
into a SampleRing, and pollRecording drains it on the CPU thread.
Starting and stopping still go through Java, which asks for permission.

Every host with a microphone polls now, so sceUsbMic drops what only the
push path needed: QueueBuf's recursive mutex, restarting the mic on a
device change, and the startMic parameter nobody read. Also removes the
unused System_AudioRecordingState and Microphone::isNeedInput.

The Java microphone_command branch didn't return true, so every command
logged "processCommand failed".

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-10 18:49:21 +02:00
Henrik RydgårdandClaude Opus 5.5 834c3f00ee Android: Replace OpenSL ES audio with Oboe
Oboe uses AAudio on Android 8.1+ and falls back to OpenSL ES on older
devices. Output and microphone input both go through it. The mic now gets
resampled by Oboe from the device's rate to whatever the game asks for.

New: when a stream is disconnected (headphones unplugged, Bluetooth device
going away), it's reopened on the new default device instead of going
silent.

Oboe 1.11.0 is added as a submodule, built through ext/oboe-build for CMake
and as a module in Android.mk.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-10 12:13:58 +02:00
Henrik Rydgård 622b49a6a1 Android buildfix 2025-06-18 23:48:04 +02:00
Henrik Rydgård 990b74cc17 More audio refactoring 2025-06-16 18:48:53 +02:00
Henrik Rydgård a5fdf3d05b Add samplerate argument to NativeMix 2023-03-24 14:48:53 +01:00
Henrik Rydgård 942958c7d8 Store the OpenSL error in a global to avoid "No context"
Followup to #14536
2021-06-16 07:28:45 +02:00
Henrik Rydgård 90cb284837 Remove asserts from OpenSL init. Expose error inside audio settings 2021-06-15 23:13:07 +02:00
Florin9doi 6531c7f4f8 [Android] Retrieve isMicStarted from AndroidAudio state 2020-10-24 20:16:22 +03:00
Florin9doi a42f5234c5 [Android] Start recording immediately after asking for permission 2020-10-24 19:51:31 +03:00
Florin9doi 9379fe1399 [Android] Audio record using OpenSL 2020-10-24 19:51:30 +03:00
Henrik Rydgård aebbff55f1 Some renaming and cleanup in the Android audio code 2020-07-28 14:24:40 +02:00