summaryrefslogtreecommitdiffstats
path: root/ServerInfo.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ServerInfo.cc')
-rw-r--r--ServerInfo.cc165
1 files changed, 165 insertions, 0 deletions
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 <iostream>
+#include <polyp/polyplib-error.h>
+
+#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<int, SinkInfo*>::iterator i = sinks.begin(); i != sinks.end(); i++)
+ delete i->second;
+
+ for (std::map<int, SourceInfo*>::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];
+}