/** * Sets (activates or deactivates) the speakers as defined in the given list. * * @param speakers all speakers to read the active flag from */ public void setSpeakers(List<Speaker> speakers) { try { Log.d(TAG, "setSpeakers() requesting..."); String idsString = ""; boolean first = true; // The list of speakers to activate is a comma-separated string with // the hex versions of the speakers' IDs for (Speaker speaker : speakers) { if (speaker.isActive()) { if (!first) { idsString += ","; } else { first = false; } idsString += speaker.getIdAsHex(); } } String url = String.format( "%s/ctrl-int/1/setspeakers?speaker-id=%s&session-id=%s", session.getRequestBase(), idsString, session.sessionId); RequestHelper.request(url, false); } catch (Exception e) { Log.e(TAG, "Could not set speakers: ", e); } }
/** * Helper to control a speaker's relative volume. This relative volume is a value between 0 and * 100 describing the relative volume of a speaker in comparison to the master volume. For this * the URL parameters <code>%s/ctrl-int/1/setproperty?speaker-id=%s&dmcp.volume=%d</code> are * used. * * @param speakerId ID of the speaker to control * @param relativeVolume the relative volume to set * @throws Exception */ private void setRelativeVolume(long speakerId, int relativeVolume) throws Exception { String url; url = String.format( "%s/ctrl-int/1/setproperty?speaker-id=%s&dmcp.volume=%d" + "&session-id=%s", session.getRequestBase(), speakerId, relativeVolume, session.sessionId); RequestHelper.request(url, false); }
/** * Helper to control a speakers's absolute volume. This uses the URL parameters <code> * setproperty?dmcp.volume=%d&include-speaker-id=%s</code> which results in iTunes controlling the * master volume and the selected speaker synchronously. * * @param speakerId ID of the speaker to control * @param absoluteVolume the volume to set absolutely * @throws Exception */ private void setAbsoluteVolume(long speakerId, int absoluteVolume) throws Exception { String url; url = String.format( "%s/ctrl-int/1/setproperty?dmcp.volume=%d&include-speaker-id=%s" + "&session-id=%s", session.getRequestBase(), absoluteVolume, speakerId, session.sessionId); RequestHelper.request(url, false); }
/** * 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; }