4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: JongHyuk Choi <jhchoi.choi@samsung.com>, YeJin Cho <cho.yejin@samsung.com>,
7 * Seungbae Shin <seungbae.shin@samsung.com>, YoungHwan An <younghwan_.an@samsung.com>
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
25 #include "mm_player_priv.h"
26 #include "mm_player_asm.h"
28 static ASM_sound_events_t __mmplayer_asm_get_event_type(gint type);
30 gint mmplayer_asm_register(MMPlayerASM* sm, ASM_sound_cb_t callback, void* param)
32 /* read mm-session type */
33 gint sessionType = MM_SESSION_TYPE_SHARE;
34 gint errorcode = MM_ERROR_NONE;
36 gint event_type = ASM_EVENT_NONE;
43 debug_error("invalid session handle\n");
44 return MM_ERROR_PLAYER_NOT_INITIALIZED;
47 /* check if it's running on the media_server */
51 debug_log("mm-player is running on different process. Just faking pid to [%d]. :-p\n", pid);
55 debug_log("no pid has assigned. using default(current) context\n");
58 /* read session type */
59 errorcode = _mm_session_util_read_type(pid, &sessionType);
62 debug_warning("Read MMSession Type failed. use default \"share\" type\n");
63 sessionType = MM_SESSION_TYPE_SHARE;
66 errorcode = mm_session_init(sessionType);
69 debug_critical("mm_session_init() failed\n");
74 /* check if it's CALL */
75 if ( sessionType == MM_SESSION_TYPE_CALL )
77 debug_log("session type is CALL\n");
78 sm->event = ASM_EVENT_CALL;
81 else if ( sessionType == MM_SESSION_TYPE_VIDEOCALL )
83 debug_log("session type is VIDEOCALL\n");
84 sm->event = ASM_EVENT_VIDEOCALL;
88 /* interpret session type */
89 event_type = __mmplayer_asm_get_event_type(sessionType);
93 /* register audio-session-manager callback */
94 if( ! ASM_register_sound(pid, &asm_handle, event_type, ASM_STATE_NONE, callback, (void*)param, ASM_RESOURCE_NONE, &errorcode))
96 debug_critical("ASM_register_sound() failed\n");
100 /* now succeed to register our callback. take result */
101 sm->handle = asm_handle;
102 sm->state = ASM_STATE_NONE;
103 sm->event = event_type;
105 return MM_ERROR_NONE;
108 gint mmplayer_asm_deregister(MMPlayerASM* sm)
110 gint event_type = ASM_EVENT_NONE;
116 debug_error("invalid session handle\n");
117 return MM_ERROR_PLAYER_NOT_INITIALIZED;
120 /* check if it's running on the media_server */
124 debug_log("mm-player is running on different process. Just faking pid to [%d]. :-p\n", pid);
128 debug_log("no pid has assigned. using default(current) context\n");
131 /* read session type */
132 errorcode = _mm_session_util_read_type(pid, &sessionType);
135 debug_error("MMSessionReadType Fail %s\n",__func__);
136 return MM_ERROR_POLICY_INTERNAL;
139 /* check if it's CALL */
140 if ( sessionType == MM_SESSION_TYPE_CALL || sessionType == MM_SESSION_TYPE_VIDEOCALL )
142 debug_log("session type is VOICE or VIDEO CALL (%d)\n", sessionType);
143 return MM_ERROR_NONE;
146 /* interpret session type */
147 event_type = __mmplayer_asm_get_event_type(sessionType);
149 /* check if it's CALL */
150 if(sm->event == ASM_EVENT_CALL || sm->event == ASM_EVENT_VIDEOCALL)
152 debug_log("session type is VOICE or VIDEO CALL (%d)\n", sm->event);
153 return MM_ERROR_NONE;
155 event_type = sm->event;
157 if( ! ASM_unregister_sound( sm->handle, event_type, &errorcode) )
159 debug_error("Unregister sound failed 0x%X\n", errorcode);
160 return MM_ERROR_POLICY_INTERNAL;
163 return MM_ERROR_NONE;
166 gint mmplayer_asm_set_state(MMHandleType hplayer, ASM_sound_states_t state)
168 gint event_type = ASM_EVENT_NONE;
170 ASM_resource_t resource = ASM_RESOURCE_NONE;
171 mm_player_t *player = (mm_player_t *)hplayer;
172 MMPlayerASM* sm = &player->sm;
176 debug_error("invalid session handle\n");
177 return MM_ERROR_PLAYER_NOT_INITIALIZED;
180 /* check if it's running on the media_server */
184 debug_log("mm-player is running on different process. Just faking pid to [%d]. :-p\n", pid);
188 debug_log("no pid has assigned. using default(current) context\n");
191 /* read session type */
192 errorcode = _mm_session_util_read_type(pid, &sessionType);
195 debug_error("MMSessionReadType Fail\n");
196 return MM_ERROR_POLICY_INTERNAL;
199 /* check if it's CALL */
200 if ( sessionType == MM_SESSION_TYPE_CALL || sessionType == MM_SESSION_TYPE_VIDEOCALL)
202 debug_log("session type is VOICE or VIDEO CALL (%d)\n", sessionType);
203 return MM_ERROR_NONE;
206 /* check if it's CALL */
207 if(sm->event == ASM_EVENT_CALL || sm->event == ASM_EVENT_VIDEOCALL)
209 debug_log("session type is VOICE or VIDEO CALL (%d)\n", sm->event);
210 return MM_ERROR_NONE;
214 if ( ! sm->by_asm_cb )//|| sm->state == ASM_STATE_PLAYING )
219 event_type = __mmplayer_asm_get_event_type(sessionType);
221 event_type = sm->event;
223 /* check if there is video */
224 /* NOTE: resource can be set as NONE when it's not occupied or unknown resource is used. */
225 if(ASM_STATE_PLAYING == state || ASM_STATE_PAUSE == state)
227 if(player->pipeline && player->pipeline->videobin)
228 //resource = ASM_RESOURCE_VIDEO_OVERLAY | ASM_RESOURCE_HW_DECODER;
229 resource = ASM_RESOURCE_VIDEO_OVERLAY | ASM_RESOURCE_HW_DECODER;
232 if( ! ASM_set_sound_state( sm->handle, event_type, state, resource, &ret) )
234 debug_error("Set state to [%d] failed 0x%X\n", state, ret);
235 return MM_ERROR_POLICY_BLOCKED;
246 return MM_ERROR_NONE;
250 ASM_sound_events_t __mmplayer_asm_get_event_type(gint type)
252 gint event_type = ASM_EVENT_NONE;
254 /* interpret session type */
257 case MM_SESSION_TYPE_SHARE:
258 event_type = ASM_EVENT_SHARE_MMPLAYER;
261 case MM_SESSION_TYPE_EXCLUSIVE:
262 event_type = ASM_EVENT_EXCLUSIVE_MMPLAYER;
265 case MM_SESSION_TYPE_NOTIFY:
266 event_type = ASM_EVENT_NOTIFY;
269 case MM_SESSION_TYPE_ALARM:
270 event_type = ASM_EVENT_ALARM;
273 debug_critical("unexpected case!\n");