webrtc_internal: Add functions for audio track mute 63/282363/7 accepted/tizen/unified/20221109.171125
authorSangchul Lee <sc11.lee@samsung.com>
Fri, 30 Sep 2022 07:51:39 +0000 (16:51 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Tue, 8 Nov 2022 03:46:45 +0000 (12:46 +0900)
It's cherry-picked from tizen_6.5 branch.

[Version] 0.3.262
[Issue Type] Internal API

Change-Id: Ia942f612e126c7a5a2bc6b44dcd52bd41be7816a
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
include/webrtc_internal.h
include/webrtc_private.h
packaging/capi-media-webrtc.spec
src/webrtc_internal.c
src/webrtc_sink.c

index d05906fc5b9c0b1c2c6afa8c164479071462da78..1e5338ec7ed3891e17ef5e9e82f9d493da214fcb 100644 (file)
@@ -102,6 +102,42 @@ typedef void (*webrtc_signaling_message_cb)(webrtc_signaling_message_type_e type
  */
 int webrtc_set_ecore_wl_display(webrtc_h webrtc, unsigned int track_id, void *ecore_wl_window);
 
+/**
+ * @internal
+ * @brief Sets mute to the audio track.
+ * @since_tizen 6.5
+ * @remarks If @a mute is set to @c true, playback of audio track received from a remote peer will be muted.
+ * @param[in] webrtc      WebRTC handle
+ * @param[in] track_id    The track id
+ * @param[in] mute        Mute or not (@c true = mute, @c false = not mute)
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #WEBRTC_ERROR_NONE    Successful
+ * @retval #WEBRTC_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #WEBRTC_ERROR_INVALID_OPERATION Invalid operation
+ * @pre Call webrtc_set_sound_stream_info() before calling this function.
+ * @see webrtc_get_audio_mute()
+ */
+int webrtc_set_audio_mute(webrtc_h webrtc, unsigned int track_id, bool mute);
+
+/**
+ * @internal
+ * @brief Gets the mute state of the audio track.
+ * @since_tizen 6.5
+ * @remarks The default value is @c false.
+ * @param[in] webrtc      WebRTC handle
+ * @param[in] track_id    The track id
+ * @param[out] muted      Muted or not (@c true = muted, @c false = not muted)
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #WEBRTC_ERROR_NONE    Successful
+ * @retval #WEBRTC_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #WEBRTC_ERROR_INVALID_OPERATION Invalid operation
+ * @pre Call webrtc_set_sound_stream_info() before calling this function.
+ * @see webrtc_set_audio_mute()
+ */
+int webrtc_get_audio_mute(webrtc_h webrtc, unsigned int track_id, bool *muted);
+
 /**
  * @internal
  * @brief Sets a video loopback to render the video frames of the media source to an ecore wayland display.
index 6d3abae8f91214fac9b7d17a45f2a293c15c985c..082b75802071ad3fcecbf9e3fcf6a414ba31a652 100644 (file)
@@ -760,6 +760,8 @@ int _set_display_mode_to_sink(webrtc_s *webrtc, unsigned int track_id, webrtc_di
 int _get_display_mode_from_sink(webrtc_s *webrtc, unsigned int track_id, webrtc_display_mode_e *mode);
 int _set_display_visible_to_sink(webrtc_s *webrtc, unsigned int track_id, bool visible);
 int _get_display_visible_from_sink(webrtc_s *webrtc, unsigned int track_id, bool *visible);
+int _set_audio_mute_to_sink(webrtc_s *webrtc, unsigned int track_id, bool mute);
+int _get_audio_mute_from_sink(webrtc_s *webrtc, unsigned int track_id, bool *muted);
 
 /* sink dump */
 GstPadProbeReturn _depayloaded_data_probe_cb(GstPad *pad, GstPadProbeInfo *info, gpointer user_data);
index 755b6e7f12fdef5f86be335db334e9aaff2dc4aa..f59c3028ee10e8f7e12eda3336e8985d77acb4e4 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-webrtc
 Summary:    A WebRTC library in Tizen Native API
-Version:    0.3.261
+Version:    0.3.262
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index d7dc35296a3dd26aac9d5b67e14cc9d4e4f6173c..bea9050f19b6f8343aa3bfa9b88350717d6ff60e 100644 (file)
@@ -41,6 +41,35 @@ int webrtc_set_ecore_wl_display(webrtc_h webrtc, unsigned int track_id, void *ec
        return ret;
 }
 
+int webrtc_set_audio_mute(webrtc_h webrtc, unsigned int track_id, bool mute)
+{
+       g_autoptr(GMutexLocker) locker = NULL;
+       webrtc_s *_webrtc = (webrtc_s *)webrtc;
+
+       RET_VAL_IF(_webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL");
+
+       locker = g_mutex_locker_new(&_webrtc->mutex);
+
+       RET_VAL_IF(_webrtc->track_added_cb.callback == NULL, WEBRTC_ERROR_INVALID_OPERATION, "track added callback was not set");
+
+       return _set_audio_mute_to_sink(_webrtc, track_id, mute);
+}
+
+int webrtc_get_audio_mute(webrtc_h webrtc, unsigned int track_id, bool *muted)
+{
+       g_autoptr(GMutexLocker) locker = NULL;
+       webrtc_s *_webrtc = (webrtc_s *)webrtc;
+
+       RET_VAL_IF(_webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL");
+       RET_VAL_IF(muted == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "muted is NULL");
+
+       locker = g_mutex_locker_new(&_webrtc->mutex);
+
+       RET_VAL_IF(_webrtc->track_added_cb.callback == NULL, WEBRTC_ERROR_INVALID_OPERATION, "track added callback was not set");
+
+       return _get_audio_mute_from_sink(_webrtc, track_id, muted);
+}
+
 int webrtc_media_source_set_video_loopback_to_ecore_wl(webrtc_h webrtc, unsigned int source_id, void *ecore_wl_window, unsigned int *track_id)
 {
        int ret = WEBRTC_ERROR_NONE;
index 08cfb6bff552ca67610e04bb2365bf5772dfcd52..56fea11dad6335cfde14c4ab420dbd08f5f4f7ac 100644 (file)
@@ -20,6 +20,8 @@
 #include <sound_manager_internal.h>
 #include <gst/video/videooverlay.h>
 
+#define ELEMENT_NAME_AUDIO_SINK          "audioSink"
+
 //LCOV_EXCL_START
 bool _is_owner_of_track_build_context(webrtc_s *webrtc, unsigned int track_id)
 {
@@ -271,7 +273,7 @@ static int __build_audiosink(webrtc_s *webrtc, GstElement *decodebin, GstPad *sr
        sink->media_types = MEDIA_TYPE_AUDIO;
        stream_info_is_set = !!sink->sound_stream_info.type;
 
-       if (!(audiosink = _create_element(stream_info_is_set ? webrtc->ini.rendering_sink.a_sink_element : DEFAULT_ELEMENT_FAKESINK, NULL)))
+       if (!(audiosink = _create_element(stream_info_is_set ? webrtc->ini.rendering_sink.a_sink_element : DEFAULT_ELEMENT_FAKESINK, ELEMENT_NAME_AUDIO_SINK)))
                return WEBRTC_ERROR_INVALID_OPERATION;
        APPEND_ELEMENT(element_list, audiosink);
        link_to = audiosink;
@@ -1081,7 +1083,7 @@ int _set_stream_info_to_sink(webrtc_s *webrtc, unsigned int track_id, sound_stre
        RET_VAL_IF(sink == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "sink is NULL");
        RET_VAL_IF(sink->bin == NULL, WEBRTC_ERROR_INVALID_OPERATION, "bin is NULL");
        RET_VAL_IF(sink->encoded_frame_cb != NULL, WEBRTC_ERROR_INVALID_OPERATION, "it may be a forwarding sink for encoded frame callback");
-       RET_VAL_IF((sink->media_types & MEDIA_TYPE_AUDIO) == 0x0, WEBRTC_ERROR_INVALID_OPERATION, "it's not a audio track");
+       RET_VAL_IF((sink->media_types & MEDIA_TYPE_AUDIO) == 0x0, WEBRTC_ERROR_INVALID_OPERATION, "it's not an audio track");
        RET_VAL_IF(strcmp(webrtc->ini.rendering_sink.a_sink_element, DEFAULT_AUDIO_SINK_ELEMENT), WEBRTC_ERROR_INVALID_OPERATION,
                "it requires [%s] as an audio renderer", DEFAULT_AUDIO_SINK_ELEMENT);
 
@@ -1202,4 +1204,52 @@ int _get_display_visible_from_sink(webrtc_s *webrtc, unsigned int track_id, bool
 
        return WEBRTC_ERROR_NONE;
 }
+
+int _set_audio_mute_to_sink(webrtc_s *webrtc, unsigned int track_id, bool mute)
+{
+       webrtc_gst_slot_s *sink;
+       GstElement *audiosink;
+
+       RET_VAL_IF(webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL");
+       RET_VAL_IF(track_id == 0, WEBRTC_ERROR_INVALID_PARAMETER, "track id is 0");
+
+       sink = __find_sink_slot_by_id(webrtc, track_id);
+       RET_VAL_IF(sink == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "sink is NULL");
+       RET_VAL_IF(sink->bin == NULL, WEBRTC_ERROR_INVALID_OPERATION, "bin is NULL");
+       RET_VAL_IF(sink->encoded_frame_cb != NULL, WEBRTC_ERROR_INVALID_OPERATION, "it may be a forwarding sink for encoded frame callback");
+       RET_VAL_IF((sink->media_types & MEDIA_TYPE_AUDIO) == 0x0, WEBRTC_ERROR_INVALID_OPERATION, "it's not an audio track");
+       RET_VAL_IF(sink->sound_stream_info.type == NULL, WEBRTC_ERROR_INVALID_OPERATION, "sound_stream_info is not set");
+       RET_VAL_IF(!(audiosink = gst_bin_get_by_name(sink->bin, ELEMENT_NAME_AUDIO_SINK)), WEBRTC_ERROR_INVALID_OPERATION, "could not find audio sink element");
+
+       g_object_set(G_OBJECT(audiosink), "mute", mute, NULL);
+
+       LOG_INFO("webrtc[%p] track_id[%u] mute[%u]", webrtc, track_id, mute);
+
+       return WEBRTC_ERROR_NONE;
+}
+
+int _get_audio_mute_from_sink(webrtc_s *webrtc, unsigned int track_id, bool *muted)
+{
+       webrtc_gst_slot_s *sink;
+       GstElement *audiosink;
+
+       RET_VAL_IF(webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL");
+       RET_VAL_IF(track_id == 0, WEBRTC_ERROR_INVALID_PARAMETER, "track id is 0");
+       RET_VAL_IF(muted == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "muted is NULL");
+
+       sink = __find_sink_slot_by_id(webrtc, track_id);
+       RET_VAL_IF(sink == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "sink is NULL");
+       RET_VAL_IF(sink->bin == NULL, WEBRTC_ERROR_INVALID_OPERATION, "bin is NULL");
+       RET_VAL_IF(sink->encoded_frame_cb != NULL, WEBRTC_ERROR_INVALID_OPERATION, "it may be a forwarding sink for encoded frame callback");
+       RET_VAL_IF((sink->media_types & MEDIA_TYPE_AUDIO) == 0x0, WEBRTC_ERROR_INVALID_OPERATION, "it's not an audio track");
+       RET_VAL_IF(sink->sound_stream_info.type == NULL, WEBRTC_ERROR_INVALID_OPERATION, "sound_stream_info is not set");
+       RET_VAL_IF(!(audiosink = gst_bin_get_by_name(sink->bin, ELEMENT_NAME_AUDIO_SINK)), WEBRTC_ERROR_INVALID_OPERATION, "could not find audio sink element");
+
+       g_object_get(G_OBJECT(audiosink), "mute", muted, NULL);
+
+       LOG_INFO("webrtc[%p] track_id[%u] muted[%u]", webrtc, track_id, *muted);
+
+       return WEBRTC_ERROR_NONE;
+}
+
 //LCOV_EXCL_STOP