USB-интерфейс AVCaptureDevice

#objective-c #c #macos #avfoundation #iokit

#objective-c #c #macos #avfoundation #iokit

Вопрос:

Если у меня есть AVCaptureDevice, как я могу получить соответствующий USB-интерфейс, чтобы я мог получить доступ к базовому оборудованию через IOKit?

Я пытался найти его через vid amp; pid, но это не сработает, если я подключу два устройства с одинаковым vid, pid. Вот код, который я использую для извлечения vid и pid из AVCaptureDevice:

 AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithDeviceType:AVMediaTypeVideo];
NSString *modelID = [device modelID];

NSRange vidRange = [modelID rangeOfString:@"VendorID_"];
int vid = [[modelID substringWithRange:NSMakeRange(vidRange.location   9, 5)] intValue];

NSRange pidRange = [modelID rangeOfString:@"ProductID_"];
int vid = [[modelID substringWithRange:NSMakeRange(pidRange.location   10, 5)] intValue];
  

И затем я ищу соответствующий IOService:

 CFMutableDictionaryRef matchingDict = IOServiceMatching(kIOUSBDeviceClassName);
CFNumberRef numberRef;

numberRef = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, amp;vid);
CFDictionarySetValue(matchingDict, CFSTR(kUSBVendorID), numberRef);
CFRelease(numberRef);

numberRef = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, amp;pid);
CFDictionarySetValue(matchingDict, CFSTR(kUSBProductID), numberRef);
CFRelease(numberRef);

io_service_t camera = IOServiceGetMatchingService(kIOMasterPortDefault, matchingDict);
  

Ответ №1:

Возможно, комбинация AVCaptureDevice modelID и uniqueID может помочь вам найти соответствие IOService . Форматирование двух идентификаторов выглядит недокументированным и зависит от типа транспорта и носителя, но вы должны быть в состоянии что-то выяснить. Вот предварительное сопоставление для USB-аудио (потому что у меня нет USB-камер) на основе двух устройств:

 modelID: USB Headphone Set:0C76:1607
uniqueID: AppleUSBAudioEngine:Unknown Manufacturer:USB Headphone Set:14200000:2,1,
    USB Headphone Set:

    Product ID: 0x1607
    Vendor ID:  0x0c76  (Solid State System Co., Ltd.)
Version:    1.00
Speed:  Up to 12 Mb/sec
    Location ID:    0x14200000 / 9
    Current Available (mA): 1000
    Current Required (mA):  100
    Extra Operating Current (mA):   0


uniqueID: AppleUSBAudioEngine:Burr-Brown from TI              :USB Audio CODEC :14200000:2,
modelID: USB Audio CODEC :08BB:2902
    USB Audio CODEC :

    Product ID: 0x2902
    Vendor ID:  0x08bb  (Texas Instruments Japan)
Version:    1.00
Speed:  Up to 12 Mb/sec
Manufacturer:   Burr-Brown from TI
    Location ID:    0x14200000 / 10
    Current Available (mA): 1000
    Current Required (mA):  100
    Extra Operating Current (mA):   0
  

Формат (usb audio) представляет собой что-то вроде

 modelID: name:vendorID:productID
uniqueID: AppleUSBAudioEngine:Manufacturer or Unknown Manufacturer:location ID:???
  

Если USB-видео uniqueID аналогично, то комбинации productID vendorID и locationID (какой USB-порт) должно быть достаточно, чтобы однозначно идентифицировать аппаратное обеспечение базового устройства, хотя и хрупким и недокументированным способом.