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.
24 #include "mm_wfd_sink_manager.h"
27 static gpointer __mm_wfd_sink_manager_thread(gpointer data);
29 int _mm_wfd_sink_init_manager(mm_wfd_sink_t *wfd_sink)
31 wfd_sink_debug_fenter();
33 wfd_sink_return_val_if_fail(wfd_sink, MM_ERROR_WFD_NOT_INITIALIZED);
35 /* create manager mutex */
36 g_mutex_init(&(wfd_sink->manager_thread_mutex));
38 /* create capture cond */
39 g_cond_init(&(wfd_sink->manager_thread_cond));
41 wfd_sink->manager_thread_cmd = NULL;
42 wfd_sink->manager_thread_exit = FALSE;
44 /* create manager thread */
45 wfd_sink->manager_thread =
46 g_thread_new("__mm_wfd_sink_manager_thread", __mm_wfd_sink_manager_thread, (gpointer)wfd_sink);
47 if (wfd_sink->manager_thread == NULL) {
48 wfd_sink_error("failed to create manager thread\n");
52 wfd_sink_debug_fleave();
57 g_mutex_clear(&(wfd_sink->manager_thread_mutex));
58 g_cond_clear(&(wfd_sink->manager_thread_cond));
60 return MM_ERROR_WFD_INTERNAL;
63 int _mm_wfd_sink_release_manager(mm_wfd_sink_t *wfd_sink)
65 wfd_sink_debug_fenter();
67 wfd_sink_return_val_if_fail(wfd_sink, MM_ERROR_WFD_NOT_INITIALIZED);
69 /* release manager thread */
70 if (wfd_sink->manager_thread) {
71 WFD_SINK_MANAGER_APPEND_CMD(wfd_sink, WFD_SINK_MANAGER_CMD_EXIT);
72 WFD_SINK_MANAGER_SIGNAL_CMD(wfd_sink);
74 wfd_sink_debug("waitting for manager thread exit");
75 g_thread_join(wfd_sink->manager_thread);
76 g_mutex_clear(&(wfd_sink->manager_thread_mutex));
77 g_cond_clear(&(wfd_sink->manager_thread_cond));
78 wfd_sink_debug("manager thread released");
81 wfd_sink_debug_fleave();
87 __mm_wfd_sink_manager_thread(gpointer data)
89 mm_wfd_sink_t *wfd_sink = (mm_wfd_sink_t *) data;
90 WFDSinkManagerCMDType cmd = WFD_SINK_MANAGER_CMD_NONE;
93 wfd_sink_debug_fenter();
95 wfd_sink_return_val_if_fail(wfd_sink, NULL);
97 if (wfd_sink->manager_thread_exit) {
98 wfd_sink_debug("exit manager thread...");
102 wfd_sink_debug("manager thread started. waiting for signal");
105 WFD_SINK_MANAGER_LOCK(wfd_sink);
106 WFD_SINK_MANAGER_WAIT_CMD(wfd_sink);
108 for (walk = wfd_sink->manager_thread_cmd; walk; walk = g_list_next(walk)) {
109 cmd = GPOINTER_TO_INT(walk->data);
111 wfd_sink_debug("got command %d", cmd);
114 case WFD_SINK_MANAGER_CMD_LINK_A_DECODEBIN:
115 wfd_sink_debug("try to link audio decodebin.");
116 if (MM_ERROR_NONE != __mm_wfd_sink_link_audio_decodebin(wfd_sink)) {
117 wfd_sink_error("failed to link audio decodebin.....\n");
121 case WFD_SINK_MANAGER_CMD_LINK_V_DECODEBIN:
122 wfd_sink_debug("try to link video decodebin.");
123 if (MM_ERROR_NONE != __mm_wfd_sink_link_video_decodebin(wfd_sink)) {
124 wfd_sink_error("failed to link video decodebin.....\n");
128 case WFD_SINK_MANAGER_CMD_PREPARE_A_PIPELINE:
129 wfd_sink_debug("try to prepare audio pipeline.");
130 if (MM_ERROR_NONE != __mm_wfd_sink_prepare_audio_pipeline(wfd_sink)) {
131 wfd_sink_error("failed to prepare audio pipeline.....\n");
135 case WFD_SINK_MANAGER_CMD_PREPARE_V_PIPELINE:
136 wfd_sink_debug("try to prepare video pipeline.");
137 if (MM_ERROR_NONE != __mm_wfd_sink_prepare_video_pipeline(wfd_sink)) {
138 wfd_sink_error("failed to prepare video pipeline.....\n");
142 case WFD_SINK_MANAGER_CMD_EXIT:
143 wfd_sink_debug("exiting manager thread");
151 g_list_free(wfd_sink->manager_thread_cmd);
152 wfd_sink->manager_thread_cmd = NULL;
154 WFD_SINK_MANAGER_UNLOCK(wfd_sink);
157 wfd_sink_debug_fleave();
162 wfd_sink->manager_thread_exit = TRUE;
163 g_list_free(wfd_sink->manager_thread_cmd);
164 wfd_sink->manager_thread_cmd = NULL;
165 WFD_SINK_MANAGER_UNLOCK(wfd_sink);