1 /* Copyright (c) 2013-2015, The Linux Foundataion. All rights reserved. 2 * 3 * Redistribution and use in source and binary forms, with or without 4 * modification, are permitted provided that the following conditions are 5 * met: 6 * * Redistributions of source code must retain the above copyright 7 * notice, this list of conditions and the following disclaimer. 8 * * Redistributions in binary form must reproduce the above 9 * copyright notice, this list of conditions and the following 10 * disclaimer in the documentation and/or other materials provided 11 * with the distribution. 12 * * Neither the name of The Linux Foundation nor the names of its 13 * contributors may be used to endorse or promote products derived 14 * from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 */ 29 30 #define LOG_TAG "QCameraThermalAdapter" 31 32 #include <dlfcn.h> 33 #include <stdlib.h> 34 #include <utils/Errors.h> 35 36 #include "QCamera2HWI.h" 37 #include "QCameraThermalAdapter.h" 38 39 using namespace android; 40 41 namespace qcamera { 42 43 44 QCameraThermalAdapter& QCameraThermalAdapter::getInstance() 45 { 46 static QCameraThermalAdapter instance; 47 return instance; 48 } 49 50 QCameraThermalAdapter::QCameraThermalAdapter() : 51 mCallback(NULL), 52 mHandle(NULL), 53 mRegister(NULL), 54 mUnregister(NULL), 55 mCameraHandle(0), 56 mCamcorderHandle(0) 57 { 58 } 59 60 int QCameraThermalAdapter::init(QCameraThermalCallback *thermalCb) 61 { 62 const char *error = NULL; 63 int rc = NO_ERROR; 64 65 CDBG("%s E", __func__); 66 mHandle = dlopen("/vendor/lib/libthermalclient.so", RTLD_NOW); 67 if (!mHandle) { 68 error = dlerror(); 69 ALOGE("%s: dlopen failed with error %s", 70 __func__, error ? error : ""); 71 rc = UNKNOWN_ERROR; 72 goto error; 73 } 74 *(void **)&mRegister = dlsym(mHandle, "thermal_client_register_callback"); 75 if (!mRegister) { 76 error = dlerror(); 77 ALOGE("%s: dlsym failed with error code %s", 78 __func__, error ? error: ""); 79 rc = UNKNOWN_ERROR; 80 goto error2; 81 } 82 *(void **)&mUnregister = dlsym(mHandle, "thermal_client_unregister_callback"); 83 if (!mUnregister) { 84 error = dlerror(); 85 ALOGE("%s: dlsym failed with error code %s", 86 __func__, error ? error: ""); 87 rc = UNKNOWN_ERROR; 88 goto error2; 89 } 90 91 mCallback = thermalCb; 92 93 // Register camera and camcorder callbacks 94 mCameraHandle = mRegister(mStrCamera, thermalCallback, NULL); 95 if (mCameraHandle < 0) { 96 ALOGE("%s: thermal_client_register_callback failed %d", 97 __func__, mCameraHandle); 98 rc = UNKNOWN_ERROR; 99 goto error2; 100 } 101 mCamcorderHandle = mRegister(mStrCamcorder, thermalCallback, NULL); 102 if (mCamcorderHandle < 0) { 103 ALOGE("%s: thermal_client_register_callback failed %d", 104 __func__, mCamcorderHandle); 105 rc = UNKNOWN_ERROR; 106 goto error3; 107 } 108 109 CDBG("%s X", __func__); 110 return rc; 111 112 error3: 113 mCamcorderHandle = 0; 114 mUnregister(mCameraHandle); 115 error2: 116 mCameraHandle = 0; 117 dlclose(mHandle); 118 mHandle = NULL; 119 error: 120 CDBG("%s X", __func__); 121 return rc; 122 } 123 124 void QCameraThermalAdapter::deinit() 125 { 126 CDBG("%s E", __func__); 127 if (mUnregister) { 128 if (mCameraHandle) { 129 mUnregister(mCameraHandle); 130 mCameraHandle = 0; 131 } 132 if (mCamcorderHandle) { 133 mUnregister(mCamcorderHandle); 134 mCamcorderHandle = 0; 135 } 136 } 137 if (mHandle) 138 dlclose(mHandle); 139 140 mHandle = NULL; 141 mRegister = NULL; 142 mUnregister = NULL; 143 mCallback = NULL; 144 CDBG("%s X", __func__); 145 } 146 147 char QCameraThermalAdapter::mStrCamera[] = "camera"; 148 char QCameraThermalAdapter::mStrCamcorder[] = "camcorder"; 149 150 int QCameraThermalAdapter::thermalCallback(int level, 151 void *userdata, void *data) 152 { 153 int rc = 0; 154 CDBG("%s E", __func__); 155 QCameraThermalCallback *mcb = getInstance().mCallback; 156 157 if (mcb) { 158 mcb->setThermalLevel((qcamera_thermal_level_enum_t) level); 159 rc = mcb->thermalEvtHandle(mcb->getThermalLevel(), userdata, data); 160 } 161 CDBG("%s X", __func__); 162 return rc; 163 } 164 165 qcamera_thermal_level_enum_t *QCameraThermalCallback::getThermalLevel() { 166 return &mLevel; 167 } 168 169 void QCameraThermalCallback::setThermalLevel(qcamera_thermal_level_enum_t level) { 170 mLevel = level; 171 } 172 }; //namespace qcamera 173