[pulseaudio-discuss] [PATCH] Changes for mono-only field in enable-remixing option for bug 65288

dinesh thangavel rtdinesh.89 at gmail.com
Tue May 7 09:48:08 PDT 2013


 Hello,
    Kindly review the patch.

On Mon, May 6, 2013 at 11:30 AM, rtdinesh <rtdinesh.89 at gmail.com> wrote:
> From: DINESH R T <rtdinesh.89 at gmail.com>
>
> Extended enable-remixing field with mono-only option which enables remixing only when source/sink is mono. I couldn't simulate the mono scenario in   source/sink, so i din't test the code but compiled the code with pulseaduio head.
>
> ---
>  src/daemon/daemon-conf.c      |   26 ++++++++++++++++++++++----
>  src/daemon/daemon-conf.h      |    2 +-
>  src/daemon/main.c             |    2 +-
>  src/pulse/sample.c            |   28 ++++++++++++++++++++++++++++
>  src/pulse/sample.h            |   19 +++++++++++++++++++
>  src/pulsecore/core.c          |    2 +-
>  src/pulsecore/core.h          |    2 +-
>  src/pulsecore/resampler.c     |   29 ++++++++++++++++++++++++++---
>  src/pulsecore/resampler.h     |    3 ++-
>  src/pulsecore/sink-input.c    |    8 +++++---
>  src/pulsecore/source-output.c |    8 +++++---
>  11 files changed, 111 insertions(+), 18 deletions(-)
>
> diff --git a/src/daemon/daemon-conf.c b/src/daemon/daemon-conf.c
> index 2c43cf9..45976b1 100644
> --- a/src/daemon/daemon-conf.c
> +++ b/src/daemon/daemon-conf.c
> @@ -84,7 +84,7 @@ static const pa_daemon_conf default_conf = {
>      .log_meta = FALSE,
>      .log_time = FALSE,
>      .resample_method = PA_RESAMPLER_AUTO,
> -    .disable_remixing = FALSE,
> +    .remixing_option = PA_DISABLE_REMIXING,
>      .disable_lfe_remixing = TRUE,
>      .config_file = NULL,
>      .use_pid_file = TRUE,
> @@ -511,6 +511,24 @@ static int parse_nice_level(pa_config_parser_state *state) {
>      return 0;
>  }
>
> +
> +
> +static int parse_enable_remixing(pa_config_parser_state *state) {
> +    pa_daemon_conf *c;
> +    pa_remixing_option_t f;
> +
> +    pa_assert(state);
> +
> +    c = state->data;
> +
> +    if ((f = pa_parse_remixing(state->rvalue)) < 0) {
> +        pa_log(_("[%s:%u] Invalid remixing option '%s'."), state->filename, state->lineno, state->rvalue);
> +        return -1;
> +    }
> +
> +    c->remixing_option = f;
> +    return 0;
> +}
>  static int parse_rtprio(pa_config_parser_state *state) {
>  #if !defined(OS_IS_WIN32) && defined(HAVE_SCHED_H)
>      pa_daemon_conf *c;
> @@ -600,8 +618,8 @@ int pa_daemon_conf_load(pa_daemon_conf *c, const char *filename) {
>          { "deferred-volume-extra-delay-usec",
>                                          pa_config_parse_int,      &c->deferred_volume_extra_delay_usec, NULL },
>          { "nice-level",                 parse_nice_level,         c, NULL },
> -        { "disable-remixing",           pa_config_parse_bool,     &c->disable_remixing, NULL },
> -        { "enable-remixing",            pa_config_parse_not_bool, &c->disable_remixing, NULL },
> +        { "disable-remixing",           parse_enable_remixing,    &c->remixing_option, NULL },
> +        { "enable-remixing",            parse_enable_remixing,           &c->remixing_option, NULL },
>          { "disable-lfe-remixing",       pa_config_parse_bool,     &c->disable_lfe_remixing, NULL },
>          { "enable-lfe-remixing",        pa_config_parse_not_bool, &c->disable_lfe_remixing, NULL },
>          { "load-default-script-file",   pa_config_parse_bool,     &c->load_default_script_file, NULL },
> @@ -790,7 +808,7 @@ char *pa_daemon_conf_dump(pa_daemon_conf *c) {
>      pa_strbuf_printf(s, "log-target = %s\n", c->auto_log_target ? "auto" : (c->log_target == PA_LOG_SYSLOG ? "syslog" : "stderr"));
>      pa_strbuf_printf(s, "log-level = %s\n", log_level_to_string[c->log_level]);
>      pa_strbuf_printf(s, "resample-method = %s\n", pa_resample_method_to_string(c->resample_method));
> -    pa_strbuf_printf(s, "enable-remixing = %s\n", pa_yes_no(!c->disable_remixing));
> +    pa_strbuf_printf(s, "enable-remixing = %s\n", pa_remixing_option_to_string(c->remixing_option));
>      pa_strbuf_printf(s, "enable-lfe-remixing = %s\n", pa_yes_no(!c->disable_lfe_remixing));
>      pa_strbuf_printf(s, "default-sample-format = %s\n", pa_sample_format_to_string(c->default_sample_spec.format));
>      pa_strbuf_printf(s, "default-sample-rate = %u\n", c->default_sample_spec.rate);
> diff --git a/src/daemon/daemon-conf.h b/src/daemon/daemon-conf.h
> index faf2540..da42cfc 100644
> --- a/src/daemon/daemon-conf.h
> +++ b/src/daemon/daemon-conf.h
> @@ -68,7 +68,6 @@ typedef struct pa_daemon_conf {
>          system_instance,
>          no_cpu_limit,
>          disable_shm,
> -        disable_remixing,
>          disable_lfe_remixing,
>          load_default_script_file,
>          disallow_exit,
> @@ -84,6 +83,7 @@ typedef struct pa_daemon_conf {
>          realtime_priority,
>          nice_level,
>          resample_method;
> +    pa_remixing_option_t remixing_option;
>      char *script_commands, *dl_search_path, *default_script_file;
>      pa_log_target_t log_target;
>      pa_log_level_t log_level;
> diff --git a/src/daemon/main.c b/src/daemon/main.c
> index c18524f..6f8c160 100644
> --- a/src/daemon/main.c
> +++ b/src/daemon/main.c
> @@ -1026,7 +1026,7 @@ int main(int argc, char *argv[]) {
>      c->resample_method = conf->resample_method;
>      c->realtime_priority = conf->realtime_priority;
>      c->realtime_scheduling = !!conf->realtime_scheduling;
> -    c->disable_remixing = !!conf->disable_remixing;
> +    c->remixing_option = conf->remixing_option;
>      c->disable_lfe_remixing = !!conf->disable_lfe_remixing;
>      c->deferred_volume = !!conf->deferred_volume;
>      c->running_as_daemon = !!conf->daemonize;
> diff --git a/src/pulse/sample.c b/src/pulse/sample.c
> index b613612..cbb2da7 100644
> --- a/src/pulse/sample.c
> +++ b/src/pulse/sample.c
> @@ -157,6 +157,18 @@ const char *pa_sample_format_to_string(pa_sample_format_t f) {
>
>      return table[f];
>  }
> +const char *pa_remixing_option_to_string(pa_remixing_option_t f) {
> +    static const char* const table[]= {
> +        [PA_DISABLE_REMIXING] = "NO",
> +        [PA_ENABLE_REMIXING] = "YES",
> +        [PA_MONO_ONLY] = "MONO-ONLY"
> +    };
> +
> +    if (f < 0 || f >= PA_REMIXING_MAX)
> +        return NULL;
> +
> +    return table[f];
> +}
>
>  char *pa_sample_spec_snprint(char *s, size_t l, const pa_sample_spec *spec) {
>      pa_assert(s);
> @@ -244,6 +256,22 @@ pa_sample_format_t pa_parse_sample_format(const char *format) {
>      return PA_SAMPLE_INVALID;
>  }
>
> +
> +pa_remixing_option_t pa_parse_remixing(const char *format){
> +    pa_assert(format);
> +    if (strcasecmp(format, "mono-only") == 0)
> +        return PA_MONO_ONLY;
> +    else if (strcasecmp(format, "yes") == 0)
> +        return PA_ENABLE_REMIXING;
> +    else if (strcasecmp(format,"true") == 0)
> +        return PA_ENABLE_REMIXING;
> +    else if(strcasecmp(format, "no") == 0)
> +        return PA_DISABLE_REMIXING;
> +    else if(strcasecmp(format, "false") == 0)
> +        return PA_DISABLE_REMIXING;
> +
> + return PA_REMIXING_INVALID;
> +}
>  int pa_sample_format_is_le(pa_sample_format_t f) {
>      pa_assert(f >= PA_SAMPLE_U8);
>      pa_assert(f < PA_SAMPLE_MAX);
> diff --git a/src/pulse/sample.h b/src/pulse/sample.h
> index 9067951..65272a0 100644
> --- a/src/pulse/sample.h
> +++ b/src/pulse/sample.h
> @@ -180,6 +180,21 @@ typedef enum pa_sample_format {
>      /**< An invalid value */
>  } pa_sample_format_t;
>
> +/* Remixing Options */
> +typedef enum pa_remixing_option{
> +       /* ENable Remixing */
> +       PA_ENABLE_REMIXING=0,
> +    /* Enable Remix if input/output/both  is mono-only */
> +       PA_MONO_ONLY=1,
> +    /* Disable Remixing */
> +       PA_DISABLE_REMIXING=2,
> +    /*Upper limit of valid remixing type */
> +   PA_REMIXING_MAX=4,
> +
> +       PA_REMIXING_INVALID = -1
> +}pa_remixing_option_t;
> +
> +
>  #ifdef WORDS_BIGENDIAN
>  /** Signed 16 Bit PCM, native endian */
>  #define PA_SAMPLE_S16NE PA_SAMPLE_S16BE
> @@ -244,6 +259,10 @@ typedef enum pa_sample_format {
>  #define PA_SAMPLE_S24BE PA_SAMPLE_S24BE
>  #define PA_SAMPLE_S24_32LE PA_SAMPLE_S24_32LE
>  #define PA_SAMPLE_S24_32BE PA_SAMPLE_S24_32BE
> +
> +#define PA_ENABLE_REMIXING PA_ENABLE_REMIXING
> +#define PA_DISABLE_REMIXING PA_DISABLE_REMIXING
> +#define PA_MONO_ONLY PA_MONO_ONLY
>  /** \endcond */
>
>  /** A sample format and attribute specification */
> diff --git a/src/pulsecore/core.c b/src/pulsecore/core.c
> index 2ca50c2..330fe04 100644
> --- a/src/pulsecore/core.c
> +++ b/src/pulsecore/core.c
> @@ -138,7 +138,7 @@ pa_core* pa_core_new(pa_mainloop_api *m, pa_bool_t shared, size_t shm_size) {
>      c->running_as_daemon = FALSE;
>      c->realtime_scheduling = FALSE;
>      c->realtime_priority = 5;
> -    c->disable_remixing = FALSE;
> +    c->remixing_option = PA_DISABLE_REMIXING;
>      c->disable_lfe_remixing = FALSE;
>      c->deferred_volume = TRUE;
>      c->resample_method = PA_RESAMPLER_SPEEX_FLOAT_BASE + 1;
> diff --git a/src/pulsecore/core.h b/src/pulsecore/core.h
> index a8cff5c..0f14878 100644
> --- a/src/pulsecore/core.h
> +++ b/src/pulsecore/core.h
> @@ -174,11 +174,11 @@ struct pa_core {
>      pa_bool_t disallow_exit:1;
>      pa_bool_t running_as_daemon:1;
>      pa_bool_t realtime_scheduling:1;
> -    pa_bool_t disable_remixing:1;
>      pa_bool_t disable_lfe_remixing:1;
>      pa_bool_t deferred_volume:1;
>
>      pa_resample_method_t resample_method;
> +    pa_remixing_option_t remixing_option;
>      int realtime_priority;
>
>      pa_server_type_t server_type;
> diff --git a/src/pulsecore/resampler.c b/src/pulsecore/resampler.c
> index bc45f06..53f4b03 100644
> --- a/src/pulsecore/resampler.c
> +++ b/src/pulsecore/resampler.c
> @@ -203,7 +203,6 @@ pa_resampler* pa_resampler_new(
>          pa_resample_flags_t flags) {
>
>      pa_resampler *r = NULL;
> -
>      pa_assert(pool);
>      pa_assert(a);
>      pa_assert(b);
> @@ -700,7 +699,7 @@ static void calc_map_table(pa_resampler *r) {
>                      m->map_table_f[oc][ic] = 1.0f;
>              }
>          }
> -    } else {
> +    }else {
>
>          /* OK, we shall do the full monty: upmixing and downmixing. Our
>           * algorithm is relatively simple, does not do spacialization, delay
> @@ -770,11 +769,35 @@ static void calc_map_table(pa_resampler *r) {
>              ic_unconnected_left = 0,
>              ic_unconnected_right = 0,
>              ic_unconnected_center = 0,
> -            ic_unconnected_lfe = 0;
> +            ic_unconnected_lfe = 0,
> +            c;
>          bool ic_unconnected_center_mixed_in = 0;
> +        bool input_is_mono_only = true;
> +        bool output_is_mono_only = true;
>
>          pa_assert(remix);
>
> +        if(r->flags & PA_RESAMPLER_MONO_ONLY){
> +
> +        for (c = 0; c < r->i_cm.channels; c++) {
> +          if (r->i_cm.map[c] != PA_CHANNEL_POSITION_MONO) {
> +            input_is_mono_only = false;
> +            break;
> +          }
> +        }
> +
> +        for (c = 0; c < r->o_cm.channels; c++) {
> +          if (r->o_cm.map[c] != PA_CHANNEL_POSITION_MONO) {
> +            output_is_mono_only = false;
> +            break;
> +          }
> +        }
> +
> +        if ((!input_is_mono_only) || (!output_is_mono_only))
> +          return;
> +        }
> +
> +
>          for (ic = 0; ic < n_ic; ic++) {
>              if (on_left(r->i_cm.map[ic]))
>                  ic_left++;
> diff --git a/src/pulsecore/resampler.h b/src/pulsecore/resampler.h
> index 742de6a..1d09ff4 100644
> --- a/src/pulsecore/resampler.h
> +++ b/src/pulsecore/resampler.h
> @@ -52,7 +52,8 @@ typedef enum pa_resample_flags {
>      PA_RESAMPLER_VARIABLE_RATE = 0x0001U,
>      PA_RESAMPLER_NO_REMAP      = 0x0002U,  /* implies NO_REMIX */
>      PA_RESAMPLER_NO_REMIX      = 0x0004U,
> -    PA_RESAMPLER_NO_LFE        = 0x0008U
> +    PA_RESAMPLER_NO_LFE        = 0x0008U,
> +    PA_RESAMPLER_MONO_ONLY     = 0x0010U
>  } pa_resample_flags_t;
>
>  pa_resampler* pa_resampler_new(
> diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c
> index 6131bd3..bef09c9 100644
> --- a/src/pulsecore/sink-input.c
> +++ b/src/pulsecore/sink-input.c
> @@ -450,7 +450,8 @@ int pa_sink_input_new(
>                            data->resample_method,
>                            ((data->flags & PA_SINK_INPUT_VARIABLE_RATE) ? PA_RESAMPLER_VARIABLE_RATE : 0) |
>                            ((data->flags & PA_SINK_INPUT_NO_REMAP) ? PA_RESAMPLER_NO_REMAP : 0) |
> -                          (core->disable_remixing || (data->flags & PA_SINK_INPUT_NO_REMIX) ? PA_RESAMPLER_NO_REMIX : 0) |
> +                          ((core->remixing_option & PA_DISABLE_REMIXING) || (data->flags & PA_SINK_INPUT_NO_REMIX) ? PA_RESAMPLER_NO_REMIX : 0) |
> +                          ((core->remixing_option & PA_MONO_ONLY)?PA_RESAMPLER_MONO_ONLY:0)|
>                            (core->disable_lfe_remixing ? PA_RESAMPLER_NO_LFE : 0)))) {
>                  pa_log_warn("Unsupported resampling operation.");
>                  return -PA_ERR_NOTSUPPORTED;
> @@ -2193,9 +2194,10 @@ int pa_sink_input_update_rate(pa_sink_input *i) {
>                                       &i->sample_spec, &i->channel_map,
>                                       &i->sink->sample_spec, &i->sink->channel_map,
>                                       i->requested_resample_method,
> -                                     ((i->flags & PA_SINK_INPUT_VARIABLE_RATE) ? PA_RESAMPLER_VARIABLE_RATE : 0) |
> +                                     ((i->flags & PA_SINK_INPUT_VARIABLE_RATE)? PA_RESAMPLER_VARIABLE_RATE : 0) |
>                                       ((i->flags & PA_SINK_INPUT_NO_REMAP) ? PA_RESAMPLER_NO_REMAP : 0) |
> -                                     (i->core->disable_remixing || (i->flags & PA_SINK_INPUT_NO_REMIX) ? PA_RESAMPLER_NO_REMIX : 0));
> +                                     ((i->core->remixing_option & PA_DISABLE_REMIXING) || (i->flags & PA_SINK_INPUT_NO_REMIX) ? PA_RESAMPLER_NO_REMIX : 0)|
> +                                     (((i->core->remixing_option & PA_MONO_ONLY))? PA_RESAMPLER_MONO_ONLY :0));
>
>          if (!new_resampler) {
>              pa_log_warn("Unsupported resampling operation.");
> diff --git a/src/pulsecore/source-output.c b/src/pulsecore/source-output.c
> index d942419..4b01d49 100644
> --- a/src/pulsecore/source-output.c
> +++ b/src/pulsecore/source-output.c
> @@ -392,7 +392,8 @@ int pa_source_output_new(
>                          data->resample_method,
>                          ((data->flags & PA_SOURCE_OUTPUT_VARIABLE_RATE) ? PA_RESAMPLER_VARIABLE_RATE : 0) |
>                          ((data->flags & PA_SOURCE_OUTPUT_NO_REMAP) ? PA_RESAMPLER_NO_REMAP : 0) |
> -                        (core->disable_remixing || (data->flags & PA_SOURCE_OUTPUT_NO_REMIX) ? PA_RESAMPLER_NO_REMIX : 0) |
> +                        ((core->remixing_option & PA_DISABLE_REMIXING) || (data->flags & PA_SOURCE_OUTPUT_NO_REMIX) ? PA_RESAMPLER_NO_REMIX : 0) |
> +                        ((core->remixing_option & PA_MONO_ONLY)?PA_RESAMPLER_MONO_ONLY:0)|
>                          (core->disable_lfe_remixing ? PA_RESAMPLER_NO_LFE : 0)))) {
>                  pa_log_warn("Unsupported resampling operation.");
>                  return -PA_ERR_NOTSUPPORTED;
> @@ -1644,9 +1645,10 @@ int pa_source_output_update_rate(pa_source_output *o) {
>                                       &o->source->sample_spec, &o->source->channel_map,
>                                       &o->sample_spec, &o->channel_map,
>                                       o->requested_resample_method,
> -                                     ((o->flags & PA_SOURCE_OUTPUT_VARIABLE_RATE) ? PA_RESAMPLER_VARIABLE_RATE : 0) |
> +                                     ((o->flags & PA_SOURCE_OUTPUT_VARIABLE_RATE)? PA_RESAMPLER_VARIABLE_RATE : 0) |
>                                       ((o->flags & PA_SOURCE_OUTPUT_NO_REMAP) ? PA_RESAMPLER_NO_REMAP : 0) |
> -                                     (o->core->disable_remixing || (o->flags & PA_SOURCE_OUTPUT_NO_REMIX) ? PA_RESAMPLER_NO_REMIX : 0));
> +                                     ((o->core->remixing_option & PA_DISABLE_REMIXING) || (o->flags & PA_SOURCE_OUTPUT_NO_REMIX) ? PA_RESAMPLER_NO_REMIX : 0)|
> +                                     ((o->core->remixing_option & PA_MONO_ONLY)?PA_RESAMPLER_MONO_ONLY:0));
>
>          if (!new_resampler) {
>              pa_log_warn("Unsupported resampling operation.");
> --
> 1.7.9.5
>


More information about the pulseaudio-discuss mailing list