diff options
Diffstat (limited to 'services')
| -rw-r--r-- | services/camera/libcameraservice/CameraHardwareInterface.h | 29 | ||||
| -rw-r--r-- | services/camera/libcameraservice/CameraService.cpp | 13 | 
2 files changed, 28 insertions, 14 deletions
diff --git a/services/camera/libcameraservice/CameraHardwareInterface.h b/services/camera/libcameraservice/CameraHardwareInterface.h index 31544b3..c3ced4c 100644 --- a/services/camera/libcameraservice/CameraHardwareInterface.h +++ b/services/camera/libcameraservice/CameraHardwareInterface.h @@ -80,24 +80,33 @@ typedef void (*data_callback_timestamp)(nsecs_t timestamp,  class CameraHardwareInterface : public virtual RefBase {  public: -    CameraHardwareInterface(hw_module_t *module, const char *name) +    CameraHardwareInterface(const char *name)      {          mDevice = 0;          mName = name; -        LOGI("Opening camera %s, this %p", name, this); -        int rc = module->methods->open(module, name, -                                       (hw_device_t **)&mDevice); -        if (rc != OK) -            LOGE("Could not open camera %s: %d", name, rc); -        initHalPreviewWindow();      }      ~CameraHardwareInterface()      {          LOGI("Destroying camera %s", mName.string()); -        int rc = mDevice->common.close(&mDevice->common); -        if (rc != OK) -            LOGE("Could not close camera %s: %d", mName.string(), rc); +        if(mDevice) { +            int rc = mDevice->common.close(&mDevice->common); +            if (rc != OK) +                LOGE("Could not close camera %s: %d", mName.string(), rc); +        } +    } + +    status_t initialize(hw_module_t *module) +    { +        LOGI("Opening camera %s", mName.string()); +        int rc = module->methods->open(module, mName.string(), +                                       (hw_device_t **)&mDevice); +        if (rc != OK) { +            LOGE("Could not open camera %s: %d", mName.string(), rc); +            return rc; +        } +        initHalPreviewWindow(); +        return rc;      }      /** Set the ANativeWindow to which preview frames are sent */ diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp index 05e7bcf..f306e4a 100644 --- a/services/camera/libcameraservice/CameraService.cpp +++ b/services/camera/libcameraservice/CameraService.cpp @@ -133,6 +133,8 @@ status_t CameraService::getCameraInfo(int cameraId,  sp<ICamera> CameraService::connect(          const sp<ICameraClient>& cameraClient, int cameraId) {      int callingPid = getCallingPid(); +    sp<CameraHardwareInterface> hardware = NULL; +      LOG1("CameraService::connect E (pid %d, id %d)", callingPid, cameraId);      if (!mModule) { @@ -187,10 +189,13 @@ sp<ICamera> CameraService::connect(      char camera_device_name[10];      snprintf(camera_device_name, sizeof(camera_device_name), "%d", cameraId); -    client = new Client(this, cameraClient, -                new CameraHardwareInterface(&mModule->common, -                                            camera_device_name), -                cameraId, info.facing, callingPid); +    hardware = new CameraHardwareInterface(camera_device_name); +    if (hardware->initialize(&mModule->common) != OK) { +        hardware.clear(); +        return NULL; +    } + +    client = new Client(this, cameraClient, hardware, cameraId, info.facing, callingPid);      mClient[cameraId] = client;      LOG1("CameraService::connect X");      return client;  | 
