AVAudioSession - Как переключаться между динамиком и выходом на наушники - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь имитировать поведение во время звонка, как в приложении "Телефон".Вы можете легко переключать источники вывода с / на динамик или наушники.Я знаю, что могу подключить динамик в качестве выхода при подключении наушников, набрав:

try! audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)  
try! audioSession.overrideOutputAudioPort(.speaker)  

Однако, когда я это делаю, я не вижу способа определить, подключены ли наушники к устройству.

Сначала я думал, что outputDataSources на AVAudioSession вернет все возможные выходные данные, но всегда возвращает ноль.

Есть что-то, чего мне не хватает

1 Ответ

0 голосов
/ 22 сентября 2018

Вам необходимо изменить outputDataSources, так как когда вы переопределяете его,

теперь он содержит только параметр .Speaker

В документации вы можете найти решение этой проблемы,

Если ваше приложение использует категорию playAndRecord, то при вызове этого метода с параметром AVAudioSession.PortOverride.speaker звук будет перенаправлен на встроенный динамик и микрофон независимо от других настроек.Это изменение остается в силе только до тех пор, пока не изменится текущий маршрут или пока вы не вызовете этот метод снова с параметром AVAudioSession.PortOverride.none.

Поэтому звук направляется на встроенный динамик. Это изменение остаетсяв действительности только до тех пор, пока не изменится текущий маршрут, или вы снова вызываете этот метод с помощью .noneOption.

невозможно принудительно направить звук на наушники, если аксессуар не подключен к разъему для наушников (который активирует физический переключатель для передачи голоса на наушники).

Поэтому, когда вы хотите переключиться обратно нанаушники, это должно работать.И если нет подключенных наушников, переключите устройство вывода на выход маленького динамика в верхней части устройства вместо большого динамика.

let session: AVAudioSession = AVAudioSession.sharedInstance()
        do {
            try session.setCategory(AVAudioSessionCategoryPlayAndRecord)
            try session.overrideOutputAudioPort(AVAudioSession.PortOverride.none)
            try session.setActive(true)
        } catch {
            print("Couldn't override output audio port")
        }

Прочтите об этом AVAdioSession / OverrideOutputAudioPort Здесь .

Вы можете проверить, подключена ли гарнитура, добавив это расширение,

    extension AVAudioSession {

    static var isHeadphonesConnected: Bool {
        return sharedInstance().isHeadphonesConnected
    }

    var isHeadphonesConnected: Bool {
        return !currentRoute.outputs.filter { $0.isHeadphones }.isEmpty
    }

}

extension AVAudioSessionPortDescription {
    var isHeadphones: Bool {
        return portType == AVAudioSessionPortHeadphones
    }
}

И просто использовать эту строку кода

session.isHeadphonesConnected
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...