"Однако, если кто-то может показать нам, как использовать эту AudioSessionProperty_AudioRouteDescription, щедрость по праву принадлежит ему."
Ну, просто NSLog () результат, и вы получите
routes: {
"RouteDetailedDescription_Inputs" = (
);
"RouteDetailedDescription_Outputs" = (
{
"RouteDetailedDescription_PortType" = Speaker;
}
);
}
К сожалению, я получаю такой же результат на iPad2 / OS 5.0, как приглушенный, так и без звука.Похоже, что он функционально эквивалентен kAudioSessionProperty_AudioRoute, радости нет.
Глядя на доски разработчика, обнаруживаю, что это часто встречающаяся проблема, лучше всего описанная с помощью
"Я сообщил об этой проблеме сrdar: // 9781189 в июле, и проблема все еще присутствует в GM. "
Так что да ... конечно, похоже, что вы SOL с этим в 5.0.
ADDENDUM:
"Но как насчет того CFDictionary, который вы регистрируете. Как я могу получить доступ к ключу" RouteDetailedDescription_PortType "?"
Бесплатный мост является вашим другом.
CFDictionaryRef asCFType = nil;
UInt32 dataSize = sizeof(asCFType);
AudioSessionGetProperty(kAudioSessionProperty_AudioRouteDescription, &dataSize, &asCFType);
NSDictionary *easyPeasy = (NSDictionary *)asCFType;
NSDictionary *firstOutput = (NSDictionary *)[[easyPeasy valueForKey:@"RouteDetailedDescription_Outputs"] objectAtIndex:0];
NSString *portType = (NSString *)[firstOutput valueForKey:@"RouteDetailedDescription_PortType"];
NSLog(@"first output port type is: %@!", portType);
производит
первый тип выходного порта: Speaker!
Многие распространенные типы CFT соединены с более удобными типами.
http://developer.apple.com/library/ios/#documentation/CoreFoundation/Conceptual/CFDesignConcepts/Articles/tollFreeBridgedTypes.html
Теперь требуетсянемного практики, чтобы правильно угадать, какие магические заклинания получат что-то полезное из словаря, как указано выше.Помощник по дампам классов по этим направлениям поможет вам освоиться с этим:
- (void)whatsInThis:(CFDictionaryRef)thingy
{
NSDictionary *dict = (NSDictionary *)thingy;
for (NSString *key in dict.allKeys)
{
id value = [dict valueForKey:key];
NSLog(@"key: %@ value type %@", key, [value class]);
if ([value isKindOfClass:[NSArray class]])
{
NSArray *array = (NSArray *)value;
for (id item in array)
{
NSLog(@" -- object type %@", [item class]);
if ([item isKindOfClass:[NSDictionary class]])
[self whatsInThis:item];
}
}
}
}
, который для нашего словаря под рукой производит (добавляя отступы для ясности)
key: RouteDetailedDescription_Inputs value type __NSCFArray
key: RouteDetailedDescription_Outputs value type __NSCFArray
-- object type __NSCFDictionary
key: RouteDetailedDescription_PortType value type __NSCFString
, который позволяетвы точно знаете, что могли бы вывести из исходного журнала, зная, что NSLog отображает массивы в () и словари в {}, поэтому правильное приведение было в высшей степени угаданным.Но некоторые структуры CFType труднее разобрать, чем это.