audioview/src/agents/audio_agent.rs

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(())
}
}