Browse Source

always try to get the audio message duration from dc core first, set duration in core if it was not yet determined

cyberta 4 years ago
parent
commit
3e18d56f0b
2 changed files with 30 additions and 15 deletions
  1. 8 0
      DcCore/DcCore/DC/Wrapper.swift
  2. 22 15
      deltachat-ios/Chat/AudioController.swift

+ 8 - 0
DcCore/DcCore/DC/Wrapper.swift

@@ -968,6 +968,10 @@ public class DcMsg {
     public var messageWidth: CGFloat {
         return CGFloat(dc_msg_get_width(messagePointer))
     }
+    
+    public var duration: Double {
+        return Double(dc_msg_get_duration(messagePointer))
+    }
 
     public func setLateFilingMediaSize(width: CGFloat, height: CGFloat, duration: Int) {
         dc_msg_latefiling_mediasize(messagePointer, Int32(width), Int32(height), Int32(duration))
@@ -1010,6 +1014,10 @@ public class DcMsg {
     public func setDimension(width: CGFloat, height: CGFloat) {
         dc_msg_set_dimension(messagePointer, Int32(width), Int32(height))
     }
+    
+    public func setDuration(_ duration: Double) {
+        dc_msg_set_duration(messagePointer, Int32(duration))
+    }
 
     public var filesize: Int {
         return Int(dc_msg_get_filebytes(messagePointer))

+ 22 - 15
deltachat-ios/Chat/AudioController.swift

@@ -93,22 +93,29 @@ open class AudioController: NSObject, AVAudioPlayerDelegate, AudioMessageCellDel
             return
         }
         
-        if let fileURL = message.fileURL {
-            let audioAsset = AVURLAsset.init(url: fileURL, options: nil)
-
-            audioAsset.loadValuesAsynchronously(forKeys: ["duration"]) {
-                var error: NSError?
-                let status = audioAsset.statusOfValue(forKey: "duration", error: &error)
-                switch status {
-                case .loaded:
-                    let duration = audioAsset.duration
-                    let durationInSeconds = CMTimeGetSeconds(duration)
-                    DispatchQueue.main.async {
-                        successHandler(messageId, Double(durationInSeconds))
+        DispatchQueue.global(qos: .userInitiated).async {
+            let duration = message.duration
+            if duration > 0 {
+                DispatchQueue.main.async {
+                    successHandler(messageId, Double(duration / 1000))
+                }
+            } else if let fileURL = message.fileURL {
+                let audioAsset = AVURLAsset.init(url: fileURL, options: nil)
+                audioAsset.loadValuesAsynchronously(forKeys: ["duration"]) {
+                    var error: NSError?
+                    let status = audioAsset.statusOfValue(forKey: "duration", error: &error)
+                    switch status {
+                    case .loaded:
+                        let duration = audioAsset.duration
+                        let durationInSeconds = Double(CMTimeGetSeconds(duration))
+                        message.setDuration(1000 * durationInSeconds)
+                        DispatchQueue.main.async {
+                            successHandler(messageId, durationInSeconds)
+                        }
+                    case .failed:
+                        logger.warning("loading audio message \(messageId) failed: \(String(describing: error?.localizedDescription))")
+                    default: break
                     }
-                case .failed:
-                    logger.warning("loading audio message \(messageId) failed: \(String(describing: error?.localizedDescription))")
-                default: break
                 }
             }
         }