wip: refactor pt.19: 22 errors

This commit is contained in:
🪞👃🪞 2024-11-11 15:18:56 +01:00
parent 2be2c8aca2
commit 914c2d6c09
12 changed files with 78 additions and 61 deletions

View file

@ -1,51 +1,50 @@
use crate::*;
pub struct SequencerAudio {
transport: Arc<RwLock<Transport>>,
player: Arc<RwLock<MIDIPlayer>>,
}
pub struct SequencerAppAudio<'a>(&'a mut Transport, &'a mut MIDIPlayer);
/// JACK process callback for sequencer app
impl Audio for SequencerAudio {
impl<'a> Audio for SequencerAppAudio<'a> {
fn process (&mut self, client: &Client, scope: &ProcessScope) -> Control {
self.transport.write().unwrap().process(client, scope);
self.player.write().unwrap().process(client, scope);
if TransportAudio::from(&mut*self.0).process(client, scope) == Control::Quit {
return Control::Quit
}
if MIDIPlayerAudio::from(&mut*self.1).process(client, scope) == Control::Quit {
return Control::Quit
}
Control::Continue
}
}
pub struct MIDIPlayerAudio {
model: Arc<RwLock<MIDIPlayer>>
}
pub struct MIDIPlayerAudio<'a>(&'a mut MIDIPlayer);
impl From<&Arc<RwLock<MIDIPlayer>>> for MIDIPlayerAudio {
fn from (model: &Arc<RwLock<MIDIPlayer>>) -> Self {
Self { model: model.clone() }
impl<'a> From<&'a mut MIDIPlayer> for MIDIPlayerAudio<'a> {
fn from (model: &'a mut MIDIPlayer) -> Self {
Self(model)
}
}
/// JACK process callback for a sequencer's phrase player/recorder.
impl Audio for MIDIPlayer {
impl<'a> Audio for MIDIPlayerAudio<'a> {
fn process (&mut self, _: &Client, scope: &ProcessScope) -> Control {
let has_midi_outputs = self.has_midi_outputs();
let has_midi_inputs = self.has_midi_inputs();
let has_midi_outputs = self.0.has_midi_outputs();
let has_midi_inputs = self.0.has_midi_inputs();
// Clear output buffer(s)
self.clear(scope, false);
self.0.clear(scope, false);
// Write chunk of phrase to output, handle switchover
if self.play(scope) {
self.switchover(scope);
if self.0.play(scope) {
self.0.switchover(scope);
}
if has_midi_inputs {
if self.recording || self.monitoring {
if self.0.recording || self.0.monitoring {
// Record and/or monitor input
self.record(scope)
} else if has_midi_outputs && self.monitoring {
self.0.record(scope)
} else if has_midi_outputs && self.0.monitoring {
// Monitor input to output
self.monitor(scope)
self.0.monitor(scope)
}
}
// Write to output port(s)
self.write(scope);
self.0.write(scope);
Control::Continue
}
}