Root cause: Oboe capture at 48kHz with InputPreset::VoiceCommunication cannot open against a BT SCO device (only supports 8/16kHz). The stream silently falls back to builtin mic, delivering zeros. Fix: add bt_active flag to WzpOboeConfig. When set, capture skips setSampleRate and setInputPreset, letting the system route to BT SCO at its native rate. Oboe's SampleRateConversionQuality::Best resamples to 48kHz for our ring buffers. Playout uses Usage::Media in BT mode. New API: wzp_native_audio_start_bt() for BT mode, called from set_bluetooth_sco(on=true). Normal audio_start() restores the standard config when switching back to earpiece/speaker. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
45 lines
1019 B
C++
45 lines
1019 B
C++
#ifndef WZP_OBOE_BRIDGE_H
|
|
#define WZP_OBOE_BRIDGE_H
|
|
|
|
#include <stdint.h>
|
|
|
|
#ifdef __cplusplus
|
|
#include <atomic>
|
|
typedef std::atomic<int32_t> wzp_atomic_int;
|
|
extern "C" {
|
|
#else
|
|
#include <stdatomic.h>
|
|
typedef atomic_int wzp_atomic_int;
|
|
#endif
|
|
|
|
typedef struct {
|
|
int32_t sample_rate;
|
|
int32_t frames_per_burst;
|
|
int32_t channel_count;
|
|
int32_t bt_active; /* nonzero = BT SCO mode: skip sample rate + input preset */
|
|
} WzpOboeConfig;
|
|
|
|
typedef struct {
|
|
int16_t* capture_buf;
|
|
int32_t capture_capacity;
|
|
wzp_atomic_int* capture_write_idx;
|
|
wzp_atomic_int* capture_read_idx;
|
|
|
|
int16_t* playout_buf;
|
|
int32_t playout_capacity;
|
|
wzp_atomic_int* playout_write_idx;
|
|
wzp_atomic_int* playout_read_idx;
|
|
} WzpOboeRings;
|
|
|
|
int wzp_oboe_start(const WzpOboeConfig* config, const WzpOboeRings* rings);
|
|
void wzp_oboe_stop(void);
|
|
float wzp_oboe_capture_latency_ms(void);
|
|
float wzp_oboe_playout_latency_ms(void);
|
|
int wzp_oboe_is_running(void);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // WZP_OBOE_BRIDGE_H
|