Skip to content

Commit bb6c81c

Browse files
authored
Merge pull request #72 from Neotron-Compute/break-playback
Can pause sound playback.
2 parents dda9a5b + d5ce07f commit bb6c81c

File tree

1 file changed

+36
-12
lines changed

1 file changed

+36
-12
lines changed

src/commands/sound.rs

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -132,29 +132,53 @@ fn play(_menu: &menu::Menu<Ctx>, _item: &menu::Item<Ctx>, args: &[&str], ctx: &m
132132
embedded_sdmmc::Mode::ReadOnly,
133133
)?;
134134

135+
osprintln!("Press Q to quit, P to pause/unpause...");
136+
135137
let api = API.get();
136138

137139
let mut buffer = &mut scratch[0..4096];
138140
let mut bytes = 0;
139141
let mut delta = 0;
140142

141-
while !file.eof() {
142-
let bytes_read = mgr.read(&mut volume, &mut file, &mut buffer)?;
143-
let mut buffer = &buffer[0..bytes_read];
144-
while !buffer.is_empty() {
145-
let slice = bios::FfiByteSlice::new(buffer);
146-
let played = unsafe { (api.audio_output_data)(slice).unwrap() };
147-
buffer = &buffer[played..];
148-
delta += played;
149-
if delta > 48000 {
150-
bytes += delta;
151-
delta = 0;
143+
let mut pause = false;
144+
'playback: while !file.eof() {
145+
if !pause {
146+
let bytes_read = mgr.read(&mut volume, &mut file, &mut buffer)?;
147+
let mut buffer = &buffer[0..bytes_read];
148+
while !buffer.is_empty() {
149+
let slice = bios::FfiByteSlice::new(buffer);
150+
let played = unsafe { (api.audio_output_data)(slice).unwrap() };
151+
buffer = &buffer[played..];
152+
delta += played;
153+
if delta > 48000 {
154+
bytes += delta;
155+
delta = 0;
156+
let milliseconds = bytes / ((48000 / 1000) * 4);
157+
osprint!(
158+
"\rPlayed: {}.{:03} s",
159+
milliseconds / 1000,
160+
milliseconds % 1000
161+
);
162+
}
163+
}
164+
}
165+
166+
let mut buffer = [0u8; 16];
167+
let count = { crate::STD_INPUT.lock().get_data(&mut buffer) };
168+
for b in &buffer[0..count] {
169+
if *b == b'q' || *b == b'Q' {
170+
osprintln!("\nQuitting playback!");
171+
break 'playback;
172+
} else if (*b == b'p' || *b == b'P') && pause {
173+
pause = false;
174+
} else if (*b == b'p' || *b == b'P') && !pause {
152175
let milliseconds = bytes / ((48000 / 1000) * 4);
153176
osprint!(
154-
"\rPlayed: {}:{} ms",
177+
"\rPaused: {}.{:03} s",
155178
milliseconds / 1000,
156179
milliseconds % 1000
157180
);
181+
pause = true;
158182
}
159183
}
160184
}

0 commit comments

Comments
 (0)