From 9fe3c89ce1a2da77c0dc917e51665019c504a2b2 Mon Sep 17 00:00:00 2001 From: Rob Watson Date: Fri, 4 Sep 2020 17:25:16 +0200 Subject: [PATCH] Refactor, add AudioAgent --- src/agents/audio_agent.rs | 76 +++++++++++++++++++++++++++++++++++++++ src/agents/mod.rs | 1 + src/controls.rs | 39 ++++---------------- src/lib.rs | 1 + 4 files changed, 85 insertions(+), 32 deletions(-) create mode 100644 src/agents/audio_agent.rs create mode 100644 src/agents/mod.rs diff --git a/src/agents/audio_agent.rs b/src/agents/audio_agent.rs new file mode 100644 index 0000000..b4f31f2 --- /dev/null +++ b/src/agents/audio_agent.rs @@ -0,0 +1,76 @@ +use web_sys::File; +use yew::services::reader::{FileChunk, ReaderTask}; +use yew::services::{ConsoleService, ReaderService}; +use yew::worker::*; + +pub struct AudioAgent { + link: AgentLink, + reader_service: ReaderService, + reader_task: Option, +} + +pub enum Request { + LoadSamplesFromFile(File), +} + +pub enum Msg { + FileProgress(Option), +} + +impl Agent for AudioAgent { + type Reach = Context; + type Message = Msg; + type Input = Request; + type Output = (); + + fn create(link: AgentLink) -> 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(()) + } +} diff --git a/src/agents/mod.rs b/src/agents/mod.rs new file mode 100644 index 0000000..f990edd --- /dev/null +++ b/src/agents/mod.rs @@ -0,0 +1 @@ +pub mod audio_agent; diff --git a/src/controls.rs b/src/controls.rs index 4107f06..3c9fbc4 100644 --- a/src/controls.rs +++ b/src/controls.rs @@ -1,18 +1,17 @@ +use crate::agents::audio_agent::{self, AudioAgent}; use web_sys::HtmlInputElement; +use yew::agent::Dispatcher; use yew::prelude::*; -use yew::services::reader::{FileChunk, ReaderTask}; -use yew::services::{ConsoleService, ReaderService}; +use yew::services::ConsoleService; pub struct Controls { link: ComponentLink, file_input: NodeRef, - reader_service: ReaderService, - reader_task: Option, + audio_agent: Dispatcher, } pub enum Msg { SubmitForm, - FileProgress(Option), } impl Component for Controls { @@ -23,8 +22,7 @@ impl Component for Controls { Self { link, file_input: NodeRef::default(), - reader_service: ReaderService::new(), - reader_task: None, + audio_agent: AudioAgent::dispatcher(), } } @@ -35,11 +33,6 @@ impl Component for Controls { ConsoleService::error(&e); }; } - Msg::FileProgress(c) => { - if let Err(e) = self.handle_file_progress(c) { - ConsoleService::error(&e); - }; - } }; true } @@ -72,28 +65,10 @@ impl Controls { let file_list = file_input.files().ok_or("could not get file list")?; let file = file_list.get(0).ok_or("could not get file")?; - 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.audio_agent + .send(audio_agent::Request::LoadSamplesFromFile(file)); - self.reader_task = Some(task); - Ok(()) - } - - fn handle_file_progress(&self, chunk: Option) -> Result<(), String> { - match chunk { - Some(FileChunk::Started { name, .. }) => { - ConsoleService::log(&format!("Started: {}", name)) - } - Some(FileChunk::DataChunk { progress, .. }) => { - ConsoleService::log(&format!("Got chunk, progress: {}", progress)) - } - Some(FileChunk::Finished) => ConsoleService::log("Finished"), - _ => (), - } Ok(()) } } diff --git a/src/lib.rs b/src/lib.rs index 5ee3cf5..edd41a2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,6 +5,7 @@ use std::panic; use wasm_bindgen::prelude::*; use yew::prelude::*; +mod agents; mod app; mod canvas; mod controls;