mirror of
https://github.com/LegitCamper/picocalc-os-rs.git
synced 2025-12-27 07:45:28 +00:00
selection ui for wav_player
This commit is contained in:
1
Cargo.lock
generated
1
Cargo.lock
generated
@@ -2762,6 +2762,7 @@ dependencies = [
|
|||||||
"embedded-audio",
|
"embedded-audio",
|
||||||
"embedded-graphics",
|
"embedded-graphics",
|
||||||
"rand",
|
"rand",
|
||||||
|
"selection_ui",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ edition = "2024"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
abi = { path = "../../abi" }
|
abi = { path = "../../abi" }
|
||||||
|
selection_ui = { path = "../../selection_ui" }
|
||||||
embedded-graphics = "0.8.1"
|
embedded-graphics = "0.8.1"
|
||||||
rand = { version = "0.9.0", default-features = false }
|
rand = { version = "0.9.0", default-features = false }
|
||||||
embedded-audio = { git = "https://github.com/LegitCamper/embedded-audio" }
|
embedded-audio = { git = "https://github.com/LegitCamper/embedded-audio" }
|
||||||
|
|||||||
@@ -5,14 +5,21 @@ extern crate alloc;
|
|||||||
use abi::{
|
use abi::{
|
||||||
audio::{AUDIO_BUFFER_LEN, audio_buffer_ready, send_audio_buffer},
|
audio::{AUDIO_BUFFER_LEN, audio_buffer_ready, send_audio_buffer},
|
||||||
display::Display,
|
display::Display,
|
||||||
fs::{file_len, read_file},
|
format,
|
||||||
|
fs::{Entries, file_len, list_dir, read_file},
|
||||||
get_key,
|
get_key,
|
||||||
keyboard::{KeyCode, KeyState},
|
keyboard::{KeyCode, KeyState},
|
||||||
println,
|
println,
|
||||||
};
|
};
|
||||||
use alloc::string::String;
|
use alloc::{string::String, vec::Vec};
|
||||||
use core::panic::PanicInfo;
|
use core::panic::PanicInfo;
|
||||||
use embedded_audio::{AudioFile, PlatformFile, PlatformFileError, wav::Wav};
|
use embedded_audio::{AudioFile, PlatformFile, PlatformFileError, wav::Wav};
|
||||||
|
use embedded_graphics::{
|
||||||
|
mono_font::{MonoTextStyle, ascii::FONT_6X10},
|
||||||
|
pixelcolor::Rgb565,
|
||||||
|
prelude::RgbColor,
|
||||||
|
};
|
||||||
|
use selection_ui::{SelectionUi, SelectionUiError, draw_text_center};
|
||||||
|
|
||||||
#[panic_handler]
|
#[panic_handler]
|
||||||
fn panic(info: &PanicInfo) -> ! {
|
fn panic(info: &PanicInfo) -> ! {
|
||||||
@@ -27,30 +34,60 @@ pub extern "Rust" fn _start() {
|
|||||||
|
|
||||||
pub fn main() {
|
pub fn main() {
|
||||||
println!("Starting Wav player app");
|
println!("Starting Wav player app");
|
||||||
let mut _display = Display::take();
|
let mut display = Display::take().unwrap();
|
||||||
|
|
||||||
let mut buf = [0_u8; AUDIO_BUFFER_LEN];
|
|
||||||
|
|
||||||
let file = File::new(String::from("/music/test.wav"));
|
|
||||||
let mut wav = Wav::new(file).unwrap();
|
|
||||||
println!("sample rate: {}", wav.sample_rate());
|
|
||||||
println!("channels: {:?}", wav.channels() as u8);
|
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
if audio_buffer_ready() {
|
let mut entries = Entries::new();
|
||||||
if wav.is_eof() {
|
list_dir("/music", &mut entries);
|
||||||
wav.restart().unwrap()
|
|
||||||
|
let mut files = entries.entries();
|
||||||
|
files.retain(|e| e.extension().unwrap_or("") == "wav");
|
||||||
|
let mut wavs = files.iter().map(|e| e.full_name()).collect::<Vec<&str>>();
|
||||||
|
wavs.sort();
|
||||||
|
|
||||||
|
let mut selection_ui = SelectionUi::new(&mut wavs);
|
||||||
|
let selection = match selection_ui.run_selection_ui(&mut display) {
|
||||||
|
Ok(maybe_sel) => maybe_sel,
|
||||||
|
Err(e) => match e {
|
||||||
|
SelectionUiError::SelectionListEmpty => {
|
||||||
|
draw_text_center(
|
||||||
|
&mut display,
|
||||||
|
"No Wavs were found in /gifs",
|
||||||
|
MonoTextStyle::new(&FONT_6X10, Rgb565::RED),
|
||||||
|
)
|
||||||
|
.expect("Display Error");
|
||||||
|
None
|
||||||
|
}
|
||||||
|
SelectionUiError::DisplayError(_) => panic!("Display Error"),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
assert!(selection.is_some());
|
||||||
|
|
||||||
|
let file_name = format!("/music/{}", wavs[selection.unwrap()]);
|
||||||
|
let file = File::new(String::from(file_name));
|
||||||
|
let mut wav = Wav::new(file).unwrap();
|
||||||
|
println!("sample rate: {}", wav.sample_rate());
|
||||||
|
println!("channels: {:?}", wav.channels() as u8);
|
||||||
|
|
||||||
|
let mut buf = [0_u8; AUDIO_BUFFER_LEN];
|
||||||
|
|
||||||
|
loop {
|
||||||
|
if audio_buffer_ready() {
|
||||||
|
if wav.is_eof() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
let _read = wav.read(&mut buf).unwrap();
|
||||||
|
send_audio_buffer(&buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
let _read = wav.read(&mut buf).unwrap();
|
let event = get_key();
|
||||||
send_audio_buffer(&buf);
|
if event.state == KeyState::Released {
|
||||||
}
|
match event.key {
|
||||||
|
KeyCode::Esc => return,
|
||||||
let event = get_key();
|
_ => (),
|
||||||
if event.state == KeyState::Released {
|
}
|
||||||
match event.key {
|
|
||||||
KeyCode::Esc => return,
|
|
||||||
_ => (),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user