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 capture 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 = WFD_SINK_MANAGER_CMD_NONE;
43 /* create video capture thread */
44 wfd_sink->manager_thread =
45 g_thread_new("__mm_wfd_sink_manager_thread", __mm_wfd_sink_manager_thread, (gpointer)wfd_sink);
46 if (wfd_sink->manager_thread == NULL) {
47 wfd_sink_error("failed to create manager thread\n");
51 wfd_sink_debug_fleave();
56 g_mutex_clear(&(wfd_sink->manager_thread_mutex));
57 g_cond_clear(&(wfd_sink->manager_thread_cond));
59 return MM_ERROR_WFD_INTERNAL;
62 int _mm_wfd_sink_release_manager(mm_wfd_sink_t *wfd_sink)
64 wfd_sink_debug_fenter();
66 wfd_sink_return_val_if_fail(wfd_sink, MM_ERROR_WFD_NOT_INITIALIZED);
68 /* release capture thread */
69 if (wfd_sink->manager_thread) {
70 WFD_SINK_MANAGER_LOCK(wfd_sink);
71 WFD_SINK_MANAGER_SIGNAL_CMD(wfd_sink, WFD_SINK_MANAGER_CMD_EXIT);
72 WFD_SINK_MANAGER_UNLOCK(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 gboolean link_auido_bin = FALSE;
91 gboolean link_video_bin = FALSE;
92 gboolean set_ready_audio_bin = FALSE;
93 gboolean set_ready_video_bin = FALSE;
96 wfd_sink_debug_fenter();
98 wfd_sink_return_val_if_fail(wfd_sink, NULL);
100 if (wfd_sink->manager_thread_cmd & WFD_SINK_MANAGER_CMD_EXIT) {
101 wfd_sink->manager_thread_cmd = WFD_SINK_MANAGER_CMD_EXIT;
105 wfd_sink_debug("manager thread started. waiting for signal");
108 WFD_SINK_MANAGER_LOCK(wfd_sink);
109 WFD_SINK_MANAGER_WAIT_CMD(wfd_sink);
111 wfd_sink_debug("got command %x", wfd_sink->manager_thread_cmd);
113 if (wfd_sink->manager_thread_cmd & WFD_SINK_MANAGER_CMD_EXIT) {
114 wfd_sink_debug("exiting manager thread");
119 link_auido_bin = wfd_sink->manager_thread_cmd & WFD_SINK_MANAGER_CMD_LINK_A_BIN;
120 link_video_bin = wfd_sink->manager_thread_cmd & WFD_SINK_MANAGER_CMD_LINK_V_BIN;
121 set_ready_audio_bin = wfd_sink->manager_thread_cmd & WFD_SINK_MANAGER_CMD_PREPARE_A_BIN;
122 if (set_ready_audio_bin && !link_auido_bin && !wfd_sink->audio_bin_is_linked) {
123 wfd_sink_error("audio bin is not linked... wait for command for linking audiobin");
124 WFD_SINK_MANAGER_UNLOCK(wfd_sink);
127 set_ready_video_bin = wfd_sink->manager_thread_cmd & WFD_SINK_MANAGER_CMD_PREPARE_V_BIN;
128 if (set_ready_video_bin && !link_video_bin && !wfd_sink->video_bin_is_linked) {
129 wfd_sink_error("video bin is not linked... wait for command for linking videobin.");
130 WFD_SINK_MANAGER_UNLOCK(wfd_sink);
135 if (link_auido_bin) {
136 wfd_sink_debug("try to link audiobin.");
137 if (MM_ERROR_NONE != __mm_wfd_sink_link_audiobin(wfd_sink)) {
138 wfd_sink_error("failed to link audiobin.....\n");
144 if (link_video_bin) {
145 wfd_sink_debug("try to link videobin.");
146 if (MM_ERROR_NONE != __mm_wfd_sink_link_videobin(wfd_sink)) {
147 wfd_sink_error("failed to link videobin.....\n");
152 if (set_ready_audio_bin) {
153 wfd_sink_debug("try to prepare audiobin.");
154 if (MM_ERROR_NONE != __mm_wfd_sink_prepare_audiobin(wfd_sink)) {
155 wfd_sink_error("failed to prepare audiobin.....\n");
160 if (set_ready_video_bin) {
161 wfd_sink_debug("try to prepare videobin.");
162 if (MM_ERROR_NONE != __mm_wfd_sink_prepare_videobin(wfd_sink)) {
163 wfd_sink_error("failed to prepare videobin.....\n");
168 wfd_sink->manager_thread_cmd = WFD_SINK_MANAGER_CMD_NONE;
170 WFD_SINK_MANAGER_UNLOCK(wfd_sink);
173 wfd_sink_debug_fleave();
178 wfd_sink->manager_thread_cmd = WFD_SINK_MANAGER_CMD_EXIT;
180 WFD_SINK_MANAGER_UNLOCK(wfd_sink);