Voice Rework -- Events, Track Queues (#806)
This implements a proof-of-concept for an improved audio frontend. The largest change is the introduction of events and event handling: both by time elapsed and by track events, such as ending or looping. Following on from this, the library now includes a basic, event-driven track queue system (which people seem to ask for unusually often). A new sample, `examples/13_voice_events`, demonstrates both the `TrackQueue` system and some basic events via the `~queue` and `~play_fade` commands. Locks are removed from around the control of `Audio` objects, which should allow the backend to be moved to a more granular futures-based backend solution in a cleaner way.
This commit is contained in:
38
src/input/child.rs
Normal file
38
src/input/child.rs
Normal file
@@ -0,0 +1,38 @@
|
||||
use super::*;
|
||||
use std::{
|
||||
io::{BufReader, Read},
|
||||
process::Child,
|
||||
};
|
||||
use tracing::debug;
|
||||
|
||||
/// Handle for a child process which ensures that any subprocesses are properly closed
|
||||
/// on drop.
|
||||
#[derive(Debug)]
|
||||
pub struct ChildContainer(Child);
|
||||
|
||||
pub(crate) fn child_to_reader<T>(child: Child) -> Reader {
|
||||
Reader::Pipe(BufReader::with_capacity(
|
||||
STEREO_FRAME_SIZE * mem::size_of::<T>() * CHILD_BUFFER_LEN,
|
||||
ChildContainer(child),
|
||||
))
|
||||
}
|
||||
|
||||
impl From<Child> for Reader {
|
||||
fn from(container: Child) -> Self {
|
||||
child_to_reader::<f32>(container)
|
||||
}
|
||||
}
|
||||
|
||||
impl Read for ChildContainer {
|
||||
fn read(&mut self, buffer: &mut [u8]) -> IoResult<usize> {
|
||||
self.0.stdout.as_mut().unwrap().read(buffer)
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for ChildContainer {
|
||||
fn drop(&mut self) {
|
||||
if let Err(e) = self.0.kill() {
|
||||
debug!("Error awaiting child process: {:?}", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user