summaryrefslogtreecommitdiffstats
path: root/src/ServerInfoManager.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/ServerInfoManager.cc')
-rw-r--r--src/ServerInfoManager.cc172
1 files changed, 169 insertions, 3 deletions
diff --git a/src/ServerInfoManager.cc b/src/ServerInfoManager.cc
index c816f21..f271354 100644
--- a/src/ServerInfoManager.cc
+++ b/src/ServerInfoManager.cc
@@ -159,12 +159,96 @@ void ModuleInfo::showWindow() {
}
}
+SinkInputInfo::SinkInputInfo(const struct pa_sink_input_info &i) :
+ name(i.name),
+ index(i.index),
+ sample_spec(i.sample_spec),
+ sink(i.sink),
+ client(i.client),
+ owner_module(i.owner_module),
+ volume(i.volume),
+ latency(i.latency),
+ window(NULL) {
+}
+
+SinkInputInfo::~SinkInputInfo() {
+ if (window)
+ delete window;
+}
+
+void SinkInputInfo::update(const struct pa_sink_input_info &i) {
+ name = i.name;
+ index = i.index;
+ sample_spec = i.sample_spec;
+ sink = i.sink;
+ client = i.client;
+ owner_module = i.owner_module;
+ volume = i.volume;
+ latency = i.latency;
+
+ if (window)
+ window->updateInfo(*this);
+ g_assert(mainWindow);
+ mainWindow->updateInfo(*this);
+}
+
+void SinkInputInfo::showWindow() {
+ if (window)
+ window->present();
+ else {
+ window = SinkInputWindow::create();
+ window->updateInfo(*this);
+ window->show();
+ }
+}
+
+SourceOutputInfo::SourceOutputInfo(const struct pa_source_output_info &i) :
+ name(i.name),
+ index(i.index),
+ sample_spec(i.sample_spec),
+ source(source),
+ client(client),
+ owner_module(owner_module),
+ window(NULL) {
+}
+
+SourceOutputInfo::~SourceOutputInfo() {
+ if (window)
+ delete window;
+}
+
+void SourceOutputInfo::update(const struct pa_source_output_info &i) {
+ index = i.index;
+ name = i.name;
+ sample_spec = i.sample_spec;
+ source = i.source;
+ client = i.client;
+ owner_module = i.owner_module;
+
+ if (window)
+ window->updateInfo(*this);
+ g_assert(mainWindow);
+ mainWindow->updateInfo(*this);
+}
+
+void SourceOutputInfo::showWindow() {
+ if (window)
+ window->present();
+ else {
+ window = SourceOutputWindow::create();
+ window->updateInfo(*this);
+ window->show();
+ }
+}
+
extern "C" {
static void server_info_callback(struct pa_context *c, const struct pa_server_info *i, void *userdata);
static void sink_info_callback(struct pa_context *c, const struct pa_sink_info *i, int is_last, void *userdata);
static void source_info_callback(struct pa_context *c, const struct pa_source_info *i, int is_last, void *userdata);
static void client_info_callback(struct pa_context *c, const struct pa_client_info *i, int is_last, void *userdata);
static void module_info_callback(struct pa_context *c, const struct pa_module_info *i, int is_last, void *userdata);
+ static void sink_input_info_callback(struct pa_context *c, const struct pa_sink_input_info *i, int is_last, void *userdata);
+ static void source_output_info_callback(struct pa_context *c, const struct pa_source_output_info *i, int is_last, void *userdata);
static void subscribe_callback(struct pa_context *c, enum pa_subscription_event_type t, uint32_t index, void *userdata);
};
@@ -199,6 +283,16 @@ static void module_info_callback(struct pa_context *c, const struct pa_module_in
if (i) si->updateInfo(*i);
}
+static void sink_input_info_callback(struct pa_context *c, const struct pa_sink_input_info *i, int is_last, void *userdata) {
+ ServerInfoManager *si = (ServerInfoManager*) userdata;
+ if (i) si->updateInfo(*i);
+}
+
+static void source_output_info_callback(struct pa_context *c, const struct pa_source_output_info *i, int is_last, void *userdata) {
+ ServerInfoManager *si = (ServerInfoManager*) userdata;
+ if (i) si->updateInfo(*i);
+}
+
static void subscribe_callback(struct pa_context *c, enum pa_subscription_event_type t, uint32_t index, void *userdata) {
ServerInfoManager *si = (ServerInfoManager*) userdata;
@@ -230,13 +324,19 @@ static void subscribe_callback(struct pa_context *c, enum pa_subscription_event_
pa_operation_unref(pa_context_get_client_info(c, index, client_info_callback, si));
break;
case PA_SUBSCRIPTION_EVENT_SINK_INPUT:
-// fprintf(stderr, "SINK INPUT EVENT\n");
+ if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE)
+ si->removeSinkInputInfo(index);
+ else
+ pa_operation_unref(pa_context_get_sink_input_info(c, index, sink_input_info_callback, si));
break;
case PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT:
-// fprintf(stderr, "SOURCE OUTPUT EVENT\n");
+ if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE)
+ si->removeSourceOutputInfo(index);
+ else
+ pa_operation_unref(pa_context_get_source_output_info(c, index, source_output_info_callback, si));
break;
default:
-// fprintf(stderr, "OTHER EVENT\n");
+ fprintf(stderr, "OTHER EVENT\n");
break;
}
}
@@ -248,6 +348,8 @@ ServerInfoManager::ServerInfoManager(struct pa_context &c) :
pa_operation_unref(pa_context_get_source_info_list(&c, source_info_callback, this));
pa_operation_unref(pa_context_get_module_info_list(&c, module_info_callback, this));
pa_operation_unref(pa_context_get_client_info_list(&c, client_info_callback, this));
+ pa_operation_unref(pa_context_get_sink_input_info_list(&c, sink_input_info_callback, this));
+ pa_operation_unref(pa_context_get_source_output_info_list(&c, source_output_info_callback, this));
pa_context_set_subscribe_callback(&c, subscribe_callback, this);
@@ -273,6 +375,12 @@ ServerInfoManager::~ServerInfoManager() {
for (std::map<int, ModuleInfo*>::iterator i = modules.begin(); i != modules.end(); i++)
delete i->second;
+
+ for (std::map<int, SinkInputInfo*>::iterator i = sinkInputs.begin(); i != sinkInputs.end(); i++)
+ delete i->second;
+
+ for (std::map<int, SourceOutputInfo*>::iterator i = sourceOutputs.begin(); i != sourceOutputs.end(); i++)
+ delete i->second;
}
void ServerInfoManager::updateInfo(const struct pa_sink_info &i) {
@@ -319,6 +427,28 @@ void ServerInfoManager::updateInfo(const struct pa_module_info &i) {
}
}
+void ServerInfoManager::updateInfo(const struct pa_sink_input_info &i) {
+ SinkInputInfo *si;
+ if ((si = sinkInputs[i.index]))
+ si->update(i);
+ else {
+ SinkInputInfo *n = new SinkInputInfo(i);
+ sinkInputs[i.index] = n;
+ mainWindow->updateInfo(*n);
+ }
+}
+
+void ServerInfoManager::updateInfo(const struct pa_source_output_info &i) {
+ SourceOutputInfo *si;
+ if ((si = sourceOutputs[i.index]))
+ si->update(i);
+ else {
+ SourceOutputInfo *n = new SourceOutputInfo(i);
+ sourceOutputs[i.index] = n;
+ mainWindow->updateInfo(*n);
+ }
+}
+
void ServerInfoManager::showSinkWindow(uint32_t index) {
SinkInfo *i;
@@ -347,6 +477,20 @@ void ServerInfoManager::showModuleWindow(uint32_t index) {
i->showWindow();
}
+void ServerInfoManager::showSinkInputWindow(uint32_t index) {
+ SinkInputInfo *i;
+
+ if ((i = sinkInputs[index]))
+ i->showWindow();
+}
+
+void ServerInfoManager::showSourceOutputWindow(uint32_t index) {
+ SourceOutputInfo *i;
+
+ if ((i = sourceOutputs[index]))
+ i->showWindow();
+}
+
SourceInfo* ServerInfoManager::getSourceInfo(uint32_t index) {
return sources[index];
@@ -402,6 +546,28 @@ void ServerInfoManager::removeModuleInfo(uint32_t index) {
}
}
+void ServerInfoManager::removeSinkInputInfo(uint32_t index) {
+ SinkInputInfo *i;
+ if ((i = sinkInputs[index])) {
+ sinkInputs.erase(index);
+ mainWindow->removeInfo(*i);
+ delete i;
+ }
+}
+
+void ServerInfoManager::removeSourceOutputInfo(uint32_t index) {
+ SourceOutputInfo *i;
+ if ((i = sourceOutputs[index])) {
+ sourceOutputs.erase(index);
+ mainWindow->removeInfo(*i);
+ delete i;
+ }
+}
+
void ServerInfoManager::setSinkVolume(uint32_t index, uint32_t volume) {
pa_operation_unref(pa_context_set_sink_volume_by_index(&context, index, volume, NULL, NULL));
}
+
+void ServerInfoManager::setSinkInputVolume(uint32_t index, uint32_t volume) {
+ pa_operation_unref(pa_context_set_sink_input_volume(&context, index, volume, NULL, NULL));
+}