docs: public void startOutgoing() throws IllegalStateException, SmackException, InterruptedException {
  
          updatePacketListener();
          setSessionState(JingleSessionStatePending.getInstance());
  
          Jingle jingle = new Jingle(JingleActionEnum.SESSION_INITIATE);
  
          // Create a content negotiator for each media manager on the session.
          for (JingleMediaManager mediaManager : getMediaManagers()) {
              ContentNegotiator contentNeg = new ContentNegotiator(this, ContentNegotiator.INITIATOR, mediaManager.getName());
  
              // Create the media negotiator for this content description.
              contentNeg.setMediaNegotiator(new MediaNegotiator(this, mediaManager, mediaManager.getPayloads(), contentNeg));
  
              JingleTransportManager transportManager = mediaManager.getTransportManager();
              TransportResolver resolver = null;
              try {
                  resolver = transportManager.getResolver(this);
              } catch (XMPPException e) {
                  LOGGER.log(Level.WARNING, "exception", e);
              }
  
              if (resolver.getType().equals(TransportResolver.Type.rawupd)) {
                  contentNeg.setTransportNegotiator(new TransportNegotiator.RawUdp(this, resolver, contentNeg));
              }
              if (resolver.getType().equals(TransportResolver.Type.ice)) {
                  contentNeg.setTransportNegotiator(new TransportNegotiator.Ice(this, resolver, contentNeg));
              }
  
              addContentNegotiator(contentNeg);
          }
  
          // Give each of the content negotiators a chance to return a portion of the structure to make the Jingle packet.
          for (ContentNegotiator contentNegotiator : contentNegotiators) {
              jingle.addContent(contentNegotiator.getJingleContent());
          }
  
          // Save the session-initiate packet ID, so that we can respond to it.
          sessionInitPacketID = jingle.getStanzaId();
  
          sendStanza(jingle);
  
          // Now setup to track the media negotiators, so that we know when (if) to send a session-accept.
          setupListeners();
  
          // Give each of the content negotiators a chance to start
          // and return a portion of the structure to make the Jingle packet.
  
  // Don't do this anymore.  The problem is that the other side might not be ready.
  // Later when we receive our first jingle packet from the other side we'll fire-up the negotiators
  // before processing it.  (See receivePacketAndRespond() above.
  //        for (ContentNegotiator contentNegotiator : contentNegotiators) {
  //            contentNegotiator.start();
  //        }
      }