4

AudioDeviceIDMac の内蔵出力を確実に取得することは可能ですか? 現在選択されている出力デバイスを取得するために使用しようとしましkAudioHardwarePropertyDefaultOutputDeviceたが、これはユーザーがシステム設定で選択したものに応じて古いデバイスになる可能性があります。内蔵スピーカーの ID のみが必要です。

AudioObjectPropertyAddress theAddress = { kAudioHardwarePropertyDefaultInputDevice,
                                          kAudioObjectPropertyScopeGlobal,
                                          kAudioObjectPropertyElementMaster };

verify_noerr (AudioObjectGetPropertyData(kAudioObjectSystemObject,
                                         &theAddress,
                                         0,
                                         NULL,
                                         &propsize,
                                         &inputDevice));

現時点では、すべてのデバイスのリストを取得し、実行してデバイスの名前文字列を確認していname == "Built-in Output"ます。これは私のマシンでは機能しますが、非常に堅牢なソリューションとは思えません! のようなものはありkAudioHardwarePropertyBuiltInOutputDeviceますか?

4

2 に答える 2

5

@ Equinox2000 の答えは機能していますが、重い文字列の比較を避ける方法があります。のセレクターで別AudioObjectのプロパティを取得するだけですkAudioDevicePropertyTransportType

aopa.mSelector = kAudioDevicePropertyTransportType;
aopa.mScope = kAudioObjectPropertyScopeGlobal;
UInt32 size = sizeof(UInt32);
UInt32 transportType = 0;
OSStatus status = AudioObjectGetPropertyData(device.deviceId, &address, 0, NULL, &size, & transportType);
if (transportType == kAudioDeviceTransportTypeBuiltIn) // that's all the checks
    // do something
于 2015-02-20T11:02:59.493 に答える
5

数日間の調査の後、私が思いつくことができる最良の答えは、あなたが言及したように組み込みの出力を探すことですが、以下のようにメーカーのチェックも追加しました...

- (NSString *)getBuiltInOutputDeviceUID
{
    NSString *deviceUID = @"";

    AudioObjectPropertyAddress aopa;
    aopa.mSelector = kAudioHardwarePropertyDevices;
    aopa.mScope = kAudioObjectPropertyScopeGlobal;
    aopa.mElement = kAudioObjectPropertyElementMaster;

    UInt32 propSize;
    OSStatus error = AudioObjectGetPropertyDataSize(kAudioObjectSystemObject, &aopa, 0, NULL, &propSize);
    if (error == noErr) {
        int deviceCount = propSize / sizeof(AudioDeviceID);
        AudioDeviceID *audioDevices = (AudioDeviceID *)malloc(propSize);
        error = AudioObjectGetPropertyData(kAudioObjectSystemObject, &aopa, 0, NULL, &propSize, audioDevices);
        if (error == noErr) {
            UInt32 propSize = sizeof(CFStringRef);
            for(int i = 1; i <= deviceCount; i++) {
                NSString *result;
                aopa.mSelector = kAudioDevicePropertyDeviceManufacturerCFString;
                error = AudioObjectGetPropertyData(audioDevices[i], &aopa, 0, NULL, &propSize, &result);
                if (error != noErr || ![result isEqualToString:@"Apple Inc."]) {
                    continue;
                }
                aopa.mSelector = kAudioDevicePropertyDeviceNameCFString;
                error = AudioObjectGetPropertyData(audioDevices[i], &aopa, 0, NULL, &propSize, &result);
                if (error != noErr || ![result isEqualToString:@"Built-in Output"]) {
                    continue;
                }
                aopa.mSelector = kAudioDevicePropertyDeviceUID;
                error = AudioObjectGetPropertyData(audioDevices[i], &aopa, 0, NULL, &propSize, &result);
                if (error == noErr) {
                    deviceUID = result;
                    break;
                }
            }
        }
        free(audioDevices);
    }
    return deviceUID;
}
于 2012-08-15T13:12:22.190 に答える