From 7b738b897f6e523024faadef9c1efb6a9aa32f59 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 16 Aug 2004 19:55:43 +0000 Subject: add sink input/source output support (currently broken) git-svn-id: file:///home/lennart/svn/public/paman/trunk@12 cdefa82f-4ce1-0310-97f5-ab6066f37c3c --- src/ServerInfoManager.cc | 172 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 169 insertions(+), 3 deletions(-) (limited to 'src/ServerInfoManager.cc') 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::iterator i = modules.begin(); i != modules.end(); i++) delete i->second; + + for (std::map::iterator i = sinkInputs.begin(); i != sinkInputs.end(); i++) + delete i->second; + + for (std::map::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)); +} -- cgit