[pulseaudio-discuss] [PATCH v2 3/3] sink, source: Fix error reporting style for rate updates

David Henningsson david.henningsson at canonical.com
Tue Aug 27 02:36:38 PDT 2013


On 08/27/2013 11:11 AM, Tanu Kaskinen wrote:
> ---
>  src/modules/alsa/alsa-sink.c   |  8 ++++----
>  src/modules/alsa/alsa-source.c |  8 ++++----
>  src/pulsecore/sink-input.c     |  4 ++--
>  src/pulsecore/sink.c           | 24 ++++++++++++------------
>  src/pulsecore/sink.h           |  4 ++--
>  src/pulsecore/source-output.c  |  4 ++--
>  src/pulsecore/source.c         | 26 +++++++++++++-------------
>  src/pulsecore/source.h         |  4 ++--
>  8 files changed, 41 insertions(+), 41 deletions(-)
> 
> diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c
> index f910d19..6e60646 100644
> --- a/src/modules/alsa/alsa-sink.c
> +++ b/src/modules/alsa/alsa-sink.c
> @@ -1593,7 +1593,7 @@ static bool sink_set_formats(pa_sink *s, pa_idxset *formats) {
>      return true;
>  }
>  
> -static bool sink_update_rate_cb(pa_sink *s, uint32_t rate) {
> +static int sink_update_rate_cb(pa_sink *s, uint32_t rate) {
>      struct userdata *u = s->userdata;
>      int i;
>      bool supported = false;
> @@ -1609,16 +1609,16 @@ static bool sink_update_rate_cb(pa_sink *s, uint32_t rate) {
>  
>      if (!supported) {
>          pa_log_info("Sink does not support sample rate of %d Hz", rate);
> -        return false;
> +        return -1;
>      }
>  
>      if (!PA_SINK_IS_OPENED(s->state)) {
>          pa_log_info("Updating rate for device %s, new rate is %d",u->device_name, rate);
>          u->sink->sample_spec.rate = rate;
> -        return true;
> +        return 0;
>      }
>  
> -    return false;
> +    return -1;
>  }
>  
>  static int process_rewind(struct userdata *u) {
> diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c
> index faf8965..78125b1 100644
> --- a/src/modules/alsa/alsa-source.c
> +++ b/src/modules/alsa/alsa-source.c
> @@ -1401,7 +1401,7 @@ static void source_update_requested_latency_cb(pa_source *s) {
>      update_sw_params(u);
>  }
>  
> -static bool source_update_rate_cb(pa_source *s, uint32_t rate) {
> +static int source_update_rate_cb(pa_source *s, uint32_t rate) {
>      struct userdata *u = s->userdata;
>      int i;
>      bool supported = false;
> @@ -1417,16 +1417,16 @@ static bool source_update_rate_cb(pa_source *s, uint32_t rate) {
>  
>      if (!supported) {
>          pa_log_info("Source does not support sample rate of %d Hz", rate);
> -        return false;
> +        return -1;
>      }
>  
>      if (!PA_SOURCE_IS_OPENED(s->state)) {
>          pa_log_info("Updating rate for device %s, new rate is %d", u->device_name, rate);
>          u->source->sample_spec.rate = rate;
> -        return true;
> +        return 0;
>      }
>  
> -    return false;
> +    return -1;
>  }
>  
>  static void thread_func(void *userdata) {
> diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c
> index a275715..b5e8a0b 100644
> --- a/src/pulsecore/sink-input.c
> +++ b/src/pulsecore/sink-input.c
> @@ -426,7 +426,7 @@ int pa_sink_input_new(
>             module-suspend-on-idle can resume a sink */
>  
>          pa_log_info("Trying to change sample rate");
> -        if (pa_sink_update_rate(data->sink, data->sample_spec.rate, pa_sink_input_new_data_is_passthrough(data)) == true)
> +        if (pa_sink_update_rate(data->sink, data->sample_spec.rate, pa_sink_input_new_data_is_passthrough(data)) >= 0)
>              pa_log_info("Rate changed to %u Hz", data->sink->sample_spec.rate);
>      }
>  
> @@ -1829,7 +1829,7 @@ int pa_sink_input_finish_move(pa_sink_input *i, pa_sink *dest, bool save) {
>             SINK_INPUT_MOVE_FINISH hook */
>  
>          pa_log_info("Trying to change sample rate");
> -        if (pa_sink_update_rate(dest, i->sample_spec.rate, pa_sink_input_is_passthrough(i)) == true)
> +        if (pa_sink_update_rate(dest, i->sample_spec.rate, pa_sink_input_is_passthrough(i)) >= 0)
>              pa_log_info("Rate changed to %u Hz", dest->sample_spec.rate);
>      }
>  
> diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
> index bc8a3fd..de8c82e 100644
> --- a/src/pulsecore/sink.c
> +++ b/src/pulsecore/sink.c
> @@ -1377,8 +1377,8 @@ void pa_sink_render_full(pa_sink *s, size_t length, pa_memchunk *result) {
>  }
>  
>  /* Called from main thread */
> -bool pa_sink_update_rate(pa_sink *s, uint32_t rate, bool passthrough) {
> -    bool ret = false;
> +int pa_sink_update_rate(pa_sink *s, uint32_t rate, bool passthrough) {
> +    int ret = -1;
>      uint32_t desired_rate = rate;
>      uint32_t default_rate = s->default_sample_rate;
>      uint32_t alternate_rate = s->alternate_sample_rate;
> @@ -1387,32 +1387,32 @@ bool pa_sink_update_rate(pa_sink *s, uint32_t rate, bool passthrough) {
>      bool use_alternate = false;
>  
>      if (rate == s->sample_spec.rate)
> -        return true;
> +        return 0;
>  
>      if (!s->update_rate)
> -        return false;
> +        return -1;
>  
>      if (PA_UNLIKELY(default_rate == alternate_rate && !passthrough)) {
>          pa_log_debug("Default and alternate sample rates are the same.");
> -        return false;
> +        return -1;
>      }
>  
>      if (PA_SINK_IS_RUNNING(s->state)) {
>          pa_log_info("Cannot update rate, SINK_IS_RUNNING, will keep using %u Hz",
>                      s->sample_spec.rate);
> -        return false;
> +        return -1;
>      }
>  
>      if (s->monitor_source) {
>          if (PA_SOURCE_IS_RUNNING(s->monitor_source->state) == true) {
>              pa_log_info("Cannot update rate, monitor source is RUNNING");
> -            return false;
> +            return -1;
>          }
>      }
>  
>      if (PA_UNLIKELY (desired_rate < 8000 ||
>                       desired_rate > PA_RATE_MAX))
> -        return false;
> +        return -1;
>  
>      if (!passthrough) {
>          pa_assert((default_rate % 4000 == 0) || (default_rate % 11025 == 0));
> @@ -1436,15 +1436,15 @@ bool pa_sink_update_rate(pa_sink *s, uint32_t rate, bool passthrough) {
>      }
>  
>      if (desired_rate == s->sample_spec.rate)
> -        return false;
> +        return -1;
>  
>      if (!passthrough && pa_sink_used_by(s) > 0)
> -        return false;
> +        return -1;
>  
>      pa_log_debug("Suspending sink %s due to changing the sample rate.", s->name);
>      pa_sink_suspend(s, true, PA_SUSPEND_INTERNAL);
>  
> -    if (s->update_rate(s, desired_rate) == true) {
> +    if (s->update_rate(s, desired_rate) >= 0) {
>          /* update monitor source as well */
>          if (s->monitor_source && !passthrough)
>              pa_source_update_rate(s->monitor_source, desired_rate, false);
> @@ -1455,7 +1455,7 @@ bool pa_sink_update_rate(pa_sink *s, uint32_t rate, bool passthrough) {
>                  pa_sink_input_update_rate(i);
>          }
>  
> -        ret = true;
> +        ret = 0;
>      }
>  
>      pa_sink_suspend(s, false, PA_SUSPEND_INTERNAL);
> diff --git a/src/pulsecore/sink.h b/src/pulsecore/sink.h
> index 54056a7..332e2b1 100644
> --- a/src/pulsecore/sink.h
> +++ b/src/pulsecore/sink.h
> @@ -230,7 +230,7 @@ struct pa_sink {
>  
>      /* Called whenever the sampling frequency shall be changed. Called from
>       * main thread. */
> -    bool (*update_rate)(pa_sink *s, uint32_t rate);
> +    int (*update_rate)(pa_sink *s, uint32_t rate);
>  
>      /* Contains copies of the above data so that the real-time worker
>       * thread can work without access locking */
> @@ -411,7 +411,7 @@ unsigned pa_device_init_priority(pa_proplist *p);
>  
>  /**** May be called by everyone, from main context */
>  
> -bool pa_sink_update_rate(pa_sink *s, uint32_t rate, bool passthrough);
> +int pa_sink_update_rate(pa_sink *s, uint32_t rate, bool passthrough);
>  void pa_sink_set_latency_offset(pa_sink *s, int64_t offset);
>  
>  /* The returned value is supposed to be in the time domain of the sound card! */
> diff --git a/src/pulsecore/source-output.c b/src/pulsecore/source-output.c
> index 5a48935..b158f14 100644
> --- a/src/pulsecore/source-output.c
> +++ b/src/pulsecore/source-output.c
> @@ -366,7 +366,7 @@ int pa_source_output_new(
>             module-suspend-on-idle can resume a source */
>  
>          pa_log_info("Trying to change sample rate");
> -        if (pa_source_update_rate(data->source, data->sample_spec.rate, pa_source_output_new_data_is_passthrough(data)) == true)
> +        if (pa_source_update_rate(data->source, data->sample_spec.rate, pa_source_output_new_data_is_passthrough(data)) >= 0)
>              pa_log_info("Rate changed to %u Hz", data->source->sample_spec.rate);
>      }
>  
> @@ -1449,7 +1449,7 @@ int pa_source_output_finish_move(pa_source_output *o, pa_source *dest, bool save
>             SOURCE_OUTPUT_MOVE_FINISH hook */
>  
>          pa_log_info("Trying to change sample rate");
> -        if (pa_source_update_rate(dest, o->sample_spec.rate, pa_source_output_is_passthrough(o)) == true)
> +        if (pa_source_update_rate(dest, o->sample_spec.rate, pa_source_output_is_passthrough(o)) >= 0)
>              pa_log_info("Rate changed to %u Hz", dest->sample_spec.rate);
>      }
>  
> diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c
> index 5e59a40..f695655 100644
> --- a/src/pulsecore/source.c
> +++ b/src/pulsecore/source.c
> @@ -967,40 +967,40 @@ void pa_source_post_direct(pa_source*s, pa_source_output *o, const pa_memchunk *
>  }
>  
>  /* Called from main thread */
> -bool pa_source_update_rate(pa_source *s, uint32_t rate, bool passthrough) {
> -    bool ret = false;
> +int pa_source_update_rate(pa_source *s, uint32_t rate, bool passthrough) {
> +    int ret;

There's a change here that now ret is no longer initialized, but
assuming this is not a mistake on your side, feel free to push all the
remaining three patches in this series.

Thanks!

>      uint32_t desired_rate = rate;
>      uint32_t default_rate = s->default_sample_rate;
>      uint32_t alternate_rate = s->alternate_sample_rate;
>      bool use_alternate = false;
>  
>      if (rate == s->sample_spec.rate)
> -        return true;
> +        return 0;
>  
>      if (!s->update_rate && !s->monitor_of)
> -        return false;
> +        return -1;
>  
>      if (PA_UNLIKELY(default_rate == alternate_rate && !passthrough)) {
>          pa_log_debug("Default and alternate sample rates are the same.");
> -        return false;
> +        return -1;
>      }
>  
>      if (PA_SOURCE_IS_RUNNING(s->state)) {
>          pa_log_info("Cannot update rate, SOURCE_IS_RUNNING, will keep using %u Hz",
>                      s->sample_spec.rate);
> -        return false;
> +        return -1;
>      }
>  
>      if (s->monitor_of) {
>          if (PA_SINK_IS_RUNNING(s->monitor_of->state)) {
>              pa_log_info("Cannot update rate, this is a monitor source and the sink is running.");
> -            return false;
> +            return -1;
>          }
>      }
>  
>      if (PA_UNLIKELY (desired_rate < 8000 ||
>                       desired_rate > PA_RATE_MAX))
> -        return false;
> +        return -1;
>  
>      if (!passthrough) {
>          pa_assert((default_rate % 4000 == 0) || (default_rate % 11025 == 0));
> @@ -1024,10 +1024,10 @@ bool pa_source_update_rate(pa_source *s, uint32_t rate, bool passthrough) {
>      }
>  
>      if (desired_rate == s->sample_spec.rate)
> -        return false;
> +        return -1;
>  
>      if (!passthrough && pa_source_used_by(s) > 0)
> -        return false;
> +        return -1;
>  
>      pa_log_debug("Suspending source %s due to changing the sample rate.", s->name);
>      pa_source_suspend(s, true, PA_SUSPEND_INTERNAL);
> @@ -1046,7 +1046,7 @@ bool pa_source_update_rate(pa_source *s, uint32_t rate, bool passthrough) {
>              s->sample_spec.rate = desired_rate;
>              ret = pa_sink_update_rate(s->monitor_of, desired_rate, false);
>  
> -            if (!ret) {
> +            if (ret < 0) {
>                  /* Changing the sink rate failed, roll back the old rate for
>                   * the monitor source. Why did we set the source rate before
>                   * calling pa_sink_update_rate(), you may ask. The reason is
> @@ -1060,10 +1060,10 @@ bool pa_source_update_rate(pa_source *s, uint32_t rate, bool passthrough) {
>                  s->sample_spec.rate = old_rate;
>              }
>          } else
> -            ret = false;
> +            ret = -1;
>      }
>  
> -    if (ret) {
> +    if (ret >= 0) {
>          uint32_t idx;
>          pa_source_output *o;
>  
> diff --git a/src/pulsecore/source.h b/src/pulsecore/source.h
> index 6bdd472..b20d4c0 100644
> --- a/src/pulsecore/source.h
> +++ b/src/pulsecore/source.h
> @@ -187,7 +187,7 @@ struct pa_source {
>  
>      /* Called whenever the sampling frequency shall be changed. Called from
>       * main thread. */
> -    bool (*update_rate)(pa_source *s, uint32_t rate);
> +    int (*update_rate)(pa_source *s, uint32_t rate);
>  
>      /* Contains copies of the above data so that the real-time worker
>       * thread can work without access locking */
> @@ -382,7 +382,7 @@ bool pa_source_update_proplist(pa_source *s, pa_update_mode_t mode, pa_proplist
>  int pa_source_set_port(pa_source *s, const char *name, bool save);
>  void pa_source_set_mixer_dirty(pa_source *s, bool is_dirty);
>  
> -bool pa_source_update_rate(pa_source *s, uint32_t rate, bool passthrough);
> +int pa_source_update_rate(pa_source *s, uint32_t rate, bool passthrough);
>  
>  unsigned pa_source_linked_by(pa_source *s); /* Number of connected streams */
>  unsigned pa_source_used_by(pa_source *s); /* Number of connected streams that are not corked */
> 



-- 
David Henningsson, Canonical Ltd.
https://launchpad.net/~diwic


More information about the pulseaudio-discuss mailing list