#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]; }