2017-06-08 4 views
0

Ich versuche CoreAudio zu verwenden, um die erwarteten Puffergrößen auf der Hardware für MacOS zu erhalten. Meine aktuelle Strategie hierfür basiert auf this technical note.kAudioDevicePropertyBufferFrameSizeRange liefert {0, 0}

Der Code wird wie folgt implementiert:

 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); 

Auf meinem aktuellen Mac (Mac Pro läuft Sierra), Der letzte Aufruf von AudioObjectGetPropertyData hier ergibt sich BufferSizeRange explizit auf { 0, 0 } gesetzt wird. Der Anruf kehrt mit 0 zurück und zeigt den Erfolg an.

Wie kann ich den Bereich möglicher Puffergrößen, die von der Hardware unterstützt werden, richtig abfragen?

+1

Erhalten Sie eine gültige 'AudioObjectID', die von Ihrem ersten' AudioObjectGetPropertyData() '- Aufruf zurückgegeben wurde? Und stimmt diese ID mit einem der Geräte überein, wenn 'system_profiler SPAudioDataType' im Terminal aufgerufen wird? Ich würde nach der Art von Standardausgabegerät suchen, das das System gerade eingestellt hat. –

+0

Das war das Problem. AudioObjectID wurde auf dem Gerät nicht auf eine gültige ID festgelegt. Vielen Dank! – Kadinski

Antwort

0

Ich verstehe nicht, wo ist dein Problem. Ich habe Ihren Code auf meinem MacBook mit OS X Sierra ausprobiert und es hat gut funktioniert. Wenn ich das Ergebnis in BufferSizeRange überprüft habe, habe ich mMinimum = 14 und mMaximum = 4096.

Ich habe gerade die falsche Initialisierung von BufferSize geändert (Sie schrieben Int32, die nicht als Variable existiert), habe ich Ersetzen Sie nullptr durch NULL, und legen Sie DevicePropertyAddress.mElement = kAudioObjectPropertyElementMaster fest, wenn Sie wissen möchten, wer das Standardausgabegerät ist.

Allerdings empfehle ich Ihnen, direkt an CoreAudio die Größe der Eigenschaft, die Sie mit AudioObjectGetPropertyDataSize wissen wollen, zu fragen und mit dem Rückgabewert einer if-Anweisung zu überprüfen.