• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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