GstElement *audioconvert;
GstElement *audioresample;
GstElement *audiosink;
+ bool stream_info_is_set;
int ret = WEBRTC_ERROR_NONE;
RET_VAL_IF(webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL");
sink->media_types = MEDIA_TYPE_AUDIO;
- if (!(audioconvert = _create_element(DEFAULT_ELEMENT_AUDIOCONVERT, NULL))) {
- LOG_ERROR("failed to create audioconvert");
- return WEBRTC_ERROR_INVALID_OPERATION;
- }
+ stream_info_is_set = !!sink->sound_stream_info.type;
- if (!(audioresample = _create_element(DEFAULT_ELEMENT_AUDIORESAMPLE, NULL))) {
- LOG_ERROR("failed to create audioresample");
- return WEBRTC_ERROR_INVALID_OPERATION;
- }
+ if (stream_info_is_set) {
+ if (!(audioconvert = _create_element(DEFAULT_ELEMENT_AUDIOCONVERT, NULL)))
+ return WEBRTC_ERROR_INVALID_OPERATION;
- if (!(audiosink = _create_element(webrtc->ini.rendering_sink.a_sink_element, NULL))) {
- LOG_ERROR("failed to create audiosink");
- return WEBRTC_ERROR_INVALID_OPERATION;
- }
+ if (!(audioresample = _create_element(DEFAULT_ELEMENT_AUDIORESAMPLE, NULL)))
+ return WEBRTC_ERROR_INVALID_OPERATION;
+
+ if (!(audiosink = _create_element(webrtc->ini.rendering_sink.a_sink_element, NULL)))
+ return WEBRTC_ERROR_INVALID_OPERATION;
- if (g_object_class_find_property(G_OBJECT_GET_CLASS(G_OBJECT(audiosink)), "stream-properties")) {
- if (sink->sound_stream_info.type) {
- ret = _apply_stream_info(audiosink, sink->sound_stream_info.type, sink->sound_stream_info.index);
- if (ret != WEBRTC_ERROR_NONE) /* FIXME: unref all the created elements */
- return WEBRTC_ERROR_INVALID_OPERATION;
+ if (g_object_class_find_property(G_OBJECT_GET_CLASS(G_OBJECT(audiosink)), "stream-properties")) {
+ if (sink->sound_stream_info.type) {
+ ret = _apply_stream_info(audiosink, sink->sound_stream_info.type, sink->sound_stream_info.index);
+ if (ret != WEBRTC_ERROR_NONE) /* FIXME: unref all the created elements */
+ return WEBRTC_ERROR_INVALID_OPERATION;
+ }
}
- }
- gst_bin_add_many(sink->bin, audioconvert, audioresample, audiosink, NULL);
+ gst_bin_add_many(sink->bin, audioconvert, audioresample, audiosink, NULL);
- if (!gst_element_sync_state_with_parent(audioconvert)) {
- LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(audioconvert));
- return WEBRTC_ERROR_INVALID_OPERATION;
- }
- if (!gst_element_sync_state_with_parent(audioresample)) {
- LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(audioresample));
- return WEBRTC_ERROR_INVALID_OPERATION;
- }
- if (!gst_element_sync_state_with_parent(audiosink)) {
- LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(audiosink));
- return WEBRTC_ERROR_INVALID_OPERATION;
- }
+ if (!gst_element_sync_state_with_parent(audioconvert)) {
+ LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(audioconvert));
+ return WEBRTC_ERROR_INVALID_OPERATION;
+ }
+ if (!gst_element_sync_state_with_parent(audioresample)) {
+ LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(audioresample));
+ return WEBRTC_ERROR_INVALID_OPERATION;
+ }
+ if (!gst_element_sync_state_with_parent(audiosink)) {
+ LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(audiosink));
+ return WEBRTC_ERROR_INVALID_OPERATION;
+ }
- if (!gst_element_link_many(decodebin, audioconvert, audioresample, audiosink, NULL)) {
- LOG_ERROR("failed to gst_element_link_many()");
- return WEBRTC_ERROR_INVALID_OPERATION;
+ if (!gst_element_link_many(decodebin, audioconvert, audioresample, audiosink, NULL)) {
+ LOG_ERROR("failed to gst_element_link_many()");
+ return WEBRTC_ERROR_INVALID_OPERATION;
+ }
+
+ } else {
+ LOG_WARNING("stream_info is not set, use [%s] to drop audio data", DEFAULT_ELEMENT_FAKESINK);
+ if (!(audiosink = _create_element(DEFAULT_ELEMENT_FAKESINK, NULL)))
+ return WEBRTC_ERROR_INVALID_OPERATION;
+
+ gst_bin_add(sink->bin, audiosink);
+
+ if (!gst_element_sync_state_with_parent(audiosink)) {
+ LOG_ERROR("failed to gst_element_sync_state_with_parent() for [%s]", GST_ELEMENT_NAME(audiosink));
+ return WEBRTC_ERROR_INVALID_OPERATION;
+ }
+
+ if (!gst_element_link_many(decodebin, audiosink, NULL)) {
+ LOG_ERROR("failed to gst_element_link_many()");
+ return WEBRTC_ERROR_INVALID_OPERATION;
+ }
}
return WEBRTC_ERROR_NONE;