From 33b0d86c66158b9aa0e1ab7b4b1c689fd83ab5ac Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 19 Aug 2004 21:54:11 +0000 Subject: sample cache stuff git-svn-id: file:///home/lennart/svn/public/paman/trunk@16 cdefa82f-4ce1-0310-97f5-ab6066f37c3c --- src/ServerInfoManager.cc | 98 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-) (limited to 'src/ServerInfoManager.cc') 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::iterator i = sourceOutputs.begin(); i != sourceOutputs.end(); i++) delete i->second; + for (std::map::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)); +} -- cgit