Итак, вот что происходит.
Я пытаюсь работать с 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];
}
Проблема возникает, когда я запрашиваю у системы ID устройства ввода по умолчанию. Этот метод возвращает ID 269, которого нет в массиве всех устройств.
Если я пытаюсь использовать kAudioDevicePropertyDeviceName для получения имени устройства, мне возвращается пустая строка. Несмотря на отсутствие имени, если я отключу этот идентификатор устройства, мой встроенный микрофон отключится. И наоборот, если я отключу идентификатор 261, который называется "Встроенный микрофон", мой микрофон не отключится.
// 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" и снова запущу программу, я получу ID 259 при запросе устройства ввода по умолчанию, которое есть в массиве всех устройств.
Итак, подведем итог:
Я пытаюсь взаимодействовать с устройствами ввода в моей системе. Если я пытаюсь взаимодействовать с устройством ID 261, которое является моим "Встроенным микрофоном", ничего не происходит. Если я пытаюсь взаимодействовать с устройством ID 269, которое, по-видимому, является фантомным ID, мой встроенный микрофон затронут. Идентификатор 269 возвращается при запросе системы на устройство ввода по умолчанию, но его нет в списке при запросе системы на список всех устройств.
Кто-нибудь знает, что происходит? Может, я просто схожу с ума?
Заранее спасибо!