summaryrefslogtreecommitdiffstats
path: root/src/ServerInfoManager.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/ServerInfoManager.cc')
-rw-r--r--src/ServerInfoManager.cc98
1 files changed, 97 insertions, 1 deletions
diff --git a/src/ServerInfoManager.cc b/src/ServerInfoManager.cc
index 9542773..bd16938 100644
--- a/src/ServerInfoManager.cc
+++ b/src/ServerInfoManager.cc
@@ -241,6 +241,43 @@ void SourceOutputInfo::showWindow() {
}
}
+SampleInfo::SampleInfo(const struct pa_sample_info &i) :
+ index(i.index),
+ name(i.name),
+ sample_spec(i.sample_spec),
+ volume(i.volume),
+ duration(i.duration),
+ window(NULL) {
+}
+
+SampleInfo::~SampleInfo() {
+ if (window)
+ delete window;
+}
+
+void SampleInfo::update(const struct pa_sample_info &i) {
+ index = i.index;
+ name = i.name;
+ sample_spec = i.sample_spec;
+ volume = i.volume;
+ duration = i.duration;
+
+ if (window)
+ window->updateInfo(*this);
+ g_assert(mainWindow);
+ mainWindow->updateInfo(*this);
+}
+
+void SampleInfo::showWindow() {
+ if (window)
+ window->present();
+ else {
+ window = SampleWindow::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);
@@ -249,6 +286,7 @@ extern "C" {
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 sample_info_callback(struct pa_context *c, const struct pa_sample_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);
};
@@ -293,6 +331,11 @@ static void source_output_info_callback(struct pa_context *c, const struct pa_so
if (i) si->updateInfo(*i);
}
+static void sample_info_callback(struct pa_context *c, const struct pa_sample_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;
@@ -335,6 +378,12 @@ static void subscribe_callback(struct pa_context *c, enum pa_subscription_event_
else
pa_operation_unref(pa_context_get_source_output_info(c, index, source_output_info_callback, si));
break;
+ case PA_SUBSCRIPTION_EVENT_SAMPLE_CACHE:
+ if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE)
+ si->removeSampleInfo(index);
+ else
+ pa_operation_unref(pa_context_get_sample_info_by_index(c, index, sample_info_callback, si));
+ break;
default:
fprintf(stderr, "OTHER EVENT\n");
break;
@@ -351,6 +400,7 @@ ServerInfoManager::ServerInfoManager(struct pa_context &c) :
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_operation_unref(pa_context_get_sample_info_list(&c, sample_info_callback, this));
pa_context_set_subscribe_callback(&c, subscribe_callback, this);
@@ -360,7 +410,8 @@ ServerInfoManager::ServerInfoManager(struct pa_context &c) :
PA_SUBSCRIPTION_MASK_MODULE|
PA_SUBSCRIPTION_MASK_SINK_INPUT|
PA_SUBSCRIPTION_MASK_SOURCE_OUTPUT|
- PA_SUBSCRIPTION_MASK_CLIENT), NULL, NULL));
+ PA_SUBSCRIPTION_MASK_CLIENT|
+ PA_SUBSCRIPTION_MASK_SAMPLE_CACHE), NULL, NULL));
}
@@ -383,6 +434,9 @@ ServerInfoManager::~ServerInfoManager() {
for (std::map<int, SourceOutputInfo*>::iterator i = sourceOutputs.begin(); i != sourceOutputs.end(); i++)
delete i->second;
+ for (std::map<int, SampleInfo*>::iterator i = samples.begin(); i != samples.end(); i++)
+ delete i->second;
+
if (statWindow)
delete statWindow;
}
@@ -454,6 +508,17 @@ void ServerInfoManager::updateInfo(const struct pa_source_output_info &i) {
}
}
+void ServerInfoManager::updateInfo(const struct pa_sample_info &i) {
+ SampleInfo *si;
+ if ((si = samples[i.index]))
+ si->update(i);
+ else {
+ SampleInfo *n = new SampleInfo(i);
+ samples[i.index] = n;
+ mainWindow->updateInfo(*n);
+ }
+}
+
void ServerInfoManager::showSinkWindow(uint32_t index) {
SinkInfo *i;
@@ -496,6 +561,13 @@ void ServerInfoManager::showSourceOutputWindow(uint32_t index) {
i->showWindow();
}
+void ServerInfoManager::showSampleWindow(uint32_t index) {
+ SampleInfo *i;
+
+ if ((i = samples[index]))
+ i->showWindow();
+}
+
SourceInfo* ServerInfoManager::getSourceInfo(uint32_t index) {
return sources[index];
@@ -513,6 +585,11 @@ ModuleInfo* ServerInfoManager::getModuleInfo(uint32_t index) {
return modules[index];
}
+SampleInfo* ServerInfoManager::getSampleInfo(uint32_t index) {
+ return samples[index];
+}
+
+
void ServerInfoManager::removeSinkInfo(uint32_t index) {
SinkInfo *i;
@@ -569,6 +646,15 @@ void ServerInfoManager::removeSourceOutputInfo(uint32_t index) {
}
}
+void ServerInfoManager::removeSampleInfo(uint32_t index) {
+ SampleInfo *i;
+ if ((i = samples[index])) {
+ samples.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));
}
@@ -586,3 +672,13 @@ void ServerInfoManager::showStatWindow() {
}
}
+
+void ServerInfoManager::playSample(uint32_t sample, uint32_t sink) {
+ SinkInfo *sinki = getSinkInfo(sink);
+ SampleInfo *samplei = getSampleInfo(sample);
+
+ if (!sinki || !samplei)
+ return;
+
+ pa_operation_unref(pa_context_play_sample(&context, samplei->name.c_str(), sinki->name.c_str(), PA_VOLUME_NORM, NULL, NULL));
+}