[pulseaudio-discuss] [PATCH pavucontrol] mainwindow: Show the availability of the ports and profiles.

Raymond Yau superquad.vortex2 at gmail.com
Thu Nov 8 19:03:14 PST 2012


>
> If we know if a certain port is available/unavailable, we can print
> that out, as a help to the user (and as debugging for ourselves).

but the port has three state: yes, no and unknown

> A profile is also available/unavailable if all ports which have that
> profile is available/unavailable.

for surround 5.1, does it meant that pulseaudio have to check the
availability of the green, black and orange

many professional sound card does not support jack detection since it
produce noise during the detection

spdif jack does not has any jack detection

>
> Credit goes to David Henningson for the original idea and some of the
code.
> ---
>  src/cardwidget.h  |  1 +
>  src/mainwindow.cc | 66
+++++++++++++++++++++++++++++++++++++++++++------------
>  2 files changed, 53 insertions(+), 14 deletions(-)
>
> diff --git a/src/cardwidget.h b/src/cardwidget.h
> index 7c63681..821aae5 100644
> --- a/src/cardwidget.h
> +++ b/src/cardwidget.h
> @@ -31,6 +31,7 @@ public:
>        int available;
>        int direction;
>        int64_t latency_offset;
> +      std::vector<Glib::ustring> profiles;
>  };
>
>  class CardWidget : public Gtk::VBox {
> diff --git a/src/mainwindow.cc b/src/mainwindow.cc
> index 1041eab..524d1a7 100644
> --- a/src/mainwindow.cc
> +++ b/src/mainwindow.cc
> @@ -255,6 +255,22 @@ static void set_icon_name_fallback(Gtk::Image *i,
const char *name, Gtk::IconSiz
>  static void updatePorts(DeviceWidget *w, std::map<Glib::ustring,
PortInfo> &ports) {
>      std::map<Glib::ustring, PortInfo>::iterator it;
>
> +    w->ports.clear();
> +    for (it = ports.begin(); it != ports.end(); it++) {
> +        PortInfo p = (*it).second;
> +        Glib::ustring desc = p.description;
> +
> +        if (p.available == PA_PORT_AVAILABLE_YES)
> +            desc += " (plugged in)";
> +        else if (p.available == PA_PORT_AVAILABLE_NO)
> +            desc += " (unplugged)";
> +
> +        if ((typeid(*w) == typeid(SinkWidget)) && (p.direction ==
PA_DIRECTION_OUTPUT))
> +            w->ports.push_back(std::pair<Glib::ustring,Glib::ustring>(
p.name, desc));
> +        else if ((typeid(*w) == typeid(SourceWidget)) && (p.direction ==
PA_DIRECTION_INPUT))
> +            w->ports.push_back(std::pair<Glib::ustring,Glib::ustring>(
p.name, desc));
> +    }
> +
>      it = ports.find(w->activePort);
>
>      if (it != ports.end()) {
> @@ -295,12 +311,6 @@ void MainWindow::updateCard(const pa_card_info
&info) {
>          profile_priorities.insert(info.profiles[i]);
>      }
>
> -    w->profiles.clear();
> -    for (std::set<pa_card_profile_info>::iterator i =
profile_priorities.begin(); i != profile_priorities.end(); ++i)
> -
 w->profiles.push_back(std::pair<Glib::ustring,Glib::ustring>(i->name,
i->description));
> -
> -    w->activeProfile = info.active_profile ? info.active_profile->name :
"";
> -
>      w->ports.clear();
>      for (uint32_t i = 0; i < info.n_ports; ++i) {
>          PortInfo p;
> @@ -311,10 +321,46 @@ void MainWindow::updateCard(const pa_card_info
&info) {
>          p.available = info.ports[i]->available;
>          p.direction = info.ports[i]->direction;
>          p.latency_offset = info.ports[i]->latency_offset;
> +        for (uint32_t j = 0; j < info.ports[i]->n_profiles; j++)
> +            p.profiles.push_back(info.ports[i]->profiles[j]->name);
>
>          w->ports[p.name] = p;
>      }
>
> +    w->profiles.clear();
> +    for (std::set<pa_card_profile_info>::iterator profileIt =
profile_priorities.begin(); profileIt != profile_priorities.end();
++profileIt) {
> +        bool hasYes = false, hasNo = false, hasOther = false;
> +        std::map<Glib::ustring, PortInfo>::iterator portIt;
> +        Glib::ustring desc = profileIt->description;
> +
> +        for (portIt = w->ports.begin(); portIt != w->ports.end();
portIt++) {
> +            PortInfo port = (*portIt).second;
> +
> +            if (std::find(port.profiles.begin(), port.profiles.end(),
profileIt->name) == port.profiles.end())
> +                continue;
> +
> +            switch (port.available) {
> +                case PA_PORT_AVAILABLE_YES:
> +                    hasYes = true;
> +                    break;
> +                case PA_PORT_AVAILABLE_NO:
> +                    hasNo = true;
> +                    break;
> +                default:
> +                    hasOther = true;
> +                    break;
> +            }
> +        }
> +        if (hasNo && !hasYes && !hasOther)
> +            desc += " (unplugged)";
> +        else if (hasYes && !hasNo && !hasOther)
> +            desc += " (plugged in)";
> +
> +
 w->profiles.push_back(std::pair<Glib::ustring,Glib::ustring>(profileIt->name,
desc));
> +    }
> +
> +    w->activeProfile = info.active_profile ? info.active_profile->name :
"";
> +
>      /* Because the port info for sinks and sources is discontinued we
need
>       * to update the port info for them here. */
>
> @@ -399,10 +445,6 @@ bool MainWindow::updateSink(const pa_sink_info
&info) {
>          port_priorities.insert(*info.ports[i]);
>      }
>
> -    w->ports.clear();
> -    for (std::set<pa_sink_port_info>::iterator i =
port_priorities.begin(); i != port_priorities.end(); ++i)
> -
 w->ports.push_back(std::pair<Glib::ustring,Glib::ustring>(i->name,
i->description));
> -
>      w->activePort = info.active_port ? info.active_port->name : "";
>
>      cw = cardWidgets.find(info.card);
> @@ -554,10 +596,6 @@ void MainWindow::updateSource(const pa_source_info
&info) {
>          port_priorities.insert(*info.ports[i]);
>      }
>
> -    w->ports.clear();
> -    for (std::set<pa_source_port_info>::iterator i =
port_priorities.begin(); i != port_priorities.end(); ++i)
> -
 w->ports.push_back(std::pair<Glib::ustring,Glib::ustring>(i->name,
i->description));
> -
>      w->activePort = info.active_port ? info.active_port->name : "";
>
>      cw = cardWidgets.find(info.card);
> --
> 1.8.0
>
> _______________________________________________
> pulseaudio-discuss mailing list
> pulseaudio-discuss at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/pulseaudio-discuss/attachments/20121109/2b7a747f/attachment-0001.html>


More information about the pulseaudio-discuss mailing list