mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-08 20:56:43 +01:00
remove DynamicDevice from sampler (deadlocks)
This commit is contained in:
parent
e86be4facc
commit
a103818a2e
2 changed files with 35 additions and 38 deletions
10
src/main.rs
10
src/main.rs
|
|
@ -71,11 +71,11 @@ pub fn main () -> Usually<()> {
|
||||||
state.scene_cursor = 1;
|
state.scene_cursor = 1;
|
||||||
state.note_start = 12;
|
state.note_start = 12;
|
||||||
let client = jack.as_client();
|
let client = jack.as_client();
|
||||||
for track in state.tracks.iter() {
|
//for track in state.tracks.iter() {
|
||||||
if let Some(port) = track.midi_ins()?.get(0) {
|
//if let Some(port) = track.midi_ins()?.get(0) {
|
||||||
client.connect_ports(&track.midi_out, port)?;
|
//client.connect_ports(&track.midi_out, port)?;
|
||||||
}
|
//}
|
||||||
}
|
//}
|
||||||
state.midi_in = Some(client.register_port("midi-in", MidiIn)?);
|
state.midi_in = Some(client.register_port("midi-in", MidiIn)?);
|
||||||
state.transport = Some(client.transport());
|
state.transport = Some(client.transport());
|
||||||
state.playing = Some(TransportState::Stopped);
|
state.playing = Some(TransportState::Stopped);
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@ pub struct Sample {
|
||||||
|
|
||||||
pub struct Sampler {
|
pub struct Sampler {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
|
pub jack: Client,
|
||||||
pub cursor: (usize, usize),
|
pub cursor: (usize, usize),
|
||||||
pub samples: BTreeMap<u7, Arc<Sample>>,
|
pub samples: BTreeMap<u7, Arc<Sample>>,
|
||||||
pub voices: Vec<Voice>,
|
pub voices: Vec<Voice>,
|
||||||
|
|
@ -61,32 +62,38 @@ impl Sample {
|
||||||
Voice { sample: self.clone(), after, position: self.start }
|
Voice { sample: self.clone(), after, position: self.start }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
render!(Sampler = crate::view::sampler::render);
|
||||||
|
handle!(Sampler = crate::control::sampler::handle);
|
||||||
|
process!(Sampler = Sampler::process);
|
||||||
|
ports!(Sampler {
|
||||||
|
audio: {
|
||||||
|
ins: |s|Ok(s.audio_ins.iter().collect()),
|
||||||
|
outs: |s|Ok(s.audio_outs.iter().collect()),
|
||||||
|
}
|
||||||
|
midi: { ins: |s|Ok(vec![&s.midi_in]), }
|
||||||
|
});
|
||||||
|
|
||||||
impl Sampler {
|
impl Sampler {
|
||||||
pub fn new (
|
pub fn new (
|
||||||
name: &str,
|
name: &str, samples: Option<BTreeMap<u7, Arc<Sample>>>,
|
||||||
samples: Option<BTreeMap<u7, Arc<Sample>>>,
|
) -> Usually<Self> {
|
||||||
) -> Result<DynamicDevice<Self>, Box<dyn Error>> {
|
let (jack, _) = Client::new(name, ClientOptions::NO_START_SERVER)?;
|
||||||
let (client, _) = Client::new(name, ClientOptions::NO_START_SERVER)?;
|
Ok(Self {
|
||||||
DynamicDevice::new(
|
|
||||||
crate::view::sampler::render,
|
|
||||||
crate::control::sampler::handle,
|
|
||||||
Self::process,
|
|
||||||
Self {
|
|
||||||
name: name.into(),
|
name: name.into(),
|
||||||
cursor: (0, 0),
|
cursor: (0, 0),
|
||||||
samples: samples.unwrap_or(BTreeMap::new()),
|
samples: samples.unwrap_or(BTreeMap::new()),
|
||||||
voices: vec![],
|
voices: vec![],
|
||||||
midi_in: client.register_port("midi", ::jack::MidiIn::default())?,
|
midi_in: jack.register_port("midi", MidiIn::default())?,
|
||||||
audio_ins: vec![
|
audio_ins: vec![
|
||||||
client.register_port("recL", ::jack::AudioIn::default())?,
|
jack.register_port("recL", AudioIn::default())?,
|
||||||
client.register_port("recR", ::jack::AudioIn::default())?,
|
jack.register_port("recR", AudioIn::default())?,
|
||||||
],
|
],
|
||||||
audio_outs: vec![
|
audio_outs: vec![
|
||||||
client.register_port("outL", ::jack::AudioOut::default())?,
|
jack.register_port("outL", AudioOut::default())?,
|
||||||
client.register_port("outR", ::jack::AudioOut::default())?,
|
jack.register_port("outR", AudioOut::default())?,
|
||||||
],
|
],
|
||||||
}).activate(client)
|
jack
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn process (&mut self, _: &Client, scope: &ProcessScope) -> Control {
|
pub fn process (&mut self, _: &Client, scope: &ProcessScope) -> Control {
|
||||||
|
|
@ -135,16 +142,6 @@ impl Sampler {
|
||||||
fn load_sample (&mut self, _path: &str) {}
|
fn load_sample (&mut self, _path: &str) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
ports!(Sampler {
|
|
||||||
audio: {
|
|
||||||
ins: |sampler|Ok(sampler.audio_ins.iter().collect()),
|
|
||||||
outs: |sampler|Ok(sampler.audio_outs.iter().collect()),
|
|
||||||
}
|
|
||||||
midi: {
|
|
||||||
ins: |sampler|Ok(vec![&sampler.midi_in]),
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
#[macro_export] macro_rules! sample {
|
#[macro_export] macro_rules! sample {
|
||||||
($note:expr, $name:expr, $src:expr) => {
|
($note:expr, $name:expr, $src:expr) => {
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue