77 lines
2.0 KiB
Rust
77 lines
2.0 KiB
Rust
use web_sys::File;
|
|
use yew::services::reader::{FileChunk, ReaderTask};
|
|
use yew::services::{ConsoleService, ReaderService};
|
|
use yew::worker::*;
|
|
|
|
pub struct AudioAgent {
|
|
link: AgentLink<Self>,
|
|
reader_service: ReaderService,
|
|
reader_task: Option<ReaderTask>,
|
|
}
|
|
|
|
pub enum Request {
|
|
LoadSamplesFromFile(File),
|
|
}
|
|
|
|
pub enum Msg {
|
|
FileProgress(Option<FileChunk>),
|
|
}
|
|
|
|
impl Agent for AudioAgent {
|
|
type Reach = Context<Self>;
|
|
type Message = Msg;
|
|
type Input = Request;
|
|
type Output = ();
|
|
|
|
fn create(link: AgentLink<Self>) -> Self {
|
|
Self {
|
|
link,
|
|
reader_service: ReaderService::new(),
|
|
reader_task: None,
|
|
}
|
|
}
|
|
|
|
fn update(&mut self, msg: Self::Message) {
|
|
match msg {
|
|
Msg::FileProgress(Some(chunk)) => {
|
|
if let Err(e) = self.handle_file_progress(chunk) {
|
|
ConsoleService::error(&e);
|
|
}
|
|
}
|
|
Msg::FileProgress(None) => (),
|
|
};
|
|
}
|
|
|
|
fn handle_input(&mut self, input: Self::Input, _: HandlerId) {
|
|
match input {
|
|
Request::LoadSamplesFromFile(file) => self.load_samples_from_file(file),
|
|
};
|
|
}
|
|
}
|
|
|
|
impl AudioAgent {
|
|
fn load_samples_from_file(&mut self, file: File) -> Result<(), String> {
|
|
let cb = self.link.callback(Msg::FileProgress);
|
|
|
|
let task = self
|
|
.reader_service
|
|
.read_file_by_chunks(file, cb, 256)
|
|
.map_err(|e| e.to_string())?;
|
|
|
|
self.reader_task = Some(task);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
fn handle_file_progress(&mut self, chunk: FileChunk) -> Result<(), String> {
|
|
match chunk {
|
|
FileChunk::Started { name, .. } => ConsoleService::log(&format!("Started: {}", name)),
|
|
FileChunk::DataChunk { progress, .. } => {
|
|
ConsoleService::log(&format!("Got chunk, progress: {}", progress))
|
|
}
|
|
FileChunk::Finished => ConsoleService::log("Finished"),
|
|
}
|
|
Ok(())
|
|
}
|
|
}
|