Fix: audio engine fixes
This commit is contained in:
@@ -225,7 +225,7 @@ impl App {
|
||||
}
|
||||
let _ = audio_tx
|
||||
.load()
|
||||
.send(crate::engine::AudioCommand::Evaluate { cmd, time: None });
|
||||
.send(crate::engine::AudioCommand::Evaluate { cmd, tick: None });
|
||||
}
|
||||
Ok(if print_output.is_empty() {
|
||||
None
|
||||
|
||||
@@ -454,12 +454,12 @@ pub fn build_stream(
|
||||
|
||||
while let Ok(cmd) = audio_rx.try_recv() {
|
||||
match cmd {
|
||||
AudioCommand::Evaluate { cmd, time } => {
|
||||
let cmd_ref = match time {
|
||||
AudioCommand::Evaluate { cmd, tick } => {
|
||||
let cmd_ref = match tick {
|
||||
Some(t) => {
|
||||
cmd_buffer.clear();
|
||||
use std::fmt::Write;
|
||||
let _ = write!(&mut cmd_buffer, "{cmd}/time/{t:.6}");
|
||||
let _ = write!(&mut cmd_buffer, "{cmd}/tick/{t}");
|
||||
cmd_buffer.as_str()
|
||||
}
|
||||
None => &cmd,
|
||||
|
||||
@@ -49,7 +49,7 @@ impl PatternChange {
|
||||
}
|
||||
|
||||
pub enum AudioCommand {
|
||||
Evaluate { cmd: String, time: Option<f64> },
|
||||
Evaluate { cmd: String, tick: Option<u64> },
|
||||
Hush,
|
||||
Panic,
|
||||
LoadSamples(Vec<doux::sampling::SampleEntry>),
|
||||
@@ -521,7 +521,8 @@ pub struct TickInput {
|
||||
pub fill: bool,
|
||||
pub nudge_secs: f64,
|
||||
pub current_time_us: SyncTime,
|
||||
pub engine_time: f64,
|
||||
pub audio_sample_pos: u64,
|
||||
pub sr: f64,
|
||||
pub mouse_x: f64,
|
||||
pub mouse_y: f64,
|
||||
pub mouse_down: f64,
|
||||
@@ -529,7 +530,7 @@ pub struct TickInput {
|
||||
|
||||
pub struct TimestampedCommand {
|
||||
pub cmd: String,
|
||||
pub time: Option<f64>,
|
||||
pub tick: Option<u64>,
|
||||
}
|
||||
|
||||
pub struct TickOutput {
|
||||
@@ -774,7 +775,8 @@ impl SequencerState {
|
||||
input.fill,
|
||||
input.nudge_secs,
|
||||
input.current_time_us,
|
||||
input.engine_time,
|
||||
input.audio_sample_pos,
|
||||
input.sr,
|
||||
input.mouse_x,
|
||||
input.mouse_y,
|
||||
input.mouse_down,
|
||||
@@ -788,7 +790,8 @@ impl SequencerState {
|
||||
input.quantum,
|
||||
input.fill,
|
||||
input.nudge_secs,
|
||||
input.engine_time,
|
||||
input.audio_sample_pos,
|
||||
input.sr,
|
||||
input.mouse_x,
|
||||
input.mouse_y,
|
||||
input.mouse_down,
|
||||
@@ -922,7 +925,8 @@ impl SequencerState {
|
||||
fill: bool,
|
||||
nudge_secs: f64,
|
||||
_current_time_us: SyncTime,
|
||||
engine_time: f64,
|
||||
audio_sample_pos: u64,
|
||||
sr: f64,
|
||||
mouse_x: f64,
|
||||
mouse_y: f64,
|
||||
mouse_down: f64,
|
||||
@@ -969,7 +973,7 @@ impl SequencerState {
|
||||
} else {
|
||||
0.0
|
||||
};
|
||||
let event_time = Some(engine_time + time_delta);
|
||||
let event_tick = Some(audio_sample_pos + (time_delta * sr).round() as u64);
|
||||
|
||||
if let Some(step) = pattern.steps.get(step_idx) {
|
||||
let resolved_script = pattern.resolve_script(step_idx);
|
||||
@@ -1037,7 +1041,7 @@ impl SequencerState {
|
||||
self.event_count += 1;
|
||||
self.buf_audio_commands.push(TimestampedCommand {
|
||||
cmd,
|
||||
time: event_time,
|
||||
tick: event_tick,
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1080,7 +1084,8 @@ impl SequencerState {
|
||||
quantum: f64,
|
||||
fill: bool,
|
||||
nudge_secs: f64,
|
||||
engine_time: f64,
|
||||
audio_sample_pos: u64,
|
||||
sr: f64,
|
||||
mouse_x: f64,
|
||||
mouse_y: f64,
|
||||
mouse_down: f64,
|
||||
@@ -1105,7 +1110,7 @@ impl SequencerState {
|
||||
} else {
|
||||
0.0
|
||||
};
|
||||
let event_time = Some(engine_time + time_delta);
|
||||
let event_tick = Some(audio_sample_pos + (time_delta * sr).round() as u64);
|
||||
|
||||
let step_in_cycle = self.script_step % self.script_length;
|
||||
|
||||
@@ -1149,7 +1154,7 @@ impl SequencerState {
|
||||
self.event_count += 1;
|
||||
self.buf_audio_commands.push(TimestampedCommand {
|
||||
cmd,
|
||||
time: event_time,
|
||||
tick: event_tick,
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1305,11 +1310,6 @@ fn sequencer_loop(
|
||||
|
||||
let sr = sample_rate.load(Ordering::Relaxed) as f64;
|
||||
let audio_samples = audio_sample_pos.load(Ordering::Acquire);
|
||||
let engine_time = if sr > 0.0 {
|
||||
audio_samples as f64 / sr
|
||||
} else {
|
||||
0.0
|
||||
};
|
||||
let input = TickInput {
|
||||
commands,
|
||||
playing: playing.load(Ordering::Relaxed),
|
||||
@@ -1320,7 +1320,8 @@ fn sequencer_loop(
|
||||
fill: live_keys.fill(),
|
||||
nudge_secs: nudge_us.load(Ordering::Relaxed) as f64 / 1_000_000.0,
|
||||
current_time_us,
|
||||
engine_time,
|
||||
audio_sample_pos: audio_samples,
|
||||
sr,
|
||||
#[cfg(feature = "desktop")]
|
||||
mouse_x: f32::from_bits(mouse_x.load(Ordering::Relaxed)) as f64,
|
||||
#[cfg(not(feature = "desktop"))]
|
||||
@@ -1370,7 +1371,7 @@ fn sequencer_loop(
|
||||
} else {
|
||||
let _ = audio_tx.load().send(AudioCommand::Evaluate {
|
||||
cmd: tsc.cmd,
|
||||
time: tsc.time,
|
||||
tick: tsc.tick,
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1542,7 +1543,8 @@ mod tests {
|
||||
fill: false,
|
||||
nudge_secs: 0.0,
|
||||
current_time_us: 0,
|
||||
engine_time: 0.0,
|
||||
audio_sample_pos: 0,
|
||||
sr: 48000.0,
|
||||
mouse_x: 0.5,
|
||||
mouse_y: 0.5,
|
||||
mouse_down: 0.0,
|
||||
@@ -1560,7 +1562,8 @@ mod tests {
|
||||
fill: false,
|
||||
nudge_secs: 0.0,
|
||||
current_time_us: 0,
|
||||
engine_time: 0.0,
|
||||
audio_sample_pos: 0,
|
||||
sr: 48000.0,
|
||||
mouse_x: 0.5,
|
||||
mouse_y: 0.5,
|
||||
mouse_down: 0.0,
|
||||
|
||||
@@ -300,7 +300,7 @@ pub(super) fn handle_engine_page(ctx: &mut InputContext, key: KeyEvent) -> Input
|
||||
KeyCode::Char('t') if !ctx.app.plugin_mode => {
|
||||
let _ = ctx.audio_tx.load().send(AudioCommand::Evaluate {
|
||||
cmd: "/sound/sine/dur/0.5/decay/0.2".into(),
|
||||
time: None,
|
||||
tick: None,
|
||||
});
|
||||
}
|
||||
KeyCode::Char('s') => super::open_save(ctx),
|
||||
|
||||
@@ -796,7 +796,7 @@ fn execute_palette_entry(
|
||||
.load()
|
||||
.send(crate::engine::AudioCommand::Evaluate {
|
||||
cmd: "/sound/sine/dur/0.5/decay/0.2".into(),
|
||||
time: None,
|
||||
tick: None,
|
||||
});
|
||||
}
|
||||
None => {}
|
||||
|
||||
@@ -70,7 +70,7 @@ pub(super) fn handle_sample_explorer(ctx: &mut InputContext, key: KeyEvent) -> I
|
||||
let _ = ctx
|
||||
.audio_tx
|
||||
.load()
|
||||
.send(AudioCommand::Evaluate { cmd, time: None });
|
||||
.send(AudioCommand::Evaluate { cmd, tick: None });
|
||||
ctx.dispatch(AppCommand::SetStatus(format!(
|
||||
"\u{25B8} {}/{}",
|
||||
folder, entry.label
|
||||
|
||||
Reference in New Issue
Block a user