audio-player
Builds AudioPlayer Divider TransportBar


The code that drew it
A still frame holds a repeating animation at its first frame and a one-shot at its last, because a still of a moving thing is not reproducible. Run the gallery to review motion.
fn audio_player(_window: &mut Window, cx: &mut App) -> AnyElement {
let theme = cx.theme().clone();
stack(&theme)
.w(px(640.0))
.child(
AudioPlayer::new("scene.audio.ready")
.title("Release walkthrough")
.subtitle("Recorded 12 March")
.transport(
FixtureTransport::ready(240.0)
.position(72.0)
.state(TransportState::Playing)
.volume(0.7)
.buffered([BufferedRange::new(0.0, 156.0)])
.shared(),
)
.elapsed("01:12")
.remaining("-02:48")
.peaks(scene_peaks(96))
.speeds([1.0, 1.5, 2.0])
.step_seconds(10.0)
.on_event(|_, _, _| {}),
)
.child(
Divider::new()
.id("scene.audio.rule.backend")
.label("Nothing here can decode it"),
)
.child(
AudioPlayer::new("scene.audio.absent")
.title("interview.opus")
.transport(
FixtureTransport::new()
.no_backend("There is no Opus decoder on this machine.")
.shared(),
)
.on_event(|_, _, _| {}),
)
.child(
Divider::new()
.id("scene.audio.rule.none")
.label("No player connected at all"),
)
.child(
AudioPlayer::new("scene.audio.none")
.title("Standup recording")
.on_event(|_, _, _| {}),
)
.into_any_element()
}