summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--configure.ac2
-rw-r--r--src/Makefile.am2
-rw-r--r--src/paprefs.cc228
-rw-r--r--src/paprefs.glade595
4 files changed, 604 insertions, 223 deletions
diff --git a/configure.ac b/configure.ac
index 75ab084..3590807 100644
--- a/configure.ac
+++ b/configure.ac
@@ -38,7 +38,7 @@ AC_PROG_LN_S
AC_TYPE_SIGNAL
AC_HEADER_STDC
-PKG_CHECK_MODULES(GUILIBS, [ gtkmm-2.4 libglademm-2.4 sigc++-2.0 gconfmm-2.6])
+PKG_CHECK_MODULES(GUILIBS, [ gtkmm-2.4 libglademm-2.4 sigc++-2.0 gconfmm-2.6 dbus-glib-1])
AC_SUBST(GUILIBS_CFLAGS)
AC_SUBST(GUILIBS_LIBS)
diff --git a/src/Makefile.am b/src/Makefile.am
index a0f206e..1bd3826 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -31,7 +31,7 @@ paprefs_SOURCES=paprefs.cc
paprefs_LDADD=$(AM_LDADD) $(GUILIBS_LIBS)
paprefs_CXXFLAGS=$(AM_CXXFLAGS) $(GUILIBS_CFLAGS)
-paprefs_CXXFLAGS+=-DGLADE_FILE=\"$(gladedir)/paprefs.glade\" -DLOCALEDIR=\"$(localedir)\" -DMODULESDIR=\""$(LIBPULSE_MODLIBEXECDIR)"\" -DSHREXT=\"$(SHREXT)\"
+paprefs_CXXFLAGS+=-DGLADE_FILE=\"$(gladedir)/paprefs.glade\" -DLOCALEDIR=\"$(localedir)\" -DMODULESDIR=\""$(LIBPULSE_MODLIBEXECDIR)/"\" -DSHREXT=\"$(SHREXT)\"
EXTRA_DIST = $(glade_DATA) $(desktop_in_files)
diff --git a/src/paprefs.cc b/src/paprefs.cc
index 6a067d8..0e4cf83 100644
--- a/src/paprefs.cc
+++ b/src/paprefs.cc
@@ -27,6 +27,8 @@
#include <libglademm.h>
#include <gconfmm.h>
#include <libintl.h>
+#include <dbus/dbus-glib.h>
+#include <gdk/gdkx.h>
#define PA_GCONF_ROOT "/system/pulseaudio"
#define PA_GCONF_PATH_MODULES PA_GCONF_ROOT"/modules"
@@ -36,8 +38,15 @@ public:
MainWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& x);
static MainWindow* create();
- Gtk::EventBox *titleEventBox;
- Gtk::Button *closeButton;
+ Gtk::Button
+ *closeButton,
+ *zeroconfDiscoverInstallButton,
+ *zeroconfRaopDiscoverInstallButton,
+ *remoteInstallButton,
+ *zeroconfPublishInstallButton,
+ *upnpInstallButton,
+ *rtpRecvInstallButton,
+ *rtpSendInstallButton;
Gtk::CheckButton
*remoteAccessCheckButton,
@@ -48,7 +57,9 @@ public:
*rtpReceiveCheckButton,
*rtpSendCheckButton,
*rtpLoopbackCheckButton,
- *combineCheckButton;
+ *combineCheckButton,
+ *upnpMediaServerCheckButton,
+ *upnpNullSinkCheckButton;
Gtk::RadioButton
*rtpMikeRadioButton,
@@ -60,31 +71,62 @@ public:
bool ignoreChanges;
void onCloseButtonClicked();
+
void updateSensitive();
+
void onChangeRemoteAccess();
void onChangeZeroconfDiscover();
void onChangeZeroconfRaopDiscover();
void onChangeRtpReceive();
void onChangeRtpSend();
void onChangeCombine();
+ void onChangeUpnp();
+
+ void onZeroconfDiscoverInstallButtonClicked();
+ void onZeroconfRaopDiscoverInstallButtonClicked();
+ void onRemoteInstallButtonClicked();
+ void onZeroconfPublishInstallButtonClicked();
+ void upnpInstallButtonClicked();
+ void rtpRecvInstallButtonClicked();
+ void rtpSendInstallButtonClicked();
+
void readFromGConf();
+
void checkForModules();
+
void writeToGConfRemoteAccess();
void writeToGConfZeroconfDiscover();
void writeToGConfZeroconfRaopDiscover();
void writeToGConfRtpReceive();
void writeToGConfRtpSend();
void writeToGConfCombine();
+ void writeToGConfUPnP();
+
void onGConfChange(const Glib::ustring& key, const Gnome::Conf::Value& value);
- bool rtpRecvAvailable, rtpSendAvailable, zeroconfPublishAvailable, zeroconfDiscoverAvailable, zeroconfRaopDiscoverAvailable, remoteAvailable;
+ void installFiles(const char *a, const char *b);
+
+ bool
+ rtpRecvAvailable,
+ rtpSendAvailable,
+ zeroconfPublishAvailable,
+ zeroconfDiscoverAvailable,
+ zeroconfRaopDiscoverAvailable,
+ remoteAvailable,
+ upnpAvailable;
};
MainWindow::MainWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& x) :
Gtk::Window(cobject), ignoreChanges(true) {
- x->get_widget("titleEventBox", titleEventBox);
x->get_widget("closeButton", closeButton);
+ x->get_widget("zeroconfDiscoverInstallButton", zeroconfDiscoverInstallButton);
+ x->get_widget("zeroconfRaopDiscoverInstallButton", zeroconfRaopDiscoverInstallButton);
+ x->get_widget("remoteInstallButton", remoteInstallButton);
+ x->get_widget("zeroconfPublishInstallButton", zeroconfPublishInstallButton);
+ x->get_widget("upnpInstallButton", upnpInstallButton);
+ x->get_widget("rtpRecvInstallButton", rtpRecvInstallButton);
+ x->get_widget("rtpSendInstallButton", rtpSendInstallButton);
x->get_widget("remoteAccessCheckButton", remoteAccessCheckButton);
x->get_widget("zeroconfDiscoverCheckButton", zeroconfDiscoverCheckButton);
@@ -95,14 +137,13 @@ MainWindow::MainWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade:
x->get_widget("rtpSendCheckButton", rtpSendCheckButton);
x->get_widget("rtpLoopbackCheckButton", rtpLoopbackCheckButton);
x->get_widget("combineCheckButton", combineCheckButton);
+ x->get_widget("upnpMediaServerCheckButton", upnpMediaServerCheckButton);
+ x->get_widget("upnpNullSinkCheckButton", upnpNullSinkCheckButton);
x->get_widget("rtpMikeRadioButton", rtpMikeRadioButton);
x->get_widget("rtpSpeakerRadioButton", rtpSpeakerRadioButton);
x->get_widget("rtpNullSinkRadioButton", rtpNullSinkRadioButton);
- Gdk::Color c("white");
- titleEventBox->modify_bg(Gtk::STATE_NORMAL, c);
-
checkForModules();
gconf = Gnome::Conf::Client::get_default_client();
@@ -130,6 +171,17 @@ MainWindow::MainWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade:
rtpNullSinkRadioButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::onChangeRtpSend));
combineCheckButton->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::onChangeCombine));
+
+ upnpMediaServerCheckButton->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::onChangeUpnp));
+ upnpNullSinkCheckButton->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::onChangeUpnp));
+
+ zeroconfDiscoverInstallButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::onZeroconfDiscoverInstallButtonClicked));
+ zeroconfRaopDiscoverInstallButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::onZeroconfRaopDiscoverInstallButtonClicked));
+ remoteInstallButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::onRemoteInstallButtonClicked));
+ zeroconfPublishInstallButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::onZeroconfPublishInstallButtonClicked));
+ upnpInstallButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::upnpInstallButtonClicked));
+ rtpRecvInstallButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::rtpRecvInstallButtonClicked));
+ rtpSendInstallButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::rtpSendInstallButtonClicked));
}
MainWindow* MainWindow::create() {
@@ -161,6 +213,44 @@ void MainWindow::updateSensitive() {
rtpMikeRadioButton->set_sensitive(b && rtpSendAvailable);
rtpSpeakerRadioButton->set_sensitive(b && rtpSendAvailable);
rtpNullSinkRadioButton->set_sensitive(b && rtpSendAvailable);
+
+ upnpMediaServerCheckButton->set_sensitive(upnpAvailable);
+ upnpNullSinkCheckButton->set_sensitive(upnpAvailable && upnpMediaServerCheckButton->get_active());
+
+ if (zeroconfDiscoverAvailable)
+ zeroconfDiscoverInstallButton->hide();
+ else
+ zeroconfDiscoverInstallButton->show();
+
+ if (zeroconfRaopDiscoverAvailable)
+ zeroconfRaopDiscoverInstallButton->hide();
+ else
+ zeroconfRaopDiscoverInstallButton->show();
+
+ if (remoteAvailable)
+ remoteInstallButton->hide();
+ else
+ remoteInstallButton->show();
+
+ if (zeroconfPublishAvailable)
+ zeroconfPublishInstallButton->hide();
+ else
+ zeroconfPublishInstallButton->show();
+
+ if (upnpAvailable)
+ upnpInstallButton->hide();
+ else
+ upnpInstallButton->show();
+
+ if (rtpRecvAvailable)
+ rtpRecvInstallButton->hide();
+ else
+ rtpRecvInstallButton->show();
+
+ if (rtpSendAvailable)
+ rtpSendInstallButton->hide();
+ else
+ rtpSendInstallButton->show();
}
void MainWindow::onChangeRemoteAccess() {
@@ -208,14 +298,83 @@ void MainWindow::onChangeRtpSend() {
}
void MainWindow::onChangeCombine() {
- Gnome::Conf::ChangeSet changeSet;
-
if (ignoreChanges)
return;
writeToGConfCombine();
}
+void MainWindow::onChangeUpnp() {
+
+ if (ignoreChanges)
+ return;
+
+ updateSensitive();
+ writeToGConfUPnP();
+}
+
+void MainWindow::installFiles(const char *a, const char *b = NULL) {
+ DBusGConnection *connection;
+ DBusGProxy *proxy;
+ gboolean ret;
+ GError *error = NULL;
+ const gchar *packages[] = {a, b, NULL};
+
+ connection = dbus_g_bus_get(DBUS_BUS_SESSION, NULL);
+
+ proxy = dbus_g_proxy_new_for_name(connection,
+ "org.freedesktop.PackageKit",
+ "/org/freedesktop/PackageKit",
+ "org.freedesktop.PackageKit.Modify");
+
+ ret = dbus_g_proxy_call(
+ proxy, "InstallProvideFiles", &error,
+ G_TYPE_UINT, GDK_WINDOW_XID(get_window()->gobj()),
+ G_TYPE_STRV, packages,
+ G_TYPE_STRING, "show-confirm-search,hide-finished",
+ G_TYPE_INVALID, G_TYPE_INVALID);
+
+ if (!ret) {
+ g_warning("Installation failed: %s", error->message);
+ g_error_free(error);
+ }
+
+ g_object_unref(proxy);
+ dbus_g_connection_unref(connection);
+
+ checkForModules();
+ updateSensitive();
+}
+
+void MainWindow::onZeroconfDiscoverInstallButtonClicked() {
+ installFiles(MODULESDIR "module-zeroconf-discover" SHREXT);
+}
+
+void MainWindow::onZeroconfRaopDiscoverInstallButtonClicked() {
+ installFiles(MODULESDIR "module-raop-discover" SHREXT);
+}
+
+void MainWindow::onRemoteInstallButtonClicked() {
+ installFiles(MODULESDIR "module-esound-protocol-tcp" SHREXT,
+ MODULESDIR "module-native-protocol-tcp" SHREXT);
+}
+
+void MainWindow::onZeroconfPublishInstallButtonClicked() {
+ installFiles(MODULESDIR "module-zeroconf-publish" SHREXT);
+}
+
+void MainWindow::upnpInstallButtonClicked() {
+ installFiles("/usr/bin/rygel", MODULESDIR "module-rygel-media-server" SHREXT);
+}
+
+void MainWindow::rtpRecvInstallButtonClicked() {
+ installFiles(MODULESDIR "module-rtp-recv" SHREXT);
+}
+
+void MainWindow::rtpSendInstallButtonClicked() {
+ installFiles(MODULESDIR "module-rtp-send" SHREXT);
+}
+
void MainWindow::writeToGConfCombine() {
Gnome::Conf::ChangeSet changeSet;
changeSet.set(PA_GCONF_PATH_MODULES"/combine/locked", true);
@@ -361,7 +520,11 @@ void MainWindow::writeToGConfRtpSend() {
if (rtpSendCheckButton->get_active()) {
if (!mikeEnabled && !speakerEnabled) {
changeSet.set(PA_GCONF_PATH_MODULES"/rtp-send/name0", Glib::ustring("module-null-sink"));
- changeSet.set(PA_GCONF_PATH_MODULES"/rtp-send/args0", Glib::ustring("sink_name=rtp format=s16be channels=2 rate=44100 description=\"RTP Multicast Sink\""));
+ changeSet.set(PA_GCONF_PATH_MODULES"/rtp-send/args0", Glib::ustring("sink_name=rtp "
+ "format=s16be "
+ "channels=2 "
+ "rate=44100 "
+ "sink_properties=\"device.description='RTP Multicast' device.bus='network' device.icon_name='network-server'\""));
changeSet.set(PA_GCONF_PATH_MODULES"/rtp-send/name1", Glib::ustring("module-rtp-send"));
changeSet.set(PA_GCONF_PATH_MODULES"/rtp-send/args1", Glib::ustring(loopbackEnabled ? "source=rtp.monitor loop=1" : "source=rtp.monitor loop=0"));
@@ -391,6 +554,42 @@ void MainWindow::writeToGConfRtpSend() {
gconf->suggest_sync();
}
+void MainWindow::writeToGConfUPnP() {
+ Gnome::Conf::ChangeSet changeSet;
+
+ changeSet.set(PA_GCONF_PATH_MODULES"/upnp-media-server/locked", true);
+ gconf->change_set_commit(changeSet, true);
+
+ if (upnpMediaServerCheckButton->get_active()) {
+ changeSet.set(PA_GCONF_PATH_MODULES"/upnp-media-server/name0", Glib::ustring("module-rygel-media-server"));
+ changeSet.set(PA_GCONF_PATH_MODULES"/upnp-media-server/args0", Glib::ustring(""));
+
+ if (upnpNullSinkCheckButton->get_active()) {
+ changeSet.set(PA_GCONF_PATH_MODULES"/upnp-media-server/name1", Glib::ustring("module-null-sink"));
+ changeSet.set(PA_GCONF_PATH_MODULES"/upnp-media-server/args1", Glib::ustring("sink_name=upnp "
+ "format=s16be "
+ "channels=2 "
+ "rate=44100 "
+ "sink_properties=\"device.description='DLNA/UPnP Streaming' device.bus='network' device.icon_name='network-server'\""));
+ changeSet.set(PA_GCONF_PATH_MODULES"/upnp-media-server/null-sink-enabled", true);
+ } else {
+ changeSet.unset(PA_GCONF_PATH_MODULES"/upnp-media-server/name1");
+ changeSet.unset(PA_GCONF_PATH_MODULES"/upnp-media-server/args1");
+ changeSet.set(PA_GCONF_PATH_MODULES"/upnp-media-server/null-sink-enabled", false);
+ }
+
+ changeSet.set(PA_GCONF_PATH_MODULES"/upnp-media-server/enabled", true);
+ } else
+ changeSet.set(PA_GCONF_PATH_MODULES"/upnp-media-server/enabled", false);
+
+ gconf->change_set_commit(changeSet, true);
+
+ changeSet.set(PA_GCONF_PATH_MODULES"/upnp-media-server/locked", false);
+ gconf->change_set_commit(changeSet, true);
+
+ gconf->suggest_sync();
+}
+
void MainWindow::onGConfChange(const Glib::ustring&, const Gnome::Conf::Value&) {
readFromGConf();
}
@@ -422,6 +621,9 @@ void MainWindow::readFromGConf() {
combineCheckButton->set_active(gconf->get_bool(PA_GCONF_PATH_MODULES"/combine/enabled"));
+ upnpMediaServerCheckButton->set_active(gconf->get_bool(PA_GCONF_PATH_MODULES"/upnp-media-server/enabled"));
+ upnpNullSinkCheckButton->set_active(gconf->get_bool(PA_GCONF_PATH_MODULES"/upnp-media-server/null-sink-enabled"));
+
ignoreChanges = FALSE;
updateSensitive();
@@ -440,6 +642,10 @@ void MainWindow::checkForModules() {
rtpRecvAvailable = access(MODULESDIR "module-rtp-recv" SHREXT, F_OK) == 0;
rtpSendAvailable = access(MODULESDIR "module-rtp-send" SHREXT, F_OK) == 0;
+
+ upnpAvailable =
+ access(MODULESDIR "module-rygel-media-server" SHREXT, F_OK) == 0 &&
+ g_find_program_in_path("rygel");
}
int main(int argc, char *argv[]) {
diff --git a/src/paprefs.glade b/src/paprefs.glade
index 33ab460..b2567de 100644
--- a/src/paprefs.glade
+++ b/src/paprefs.glade
@@ -7,21 +7,56 @@
<property name="resizable">False</property>
<property name="icon_name">preferences-desktop</property>
<child>
- <widget class="GtkVBox" id="vbox3">
+ <widget class="GtkVBox" id="vbox20">
<property name="visible">True</property>
+ <property name="border_width">12</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
<child>
- <widget class="GtkEventBox" id="titleEventBox">
+ <widget class="GtkNotebook" id="notebook1">
<property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
- <widget class="GtkHBox" id="hbox2">
+ <widget class="GtkVBox" id="vbox30">
<property name="visible">True</property>
<property name="border_width">12</property>
- <property name="spacing">12</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
<child>
- <widget class="GtkImage" id="image19">
+ <widget class="GtkHBox" id="hbox1">
<property name="visible">True</property>
- <property name="icon_name">preferences-desktop</property>
- <property name="icon-size">6</property>
+ <child>
+ <widget class="GtkCheckButton" id="zeroconfDiscoverCheckButton">
+ <property name="label" translatable="yes">Make discoverable _PulseAudio network sound devices available locally</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="zeroconfDiscoverInstallButton">
+ <property name="label" translatable="yes">Install...</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="relief">none</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
</widget>
<packing>
<property name="expand">False</property>
@@ -30,72 +65,84 @@
</packing>
</child>
<child>
- <widget class="GtkVBox" id="vbox22">
+ <widget class="GtkHBox" id="hbox2">
<property name="visible">True</property>
- <property name="spacing">6</property>
<child>
- <widget class="GtkLabel" id="titleLabel">
+ <widget class="GtkCheckButton" id="zeroconfRaopDiscoverCheckButton">
+ <property name="label" translatable="yes">Make discoverable Apple A_irTunes sound devices available locally</property>
<property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="yalign">1</property>
- <property name="label" translatable="yes">&lt;span size="18000" color="black"&gt;&lt;b&gt;PulseAudio Preferences&lt;/b&gt;&lt;/span&gt;</property>
- <property name="use_markup">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
</widget>
<packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
- <widget class="GtkLabel" id="label4825">
+ <widget class="GtkButton" id="zeroconfRaopDiscoverInstallButton">
+ <property name="label" translatable="yes">Install...</property>
<property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="yalign">0</property>
- <property name="label" translatable="yes">&lt;span color="black"&gt;View and modify the configuration of your local sound server&lt;/span&gt;</property>
- <property name="use_markup">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="relief">none</property>
</widget>
<packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
+ <child>
+ <widget class="GtkLabel" id="tm">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="label" translatable="yes">&lt;i&gt;Apple and AirTunes are trademarks of Apple Inc., registered in the U.S. and other countries.&lt;/i&gt;</property>
+ <property name="use_markup">True</property>
+ <property name="single_line_mode">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
</widget>
</child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <widget class="GtkHSeparator" id="hseparator1">
- <property name="visible">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <widget class="GtkVBox" id="vbox20">
- <property name="visible">True</property>
- <property name="border_width">12</property>
- <property name="spacing">12</property>
<child>
- <widget class="GtkNotebook" id="notebook1">
+ <widget class="GtkLabel" id="label1">
<property name="visible">True</property>
- <property name="can_focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="label" translatable="yes">Network _Access</property>
+ <property name="use_underline">True</property>
+ </widget>
+ <packing>
+ <property name="tab_fill">False</property>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkVBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="border_width">12</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
<child>
- <widget class="GtkVBox" id="vbox30">
+ <widget class="GtkHBox" id="hbox3">
<property name="visible">True</property>
- <property name="border_width">12</property>
- <property name="spacing">6</property>
<child>
<widget class="GtkCheckButton" id="remoteAccessCheckButton">
<property name="label" translatable="yes">Enable _network access to local sound devices</property>
@@ -112,13 +159,39 @@
</packing>
</child>
<child>
- <widget class="GtkAlignment" id="alignment8">
+ <widget class="GtkButton" id="remoteInstallButton">
+ <property name="label" translatable="yes">Install...</property>
<property name="visible">True</property>
- <property name="left_padding">12</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="relief">none</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkAlignment" id="alignment8">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <widget class="GtkVBox" id="vbox34">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
<child>
- <widget class="GtkVBox" id="vbox34">
+ <widget class="GtkHBox" id="hbox4">
<property name="visible">True</property>
- <property name="spacing">6</property>
<child>
<widget class="GtkCheckButton" id="zeroconfBrowseCheckButton">
<property name="label" translatable="yes">Allow other machines on the LAN to _discover local sound devices</property>
@@ -135,32 +208,55 @@
</packing>
</child>
<child>
- <widget class="GtkCheckButton" id="anonymousAuthCheckButton">
- <property name="label" translatable="yes">Don't require _authentication</property>
+ <widget class="GtkButton" id="zeroconfPublishInstallButton">
+ <property name="label" translatable="yes">Install...</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="use_underline">True</property>
- <property name="draw_indicator">True</property>
+ <property name="receives_default">True</property>
+ <property name="relief">none</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
+ <property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</widget>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkCheckButton" id="anonymousAuthCheckButton">
+ <property name="label" translatable="yes">Don't _require authentication</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
</child>
</widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
</child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox5">
+ <property name="visible">True</property>
<child>
- <widget class="GtkCheckButton" id="zeroconfDiscoverCheckButton">
- <property name="label" translatable="yes">_Make discoverable network sound devices available locally</property>
+ <widget class="GtkCheckButton" id="upnpMediaServerCheckButton">
+ <property name="label" translatable="yes">Make local sound devices available as DLNA/_UPnP Media Server</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
@@ -171,59 +267,94 @@
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
- <property name="position">2</property>
+ <property name="position">0</property>
</packing>
</child>
<child>
- <widget class="GtkCheckButton" id="zeroconfRaopDiscoverCheckButton">
- <property name="label" translatable="yes">Make discoverable Apple Air_tunes sound devices available locally</property>
+ <widget class="GtkButton" id="upnpInstallButton">
+ <property name="label" translatable="yes">Install...</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="use_underline">True</property>
- <property name="draw_indicator">True</property>
+ <property name="receives_default">True</property>
+ <property name="relief">none</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
- <property name="position">3</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="tm">
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">&lt;i&gt;Apple and Airtunes are trademarks of Apple Inc., registered in the U.S. and other countries.&lt;/i&gt;</property>
- <property name="use_markup">True</property>
- </widget>
- <packing>
- <property name="position">4</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
</packing>
</child>
</widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
</child>
<child>
- <widget class="GtkLabel" id="label1">
+ <widget class="GtkAlignment" id="alignment2">
<property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label" translatable="yes">N_etwork Access</property>
- <property name="use_underline">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <widget class="GtkVBox" id="vbox3">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <widget class="GtkCheckButton" id="upnpNullSinkCheckButton">
+ <property name="label" translatable="yes">Create separate audio device for DLNA/UPnP media streaming</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
</widget>
<packing>
- <property name="tab_fill">False</property>
- <property name="type">tab</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
</packing>
</child>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="label" translatable="yes">Network _Server</property>
+ <property name="use_underline">True</property>
+ </widget>
+ <packing>
+ <property name="position">3</property>
+ <property name="tab_fill">False</property>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkVBox" id="vbox31">
+ <property name="visible">True</property>
+ <property name="border_width">12</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
<child>
- <widget class="GtkVBox" id="vbox31">
+ <widget class="GtkHBox" id="hbox6">
<property name="visible">True</property>
- <property name="border_width">12</property>
- <property name="spacing">6</property>
<child>
<widget class="GtkCheckButton" id="rtpReceiveCheckButton">
- <property name="label" translatable="yes">Enable Multicast/RTP _receiver</property>
+ <property name="label" translatable="yes">Enable Multicast/RTP re_ceiver</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
@@ -237,123 +368,33 @@
</packing>
</child>
<child>
- <widget class="GtkCheckButton" id="rtpSendCheckButton">
- <property name="label" translatable="yes">Enable Multicast/RTP _sender</property>
+ <widget class="GtkButton" id="rtpRecvInstallButton">
+ <property name="label" translatable="yes">Install...</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="use_underline">True</property>
- <property name="draw_indicator">True</property>
+ <property name="receives_default">True</property>
+ <property name="relief">none</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
+ <property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
- <child>
- <widget class="GtkAlignment" id="alignment10">
- <property name="visible">True</property>
- <property name="left_padding">12</property>
- <child>
- <widget class="GtkVBox" id="vbox36">
- <property name="visible">True</property>
- <property name="spacing">6</property>
- <child>
- <widget class="GtkRadioButton" id="rtpMikeRadioButton">
- <property name="label" translatable="yes">Send audio from local _microphone</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="use_underline">True</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <widget class="GtkRadioButton" id="rtpSpeakerRadioButton">
- <property name="label" translatable="yes">Send audio from local s_peakers</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="use_underline">True</property>
- <property name="draw_indicator">True</property>
- <property name="group">rtpMikeRadioButton</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <widget class="GtkRadioButton" id="rtpNullSinkRadioButton">
- <property name="label" translatable="yes">Create seperate audio _device for Multicast/RTP</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="use_underline">True</property>
- <property name="draw_indicator">True</property>
- <property name="group">rtpMikeRadioButton</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <widget class="GtkCheckButton" id="rtpLoopbackCheckButton">
- <property name="label" translatable="yes">_Loopback audio to local speakers</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="use_underline">True</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">3</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label2">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label" translatable="yes">Multicast/R_TP</property>
- <property name="use_underline">True</property>
</widget>
<packing>
- <property name="position">1</property>
- <property name="tab_fill">False</property>
- <property name="type">tab</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
</packing>
</child>
<child>
- <widget class="GtkVBox" id="vbox4">
+ <widget class="GtkHBox" id="hbox7">
<property name="visible">True</property>
- <property name="border_width">12</property>
- <property name="spacing">6</property>
<child>
- <widget class="GtkCheckButton" id="combineCheckButton">
- <property name="label" translatable="yes">Add _virtual output device for simultaneous output on all local sound cards</property>
+ <widget class="GtkCheckButton" id="rtpSendCheckButton">
+ <property name="label" translatable="yes">Enable Multicast/RTP s_ender</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
@@ -366,41 +407,139 @@
<property name="position">0</property>
</packing>
</child>
+ <child>
+ <widget class="GtkButton" id="rtpSendInstallButton">
+ <property name="label" translatable="yes">Install...</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="relief">none</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
</widget>
<packing>
- <property name="position">2</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
</packing>
</child>
<child>
- <widget class="GtkLabel" id="label3">
+ <widget class="GtkAlignment" id="alignment10">
<property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label" translatable="yes">Sim_ultaneous Output</property>
- <property name="use_underline">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <widget class="GtkVBox" id="vbox36">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <widget class="GtkRadioButton" id="rtpMikeRadioButton">
+ <property name="label" translatable="yes">Send audio from local _microphone</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkRadioButton" id="rtpSpeakerRadioButton">
+ <property name="label" translatable="yes">Send audio from local spea_kers</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">rtpMikeRadioButton</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkRadioButton" id="rtpNullSinkRadioButton">
+ <property name="label" translatable="yes">Create separate audio device _for Multicast/RTP</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">rtpMikeRadioButton</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkCheckButton" id="rtpLoopbackCheckButton">
+ <property name="label" translatable="yes">_Loop back audio to local speakers</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
</widget>
<packing>
<property name="position">2</property>
- <property name="tab_fill">False</property>
- <property name="type">tab</property>
</packing>
</child>
</widget>
<packing>
- <property name="position">0</property>
+ <property name="position">2</property>
</packing>
</child>
<child>
- <widget class="GtkHButtonBox" id="hbuttonbox1">
+ <widget class="GtkLabel" id="label2">
<property name="visible">True</property>
- <property name="layout_style">end</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="label" translatable="yes">Multicast/R_TP</property>
+ <property name="use_underline">True</property>
+ </widget>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkVBox" id="vbox4">
+ <property name="visible">True</property>
+ <property name="border_width">12</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
<child>
- <widget class="GtkButton" id="closeButton">
- <property name="label">gtk-close</property>
+ <widget class="GtkCheckButton" id="combineCheckButton">
+ <property name="label" translatable="yes">Add _virtual output device for simultaneous output on all local sound cards</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="can_default">True</property>
<property name="receives_default">False</property>
- <property name="use_stock">True</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
</widget>
<packing>
<property name="expand">False</property>
@@ -410,15 +549,51 @@
</child>
</widget>
<packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Simultaneous _Output</property>
+ <property name="use_underline">True</property>
+ </widget>
+ <packing>
+ <property name="position">3</property>
+ <property name="tab_fill">False</property>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="layout_style">end</property>
+ <child>
+ <widget class="GtkButton" id="closeButton">
+ <property name="label">gtk-close</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </widget>
+ <packing>
<property name="expand">False</property>
<property name="fill">False</property>
- <property name="pack_type">end</property>
- <property name="position">1</property>
+ <property name="position">0</property>
</packing>
</child>
</widget>
<packing>
- <property name="position">2</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
</packing>
</child>
</widget>