Core Audio и идентификатор фантомного устройства - PullRequest
7 голосов
/ 20 января 2012

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

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

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

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

1 Ответ

3 голосов
/ 21 января 2012

Исправлено.

Во-первых, ID фантомного устройства был просто виртуальным устройством, которое использовала система.

Во-вторых, причина, по которой я не мог отключить звук или что-либо сделать с фактическимустройств, потому что я использовал AudioHardwareServiceSetPropertyData вместо AudioObjectSetPropertyData.

Теперь все работает.

...