From 42fd3712f5dbc56d238244fba1a132dbf98fddbb Mon Sep 17 00:00:00 2001 From: Will Evans Date: Mon, 27 Oct 2025 09:48:49 +0000 Subject: [PATCH 1/9] AAudio buffer size minimum should be detected using the PROPERTY_OUTPUT_FRAMES_PER_BUFFER on the AudioManager not using AudioTrack --- src/host/aaudio/android_media.rs | 41 ------------- src/host/aaudio/java_interface.rs | 1 + .../aaudio/java_interface/audio_manager.rs | 32 ++++++++++ src/host/aaudio/mod.rs | 59 ++++++------------- 4 files changed, 50 insertions(+), 83 deletions(-) create mode 100644 src/host/aaudio/java_interface/audio_manager.rs diff --git a/src/host/aaudio/android_media.rs b/src/host/aaudio/android_media.rs index f2a958031..838dee273 100644 --- a/src/host/aaudio/android_media.rs +++ b/src/host/aaudio/android_media.rs @@ -19,44 +19,3 @@ where let vm = Arc::new(unsafe { JavaVM::from_raw(android_context.vm().cast())? }); Executor::new(vm).with_attached(|env| closure(env)) } - -fn get_min_buffer_size( - class: &'static str, - sample_rate: i32, - channel_mask: i32, - format: i32, -) -> i32 { - // Unwrapping everything because these operations are not expected to fail - // or throw exceptions. Android returns negative values for invalid parameters, - // which is what we expect. - with_attached(|env| { - let class = env.find_class(class).unwrap(); - env.call_static_method( - class, - "getMinBufferSize", - "(III)I", - &[sample_rate.into(), channel_mask.into(), format.into()], - ) - .unwrap() - .i() - }) - .unwrap() -} - -pub fn get_audio_track_min_buffer_size(sample_rate: i32, channel_mask: i32, format: i32) -> i32 { - get_min_buffer_size( - "android/media/AudioTrack", - sample_rate, - channel_mask, - format, - ) -} - -pub fn get_audio_record_min_buffer_size(sample_rate: i32, channel_mask: i32, format: i32) -> i32 { - get_min_buffer_size( - "android/media/AudioRecord", - sample_rate, - channel_mask, - format, - ) -} diff --git a/src/host/aaudio/java_interface.rs b/src/host/aaudio/java_interface.rs index 508496f5e..ab778517e 100644 --- a/src/host/aaudio/java_interface.rs +++ b/src/host/aaudio/java_interface.rs @@ -1,4 +1,5 @@ mod audio_features; +mod audio_manager; mod definitions; mod devices_info; mod utils; diff --git a/src/host/aaudio/java_interface/audio_manager.rs b/src/host/aaudio/java_interface/audio_manager.rs new file mode 100644 index 000000000..efb3bd74b --- /dev/null +++ b/src/host/aaudio/java_interface/audio_manager.rs @@ -0,0 +1,32 @@ +use super::{ + utils::{ + get_context, get_property, get_system_service, with_attached, JNIEnv, JObject, JResult, + }, + AudioManager, Context, +}; + +impl AudioManager { + /** + * Get the frames per buffer using Android Java API + */ + pub fn get_frames_per_buffer() -> Result { + let context = get_context(); + + with_attached(context, |env, context| get_frames_per_buffer(env, &context)) + .map_err(|error| error.to_string()) + } +} + +fn get_frames_per_buffer<'j>(env: &mut JNIEnv<'j>, context: &JObject<'j>) -> JResult { + let audio_manager = get_system_service(env, context, Context::AUDIO_SERVICE)?; + + let frames_per_buffer = get_property( + env, + &audio_manager, + AudioManager::PROPERTY_OUTPUT_FRAMES_PER_BUFFER, + ); + + let frames_per_buffer_string = String::from(env.get_string(&frames_per_buffer)?); + + frames_per_buffer_string.parse::() +} diff --git a/src/host/aaudio/mod.rs b/src/host/aaudio/mod.rs index a1e48964b..40cd122fa 100644 --- a/src/host/aaudio/mod.rs +++ b/src/host/aaudio/mod.rs @@ -1,4 +1,3 @@ -use std::cell::RefCell; use std::cmp; use std::convert::TryInto; use std::time::{Duration, Instant}; @@ -7,14 +6,14 @@ use std::vec::IntoIter as VecIntoIter; extern crate ndk; use convert::{stream_instant, to_stream_instant}; -use java_interface::{AudioDeviceDirection, AudioDeviceInfo}; +use java_interface::{AudioDeviceDirection, AudioDeviceInfo, AudioManager}; use crate::traits::{DeviceTrait, HostTrait, StreamTrait}; use crate::{ BackendSpecificError, BufferSize, BuildStreamError, Data, DefaultStreamConfigError, DeviceNameError, DevicesError, InputCallbackInfo, InputStreamTimestamp, OutputCallbackInfo, OutputStreamTimestamp, PauseStreamError, PlayStreamError, SampleFormat, SampleRate, - SizedSample, StreamConfig, StreamError, SupportedBufferSize, SupportedStreamConfig, + StreamConfig, StreamError, SupportedBufferSize, SupportedStreamConfig, SupportedStreamConfigRange, SupportedStreamConfigsError, }; @@ -22,7 +21,6 @@ mod android_media; mod convert; mod java_interface; -use self::android_media::{get_audio_record_min_buffer_size, get_audio_track_min_buffer_size}; use self::ndk::audio::AudioStream; // Android Java API supports up to 8 channels @@ -91,17 +89,13 @@ impl HostTrait for Host { } } -fn buffer_size_range_for_params( - is_output: bool, - sample_rate: i32, - channel_mask: i32, - android_format: i32, -) -> SupportedBufferSize { - let min_buffer_size = if is_output { - get_audio_track_min_buffer_size(sample_rate, channel_mask, android_format) +fn buffer_size_range() -> SupportedBufferSize { + let min_buffer_size = if let Ok(min_buffer_size) = AudioManager::get_frames_per_buffer() { + min_buffer_size } else { - get_audio_record_min_buffer_size(sample_rate, channel_mask, android_format) + 0 }; + if min_buffer_size > 0 { SupportedBufferSize::Range { min: min_buffer_size as u32, @@ -112,26 +106,16 @@ fn buffer_size_range_for_params( } } -fn default_supported_configs(is_output: bool) -> VecIntoIter { +fn default_supported_configs() -> VecIntoIter { // Have to "brute force" the parameter combinations with getMinBufferSize const FORMATS: [SampleFormat; 2] = [SampleFormat::I16, SampleFormat::F32]; let mut output = Vec::with_capacity(SAMPLE_RATES.len() * CHANNEL_MASKS.len() * FORMATS.len()); for sample_format in &FORMATS { - let android_format = if *sample_format == SampleFormat::I16 { - android_media::ENCODING_PCM_16BIT - } else { - android_media::ENCODING_PCM_FLOAT - }; - for (mask_idx, channel_mask) in CHANNEL_MASKS.iter().enumerate() { + for (mask_idx, _) in CHANNEL_MASKS.iter().enumerate() { let channel_count = mask_idx + 1; for sample_rate in &SAMPLE_RATES { - if let SupportedBufferSize::Range { min, max } = buffer_size_range_for_params( - is_output, - *sample_rate, - *channel_mask, - android_format, - ) { + if let SupportedBufferSize::Range { min, max } = buffer_size_range() { output.push(SupportedStreamConfigRange { channels: channel_count as u16, min_sample_rate: SampleRate(*sample_rate as u32), @@ -147,10 +131,7 @@ fn default_supported_configs(is_output: bool) -> VecIntoIter VecIntoIter { +fn device_supported_configs(device: &AudioDeviceInfo) -> VecIntoIter { let sample_rates = if !device.sample_rates.is_empty() { device.sample_rates.as_slice() } else { @@ -180,19 +161,13 @@ fn device_supported_configs( // TODO: more channels available in native AAudio continue; } - let channel_mask = CHANNEL_MASKS[*channel_count as usize - 1]; for format in formats { - let (android_format, sample_format) = match format { + let (_, sample_format) = match format { SampleFormat::I16 => (android_media::ENCODING_PCM_16BIT, SampleFormat::I16), SampleFormat::F32 => (android_media::ENCODING_PCM_FLOAT, SampleFormat::F32), _ => panic!("Unexpected format"), }; - let buffer_size = buffer_size_range_for_params( - is_output, - *sample_rate, - channel_mask, - android_format, - ); + let buffer_size = buffer_size_range(); output.push(SupportedStreamConfigRange { channels: cmp::min(*channel_count as u16, 2u16), min_sample_rate: SampleRate(*sample_rate as u32), @@ -339,9 +314,9 @@ impl DeviceTrait for Device { &self, ) -> Result { if let Some(info) = &self.0 { - Ok(device_supported_configs(info, false)) + Ok(device_supported_configs(info)) } else { - Ok(default_supported_configs(false)) + Ok(default_supported_configs()) } } @@ -349,9 +324,9 @@ impl DeviceTrait for Device { &self, ) -> Result { if let Some(info) = &self.0 { - Ok(device_supported_configs(info, true)) + Ok(device_supported_configs(info)) } else { - Ok(default_supported_configs(true)) + Ok(default_supported_configs()) } } From 8f8a710718b83610312e832752d86979017fa7f0 Mon Sep 17 00:00:00 2001 From: Will Evans Date: Mon, 27 Oct 2025 11:38:06 +0000 Subject: [PATCH 2/9] Fix error handling --- src/host/aaudio/java_interface/audio_manager.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/host/aaudio/java_interface/audio_manager.rs b/src/host/aaudio/java_interface/audio_manager.rs index efb3bd74b..4f58673fa 100644 --- a/src/host/aaudio/java_interface/audio_manager.rs +++ b/src/host/aaudio/java_interface/audio_manager.rs @@ -1,6 +1,6 @@ use super::{ utils::{ - get_context, get_property, get_system_service, with_attached, JNIEnv, JObject, JResult, + get_context, get_property, get_system_service, with_attached, JNIEnv, JObject, JResult }, AudioManager, Context, }; @@ -24,9 +24,11 @@ fn get_frames_per_buffer<'j>(env: &mut JNIEnv<'j>, context: &JObject<'j>) -> JRe env, &audio_manager, AudioManager::PROPERTY_OUTPUT_FRAMES_PER_BUFFER, - ); + )?; let frames_per_buffer_string = String::from(env.get_string(&frames_per_buffer)?); - frames_per_buffer_string.parse::() + frames_per_buffer_string + .parse::() + .map_err(|e| jni::errors::Error::JniCall(jni::errors::JniError::Unknown)) } From 7a11e1c35866e42f5b246c53718427ee6be53856 Mon Sep 17 00:00:00 2001 From: Will Evans Date: Mon, 27 Oct 2025 11:44:40 +0000 Subject: [PATCH 3/9] fmt --- src/host/aaudio/java_interface/audio_manager.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/host/aaudio/java_interface/audio_manager.rs b/src/host/aaudio/java_interface/audio_manager.rs index 4f58673fa..21cae03bc 100644 --- a/src/host/aaudio/java_interface/audio_manager.rs +++ b/src/host/aaudio/java_interface/audio_manager.rs @@ -1,6 +1,6 @@ use super::{ utils::{ - get_context, get_property, get_system_service, with_attached, JNIEnv, JObject, JResult + get_context, get_property, get_system_service, with_attached, JNIEnv, JObject, JResult, }, AudioManager, Context, }; From 25fb1842ff180c668c510477cd9fd27f59f79938 Mon Sep 17 00:00:00 2001 From: Will Evans Date: Wed, 29 Oct 2025 12:03:14 +0000 Subject: [PATCH 4/9] Address PR comments --- src/host/aaudio/android_media.rs | 2 - .../aaudio/java_interface/audio_manager.rs | 4 +- src/host/aaudio/java_interface/definitions.rs | 4 +- src/host/aaudio/mod.rs | 49 +++++++------------ 4 files changed, 20 insertions(+), 39 deletions(-) diff --git a/src/host/aaudio/android_media.rs b/src/host/aaudio/android_media.rs index 838dee273..e68dd885a 100644 --- a/src/host/aaudio/android_media.rs +++ b/src/host/aaudio/android_media.rs @@ -6,8 +6,6 @@ use self::jni::Executor; use self::jni::{errors::Result as JResult, JNIEnv, JavaVM}; // constants from android.media.AudioFormat -pub const ENCODING_PCM_16BIT: i32 = 2; -pub const ENCODING_PCM_FLOAT: i32 = 4; pub const CHANNEL_OUT_MONO: i32 = 4; pub const CHANNEL_OUT_STEREO: i32 = 12; diff --git a/src/host/aaudio/java_interface/audio_manager.rs b/src/host/aaudio/java_interface/audio_manager.rs index 21cae03bc..56d27a041 100644 --- a/src/host/aaudio/java_interface/audio_manager.rs +++ b/src/host/aaudio/java_interface/audio_manager.rs @@ -6,9 +6,7 @@ use super::{ }; impl AudioManager { - /** - * Get the frames per buffer using Android Java API - */ + /// Get the frames per buffer using Android Java API pub fn get_frames_per_buffer() -> Result { let context = get_context(); diff --git a/src/host/aaudio/java_interface/definitions.rs b/src/host/aaudio/java_interface/definitions.rs index a7eaa6047..a004db389 100644 --- a/src/host/aaudio/java_interface/definitions.rs +++ b/src/host/aaudio/java_interface/definitions.rs @@ -21,10 +21,8 @@ impl PackageManager { pub(crate) struct AudioManager; impl AudioManager { - pub const PROPERTY_OUTPUT_SAMPLE_RATE: &'static str = - "android.media.property.OUTPUT_SAMPLE_RATE"; pub const PROPERTY_OUTPUT_FRAMES_PER_BUFFER: &'static str = - "android.media.property.OUTPUT_FRAMES_PER_BUFFER"; + "android.media.property.OUTPUT_FRAMES_PER_BUFFER"; pub const GET_DEVICES_INPUTS: i32 = 1 << 0; pub const GET_DEVICES_OUTPUTS: i32 = 1 << 1; diff --git a/src/host/aaudio/mod.rs b/src/host/aaudio/mod.rs index 40cd122fa..88019beea 100644 --- a/src/host/aaudio/mod.rs +++ b/src/host/aaudio/mod.rs @@ -25,9 +25,10 @@ use self::ndk::audio::AudioStream; // Android Java API supports up to 8 channels // TODO: more channels available in native AAudio -const CHANNEL_MASKS: [i32; 2] = [ - android_media::CHANNEL_OUT_MONO, - android_media::CHANNEL_OUT_STEREO, +// Maps channel masks to their corresponding channel counts +const CHANNEL_CONFIGS: [(i32, u16); 2] = [ + (android_media::CHANNEL_OUT_MONO, 1), + (android_media::CHANNEL_OUT_STEREO, 2), ]; const SAMPLE_RATES: [i32; 13] = [ @@ -90,13 +91,7 @@ impl HostTrait for Host { } fn buffer_size_range() -> SupportedBufferSize { - let min_buffer_size = if let Ok(min_buffer_size) = AudioManager::get_frames_per_buffer() { - min_buffer_size - } else { - 0 - }; - - if min_buffer_size > 0 { + if let Ok(min_buffer_size) = AudioManager::get_frames_per_buffer() { SupportedBufferSize::Range { min: min_buffer_size as u32, max: i32::MAX as u32, @@ -107,23 +102,20 @@ fn buffer_size_range() -> SupportedBufferSize { } fn default_supported_configs() -> VecIntoIter { - // Have to "brute force" the parameter combinations with getMinBufferSize const FORMATS: [SampleFormat; 2] = [SampleFormat::I16, SampleFormat::F32]; - let mut output = Vec::with_capacity(SAMPLE_RATES.len() * CHANNEL_MASKS.len() * FORMATS.len()); + let buffer_size = buffer_size_range(); + let mut output = Vec::with_capacity(SAMPLE_RATES.len() * CHANNEL_CONFIGS.len() * FORMATS.len()); for sample_format in &FORMATS { - for (mask_idx, _) in CHANNEL_MASKS.iter().enumerate() { - let channel_count = mask_idx + 1; + for (_channel_mask, channel_count) in &CHANNEL_CONFIGS { for sample_rate in &SAMPLE_RATES { - if let SupportedBufferSize::Range { min, max } = buffer_size_range() { - output.push(SupportedStreamConfigRange { - channels: channel_count as u16, - min_sample_rate: SampleRate(*sample_rate as u32), - max_sample_rate: SampleRate(*sample_rate as u32), - buffer_size: SupportedBufferSize::Range { min, max }, - sample_format: *sample_format, - }); - } + output.push(SupportedStreamConfigRange { + channels: *channel_count, + min_sample_rate: SampleRate(*sample_rate as u32), + max_sample_rate: SampleRate(*sample_rate as u32), + buffer_size: buffer_size.clone(), + sample_format: *sample_format, + }); } } } @@ -152,6 +144,7 @@ fn device_supported_configs(device: &AudioDeviceInfo) -> VecIntoIter VecIntoIter (android_media::ENCODING_PCM_16BIT, SampleFormat::I16), - SampleFormat::F32 => (android_media::ENCODING_PCM_FLOAT, SampleFormat::F32), - _ => panic!("Unexpected format"), - }; - let buffer_size = buffer_size_range(); output.push(SupportedStreamConfigRange { channels: cmp::min(*channel_count as u16, 2u16), min_sample_rate: SampleRate(*sample_rate as u32), max_sample_rate: SampleRate(*sample_rate as u32), - buffer_size, - sample_format, + buffer_size: buffer_size.clone(), + sample_format: *format, }); } } From b31029a3de4cc5a44fcaeeea00a4341e90b1d848 Mon Sep 17 00:00:00 2001 From: Will Evans Date: Wed, 29 Oct 2025 12:03:51 +0000 Subject: [PATCH 5/9] fmt --- src/host/aaudio/java_interface/definitions.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/host/aaudio/java_interface/definitions.rs b/src/host/aaudio/java_interface/definitions.rs index a004db389..b2e35c522 100644 --- a/src/host/aaudio/java_interface/definitions.rs +++ b/src/host/aaudio/java_interface/definitions.rs @@ -22,7 +22,7 @@ pub(crate) struct AudioManager; impl AudioManager { pub const PROPERTY_OUTPUT_FRAMES_PER_BUFFER: &'static str = - "android.media.property.OUTPUT_FRAMES_PER_BUFFER"; + "android.media.property.OUTPUT_FRAMES_PER_BUFFER"; pub const GET_DEVICES_INPUTS: i32 = 1 << 0; pub const GET_DEVICES_OUTPUTS: i32 = 1 << 1; From 2b19dd8ecd32d2f8b2b256549566d0f1e1f9da9a Mon Sep 17 00:00:00 2001 From: Will Evans Date: Thu, 30 Oct 2025 09:29:10 +0000 Subject: [PATCH 6/9] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf88d2465..09c909953 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ - Add `Sample::bits_per_sample` method. - Update `audio_thread_priority` to 0.34. - AAudio: Configure buffer to ensure consistent callback buffer sizes. +- AAudio: Fix the buffer size range detection by querying the AudioService property correctly. - ALSA: Improve `BufferSize::Fixed` precision and audio callback performance. - ALSA: Change `BufferSize::Default` to use the device defaults. - ALSA: Change card enumeration to work like `aplay -L` does. From c3239fe8b6d2efb41ce1cc71a70e1ae85d3d9fb5 Mon Sep 17 00:00:00 2001 From: Will Evans Date: Wed, 12 Nov 2025 11:51:16 +0000 Subject: [PATCH 7/9] Fixes --- Cargo.toml | 1 + src/host/aaudio/android_media.rs | 19 ------------------- .../aaudio/java_interface/audio_manager.rs | 9 ++++++--- src/host/aaudio/mod.rs | 10 +++++----- 4 files changed, 12 insertions(+), 27 deletions(-) delete mode 100644 src/host/aaudio/android_media.rs diff --git a/Cargo.toml b/Cargo.toml index 0ff38048c..c8706dbb3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,7 @@ asio = [ ] # Only available on Windows. See README for setup instructions. [dependencies] +combine = "4.6.7" dasp_sample = "0.11" [dev-dependencies] diff --git a/src/host/aaudio/android_media.rs b/src/host/aaudio/android_media.rs deleted file mode 100644 index e68dd885a..000000000 --- a/src/host/aaudio/android_media.rs +++ /dev/null @@ -1,19 +0,0 @@ -use std::sync::Arc; - -extern crate jni; - -use self::jni::Executor; -use self::jni::{errors::Result as JResult, JNIEnv, JavaVM}; - -// constants from android.media.AudioFormat -pub const CHANNEL_OUT_MONO: i32 = 4; -pub const CHANNEL_OUT_STEREO: i32 = 12; - -fn with_attached(closure: F) -> JResult -where - F: FnOnce(&mut JNIEnv) -> JResult, -{ - let android_context = ndk_context::android_context(); - let vm = Arc::new(unsafe { JavaVM::from_raw(android_context.vm().cast())? }); - Executor::new(vm).with_attached(|env| closure(env)) -} diff --git a/src/host/aaudio/java_interface/audio_manager.rs b/src/host/aaudio/java_interface/audio_manager.rs index 56d27a041..9e9e79b36 100644 --- a/src/host/aaudio/java_interface/audio_manager.rs +++ b/src/host/aaudio/java_interface/audio_manager.rs @@ -26,7 +26,10 @@ fn get_frames_per_buffer<'j>(env: &mut JNIEnv<'j>, context: &JObject<'j>) -> JRe let frames_per_buffer_string = String::from(env.get_string(&frames_per_buffer)?); - frames_per_buffer_string - .parse::() - .map_err(|e| jni::errors::Error::JniCall(jni::errors::JniError::Unknown)) + frames_per_buffer_string.parse::().map_err(|e| { + jni::errors::Error::ParseFailed( + combine::error::StringStreamError::UnexpectedParse, + format!("Failed to parse frames per buffer: {}", e), + ) + }) } diff --git a/src/host/aaudio/mod.rs b/src/host/aaudio/mod.rs index 88019beea..5fbf4330a 100644 --- a/src/host/aaudio/mod.rs +++ b/src/host/aaudio/mod.rs @@ -17,19 +17,19 @@ use crate::{ SupportedStreamConfigRange, SupportedStreamConfigsError, }; -mod android_media; mod convert; mod java_interface; use self::ndk::audio::AudioStream; +// constants from android.media.AudioFormat +const CHANNEL_OUT_MONO: i32 = 4; +const CHANNEL_OUT_STEREO: i32 = 12; + // Android Java API supports up to 8 channels // TODO: more channels available in native AAudio // Maps channel masks to their corresponding channel counts -const CHANNEL_CONFIGS: [(i32, u16); 2] = [ - (android_media::CHANNEL_OUT_MONO, 1), - (android_media::CHANNEL_OUT_STEREO, 2), -]; +const CHANNEL_CONFIGS: [(i32, u16); 2] = [(CHANNEL_OUT_MONO, 1), (CHANNEL_OUT_STEREO, 2)]; const SAMPLE_RATES: [i32; 13] = [ 5512, 8000, 11025, 16000, 22050, 32000, 44100, 48000, 64000, 88200, 96000, 176_400, 192_000, From f18aa74ec3552348c89c822d633715ad662d0145 Mon Sep 17 00:00:00 2001 From: Will Evans Date: Thu, 13 Nov 2025 10:47:00 +0000 Subject: [PATCH 8/9] Add a TODO for better error handling --- Cargo.toml | 1 - src/host/aaudio/java_interface/audio_manager.rs | 8 ++------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index c8706dbb3..0ff38048c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,6 @@ asio = [ ] # Only available on Windows. See README for setup instructions. [dependencies] -combine = "4.6.7" dasp_sample = "0.11" [dev-dependencies] diff --git a/src/host/aaudio/java_interface/audio_manager.rs b/src/host/aaudio/java_interface/audio_manager.rs index 9e9e79b36..f79c34d2f 100644 --- a/src/host/aaudio/java_interface/audio_manager.rs +++ b/src/host/aaudio/java_interface/audio_manager.rs @@ -26,10 +26,6 @@ fn get_frames_per_buffer<'j>(env: &mut JNIEnv<'j>, context: &JObject<'j>) -> JRe let frames_per_buffer_string = String::from(env.get_string(&frames_per_buffer)?); - frames_per_buffer_string.parse::().map_err(|e| { - jni::errors::Error::ParseFailed( - combine::error::StringStreamError::UnexpectedParse, - format!("Failed to parse frames per buffer: {}", e), - ) - }) + // TODO: Use jni::errors::Error::ParseFailed instead of jni::errors::Error::JniCall once jni > v0.21.1 is released + frames_per_buffer_string.parse::().map_err(|e| jni::errors::Error::JniCall(jni::errors::JniError::Unknown)) } From 228a24af062afa2d160ca6ac983e60a7254f59c4 Mon Sep 17 00:00:00 2001 From: Will Evans Date: Thu, 13 Nov 2025 10:49:10 +0000 Subject: [PATCH 9/9] Fmt --- src/host/aaudio/java_interface/audio_manager.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/host/aaudio/java_interface/audio_manager.rs b/src/host/aaudio/java_interface/audio_manager.rs index f79c34d2f..2f8d386e7 100644 --- a/src/host/aaudio/java_interface/audio_manager.rs +++ b/src/host/aaudio/java_interface/audio_manager.rs @@ -27,5 +27,7 @@ fn get_frames_per_buffer<'j>(env: &mut JNIEnv<'j>, context: &JObject<'j>) -> JRe let frames_per_buffer_string = String::from(env.get_string(&frames_per_buffer)?); // TODO: Use jni::errors::Error::ParseFailed instead of jni::errors::Error::JniCall once jni > v0.21.1 is released - frames_per_buffer_string.parse::().map_err(|e| jni::errors::Error::JniCall(jni::errors::JniError::Unknown)) + frames_per_buffer_string + .parse::() + .map_err(|e| jni::errors::Error::JniCall(jni::errors::JniError::Unknown)) }