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"); }