Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(603)

Unified Diff: media/audio/pulse/pulse_util.cc

Issue 2258143002: Add GetAssociatedOutputDeviceID support to pulse. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Tommis comments. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/audio/pulse/pulse_util.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/audio/pulse/pulse_util.cc
diff --git a/media/audio/pulse/pulse_util.cc b/media/audio/pulse/pulse_util.cc
index d5c699a09e28a821fd1e7107ca1cd6be9858d24a..224e5066b0ebf19644a79f3edf62164640b196ee 100644
--- a/media/audio/pulse/pulse_util.cc
+++ b/media/audio/pulse/pulse_util.cc
@@ -5,6 +5,7 @@
#include "media/audio/pulse/pulse_util.h"
#include <stdint.h>
+#include <string.h>
#include "base/logging.h"
#include "base/macros.h"
@@ -68,6 +69,76 @@ class ScopedPropertyList {
DISALLOW_COPY_AND_ASSIGN(ScopedPropertyList);
};
+struct InputBusData {
+ InputBusData(pa_threaded_mainloop* loop, const std::string& name)
+ : loop_(loop), name_(name), bus_() {}
+
+ pa_threaded_mainloop* const loop_;
+ const std::string& name_;
+ std::string bus_;
+};
+
+struct OutputBusData {
+ OutputBusData(pa_threaded_mainloop* loop, const std::string& bus)
+ : loop_(loop), name_(), bus_(bus) {}
+
+ pa_threaded_mainloop* const loop_;
+ std::string name_;
+ const std::string& bus_;
+};
+
+void InputBusCallback(pa_context* context,
+ const pa_source_info* info,
+ int error,
+ void* user_data) {
+ InputBusData* data = static_cast<InputBusData*>(user_data);
+
+ if (error) {
+ // We have checked all the devices now.
+ pa_threaded_mainloop_signal(data->loop_, 0);
+ return;
+ }
+
+ if (strcmp(info->name, data->name_.c_str()) == 0 &&
+ pa_proplist_contains(info->proplist, PA_PROP_DEVICE_BUS)) {
+ data->bus_ = pa_proplist_gets(info->proplist, PA_PROP_DEVICE_BUS);
+ }
+}
+
+void OutputBusCallback(pa_context* context,
+ const pa_sink_info* info,
+ int error,
+ void* user_data) {
+ OutputBusData* data = static_cast<OutputBusData*>(user_data);
+
+ if (error) {
+ // We have checked all the devices now.
+ pa_threaded_mainloop_signal(data->loop_, 0);
+ return;
+ }
+
+ if (pa_proplist_contains(info->proplist, PA_PROP_DEVICE_BUS) &&
+ strcmp(pa_proplist_gets(info->proplist, PA_PROP_DEVICE_BUS),
+ data->bus_.c_str()) == 0) {
+ data->name_ = info->name;
+ }
+}
+
+struct DefaultDevicesData {
+ DefaultDevicesData(pa_threaded_mainloop* loop) : loop_(loop) {}
+ std::string input_;
+ std::string output_;
+ pa_threaded_mainloop* const loop_;
+};
+
+void GetDefaultDeviceIdCallback(pa_context* c,
+ const pa_server_info* info,
+ void* userdata) {
+ DefaultDevicesData* data = static_cast<DefaultDevicesData*>(userdata);
+ data->input_ = info->default_source_name;
+ data->output_ = info->default_sink_name;
+ pa_threaded_mainloop_signal(data->loop_, 0);
+}
} // namespace
// static, pa_stream_success_cb_t
@@ -355,6 +426,42 @@ bool CreateOutputStream(pa_threaded_mainloop** mainloop,
return true;
}
+std::string GetBusOfInput(pa_threaded_mainloop* mainloop,
+ pa_context* context,
+ const std::string& name) {
+ DCHECK(mainloop);
+ DCHECK(context);
+ AutoPulseLock auto_lock(mainloop);
+ InputBusData data(mainloop, name);
+ pa_operation* operation =
+ pa_context_get_source_info_list(context, InputBusCallback, &data);
+ WaitForOperationCompletion(mainloop, operation);
+ return data.bus_;
+}
+
+std::string GetOutputCorrespondingTo(pa_threaded_mainloop* mainloop,
+ pa_context* context,
+ const std::string& bus) {
+ DCHECK(mainloop);
+ DCHECK(context);
+ AutoPulseLock auto_lock(mainloop);
+ OutputBusData data(mainloop, bus);
+ pa_operation* operation =
+ pa_context_get_sink_info_list(context, OutputBusCallback, &data);
+ WaitForOperationCompletion(mainloop, operation);
+ return data.name_;
+}
+
+std::string GetRealDefaultDeviceId(pa_threaded_mainloop* mainloop,
+ pa_context* context,
+ RequestType type) {
+ DefaultDevicesData data(mainloop);
+ pa_operation* op =
+ pa_context_get_server_info(context, &GetDefaultDeviceIdCallback, &data);
+ WaitForOperationCompletion(mainloop, op);
+ return (type == RequestType::INPUT) ? data.input_ : data.output_;
+}
+
#undef RETURN_ON_FAILURE
} // namespace pulse
« no previous file with comments | « media/audio/pulse/pulse_util.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698