         // This async call seems to solve that issue.
         DispatchQueue.main.async {
             MusicPlayer.player.currentPlaybackRate = self.playbackRate
-        }
-        
-        let state = isPlaying()
-        if state {
-            delegate?.playbackStarted()
-        }
-
-        return state
+            if self.isPlaying() {
+                self.delegate?.playbackStarted()
+            }
+        }
     }
     
     public func isPlaying() -> Bool {
         MusicPlayer.player.playbackState == .playing
     }
     
-    @discardableResult public func pause() -> Bool {
+    public func pause() {
         MusicPlayer.player.pause()
         
-        delegate?.playbackPaused()
-
-        return isPaused()
+        DispatchQueue.main.async {
+            self.delegate?.playbackPaused()
+        }
     }
     
     public func isPaused() -> Bool {

        }
    }
    
    @discardableResult public func play() -> Bool {
        let result: Bool
        
        if isPaused() {
            bufferQueue.sync {
                player.play()
                paused = false
            }
            result = true
        } else {
            result = _play()
        }
        
        if result {
            DispatchQueue.main.async {
                self.delegate?.playbackStarted()
            }
        }
        
        return result
    }
    
    @discardableResult public func pause() -> Bool {
        guard isPlaying() else {
            return isPaused()
        }
        
        _pause()

        DispatchQueue.main.async {
            self.delegate?.playbackPaused()
        }
    }
    
    public func stop() {
