[pulseaudio-discuss] [PATCH] pacat: paplay stream format extention

Tanu Kaskinen tanuk at iki.fi
Wed Jan 2 06:33:55 PST 2013


On Fri, 2012-05-11 at 14:43 +0800, Wang Xingchao wrote:
> paplay with "--passthrough" only indicate the stream with PASSTHROUGH flag,
> but there's no exact format infomation. the patch makes stream easy to notify
> pacore its type in passthrough mode.
> 
> Signed-off-by: Wang Xingchao <xingchao.wang at intel.com>
> ---
>  src/map-file       |    2 ++
>  src/pulse/stream.c |    2 +-
>  src/pulse/stream.h |    9 +++++++++
>  src/utils/pacat.c  |   35 ++++++++++++++++++++++++++++++-----
>  4 files changed, 42 insertions(+), 6 deletions(-)

Thanks for the patch, and sorry for the ridiculously long delay with
review... Comments below.

> 
> diff --git a/src/map-file b/src/map-file
> index 69cf25b..867a8c5 100644
> --- a/src/map-file
> +++ b/src/map-file
> @@ -295,6 +295,8 @@ pa_stream_is_suspended;
>  pa_stream_new;
>  pa_stream_new_extended;
>  pa_stream_new_with_proplist;
> +pa_stream_new_with_proplist_internal;

Isn't it rather obvious that a function with name
"pa_stream_new_with_proplist_internal" doesn't belong in the public API?

> +pa_encoding_from_string;

The entries in map-file should be in alphabetical order. Also, I think
it would be better to have this change in a separate patch.

>  pa_stream_peek;
>  pa_stream_prebuf;
>  pa_stream_proplist_remove;
> diff --git a/src/pulse/stream.c b/src/pulse/stream.c
> index 39338c1..77e5ec4 100644
> --- a/src/pulse/stream.c
> +++ b/src/pulse/stream.c
> @@ -80,7 +80,7 @@ static void reset_callbacks(pa_stream *s) {
>      s->buffer_attr_userdata = NULL;
>  }
>  
> -static pa_stream *pa_stream_new_with_proplist_internal(
> +pa_stream *pa_stream_new_with_proplist_internal(
>          pa_context *c,
>          const char *name,
>          const pa_sample_spec *ss,
> diff --git a/src/pulse/stream.h b/src/pulse/stream.h
> index b4464fa..ba7b1ff 100644
> --- a/src/pulse/stream.h
> +++ b/src/pulse/stream.h
> @@ -357,6 +357,15 @@ pa_stream* pa_stream_new_with_proplist(
>          const pa_channel_map *map         /**< The desired channel map, or NULL for default */,
>          pa_proplist *p                    /**< The initial property list */);
>  
> +pa_stream *pa_stream_new_with_proplist_internal(
> +        pa_context *c,
> +        const char *name,
> +        const pa_sample_spec *ss,
> +        const pa_channel_map *map,
> +        pa_format_info * const *formats,
> +        unsigned int n_formats,
> +        pa_proplist *p);
> +
>  /** Create a new, unconnected stream with the specified name, the set of formats
>   * this client can provide, and an initial list of properties. While
>   * connecting, the server will select the most appropriate format which the
> diff --git a/src/utils/pacat.c b/src/utils/pacat.c
> index ec360f7..bd984af 100644
> --- a/src/utils/pacat.c
> +++ b/src/utils/pacat.c
> @@ -39,6 +39,8 @@
>  
>  #include <pulse/pulseaudio.h>
>  #include <pulse/rtclock.h>
> +#include <pulse/format.h>
> +#include <pulse/stream.h>
>  
>  #include <pulsecore/core-util.h>
>  #include <pulsecore/i18n.h>
> @@ -76,6 +78,8 @@ static pa_sample_spec sample_spec = {
>      .channels = 2
>  };
>  static pa_bool_t sample_spec_set = FALSE;
> +static pa_bool_t passthrough_set = FALSE;
> +static pa_encoding_t passthrough_format;
>  
>  static pa_channel_map channel_map;
>  static pa_bool_t channel_map_set = FALSE;
> @@ -443,17 +447,30 @@ static void context_state_callback(pa_context *c, void *userdata) {
>  
>          case PA_CONTEXT_READY: {
>              pa_buffer_attr buffer_attr;
> +            pa_format_info *formats[1];

No need to use an array if it contains only one element.

>  
> -            pa_assert(c);
> +	    if (passthrough_set == TRUE) {

No tabs, please. This is not the only place where you use tabs for
indentation; please remove all tabs.

> +                formats[0] = pa_format_info_new();
> +                formats[0]->encoding = passthrough_format;
> +	    }
> +
> +	    pa_assert(c);
>              pa_assert(!stream);
>  
>              if (verbose)
>                  pa_log(_("Connection established.%s"), CLEAR_LINE);
>  
> -            if (!(stream = pa_stream_new_with_proplist(c, NULL, &sample_spec, &channel_map, proplist))) {
> +	    if (passthrough_set == TRUE) {
> +		    if (!(stream = pa_stream_new_with_proplist_internal(c, NULL, NULL, NULL, formats, 1, proplist))) {

Instead of pa_stream_new_with_proplist_internal(), you want to use
pa_stream_new_extended().

> +	                pa_log(_("pa_stream_new_new_with_proplist_internal() failed: %s"), pa_strerror(pa_context_errno(c)));
> +		        goto fail;
> +		    }
> +	    }else {

Space missing before "else".

> +		    if (!(stream = pa_stream_new_with_proplist(c, NULL, &sample_spec, &channel_map, proplist))) {
>                  pa_log(_("pa_stream_new() failed: %s"), pa_strerror(pa_context_errno(c)));
>                  goto fail;
> -            }
> +		    }
> +	    }
>  
>              pa_stream_set_state_callback(stream, stream_state_callback, NULL);
>              pa_stream_set_write_callback(stream, stream_write_callback, NULL);
> @@ -682,7 +699,7 @@ static void help(const char *argv0) {
>               "      --process-time-msec=MSEC          Request the specified process time per request in msec.\n"
>               "      --property=PROPERTY=VALUE         Set the specified property to the specified value.\n"
>               "      --raw                             Record/play raw PCM data.\n"
> -             "      --passthrough                     passthrough data \n"
> +             "      --passthrough[=DATAFORMAT]        passthrough data \n"

The man page needs to be updated too.

Also, I'm not sure it's a good idea to give the encoding as a parameter
to --passthrough. I think it's somewhat possible that some day we want
to be able to specify the encoding even when not using the passthrough
mode. Therefore, I'd add a new option: --encoding=ENCODING.

-- 
Tanu



More information about the pulseaudio-discuss mailing list