Маршруты вывода звука для AirPlay - PullRequest
5 голосов
/ 05 декабря 2011

Я посмотрел, но не могу найти способ получить доступ к аудио выходным маршрутам, поэтому могу определить, выходит ли звук через AirPlay.

Это то, что я нашел в Документации для iOS 5.0

kAudioSessionOutputRoute_AirPlay

Обсуждение

Эти строки используются в качестве значений для ключа kAudioSession_AudioRouteKey_Type для словаря, связанного с массивом kAudioSession_AudioRouteKey_Outputs.

Я не могу найти способ получить доступ к массиву kAudioSession_AudioRouteKey_Outputs.

Спасибо

Ответы [ 3 ]

5 голосов
/ 11 сентября 2012

Даже если кажется, что Bassem нашел решение, для завершения, вот как определить, является ли текущий выходной маршрут AirPlay или нет:

- (BOOL)isAirPlayActive{
    CFDictionaryRef currentRouteDescriptionDictionary = nil;
    UInt32 dataSize = sizeof(currentRouteDescriptionDictionary);
    AudioSessionGetProperty(kAudioSessionProperty_AudioRouteDescription, &dataSize, &currentRouteDescriptionDictionary);
    if (currentRouteDescriptionDictionary) {
        CFArrayRef outputs = CFDictionaryGetValue(currentRouteDescriptionDictionary, kAudioSession_AudioRouteKey_Outputs);
        if (outputs) {
            if(CFArrayGetCount(outputs) > 0) {
                CFDictionaryRef currentOutput = CFArrayGetValueAtIndex(outputs, 0);
                CFStringRef outputType = CFDictionaryGetValue(currentOutput, kAudioSession_AudioRouteKey_Type);
                return (CFStringCompare(outputType, kAudioSessionOutputRoute_AirPlay, 0) == kCFCompareEqualTo);
            }
        }
    }

    return NO;
}

Имейте в виду, что вам нужно #import <AudioToolbox/AudioToolbox.h>и ссылка на платформу AudioToolbox.

1 голос
/ 21 марта 2015

Начиная с iOS 6, рекомендуемый подход для этого будет использовать AVAudioSession (API на основе C AudioSession устарел с iOS 7).

let currentRoute = AVAudioSession.sharedInstance().currentRoute

currentRoute возвращает AVAudioSessionRouteDescription, очень простой класс с двумя свойствами: inputs и outputs. Каждый из них является необязательным массивом AVAudioSessionPortDescriptions, который предоставляет нам необходимую информацию о текущем маршруте:

if let outputs = currentRoute?.outputs as? [AVAudioSessionPortDescription] {
    // Usually, there will be just one output port (or none), but let's play it safe...
    if let airplayOutputs = outputs.filter { $0.portType == AVAudioSessionPortAirPlay } where !airplayOutputs.isEmpty {
        // Connected to airplay output...
    } else {
        // Not connected to airplay output...
    }
}

portType - это полезная информация здесь ... см. AVAudioSessionPortDescription документы для констант AVAudioSessionPort..., которые описывают каждый тип порта ввода / вывода, например, линейный вход / выход, встроенный в динамиках, Bluetooth LE, микрофоне гарнитуры и т. д.

Кроме того, не забудьте отреагировать на изменения маршрута, подписавшись на AVAudioSessionRouteChangeNotification.

0 голосов
/ 05 декабря 2011
CFArray *destinations;
CFNumber *currentDest;

// Get the output destination list
AudioSessionGetProperty(kAudioSessionProperty_OutputDestinations, nil, destinations);

// Get the index of the current destination (in the list above)
AudioSessionGetProperty(kAudioSessionProperty_OutputDestination, nil, currentDest);

Я не слишком уверен в точном синтаксисе, поэтому вам придётся немного позабавиться с ним, но вы должны получить общее представление.

...