Просмотр исходного кода

Fixed forced volume override. Removed fadein until it can be fixed

Jon Fawcett 6 лет назад
Родитель
Сommit
7b63587950

+ 5 - 5
LoopFollow/Controllers/SettingsViewController.swift

@@ -101,12 +101,12 @@ class SettingsViewController: FormViewController {
                         guard let value = row.value else { return }
                         UserDefaultsRepository.overrideSystemOutputVolume.value = value
                 }
-            <<< StepperRow("systemOutputVolume") { row in
+            <<< StepperRow("forcedOutputVolume") { row in
                   row.title = "Volume Level"
                 row.cell.stepper.stepValue = 0.05
                   row.cell.stepper.minimumValue = 0
                   row.cell.stepper.maximumValue = 1
-                  row.value = Double(UserDefaultsRepository.systemOutputVolume.value)
+                  row.value = Double(UserDefaultsRepository.forcedOutputVolume.value)
                   row.hidden = "$overrideSystemOutputVolume == false"
                     row.displayValueFor = { value in
                     guard let value = value else { return nil }
@@ -114,9 +114,9 @@ class SettingsViewController: FormViewController {
                     }
               }.onChange { [weak self] row in
                       guard let value = row.value else { return }
-                      UserDefaultsRepository.systemOutputVolume.value = Float(value)
+                      UserDefaultsRepository.forcedOutputVolume.value = Float(value)
               }
-            <<< StepperRow("fadeInTimeInterval") { row in
+           /* <<< StepperRow("fadeInTimeInterval") { row in
                 row.title = "Fade-in Seconds"
                 row.cell.stepper.stepValue = 5
                 row.cell.stepper.minimumValue = 0
@@ -129,7 +129,7 @@ class SettingsViewController: FormViewController {
             }.onChange { [weak self] row in
                     guard let value = row.value else { return }
                     UserDefaultsRepository.fadeInTimeInterval.value = TimeInterval(value)
-            }
+            }*/
             
         +++ Section("Graph Settings")
             <<< SwitchRow("switchRowDots"){ row in

+ 46 - 19
LoopFollow/Models/AlarmSound.swift

@@ -29,10 +29,7 @@ class AlarmSound {
     
     //static let volumeChangeDetector = VolumeChangeDetector()
     
-    static let fadeInTimeInterval = UserDefaultsRepository.fadeInTimeInterval
     static let vibrate = UserDefaultsRepository.vibrate
-    static let overrideSystemOutputVolume = UserDefaultsRepository.overrideSystemOutputVolume
-    static let systemOutputVolume = UserDefaultsRepository.systemOutputVolume
     
     fileprivate static var systemOutputVolumeBeforeOverride: Float?
     
@@ -61,8 +58,8 @@ class AlarmSound {
      * Sets the volume of the alarm back to the volume before it has been muted.
      */
     static func unmuteVolume() {
-        if self.fadeInTimeInterval.value > 0 {
-            self.audioPlayer?.setVolume(1.0, fadeDuration: self.fadeInTimeInterval.value)
+        if UserDefaultsRepository.fadeInTimeInterval.value > 0 {
+            self.audioPlayer?.setVolume(1.0, fadeDuration: UserDefaultsRepository.fadeInTimeInterval.value)
         } else {
             self.audioPlayer?.volume = 1.0
         }
@@ -98,7 +95,7 @@ class AlarmSound {
             
             // init volume before start playing (mute if fade-in)
             
-            //self.audioPlayer!.volume = (self.muted || (self.fadeInTimeInterval.value > 0)) ? 0.0 : 1.0
+            //self.audioPlayer!.volume = (self.muted || (UserDefaultsRepository.fadeInTimeInterval.value > 0)) ? 0.0 : 1.0
             
             if !self.audioPlayer!.prepareToPlay() {
                 NSLog("AlarmSound - audio player failed preparing to play")
@@ -136,9 +133,13 @@ class AlarmSound {
             // Play endless loops
             self.audioPlayer!.numberOfLoops = -1
             
-            // init volume before start playing (mute if fade-in)
+            // Store existing volume
+            if self.systemOutputVolumeBeforeOverride == nil {
+                self.systemOutputVolumeBeforeOverride = AVAudioSession.sharedInstance().outputVolume
+            }
             
-            self.audioPlayer!.volume = (self.muted || (self.fadeInTimeInterval.value > 0)) ? 0.0 : 1.0
+            // init volume before start playing (mute if fade-in)
+            //self.audioPlayer!.volume = (self.muted || (UserDefaultsRepository.fadeInTimeInterval.value > 0)) ? 0.0 : 1.0
             
             if !self.audioPlayer!.prepareToPlay() {
                 NSLog("AlarmSound - audio player failed preparing to play")
@@ -155,10 +156,15 @@ class AlarmSound {
             
             
             // do fade-in
-            if !self.muted && (self.fadeInTimeInterval.value > 0) {
-                self.audioPlayer!.setVolume(1.0, fadeDuration: self.fadeInTimeInterval.value)
+            //if !self.muted && (UserDefaultsRepository.fadeInTimeInterval.value > 0) {
+            //    self.audioPlayer!.setVolume(1.0, fadeDuration: UserDefaultsRepository.fadeInTimeInterval.value)
+            //}
+            
+            if UserDefaultsRepository.overrideSystemOutputVolume.value {
+                MPVolumeView.setVolume(UserDefaultsRepository.forcedOutputVolume.value)
             }
             
+            
             //self.playingTimer = Timer.schedule(repeatInterval: 1.0, handler: self.onPlayingTimer)
             
         } catch let error {
@@ -178,17 +184,19 @@ class AlarmSound {
             return
         }
         
-        if self.overrideSystemOutputVolume.value {
+        if UserDefaultsRepository.overrideSystemOutputVolume.value {
 
             // keep the system output volume before overriding it
             if self.systemOutputVolumeBeforeOverride == nil {
-               // self.systemOutputVolumeBeforeOverride = MPVolumeView.volume
+                //self.systemOutputVolumeBeforeOverride = MPVolumeView.volume
+                self.systemOutputVolumeBeforeOverride = AVAudioSession.sharedInstance().outputVolume
             }
             
-            // override the system output volume
-           // if MPVolumeView.volume != self.systemOutputVolume.value {
+             // override the system output volume
+            MPVolumeView.setVolume(UserDefaultsRepository.systemOutputVolume.value)
+           // if MPVolumeView.volume != UserDefaultsRepository.systemOutputVolume.value {
             //    self.volumeChangeDetector.isActive = false
-            //    MPVolumeView.volume = self.systemOutputVolume.value
+            //    MPVolumeView.volume = UserDefaultsRepository.systemOutputVolume.value
            // } else {
             
                 // listen to user volume changes
@@ -203,7 +211,7 @@ class AlarmSound {
     
     fileprivate static func restoreSystemOutputVolume() {
         
-        guard self.overrideSystemOutputVolume.value else {
+        guard UserDefaultsRepository.overrideSystemOutputVolume.value else {
             return
         }
         
@@ -211,9 +219,9 @@ class AlarmSound {
        // self.volumeChangeDetector.isActive = false
         
         // restore system output volume with its value before overriding it
-        //if let volumeBeforeOverride = self.systemOutputVolumeBeforeOverride {
-        //    MPVolumeView.volume = volumeBeforeOverride
-       // }
+        if let volumeBeforeOverride = self.systemOutputVolumeBeforeOverride {
+            MPVolumeView.setVolume(volumeBeforeOverride)
+        }
         
         self.systemOutputVolumeBeforeOverride = nil
     }
@@ -254,3 +262,22 @@ class AudioPlayerDelegate: NSObject, AVAudioPlayerDelegate {
 fileprivate func convertFromAVAudioSessionCategory(_ input: AVAudioSession.Category) -> String {
 	return input.rawValue
 }
+
+
+extension MPVolumeView {
+    static func setVolume(_ volume: Float) {
+        // Need to use the MPVolumeView in order to change volume, but don't care about UI set so frame to .zero
+        let volumeView = MPVolumeView(frame: .zero)
+        // Search for the slider
+        let slider = volumeView.subviews.first(where: { $0 is UISlider }) as? UISlider
+        // Update the slider value with the desired volume.
+        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.01) {
+            slider?.value = volume
+        }
+        // Optional - Remove the HUD
+        if let app = UIApplication.shared.delegate as? AppDelegate, let window = app.window {
+            volumeView.alpha = 0.000001
+            window.addSubview(volumeView)
+        }
+    }
+}

+ 1 - 0
LoopFollow/repository/UserDefaults.swift

@@ -47,6 +47,7 @@ class UserDefaultsRepository {
     static let fadeInTimeInterval = UserDefaultsValue<TimeInterval>(key: "fadeInTimeInterval", default: 0)
     static let vibrate = UserDefaultsValue<Bool>(key: "vibrate", default: true)
     static let overrideSystemOutputVolume = UserDefaultsValue<Bool>(key: "overrideSystemOutputVolume", default: true)
+    static let forcedOutputVolume = UserDefaultsValue<Float>(key: "forcedOutputVolume", default: 0.5)
     
     
     // Alerts