summaryrefslogtreecommitdiffstats
path: root/ServerInfo.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ServerInfo.cc')
-rw-r--r--ServerInfo.cc67
1 files changed, 63 insertions, 4 deletions
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;
+ }
+}