tek/src/device/track.rs
2024-07-04 01:36:32 +03:00

46 lines
1.4 KiB
Rust

use crate::core::*;
use crate::device::*;
use crate::layout::*;
pub struct Track {
pub name: String,
pub sequencer: DynamicDevice<Sequencer>,
pub chain: DynamicDevice<Chain>,
}
impl Track {
pub fn new (
name: &str,
tempo: &Arc<Timebase>,
devices: Option<Vec<Box<dyn Device>>>,
phrases: Option<Vec<Phrase>>,
) -> Usually<Self> {
let sequencer = Sequencer::new(&name, tempo, phrases)?;
let chain = Chain::new(&name, devices)?;
{
if let (Some(output), Some(input)) = (
sequencer.midi_outs()?.get(0).clone(),
if let Some(item) = chain.state().items.get(0) {
if let Some(port) = item.midi_ins()?.get(0) {
Some(port.clone())
} else {
None
}
} else {
None
}
) {
if let Some(client) = &sequencer.client {
client.as_client().connect_ports_by_name(&output, &input)?;
}
}
}
Ok(Self { name: name.to_string(), sequencer, chain })
}
}
impl PortList for Track {
fn midi_ins (&self) -> Usually<Vec<String>> {
self.sequencer.midi_ins()
}
fn audio_outs (&self) -> Usually<Vec<String>> {
self.chain.audio_outs()
}
}