2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FMedia_CameraManager.cpp
20 * @brief This file contains the implementation of the %_CameraManager class.
24 #include <unique_ptr.h>
27 #include <FBaseSysLog.h>
28 #include "FMedia_CameraManager.h"
29 #include "FMedia_CameraManager.h"
30 #include "FMedia_CamPtrUtil.h"
34 using namespace Tizen::Base;
35 using namespace Tizen::Base::Collection;
37 namespace Tizen { namespace Media
39 _CameraManagerSafeHashMapT* _CameraManager::__pMap = null;
41 _CameraManagerSafeHashMapT::_CameraManagerSafeHashMapT(void)
45 _CameraManagerSafeHashMapT::~_CameraManagerSafeHashMapT(void)
48 _CameraManager::__pMap = null;
52 _CameraManagerSafeHashMapT::RemoveItems(void)
54 _CameraManager* pManager = null;
57 std::unique_ptr <IListT<_CameraDeviceType>, _ListPtrUtil::Remover > pList (GetKeysN(), _ListPtrUtil::remover);
58 SysTryReturnVoidResult(NID_MEDIA, pList.get() != null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] There is no instance.");
60 for (int i = 0; i < GetCount(); i++)
62 _CameraDeviceType deviceType = _CAMERA_DEVICE_NONE;
63 r = pList->GetAt(i, deviceType);
64 if (IsFailed(r) && deviceType == _CAMERA_DEVICE_NONE)
69 r = GetValue(deviceType, pManager);
70 if (IsFailed(r) && pManager == null)
79 _CameraManager::_CameraManager()
80 : __handle(MM_INVALID_HANDLE)
84 _CameraManager::~_CameraManager()
89 err = camera_destroy(__handle);
90 r = ConvertResult(err);
91 SysLog(NID_MEDIA, "[%s] destroyed.", GetErrorMessage(r));
95 _CameraManager::Construct(_CameraDeviceType cameraDevice)
98 camera_device_e device = CAMERA_DEVICE_CAMERA0;
100 SysLog(NID_MEDIA, "Enter. device:%d", cameraDevice);
102 device = cameraDevice == _CAMERA_DEVICE_PRIMARY ? CAMERA_DEVICE_CAMERA0 : CAMERA_DEVICE_CAMERA1;
104 err = camera_create(device, &__handle);
105 r = ConvertResult(err);
106 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
115 _CameraManager::InitSingleton()
117 result r = E_SUCCESS;
118 std::unique_ptr <_CameraManagerSafeHashMapT> pMap (new (std::nothrow) _CameraManagerSafeHashMapT());
119 SysTryReturnVoidResult(NID_MEDIA, pMap.get() != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed. The object is not created.");
121 r = pMap->Construct();
122 SysTryReturnVoidResult(NID_MEDIA, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
124 __pMap = pMap.release();
125 std::atexit(DestroySingleton);
129 _CameraManager::DestroySingleton(void)
135 _CameraManager::AddInstance(_CameraDeviceType cameraDevice)
137 result r = E_SUCCESS;
139 _CameraManager* pManager = null;
140 SysTryReturn(NID_MEDIA, cameraDevice > _CAMERA_DEVICE_NONE && cameraDevice < _CAMERA_DEVICE_MAX,
141 null, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument(cameraDevice) is used. camderDevice:%d is wrong.", cameraDevice);
143 static pthread_once_t once_block = PTHREAD_ONCE_INIT;
146 pthread_once(&once_block, InitSingleton);
148 SysTryReturn(NID_MEDIA, __pMap != null, null, r, "[%s] Propagating.", GetErrorMessage(r));
151 r = __pMap->ContainsKey(cameraDevice, out);
152 SysTryReturn(NID_MEDIA, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
156 r = __pMap->GetValue(cameraDevice, pManager);
157 SysTryReturn(NID_MEDIA, r == E_SUCCESS && pManager != null, null, r, "[%s] Propagating.", GetErrorMessage(r));
161 std::unique_ptr <_CameraManager> pMan (new (std::nothrow) _CameraManager());
162 SysTryReturn(NID_MEDIA, pMan.get() !=null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed. The object is not created.");
164 r = pMan->Construct(cameraDevice);
165 SysTryReturn(NID_MEDIA, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
167 r = __pMap->Add(cameraDevice, pMan.get());
168 SysTryReturn(NID_MEDIA, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
170 pManager = pMan.release();
177 _CameraManager::Release(_CameraDeviceType cameraDevice)
179 result r = E_SUCCESS;
183 _CameraManager* pManager = null;
184 r = __pMap->GetValue(cameraDevice, pManager);
185 SysTryReturnVoidResult(NID_MEDIA, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
187 if (pManager->ReleaseRefCount() == 0)
190 r = __pMap->Remove(cameraDevice);
191 SysTryReturnVoidResult(NID_MEDIA, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
197 _CameraManager::GetHandle(void) const
203 _CameraManager::ConvertResult(int err) const
206 if (err != ::CAMERA_ERROR_NONE)
208 SysLog(NID_MEDIA, "MM Err:0x%x", err);
212 if (err == ::CAMERA_ERROR_NONE)
216 else if (err == ::CAMERA_ERROR_INVALID_PARAMETER)
220 else if (err == ::CAMERA_ERROR_INVALID_STATE)
224 else if (err == ::CAMERA_ERROR_OUT_OF_MEMORY)
228 else if (err == ::CAMERA_ERROR_DEVICE)
232 else if (err == ::CAMERA_ERROR_INVALID_OPERATION
233 || err == ::CAMERA_ERROR_SOUND_POLICY
234 || err == ::CAMERA_ERROR_SECURITY_RESTRICTED)
238 else if (err == ::CAMERA_ERROR_DEVICE_BUSY)
242 else if (err == ::CAMERA_ERROR_DEVICE_NOT_FOUND)
244 r = E_DEVICE_UNAVAILABLE;