]> git.seodisparate.com - mpd_info_screen/commitdiff
Refactor getting album art from handle to display
authorStephen Seo <seo.disparate@gmail.com>
Sat, 18 Dec 2021 06:37:50 +0000 (15:37 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Sat, 18 Dec 2021 06:37:50 +0000 (15:37 +0900)
Avoids doing a copy of the album art data.

src/display.rs
src/mpd_handler.rs

index 86d8acd8018371f22f5ca2b3083a2bc27ac1c2ef..d03886cba488024253eaa316fab0ac23ca0f2bfd 100644 (file)
@@ -180,19 +180,20 @@ impl MPDDisplay {
         }
     }
 
-    fn get_image_from_data(
-        &mut self,
-        ctx: &mut Context,
-        data: (Vec<u8>, String),
-    ) -> Result<(), String> {
+    fn get_image_from_data(&mut self, ctx: &mut Context) -> Result<(), String> {
+        let mpd_handle = self.mpd_handler.clone().unwrap();
+        let read_handle = mpd_handle
+            .try_read()
+            .map_err(|_| String::from("ERROR get_image_from_data: Failed to get read_handle"))?;
+
         let mut image_format: image::ImageFormat = image::ImageFormat::Png;
-        match data.1.as_str() {
+        match read_handle.get_art_type().as_str() {
             "image/png" => image_format = image::ImageFormat::Png,
             "image/jpg" | "image/jpeg" => image_format = image::ImageFormat::Jpeg,
             "image/gif" => image_format = image::ImageFormat::Gif,
             _ => (),
         }
-        let img = ImageReader::with_format(Cursor::new(data.0), image_format)
+        let img = ImageReader::with_format(Cursor::new(read_handle.get_art_data()), image_format)
             .decode()
             .map_err(|e| format!("ERROR: Failed to decode album art image: {}", e))?;
         let rgba8 = img.to_rgba8();
@@ -487,23 +488,13 @@ impl EventHandler for MPDDisplay {
                     log("Failed to acquire read lock for getting shared data");
                 }
                 if self.album_art.is_none() {
-                    let album_art_data_result =
-                        MPDHandler::get_art_data(self.mpd_handler.clone().unwrap());
-                    if let Ok(art_data) = album_art_data_result {
-                        let result = self.get_image_from_data(ctx, art_data);
-                        if let Err(e) = result {
-                            log(e);
-                            self.album_art = None;
-                            self.album_art_draw_transform = None;
-                        } else {
-                            self.get_album_art_transform(
-                                ctx,
-                                !self.opts.do_not_fill_scale_album_art,
-                            );
-                        }
-                    } else {
+                    let result = self.get_image_from_data(ctx);
+                    if let Err(e) = result {
+                        log(e);
                         self.album_art = None;
                         self.album_art_draw_transform = None;
+                    } else {
+                        self.get_album_art_transform(ctx, !self.opts.do_not_fill_scale_album_art);
                     }
                 }
             }
index b2bac32a6a99bc2c47e85054257bf5ee9aeccf50..364dbc80226d909a9faeb61397a72fd1c1206a1d 100644 (file)
@@ -271,24 +271,6 @@ impl MPDHandler {
         Ok(s)
     }
 
-    pub fn get_art_data(h: Arc<RwLock<Self>>) -> Result<(Vec<u8>, String), ()> {
-        if let Ok(read_lock) = h.try_read() {
-            if read_lock.art_data.len() == read_lock.art_data_size {
-                return Ok((read_lock.art_data.clone(), read_lock.art_data_type.clone()));
-            }
-        }
-
-        Err(())
-    }
-
-    pub fn can_get_art_data(h: Arc<RwLock<Self>>) -> bool {
-        if let Ok(read_lock) = h.try_read() {
-            return read_lock.can_get_album_art || read_lock.can_get_album_art_in_dir;
-        }
-
-        false
-    }
-
     pub fn get_current_song_info(h: Arc<RwLock<Self>>) -> Result<InfoFromShared, ()> {
         if let Ok(read_lock) = h.try_read() {
             return Ok(InfoFromShared {
@@ -332,6 +314,14 @@ impl MPDHandler {
         }
     }
 
+    pub fn get_art_type(&self) -> String {
+        self.art_data_type.clone()
+    }
+
+    pub fn get_art_data(&self) -> &[u8] {
+        &self.art_data
+    }
+
     fn handler_loop(h: Arc<RwLock<Self>>) -> Result<(), String> {
         let mut buf: [u8; BUF_SIZE] = [0; BUF_SIZE];
         let mut saved: Vec<u8> = Vec::new();