2012-01-20 15 views
7

Quindi, ecco cosa sta succedendo.Core Audio e l'ID dispositivo fantasma

Sto tentando di utilizzare Core Audio, in particolare i dispositivi di input. Voglio silenziare, cambiare volume, ecc. Ecc. Ho incontrato qualcosa di assolutamente bizzarro che non riesco a capire. Finora, Google non è stato di aiuto.

Quando interrogo il sistema e chiedo un elenco di tutti i dispositivi audio, viene restituito un array di ID dispositivo. In questo caso, 261, 259, 263, 257.

Utilizzando kAudioDevicePropertyDeviceName, ottengo il seguente:

261: Microfono
259: Built-in Input
263: uscita Built-in
257: iPhoneSimulatorAudioDevice

Questo va tutto bene.

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

Il problema si verifica quando si esegue una query sul sistema e si richiede l'ID del dispositivo di input predefinito. Questo metodo restituisce un ID di 269, che è non elencato nella matrice di tutti i dispositivi.

Se si tenta di utilizzare kAudioDevicePropertyDeviceName per ottenere il nome del dispositivo, viene restituita una stringa vuota. Sebbene non sembri avere un nome, se disattivo questo ID dispositivo, il mio microfono integrato si silenzia. Al contrario, se disattivo l'ID 261, che si chiama "Microfono incorporato", il mio microfono non fa non muto.

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

Per confondere ulteriormente le cose, se posso passare manualmente il mio ingresso su "Line In" e ri-eseguire il programma, ottengo un ID di 259 durante la ricerca del dispositivo di input di default, che è elencati in la matrice di tutti i dispositivi.

Quindi, per riassumere:

sto cercando di interagire con i dispositivi di input nel mio sistema. Se provo a interagire con l'ID del dispositivo 261, che è il mio "microfono incorporato", non succede nulla. Se provo a interagire con l'ID del dispositivo 269 che è, apparentemente, un ID fantasma, il mio microfono incorporato è interessato. L'ID 269 viene restituito quando interrogo il sistema per il dispositivo di input predefinito, ma non viene elencato quando interrogo il sistema per un elenco di tutti i dispositivi.

Qualcuno sa cosa sta succedendo? Sto semplicemente impazzendo?

Grazie in anticipo!

risposta

3

risolto.

Prima di tutto, l'ID dispositivo fantasma era semplicemente un dispositivo virtuale che il sistema stava utilizzando.

In secondo luogo, il motivo per cui non avrei potuto disattivare o eseguire alcuna operazione con i dispositivi effettivi era perché stavo utilizzando AudioHardwareServiceSetPropertyData anziché AudioObjectSetPropertyData.

Tutto funziona ora.

Problemi correlati