Аудио выход по умолчанию - Получение уведомления об изменении устройства? (CoreAudio, Mac OS X, AudioHardwareAddPropertyListener) - PullRequest
3 голосов
/ 13 марта 2012

Я пытаюсь написать слушателя, используя CoreAudio API, когда изменяется аудиовыход по умолчанию (например, подключен разъем для наушников). Я нашел пример кода, хотя и немного устаревшего и использующего устаревшие функции (http://developer.apple.com/mac/library/samplecode/AudioDeviceNotify/Introduction/Intro.html,, но он не работал. Переписал код «правильным» способом, используя метод AudioHardwareAddPropertyListener, но все равно он не работает. Когда Я подключаю наушники, и функция, которую я зарегистрировал, не срабатывает. Я немного растерялся ... Я подозреваю, что проблема может быть в другом, но я не могу понять, где ...

Регистрационный код слушателя:

OSStatus err = noErr;
AudioObjectPropertyAddress audioDevicesAddress = { kAudioHardwarePropertyDefaultOutputDevice, KAudioObjectPropertyScopeGlobal, KAudioObjectPropertyElementMaster };
err = AudioObjectAddPropertyListener ( KAudioObjectAudioSystemObject, &AudioDevicesAddress, coreaudio_property_listener, NULL);
if (err) trace ("error on AudioObjectAddPropertyListener");

Ответы [ 2 ]

6 голосов
/ 14 марта 2012

После поиска в sourceforge проектов, использующих API CoreAudio, я обнаружил проект rtaudio и, что более важно, следующие строки:

// This is a largely undocumented but absolutely necessary
// requirement starting with OS-X 10.6.  If not called, queries and
// updates to various audio device properties are not handled
// correctly.

CFRunLoopRef theRunLoop = NULL;
AudioObjectPropertyAddress property = { kAudioHardwarePropertyRunLoop,
                                    kAudioObjectPropertyScopeGlobal,
                                    kAudioObjectPropertyElementMaster };
OSStatus result = AudioObjectSetPropertyData( kAudioObjectSystemObject, &property, 0, NULL, sizeof(CFRunLoopRef), &theRunLoop);
if ( result != noErr ) {
errorText_ = "RtApiCore::RtApiCore: error setting run loop property!";
error( RtError::WARNING );
}

После добавления этого кода мне даже не нужно было регистрировать слушателя самостоятельно.

0 голосов
/ 07 октября 2013

Попробуйте CFRunLoopRun() - это имеет тот же эффект.т.е. убедитесь, что цикл обработки событий, который вызывает ваш слушатель, работает.

...