[pulseaudio-discuss] [PATCH] pavucontrol: add support for AAC pass-through

Tanu Kaskinen tanuk at iki.fi
Fri Feb 22 05:37:35 PST 2013


On Tue, 2013-02-19 at 20:38 +0900, atsukada at users.sourceforge.net wrote:
> From: Akihiro Tsukada <atsukada at users.sourceforge.net>
> 
> ---
>  src/pavucontrol.glade | 19 ++++++++++++++++---
>  src/pavucontrol.h     |  1 +
>  src/sinkwidget.cc     | 10 ++++++++++
>  src/sinkwidget.h      |  2 +-
>  4 files changed, 28 insertions(+), 4 deletions(-)
> 
> diff --git a/src/pavucontrol.glade b/src/pavucontrol.glade
> index 6defb3d..4b3dd01 100644
> --- a/src/pavucontrol.glade
> +++ b/src/pavucontrol.glade
> @@ -427,9 +427,6 @@
>                              <property name="n_rows">2</property>
>                              <property name="n_columns">3</property>
>                              <child>
> -                              <placeholder/>
> -                            </child>
> -                            <child>
>                                <object class="GtkCheckButton" id="encodingFormatPCM">
>                                  <property name="label" translatable="yes">PCM</property>
>                                  <property name="use_action_appearance">False</property>
> @@ -499,6 +496,22 @@
>                                  <property name="bottom_attach">2</property>
>                                </packing>
>                              </child>
> +                            <child>
> +                              <object class="GtkCheckButton" id="encodingFormatAAC">
> +                                <property name="label" translatable="yes">AAC</property>
> +                                <property name="use_action_appearance">False</property>
> +                                <property name="visible">True</property>
> +                                <property name="can_focus">True</property>
> +                                <property name="receives_default">False</property>
> +                                <property name="draw_indicator">True</property>
> +                              </object>
> +                              <packing>
> +                                <property name="left_attach">2</property>
> +                                <property name="right_attach">3</property>
> +                                <property name="top_attach">1</property>
> +                                <property name="bottom_attach">2</property>
> +                              </packing>
> +                            </child>
>                            </object>
>                            <packing>
>                              <property name="expand">False</property>
> diff --git a/src/pavucontrol.h b/src/pavucontrol.h
> index 65cb913..affaa89 100644
> --- a/src/pavucontrol.h
> +++ b/src/pavucontrol.h
> @@ -41,6 +41,7 @@
>  
>  #define HAVE_SOURCE_OUTPUT_VOLUMES PA_CHECK_VERSION(0,99,0)
>  #define HAVE_EXT_DEVICE_RESTORE_API PA_CHECK_VERSION(0,99,0)
> +#define HAVE_MPEG2_AAC_PASSTHROUGH PA_CHECK_VERSION(3,99,0)

This is not necessary. You can just check whether
PA_ENCODING_MPEG2_AAC_IEC61937 is defined. Or actually you can't,
because format.h doesn't define that, but I'll fix that. Fixed:
http://cgit.freedesktop.org/pulseaudio/pulseaudio/commit/?id=773ca81dea1a18f93793ebfab4242d9a9ff73585

>  
>  enum SinkInputType {
>      SINK_INPUT_ALL,
> diff --git a/src/sinkwidget.cc b/src/sinkwidget.cc
> index 1726550..35b0aa7 100644
> --- a/src/sinkwidget.cc
> +++ b/src/sinkwidget.cc
> @@ -62,6 +62,16 @@ SinkWidget::SinkWidget(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>
>      encodings[i].encoding = PA_ENCODING_DTS_IEC61937;
>      x->get_widget("encodingFormatDTS", encodings[i].widget);
>      encodings[i].widget->signal_toggled().connect(sigc::mem_fun(*this, &SinkWidget::onEncodingsChange));
> +
> +    ++i;
> +    x->get_widget("encodingFormatAAC", encodings[i].widget);
> +#if HAVE_MPEG2_AAC_PASSTHROUGH
> +    encodings[i].encoding = PA_ENCODING_MPEG2_AAC_IEC61937;
> +    encodings[i].widget->signal_toggled().connect(sigc::mem_fun(*this, &SinkWidget::onEncodingsChange));
> +#else
> +    encodings[i].encoding = PA_ENCODING_INVALID;
> +    encodings[i].widget->set_sensitive(false);
> +#endif

I'm afraid this is not good enough. One question is what happens if
pavucontrol is compiled on a system with 4.0 headers, and run on a
system with 3.0 libpulse? In that case you pass libpulse an encoding
that it doesn't recognize. Well, it happens that libpulse doesn't
validate the encoding values before sending them to the server, so
there's no breakage. But it's still ugly to rely on the libpulse
implementation details. I'd remove the check altogether and just depend
on libpulse 4.0.

Another question is what does the server do if it doesn't support the
encoding? The answer is that saving the formats fails altogether, so the
check is clearly not good enough. You need to check whether the server
supports PA_ENCODING_MPEG2_AAC_IEC61937. How to do that? The check
should be based on the protocol version that the server support. That
can be queried with pa_context_get_server_protocol_version(). But
there's a problem: the protocol version was not incremented when the new
enumeration value was added.

Adding the new encoding wasn't as simple as it seemed... Incrementing
the protocol version is easy enough, but we also need to look at every
case where encodings are passed between a client and a server, and
decide the best way to handle situations where the receiving end doesn't
support the encoding that the sender would like to send. I'll start
working on this.

-- 
Tanu



More information about the pulseaudio-discuss mailing list