void AmB2BMedia::setRtpLogger(msg_logger* _logger) { if (logger) dec_ref(logger); logger = _logger; if (logger) inc_ref(logger); // walk through all the streams and use logger for them for (AudioStreamIterator i = audio.begin(); i != audio.end(); ++i) i->setLogger(logger); for (RelayStreamIterator j = relay_streams.begin(); j != relay_streams.end(); ++j) (*j)->setLogger(logger); }
void AmB2BMedia::changeSessionUnsafe(bool a_leg, AmB2BSession *new_session) { TRACE("changing %s leg session to %p\n", a_leg ? "A" : "B", new_session); if (a_leg) a = new_session; else b = new_session; bool needs_processing = a && b && a->getRtpRelayMode() == AmB2BSession::RTP_Transcoding; // update all streams for (AudioStreamIterator i = audio.begin(); i != audio.end(); ++i) { // stop processing first to avoid unexpected results i->a.stopStreamProcessing(); i->b.stopStreamProcessing(); // replace session if (a_leg) { i->a.changeSession(new_session); } else { i->b.changeSession(new_session); } updateStreamPair(*i); if (i->requiresProcessing()) needs_processing = true; // reset logger (needed if a stream changes) i->setLogger(logger); // return back for processing if needed i->a.resumeStreamProcessing(); i->b.resumeStreamProcessing(); } for (RelayStreamIterator j = relay_streams.begin(); j != relay_streams.end(); ++j) { AmRtpStream &a = (*j)->a; AmRtpStream &b = (*j)->b; // FIXME: is stop & resume receiving needed here? if (a_leg) a.changeSession(new_session); else b.changeSession(new_session); } if (needs_processing) { if (!isProcessingMedia()) { addToMediaProcessorUnsafe(); } } else if (isProcessingMedia()) AmMediaProcessor::instance()->removeSession(this); TRACE("session changed\n"); }
void AmB2BMedia::updateAudioStreams() { // SDP was updated TRACE("handling SDP change, A leg: %c%c, B leg: %c%c\n", have_a_leg_local_sdp ? 'X' : '-', have_a_leg_remote_sdp ? 'X' : '-', have_b_leg_local_sdp ? 'X' : '-', have_b_leg_remote_sdp ? 'X' : '-'); // if we have all necessary information we can initialize streams and start // their processing if (audio.empty() && relay_streams.empty()) return; // no streams bool have_a = have_a_leg_local_sdp && have_a_leg_remote_sdp; bool have_b = have_b_leg_local_sdp && have_b_leg_remote_sdp; if (!( (have_a || have_b) )) return; bool needs_processing = a && b && a->getRtpRelayMode() == AmB2BSession::RTP_Transcoding; // initialize streams to be able to relay & transcode (or use local audio) for (AudioStreamIterator i = audio.begin(); i != audio.end(); ++i) { i->a.stopStreamProcessing(); i->b.stopStreamProcessing(); updateStreamPair(*i); if (i->requiresProcessing()) needs_processing = true; i->a.resumeStreamProcessing(); i->b.resumeStreamProcessing(); } // start media processing (only if transcoding or regular audio processing // required) // Note: once we send local SDP to the other party we have to expect RTP but // we need to be fully initialised (both legs) before we can correctly handle // the media, right? if (needs_processing) { if (!isProcessingMedia()) { addToMediaProcessorUnsafe(); } } else if (isProcessingMedia()) AmMediaProcessor::instance()->removeSession(this); }