AVAudioSession.sharedInstance (). OutputVolume Не возвращает правильный объем последовательно - PullRequest
0 голосов
/ 26 июня 2018

С помощью следующего кода я получаю выходной объем, но он действительно противоречив - иногда он дает те же значения, иногда это изменение объема, несмотря на то, что системный объем действительно изменяется правильно.

Есть ли способ получить правильные значения каждый раз?

func viewDidLoad() {
...

        NotificationCenter.default.addObserver(self, selector: #selector(volumeDidChange), name: NSNotification.Name(rawValue: "AVSystemController_SystemVolumeDidChangeNotification"), object: nil)
...

}


func volumeDidChange() {
   print("VOLUME CHANGING", AVAudioSession.sharedInstance().outputVolume)

// output while changing the volume with hardware buttons
VOLUME CHANGING 0.0625
VOLUME CHANGING 0.0625
VOLUME CHANGING 0.125
VOLUME CHANGING 0.1875
VOLUME CHANGING 0.25
VOLUME CHANGING 0.375
VOLUME CHANGING 0.375
VOLUME CHANGING 0.4375
VOLUME CHANGING 0.5
VOLUME CHANGING 0.5625
VOLUME CHANGING 0.625
VOLUME CHANGING 0.6875
VOLUME CHANGING 0.75
VOLUME CHANGING 0.8125
VOLUME CHANGING 0.875
VOLUME CHANGING 0.75
VOLUME CHANGING 0.6875
VOLUME CHANGING 0.625
VOLUME CHANGING 0.625
VOLUME CHANGING 0.5625
VOLUME CHANGING 0.5
VOLUME CHANGING 0.4375
VOLUME CHANGING 0.375
VOLUME CHANGING 0.3125
VOLUME CHANGING 0.375
VOLUME CHANGING 0.4375
VOLUME CHANGING 0.4375

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Обновлено для Swift 4.2

override func viewDidLoad() {
    super.viewDidLoad()
    let session = AVAudioSession.sharedInstance()

    do {
        try session.setActive(true)
    } catch {
        print("error in getting volume")
    }

    if session.outputVolume < 1.0 {
        volumeButton = 0
    } else {
        volumeButton = 1
    }

    NotificationCenter.default.addObserver(self, selector: #selector(self.volumeDidChange(notification:)), name: NSNotification.Name(rawValue: "AVSystemController_SystemVolumeDidChangeNotification"), object: nil)
}

@objc func volumeDidChange(notification: NSNotification) {
    if let volume = notification.userInfo?["AVSystemController_AudioVolumeNotificationParameter"] as? Float{
        print("Device Volume:\(volume)")
    } else{
        print("Error while reading value...")
    }
}
0 голосов
/ 26 июня 2018

Попробуйте

import AVFoundation
import MediaPlayer

//MARK: Did Load
override func viewDidLoad() {
    super.viewDidLoad()

    /// Volume View
    let volumeView = MPVolumeView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
    volumeView.isHidden = false
    volumeView.alpha = 0.01
    view.addSubview(volumeView)

    /// Notification Observer
     NotificationCenter.default.addObserver(self, selector: #selector(self.volumeDidChange(notification:)), name: NSNotification.Name(rawValue: "AVSystemController_SystemVolumeDidChangeNotification"), object: nil)
}

@objc func volumeDidChange(notification: NSNotification) {
    //print("VOLUME CHANGING", AVAudioSession.sharedInstance().outputVolume)

    let volume = notification.userInfo!["AVSystemController_AudioVolumeNotificationParameter"] as! Float
    print("Device Volume:\(volume)")
}

Ваш текущий выходной сигнал - Повторяются те же значения

enter image description here

Требуемый выход

enter image description here

...