Changeset 44758 in vbox for trunk/src/VBox
- Timestamp:
- Feb 20, 2013 11:45:18 AM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 83867
- Location:
- trunk/src/VBox/Main
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/include/UsbWebcamInterface.h
r44337 r44758 34 34 35 35 static const PDMDRVREG DrvReg; 36 EMWEBCAMDRV *mpDrv;37 36 37 void EmWebcamConstruct(EMWEBCAMDRV *pDrv); 38 38 void EmWebcamDestruct(EMWEBCAMDRV *pDrv); 39 39 … … 58 58 Console * const mParent; 59 59 60 EMWEBCAMDRV *mpDrv; 60 61 EMWEBCAMREMOTE *mpRemote; 61 62 uint64_t volatile mu64DeviceIdSrc; -
trunk/src/VBox/Main/src-client/UsbWebcamInterface.cpp
r44440 r44758 25 25 26 26 27 typedef struct EMWEBCAMDRV *PEMWEBCAMDRV; 28 29 struct EMWEBCAMDRV 27 typedef struct EMWEBCAMDRV 30 28 { 31 29 EmWebcam *pEmWebcam; 30 PPDMIWEBCAMUP pIWebcamUp; 32 31 PDMIWEBCAMDOWN IWebcamDown; 33 PPDMIWEBCAMUP pIWebcamUp; 34 35 }; 36 37 struct EMWEBCAMREMOTE 32 } EMWEBCAMDRV, *PEMWEBCAMDRV; 33 34 typedef struct EMWEBCAMREMOTE 38 35 { 39 36 EmWebcam *pEmWebcam; 40 37 41 /* The remote identifier. */ 42 VRDEVIDEOINDEVICEHANDLE deviceHandle; 38 VRDEVIDEOINDEVICEHANDLE deviceHandle; /* The remote identifier. */ 39 uint32_t u32Version; /* VRDE_VIDEOIN_NEGOTIATE_VERSION */ 40 uint32_t fu32Capabilities; /* VRDE_VIDEOIN_NEGOTIATE_CAP_* */ 43 41 44 42 /* The device identifier for the PDM device.*/ 45 43 uint64_t u64DeviceId; 46 } ;44 } EMWEBCAMREMOTE; 47 45 48 46 typedef struct EMWEBCAMREQCTX … … 59 57 uint32_t cbCtrl) 60 58 { 61 LogFlowFunc(("pInterface:%p\n", pInterface));62 63 59 PEMWEBCAMDRV pThis = RT_FROM_MEMBER(pInterface, EMWEBCAMDRV, IWebcamDown); 60 61 LogFlowFunc(("pEmWebcam:%p, u64DeviceId %lld\n", pThis->pEmWebcam, u64DeviceId)); 64 62 65 63 return pThis->pEmWebcam->SendControl(pThis, pvUser, u64DeviceId, (const VRDEVIDEOINCTRLHDR *)pCtrl, cbCtrl); … … 84 82 } 85 83 84 void EmWebcam::EmWebcamConstruct(EMWEBCAMDRV *pDrv) 85 { 86 AssertReturnVoid(mpDrv == NULL); 87 88 mpDrv = pDrv; 89 } 90 86 91 void EmWebcam::EmWebcamDestruct(EMWEBCAMDRV *pDrv) 87 92 { … … 94 99 mpRemote = NULL; 95 100 } 101 102 mpDrv = NULL; 96 103 } 97 104 … … 102 109 switch (u32Id) 103 110 { 104 case VRDE_VIDEOIN_NOTIFY_ ATTACH:111 case VRDE_VIDEOIN_NOTIFY_ID_ATTACH: 105 112 { 106 113 VRDEVIDEOINNOTIFYATTACH *p = (VRDEVIDEOINNOTIFYATTACH *)pvData; 107 Assert(cbData == sizeof(VRDEVIDEOINNOTIFYATTACH)); 108 109 LogFlowFunc(("ATTACH[%d,%d]\n", p->deviceHandle.u32ClientId, p->deviceHandle.u32DeviceId)); 114 115 /* Older versions did not report u32Version and fu32Capabilities. */ 116 uint32_t u32Version = 1; 117 uint32_t fu32Capabilities = VRDE_VIDEOIN_NEGOTIATE_CAP_VOID; 118 119 if (cbData >= RT_OFFSETOF(VRDEVIDEOINNOTIFYATTACH, u32Version) + sizeof(p->u32Version)) 120 { 121 u32Version = p->u32Version; 122 } 123 124 if (cbData >= RT_OFFSETOF(VRDEVIDEOINNOTIFYATTACH, fu32Capabilities) + sizeof(p->fu32Capabilities)) 125 { 126 fu32Capabilities = p->fu32Capabilities; 127 } 128 129 LogFlowFunc(("ATTACH[%d,%d] version %d, caps 0x%08X\n", 130 p->deviceHandle.u32ClientId, p->deviceHandle.u32DeviceId, 131 u32Version, fu32Capabilities)); 110 132 111 133 /* Currently only one device is allowed. */ … … 124 146 } 125 147 126 pRemote->pEmWebcam = this; 127 pRemote->deviceHandle = p->deviceHandle; 128 pRemote->u64DeviceId = ASMAtomicIncU64(&mu64DeviceIdSrc); 148 pRemote->pEmWebcam = this; 149 pRemote->deviceHandle = p->deviceHandle; 150 pRemote->u32Version = u32Version; 151 pRemote->fu32Capabilities = fu32Capabilities; 152 pRemote->u64DeviceId = ASMAtomicIncU64(&mu64DeviceIdSrc); 129 153 130 154 mpRemote = pRemote; … … 153 177 } break; 154 178 155 case VRDE_VIDEOIN_NOTIFY_ DETACH:179 case VRDE_VIDEOIN_NOTIFY_ID_DETACH: 156 180 { 157 181 VRDEVIDEOINNOTIFYDETACH *p = (VRDEVIDEOINNOTIFYDETACH *)pvData; … … 163 187 if (mpRemote) 164 188 { 165 if (mpDrv ->pIWebcamUp)189 if (mpDrv && mpDrv->pIWebcamUp) 166 190 { 167 191 mpDrv->pIWebcamUp->pfnWebcamUpDetached(mpDrv->pIWebcamUp, … … 190 214 Assert(pRemote == mpRemote); 191 215 192 LogFlowFunc((" rcRequest %Rrc %p %p %p %d\n",193 rcRequest, pDeviceCtx, pvUser, pDeviceDesc, cbDeviceDesc));216 LogFlowFunc(("mpDrv %p, rcRequest %Rrc %p %p %p %d\n", 217 mpDrv, rcRequest, pDeviceCtx, pvUser, pDeviceDesc, cbDeviceDesc)); 194 218 195 219 if (RT_SUCCESS(rcRequest)) 196 220 { 197 if (mpDrv ->pIWebcamUp)221 if (mpDrv && mpDrv->pIWebcamUp) 198 222 { 199 223 mpDrv->pIWebcamUp->pfnWebcamUpAttached(mpDrv->pIWebcamUp, 200 224 pRemote->u64DeviceId, 201 225 (const PDMIWEBCAM_DEVICEDESC *)pDeviceDesc, 202 cbDeviceDesc); 226 cbDeviceDesc, 227 pRemote->u32Version, 228 pRemote->fu32Capabilities); 203 229 } 204 230 } … … 222 248 bool fResponse = (pvUser != NULL); 223 249 224 if (mpDrv ->pIWebcamUp)250 if (mpDrv && mpDrv->pIWebcamUp) 225 251 { 226 252 mpDrv->pIWebcamUp->pfnWebcamUpControl(mpDrv->pIWebcamUp, … … 241 267 rcRequest, pDeviceCtx, pFrame, cbFrame)); 242 268 243 if (mpDrv ->pIWebcamUp)269 if (mpDrv && mpDrv->pIWebcamUp) 244 270 { 245 271 mpDrv->pIWebcamUp->pfnWebcamUpFrame(mpDrv->pIWebcamUp, … … 293 319 /* static */ DECLCALLBACK(void *) EmWebcam::drvQueryInterface(PPDMIBASE pInterface, const char *pszIID) 294 320 { 295 LogFlowFunc(("pInterface:%p, pszIID:%s\n", __FUNCTION__, pInterface, pszIID));296 321 PPDMDRVINS pDrvIns = PDMIBASE_2_PDMDRV(pInterface); 297 322 PEMWEBCAMDRV pThis = PDMINS_2_DATA(pDrvIns, PEMWEBCAMDRV); 323 324 LogFlowFunc(("pszIID:%s\n", pszIID)); 298 325 299 326 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASE, &pDrvIns->IBase); … … 304 331 /* static */ DECLCALLBACK(int) EmWebcam::drvConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, uint32_t fFlags) 305 332 { 306 LogFlow (("%s: iInstance/#d, pCfg:%p, fFlags:%x\n", __FUNCTION__, pDrvIns->iInstance, pCfg, fFlags));333 LogFlowFunc(("iInstance:%d, pCfg:%p, fFlags:%x\n", pDrvIns->iInstance, pCfg, fFlags)); 307 334 308 335 PEMWEBCAMDRV pThis = PDMINS_2_DATA(pDrvIns, PEMWEBCAMDRV); … … 315 342 VERR_PDM_DRVINS_NO_ATTACH); 316 343 344 /* Check early that there is a device. No need to init anything if there is no device. */ 345 pThis->pIWebcamUp = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMIWEBCAMUP); 346 if (pThis->pIWebcamUp == NULL) 347 { 348 LogRel(("USBWEBCAM: Emulated webcam device does not exist.\n")); 349 return VERR_PDM_MISSING_INTERFACE; 350 } 351 317 352 void *pv = NULL; 318 353 int rc = CFGMR3QueryPtr(pCfg, "Object", &pv); 319 AssertMsgRCReturn(rc, ("Configuration error: No/bad \"Object\" value! rc=%Rrc\n", rc), rc); 320 354 if (!RT_VALID_PTR(pv)) 355 rc = VERR_INVALID_PARAMETER; 356 AssertMsgReturn(RT_SUCCESS(rc), 357 ("Configuration error: No/bad \"Object\" %p value! rc=%Rrc\n", pv, rc), rc); 358 359 /* Everything ok. Initialize. */ 321 360 pThis->pEmWebcam = (EmWebcam *)pv; 322 pThis->pEmWebcam-> mpDrv = pThis;361 pThis->pEmWebcam->EmWebcamConstruct(pThis); 323 362 324 363 pDrvIns->IBase.pfnQueryInterface = drvQueryInterface; … … 326 365 pThis->IWebcamDown.pfnWebcamDownControl = drvEmWebcamControl; 327 366 328 pThis->pIWebcamUp = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMIWEBCAMUP);329 330 AssertReturn(pThis->pIWebcamUp, VERR_PDM_MISSING_INTERFACE);331 332 367 return VINF_SUCCESS; 333 368 } … … 335 370 /* static */ DECLCALLBACK(void) EmWebcam::drvDestruct(PPDMDRVINS pDrvIns) 336 371 { 337 LogFlow(("%s: iInstance/#d\n", __FUNCTION__, pDrvIns->iInstance));338 372 PEMWEBCAMDRV pThis = PDMINS_2_DATA(pDrvIns, PEMWEBCAMDRV); 373 374 LogFlowFunc(("iInstance %d, pEmWebcam %p, pIWebcamUp %p\n", 375 pDrvIns->iInstance, pThis->pEmWebcam, pThis->pIWebcamUp)); 376 339 377 if (pThis->pEmWebcam) 340 378 {
Note:
See TracChangeset
for help on using the changeset viewer.