From 1f9bb4bea5427c1bf236e8698855048ef35f3a81 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 11 Aug 2004 15:11:05 +0000 Subject: half work git-svn-id: file:///home/lennart/svn/public/paman/trunk@4 cdefa82f-4ce1-0310-97f5-ab6066f37c3c --- ServerInfo.cc | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 63 insertions(+), 4 deletions(-) (limited to 'ServerInfo.cc') diff --git a/ServerInfo.cc b/ServerInfo.cc index 763f150..ccda5b1 100644 --- a/ServerInfo.cc +++ b/ServerInfo.cc @@ -13,7 +13,8 @@ SinkInfo::SinkInfo(const struct pa_sink_info &i) : owner_module(i.owner_module), volume(i.volume), latency(i.latency), - sinkWindow(NULL) { + sinkWindow(NULL), + treePathValid(false) { } SinkInfo::~SinkInfo() { @@ -52,7 +53,8 @@ SourceInfo::SourceInfo(const struct pa_source_info &i) : sample_spec(i.sample_spec), owner_module(i.owner_module), monitor_of_sink(i.monitor_of_sink), - sourceWindow(NULL) { + sourceWindow(NULL), + treePathValid(false) { } SourceInfo::~SourceInfo() { @@ -95,21 +97,62 @@ static void server_info_callback(struct pa_context *c, const struct pa_server_in 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) + if (!is_last && i) 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) + if (!is_last && i) si->updateInfo(*i); } +static void subscribe_callback(struct pa_context *c, enum pa_subscription_event_type t, uint32_t index, void *userdata) { + ServerInfo *si = (ServerInfo*) userdata; + + fprintf(stderr, "EV: %u %u\n", t, index); + + switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) { + case PA_SUBSCRIPTION_EVENT_SINK: + fprintf(stderr, "SINK EVENT\n"); + + if (t & PA_SUBSCRIPTION_EVENT_TYPE_MASK == PA_SUBSCRIPTION_EVENT_REMOVE) + si->removeSinkInfo(index); + else + pa_context_get_sink_info_by_index(c, index, sink_info_callback, si); + break; + case PA_SUBSCRIPTION_EVENT_SOURCE: + fprintf(stderr, "SOURCE EVENT\n"); + + if (t & PA_SUBSCRIPTION_EVENT_TYPE_MASK == PA_SUBSCRIPTION_EVENT_REMOVE) + si->removeSourceInfo(index); + else + pa_context_get_source_info_by_index(c, index, source_info_callback, si); + break; + case PA_SUBSCRIPTION_EVENT_MODULE: + fprintf(stderr, "MODULE EVENT\n"); + break; + case PA_SUBSCRIPTION_EVENT_CLIENT: + fprintf(stderr, "CLIENT EVENT\n"); + break; + case PA_SUBSCRIPTION_EVENT_SINK_INPUT: + fprintf(stderr, "SINK INPUT EVENT\n"); + break; + case PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT: + fprintf(stderr, "SOURCE OUTPUT EVENT\n"); + break; + default: + fprintf(stderr, "OTHER EVENT\n"); + break; + } +} + 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); + pa_context_subscribe(&c, (enum pa_subscription_mask) (PA_SUBSCRIPTION_FACILITY_SINK|PA_SUBSCRIPTION_FACILITY_SOURCE|PA_SUBSCRIPTION_FACILITY_MODULE|PA_SUBSCRIPTION_FACILITY_SINK_INPUT|PA_SUBSCRIPTION_FACILITY_SOURCE_OUTPUT|PA_SUBSCRIPTION_FACILITY_CLIENT), subscribe_callback, this); } ServerInfo::~ServerInfo() { @@ -163,3 +206,19 @@ SourceInfo* ServerInfo::getSourceInfo(uint32_t index) { SinkInfo* ServerInfo::getSinkInfo(uint32_t index) { return sinks[index]; } + +void ServerInfo::removeSinkInfo(uint32_t index) { + SinkInfo *i; + if ((i = sinks[index])) { + sinks.erase(index); + delete i; + } +} + +void ServerInfo::removeSourceInfo(uint32_t index) { + SourceInfo *i; + if ((i = sources[index])) { + sources.erase(index); + delete i; + } +} -- cgit