1 /* Copyright (c) 2013, 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
getInstance()44 QCameraThermalAdapter& QCameraThermalAdapter::getInstance()
45 {
46 static QCameraThermalAdapter instance;
47 return instance;
48 }
49
QCameraThermalAdapter()50 QCameraThermalAdapter::QCameraThermalAdapter() :
51 mCallback(NULL),
52 mHandle(NULL),
53 mRegister(NULL),
54 mUnregister(NULL),
55 mCameraHandle(0),
56 mCamcorderHandle(0)
57 {
58 }
59
init(QCameraThermalCallback * thermalCb)60 int QCameraThermalAdapter::init(QCameraThermalCallback *thermalCb)
61 {
62 const char *error = NULL;
63 int rc = NO_ERROR;
64
65 ALOGV("%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 // Register camera and camcorder callbacks
92 mCameraHandle = mRegister(mStrCamera, thermalCallback, NULL);
93 if (mCameraHandle < 0) {
94 ALOGE("%s: thermal_client_register_callback failed %d",
95 __func__, mCameraHandle);
96 rc = UNKNOWN_ERROR;
97 goto error2;
98 }
99 mCamcorderHandle = mRegister(mStrCamcorder, thermalCallback, NULL);
100 if (mCamcorderHandle < 0) {
101 ALOGE("%s: thermal_client_register_callback failed %d",
102 __func__, mCamcorderHandle);
103 rc = UNKNOWN_ERROR;
104 goto error3;
105 }
106
107 mCallback = thermalCb;
108 ALOGV("%s X", __func__);
109 return rc;
110
111 error3:
112 mCamcorderHandle = 0;
113 mUnregister(mCameraHandle);
114 error2:
115 mCameraHandle = 0;
116 dlclose(mHandle);
117 mHandle = NULL;
118 error:
119 ALOGV("%s X", __func__);
120 return rc;
121 }
122
deinit()123 void QCameraThermalAdapter::deinit()
124 {
125 ALOGV("%s E", __func__);
126 if (mUnregister) {
127 if (mCameraHandle) {
128 mUnregister(mCameraHandle);
129 mCameraHandle = 0;
130 }
131 if (mCamcorderHandle) {
132 mUnregister(mCamcorderHandle);
133 mCamcorderHandle = 0;
134 }
135 }
136 if (mHandle)
137 dlclose(mHandle);
138
139 mHandle = NULL;
140 mRegister = NULL;
141 mUnregister = NULL;
142 mCallback = NULL;
143 ALOGV("%s X", __func__);
144 }
145
146 char QCameraThermalAdapter::mStrCamera[] = "camera";
147 char QCameraThermalAdapter::mStrCamcorder[] = "camcorder";
148
thermalCallback(int level,void * userdata,void * data)149 int QCameraThermalAdapter::thermalCallback(int level,
150 void *userdata, void *data)
151 {
152 int rc = 0;
153 ALOGV("%s E", __func__);
154 QCameraThermalAdapter& instance = getInstance();
155 qcamera_thermal_level_enum_t lvl = (qcamera_thermal_level_enum_t) level;
156 if (instance.mCallback)
157 rc = instance.mCallback->thermalEvtHandle(lvl, userdata, data);
158 ALOGV("%s X", __func__);
159 return rc;
160 }
161
162 }; //namespace qcamera
163