Итак, вот что происходит.
Я пытаюсь работать с Core Audio, особенно с устройствами ввода. Я хочу отключить звук, изменить громкость и т. Д. И т. Д. Я столкнулся с чем-то совершенно странным, что не могу понять. До сих пор Google не помог.
Когда я запрашиваю систему и запрашиваю список всех аудиоустройств, мне возвращается массив идентификаторов устройств. В данном случае 261, 259, 263, 257.
Используя kAudioDevicePropertyDeviceName, я получаю следующее:
261: встроенный микрофон
259: встроенный вход
263: встроенный выход
257: iPhoneSimulatorAudioDevice
Это все хорошо.
// This method returns an NSArray of all the audio devices on the system, both input and
// On my system, it returns 261, 259, 263, 257
- (NSArray*)getAudioDevices
{
AudioObjectPropertyAddress propertyAddress = {
kAudioHardwarePropertyDevices,
kAudioObjectPropertyScopeGlobal,
kAudioObjectPropertyElementMaster
};
UInt32 dataSize = 0;
OSStatus status = AudioObjectGetPropertyDataSize(kAudioObjectSystemObject, &propertyAddress, 0, NULL, &dataSize);
if(kAudioHardwareNoError != status)
{
MZLog(@"Unable to get number of audio devices. Error: %d",status);
return NULL;
}
UInt32 deviceCount = dataSize / sizeof(AudioDeviceID);
AudioDeviceID *audioDevices = malloc(dataSize);
status = AudioObjectGetPropertyData(kAudioObjectSystemObject, &propertyAddress, 0, NULL, &dataSize, audioDevices);
if(kAudioHardwareNoError != status)
{
MZLog(@"AudioObjectGetPropertyData failed when getting device IDs. Error: %d",status);
free(audioDevices), audioDevices = NULL;
return NULL;
}
NSMutableArray* devices = [NSMutableArray array];
for(UInt32 i = 0; i < deviceCount; i++)
{
MZLog(@"device found: %d",audioDevices[i]);
[devices addObject:[NSNumber numberWithInt:audioDevices[i]]];
}
free(audioDevices);
return [NSArray arrayWithArray:devices];
}
Проблема возникает, когда я запрашиваю систему и запрашиваю идентификатор устройства ввода по умолчанию. Этот метод возвращает идентификатор 269, который не указан в массиве всех устройств.
Если я пытаюсь использовать kAudioDevicePropertyDeviceName для получения имени устройства, мне возвращается пустая строка. Несмотря на то, что у него нет названия, при отключении этого идентификатора устройства мой встроенный микрофон отключится. И наоборот, если я отключаю звук 261 ID, который называется «Встроенный микрофон», мой микрофон отключает , а не .
// Gets the current default audio input device
// On my system, it returns 269, which is NOT LISTED in the array of ALL audio devices
- (AudioDeviceID)defaultInputDevice
{
AudioDeviceID defaultAudioDevice;
UInt32 propertySize = 0;
OSStatus status = noErr;
AudioObjectPropertyAddress propertyAOPA;
propertyAOPA.mElement = kAudioObjectPropertyElementMaster;
propertyAOPA.mScope = kAudioObjectPropertyScopeGlobal;
propertyAOPA.mSelector = kAudioHardwarePropertyDefaultInputDevice;
propertySize = sizeof(AudioDeviceID);
status = AudioHardwareServiceGetPropertyData(kAudioObjectSystemObject, &propertyAOPA, 0, NULL, &propertySize, &defaultAudioDevice);
if(status)
{ //Error
NSLog(@"Error %d retreiving default input device",status);
return 0;
}
return defaultAudioDevice;
}
Чтобы еще больше сбить с толку, если я вручную переключу свой ввод на «Line In» и перезапущу программу, я получу идентификатор 259 при запросе устройства ввода по умолчанию, которое равно , перечислен массив всех устройств.
Итак, подведем итог:
Я пытаюсь взаимодействовать с устройствами ввода в моей системе. Если я пытаюсь взаимодействовать с идентификатором устройства 261, который является моим «встроенным микрофоном», ничего не происходит. Если я пытаюсь взаимодействовать с идентификатором устройства 269, который, по-видимому, является фантомным идентификатором, это влияет на мой встроенный микрофон. Идентификатор 269 возвращается, когда я запрашиваю систему для устройства ввода по умолчанию, но его нет в списке, когда я запрашиваю у системы список всех устройств.
Кто-нибудь знает, что происходит? Я просто схожу с ума?
Заранее спасибо!