static int set_volume(struct action_event *event) { const char *volume = upnp_get_string(event, "DesiredVolume"); service_lock(); int volume_level = atoi(volume); // range 0..100 if (volume_level < volume_range.min) volume_level = volume_range.min; if (volume_level > volume_range.max) volume_level = volume_range.max; const float decibel = volume_level_to_decibel(volume_level); char db_volume[10]; snprintf(db_volume, sizeof(db_volume), "%d", (int) (256 * decibel)); Log_info("control", "Setting %d volume-db to %d" , volume_level,(int)decibel); const double fraction = exp(decibel / 20 * log(10)); change_volume(volume, db_volume); output_set_volume(fraction, volume_level); set_mute_toggle(volume_level == 0); service_unlock(); return 0; }
static int set_next_avtransport_uri(struct action_event *event) { int rc = 0; char *value; ENTER(); if (obtain_instanceid(event, NULL)) { LEAVE(); return -1; } value = upnp_get_string(event, "NextURI"); if (value == NULL) { LEAVE(); return -1; } service_lock(); output_set_next_uri(value); change_var_and_notify(TRANSPORT_VAR_NEXT_AV_URI, value); printf("%s: NextURI='%s'\n", __FUNCTION__, value); free(value); value = upnp_get_string(event, "NextURIMetaData"); if (value == NULL) { rc = -1; } else { change_var_and_notify(TRANSPORT_VAR_NEXT_AV_URI_META, value); free(value); } service_unlock(); LEAVE(); return rc; }
static int stop(struct action_event *event) { ENTER(); if (obtain_instanceid(event, NULL)) { return -1; } service_lock(); switch (transport_state_) { case TRANSPORT_STOPPED: // For clients that didn't get it. change_and_notify_transport(TRANSPORT_STOPPED); break; case TRANSPORT_PLAYING: case TRANSPORT_TRANSITIONING: case TRANSPORT_PAUSED_RECORDING: case TRANSPORT_RECORDING: case TRANSPORT_PAUSED_PLAYBACK: output_stop(); change_and_notify_transport(TRANSPORT_STOPPED); // Set TransportPlaySpeed to '1' break; case TRANSPORT_NO_MEDIA_PRESENT: /* action not allowed in these states - error 701 */ upnp_set_error(event, UPNP_TRANSPORT_E_TRANSITION_NA, "Transition not allowed"); break; } service_unlock(); LEAVE(); return 0; }
static int get_position_info(struct action_event *event) { int rc; ENTER(); if (obtain_instanceid(event, NULL)) { rc = -1; goto out; } gint64 duration, position; service_lock(); const int pos_result = output_get_position(&duration, &position); service_unlock(); if (pos_result == 0) { char tbuf[32]; print_upnp_time_into_buffer(tbuf, sizeof(tbuf), duration); replace_var(TRANSPORT_VAR_CUR_TRACK_DUR, tbuf); print_upnp_time_into_buffer(tbuf, sizeof(tbuf), position); replace_var(TRANSPORT_VAR_REL_TIME_POS, tbuf); } rc = upnp_append_variable(event, TRANSPORT_VAR_CUR_TRACK, "Track"); if (rc) goto out; rc = upnp_append_variable(event, TRANSPORT_VAR_CUR_TRACK_DUR, "TrackDuration"); if (rc) goto out; rc = upnp_append_variable(event, TRANSPORT_VAR_CUR_TRACK_META, "TrackMetaData"); if (rc) goto out; rc = upnp_append_variable(event, TRANSPORT_VAR_CUR_TRACK_URI, "TrackURI"); if (rc) goto out; rc = upnp_append_variable(event, TRANSPORT_VAR_REL_TIME_POS, "RelTime"); if (rc) goto out; rc = upnp_append_variable(event, TRANSPORT_VAR_ABS_TIME_POS, "AbsTime"); if (rc) goto out; rc = upnp_append_variable(event, TRANSPORT_VAR_REL_CTR_POS, "RelCount"); if (rc) goto out; rc = upnp_append_variable(event, TRANSPORT_VAR_ABS_CTR_POS, "AbsCount"); if (rc) goto out; out: LEAVE(); return rc; }