diff --git a/src/libosmocc/helper.c b/src/libosmocc/helper.c index cde8b27..6317ed3 100644 --- a/src/libosmocc/helper.c +++ b/src/libosmocc/helper.c @@ -56,10 +56,10 @@ const char *osmo_cc_helper_audio_accept(void *priv, struct osmo_cc_helper_audio_ { char offer_sdp[65536]; const char *accept_sdp; - osmo_cc_session_media_t *media, *selected_media = NULL; - osmo_cc_session_codec_t *codec, *selected_codec = NULL; + osmo_cc_session_media_t *media, *selected_media; + osmo_cc_session_codec_t *codec, *selected_codec, *telephone_event; int rc; - int i, selected_i; + int i, selected_codec_i, telephone_event_i; if (*session_p) { PDEBUG(DCC, DEBUG_ERROR, "Session already set, please fix!\n"); @@ -83,33 +83,53 @@ const char *osmo_cc_helper_audio_accept(void *priv, struct osmo_cc_helper_audio_ return NULL; } - selected_i = -1; + selected_media = NULL; osmo_cc_session_for_each_media((*session_p)->media_list, media) { /* only audio */ if (media->description.type != osmo_cc_session_media_type_audio) continue; + selected_codec_i = -1; + selected_codec = NULL; + telephone_event_i = -1; + telephone_event = NULL; osmo_cc_session_for_each_codec(media->codec_list, codec) { - for (i = 0; codecs[i].payload_name; i++) { - if (osmo_cc_session_if_codec(codec, codecs[i].payload_name, codecs[i].payload_rate, codecs[i].payload_channels)) { - /* select the first matchting codec or the one we prefer */ - if (selected_i < 0 || i < selected_i) { - selected_codec = codec; - selected_media = media; - selected_i = i; + if (!!strcasecmp(codec->payload_name, "telephone-event")) { + for (i = 0; codecs[i].payload_name; i++) { + if (osmo_cc_session_if_codec(codec, codecs[i].payload_name, codecs[i].payload_rate, codecs[i].payload_channels)) { + /* select the first matchting codec or the one we prefer */ + if (selected_codec_i < 0 || i < selected_codec_i) { + selected_codec = codec; + selected_codec_i = i; + selected_media = media; + } + /* if we don't force our preferred codec, use the preferred one from the remote */ + if (!force_our_codec) + break; } - /* if we don't force our preferred codec, use the preferred one from the remote */ - if (!force_our_codec) - break; + } + } else { + /* special case: add telephone-event, if supported */ + for (i = 0; codecs[i].payload_name; i++) { + if (!!strcasecmp(codecs[i].payload_name, "telephone-event")) + continue; + telephone_event = codec; + telephone_event_i = i; + break; } } } + /* codec is selected within this media, we are done */ + if (selected_codec) + break; } if (!selected_codec) { PDEBUG(DCC, DEBUG_ERROR, "No codec found in setup message that we support.\n"); osmo_cc_free_session(*session_p); return NULL; } - osmo_cc_session_accept_codec(selected_codec, codecs[selected_i].encoder, codecs[selected_i].decoder); + osmo_cc_session_accept_codec(selected_codec, codecs[selected_codec_i].encoder, codecs[selected_codec_i].decoder); + if (telephone_event) + osmo_cc_session_accept_codec(telephone_event, codecs[telephone_event_i].encoder, codecs[telephone_event_i].decoder); osmo_cc_session_accept_media(selected_media, 0, 0, NULL, 1, 1, receiver); osmo_cc_rtp_open(selected_media); osmo_cc_rtp_connect(selected_media);