2017-08-16 6 views
1

J'interroge tous les périphériques d'entrée actifs dans osx, puis j'essaie d'utiliser AudioUnit pour lire de l'audio via le périphérique Bluetooth (si connecté).La requête OSX CoreAudio pour le fabricant du périphérique bluetooth renvoie NULL - Y a-t-il un moyen pour que je référence ce périphérique pour AudioComponentFindNext?

Je possède un périphérique Bluetooth qui renvoie un UID et un nom de périphérique mais ne parvient pas à renvoyer un fabricant de périphérique (kAudioObjectPropertyManufacturer).

En lisant Apple docs, je vois The unique vendor identifier, registered with Apple, for the audio component donc je dois supposer que le vendeur n'a pas pris la peine de s'inscrire avec Apple.

Sans le fabricant, je ne suis pas sûr de savoir comment sélectionner l'appareil. Le code I hérité permet comme celui-audio:

AudioComponentDescription desc; 
desc.componentType = kAudioUnitType_Output; 
desc.componentSubType = kAudioUnitSubType_VoiceProcessingIO; // 'vpio' 
desc.componentManufacturer = manufacturerName; 
desc.componentFlags = 0; 
desc.componentFlagsMask = 0; 

AudioComponent comp = AudioComponentFindNext(NULL, &desc); 
OSStatus error = AudioComponentInstanceNew(comp, &myAudioUnit); 

Est-il possible de créer un AudioUnit sans fabricant de l'appareil? Ou mieux encore, existe-t-il un moyen de créer un AudioUnit en utilisant le périphérique audio d'entrée/sortie actuel?

Répondre

1

Si vous avez l'UID d'un appareil, vous pouvez le traduire dans un dispositif ID:

// deviceUID is a CFStringRef 

AudioDeviceID deviceID = kAudioDeviceUnknown; 

AudioObjectPropertyAddress propertyAddress = { 
    .mSelector = kAudioHardwarePropertyDeviceForUID, 
    .mScope  = kAudioObjectPropertyScopeGlobal, 
    .mElement = kAudioObjectPropertyElementMaster 
}; 

AudioValueTranslation translation = { 
    &deviceUID, sizeof(deviceUID), 
    &deviceID, sizeof(deviceID) 
}; 

UInt32 specifierSize = sizeof(translation); 

auto result = AudioObjectGetPropertyData(kAudioObjectSystemObject, &propertyAddress, 0, nullptr, &specifierSize, &translation); 
if(kAudioHardwareNoError != result) { 
    // Handle error 
} 

if(kAudioDeviceUnknown == deviceID) 
    // The device isn't connected or doesn't exist 

Et à partir de là, vous pouvez définir kAudioOutputUnitProperty_CurrentDevice de l'UA avec deviceID.