Core Audio и идентификатор устройства Phantom

Итак, вот что происходит.

Я пытаюсь работать с 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 возвращается при запросе системы на устройство ввода по умолчанию, но его нет в списке при запросе системы на список всех устройств.

Кто-нибудь знает, что происходит? Может, я просто схожу с ума?

Заранее спасибо!

7
задан Tyler 20 January 2012 в 03:33
поделиться