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

@ -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);

View file

@ -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) => {
{ {