coreaudio: update to coreaudio-rs 0.5.0

This commit is contained in:
Jan Solanti 2016-07-05 23:54:03 +03:00
parent 7e4f9f00d1
commit f717817c86
2 changed files with 12 additions and 8 deletions

View File

@ -32,7 +32,7 @@ version = "0"
path = "alsa-sys" path = "alsa-sys"
[target.x86_64-apple-darwin.dependencies] [target.x86_64-apple-darwin.dependencies]
coreaudio-rs = "~0.4.0" coreaudio-rs = "~0.5.0"
[dev-dependencies] [dev-dependencies]
vorbis = "0" vorbis = "0"

View File

@ -1,4 +1,4 @@
extern crate coreaudio_rs as coreaudio; extern crate coreaudio;
extern crate libc; extern crate libc;
use std::sync::mpsc::{channel, Sender, Receiver}; use std::sync::mpsc::{channel, Sender, Receiver};
@ -23,6 +23,7 @@ pub use self::enumerate::{EndpointsIterator,
get_default_endpoint}; get_default_endpoint};
use self::coreaudio::audio_unit::{AudioUnit, IOType}; use self::coreaudio::audio_unit::{AudioUnit, IOType};
use self::coreaudio::audio_unit::render_callback::{self, data};
#[derive(Clone, PartialEq, Eq)] #[derive(Clone, PartialEq, Eq)]
pub struct Endpoint; pub struct Endpoint;
@ -110,21 +111,24 @@ impl Voice {
let audio_unit_result = AudioUnit::new(IOType::HalOutput); let audio_unit_result = AudioUnit::new(IOType::HalOutput);
if let Ok(mut audio_unit) = audio_unit_result { if let Ok(mut audio_unit) = audio_unit_result {
if let Ok(()) = audio_unit.set_render_callback(Some(Box::new(move |channels: &mut[&mut[f32]], num_frames: NumFrames| { // TODO: iOS uses integer and fixed-point data
if let Err(_) = ready_sender.send((channels.len(), num_frames)) { if let Ok(()) = audio_unit.set_render_callback(move |args: render_callback::Args<data::NonInterleaved<f32>>| {
return Err("Callback failed to send 'ready' message.".to_string()); let render_callback::Args { num_frames, mut data, .. } = args;
let num_channels = data.channels().count();
if let Err(_) = ready_sender.send((num_channels, num_frames)) {
return Err(());
} }
loop { loop {
if let Ok((samples, num_channels)) = samples_receiver.try_recv() { if let Ok((samples, num_channels)) = samples_receiver.try_recv() {
let samples: Vec<f32> = samples; let samples: Vec<f32> = samples;
if let Ok(uf) = uf_clone.lock() { if let Ok(uf) = uf_clone.lock() {
*(uf.borrow_mut()) = num_frames > samples.len() / num_channels; *(uf.borrow_mut()) = num_frames > samples.len() / num_channels;
} else { return Err("Couldn't lock underflow flag field.".to_string()) } } else { return Err(()) }
pending_samples_c.fetch_sub(samples.len(), Ordering::SeqCst); pending_samples_c.fetch_sub(samples.len(), Ordering::SeqCst);
for (i, frame) in samples.chunks(num_channels).enumerate() { for (i, frame) in samples.chunks(num_channels).enumerate() {
for (channel, sample) in channels.iter_mut().zip(frame.iter()) { for (channel, sample) in data.channels_mut().zip(frame.iter()) {
channel[i] = *sample; channel[i] = *sample;
} }
} }
@ -134,7 +138,7 @@ impl Voice {
} }
Ok(()) Ok(())
}))) { }) {
if let Ok(()) = audio_unit.start() { if let Ok(()) = audio_unit.start() {
return Ok(Voice { return Ok(Voice {
audio_unit: audio_unit, audio_unit: audio_unit,