2017-09-06 28 views
0

UIの理由から、出力デバイスがどのような種類のデバイスであるかを知りたいと考えています。たとえば、オーディオがヘッドフォンでデフォルトで行われている場合は、ヘッドフォンアイコンを表示する必要があります。出力デバイスの種類(ヘッドフォンなど)

この情報を得るには、AudioObjectGetPropertyData()kAudioDevicePropertyDataSourceを使用しています。これは、内蔵スピーカーの場合は'ispk'、ヘッドホンの場合は'hdpn'を返します。

ヘッドフォンを接続する外付けUSB-Cハブを使用するとコードが機能しません。関数呼び出しはエラー2003332927(つまり'who?')を返します。

入手できる唯一の情報は、UIDがAppleUSBAudioEngine:Burr-Brown from TI:USB audio CODEC:14412000:2であり、名前がUSB audio CODECで、製造元がBurr-Brown from TIであることです。

これ以上役に立つ情報があれば教えてください。

これは私のテストコードです:

static NSString *getDataSourceName(UInt32 dataSource) 
{ 
    switch (dataSource) 
    { 
     case 'ispk': 
      return @"internal speaker"; 
     case 'espk': 
      return @"external speaker"; 
     case 'hdpn': 
      return @"headphones"; 
     default: 
      return [NSString stringWithFormat:@"unknown type %d", dataSource]; 
    } 
} 

static void printDefaultOutputDeviceType() 
{ 
    // Get the default output device. 
    AudioDeviceID deviceID; 
    UInt32 defaultOutputPropSize = sizeof(AudioDeviceID); 
    AudioObjectPropertyAddress defaultOutputAddress = { 
     kAudioHardwarePropertyDefaultOutputDevice, 
     kAudioObjectPropertyScopeGlobal, 
     kAudioObjectPropertyElementMaster, 
    }; 
    OSStatus status = AudioObjectGetPropertyData(kAudioObjectSystemObject, 
               &defaultOutputAddress, 
               0, 
               NULL, 
               &defaultOutputPropSize, 
               &deviceID); 
    NSCAssert(status == noErr, @"Cannot get default output device: %d", status); 

    // Get the data source type for the output device. 
    AudioObjectPropertyAddress dataSourceAddress = { 
     kAudioDevicePropertyDataSource, 
     kAudioObjectPropertyScopeOutput, 
     kAudioObjectPropertyElementMaster, 
    }; 
    UInt32 dataSource; 
    UInt32 dataSourcePropSize = sizeof(dataSource); 
    status = AudioObjectGetPropertyData(deviceID, 
             &dataSourceAddress, 
             0, 
             NULL, 
             &dataSourcePropSize, 
             &dataSource); 
    if (status == noErr) { 
     NSLog(@"Audio device with ID %d is: %@", 
       deviceID, 
       getDataSourceName(dataSource)); 
    } 
    else { 
     NSLog(@"Cannot get type for device with ID %d: %d", 
       deviceID, 
       status); 
    } 
} 

答えて

0

私は答えを見つけました。 kAudioDevicePropertyTransportTypeは私が欲しかったものです。

Xcodeで列挙型をクリックすると、間違ったファイルAudioHarwareDeprecated.hが正しいAudioHardwareBase.hの代わりに表示されていたので、私はいくつかの列挙型の値を見ることができました。

#import <Foundation/Foundation.h> 
#import <CoreAudio/CoreAudio.h> 


static void logMessage(NSString *format, ...) 
{ 
    va_list args; 
    va_start(args, format); 
    NSMutableString *formattedString = [[NSMutableString alloc] initWithFormat:format 
                    arguments:args]; 
    va_end(args); 

    if (![formattedString hasSuffix:@"\n"]) { 
     [formattedString appendString:@"\n"]; 
    } 

    NSData *formattedData = [formattedString dataUsingEncoding:NSUTF8StringEncoding]; 
    [NSFileHandle.fileHandleWithStandardOutput writeData:formattedData]; 
} 

/* 
* Format a 32-bit code (for instance OSStatus) into a string. 
*/ 
static char *codeToString(UInt32 code) 
{ 
    static char str[5] = { '\0' }; 
    UInt32 swapped = CFSwapInt32HostToBig(code); 
    memcpy(str, &swapped, sizeof(swapped)); 
    return str; 
} 

static NSString *formatStatusError(OSStatus status) 
{ 
    if (status == noErr) { 
     return [NSString stringWithFormat:@"No error (%d)", status]; 
    } 

    return [NSString stringWithFormat:@"Error \"%s\" (%d)", 
      codeToString(status), 
      status]; 
} 

static void assertStatusSuccess(OSStatus status) 
{ 
    if (status != noErr) 
    { 
     logMessage(@"Got error %u: '%s'\n", status, codeToString(status)); 
     abort(); 
    } 

} 

static inline AudioObjectPropertyAddress makeGlobalPropertyAddress(AudioObjectPropertySelector selector) 
{ 
    AudioObjectPropertyAddress address = { 
     selector, 
     kAudioObjectPropertyScopeGlobal, 
     kAudioObjectPropertyElementMaster, 

    }; 
    return address; 
} 

static NSString *getStringProperty(AudioDeviceID deviceID, 
            AudioObjectPropertySelector selector) 
{ 
    AudioObjectPropertyAddress address = makeGlobalPropertyAddress(selector); 
    CFStringRef prop; 
    UInt32 propSize = sizeof(prop); 
    OSStatus status = AudioObjectGetPropertyData(deviceID, 
               &address, 
               0, 
               NULL, 
               &propSize, 
               &prop); 
    if (status != noErr) { 
     return formatStatusError(status); 
    } 
    return (__bridge_transfer NSString *)prop; 
} 

static NSString *getURLProperty(AudioDeviceID deviceID, 
           AudioObjectPropertySelector selector) 
{ 
    AudioObjectPropertyAddress address = makeGlobalPropertyAddress(selector); 
    CFURLRef prop; 
    UInt32 propSize = sizeof(prop); 
    OSStatus status = AudioObjectGetPropertyData(deviceID, 
               &address, 
               0, 
               NULL, 
               &propSize, 
               &prop); 
    if (status != noErr) { 
     return formatStatusError(status); 
    } 

    NSURL *url = (__bridge_transfer NSURL *)prop; 
    return url.absoluteString; 
} 

static NSString *getCodeProperty(AudioDeviceID deviceID, 
           AudioObjectPropertySelector selector) 
{ 
    AudioObjectPropertyAddress address = makeGlobalPropertyAddress(selector); 
    UInt32 prop; 
    UInt32 propSize = sizeof(prop); 
    OSStatus status = AudioObjectGetPropertyData(deviceID, 
               &address, 
               0, 
               NULL, 
               &propSize, 
               &prop); 
    if (status != noErr) { 
     return formatStatusError(status); 
    } 

    return [NSString stringWithFormat:@"%s (%d)", 
      codeToString(prop), 
      prop]; 
} 


static NSUInteger getChannelCount(AudioDeviceID deviceID, 
            AudioObjectPropertyScope scope) 
{ 
    AudioObjectPropertyAddress address = { 
     kAudioDevicePropertyStreamConfiguration, 
     scope, 
     kAudioObjectPropertyElementMaster, 
    }; 

    AudioBufferList streamConfiguration; 
    UInt32 propSize = sizeof(streamConfiguration); 
    OSStatus status = AudioObjectGetPropertyData(deviceID, 
               &address, 
               0, 
               NULL, 
               &propSize, 
               &streamConfiguration); 
    assertStatusSuccess(status); 

    NSUInteger channelCount = 0; 
    for (NSUInteger i = 0; i < streamConfiguration.mNumberBuffers; i++) 
    { 
     channelCount += streamConfiguration.mBuffers[i].mNumberChannels; 
    } 

    return channelCount; 
} 

static NSString *getSourceName(AudioDeviceID deviceID, 
           AudioObjectPropertyScope scope) 
{ 
    AudioObjectPropertyAddress address = { 
     kAudioDevicePropertyDataSource, 
     scope, 
     kAudioObjectPropertyElementMaster, 
    }; 

    UInt32 sourceCode; 
    UInt32 propSize = sizeof(sourceCode); 

    OSStatus status = AudioObjectGetPropertyData(deviceID, 
               &address, 
               0, 
               NULL, 
               &propSize, 
               &sourceCode); 
    if (status != noErr) { 
     return formatStatusError(status); 
    } 

    return [NSString stringWithFormat:@"%s (%d)", 
      codeToString(sourceCode), 
      sourceCode]; 
} 

static void inspectDevice(AudioDeviceID deviceID) 
{ 
    logMessage(@"Device %d", deviceID); 
    logMessage(@" - UID:    %@", getStringProperty(deviceID, kAudioDevicePropertyDeviceUID)); 
    logMessage(@" - Model UID:  %@", getStringProperty(deviceID, kAudioDevicePropertyModelUID)); 
    logMessage(@" - Name:   %@", getStringProperty(deviceID, kAudioDevicePropertyDeviceNameCFString)); 
    logMessage(@" - Manufacturer: %@", getStringProperty(deviceID, kAudioDevicePropertyDeviceManufacturerCFString)); 
    logMessage(@" - Input channels: %@", @(getChannelCount(deviceID, kAudioObjectPropertyScopeInput))); 
    logMessage(@" - Output channels: %@", @(getChannelCount(deviceID, kAudioObjectPropertyScopeOutput))); 
    logMessage(@" - Input source: %@", getSourceName(deviceID, kAudioObjectPropertyScopeInput)); 
    logMessage(@" - Output source: %@", getSourceName(deviceID, kAudioObjectPropertyScopeOutput)); 
    logMessage(@" - Transport type: %@", getCodeProperty(deviceID, kAudioDevicePropertyTransportType)); 
    logMessage(@" - Icon:   %@", getURLProperty(deviceID, kAudioDevicePropertyIcon)); 
} 

static void inspectDeviceForSelector(AudioObjectPropertySelector selector) 
{ 
    AudioDeviceID deviceID; 
    UInt32 propSize = sizeof(AudioDeviceID); 
    AudioObjectPropertyAddress address = makeGlobalPropertyAddress(selector); 
    OSStatus status = AudioObjectGetPropertyData(kAudioObjectSystemObject, 
               &address, 
               0, 
               NULL, 
               &propSize, 
               &deviceID); 
    assertStatusSuccess(status); 
    inspectDevice(deviceID); 
} 

static void inspectAllDevices() 
{ 
    // Check the number of devices. 
    AudioObjectPropertyAddress address = makeGlobalPropertyAddress(kAudioHardwarePropertyDevices); 
    UInt32 devicesDataSize; 
    OSStatus status = AudioObjectGetPropertyDataSize(kAudioObjectSystemObject, 
                &address, 
                0, 
                NULL, 
                &devicesDataSize); 
    assertStatusSuccess(status); 

    // Get the devices. 
    int count = devicesDataSize/sizeof(AudioDeviceID); 
    AudioDeviceID deviceIDs[count]; 
    status = AudioObjectGetPropertyData(kAudioObjectSystemObject, 
             &address, 
             0, 
             NULL, 
             &devicesDataSize, 
             deviceIDs); 
    assertStatusSuccess(status); 

    // Inspect them. 
    for (UInt32 i = 0; i < count; i++) { 
     inspectDevice(deviceIDs[i]); 
    } 
} 

int main(int argc, const char * argv[]) 
{ 
    @autoreleasepool { 
     logMessage(@"==== ALL DEVICES ===="); 
     inspectAllDevices(); 
     logMessage(@""); 

     logMessage(@"==== DEFAULT INPUT DEVICE ===="); 
     inspectDeviceForSelector(kAudioHardwarePropertyDefaultInputDevice); 
     logMessage(@""); 

     logMessage(@"==== DEFAULT OUTPUT DEVICE ===="); 
     inspectDeviceForSelector(kAudioHardwarePropertyDefaultOutputDevice); 
     logMessage(@""); 
    } 

    return 0; 
} 

これは私が誰ケース内のデバイスを検査するために使用している完全なプログラムでは、いくつかの例を必要とします