void
MotoCameraWrapper::toggleTorchIfNeeded()
{
    if (mCameraType == CAM_SOC) {
        setSocTorchMode(mFlashMode == CameraParameters::FLASH_MODE_TORCH);
    }
}
MotoCameraWrapper::~MotoCameraWrapper()
{
    if (mCameraType == DEFY_GREEN) {
        setSocTorchMode(false);
        mTorchThread->cancelAndWait();
        mTorchThread.clear();
    }
}
LibCameraWrapper::~LibCameraWrapper()
{
    if (mLastFlashMode == CameraParameters::FLASH_MODE_ON ||
        mLastFlashMode == CameraParameters::FLASH_MODE_TORCH)
    {
        setSocTorchMode(false);
    }
}
status_t
JordanCameraWrapper::setParameters(const CameraParameters& params)
{
    CameraParameters pars(params.flatten());
    int width, height;
    char buf[10];
    bool isWide;

    /*
     * getInt returns -1 if the value isn't present and 0 on parse failure,
     * so if it's larger than 0, we can be sure the value was parsed properly
     */
    mVideoMode = pars.getInt("cam-mode") > 0;
    pars.remove("cam-mode");

    pars.getPreviewSize(&width, &height);
    isWide = width == 848 && height == 480;

    if (isWide && !mVideoMode) {
        pars.setPreviewFrameRate(24);
    }
    if (mCameraType == CAM_BAYER && mVideoMode) {
        pars.setPreviewFrameRate(24);
    }

    if (mCameraType == CAM_SOC) {
        /*
         * libsoccamera fails to turn flash on if 16:9 recording is enabled (no matter
         * whether it's photo or video recording), thus we do it ourselves in that case.
         * Luckily libsoccamera handles the automatic flash properly also in the 16:9 case.
         */
        const char *flashMode = pars.get(CameraParameters::KEY_FLASH_MODE);
        if (flashMode != NULL) {
            if (isWide && mLastFlashMode != flashMode) {
                bool shouldBeOn = strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) == 0 ||
                                  strcmp(flashMode, CameraParameters::FLASH_MODE_ON) == 0;
                setSocTorchMode(shouldBeOn);
            }
            mLastFlashMode = flashMode;
        }
    }

    float exposure = pars.getFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION);
    /* exposure-compensation comes multiplied in the -9...9 range, while
       we need it in the -3...3 range -> adjust for that */
    exposure /= 3;

    /* format the setting in a way the lib understands */
    bool even = (exposure - round(exposure)) < 0.05;
    snprintf(buf, sizeof(buf), even ? "%.0f" : "%.2f", exposure);
    pars.set("mot-exposure-offset", buf);

    /* kill off the original setting */
    pars.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, "0");

    return mMotoInterface->setParameters(pars);
}
JordanCameraWrapper::~JordanCameraWrapper()
{
    /* mLastFlashMode is only set in the SOC case */
    if (mLastFlashMode == CameraParameters::FLASH_MODE_ON ||
        mLastFlashMode == CameraParameters::FLASH_MODE_TORCH)
    {
        setSocTorchMode(false);
    }
}
status_t
LibCameraWrapper::setParameters(const CameraParameters& params)
{
    CameraParameters pars(params.flatten());

    const char *flashMode = pars.get(CameraParameters::KEY_FLASH_MODE);
        if (flashMode != NULL) {
            if (mLastFlashMode != flashMode) {
                bool shouldBeOn = strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) == 0 ||
                                  strcmp(flashMode, CameraParameters::FLASH_MODE_ON) == 0;
                setSocTorchMode(shouldBeOn);
            }
            mLastFlashMode = flashMode;
    }

    return mLibInterface->setParameters(pars);
}