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

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

Issue 12310102: Change GetVolume() to be asynchronous when being called by pulse thread (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 10 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.sigs ('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_input.cc
diff --git a/media/audio/pulse/pulse_input.cc b/media/audio/pulse/pulse_input.cc
index 6f241fbaff761ce50298bb382876a0184f730f73..6945fbc4d8b2127d1baa14e2e96864abf16f3d16 100644
--- a/media/audio/pulse/pulse_input.cc
+++ b/media/audio/pulse/pulse_input.cc
@@ -217,16 +217,33 @@ void PulseAudioInputStream::SetVolume(double volume) {
}
double PulseAudioInputStream::GetVolume() {
- AutoPulseLock auto_lock(pa_mainloop_);
- if (!handle_)
+ if (pa_threaded_mainloop_in_thread(pa_mainloop_)) {
+ // When being called by the pulse thread, GetVolume() is asynchronous and
+ // called under AutoPulseLock.
+ if (!handle_)
+ return 0.0;
+
+ size_t index = pa_stream_get_device_index(handle_);
+ pa_operation* operation = pa_context_get_source_info_by_index(
+ pa_context_, index, &VolumeCallback, this);
+ // Do not wait for the operation since we can't block the pulse thread.
+ pa_operation_unref(operation);
+
+ // Return zero and the callback will asynchronously update the |volume_|.
return 0.0;
+ } else {
+ // Called by other thread, put an AutoPulseLock and wait for the operation.
+ AutoPulseLock auto_lock(pa_mainloop_);
+ if (!handle_)
+ return 0.0;
- size_t index = pa_stream_get_device_index(handle_);
- pa_operation* operation = pa_context_get_source_info_by_index(
- pa_context_, index, &VolumeCallback, this);
- WaitForOperationCompletion(pa_mainloop_, operation);
+ size_t index = pa_stream_get_device_index(handle_);
+ pa_operation* operation = pa_context_get_source_info_by_index(
+ pa_context_, index, &VolumeCallback, this);
+ WaitForOperationCompletion(pa_mainloop_, operation);
- return volume_;
+ return volume_;
+ }
}
// static, used by pa_stream_set_read_callback.
@@ -284,8 +301,11 @@ void PulseAudioInputStream::ReadData() {
// Update the AGC volume level once every second. Note that,
// |volume| is also updated each time SetVolume() is called
// through IPC by the render-side AGC.
+ // QueryAgcVolume() will trigger a callback to asynchronously update the
+ // |volume_|.
DaleCurtis 2013/02/25 18:52:18 This needs some mention of the fact that the |norm
no longer working on chromium 2013/02/26 12:02:51 Done.
double normalized_volume = 0.0;
QueryAgcVolume(&normalized_volume);
+ normalized_volume = volume_ / GetMaxVolume();
do {
size_t length = 0;
« no previous file with comments | « media/audio/pulse/pulse.sigs ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698