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_RecorderSession.cpp
20 * @brief This file contains the implementation of the %_RecorderSession class.
24 #include <FBaseSysLog.h>
25 #include "FMedia_RecorderManager.h"
26 #include "FMedia_RecorderSession.h"
27 #include "FMedia_CameraTypes.h"
28 #include "FMedia_CameraCoordinator.h"
29 #include "FMedia_CapabilityImpl.h"
31 using namespace Tizen::Base;
33 namespace Tizen { namespace Media
36 _RecorderSession::_RecorderSession(void)
37 : __previousCameraMode(_CAMERA_MODE_NONE)
38 , __recorderDevice(_RECORDER_DEVICE_NONE)
39 , __handle(MM_INVALID_HANDLE)
40 , __pCoordinator(null)
44 _RecorderSession::~_RecorderSession(void)
48 if (__recorderDevice == _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA ||__recorderDevice == _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA)
52 if (__previousCameraMode == _CAMERA_MODE_IMAGE)
54 r = __pCoordinator->DestroyVideoRecorder();
55 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
57 SysLog(NID_MEDIA, "Release the recorder device:%d", __recorderDevice);
58 _CameraCoordinator::Release(__recorderDevice);
61 else if (__recorderDevice == _RECORDER_DEVICE_AUDIO)
63 SysLog(NID_MEDIA, "Release the audio recorder.");
64 _RecorderManager::Release(__recorderDevice);
69 SysLogException(NID_MEDIA, r, "[%s] Error while deleting recorder session", GetErrorMessage(r));
73 _RecorderSession::Construct(_RecorderDeviceType recorderDevice)
76 SysLog(NID_MEDIA, "Enter. recorder device:%d", recorderDevice);
78 if (recorderDevice == _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA ||recorderDevice == _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA)
80 __pCoordinator = _CameraCoordinator::AddInstance(recorderDevice);
81 SysTryCatch(NID_MEDIA, __pCoordinator != null, , E_SYSTEM, "[E_SYSTEM] The camera coordinator is null.");
83 if (__pCoordinator->GetMode() == _CAMERA_MODE_IMAGE)
85 r = __pCoordinator->CreateVideoRecorder();
86 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
87 __previousCameraMode = _CAMERA_MODE_IMAGE;
89 __handle = __pCoordinator->GetRecorderHandle();
91 else if (recorderDevice == _RECORDER_DEVICE_AUDIO)
93 _RecorderManager* pRecorderManager = null;
95 pRecorderManager = _RecorderManager::AddInstance(recorderDevice);
97 SysTryCatch(NID_MEDIA, pRecorderManager !=null, , r, "[%s] Propagating.", GetErrorMessage(r));
99 __handle = pRecorderManager->GetHandle();
102 __recorderDevice = recorderDevice;
106 __previousCameraMode = _CAMERA_MODE_NONE;
111 _RecorderSession::Construct(_RecorderSourceType recorderSource)
113 result r = E_SUCCESS;
114 _CameraDeviceType runningCamera = _CAMERA_DEVICE_NONE;
115 _RecorderDeviceType targetRecorder = _RECORDER_DEVICE_NONE;
116 SysLog(NID_MEDIA, "Enter.");
119 _CapabilityImpl* pCapabilityImpl = _CapabilityImpl::GetInstance();
120 SysTryReturn(NID_MEDIA, pCapabilityImpl != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error has been occurred. Capability is not obtained.");
121 SysTryReturn(NID_MEDIA, cameraCount < 1, E_DEVICE_UNAVAILABLE, E_DEVICE_UNAVAILABLE, "[E_DEVICE_UNAVAILABLE] The camera(%d) is not available.", cameraCount);
123 r = pCapabilityImpl->GetValue(L"Camera.Count", cameraCount);
124 SysTryReturn(NID_MEDIA, r == E_SUCCESS, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error has been occurred. Number of Camera was not obtained.");
126 if (recorderSource == _RECORDER_SOURCE_VIDEO)
128 if (_CameraCoordinator::HasInstance(_RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA) != null)
130 runningCamera = _CAMERA_DEVICE_PRIMARY;
132 else if (_CameraCoordinator::HasInstance(_RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA) != null)
134 runningCamera = _CAMERA_DEVICE_SECONDARY;
138 runningCamera = _CAMERA_DEVICE_PRIMARY;
140 __pCoordinator = _CameraCoordinator::AddInstance(runningCamera);
141 SysTryCatch(NID_MEDIA, __pCoordinator != null, , E_SYSTEM, "[E_SYSTEM] The camera coordinator is null.");
143 if (__pCoordinator->GetMode() == _CAMERA_MODE_IMAGE)
147 targetRecorder = (runningCamera == _CAMERA_DEVICE_PRIMARY ? _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA);
148 r = __pCoordinator->CreateVideoRecorder();
149 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
150 __previousCameraMode = _CAMERA_MODE_IMAGE;
154 if(__pCoordinator->IsCalmChangeMode(_CAMERA_MODE_VIDEO))
156 targetRecorder = (runningCamera == _CAMERA_DEVICE_PRIMARY ? _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA);
157 r = __pCoordinator->CreateVideoRecorder();
158 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
159 __previousCameraMode = _CAMERA_MODE_IMAGE;
163 // If the current coordinator(camera) is not proper state to get the recorder without flickering.
164 _CameraCoordinator::Release(runningCamera);
166 // Pick the other camera for the recorder
167 targetRecorder = (runningCamera == _CAMERA_DEVICE_PRIMARY ? _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA : _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA);
169 // Get the other coordinator(camera)
170 __pCoordinator = _CameraCoordinator::AddInstance(targetRecorder);
171 SysTryCatch(NID_MEDIA, __pCoordinator != null, , E_SYSTEM, "[E_SYSTEM] The camera coordinator is null.");
173 if(__pCoordinator->IsCalmChangeMode(_CAMERA_MODE_VIDEO))
175 r = __pCoordinator->CreateVideoRecorder();
176 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
177 __previousCameraMode = _CAMERA_MODE_IMAGE;
181 SysLogException(NID_MEDIA, E_SYSTEM, "[E_SYSTEM] Both cameras' state are not proper to change mode.");
187 else if (__pCoordinator->GetMode() == _CAMERA_MODE_VIDEO)
189 targetRecorder = (runningCamera == _CAMERA_DEVICE_PRIMARY ? _RECORDER_DEVICE_VIDEO_PRIMARY_CAMERA : _RECORDER_DEVICE_VIDEO_SECONDARY_CAMERA);
190 __previousCameraMode = _CAMERA_MODE_VIDEO;
194 SysLogException(NID_MEDIA, E_SYSTEM, "[E_SYSTEM] Camera is not working properly.");
197 __handle = __pCoordinator->GetRecorderHandle();
198 __recorderDevice = targetRecorder;
200 else if (recorderSource == _RECORDER_SOURCE_AUDIO)
202 _RecorderManager* pRecorderManager = null;
204 pRecorderManager = _RecorderManager::AddInstance(_RECORDER_DEVICE_AUDIO);
206 SysTryCatch(NID_MEDIA, pRecorderManager !=null, , r, "[%s] Propagating.", GetErrorMessage(r));
208 __handle = pRecorderManager->GetHandle();
209 __recorderDevice = _RECORDER_DEVICE_AUDIO;
218 _RecorderSession::GetHandle(void)