mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 12:16:42 +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.note_start = 12;
|
||||
let client = jack.as_client();
|
||||
for track in state.tracks.iter() {
|
||||
if let Some(port) = track.midi_ins()?.get(0) {
|
||||
client.connect_ports(&track.midi_out, port)?;
|
||||
}
|
||||
}
|
||||
//for track in state.tracks.iter() {
|
||||
//if let Some(port) = track.midi_ins()?.get(0) {
|
||||
//client.connect_ports(&track.midi_out, port)?;
|
||||
//}
|
||||
//}
|
||||
state.midi_in = Some(client.register_port("midi-in", MidiIn)?);
|
||||
state.transport = Some(client.transport());
|
||||
state.playing = Some(TransportState::Stopped);
|
||||
|
|
|
|||
|
|
@ -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) => {
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue