 
     // If user opted out of animation, toggle observation for the duration of the change
     if !animated {
-      AVAudioSession.sharedInstance().removeObserver(self, forKeyPath: AVAudioSessionOutputVolumeKey, context: nil)
+      reenableOutputVolumeObservationWorkItem?.cancel()
+      audioSessionOutputVolumeObserver = nil
       
       updateVolume()
       
-      DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) { [weak self] in
+      reenableOutputVolumeObservationWorkItem = DispatchWorkItem { [weak self] in
         guard let `self` = self else { return }
-        AVAudioSession.sharedInstance().addObserver(self, forKeyPath: self.AVAudioSessionOutputVolumeKey, options: .new, context: nil)
+        self.audioSessionOutputVolumeObserver = AVAudioSession.sharedInstance().observe(\.outputVolume) { [weak self] (audioSession, _) in
+          guard let `self` = self else { return }
+          self.updateVolume(Double(audioSession.outputVolume), animated: true)
+        }
       }
+      
+      DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1, execute: reenableOutputVolumeObservationWorkItem!)
     } else {
       updateVolume()
     }

  fileprivate func setup() {
    resume()
    updateVolume(Double(AVAudioSession.sharedInstance().outputVolume), animated: false)
    AVAudioSession.sharedInstance().addObserver(self, forKeyPath: AVAudioSessionOutputVolumeKey, options: .new, context: nil)

    backgroundColor = .clear


    }
  }

  deinit {
    NotificationCenter.default.removeObserver(self)
  }
}
