Esempio n. 1
0
 /**
  * Requests a list of all games matching the given search string. The result will be returned
  * asynchronously via OnGameNameListReceived.
  *
  * @param str Whether or not the request was made
  */
 public void requestGameNameList(String str) {
   ErrorCode ret = m_Stream.getGameNameList(str);
   if (ErrorCode.failed(ret)) {
     String err = ErrorCode.getString(ret);
     reportError(String.format("Error in GetGameNameList: %s\n", err));
   }
 }
Esempio n. 2
0
  public void getArchivingStateCallback(ErrorCode result, ArchivingState state) {
    m_ArchivingState = state;

    if (ErrorCode.failed(result)) {
      // String err = ErrorCode.getString(result);
      // reportWarning(String.Format("ArchivingStateDoneCallback got failure: {0}", err));
    }
  }
Esempio n. 3
0
  public void getUserInfoCallback(ErrorCode result, UserInfo userInfo) {
    m_UserInfo = userInfo;

    if (ErrorCode.failed(result)) {
      String err = ErrorCode.getString(result);
      reportError(String.format("UserInfoDoneCallback got failure: %s", err));
    }
  }
Esempio n. 4
0
  protected boolean checkError(ErrorCode err) {
    if (ErrorCode.failed(err)) {
      reportError(ErrorCode.getString(err));
      return false;
    }

    return true;
  }
Esempio n. 5
0
  /**
   * Send a singular action metadata point to Twitch's metadata service.
   *
   * @param name A specific name for an event meant to be queryable
   * @param streamTime Number of milliseconds into the broadcast for when event occurs
   * @param humanDescription Long form string to describe the meaning of an event. Maximum length is
   *     1000 characters
   * @param data A valid JSON object that is the payload of an event. Values in this JSON object
   *     have to be strings. Maximum of 50 keys are allowed. Maximum length for values are 255
   *     characters.
   * @return True if submitted and no error, false otherwise.
   */
  public boolean sendActionMetaData(
      String name, long streamTime, String humanDescription, String data) {
    ErrorCode ret =
        m_Stream.sendActionMetaData(m_AuthToken, name, streamTime, humanDescription, data);
    if (ErrorCode.failed(ret)) {
      String err = ErrorCode.getString(ret);
      reportError(String.format("Error while sending meta data: %s\n", err));

      return false;
    }

    return true;
  }
Esempio n. 6
0
  public void getGameNameListCallback(ErrorCode result, GameInfoList list) {
    if (ErrorCode.failed(result)) {
      String err = ErrorCode.getString(result);
      reportError(String.format("GameNameListCallback got failure: %s", err));
    }

    try {
      if (m_Listener != null) {
        m_Listener.onGameNameListReceived(result, list == null ? new GameInfo[0] : list.list);
      }
    } catch (Exception x) {
      reportError(x.toString());
    }
  }
Esempio n. 7
0
  /**
   * Terminates the broadcast.
   *
   * @return Whether or not successfully stopped
   */
  public boolean stopBroadcasting() {
    if (!this.getIsBroadcasting()) {
      return false;
    }

    ErrorCode ret = m_Stream.stop(true);
    if (ErrorCode.failed(ret)) {
      String err = ErrorCode.getString(ret);
      reportError(String.format("Error while stopping the broadcast: %s", err));
      return false;
    }

    setBroadcastState(BroadcastState.Stopping);

    return ErrorCode.succeeded(ret);
  }
Esempio n. 8
0
  protected void updateStreamInfo() {
    long now = System.nanoTime();
    long delta = (now - m_LastStreamInfoUpdateTime) / 1000000000;

    // only check every so often
    if (delta < s_StreamInfoUpdateInterval) {
      return;
    }

    m_LastStreamInfoUpdateTime = now;

    ErrorCode ret = m_Stream.getStreamInfo(m_AuthToken, m_UserName);
    if (ErrorCode.failed(ret)) {
      String err = ErrorCode.getString(ret);
      reportError(String.format("Error in TTV_GetStreamInfo: %s", err));
    }
  }
Esempio n. 9
0
  /**
   * Pauses the current broadcast and displays the default pause screen.
   *
   * @return Whether or not successfully paused
   */
  public boolean pauseBroadcasting() {
    if (!this.getIsBroadcasting()) {
      return false;
    }

    ErrorCode ret = m_Stream.pauseVideo();
    if (ErrorCode.failed(ret)) {
      // not streaming anymore
      stopBroadcasting();

      String err = ErrorCode.getString(ret);
      reportError(String.format("Error pausing stream: %s\n", err));
    } else {
      setBroadcastState(BroadcastState.Paused);
    }

    return ErrorCode.succeeded(ret);
  }
Esempio n. 10
0
  /**
   * Send the ending datapoint of an event that has a beginning and end.
   *
   * @param name A specific name for an event meant to be queryable
   * @param streamTime Number of milliseconds into the broadcast for when event occurs
   * @param sequenceId Associates a start and end event together. Use the corresponding sequenceId
   *     returned in TTV_SendStartSpanMetaData
   * @param humanDescription Long form string to describe the meaning of an event. Maximum length is
   *     1000 characters
   * @param data A valid JSON object that is the payload of an event. Values in this JSON object
   *     have to be strings. Maximum of 50 keys are allowed. Maximum length for values are 255
   *     characters.
   * @return True if submitted and no error, false otherwise.
   */
  public boolean endSpanMetaData(
      String name, long streamTime, long sequenceId, String humanDescription, String data) {
    if (sequenceId == -1) {
      reportError(String.format("Invalid sequence id: %d\n", sequenceId));
      return false;
    }

    ErrorCode ret =
        m_Stream.sendEndSpanMetaData(
            m_AuthToken, name, streamTime, sequenceId, humanDescription, data);
    if (ErrorCode.failed(ret)) {
      String err = ErrorCode.getString(ret);
      reportError(String.format("Error in SendStopSpanMetaData: %s\n", err));

      return false;
    }

    return true;
  }
Esempio n. 11
0
  /**
   * Returns a fully populated VideoParams struct based on the given width, height and frame rate.
   * This function is not the advised way to setup VideoParams because it has no information about
   * the user's maximum bitrate. Use the other version of GetRecommendedVideoParams instead if
   * possible.
   *
   * @param width The broadcast width
   * @param height The broadcast height
   * @param frameRate The broadcast frames per second
   * @return The VideoParams
   */
  public VideoParams getRecommendedVideoParams(int width, int height, int frameRate) {
    VideoParams videoParams = new VideoParams();

    videoParams.outputWidth = width;
    videoParams.outputHeight = height;
    videoParams.targetFps = frameRate;
    videoParams.pixelFormat = determinePixelFormat();
    videoParams.encodingCpuUsage = EncodingCpuUsage.TTV_ECU_HIGH;
    videoParams.disableAdaptiveBitrate = false;
    videoParams.verticalFlip = false;

    // Compute the rest of the fields based on the given parameters
    ErrorCode ret = m_Stream.getDefaultParams(videoParams);
    if (ErrorCode.failed(ret)) {
      String err = ErrorCode.getString(ret);
      reportError(String.format("Error in GetDefaultParams: %s", err));
      return null;
    }

    return videoParams;
  }
Esempio n. 12
0
  /**
   * Begins broadcast using the given VideoParams.
   *
   * @param videoParams The video params
   * @return Whether or not successfully broadcasting
   */
  public boolean startBroadcasting(VideoParams videoParams) {
    if (videoParams == null || !this.getIsReadyToBroadcast()) {
      return false;
    }

    m_VideoParams = videoParams.clone();

    // Setup the audio parameters
    m_AudioParams = new AudioParams();
    m_AudioParams.audioEnabled =
        m_EnableAudio && getIsAudioSupported(); // // only enable audio if possible

    if (!allocateBuffers()) {
      m_VideoParams = null;
      m_AudioParams = null;
      return false;
    }

    ErrorCode ret =
        m_Stream.start(videoParams, m_AudioParams, m_IngestServer, StartFlags.None, true);
    if (ErrorCode.failed(ret)) {
      cleanupBuffers();

      String err = ErrorCode.getString(ret);
      reportError(String.format("Error while starting to broadcast: %s", err));

      m_VideoParams = null;
      m_AudioParams = null;

      return false;
    }

    setBroadcastState(BroadcastState.Starting);

    return true;
  }
Esempio n. 13
0
 public void setStreamInfoCallback(ErrorCode result) {
   if (ErrorCode.failed(result)) {
     String err = ErrorCode.getString(result);
     reportWarning(String.format("SetStreamInfoCallback got failure: %s", err));
   }
 }
Esempio n. 14
0
 public void runCommercialCallback(ErrorCode result) {
   if (ErrorCode.failed(result)) {
     String err = ErrorCode.getString(result);
     reportWarning(String.format("RunCommercialCallback got failure: %s", err));
   }
 }
Esempio n. 15
0
  /**
   * Updates the internals of the controller. This should be called at least as frequently as the
   * desired broadcast framerate. Asynchronous results will be fired from inside this function.
   */
  public void update() {
    if (m_Stream == null || !m_SdkInitialized) {
      return;
    }

    ErrorCode ret = m_Stream.pollTasks();
    checkError(ret);

    // update the ingest tester
    if (getIsIngestTesting()) {
      m_IngestTester.update();

      // all done testing
      if (m_IngestTester.getIsDone()) {
        m_IngestTester = null;
        setBroadcastState(BroadcastState.ReadyToBroadcast);
      }
    }

    switch (m_BroadcastState) {
        // Kick off an authentication request
      case Authenticated:
        {
          setBroadcastState(BroadcastState.LoggingIn);

          ret = m_Stream.login(m_AuthToken);
          if (ErrorCode.failed(ret)) {
            String err = ErrorCode.getString(ret);
            reportError(String.format("Error in TTV_Login: %s\n", err));
          }
          break;
        }
        // Login
      case LoggedIn:
        {
          setBroadcastState(BroadcastState.FindingIngestServer);

          ret = m_Stream.getIngestServers(m_AuthToken);
          if (ErrorCode.failed(ret)) {
            setBroadcastState(BroadcastState.LoggedIn);

            String err = ErrorCode.getString(ret);
            reportError(String.format("Error in TTV_GetIngestServers: %s\n", err));
          }
          break;
        }
        // Ready to stream
      case ReceivedIngestServers:
        {
          setBroadcastState(BroadcastState.ReadyToBroadcast);

          // Kick off requests for the user and stream information that aren't 100% essential to be
          // ready before streaming starts
          ret = m_Stream.getUserInfo(m_AuthToken);
          if (ErrorCode.failed(ret)) {
            String err = ErrorCode.getString(ret);
            reportError(String.format("Error in TTV_GetUserInfo: %s\n", err));
          }

          updateStreamInfo();

          ret = m_Stream.getArchivingState(m_AuthToken);
          if (ErrorCode.failed(ret)) {
            String err = ErrorCode.getString(ret);
            reportError(String.format("Error in TTV_GetArchivingState: %s\n", err));
          }

          break;
        }
        // Waiting for the start/stop callback
      case Starting:
      case Stopping:
        {
          break;
        }
        // No action required
      case FindingIngestServer:
      case Authenticating:
      case Initialized:
      case Uninitialized:
      case IngestTesting:
        {
          break;
        }
      case Paused:
      case Broadcasting:
        {
          updateStreamInfo();
          break;
        }
      default:
        {
          break;
        }
    }
  }