예제 #1
0
  /**
   * Reads the list of available speakers
   *
   * @return list of available speakers
   */
  public List<Speaker> getSpeakers(final List<Speaker> speakers) {
    try {
      Log.d(TAG, "getSpeakers() requesting...");

      String temp =
          String.format(
              "%s/ctrl-int/1/getspeakers?session-id=%s",
              session.getRequestBase(), session.sessionId);

      byte[] raw = RequestHelper.request(temp, false);

      Response response = ResponseParser.performParse(raw);

      Response casp = response.getNested("casp");
      if (casp != null) {
        speakers.clear();
      }

      List<Response> mdclArray = casp.findArray("mdcl");

      // Master volume is required to compute the speakers' absolute volume
      long masterVolume = getVolume();

      for (Response mdcl : mdclArray) {
        Speaker speaker = new Speaker();
        speaker.setName(mdcl.getString("minm"));
        long id = mdcl.getNumberLong("msma");
        speaker.setId(id);
        Log.d(TAG, "Speaker = " + speaker.getName());
        int relativeVolume = (int) mdcl.getNumberLong("cmvo");
        boolean isActive = mdcl.containsKey("caia");
        speaker.setActive(isActive);
        // mastervolume/100 * relativeVolume/100 * 100
        int absoluteVolume = isActive ? (int) masterVolume * relativeVolume / 100 : 0;
        speaker.setAbsoluteVolume(absoluteVolume);
        speakers.add(speaker);
      }

    } catch (Exception e) {
      Log.e(TAG, "Could not get speakers: ", e);
      speakers.clear();
      Speaker speaker = new Speaker();
      speaker.setName("Computer");
      speaker.setId(1);
      speaker.setActive(true);
      speaker.setAbsoluteVolume(50);
      speakers.add(speaker);
    }

    return speakers;
  }