From: <ma...@us...> - 2003-02-24 13:04:24
|
Update of /cvsroot/webcam-osx/macam/driver_core In directory sc8-pr-cvs1:/tmp/cvs-serv6731 Modified Files: MyCameraCentral.h MyCameraCentral.m Log Message: added locationID functionality Index: MyCameraCentral.h =================================================================== RCS file: /cvsroot/webcam-osx/macam/driver_core/MyCameraCentral.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** MyCameraCentral.h 30 Jan 2003 11:31:48 -0000 1.4 --- MyCameraCentral.h 24 Feb 2003 13:04:20 -0000 1.5 *************** *** 84,87 **** --- 84,88 ---- - (short) indexOfCamera:(MyCameraDriver*)driver; - (unsigned long) idOfCameraWithIndex:(short)idx; + - (unsigned long) idOfCameraWithLocationID:(UInt32)locID; - (CameraError) useCameraWithID:(unsigned long)cid to:(MyCameraDriver**)outCam acceptDummy:(BOOL)acceptDummy; - (MyCameraDriver*) useDummyForError:(CameraError)err; Index: MyCameraCentral.m =================================================================== RCS file: /cvsroot/webcam-osx/macam/driver_core/MyCameraCentral.m,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** MyCameraCentral.m 30 Jan 2003 11:31:48 -0000 1.18 --- MyCameraCentral.m 24 Feb 2003 13:04:20 -0000 1.19 *************** *** 60,63 **** --- 60,65 ---- - (void) setPrefs:(id)prefs forKey:(NSString*)key; - (void) registerCameraDriver:(Class)driver; + - (CameraError) locationIdOfUSBDeviceRef:(io_service_t)usbDeviceRef to:(UInt32*)outVal; + @end *************** *** 316,319 **** --- 318,329 ---- } + - (unsigned long) idOfCameraWithLocationID:(UInt32)locID { + short i; + for (i=0;i<[cameras count];i++) { + if ([[cameras objectAtIndex:i] locationID]==locID) return [[cameras objectAtIndex:i] cid]; + } + return 0; + } + - (CameraError) useCameraWithID:(unsigned long)cid to:(MyCameraDriver**)outCam acceptDummy:(BOOL)acceptDummy { long l; *************** *** 346,355 **** if (!err) { [cam setDelegate:delegate]; ! err=[cam startupWithUsbDeviceRef:[dev usbDeviceRef]]; if (err!=CameraErrorOK) { [cam release]; cam=NULL; } ! } if (err&&acceptDummy) { //We have an error and the sender wants a dummy in case of an error cam=[self useDummyForError:err]; --- 356,365 ---- if (!err) { [cam setDelegate:delegate]; ! err=[cam startupWithUsbLocationId:[dev locationID]]; if (err!=CameraErrorOK) { [cam release]; cam=NULL; } ! } if (err&&acceptDummy) { //We have an error and the sender wants a dummy in case of an error cam=[self useDummyForError:err]; *************** *** 367,371 **** if (driver) { [driver setDelegate:delegate]; ! [driver startupWithUsbDeviceRef:NULL]; } return driver; --- 377,381 ---- if (driver) { [driver setDelegate:delegate]; ! [driver startupWithUsbLocationId:0]; } return driver; *************** *** 516,526 **** } - typedef struct MyPrivateData { - io_service_t usbDeviceRef; //A reference to our device in case we want to open it - io_object_t notification; //A reference to our notification we want when we are unplugged - CFStringRef deviceName; //The name of the device (unused) - - } MyPrivateData; - void DeviceRemoved( void *refCon,io_service_t service,natural_t messageType,void *messageArgument ) { MyCameraInfo* dev=(MyCameraInfo*)refCon; --- 526,529 ---- *************** *** 556,560 **** //Release the usb stuff ret = IOObjectRelease([dev notification]); //we don't need the usb notification any more - ret = IOObjectRelease([dev usbDeviceRef]); //we don't need the device reference any more //Initiate the driver shutdown. if ([dev driver]!=NULL) { --- 559,562 ---- *************** *** 577,580 **** --- 579,584 ---- io_object_t notification; while (usbDeviceRef = IOIteratorNext(iterator)) { + UInt32 locID; + //Setup our data object we use to track the device while it is plugged dev=[type copy]; *************** *** 585,589 **** continue; } - [dev setUsbDeviceRef:usbDeviceRef]; //Request notification if the device is unplugged --- 589,592 ---- *************** *** 601,606 **** --- 604,618 ---- continue; } + //Try to find our USB location ID + if ([self locationIdOfUSBDeviceRef:usbDeviceRef to:&locID]!=CameraErrorOK) { + #ifdef VERBOSE + NSLog(@"failed to get location id"); + #endif + [dev release]; + continue; + } //Remember the notification (we have to release it later) [dev setNotification:notification]; + [dev setLocationID:locID]; //Put the new entry to the list of available cameras *************** *** 688,691 **** --- 700,751 ---- } + - (CameraError) locationIdOfUSBDeviceRef:(io_service_t)usbDeviceRef to:(UInt32*)outVal { + UInt32 locID=0; + kern_return_t kernelErr; + SInt32 score; + IOCFPlugInInterface **plugin=NULL; + CameraError err=CameraErrorOK; + HRESULT res; + IOUSBDeviceInterface** dev=NULL; + + kernelErr = IOCreatePlugInInterfaceForService(usbDeviceRef, kIOUSBDeviceUserClientTypeID, kIOCFPlugInInterfaceID, &plugin, &score); + + if ((kernelErr!=kIOReturnSuccess)||(!plugin)) { + #ifdef VERBOSE + NSLog(@"MyCameraCentral: IOCreatePlugInInterfaceForService; Could not get plugin"); + #endif + return CameraErrorUSBProblem; + } + if (!err) { + res=(*plugin)->QueryInterface(plugin,CFUUIDGetUUIDBytes(kIOUSBDeviceInterfaceID),(LPVOID*)(&dev)); + (*plugin)->Release(plugin); + plugin=NULL; + if ((res)||(!dev)) { + #ifdef VERBOSE + NSLog(@"MyCameraCentral: IOCreatePlugInInterfaceForService; Could not get device interface"); + #endif + err=CameraErrorUSBProblem; + } + } + if (!err) { + kernelErr = (*dev)->GetLocationID(dev,&locID); + (*dev)->Release(dev); + if (kernelErr!=KERN_SUCCESS) { + #ifdef VERBOSE + NSLog(@"MyCameraCentral: IOCreatePlugInInterfaceForService; Could not get Location ID"); + #endif + err=CameraErrorUSBProblem; + } + } + if (outVal) { + if (!err) *outVal=locID; + else *outVal=0; + } + return err; + } + + + + @end |