4 * Copyright (c) 2011 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: JongHyuk Choi <jhchoi.choi@samsung.com>, ByungWook Jang <bw.jang@samsung.com>,
7 * Maksym Ukhanov <m.ukhanov@samsung.com>, Hyunjun Ko <zzoon.ko@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_wfd_sink_util.h"
26 #include "mm_wfd_sink.h"
27 #include "mm_wfd_sink_priv.h"
28 #include "mm_wfd_sink_dlog.h"
30 int mm_wfd_sink_create(MMHandleType *wfd_sink)
32 mm_wfd_sink_t *new_wfd_sink = NULL;
33 int result = MM_ERROR_NONE;
35 wfd_sink_debug_fenter();
37 wfd_sink_return_val_if_fail(wfd_sink, MM_ERROR_WFD_NOT_INITIALIZED);
39 result = _mm_wfd_sink_create(&new_wfd_sink);
40 if (result != MM_ERROR_NONE) {
41 wfd_sink_error("fail to create wi-fi display sink handle. ret[%d]", result);
42 *wfd_sink = (MMHandleType)NULL;
47 g_mutex_init(&new_wfd_sink->cmd_lock);
49 *wfd_sink = (MMHandleType)new_wfd_sink;
51 wfd_sink_debug_fleave();
57 int mm_wfd_sink_prepare(MMHandleType wfd_sink)
59 int result = MM_ERROR_NONE;
61 wfd_sink_return_val_if_fail(wfd_sink, MM_ERROR_WFD_NOT_INITIALIZED);
63 MMWFDSINK_CMD_LOCK(wfd_sink);
64 result = _mm_wfd_sink_prepare((mm_wfd_sink_t *)wfd_sink);
65 MMWFDSINK_CMD_UNLOCK(wfd_sink);
70 int mm_wfd_sink_connect(MMHandleType wfd_sink, const char *uri)
72 int result = MM_ERROR_NONE;
74 wfd_sink_return_val_if_fail(wfd_sink, MM_ERROR_WFD_NOT_INITIALIZED);
75 wfd_sink_return_val_if_fail(uri, MM_ERROR_WFD_INVALID_ARGUMENT);
77 MMWFDSINK_CMD_LOCK(wfd_sink);
78 result = _mm_wfd_sink_connect((mm_wfd_sink_t *)wfd_sink, uri);
79 MMWFDSINK_CMD_UNLOCK(wfd_sink);
84 int mm_wfd_sink_start(MMHandleType wfd_sink)
86 int result = MM_ERROR_NONE;
88 wfd_sink_return_val_if_fail(wfd_sink, MM_ERROR_WFD_NOT_INITIALIZED);
90 MMWFDSINK_CMD_LOCK(wfd_sink);
91 result = _mm_wfd_sink_start((mm_wfd_sink_t *)wfd_sink);
92 MMWFDSINK_CMD_UNLOCK(wfd_sink);
97 int mm_wfd_sink_pause(MMHandleType wfd_sink)
99 int result = MM_ERROR_NONE;
101 wfd_sink_return_val_if_fail(wfd_sink, MM_ERROR_WFD_NOT_INITIALIZED);
103 MMWFDSINK_CMD_LOCK(wfd_sink);
104 result = _mm_wfd_sink_pause((mm_wfd_sink_t *)wfd_sink);
105 MMWFDSINK_CMD_UNLOCK(wfd_sink);
110 int mm_wfd_sink_resume(MMHandleType wfd_sink)
112 int result = MM_ERROR_NONE;
114 wfd_sink_return_val_if_fail(wfd_sink, MM_ERROR_WFD_NOT_INITIALIZED);
116 MMWFDSINK_CMD_LOCK(wfd_sink);
117 result = _mm_wfd_sink_resume((mm_wfd_sink_t *)wfd_sink);
118 MMWFDSINK_CMD_UNLOCK(wfd_sink);
123 int mm_wfd_sink_disconnect(MMHandleType wfd_sink)
125 int result = MM_ERROR_NONE;
127 wfd_sink_return_val_if_fail(wfd_sink, MM_ERROR_WFD_NOT_INITIALIZED);
129 MMWFDSINK_CMD_LOCK(wfd_sink);
130 result = _mm_wfd_sink_disconnect((mm_wfd_sink_t *)wfd_sink);
131 MMWFDSINK_CMD_UNLOCK(wfd_sink);
136 int mm_wfd_sink_unprepare(MMHandleType wfd_sink)
138 int result = MM_ERROR_NONE;
140 wfd_sink_return_val_if_fail(wfd_sink, MM_ERROR_WFD_NOT_INITIALIZED);
142 MMWFDSINK_CMD_LOCK(wfd_sink);
143 result = _mm_wfd_sink_unprepare((mm_wfd_sink_t *)wfd_sink);
144 MMWFDSINK_CMD_UNLOCK(wfd_sink);
149 int mm_wfd_sink_destroy(MMHandleType wfd_sink)
151 int result = MM_ERROR_NONE;
152 mm_wfd_sink_t *sink_handle = NULL;
154 wfd_sink_return_val_if_fail(wfd_sink, MM_ERROR_WFD_NOT_INITIALIZED);
156 MMWFDSINK_CMD_LOCK(wfd_sink);
157 result = _mm_wfd_sink_destroy((mm_wfd_sink_t *)wfd_sink);
158 MMWFDSINK_CMD_UNLOCK(wfd_sink);
160 g_mutex_clear(&(((mm_wfd_sink_t *)wfd_sink)->cmd_lock));
162 sink_handle = (mm_wfd_sink_t *)wfd_sink;
163 MMWFDSINK_FREEIF(sink_handle);
168 int mm_wfd_sink_set_message_callback(MMHandleType wfd_sink, MMWFDMessageCallback callback, void *user_data)
170 int result = MM_ERROR_NONE;
172 wfd_sink_return_val_if_fail(wfd_sink, MM_ERROR_WFD_NOT_INITIALIZED);
174 MMWFDSINK_CMD_LOCK(wfd_sink);
175 result = _mm_wfd_set_message_callback((mm_wfd_sink_t *)wfd_sink, callback, user_data);
176 MMWFDSINK_CMD_UNLOCK(wfd_sink);
181 int mm_wfd_sink_set_attribute(MMHandleType wfd_sink, char **err_attr_name, const char *first_attribute_name, ...)
183 int result = MM_ERROR_NONE;
186 wfd_sink_return_val_if_fail(wfd_sink, MM_ERROR_WFD_NOT_INITIALIZED);
187 wfd_sink_return_val_if_fail(first_attribute_name, MM_ERROR_WFD_INVALID_ARGUMENT);
189 MMWFDSINK_CMD_LOCK(wfd_sink);
190 va_start(var_args, first_attribute_name);
191 result = _mmwfd_set_attribute(MMWFDSINK_GET_ATTRS(wfd_sink), err_attr_name, first_attribute_name, var_args);
193 MMWFDSINK_CMD_UNLOCK(wfd_sink);
198 int mm_wfd_sink_get_video_resolution(MMHandleType wfd_sink, gint *width, gint *height)
200 mm_wfd_sink_t *wfd = (mm_wfd_sink_t *)wfd_sink;
202 wfd_sink_return_val_if_fail(wfd, MM_ERROR_WFD_NOT_INITIALIZED);
203 wfd_sink_return_val_if_fail(width, MM_ERROR_WFD_INVALID_ARGUMENT);
204 wfd_sink_return_val_if_fail(height, MM_ERROR_WFD_INVALID_ARGUMENT);
206 *width = wfd->stream_info.video_stream_info.width;
207 *height = wfd->stream_info.video_stream_info.height;
209 return MM_ERROR_NONE;
212 int mm_wfd_sink_get_video_framerate(MMHandleType wfd_sink, gint *frame_rate)
214 mm_wfd_sink_t *wfd = (mm_wfd_sink_t *)wfd_sink;
216 wfd_sink_return_val_if_fail(wfd, MM_ERROR_WFD_NOT_INITIALIZED);
217 wfd_sink_return_val_if_fail(frame_rate, MM_ERROR_WFD_INVALID_ARGUMENT);
219 *frame_rate = wfd->stream_info.video_stream_info.frame_rate;
221 return MM_ERROR_NONE;
224 int mm_wfd_sink_set_resolution(MMHandleType wfd_sink, gint resolution)
226 int result = MM_ERROR_NONE;
228 wfd_sink_return_val_if_fail(wfd_sink, MM_ERROR_WFD_NOT_INITIALIZED);
229 MMWFDSINK_CMD_LOCK(wfd_sink);
230 result = _mm_wfd_sink_set_resolution((mm_wfd_sink_t *)wfd_sink, resolution);
231 MMWFDSINK_CMD_UNLOCK(wfd_sink);
236 int mm_wfd_sink_get_negotiated_video_codec(MMHandleType wfd_sink, gint *codec)
238 int result = MM_ERROR_NONE;
239 mm_wfd_sink_t *wfd = (mm_wfd_sink_t *)wfd_sink;
240 MMWFDSinkStateType cur_state = MM_WFD_SINK_STATE_NONE;
242 wfd_sink_return_val_if_fail(wfd, MM_ERROR_WFD_NOT_INITIALIZED);
243 wfd_sink_return_val_if_fail(codec, MM_ERROR_WFD_INVALID_ARGUMENT);
245 MMWFDSINK_CMD_LOCK(wfd);
247 MMWFDSINK_PRINT_STATE(wfd);
248 cur_state = MMWFDSINK_CURRENT_STATE(wfd);
249 if (cur_state != MM_WFD_SINK_STATE_CONNECTED &&
250 cur_state != MM_WFD_SINK_STATE_PLAYING &&
251 cur_state != MM_WFD_SINK_STATE_PAUSED) {
253 wfd_sink_error("This function must be called after MM_WFD_SINK_STATE_CONNECTED");
254 result = MM_ERROR_WFD_INVALID_STATE;
256 *codec = wfd->stream_info.video_stream_info.codec;
259 MMWFDSINK_CMD_UNLOCK(wfd);
261 wfd_sink_debug_fleave();
266 int mm_wfd_sink_get_negotiated_video_resolution(MMHandleType wfd_sink, gint *width, gint *height)
268 int result = MM_ERROR_NONE;
269 mm_wfd_sink_t *wfd = (mm_wfd_sink_t *)wfd_sink;
270 MMWFDSinkStateType cur_state = MM_WFD_SINK_STATE_NONE;
272 wfd_sink_return_val_if_fail(wfd, MM_ERROR_WFD_NOT_INITIALIZED);
273 wfd_sink_return_val_if_fail(width, MM_ERROR_WFD_INVALID_ARGUMENT);
274 wfd_sink_return_val_if_fail(height, MM_ERROR_WFD_INVALID_ARGUMENT);
276 MMWFDSINK_CMD_LOCK(wfd);
278 MMWFDSINK_PRINT_STATE(wfd);
279 cur_state = MMWFDSINK_CURRENT_STATE(wfd);
280 if (cur_state != MM_WFD_SINK_STATE_CONNECTED &&
281 cur_state != MM_WFD_SINK_STATE_PLAYING &&
282 cur_state != MM_WFD_SINK_STATE_PAUSED) {
284 wfd_sink_error("This function must be called after MM_WFD_SINK_STATE_CONNECTED");
285 result = MM_ERROR_WFD_INVALID_STATE;
287 *width = wfd->stream_info.video_stream_info.width;
288 *height = wfd->stream_info.video_stream_info.height;
291 MMWFDSINK_CMD_UNLOCK(wfd);
293 wfd_sink_debug_fleave();
298 int mm_wfd_sink_get_negotiated_video_frame_rate(MMHandleType wfd_sink, gint *frame_rate)
300 int result = MM_ERROR_NONE;
301 mm_wfd_sink_t *wfd = (mm_wfd_sink_t *)wfd_sink;
302 MMWFDSinkStateType cur_state = MM_WFD_SINK_STATE_NONE;
304 wfd_sink_return_val_if_fail(wfd, MM_ERROR_WFD_NOT_INITIALIZED);
305 wfd_sink_return_val_if_fail(frame_rate, MM_ERROR_WFD_INVALID_ARGUMENT);
307 MMWFDSINK_CMD_LOCK(wfd);
309 MMWFDSINK_PRINT_STATE(wfd);
310 cur_state = MMWFDSINK_CURRENT_STATE(wfd);
311 if (cur_state != MM_WFD_SINK_STATE_CONNECTED &&
312 cur_state != MM_WFD_SINK_STATE_PLAYING &&
313 cur_state != MM_WFD_SINK_STATE_PAUSED) {
315 wfd_sink_error("This function must be called after MM_WFD_SINK_STATE_CONNECTED");
316 result = MM_ERROR_WFD_INVALID_STATE;
318 *frame_rate = wfd->stream_info.video_stream_info.frame_rate;
321 MMWFDSINK_CMD_UNLOCK(wfd);
323 wfd_sink_debug_fleave();
328 int mm_wfd_sink_get_negotiated_audio_codec(MMHandleType wfd_sink, gint *codec)
330 int result = MM_ERROR_NONE;
331 mm_wfd_sink_t *wfd = (mm_wfd_sink_t *)wfd_sink;
332 MMWFDSinkStateType cur_state = MM_WFD_SINK_STATE_NONE;
334 wfd_sink_return_val_if_fail(wfd, MM_ERROR_WFD_NOT_INITIALIZED);
335 wfd_sink_return_val_if_fail(codec, MM_ERROR_WFD_INVALID_ARGUMENT);
337 MMWFDSINK_CMD_LOCK(wfd);
339 MMWFDSINK_PRINT_STATE(wfd);
340 cur_state = MMWFDSINK_CURRENT_STATE(wfd);
341 if (cur_state != MM_WFD_SINK_STATE_CONNECTED &&
342 cur_state != MM_WFD_SINK_STATE_PLAYING &&
343 cur_state != MM_WFD_SINK_STATE_PAUSED) {
345 wfd_sink_error("This function must be called after MM_WFD_SINK_STATE_CONNECTED");
346 result = MM_ERROR_WFD_INVALID_STATE;
348 *codec = wfd->stream_info.audio_stream_info.codec;
351 MMWFDSINK_CMD_UNLOCK(wfd);
353 wfd_sink_debug_fleave();
358 int mm_wfd_sink_get_negotiated_audio_channel(MMHandleType wfd_sink, gint *channel)
360 int result = MM_ERROR_NONE;
361 mm_wfd_sink_t *wfd = (mm_wfd_sink_t *)wfd_sink;
362 MMWFDSinkStateType cur_state = MM_WFD_SINK_STATE_NONE;
364 wfd_sink_return_val_if_fail(wfd, MM_ERROR_WFD_NOT_INITIALIZED);
365 wfd_sink_return_val_if_fail(channel, MM_ERROR_WFD_INVALID_ARGUMENT);
367 MMWFDSINK_CMD_LOCK(wfd);
369 MMWFDSINK_PRINT_STATE(wfd);
370 cur_state = MMWFDSINK_CURRENT_STATE(wfd);
371 if (cur_state != MM_WFD_SINK_STATE_CONNECTED &&
372 cur_state != MM_WFD_SINK_STATE_PLAYING &&
373 cur_state != MM_WFD_SINK_STATE_PAUSED) {
375 wfd_sink_error("This function must be called after MM_WFD_SINK_STATE_CONNECTED");
376 result = MM_ERROR_WFD_INVALID_STATE;
378 *channel = wfd->stream_info.audio_stream_info.channels;
381 MMWFDSINK_CMD_UNLOCK(wfd);
383 wfd_sink_debug_fleave();
388 int mm_wfd_sink_get_negotiated_audio_sample_rate(MMHandleType wfd_sink, gint *sample_rate)
390 int result = MM_ERROR_NONE;
391 mm_wfd_sink_t *wfd = (mm_wfd_sink_t *)wfd_sink;
392 MMWFDSinkStateType cur_state = MM_WFD_SINK_STATE_NONE;
394 wfd_sink_debug_fenter();
396 wfd_sink_return_val_if_fail(wfd, MM_ERROR_WFD_NOT_INITIALIZED);
397 wfd_sink_return_val_if_fail(sample_rate, MM_ERROR_WFD_INVALID_ARGUMENT);
399 MMWFDSINK_CMD_LOCK(wfd);
401 MMWFDSINK_PRINT_STATE(wfd);
402 cur_state = MMWFDSINK_CURRENT_STATE(wfd);
403 if (cur_state != MM_WFD_SINK_STATE_CONNECTED &&
404 cur_state != MM_WFD_SINK_STATE_PLAYING &&
405 cur_state != MM_WFD_SINK_STATE_PAUSED) {
407 wfd_sink_error("This function must be called after MM_WFD_SINK_STATE_CONNECTED");
408 result = MM_ERROR_WFD_INVALID_STATE;
410 *sample_rate = wfd->stream_info.audio_stream_info.sample_rate;
413 MMWFDSINK_CMD_UNLOCK(wfd);
415 wfd_sink_debug_fleave();
420 int mm_wfd_sink_get_negotiated_audio_bitwidth(MMHandleType wfd_sink, gint *bitwidth)
422 int result = MM_ERROR_NONE;
423 mm_wfd_sink_t *wfd = (mm_wfd_sink_t *)wfd_sink;
424 MMWFDSinkStateType cur_state = MM_WFD_SINK_STATE_NONE;
426 wfd_sink_debug_fenter();
428 wfd_sink_return_val_if_fail(wfd, MM_ERROR_WFD_NOT_INITIALIZED);
429 wfd_sink_return_val_if_fail(bitwidth, MM_ERROR_WFD_INVALID_ARGUMENT);
431 MMWFDSINK_CMD_LOCK(wfd);
433 MMWFDSINK_PRINT_STATE(wfd);
434 cur_state = MMWFDSINK_CURRENT_STATE(wfd);
435 if (cur_state != MM_WFD_SINK_STATE_CONNECTED &&
436 cur_state != MM_WFD_SINK_STATE_PLAYING &&
437 cur_state != MM_WFD_SINK_STATE_PAUSED) {
439 wfd_sink_error("This function must be called after MM_WFD_SINK_STATE_CONNECTED");
440 result = MM_ERROR_WFD_INVALID_STATE;
442 *bitwidth = wfd->stream_info.audio_stream_info.bitwidth;
445 MMWFDSINK_CMD_UNLOCK(wfd);
447 wfd_sink_debug_fleave();