2017-06-08 3 views
0

J'essaie d'utiliser CoreAudio pour obtenir les tailles de buffer attendues sur le matériel pour MacOS. Ma stratégie actuelle pour cela est basée sur this technical note.kAudioDevicePropertyBufferFrameSizeRange renvoie {0, 0}

Le code est mis en œuvre comme suit:

 AudioObjectID DeviceAudioObjectID; 
     AudioObjectPropertyAddress DevicePropertyAddress; 
     UInt32 AudioDeviceQuerySize; 
     OSStatus Status; 
     int32 BufferSize = 0; 

     //Get Audio Device ID 
     DevicePropertyAddress.mSelector = kAudioHardwarePropertyDefaultOutputDevice; 
     DevicePropertyAddress.mScope = kAudioObjectPropertyScopeGlobal; 
     DevicePropertyAddress.mElement = 0; 
     AudioDeviceQuerySize = sizeof(AudioDeviceID); 
     Status = AudioObjectGetPropertyData(kAudioObjectSystemObject, &DevicePropertyAddress, 0, nullptr, &AudioDeviceQuerySize, &DeviceAudioObjectID); 

     DevicePropertyAddress.mSelector = kAudioDevicePropertyBufferFrameSizeRange; 
     DevicePropertyAddress.mScope = kAudioObjectPropertyScopeGlobal; 
     DevicePropertyAddress.mElement = kAudioObjectPropertyElementMaster; 
     AudioValueRange BufferSizeRange = { 0, 0 }; 
     AudioDeviceQuerySize = sizeof(AudioValueRange); 
     Status = AudioObjectGetPropertyData(DeviceAudioObjectID, &DevicePropertyAddress, 0, nullptr, &AudioDeviceQuerySize, &BufferSizeRange); 

Sur mon Mac actuel (un Mac Pro en cours d'exécution Sierra), le dernier AudioObjectGetPropertyData résulte ici BufferSizeRange étant explicitement mis à { 0, 0 }. L'appel revient avec 0, indiquant le succès.

Comment interroger correctement la plage de tailles de tampons possibles supportées par le matériel?

+1

Est-ce que vous obtenez un 'AudioObjectID 'valide retourné à partir de votre premier appel' AudioObjectGetPropertyData() '? Et cet identifiant correspond-il à l'un des périphériques lors de l'appel de 'system_profiler SPAudioDataType' dans le terminal? J'irais chercher le type de périphérique de sortie par défaut que le système a actuellement défini. –

+0

C'était le problème. AudioObjectID n'a pas été défini sur un ID valide sur le périphérique. Merci! – Kadinski

Répondre

0

Je ne comprends pas où est votre problème. J'ai essayé votre code sur mon MacBook avec OS X Sierra et ça a bien marché. Quand j'ai vérifié le résultat stocké dans BufferSizeRange j'ai obtenu mMinimum = 14 et mMaximum = 4096.

Je viens de changer la mauvaise initialisation de BufferSize (vous avez écrit int32 qui n'existe pas en tant que variable), j'ai remplacez nullptr par NULL et définissez DevicePropertyAddress.mElement = kAudioObjectPropertyElementMaster lorsque vous demandez à savoir qui est le périphérique de sortie par défaut.

Cependant, je vous recommande de demander directement à CoreAudio la taille de la propriété que vous voulez connaître avec AudioObjectGetPropertyDataSize et de vérifier avec une valeur de retour de fonctions d'instruction if.