2012-01-20 17 views
7

Así que esto es lo que está pasando.Core Audio y el dispositivo fantasma ID

Estoy intentando trabajar con Core Audio, específicamente dispositivos de entrada. Quiero silenciar, cambiar el volumen, etc., etc. He encontrado algo absolutamente extraño que no puedo entender. Hasta ahora, Google no ha sido de ayuda.

Cuando consulto el sistema y solicito una lista de todos los dispositivos de audio, recibo una serie de ID de dispositivo. En este caso, 261, 259, 263, 257.

Usando kAudioDevicePropertyDeviceName, me sale el siguiente:

261: micrófono incorporado
259: incorporado en la entrada
263: Salida incorporado
257: iPhoneSimulatorAudioDevice

Esto está muy bien.

// 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]; 
} 

El problema surge cuando a continuación, consulta el sistema y lo pido para el ID del dispositivo de entrada por defecto. Este método devuelve una ID de 269, que es y no en la lista de todos los dispositivos.

Si intento usar kAudioDevicePropertyDeviceName para obtener el nombre del dispositivo, se me devuelve una cadena vacía. Aunque no parece tener un nombre, si silencia esta identificación de dispositivo, mi micrófono incorporado se silenciará. Por el contrario, si silencia el 261 ID, que se llama "Micrófono incorporado", mi micrófono no se no mute.

// 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; 
} 

para confundir aún más las cosas, si me cambio manualmente mi entrada a "Line In" y volver a ejecutar el programa, me sale un diámetro interior de 259 cuando se consulta para el dispositivo de entrada por defecto, que es enumeran en la matriz de todos los dispositivos.

tanto, para resumir:

que estoy tratando de interactuar con los dispositivos de entrada en mi sistema. Si trato de interactuar con el ID del dispositivo 261 que es mi "Micrófono incorporado", no pasa nada. Si trato de interactuar con el ID del dispositivo 269 que es, aparentemente, una identificación fantasma, mi micrófono incorporado se ve afectado. La ID 269 se devuelve cuando consulto el sistema para el dispositivo de entrada predeterminado, pero no aparece en la lista cuando consulto en el sistema una lista de todos los dispositivos.

¿Alguien sabe lo que está sucediendo? ¿Me estoy volviendo loco?

¡Gracias de antemano!

Respuesta

3

Solucionado.

En primer lugar, la identificación del dispositivo fantasma era simplemente un dispositivo virtual que el sistema estaba utilizando.

En segundo lugar, la razón por la que no pude silenciar o hacer nada con los dispositivos reales fue porque estaba usando AudioHardwareServiceSetPropertyData en lugar de AudioObjectSetPropertyData.

Todo funciona ahora.

Cuestiones relacionadas