mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-08-06 11:59:51 +08:00
feat(native): mix the input and output audio (#11037)
This commit is contained in:
@@ -1,66 +1,35 @@
|
||||
use std::{mem, ptr};
|
||||
use std::ptr;
|
||||
|
||||
use core_foundation::{base::TCFType, string::CFString};
|
||||
use coreaudio::sys::{
|
||||
kAudioDevicePropertyDeviceUID, kAudioHardwareNoError, kAudioObjectPropertyElementMain,
|
||||
kAudioObjectPropertyScopeGlobal, kAudioObjectSystemObject, AudioDeviceID,
|
||||
AudioObjectGetPropertyData, AudioObjectID, AudioObjectPropertyAddress, CFStringRef,
|
||||
kAudioDevicePropertyDeviceUID, kAudioObjectSystemObject, AudioDeviceID, AudioObjectID,
|
||||
CFStringRef,
|
||||
};
|
||||
|
||||
use crate::error::CoreAudioError;
|
||||
use crate::{error::CoreAudioError, utils::get_global_main_property};
|
||||
|
||||
pub(crate) fn get_device_uid(
|
||||
device_id: AudioDeviceID,
|
||||
) -> std::result::Result<CFString, CoreAudioError> {
|
||||
let system_output_id = get_device_audio_id(device_id)?;
|
||||
let address = AudioObjectPropertyAddress {
|
||||
mSelector: kAudioDevicePropertyDeviceUID,
|
||||
mScope: kAudioObjectPropertyScopeGlobal,
|
||||
mElement: kAudioObjectPropertyElementMain,
|
||||
};
|
||||
|
||||
) -> std::result::Result<(AudioObjectID, CFString), CoreAudioError> {
|
||||
let system_audio_id = get_device_audio_id(device_id)?;
|
||||
let mut output_uid: CFStringRef = ptr::null_mut();
|
||||
let mut data_size = mem::size_of::<CFStringRef>();
|
||||
let status = unsafe {
|
||||
AudioObjectGetPropertyData(
|
||||
system_output_id,
|
||||
&address,
|
||||
0,
|
||||
ptr::null_mut(),
|
||||
(&mut data_size as *mut usize).cast(),
|
||||
(&mut output_uid as *mut CFStringRef).cast(),
|
||||
)
|
||||
};
|
||||
get_global_main_property(
|
||||
system_audio_id,
|
||||
kAudioDevicePropertyDeviceUID,
|
||||
&mut output_uid,
|
||||
)?;
|
||||
|
||||
if status != 0 {
|
||||
return Err(CoreAudioError::GetDeviceUidFailed(status));
|
||||
}
|
||||
Ok(unsafe { CFString::wrap_under_create_rule(output_uid.cast()) })
|
||||
Ok((system_audio_id, unsafe {
|
||||
CFString::wrap_under_create_rule(output_uid.cast())
|
||||
}))
|
||||
}
|
||||
|
||||
pub(crate) fn get_device_audio_id(
|
||||
device_id: AudioDeviceID,
|
||||
) -> std::result::Result<AudioObjectID, CoreAudioError> {
|
||||
let mut system_output_id: AudioObjectID = 0;
|
||||
let mut data_size = mem::size_of::<AudioObjectID>();
|
||||
|
||||
let address = AudioObjectPropertyAddress {
|
||||
mSelector: device_id,
|
||||
mScope: kAudioObjectPropertyScopeGlobal,
|
||||
mElement: kAudioObjectPropertyElementMain,
|
||||
};
|
||||
let status = unsafe {
|
||||
AudioObjectGetPropertyData(
|
||||
kAudioObjectSystemObject,
|
||||
&address,
|
||||
0,
|
||||
ptr::null_mut(),
|
||||
(&mut data_size as *mut usize).cast(),
|
||||
(&mut system_output_id as *mut AudioObjectID).cast(),
|
||||
)
|
||||
};
|
||||
if status != kAudioHardwareNoError as i32 {
|
||||
return Err(CoreAudioError::GetDefaultDeviceFailed(status));
|
||||
}
|
||||
get_global_main_property(kAudioObjectSystemObject, device_id, &mut system_output_id)?;
|
||||
|
||||
Ok(system_output_id)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user