2 * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
23 #include <Elementary.h>
26 #include <metadata_extractor.h>
29 #include <tzsh_quickpanel_service.h>
33 #include "quickpanel-ui.h"
36 #define NEED_TO_DEBUG_LOCKUP_ISSUE
40 int is_feedback_initialized;
42 Ecore_Timer *playing_timer;
45 .playing_timer = NULL,
47 .is_feedback_initialized = 0,
50 static void _quickpanel_player_free(player_h *sound_player);
52 static void _quickpanel_player_del_timeout_timer(void)
54 if (s_info.playing_timer) {
55 ecore_timer_del(s_info.playing_timer);
56 s_info.playing_timer = NULL;
60 static Eina_Bool _quickpanel_player_timeout_cb(void *data)
62 s_info.playing_timer = NULL;
64 retif(data == NULL, ECORE_CALLBACK_CANCEL, "invalid parameter");
65 player_h *sound_player = data;
67 _quickpanel_player_free(sound_player);
68 s_info.playing_timer = NULL;
70 return ECORE_CALLBACK_CANCEL;
73 static void _quickpanel_player_free_job_cb(void *data)
75 player_h sound_player = data;
76 player_state_e state = PLAYER_STATE_NONE;
78 retif(sound_player == NULL, , "invalid parameter");
80 #ifdef NEED_TO_DEBUG_LOCKUP_ISSUE
81 SERR("before stopping media");
83 if (player_get_state(sound_player, &state) == PLAYER_ERROR_NONE) {
85 INFO("the state of sound player %d", state);
87 if (state == PLAYER_STATE_PLAYING) {
88 player_stop(sound_player);
89 player_unprepare(sound_player);
91 if (state == PLAYER_STATE_READY) {
92 player_unprepare(sound_player);
95 player_destroy(sound_player);
96 #ifdef NEED_TO_DEBUG_LOCKUP_ISSUE
97 SERR("after stopping media");
101 static void _quickpanel_player_free(player_h *sound_player)
103 retif(sound_player == NULL, , "invalid parameter");
104 retif(*sound_player == NULL, , "invalid parameter");
106 ecore_job_add(_quickpanel_player_free_job_cb, *sound_player);
107 *sound_player = NULL;
110 static void _quickpanel_player_start_job_cb(void *data)
112 int ret = PLAYER_ERROR_NONE;
113 player_h *sound_player = data;
115 #ifdef NEED_TO_DEBUG_LOCKUP_ISSUE
116 SERR("before playing media");
118 ret = player_start(*sound_player);
119 if (ret != PLAYER_ERROR_NONE) { /* if directly return retor.. */
120 ERR("player_start [%d]", ret);
121 _quickpanel_player_free(sound_player);
124 s_info.playing_timer = ecore_timer_add(QP_PLAY_DURATION_LIMIT,
125 _quickpanel_player_timeout_cb, sound_player);
126 #ifdef NEED_TO_DEBUG_LOCKUP_ISSUE
127 SERR("after playing media");
131 static void _quickpanel_player_completed_cb(void *user_data)
133 retif(user_data == NULL, , "invalid parameter");
134 player_h *sound_player = user_data;
136 DBG("Media player completed");
138 _quickpanel_player_del_timeout_timer();
139 _quickpanel_player_free(sound_player);
142 static void _quickpanel_player_interrupted_cb(player_interrupted_code_e code, void *user_data)
144 retif(user_data == NULL, , "invalid parameter");
145 player_h *sound_player = user_data;
147 ERR("interrupt code [%d]", (int)code);
149 _quickpanel_player_del_timeout_timer();
150 _quickpanel_player_free(sound_player);
153 static void _quickpanel_player_error_cb(int error_code, void *user_data)
155 retif(user_data == NULL, , "invalid parameter");
156 player_h *sound_player = user_data;
158 ERR("Error code [%d]", (int)error_code);
160 _quickpanel_player_del_timeout_timer();
161 _quickpanel_player_free(sound_player);
164 HAPI int quickpanel_media_player_is_drm_error(int error_code)
166 if (error_code == PLAYER_ERROR_DRM_EXPIRED
167 || error_code == PLAYER_ERROR_DRM_NO_LICENSE
168 || error_code == PLAYER_ERROR_DRM_FUTURE_USE
169 || error_code == PLAYER_ERROR_DRM_NOT_PERMITTED) {
176 HAPI int quickpanel_media_player_play(sound_type_e sound_type, const char *sound_file)
178 player_h *sound_player = &s_info.player;
179 sound_session_type_e type = 1;
181 int ret = PLAYER_ERROR_NONE;
182 int sndRet = SOUND_MANAGER_ERROR_NONE;
183 player_state_e state = PLAYER_STATE_NONE;
185 #ifdef NEED_TO_DEBUG_LOCKUP_ISSUE
186 SERR("Start player");
188 _quickpanel_player_del_timeout_timer();
190 if (*sound_player != NULL) {
191 _quickpanel_player_free(sound_player);
194 #ifdef NEED_TO_DEBUG_LOCKUP_ISSUE
195 SERR("setting sound session start");
197 if (sound_type == SOUND_TYPE_NOTIFICATION) {
198 sound_manager_get_session_type(&type);
199 if (type != SOUND_SESSION_TYPE_NOTIFICATION) {
200 sndRet = sound_manager_set_session_type(SOUND_SESSION_TYPE_NOTIFICATION);
201 if (sndRet != SOUND_MANAGER_ERROR_NONE) {
202 ERR("sound_manager_set_session_type fail sndRet :%x",sndRet);
203 return PLAYER_ERROR_INVALID_PARAMETER;
207 #ifdef NEED_TO_DEBUG_LOCKUP_ISSUE
208 SERR("setting sound session finished");
211 #ifdef NEED_TO_DEBUG_LOCKUP_ISSUE
212 SERR("player_create start");
214 ret = player_create(sound_player);
215 if (ret != PLAYER_ERROR_NONE) {
216 ERR("creating the player handle failed[%d]", ret);
217 *sound_player = NULL;
220 #ifdef NEED_TO_DEBUG_LOCKUP_ISSUE
221 SERR("player_create finished");
224 ret = player_set_sound_type(*sound_player, sound_type);
225 if (ret != PLAYER_ERROR_NONE) {
226 ERR("player_set_sound_type() ERR: %x!!!!", ret);
227 _quickpanel_player_free(sound_player);
231 player_get_state(*sound_player, &state);
232 if (state > PLAYER_STATE_READY) {
233 _quickpanel_player_free(sound_player);
237 ret = player_set_uri(*sound_player, sound_file);
238 if (ret != PLAYER_ERROR_NONE) {
239 ERR("set attribute---profile_uri[%d]", ret);
240 _quickpanel_player_free(sound_player);
244 ret = player_prepare(*sound_player);
245 if (ret != PLAYER_ERROR_NONE) {
246 ERR("realizing the player handle failed[%d]", ret);
247 _quickpanel_player_free(sound_player);
251 player_get_state(*sound_player, &state);
252 if (state != PLAYER_STATE_READY) {
253 ERR("state of player is invalid %d", state);
254 _quickpanel_player_free(sound_player);
258 /* register callback */
259 ret = player_set_completed_cb(*sound_player, _quickpanel_player_completed_cb, sound_player);
260 if (ret != PLAYER_ERROR_NONE) {
261 ERR("player_set_completed_cb() ERR: %x!!!!", ret);
262 _quickpanel_player_free(sound_player);
266 ret = player_set_interrupted_cb(*sound_player, _quickpanel_player_interrupted_cb, sound_player);
267 if (ret != PLAYER_ERROR_NONE) {
268 _quickpanel_player_free(sound_player);
272 ret = player_set_error_cb(*sound_player, _quickpanel_player_error_cb, sound_player);
273 if (ret != PLAYER_ERROR_NONE) {
274 _quickpanel_player_free(sound_player);
278 ecore_job_add(_quickpanel_player_start_job_cb, sound_player);
279 #ifdef NEED_TO_DEBUG_LOCKUP_ISSUE
280 SERR("playing request");
286 static Eina_Bool _playable_check(const char *file_path)
289 int ret_meta = METADATA_EXTRACTOR_ERROR_NONE;
290 metadata_extractor_h metadata = NULL;
291 Eina_Bool ret = EINA_FALSE;
293 ret_meta = metadata_extractor_create(&metadata);
294 if (ret_meta != METADATA_EXTRACTOR_ERROR_NONE) {
295 ERR("Failed to create metadata extractor:%d", ret_meta);
299 if (metadata == NULL) {
300 ERR("Failed to create metadata extractor:%d", ret_meta);
304 ret_meta = metadata_extractor_set_path(metadata, file_path);
305 if (ret_meta != METADATA_EXTRACTOR_ERROR_NONE) {
306 ERR("Failed to set path to meta extractor:%d", ret_meta);
307 metadata_extractor_destroy(metadata);
310 ret_meta = metadata_extractor_get_metadata(metadata, METADATA_HAS_AUDIO, &value);
311 if (ret_meta != METADATA_EXTRACTOR_ERROR_NONE) {
312 ERR("Failed to get metadata:%d", ret_meta);
313 metadata_extractor_destroy(metadata);
317 if(value && g_strcmp0(value, "0")) {
323 DBG("%s :: playable[%d]", file_path, ret);
324 metadata_extractor_destroy(metadata);
328 HAPI Eina_Bool quickpanel_media_playable_check(const char *file_path)
330 Eina_Bool ret = EINA_FALSE;
332 /* Check file exist or not */
333 ret = ecore_file_exists(file_path);
334 if (ret == EINA_FALSE) {
335 ERR("%s file does not exist", file_path);
339 /* Check file playable or not */
340 ret = _playable_check(file_path);
341 if (ret == EINA_FALSE) {
342 ERR("%s file does not playable", file_path);
350 HAPI void quickpanel_media_player_stop(void)
352 _quickpanel_player_del_timeout_timer();
354 if (s_info.player != NULL) {
355 _quickpanel_player_free(&s_info.player);
358 quickpanel_media_player_id_set(0);
361 HAPI void quickpanel_media_player_id_set(int id)
366 HAPI int quickpanel_media_player_id_get(void)
371 HAPI int quickpanel_media_is_sound_enabled(void)
373 int snd_status = 0, ret = -1;
375 #ifdef VCONFKEY_SETAPPL_ACCESSIBILITY_TURN_OFF_ALL_SOUNDS
376 int snd_disabled_status = 0;
378 ret = vconf_get_bool(VCONFKEY_SETAPPL_ACCESSIBILITY_TURN_OFF_ALL_SOUNDS, &snd_disabled_status);
379 msgif(ret != 0, "failed to get VCONFKEY_SETAPPL_ACCESSIBILITY_TURN_OFF_ALL_SOUNDS");
380 ret = vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &snd_status);
381 msgif(ret != 0, "failed to get VCONFKEY_SETAPPL_SOUND_STATUS_BOOL");
383 if (snd_disabled_status == 0 && snd_status == 1) {
387 ret = vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &snd_status);
388 msgif(ret != 0, "failed to get VCONFKEY_SETAPPL_SOUND_STATUS_BOOL");
390 if (snd_status == 1) {
398 HAPI int quickpanel_media_is_vib_enabled(void)
400 int vib_status = 0, ret = -1;
402 ret = vconf_get_bool(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, &vib_status);
407 ERR("failed to get a value of VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL");
413 HAPI void quickpanel_media_play_feedback(void)
415 int snd_enabled = quickpanel_media_is_sound_enabled();
416 int vib_enabled = quickpanel_media_is_vib_enabled();
418 quickpanel_media_init();
420 if (snd_enabled == 1) {
421 feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_TAP);
422 } else if (vib_enabled == 1) {
423 feedback_play_type(FEEDBACK_TYPE_VIBRATION, FEEDBACK_PATTERN_TAP);
427 HAPI int quickpanel_media_set_mute_toggle(void)
431 if (quickpanel_media_is_sound_enabled() == 1 ||
432 quickpanel_media_is_vib_enabled() == 1) {
433 ret = vconf_set_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, 0);
434 msgif(ret != 0, "failed to set VCONFKEY_SETAPPL_SOUND_STATUS_BOOL");
436 ret = vconf_set_bool(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, 0);
437 msgif(ret != 0, "failed to set VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL");
441 ret = vconf_set_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, 1);
442 msgif(ret != 0, "failed to set VCONFKEY_SETAPPL_SOUND_STATUS_BOOL");
444 ret = vconf_set_bool(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, 0);
445 msgif(ret != 0, "failed to set VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL");
451 HAPI void quickpanel_media_init(void)
453 if (s_info.is_feedback_initialized == 0) {
454 if (feedback_initialize() == FEEDBACK_ERROR_NONE) {
455 s_info.is_feedback_initialized = 1;
457 ERR("failed to init feedback API");
462 HAPI void quickpanel_media_fini(void)
464 if (s_info.is_feedback_initialized == 1) {
465 if (feedback_deinitialize() == FEEDBACK_ERROR_NONE) {
466 s_info.is_feedback_initialized = 0;
468 ERR("failed to deinit feedback API");