2016-08-19 7 views
3

В приложении я управляю лазерным проекционным устройством, используя подключенный аудиоинтерфейс USB на macOS.на macOS, может ли приложение отключить/отключить все системные аудиовыходы, которые не выбрасываются сами по себе?

Лазерное устройство принимает аналоговый звук в качестве входного сигнала.

Как функция безопасности, было бы здорово, если бы я мог сделать вывод звука из моего приложения эксклюзивным, потому что любое другое аудио из других приложений или самой ОС, которое направлено на аудиоинтерфейс USB, смешивается с мой звук управления лазером, нежелателен и потенциально опасен для безопасности.

Возможно ли на MacOS сделать эксклюзивный выход аудио вашего приложения? Я знаю, что вы можете настроить AVAudioSession на iOS для достижения этого (в некоторой степени - вы можете укусить звук других приложений, но звуки уведомлений, в свою очередь, утят ваше приложение), но что-то вроде этого возможно на Mac? Он не должен быть совместимым с AppStore.

ответ

2

Да, вы можете запросить, чтобы CoreAudio предоставил вам эксклюзивный доступ к устройству вывода звука. Это называется забивание устройства. Если вы запутали все устройства, никакое другое приложение (включая систему) не сможет выпустить звук.

Нечто подобное будет делать трюк для одного устройства:

AudioObjectPropertyAddress HOG_MODE_PROPERTY = { kAudioDevicePropertyHogMode, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; 
AudioDeviceID deviceId = // your audio device ID 
pid_t hoggingProcess = -1; // -1 means attempt to acquire exclusive access 
UInt32 size = sizeof(pid_t); 

AudioObjectSetPropertyData(deviceId, &HOG_MODE_PROPERTY, 0, NULL, size, &hoggingProcess); 
assert(hoggingProcess == getpid()); // check that you have exclusive access 

режима Hog работает путем установки AudioObject свойства kAudioDevicePropertyHogMode. Значение свойства равно -1, если устройство не забито. Если он запутан, значение является идентификатором процесса процесса забивания.

Если вы jump to definition на kAudioDevicePropertyHogMode в Xcode, вы можете прочитать заголовок doc для свойства режима hog. Это лучший способ узнать, как это свойство (и почти все что угодно и все остальное в CoreAudio) работает.

Для полноты, вот заголовок док:

    A pid_t indicating the process that currently owns exclusive access to the 
        AudioDevice or a value of -1 indicating that the device is currently 
        available to all processes. If the AudioDevice is in a non-mixable mode, 
        the HAL will automatically take hog mode on behalf of the first process to 
        start an IOProc. 
        Note that when setting this property, the value passed in is ignored. If 
        another process owns exclusive access, that remains unchanged. If the 
        current process owns exclusive access, it is released and made available to 
        all processes again. If no process has exclusive access (meaning the current 
        value is -1), this process gains ownership of exclusive access. On return, 
        the pid_t pointed to by inPropertyData will contain the new value of the 
        property. 

 Смежные вопросы

  • Нет связанных вопросов^_^