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 #include <sound_manager.h>
22 #include <FBaseSysLog.h>
23 #include <FMediaAudioManagerTypes.h>
24 #include <FMediaIAudioRouteEventListener.h>
25 #include "FMedia_AudioManagerConvert.h"
26 #include "FMedia_AudioRouteManagerImpl.h"
29 using namespace Tizen::Base;
30 using namespace Tizen::Base::Runtime;
31 using namespace Tizen::Base::Collection;
33 namespace Tizen { namespace Media
36 _AudioRouteManagerImpl* _AudioRouteManagerImpl::__pAudioRouteImpl = null;
38 _AudioRouteManagerImpl::_AudioRouteManagerImpl(void)
40 , __pSingleAudioRouteListner(null)
45 _AudioRouteManagerImpl::~_AudioRouteManagerImpl(void)
47 __pSingleAudioRouteListner = null;
48 sound_manager_unset_available_route_changed_cb();
49 sound_manager_unset_active_device_changed_cb();
53 _AudioRouteManagerImpl::InitAudioRouteManagerImpl(void)
55 static _AudioRouteManagerImpl instance;
56 __pAudioRouteImpl = &instance;
59 _AudioRouteManagerImpl*
60 _AudioRouteManagerImpl::GetInstance(void)
63 static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;
64 if (__pAudioRouteImpl == null)
66 pthread_once(&onceBlock, InitAudioRouteManagerImpl);
67 r = __pAudioRouteImpl->Construct();
68 SysTryCatch(NID_MEDIA, r == E_SUCCESS, ,r, "[%s] Propagating.", GetErrorMessage(r));
70 return __pAudioRouteImpl;
72 __pAudioRouteImpl = null;
77 _AudioRouteManagerImpl::Construct(void)
82 __pAudioRouteEvent.reset(new (std::nothrow) _AudioRouteEvent);
83 SysTryCatch(NID_MEDIA, __pAudioRouteEvent.get(), r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
84 r = __pAudioRouteEvent->Construct();
85 SysTryCatch(NID_MEDIA, r == E_SUCCESS , , r, "[%s] Propagating.", GetErrorMessage(r));
87 ret = sound_manager_set_available_route_changed_cb(SoundAvailableRouteChangedCallback, this);
88 r = _AudioManagerConvert::CovertSoundManagerError2Result(ret);
89 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r,
90 "[%s] Failed to perform sound_manager_set_available_route_changed_cb operation with error code : %x", GetErrorMessage(r), ret);
92 ret = sound_manager_set_active_device_changed_cb(SoundActiveDeviceChangedCallback, this);
93 r = _AudioManagerConvert::CovertSoundManagerError2Result(ret);
94 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r,
95 "[%s] Failed to perform sound_manager_set_active_device_changed_cb operation with error code : %x", GetErrorMessage(r), ret);
102 _AudioRouteManagerImpl::SoundAvailableRouteCallback(sound_route_e route, void* pUserData)
104 AudioRouteInfo* pAudioDevice = null;
105 pAudioDevice = new (std::nothrow) AudioRouteInfo(INPUT_AUDIO_DEVICE_NONE, OUTPUT_AUDIO_DEVICE_NONE);
106 SysTryReturn(NID_MEDIA, pAudioDevice != null, false, E_OUT_OF_MEMORY, " [E_OUT_OF_MEMORY] Memory allocation failed.");
107 IList* pAudioDeviceList = null;
108 pAudioDeviceList = (IList *)pUserData;
109 if ((sound_device_out_e)route < SOUND_DEVICE_OUT_SPEAKER)
110 //route returned is an Input device
112 pAudioDevice->SetInputAudioDevice((ConvertSoundIn2InputAudio((unsigned int)route)));
114 else if (route & (route - 1))
115 // route returned is a combination of output and output
116 // if it is a power of 2 then its a output device only
118 ConvertRoute2AudioDevice((unsigned int)route, *pAudioDevice);
121 // route returned is a output device
123 pAudioDevice->SetOutputAudioDevice((ConvertSoundOut2OutputAudio((unsigned int)route)));
125 pAudioDeviceList->Add(*pAudioDevice);
130 _AudioRouteManagerImpl::SoundAvailableRouteChangedCallback(sound_route_e route, bool available, void* pUserData)
132 result r = E_SUCCESS;
133 AudioRouteInfo audioRouteInfo(INPUT_AUDIO_DEVICE_NONE, OUTPUT_AUDIO_DEVICE_NONE);
134 _AudioRouteManagerImpl* pAudioRouteImpl = (_AudioRouteManagerImpl *)pUserData;
135 SysTryReturn(NID_MEDIA, pAudioRouteImpl, , E_SYSTEM, "[E_SYSTEM] A system error has been occurred. The value of pUserData is null.");
137 if ((sound_device_out_e)route < SOUND_DEVICE_OUT_SPEAKER)
139 audioRouteInfo.SetInputAudioDevice((ConvertSoundIn2InputAudio((unsigned int)route)));
141 else if (route & (route - 1))
143 ConvertRoute2AudioDevice((unsigned int)route, audioRouteInfo);
147 audioRouteInfo.SetOutputAudioDevice((ConvertSoundOut2OutputAudio((unsigned int)route)));
149 SysLog(NID_MEDIA, "Input device is %d, Output device is %d and Available is %d", audioRouteInfo.GetInputAudioDevice(), audioRouteInfo.GetOutputAudioDevice(), available);
151 _AudioRouteEventArg* pRouteEventArg = new (std::nothrow) _AudioRouteEventArg;
152 SysTryReturn(NID_MEDIA, pRouteEventArg, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
155 pRouteEventArg->SetEventType(_AUDIO_ROUTE_EVENT_ADDED);
159 pRouteEventArg->SetEventType(_AUDIO_ROUTE_EVENT_REMOVED);
161 pRouteEventArg->SetAudioRouteInfo(audioRouteInfo);
162 r = pAudioRouteImpl->__pAudioRouteEvent->FireAsync(*pRouteEventArg);
163 SysTryLog(NID_MEDIA, r == E_SUCCESS, "[%s] Failed to perform FireAsync operation.", GetErrorMessage(r));
167 _AudioRouteManagerImpl::SoundActiveDeviceChangedCallback(sound_device_in_e in, sound_device_out_e out, void* pUserData)
169 result r = E_SUCCESS;
170 AudioRouteInfo audioRouteInfo(INPUT_AUDIO_DEVICE_NONE, OUTPUT_AUDIO_DEVICE_NONE);
172 _AudioRouteManagerImpl* pAudioRouteImpl = (_AudioRouteManagerImpl *)pUserData;
173 SysTryReturn(NID_MEDIA, pAudioRouteImpl, , E_SYSTEM, "[E_SYSTEM] A system error has been occurred. The value of pUserData is null.");
175 audioRouteInfo.SetInputAudioDevice(ConvertSoundIn2InputAudio((unsigned int)in));
176 audioRouteInfo.SetOutputAudioDevice(ConvertSoundOut2OutputAudio((unsigned int)out));
178 _AudioRouteEventArg* pRouteEventArg = new (std::nothrow) _AudioRouteEventArg;
179 SysTryReturn(NID_MEDIA, pRouteEventArg, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
180 pRouteEventArg->SetEventType(_AUDIO_ROUTE_EVENT_ACTIVE_CHANGED);
181 pRouteEventArg->SetAudioRouteInfo(audioRouteInfo);
182 r = pAudioRouteImpl->__pAudioRouteEvent->FireAsync(*pRouteEventArg);
183 SysTryLog(NID_MEDIA, r == E_SUCCESS, "[%s]FireAsync failed", GetErrorMessage(r));
187 _AudioRouteManagerImpl::SetAudioRouteEventListener(IAudioRouteEventListener* pListener)
189 result r = E_SUCCESS;
190 SysTryReturn(NID_MEDIA, __pAudioRouteEvent != null, E_SYSTEM, E_SYSTEM,
191 "[E_SYSTEM] A error has been occurred. The value of __pAudioRouteEvent is null.");
192 if (__pSingleAudioRouteListner != null)
194 r = __pAudioRouteEvent->RemoveListener(*__pSingleAudioRouteListner);
195 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] RemoveListener() failed", GetErrorMessage(r));
196 __pSingleAudioRouteListner = null;
198 if (pListener != null)
200 __pSingleAudioRouteListner = pListener;
201 return __pAudioRouteEvent->AddListener(*pListener);
208 _AudioRouteManagerImpl::GetActiveBluetoothA2dpName(void)
210 int ret = SOUND_MANAGER_ERROR_NONE;
211 result r = E_SUCCESS;
212 bool isConnected = false;
213 char* pBtName = null;
214 ret = sound_manager_get_a2dp_status(&isConnected, &pBtName);
215 r = _AudioManagerConvert::CovertSoundManagerError2Result(ret);
216 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r,
217 "[%s] Failed to perform sound_manager_get_a2dp_status operation with error code : 0x%x", GetErrorMessage(r), ret);
219 if (isConnected == true)
223 String stBtName(pBtName);
230 SetLastResult(E_DEVICE_UNAVAILABLE);
238 _AudioRouteManagerImpl::GetActiveAudioStreamType(void)
240 result r = E_SUCCESS;
241 int ret = SOUND_MANAGER_ERROR_NONE;
242 sound_type_e soundType = SOUND_TYPE_SYSTEM;
243 AudioStreamType audioStreamType = AUDIO_STREAM_TYPE_NO_SOUND;
244 ret = sound_manager_get_current_sound_type(&soundType);
245 SysTryCatch(NID_MEDIA, ret == SOUND_MANAGER_ERROR_NONE, , E_SYSTEM,
246 "[E_SYSTEM] A system error has been occurred. Failed to perform sound_manager_get_current_sound_type operation with error code : 0x%x", ret);
247 r = _AudioManagerConvert::CovertSoundManagerError2Result(ret);
248 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r,
249 "[%s] Failed to perform sound_manager_get_a2dp_status operation with error code : 0x%x", GetErrorMessage(r), ret);
253 case SOUND_TYPE_SYSTEM:
254 audioStreamType = AUDIO_STREAM_TYPE_SYSTEM;
256 case SOUND_TYPE_NOTIFICATION:
257 audioStreamType = AUDIO_STREAM_TYPE_NOTIFICATION;
259 case SOUND_TYPE_ALARM:
260 audioStreamType = AUDIO_STREAM_TYPE_ALARM;
262 case SOUND_TYPE_RINGTONE:
263 audioStreamType = AUDIO_STREAM_TYPE_RINGTONE;
265 case SOUND_TYPE_MEDIA:
266 audioStreamType = AUDIO_STREAM_TYPE_MEDIA;
268 case SOUND_TYPE_CALL:
269 audioStreamType = AUDIO_STREAM_TYPE_CALL;
272 audioStreamType = AUDIO_STREAM_TYPE_NO_SOUND;
276 return audioStreamType;
279 Tizen::Base::Collection::IList*
280 _AudioRouteManagerImpl::GetAvailableAudioRouteListN()
282 result r = E_SUCCESS;
283 int ret = SOUND_MANAGER_ERROR_NONE;
284 IList* pAudioDeviceList = null;
285 pAudioDeviceList = new (std::nothrow) ArrayList();
286 SysTryReturn(NID_MEDIA, pAudioDeviceList != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
287 ret = sound_manager_foreach_available_route(SoundAvailableRouteCallback, pAudioDeviceList);
288 r = _AudioManagerConvert::CovertSoundManagerError2Result(ret);
289 SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Failed to perform sound_manager_call_session_destroy operation.", GetErrorMessage(r));
290 return pAudioDeviceList;
292 pAudioDeviceList->RemoveAll();
293 delete pAudioDeviceList;
294 pAudioDeviceList = null;
299 _AudioRouteManagerImpl::IsAudioRouteAvailable(const AudioRouteInfo& device)
301 unsigned int route = 0;
302 if (device.GetInputAudioDevice() == INPUT_AUDIO_DEVICE_NONE)
304 route = ConvertOutputAudio2SoundOut(device.GetOutputAudioDevice());
306 else if (device.GetOutputAudioDevice() == OUTPUT_AUDIO_DEVICE_NONE)
308 route = ConvertInputAudio2SoundIn(device.GetInputAudioDevice());
312 route = ConvertAudioDevice2Route(device);
316 SetLastResult(E_INVALID_ARG);
320 return sound_manager_is_route_available((sound_route_e)route);
324 _AudioRouteManagerImpl::SetActiveAudioRoute(const AudioRouteInfo& device)
326 result r = E_SUCCESS;
327 int ret = SOUND_MANAGER_ERROR_NONE;
328 unsigned int route = 0;
329 if (device.GetInputAudioDevice() == INPUT_AUDIO_DEVICE_NONE)
331 route = ConvertOutputAudio2SoundOut(device.GetOutputAudioDevice());
333 else if (device.GetOutputAudioDevice() == OUTPUT_AUDIO_DEVICE_NONE)
335 route = ConvertInputAudio2SoundIn(device.GetInputAudioDevice());
339 route = ConvertAudioDevice2Route(device);
341 SysTryReturn(NID_MEDIA, route != 0, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument is used. The value of device is wrong");
342 bool routeAvailable = sound_manager_is_route_available((sound_route_e)route);
343 SysTryReturn(NID_MEDIA, routeAvailable == true, E_SYSTEM, E_SYSTEM,
344 "[E_SYSTEM] Failed to perform sound_manager_is_route_available operation.");
345 ret = sound_manager_set_active_route((sound_route_e)route);
346 r = _AudioManagerConvert::CovertSoundManagerError2Result(ret);
347 SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Failed to perform sound_manager_set_active_route operation with error code : 0x%x", GetErrorMessage(r), ret);
352 _AudioRouteManagerImpl::GetActiveAudioRoute(void)
354 result r = E_SUCCESS;
355 int ret = SOUND_MANAGER_ERROR_NONE;
356 sound_device_in_e in = SOUND_DEVICE_IN_MIC;
357 sound_device_out_e out = SOUND_DEVICE_OUT_SPEAKER;
358 ret = sound_manager_get_active_device(&in, &out);
359 r = _AudioManagerConvert::CovertSoundManagerError2Result(ret);
360 SysTryReturn(NID_MEDIA, r == E_SUCCESS, AudioRouteInfo(INPUT_AUDIO_DEVICE_NONE, OUTPUT_AUDIO_DEVICE_NONE),
361 r, "[%s] Failed to perform sound_manager_get_active_device operation with error code : 0x%x", GetErrorMessage(r), ret);
362 return AudioRouteInfo(ConvertSoundIn2InputAudio((unsigned int)in), ConvertSoundOut2OutputAudio((unsigned int)out));
366 _AudioRouteManagerImpl::ConvertSoundIn2InputAudio(unsigned int route)
370 case SOUND_ROUTE_IN_MIC:
371 return INPUT_AUDIO_DEVICE_MIC;
372 case SOUND_ROUTE_IN_WIRED_ACCESSORY:
373 return INPUT_AUDIO_DEVICE_WIRED_ACCESSORY;
375 return INPUT_AUDIO_DEVICE_NONE;
380 _AudioRouteManagerImpl::ConvertInputAudio2SoundIn(InputAudioDevice input)
384 case INPUT_AUDIO_DEVICE_MIC:
385 return SOUND_ROUTE_IN_MIC;
386 case INPUT_AUDIO_DEVICE_WIRED_ACCESSORY:
387 return SOUND_ROUTE_IN_WIRED_ACCESSORY;
394 _AudioRouteManagerImpl::ConvertOutputAudio2SoundOut(OutputAudioDevice output)
398 case OUTPUT_AUDIO_DEVICE_SPEAKER:
399 return SOUND_ROUTE_OUT_SPEAKER;
400 case OUTPUT_AUDIO_DEVICE_WIRED_ACCESSORY:
401 return SOUND_ROUTE_OUT_WIRED_ACCESSORY;
402 case OUTPUT_AUDIO_DEVICE_BT_A2DP:
403 return SOUND_ROUTE_OUT_BLUETOOTH;
404 case OUTPUT_AUDIO_DEVICE_DOCK:
405 return SOUND_ROUTE_OUT_DOCK;
406 case OUTPUT_AUDIO_DEVICE_HDMI:
407 return SOUND_ROUTE_OUT_HDMI;
408 case OUTPUT_AUDIO_DEVICE_WFD:
409 return SOUND_ROUTE_OUT_WFD ;
410 case OUTPUT_AUDIO_DEVICE_USB_AUDIO:
411 return SOUND_ROUTE_OUT_USB_AUDIO;
418 _AudioRouteManagerImpl::ConvertAudioDevice2Route(const AudioRouteInfo &device)
420 InputAudioDevice in = device.GetInputAudioDevice();
421 OutputAudioDevice out = device.GetOutputAudioDevice();
422 if ((in == INPUT_AUDIO_DEVICE_MIC) && (out == OUTPUT_AUDIO_DEVICE_RECEIVER))
424 return SOUND_ROUTE_IN_MIC_OUT_RECEIVER;
426 if ((in == INPUT_AUDIO_DEVICE_MIC) && (out == OUTPUT_AUDIO_DEVICE_SPEAKER))
428 return SOUND_ROUTE_IN_MIC_OUT_SPEAKER;
430 if ((in == INPUT_AUDIO_DEVICE_MIC) && (out == OUTPUT_AUDIO_DEVICE_WIRED_ACCESSORY))
432 return SOUND_ROUTE_IN_MIC_OUT_HEADPHONE;
434 if ((in == INPUT_AUDIO_DEVICE_WIRED_ACCESSORY) && (out == OUTPUT_AUDIO_DEVICE_WIRED_ACCESSORY))
436 return SOUND_ROUTE_INOUT_HEADSET;
438 if ((in == INPUT_AUDIO_DEVICE_BT_SCO) && (out == OUTPUT_AUDIO_DEVICE_BT_SCO))
440 return SOUND_ROUTE_INOUT_BLUETOOTH;
446 _AudioRouteManagerImpl::ConvertSoundOut2OutputAudio(unsigned int route)
450 case SOUND_ROUTE_OUT_SPEAKER:
451 return OUTPUT_AUDIO_DEVICE_SPEAKER;
452 case SOUND_ROUTE_OUT_WIRED_ACCESSORY:
453 return OUTPUT_AUDIO_DEVICE_WIRED_ACCESSORY;
454 case SOUND_ROUTE_OUT_BLUETOOTH:
455 return OUTPUT_AUDIO_DEVICE_BT_A2DP;
456 case SOUND_ROUTE_OUT_DOCK:
457 return OUTPUT_AUDIO_DEVICE_DOCK;
458 case SOUND_ROUTE_OUT_HDMI:
459 return OUTPUT_AUDIO_DEVICE_HDMI;
460 case SOUND_ROUTE_OUT_WFD:
461 return OUTPUT_AUDIO_DEVICE_WFD;
462 case SOUND_ROUTE_OUT_USB_AUDIO:
463 return OUTPUT_AUDIO_DEVICE_USB_AUDIO;
465 return OUTPUT_AUDIO_DEVICE_NONE;
470 _AudioRouteManagerImpl::ConvertRoute2AudioDevice(unsigned int route, AudioRouteInfo& audioRouteInfo)
474 case SOUND_ROUTE_IN_MIC_OUT_RECEIVER:
475 audioRouteInfo.SetInputAudioDevice(INPUT_AUDIO_DEVICE_MIC);
476 audioRouteInfo.SetOutputAudioDevice(OUTPUT_AUDIO_DEVICE_RECEIVER);
478 case SOUND_ROUTE_IN_MIC_OUT_SPEAKER:
479 audioRouteInfo.SetInputAudioDevice(INPUT_AUDIO_DEVICE_MIC);
480 audioRouteInfo.SetOutputAudioDevice(OUTPUT_AUDIO_DEVICE_SPEAKER);
482 case SOUND_ROUTE_IN_MIC_OUT_HEADPHONE:
483 audioRouteInfo.SetInputAudioDevice(INPUT_AUDIO_DEVICE_MIC);
484 audioRouteInfo.SetOutputAudioDevice(OUTPUT_AUDIO_DEVICE_WIRED_ACCESSORY);
486 case SOUND_ROUTE_INOUT_HEADSET:
487 audioRouteInfo.SetInputAudioDevice(INPUT_AUDIO_DEVICE_WIRED_ACCESSORY);
488 audioRouteInfo.SetOutputAudioDevice(OUTPUT_AUDIO_DEVICE_WIRED_ACCESSORY);
490 case SOUND_ROUTE_INOUT_BLUETOOTH:
491 audioRouteInfo.SetInputAudioDevice(INPUT_AUDIO_DEVICE_BT_SCO);
492 audioRouteInfo.SetOutputAudioDevice(OUTPUT_AUDIO_DEVICE_BT_SCO);