remove DynamicDevice from sampler (deadlocks)

This commit is contained in:
🪞👃🪞 2024-07-03 21:09:12 +03:00
parent e86be4facc
commit a103818a2e
2 changed files with 35 additions and 38 deletions

View file

@ -15,6 +15,7 @@ pub struct Sample {
pub struct Sampler {
pub name: String,
pub jack: Client,
pub cursor: (usize, usize),
pub samples: BTreeMap<u7, Arc<Sample>>,
pub voices: Vec<Voice>,
@ -61,32 +62,38 @@ impl Sample {
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 {
pub fn new (
name: &str,
samples: Option<BTreeMap<u7, Arc<Sample>>>,
) -> Result<DynamicDevice<Self>, Box<dyn Error>> {
let (client, _) = Client::new(name, ClientOptions::NO_START_SERVER)?;
DynamicDevice::new(
crate::view::sampler::render,
crate::control::sampler::handle,
Self::process,
Self {
name: name.into(),
cursor: (0, 0),
samples: samples.unwrap_or(BTreeMap::new()),
voices: vec![],
midi_in: client.register_port("midi", ::jack::MidiIn::default())?,
audio_ins: vec![
client.register_port("recL", ::jack::AudioIn::default())?,
client.register_port("recR", ::jack::AudioIn::default())?,
],
audio_outs: vec![
client.register_port("outL", ::jack::AudioOut::default())?,
client.register_port("outR", ::jack::AudioOut::default())?,
],
}).activate(client)
name: &str, samples: Option<BTreeMap<u7, Arc<Sample>>>,
) -> Usually<Self> {
let (jack, _) = Client::new(name, ClientOptions::NO_START_SERVER)?;
Ok(Self {
name: name.into(),
cursor: (0, 0),
samples: samples.unwrap_or(BTreeMap::new()),
voices: vec![],
midi_in: jack.register_port("midi", MidiIn::default())?,
audio_ins: vec![
jack.register_port("recL", AudioIn::default())?,
jack.register_port("recR", AudioIn::default())?,
],
audio_outs: vec![
jack.register_port("outL", AudioOut::default())?,
jack.register_port("outR", AudioOut::default())?,
],
jack
})
}
pub fn process (&mut self, _: &Client, scope: &ProcessScope) -> Control {
@ -135,16 +142,6 @@ impl Sampler {
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 {
($note:expr, $name:expr, $src:expr) => {
{