+/** @brief Called when a NOP completes */
+static void nop_completed(void attribute((unused)) *v,
+ const char attribute((unused)) *err) {
+ /* TODO report the error somewhere */
+ nop_in_flight = 0;
+}
+
+/** @brief Called from time to time to arrange for a NOP to be sent
+ *
+ * At most one NOP remains in flight at any moment. If the client is not
+ * currently connected then no NOP is sent.
+ */
+static gboolean maybe_send_nop(gpointer attribute((unused)) data) {
+ if(!nop_in_flight && (disorder_eclient_state(client) & DISORDER_CONNECTED)) {
+ nop_in_flight = 1;
+ disorder_eclient_nop(client, nop_completed, 0);
+ }
+ if(rtp_supported) {
+ const int rtp_was_running = rtp_is_running;
+ rtp_is_running = rtp_running();
+ if(rtp_was_running != rtp_is_running)
+ event_raise("rtp-changed", 0);
+ }
+ return TRUE; /* keep call me please */
+}
+
+/** @brief Called when a rtp-address command succeeds */
+static void got_rtp_address(void attribute((unused)) *v,
+ const char *err,
+ int attribute((unused)) nvec,
+ char attribute((unused)) **vec) {
+ const int rtp_was_supported = rtp_supported;
+ const int rtp_was_running = rtp_is_running;
+
+ ++suppress_actions;
+ rtp_address_in_flight = 0;
+ if(err) {
+ /* An error just means that we're not using network play */
+ rtp_supported = 0;
+ rtp_is_running = 0;
+ } else {
+ rtp_supported = 1;
+ rtp_is_running = rtp_running();
+ }
+ /*fprintf(stderr, "rtp supported->%d, running->%d\n",
+ rtp_supported, rtp_is_running);*/
+ if(rtp_supported != rtp_was_supported
+ || rtp_is_running != rtp_was_running)
+ event_raise("rtp-changed", 0);
+ --suppress_actions;
+}
+
+/** @brief Called to check whether RTP play is available */
+static void check_rtp_address(const char attribute((unused)) *event,
+ void attribute((unused)) *eventdata,
+ void attribute((unused)) *callbackdata) {
+ if(!rtp_address_in_flight) {
+ //fprintf(stderr, "checking rtp\n");
+ disorder_eclient_rtp_address(client, got_rtp_address, NULL);
+ }
+}
+