Merge pull request #114 from jansol/coreaudio
coreaudio: update to coreaudio-rs 0.5.0
This commit is contained in:
commit
0cf5d306a0
|
@ -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"
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue