2012-01-20 41 views
7

Vì vậy, đây là những gì đang diễn ra.Âm thanh chính và ID thiết bị phantom

Tôi đang cố gắng làm việc với Core Audio, thiết bị đầu vào cụ thể. Tôi muốn tắt tiếng, thay đổi âm lượng, v.v. Tôi đã gặp phải điều gì đó tuyệt đối kỳ lạ mà tôi không thể hiểu được. Vì vậy, đến nay, google đã không giúp đỡ.

Khi tôi truy vấn hệ thống và yêu cầu danh sách tất cả thiết bị âm thanh, tôi sẽ trả lại một mảng ID thiết bị. Trong trường hợp này, 261, 259, 263, 257.

Sử dụng kAudioDevicePropertyDeviceName, tôi nhận được như sau:

261: Built-in Microphone
259: Built-in Input
263: Built-in Output
257: iPhoneSimulatorAudioDevice

Điều này là tốt và tốt.

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

Vấn đề nảy sinh khi tôi truy vấn hệ thống và yêu cầu ID của thiết bị nhập mặc định. Phương thức này trả về một ID 269, là không phải là được liệt kê trong mảng của tất cả các thiết bị.

Nếu tôi cố gắng sử dụng kAudioDevicePropertyDeviceName để lấy tên thiết bị, tôi sẽ trả về một chuỗi rỗng. Mặc dù nó dường như không có tên, nếu tôi tắt tiếng ID thiết bị này, micrô tích hợp của tôi sẽ tắt tiếng. Ngược lại, nếu tôi tắt tiếng ID 261, được đặt tên là "Micrô tích hợp", micrô của tôi sẽ làm không phải là tắt tiếng.

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

Để nhầm lẫn thêm điều gì đó, nếu tôi tự chuyển đổi đầu vào của tôi để "Line In" và chạy lại chương trình, tôi nhận được một ID của 259 khi truy vấn cho các thiết bị đầu vào mặc định, mà liệt kê trong mảng của tất cả các thiết bị.

Vì vậy, để tóm tắt:

Tôi đang cố gắng tương tác với các thiết bị đầu vào trong hệ thống của tôi. Nếu tôi cố gắng tương tác với thiết bị ID 261 là "Built-In Microphone" của tôi, không có gì xảy ra. Nếu tôi cố gắng tương tác với ID thiết bị 269, rõ ràng là một ID ảo, micrô tích hợp của tôi bị ảnh hưởng. 269 ​​ID được trả lại khi tôi truy vấn hệ thống cho thiết bị đầu vào mặc định, nhưng nó không được liệt kê khi tôi truy vấn hệ thống để có danh sách tất cả các thiết bị.

Có ai biết điều gì đang xảy ra không? Tôi chỉ đơn giản là điên khùng?

Cảm ơn trước!

Trả lời

3

Đã sửa lỗi.

Trước hết, ID thiết bị ảo chỉ đơn giản là một thiết bị ảo mà hệ thống đang sử dụng.

Thứ hai, lý do tôi không thể tắt tiếng hoặc làm bất cứ điều gì với các thiết bị thực tế là vì tôi đã sử dụng AudioHardwareServiceSetPropertyData thay vì AudioObjectSetPropertyData.

Tất cả đều hoạt động ngay bây giờ.

Các vấn đề liên quan