From 4927458e91e708213b0713dd4d3898dda6ec35c1 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 10 Aug 2004 13:04:04 +0000 Subject: Initial commit git-svn-id: file:///home/lennart/svn/public/paman/trunk@3 cdefa82f-4ce1-0310-97f5-ab6066f37c3c --- MainWindow.cc | 175 ++++++ MainWindow.hh | 70 +++ Makefile | 9 + ServerInfo.cc | 165 ++++++ ServerInfo.hh | 75 +++ SinkWindow.cc | 68 +++ SinkWindow.hh | 35 ++ SourceWindow.cc | 71 +++ SourceWindow.hh | 30 + paman.cc | 101 ++++ paman.glade | 1675 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ paman.gladep | 12 + paman.hh | 15 + 13 files changed, 2501 insertions(+) create mode 100644 MainWindow.cc create mode 100644 MainWindow.hh create mode 100644 Makefile create mode 100644 ServerInfo.cc create mode 100644 ServerInfo.hh create mode 100644 SinkWindow.cc create mode 100644 SinkWindow.hh create mode 100644 SourceWindow.cc create mode 100644 SourceWindow.hh create mode 100644 paman.cc create mode 100644 paman.glade create mode 100644 paman.gladep create mode 100644 paman.hh diff --git a/MainWindow.cc b/MainWindow.cc new file mode 100644 index 0000000..5db98fc --- /dev/null +++ b/MainWindow.cc @@ -0,0 +1,175 @@ +#include +#include +#include + +#include "paman.hh" +#include "MainWindow.hh" + +#define GLADE_NAME "mainWindow" + +enum { + ROW_TYPE_SINK_CATEGORY, + ROW_TYPE_SOURCE_CATEGORY, + ROW_TYPE_SINK, + ROW_TYPE_SOURCE, +}; + +MainWindow::MainWindow(BaseObjectType* cobject, const Glib::RefPtr& refGlade) : + Gtk::Window(cobject), + statusLabel(NULL), + serverNameLabel(NULL), + serverVersionLabel(NULL), + defaultSampleTypeLabel(NULL), + userNameLabel(NULL), + hostNameLabel(NULL), + deviceOpenButton(NULL), + moduleOpenButton(NULL), + connectButton(NULL), + deviceTreeView(NULL), + moduleTreeView(NULL) { + + refGlade->get_widget("statusLabel", statusLabel); + refGlade->get_widget("serverNameLabel", serverNameLabel); + refGlade->get_widget("serverVersionLabel", serverVersionLabel); + refGlade->get_widget("defaultSampleTypeLabel", defaultSampleTypeLabel); + refGlade->get_widget("hostNameLabel", hostNameLabel); + refGlade->get_widget("userNameLabel", userNameLabel); + refGlade->get_widget("deviceTreeView", deviceTreeView); + refGlade->get_widget("moduleTreeView", moduleTreeView); + refGlade->get_widget("deviceOpenButton", deviceOpenButton); + refGlade->get_widget("moduleOpenButton", moduleOpenButton); + refGlade->get_widget("connectButton", connectButton); + + deviceTreeModel = Gtk::TreeStore::create(deviceTreeModelColumns); + deviceTreeView->set_model(deviceTreeModel); + + deviceTreeView->append_column("Name", deviceTreeModelColumns.name); + deviceTreeView->append_column("Description", deviceTreeModelColumns.description); + + deviceTreeView->signal_row_activated().connect(sigc::mem_fun(*this, &MainWindow::onDeviceTreeViewRowActivated)); + deviceTreeView->signal_cursor_changed().connect(sigc::mem_fun(*this, &MainWindow::onDeviceTreeViewCursorChanged)); + + connectButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::onConnectButton)); + deviceOpenButton->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::onDeviceOpenButton)); + + statusLabel->set_text("Connecting ..."); + + clearAllData(); +} + +MainWindow::~MainWindow() { +} + +MainWindow* MainWindow::create() { + MainWindow *w; + Glib::RefPtr refXml = Gnome::Glade::Xml::create(GLADE_FILE, GLADE_NAME); + refXml->get_widget_derived(GLADE_NAME, w); + return w; +} + +void MainWindow::updateInfo(const SinkInfo &i) { + Gtk::TreeModel::Row row = *(deviceTreeModel->append(sinkRow.children())); + + row[deviceTreeModelColumns.name] = i.name; + row[deviceTreeModelColumns.description] = i.description; + row[deviceTreeModelColumns.index] = i.index; + row[deviceTreeModelColumns.type] = ROW_TYPE_SINK; + + Gtk::TreePath p(sinkRow); + deviceTreeView->expand_row(p, false); +} + +void MainWindow::updateInfo(const SourceInfo &i) { + Gtk::TreeModel::Row row = *(deviceTreeModel->append(sourceRow.children())); + + row[deviceTreeModelColumns.name] = i.name; + row[deviceTreeModelColumns.description] = i.description; + row[deviceTreeModelColumns.index] = i.index; + row[deviceTreeModelColumns.type] = ROW_TYPE_SOURCE; + + Gtk::TreePath p(sourceRow); + deviceTreeView->expand_row(p, false); +} + +void MainWindow::onDeviceTreeViewCursorChanged() { + Gtk::TreeModel::Path p; + Gtk::TreeViewColumn *c; + deviceTreeView->get_cursor(p, c); + Gtk::TreeModel::Row row = *(deviceTreeModel->get_iter(p)); + + deviceOpenButton->set_sensitive(row != sourceRow && row != sinkRow); +} + +void MainWindow::onDeviceTreeViewRowActivated(const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* /* column */) { + Gtk::TreeModel::Row row = *(deviceTreeModel->get_iter(path)); + + if (!serverInfo) + return; + + if (row[deviceTreeModelColumns.type] == ROW_TYPE_SINK) + serverInfo->showSinkWindow(row[deviceTreeModelColumns.index]); + else if (row[deviceTreeModelColumns.type] == ROW_TYPE_SOURCE) + serverInfo->showSourceWindow(row[deviceTreeModelColumns.index]); +} + +void MainWindow::updateInfo(const struct pa_server_info &i) { + char t[PA_SAMPLE_SNPRINT_MAX_LENGTH]; + serverNameLabel->set_text(i.server_name); + serverVersionLabel->set_text(i.server_version); + pa_sample_snprint(t, sizeof(t), &i.sample_spec); + defaultSampleTypeLabel->set_text(t); + hostNameLabel->set_text(i.host_name); + userNameLabel->set_text(i.user_name); +} + +void MainWindow::showSuccess(const char *t) { + statusLabel->set_text(t); +} + +void MainWindow::showFailure(const char *t) { + char s[256]; + snprintf(s, sizeof(s), "Failure: %s", t); + statusLabel->set_markup(s); +} + +void MainWindow::clearAllData() { + deviceTreeModel->clear(); + + sinkRow = *(deviceTreeModel->append()); + sinkRow[deviceTreeModelColumns.name] = "Sinks"; + sinkRow[deviceTreeModelColumns.index] = -1; + sinkRow[deviceTreeModelColumns.type] = ROW_TYPE_SINK_CATEGORY; + + sourceRow = *(deviceTreeModel->append()); + sourceRow[deviceTreeModelColumns.name] = "Sources"; + sourceRow[deviceTreeModelColumns.index] = -1; + sourceRow[deviceTreeModelColumns.type] = ROW_TYPE_SOURCE_CATEGORY; + + deviceOpenButton->set_sensitive(false); + moduleOpenButton->set_sensitive(false); + + serverNameLabel->set_markup("n/a"); + serverVersionLabel->set_markup("n/a"); + defaultSampleTypeLabel->set_markup("n/a"); + hostNameLabel->set_markup("n/a"); + userNameLabel->set_markup("n/a"); +} + +void MainWindow::onDeviceOpenButton() { + Gtk::TreeModel::Path p; + Gtk::TreeViewColumn *c; + deviceTreeView->get_cursor(p, c); + Gtk::TreeModel::Row row = *(deviceTreeModel->get_iter(p)); + + if (!serverInfo) + return; + + if (row[deviceTreeModelColumns.type] == ROW_TYPE_SINK) + serverInfo->showSinkWindow(row[deviceTreeModelColumns.index]); + else if (row[deviceTreeModelColumns.type] == ROW_TYPE_SOURCE) + serverInfo->showSourceWindow(row[deviceTreeModelColumns.index]); +} + +void MainWindow::onConnectButton() { + create_connection(); +} diff --git a/MainWindow.hh b/MainWindow.hh new file mode 100644 index 0000000..635e66d --- /dev/null +++ b/MainWindow.hh @@ -0,0 +1,70 @@ +#ifndef foomainwindowhhfoo +#define foomainwindowhhfoo + +#include +#include +#include + +class MainWinow; + +#include "ServerInfo.hh" + +class MainWindow : public Gtk::Window { +public: + MainWindow(BaseObjectType* cobject, const Glib::RefPtr& refGlade); + virtual ~MainWindow(); + static MainWindow* create(); + + Gtk::Label *statusLabel, + *serverNameLabel, + *serverVersionLabel, + *defaultSampleTypeLabel, + *userNameLabel, + *hostNameLabel; + + Gtk::Button *deviceOpenButton, + *moduleOpenButton, + *connectButton; + + Gtk::TreeView *deviceTreeView, *moduleTreeView; + +protected: + + class DeviceTreeModelColumns : public Gtk::TreeModel::ColumnRecord { + public: + + DeviceTreeModelColumns() { + add(name); + add(description); + add(index); + add(type); + } + + Gtk::TreeModelColumn name; + Gtk::TreeModelColumn description; + Gtk::TreeModelColumn index; + Gtk::TreeModelColumn type; + }; + + DeviceTreeModelColumns deviceTreeModelColumns; + Glib::RefPtr deviceTreeModel; + + Gtk::TreeModel::Row sinkRow, sourceRow; + +public: + virtual void updateInfo(const struct pa_server_info &i); + virtual void updateInfo(const SinkInfo &i); + virtual void updateInfo(const SourceInfo &i); + + virtual void onDeviceTreeViewCursorChanged(); + virtual void onDeviceTreeViewRowActivated(const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* /* column */); + + virtual void showSuccess(const char *t); + virtual void showFailure(const char *t); + virtual void clearAllData(); + + virtual void onDeviceOpenButton(); + virtual void onConnectButton(); +}; + +#endif diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..cfed04f --- /dev/null +++ b/Makefile @@ -0,0 +1,9 @@ + +CXXFLAGS=`pkg-config gtkmm-2.4 libglademm-2.4 --cflags` -Wall -W -pipe -O0 -g -Wno-unused -I../polypaudio +LIBS=`pkg-config gtkmm-2.4 libglademm-2.4 --libs` -L../polypaudio/polyp/.libs -lpolyp -lpolyp-mainloop-glib -lpolyp-error + +paman: paman.o MainWindow.o SinkWindow.o SourceWindow.o ServerInfo.o + $(CXX) $^ -o $@ $(LIBS) + +clean: + rm -rf *.o paman diff --git a/ServerInfo.cc b/ServerInfo.cc new file mode 100644 index 0000000..763f150 --- /dev/null +++ b/ServerInfo.cc @@ -0,0 +1,165 @@ +#include +#include + +#include "ServerInfo.hh" +#include "paman.hh" + +SinkInfo::SinkInfo(const struct pa_sink_info &i) : + name(i.name), + description(i.description), + index(i.index), + sample_spec(i.sample_spec), + monitor_source(i.monitor_source), + owner_module(i.owner_module), + volume(i.volume), + latency(i.latency), + sinkWindow(NULL) { +} + +SinkInfo::~SinkInfo() { + if (sinkWindow) + delete sinkWindow; +} + +void SinkInfo::update(const struct pa_sink_info &i) { + name = Glib::ustring(i.name); + description = i.description; + index = i.index; + sample_spec = i.sample_spec; + monitor_source = i.monitor_source; + owner_module = i.owner_module; + volume = i.volume; + latency = i.latency; + + if (sinkWindow) + sinkWindow->updateInfo(*this); +} + +void SinkInfo::showWindow() { + if (sinkWindow) + sinkWindow->present(); + else { + sinkWindow = SinkWindow::create(); + sinkWindow->updateInfo(*this); + sinkWindow->show(); + } +} + +SourceInfo::SourceInfo(const struct pa_source_info &i) : + name(i.name), + description(i.description), + index(i.index), + sample_spec(i.sample_spec), + owner_module(i.owner_module), + monitor_of_sink(i.monitor_of_sink), + sourceWindow(NULL) { +} + +SourceInfo::~SourceInfo() { + if (sourceWindow) + delete sourceWindow; +} + +void SourceInfo::update(const struct pa_source_info &i) { + name = i.name; + description = i.description; + index = i.index; + sample_spec = i.sample_spec; + owner_module = i.owner_module; + monitor_of_sink = i.monitor_of_sink; + + if (sourceWindow) + sourceWindow->updateInfo(*this); +} + +void SourceInfo::showWindow() { + if (sourceWindow) + sourceWindow->present(); + else { + sourceWindow = SourceWindow::create(); + sourceWindow->updateInfo(*this); + sourceWindow->show(); + } +} + +static void server_info_callback(struct pa_context *c, const struct pa_server_info *i, void *userdata) { + ServerInfo *si = (ServerInfo*) userdata; + + if (!i) { + mainWindow->showFailure(pa_strerror(pa_context_errno(c))); + return; + } + + mainWindow->updateInfo(*i); +} + +static void sink_info_callback(struct pa_context *c, const struct pa_sink_info *i, int is_last, void *userdata) { + ServerInfo *si = (ServerInfo*) userdata; + if (!is_last) + si->updateInfo(*i); +} + +static void source_info_callback(struct pa_context *c, const struct pa_source_info *i, int is_last, void *userdata) { + ServerInfo *si = (ServerInfo*) userdata; + if (!is_last) + si->updateInfo(*i); +} + +ServerInfo::ServerInfo(struct pa_context &c) : + context(c) { + pa_context_get_server_info(&c, server_info_callback, this); + pa_context_get_sink_info_list(&c, sink_info_callback, this); + pa_context_get_source_info_list(&c, source_info_callback, this); +} + +ServerInfo::~ServerInfo() { + for (std::map::iterator i = sinks.begin(); i != sinks.end(); i++) + delete i->second; + + for (std::map::iterator i = sources.begin(); i != sources.end(); i++) + delete i->second; +} + +void ServerInfo::updateInfo(const struct pa_sink_info &i) { + SinkInfo *si; + if ((si = sinks[i.index])) + si->update(i); + else { + SinkInfo *n = new SinkInfo(i); + sinks[i.index] = n; + mainWindow->updateInfo(*n); + } +} + +void ServerInfo::updateInfo(const struct pa_source_info &i) { + SourceInfo *si; + if ((si = sources[i.index])) + si->update(i); + else { + SourceInfo *n = new SourceInfo(i); + sources[i.index] = n; + mainWindow->updateInfo(*n); + } +} + +void ServerInfo::showSinkWindow(uint32_t index) { + SinkInfo *i; + + if ((i = sinks[index])) + i->showWindow(); +} + +void ServerInfo::showSourceWindow(uint32_t index) { + SourceInfo *i; + + if ((i = sources[index])) + i->showWindow(); +} + +SourceInfo* ServerInfo::getSourceInfo(uint32_t index) { + return sources[index]; +} + +SinkInfo* ServerInfo::getSinkInfo(uint32_t index) { + return sinks[index]; +} diff --git a/ServerInfo.hh b/ServerInfo.hh new file mode 100644 index 0000000..6dea7a9 --- /dev/null +++ b/ServerInfo.hh @@ -0,0 +1,75 @@ +#ifndef fooserverinfohhfoo +#define fooserverinfohhfoo + +#include +#include + +#include + +class SinkInfo; +class SourceInfo; +class ServerInfo; + +#include "SinkWindow.hh" +#include "SourceWindow.hh" +#include "MainWindow.hh" + +class SinkInfo { +public: + + SinkInfo(const struct pa_sink_info &i); + ~SinkInfo(); + + void update(const struct pa_sink_info &i); + void showWindow(); + + Glib::ustring name, description; + uint32_t index; + struct pa_sample_spec sample_spec; + uint32_t monitor_source; + uint32_t owner_module; + uint32_t volume; + uint32_t latency; + + SinkWindow *sinkWindow; +}; + +class SourceInfo { +public: + SourceInfo(const struct pa_source_info &i); + ~SourceInfo(); + + void update(const struct pa_source_info &i); + void showWindow(); + + Glib::ustring name, description; + uint32_t index; + struct pa_sample_spec sample_spec; + uint32_t owner_module; + uint32_t monitor_of_sink; + + SourceWindow *sourceWindow; +}; + +class ServerInfo { +public: + ServerInfo(struct pa_context &c); + ~ServerInfo(); + + void updateInfo(const struct pa_sink_info &i); + void updateInfo(const struct pa_source_info &i); + + void showSinkWindow(uint32_t index); + void showSourceWindow(uint32_t index); + + SourceInfo* getSourceInfo(uint32_t index); + SinkInfo* getSinkInfo(uint32_t index); + +protected: + std::map sinks; + std::map sources; + + struct pa_context &context; +}; + +#endif diff --git a/SinkWindow.cc b/SinkWindow.cc new file mode 100644 index 0000000..83e0955 --- /dev/null +++ b/SinkWindow.cc @@ -0,0 +1,68 @@ +#include "paman.hh" +#include "SinkWindow.hh" + +#define GLADE_NAME "sinkWindow" + +SinkWindow::SinkWindow(BaseObjectType* cobject, const Glib::RefPtr& refGlade) : + Gtk::Window(cobject), + nameLabel(NULL), + descriptionLabel(NULL), + indexLabel(NULL), + sampleTypeLabel(NULL), + latencyLabel(NULL), + ownerModuleLabel(NULL), + monitorSourceLabel(NULL), + closeButton(NULL), + toMonitorSourceButton(NULL) { + + refGlade->get_widget("nameLabel", nameLabel); + refGlade->get_widget("descriptionLabel", descriptionLabel); + refGlade->get_widget("indexLabel", indexLabel); + refGlade->get_widget("sampleTypeLabel", sampleTypeLabel); + refGlade->get_widget("latencyLabel", latencyLabel); + refGlade->get_widget("ownerModuleLabel", ownerModuleLabel); + refGlade->get_widget("monitorSourceLabel", monitorSourceLabel); + refGlade->get_widget("closeButton", closeButton); + refGlade->get_widget("toMonitorSourceButton", toMonitorSourceButton); + + closeButton->signal_clicked().connect(sigc::mem_fun(*this, &SinkWindow::onCloseButton)); + toMonitorSourceButton->signal_clicked().connect(sigc::mem_fun(*this, &SinkWindow::onToMonitorSourceButton)); +} + +SinkWindow* SinkWindow::create() { + SinkWindow *w = NULL; + Glib::RefPtr refXml = Gnome::Glade::Xml::create(GLADE_FILE, GLADE_NAME); + refXml->get_widget_derived(GLADE_NAME, w); + return w; +} + +void SinkWindow::updateInfo(const SinkInfo &i) { + char t[20], ss[PA_SAMPLE_SNPRINT_MAX_LENGTH]; + + nameLabel->set_text(i.name); + descriptionLabel->set_text(i.description); + snprintf(t, sizeof(t), "#%u", i.index); + indexLabel->set_text(t); + pa_sample_snprint(ss, sizeof(ss), &i.sample_spec); + sampleTypeLabel->set_text(ss); + snprintf(t, sizeof(t), "#%u", i.owner_module); + ownerModuleLabel->set_text(t); + + snprintf(t, sizeof(t), "%u usec", i.latency); + latencyLabel->set_text(t); + + SourceInfo *source = serverInfo->getSourceInfo(i.monitor_source); + monitorSourceLabel->set_text(source->name); + + set_title("Sink: "+i.name); + + monitor_source = i.monitor_source; +} + +void SinkWindow::onCloseButton() { + hide(); +} + +void SinkWindow::onToMonitorSourceButton() { + serverInfo->showSourceWindow(monitor_source); +} diff --git a/SinkWindow.hh b/SinkWindow.hh new file mode 100644 index 0000000..5027751 --- /dev/null +++ b/SinkWindow.hh @@ -0,0 +1,35 @@ +#ifndef foosinkwindowhhfoo +#define foosinkwindowhhfoo + +#include +#include + +class SinkWindow; + +#include "ServerInfo.hh" + +class SinkWindow : public Gtk::Window { +public: + SinkWindow(BaseObjectType* cobject, const Glib::RefPtr& refGlade); + static SinkWindow* create(); + + Gtk::Label *nameLabel, + *descriptionLabel, + *indexLabel, + *sampleTypeLabel, + *latencyLabel, + *ownerModuleLabel, + *monitorSourceLabel; + + Gtk::Button *closeButton, + *toMonitorSourceButton; + + uint32_t owner_module, monitor_source; + + void updateInfo(const SinkInfo &i); + + virtual void onCloseButton(); + virtual void onToMonitorSourceButton(); +}; + +#endif diff --git a/SourceWindow.cc b/SourceWindow.cc new file mode 100644 index 0000000..e91f8be --- /dev/null +++ b/SourceWindow.cc @@ -0,0 +1,71 @@ +#include "paman.hh" +#include "SourceWindow.hh" + +#define GLADE_NAME "sourceWindow" + +SourceWindow::SourceWindow(BaseObjectType* cobject, const Glib::RefPtr& refGlade) : + Gtk::Window(cobject), + nameLabel(NULL), + descriptionLabel(NULL), + indexLabel(NULL), + sampleTypeLabel(NULL), + ownerModuleLabel(NULL), + monitorOfSinkLabel(NULL), + closeButton(NULL), + toParentSinkButton(NULL) { + + refGlade->get_widget("nameLabel", nameLabel); + refGlade->get_widget("descriptionLabel", descriptionLabel); + refGlade->get_widget("indexLabel", indexLabel); + refGlade->get_widget("sampleTypeLabel", sampleTypeLabel); + refGlade->get_widget("ownerModuleLabel", ownerModuleLabel); + refGlade->get_widget("monitorOfSinkLabel", monitorOfSinkLabel); + refGlade->get_widget("closeButton", closeButton); + refGlade->get_widget("toParentSinkButton", toParentSinkButton); + + closeButton->signal_clicked().connect(sigc::mem_fun(*this, &SourceWindow::onCloseButton)); + toParentSinkButton->signal_clicked().connect(sigc::mem_fun(*this, &SourceWindow::onParentSinkButton)); +} + +SourceWindow* SourceWindow::create() { + SourceWindow *w = NULL; + Glib::RefPtr refXml = Gnome::Glade::Xml::create(GLADE_FILE, GLADE_NAME); + refXml->get_widget_derived(GLADE_NAME, w); + return w; +} + +void SourceWindow::updateInfo(const SourceInfo &i) { + char t[20], ss[PA_SAMPLE_SNPRINT_MAX_LENGTH]; + + nameLabel->set_text(i.name); + descriptionLabel->set_text(i.description); + snprintf(t, sizeof(t), "#%u", i.index); + indexLabel->set_text(t); + pa_sample_snprint(ss, sizeof(ss), &i.sample_spec); + sampleTypeLabel->set_text(ss); + snprintf(t, sizeof(t), "#%u", i.owner_module); + ownerModuleLabel->set_text(t); + + monitorOfSinkLabel->set_markup("n/a"); + toParentSinkButton->set_sensitive(false); + if (i.monitor_of_sink != (uint32_t) -1) { + SinkInfo *sink = serverInfo->getSinkInfo(i.monitor_of_sink); + if (sink) { + monitorOfSinkLabel->set_text(sink->name); + toParentSinkButton->set_sensitive(true); + } + } + + monitor_of_sink = i.monitor_of_sink; + + set_title("Source: "+i.name); +} + +void SourceWindow::onCloseButton() { + hide(); +} + +void SourceWindow::onParentSinkButton() { + if (monitor_of_sink != (uint32_t) -1) + serverInfo->showSinkWindow(monitor_of_sink); +} diff --git a/SourceWindow.hh b/SourceWindow.hh new file mode 100644 index 0000000..71e33e0 --- /dev/null +++ b/SourceWindow.hh @@ -0,0 +1,30 @@ +#ifndef foosourcewindowhhfoo +#define foosourcewindowhhfoo + +#include +#include + +class SourceWindow : public Gtk::Window { +public: + SourceWindow(BaseObjectType* cobject, const Glib::RefPtr& refGlade); + static SourceWindow* create(); + + Gtk::Label *nameLabel, + *descriptionLabel, + *indexLabel, + *sampleTypeLabel, + *ownerModuleLabel, + *monitorOfSinkLabel; + + Gtk::Button *closeButton, + *toParentSinkButton; + + uint32_t monitor_of_sink; + + void updateInfo(const SourceInfo &i); + + virtual void onCloseButton(); + virtual void onParentSinkButton(); +}; + +#endif diff --git a/paman.cc b/paman.cc new file mode 100644 index 0000000..1bde0ba --- /dev/null +++ b/paman.cc @@ -0,0 +1,101 @@ +#include + +#include +#include + +#include +#include +#include + +#include "paman.hh" +#include "SinkWindow.hh" +#include "MainWindow.hh" + +MainWindow *mainWindow = NULL; +ServerInfo *serverInfo = NULL; +struct pa_context *context = NULL; +struct pa_mainloop_api *mainloop_api = NULL; + +static void context_complete_callback(struct pa_context *c, int success, void *userdata) { + g_assert(c && mainWindow && !serverInfo); + + if (!success) { + mainWindow->showFailure(pa_strerror(pa_context_errno(c))); + //pa_context_free(context); /* Mrprmfmfl! */ + context = NULL; + mainWindow->connectButton->set_sensitive(true); + return; + } + + mainWindow->showSuccess("Connected"); + mainWindow->connectButton->set_sensitive(false); + serverInfo = new ServerInfo(*c); +} + +static void die_callback(struct pa_context *c, void *userdata) { + mainWindow->clearAllData(); + mainWindow->showFailure(pa_strerror(pa_context_errno(c))); + delete serverInfo; + serverInfo = NULL; + //pa_context_free(contetx); /* Mrprmfmfl! */ + context = NULL; + mainWindow->connectButton->set_sensitive(true); +} + +void create_connection() { + if (serverInfo) { + delete serverInfo; + serverInfo = NULL; + } + if (context) { + pa_context_free(context); + context = NULL; + } + + mainWindow->showSuccess("Connecting ..."); + context = pa_context_new(mainloop_api, "Polypaudio Manager"); + g_assert(context); + pa_context_set_die_callback(context, die_callback, NULL); + + if (pa_context_connect(context, NULL, context_complete_callback, NULL) < 0) { + context_complete_callback(context, 0, NULL); + return; + } + + mainWindow->connectButton->set_sensitive(false); +} + +int main(int argc, char *argv[]) { + struct pa_glib_mainloop *m; + + signal(SIGPIPE, SIG_IGN); + + Gtk::Main kit(argc, argv); + + mainWindow = MainWindow::create(); + g_assert(mainWindow); + + m = pa_glib_mainloop_new(g_main_context_default()); + g_assert(m); + mainloop_api = pa_glib_mainloop_get_api(m); + g_assert(mainloop_api); + + create_connection(); + + Gtk::Main::run(*mainWindow); + +quit: + if (serverInfo) + delete serverInfo; + + if (context) + pa_context_free(context); + + mainloop_api = NULL; + if (mainWindow) + delete mainWindow; + + pa_glib_mainloop_free(m); + + return 0; +} diff --git a/paman.glade b/paman.glade new file mode 100644 index 0000000..07eeb12 --- /dev/null +++ b/paman.glade @@ -0,0 +1,1675 @@ + + + + + + + 5 + True + Polypaudio Manager + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + 400 + 300 + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_NORMAL + GDK_GRAVITY_NORTH_WEST + + + + True + False + 5 + + + + True + True + True + True + GTK_POS_TOP + False + False + + + + 5 + True + False + 5 + + + + True + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 10 + True + 5 + 2 + False + 5 + 10 + + + + True + <b>Host Name:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + + + 0 + 1 + 3 + 4 + fill + + + + + + + True + <b>User Name:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + + + 0 + 1 + 4 + 5 + fill + + + + + + + True + <b>Server Version:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + <b>Server Name:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 1 + 0 + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + <b>Default Sample Type:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 0 + 0 + 0 + + + 0 + 1 + 2 + 3 + fill + + + + + + + True + True + + False + True + GTK_JUSTIFY_LEFT + False + True + 0 + 1 + 0 + 0 + + + 1 + 2 + 0 + 1 + fill + + + + + + + True + True + + False + True + GTK_JUSTIFY_LEFT + False + True + 0 + 0 + 0 + 0 + + + 1 + 2 + 2 + 3 + fill + + + + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 1 + 2 + 3 + 4 + fill + + + + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 1 + 2 + 4 + 5 + fill + + + + + + + True + True + + False + True + GTK_JUSTIFY_LEFT + False + True + 0 + 0.5 + 0 + 0 + + + 1 + 2 + 1 + 2 + fill + + + + + + + + 0 + True + True + + + + + + True + GTK_BUTTONBOX_END + 0 + + + + True + True + True + True + GTK_RELIEF_NORMAL + True + + + + True + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-network + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + _Connect + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + + + + + + 0 + False + False + + + + + False + True + + + + + + True + _Server Information + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + tab + + + + + + 5 + True + False + 5 + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + False + False + True + + + + + 0 + True + True + + + + + + True + GTK_BUTTONBOX_END + 5 + + + + True + True + True + True + GTK_RELIEF_NORMAL + True + + + + True + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-jump-to + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + _Open + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + + + + + + 0 + False + False + + + + + False + True + + + + + + True + _Devices + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + tab + + + + + + 5 + True + False + 5 + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + False + False + True + + + + + 0 + True + True + + + + + + True + GTK_BUTTONBOX_END + 5 + + + + True + True + True + GTK_RELIEF_NORMAL + True + + + + True + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-jump-to + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + _Open + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + + + + + + 0 + False + False + + + + + False + True + + + + + + True + _Modules + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + tab + + + + + 0 + True + True + + + + + + True + label36 + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + + + 5 + Sink + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + False + False + True + False + False + GDK_WINDOW_TYPE_HINT_NORMAL + GDK_GRAVITY_NORTH_WEST + + + + True + False + 5 + + + + True + True + True + True + GTK_POS_TOP + False + False + + + + 5 + True + False + 5 + + + + 5 + True + 7 + 2 + False + 5 + 10 + + + + True + <b>Name:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + <b>Description:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + <b>Monitor Source:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + + + 0 + 1 + 6 + 7 + fill + + + + + + + True + <b>Owner Module:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + + + 0 + 1 + 5 + 6 + fill + + + + + + + True + <b>Latency:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + + + 0 + 1 + 4 + 5 + fill + + + + + + + True + <b>Sample Type:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + + + 0 + 1 + 3 + 4 + fill + + + + + + + True + <b>Index:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + + + 0 + 1 + 2 + 3 + fill + + + + + + + True + True + + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0.5 + 0 + 0 + + + 1 + 2 + 5 + 6 + + + + + + + True + True + + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0.5 + 0 + 0 + + + 1 + 2 + 4 + 5 + + + + + + + True + True + + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0.5 + 0 + 0 + + + 1 + 2 + 3 + 4 + + + + + + + True + True + + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0.5 + 0 + 0 + + + 1 + 2 + 2 + 3 + + + + + + + True + True + + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0.5 + 0 + 0 + + + 1 + 2 + 1 + 2 + + + + + + + True + True + + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0.5 + 0 + 0 + + + 1 + 2 + 0 + 1 + + + + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 1 + 2 + 6 + 7 + fill + + + + + + 0 + True + True + + + + + + True + GTK_BUTTONBOX_START + 0 + + + + True + False + True + True + To Owner Module + True + GTK_RELIEF_NORMAL + True + + + + + + True + True + True + To Monitor Source + True + GTK_RELIEF_NORMAL + True + + + + + 0 + True + True + + + + + False + True + + + + + + True + Basic + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + tab + + + + + 0 + True + True + + + + + + True + GTK_BUTTONBOX_END + 0 + + + + True + True + True + gtk-close + True + GTK_RELIEF_NORMAL + True + + + + + 0 + False + True + + + + + + + + 5 + Source + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + False + False + True + False + False + GDK_WINDOW_TYPE_HINT_NORMAL + GDK_GRAVITY_NORTH_WEST + + + + True + False + 5 + + + + True + True + True + True + GTK_POS_TOP + False + False + + + + 5 + True + False + 5 + + + + 5 + True + 6 + 2 + False + 5 + 10 + + + + True + <b>Name:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + <b>Description:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + <b>Sample Type:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + + + 0 + 1 + 3 + 4 + fill + + + + + + + True + <b>Index:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + + + 0 + 1 + 2 + 3 + fill + + + + + + + True + True + + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0.5 + 0 + 0 + + + 1 + 2 + 4 + 5 + + + + + + + True + True + + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0.5 + 0 + 0 + + + 1 + 2 + 3 + 4 + + + + + + + True + True + + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0.5 + 0 + 0 + + + 1 + 2 + 2 + 3 + + + + + + + True + True + + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0.5 + 0 + 0 + + + 1 + 2 + 1 + 2 + + + + + + + True + True + + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0.5 + 0 + 0 + + + 1 + 2 + 0 + 1 + + + + + + + True + <b>Owner Module:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + + + 0 + 1 + 4 + 5 + fill + + + + + + + True + <b>Monitor of Sink:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 0 + 0 + + + 0 + 1 + 5 + 6 + fill + + + + + + + True + True + + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0.5 + 0 + 0 + + + 1 + 2 + 5 + 6 + fill + + + + + + 0 + True + True + + + + + + True + GTK_BUTTONBOX_START + 0 + + + + True + False + True + True + To Owner Module + True + GTK_RELIEF_NORMAL + True + + + + + + True + True + True + To Parent Sink + True + GTK_RELIEF_NORMAL + True + + + + + 0 + True + True + + + + + False + True + + + + + + True + Basic + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + tab + + + + + 0 + True + True + + + + + + True + GTK_BUTTONBOX_END + 0 + + + + True + True + True + True + gtk-close + True + GTK_RELIEF_NORMAL + True + + + + + 0 + False + True + + + + + + + diff --git a/paman.gladep b/paman.gladep new file mode 100644 index 0000000..f50f504 --- /dev/null +++ b/paman.gladep @@ -0,0 +1,12 @@ + + + + + Paman + paman + FALSE + FALSE + FALSE + FALSE + FALSE + diff --git a/paman.hh b/paman.hh new file mode 100644 index 0000000..8bebfb9 --- /dev/null +++ b/paman.hh @@ -0,0 +1,15 @@ +#ifndef foopamanhhfoo +#define foopamanhhfoo + +#include "ServerInfo.hh" + +#define GLADE_FILE "paman.glade" + +extern ServerInfo *serverInfo; +extern MainWindow *mainWindow; +extern struct pa_context *context; + +void create_connection(); + + +#endif -- cgit