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 --- ServerInfo.cc | 165 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 ServerInfo.cc (limited to 'ServerInfo.cc') 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]; +} -- cgit