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_RecorderManager.cpp
20 * @brief This file contains the implementation of the %_RecorderManager class.
24 #include <unique_ptr.h>
27 #include <FBaseSysLog.h>
28 #include "FMedia_CameraManager.h"
29 #include "FMedia_RecorderManager.h"
30 #include "FMedia_RecorderTypes.h"
32 using namespace Tizen::Base;
33 using namespace Tizen::Base::Collection;
35 namespace Tizen { namespace Media
38 _RecorderManagerSafeHashMapT* _RecorderManager::__pMap = null;
40 _RecorderManagerSafeHashMapT::_RecorderManagerSafeHashMapT(void)
44 _RecorderManagerSafeHashMapT::~_RecorderManagerSafeHashMapT(void)
47 _RecorderManager::__pMap = null;
51 _RecorderManagerSafeHashMapT::RemoveItems(void)
53 IListT <_RecorderDeviceType>* pList = null;
54 _RecorderManager* pManager = null;
58 SysTryReturnVoidResult(NID_MEDIA, pList != null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] There is no instance.");
60 for (int i = 0; i < GetCount(); i++)
62 _RecorderDeviceType deviceType = _RECORDER_DEVICE_NONE;
63 r = pList->GetAt(i, deviceType);
64 if (IsFailed(r) && deviceType == _RECORDER_DEVICE_NONE)
69 r = GetValue(deviceType, pManager);
70 if (IsFailed(r) && pManager == null)
81 _RecorderManager::_RecorderManager()
82 : __handle(MM_INVALID_HANDLE)
86 _RecorderManager::~_RecorderManager()
91 err = recorder_destroy(__handle);
92 r = ConvertResult(err);
93 SysLog(NID_MEDIA, "[%s] destroyed.", GetErrorMessage(r));
97 _RecorderManager::Construct(_CameraDeviceType cameraDevice, _RecorderDeviceType recorderDevice)
100 int err = MM_SUCCESS;
101 SysLog(NID_MEDIA, "Enter. camera device:%d, recorder device:%d", (int)cameraDevice, (int)recorderDevice);
103 if (recorderDevice == _RECORDER_DEVICE_AUDIO)
105 err = recorder_create_audiorecorder(&__handle);
106 r = ConvertResult(err);
107 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
109 else if (recorderDevice == _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA || recorderDevice == _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA)
111 _CameraManager* pCameraManager = null;
112 _CameraHandle cameraHandle = 0;
114 pCameraManager = _CameraManager::AddInstance(cameraDevice);
115 SysTryCatch(NID_MEDIA, pCameraManager != null, r = E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] _CameraHandle instance is not available.");
117 cameraHandle = pCameraManager->GetHandle();
119 err = recorder_create_videorecorder(cameraHandle, &__handle);
120 r = ConvertResult(err);
121 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
125 SysLogException(NID_MEDIA, r = E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument(cameraDevice, recorderDevice) is used. cameraDevice:%d, recorderDevice:%d is wrong.",
126 (int)cameraDevice, (int)recorderDevice);
137 _RecorderManager::InitSafeHashMapInst()
139 static _RecorderManagerSafeHashMapT map;
140 result r = E_SUCCESS;
143 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
152 _RecorderManager::AddInstance(_RecorderDeviceType recorderDevice)
154 result r = E_SUCCESS;
156 _RecorderManager* pManager = null;
158 SysTryReturn(NID_MEDIA, recorderDevice > _RECORDER_DEVICE_NONE && recorderDevice < _RECORDER_DEVICE_MAX,
159 null, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument(recorderDevice) is used. recorderDevice:%d.", (int) recorderDevice);
161 static pthread_once_t once_block = PTHREAD_ONCE_INIT;
165 pthread_once(&once_block, InitSafeHashMapInst);
167 SysTryReturn(NID_MEDIA, __pMap != null, null, r, "[%s] Propagating.", GetErrorMessage(r));
170 r = __pMap->ContainsKey(recorderDevice, out);
171 SysTryReturn(NID_MEDIA, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
175 r = __pMap->GetValue(recorderDevice, pManager);
176 SysTryReturn(NID_MEDIA, r == E_SUCCESS && pManager != null, null, r, "[%s] Propagating.", GetErrorMessage(r));
180 _CameraDeviceType cameraDevice = _CAMERA_DEVICE_NONE;
181 switch (recorderDevice)
183 case _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA:
184 cameraDevice = _CAMERA_DEVICE_PRIMARY;
186 case _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA:
187 cameraDevice = _CAMERA_DEVICE_SECONDARY;
193 std::unique_ptr <_RecorderManager> pMan (new (std::nothrow) _RecorderManager());
194 SysTryReturn(NID_MEDIA, pMan.get() !=null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The object is not created.");
196 r = pMan->Construct(cameraDevice, recorderDevice);
197 SysTryReturn(NID_MEDIA, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
199 r = __pMap->Add(recorderDevice, pMan.get());
200 SysTryReturn(NID_MEDIA, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
202 pManager = pMan.release();
205 pManager->AddRefCount();
210 _RecorderManager::Release(_RecorderDeviceType recorderDevice)
212 result r = E_SUCCESS;
216 _RecorderManager* pManager = null;
217 r = __pMap->GetValue(recorderDevice, pManager);
218 SysTryReturnVoidResult(NID_MEDIA, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
220 if (pManager->ReleaseRefCount() == 0)
223 r = __pMap->Remove(recorderDevice);
224 SysTryReturnVoidResult(NID_MEDIA, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
230 _RecorderManager::HasInstance(_RecorderDeviceType recorderDevice)
232 result r = E_SUCCESS;
233 _RecorderManager* pManager = null;
237 r = __pMap->GetValue(recorderDevice, pManager);
238 SysTryReturn(NID_MEDIA, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
244 _RecorderManager::GetHandle(void) const
250 _RecorderManager::ConvertResult(int err) const
253 if (err != ::RECORDER_ERROR_NONE)
255 SysLog(NID_MEDIA, "MM Err:0x%x", err);
259 if (err == ::RECORDER_ERROR_NONE)
263 else if (err == ::RECORDER_ERROR_INVALID_PARAMETER)
267 else if (err == ::RECORDER_ERROR_INVALID_STATE)
271 else if (err == ::RECORDER_ERROR_OUT_OF_MEMORY)
275 else if (err == ::RECORDER_ERROR_DEVICE)
279 else if (err == ::RECORDER_ERROR_INVALID_OPERATION
280 || err == ::RECORDER_ERROR_SOUND_POLICY
281 || err == ::RECORDER_ERROR_SECURITY_RESTRICTED)