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

Side by Side Diff: media/audio/audio_output_controller.cc

Issue 15979015: Reland 15721002: Hook up the device selection to the WebAudio live audio (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixed the comments. Created 7 years, 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/audio/audio_output_controller.h" 5 #include "media/audio/audio_output_controller.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/debug/trace_event.h" 8 #include "base/debug/trace_event.h"
9 #include "base/message_loop.h" 9 #include "base/message_loop.h"
10 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
(...skipping 21 matching lines...) Expand all
32 static const float kIndistinguishableSilenceThreshold = 32 static const float kIndistinguishableSilenceThreshold =
33 1.0f / 4096.0f; // Note: This is approximately -72 dbFS. 33 1.0f / 4096.0f; // Note: This is approximately -72 dbFS.
34 34
35 // Polling-related constants. 35 // Polling-related constants.
36 const int AudioOutputController::kPollNumAttempts = 3; 36 const int AudioOutputController::kPollNumAttempts = 3;
37 const int AudioOutputController::kPollPauseInMilliseconds = 3; 37 const int AudioOutputController::kPollPauseInMilliseconds = 3;
38 38
39 AudioOutputController::AudioOutputController(AudioManager* audio_manager, 39 AudioOutputController::AudioOutputController(AudioManager* audio_manager,
40 EventHandler* handler, 40 EventHandler* handler,
41 const AudioParameters& params, 41 const AudioParameters& params,
42 const std::string& input_device_id,
42 SyncReader* sync_reader) 43 SyncReader* sync_reader)
43 : audio_manager_(audio_manager), 44 : audio_manager_(audio_manager),
44 params_(params), 45 params_(params),
45 handler_(handler), 46 handler_(handler),
47 input_device_id_(input_device_id),
46 stream_(NULL), 48 stream_(NULL),
47 diverting_to_stream_(NULL), 49 diverting_to_stream_(NULL),
48 volume_(1.0), 50 volume_(1.0),
49 state_(kEmpty), 51 state_(kEmpty),
50 num_allowed_io_(0), 52 num_allowed_io_(0),
51 sync_reader_(sync_reader), 53 sync_reader_(sync_reader),
52 message_loop_(audio_manager->GetMessageLoop()), 54 message_loop_(audio_manager->GetMessageLoop()),
53 number_polling_attempts_left_(0), 55 number_polling_attempts_left_(0),
54 weak_this_(this) { 56 weak_this_(this) {
55 DCHECK(audio_manager); 57 DCHECK(audio_manager);
56 DCHECK(handler_); 58 DCHECK(handler_);
57 DCHECK(sync_reader_); 59 DCHECK(sync_reader_);
58 DCHECK(message_loop_.get()); 60 DCHECK(message_loop_.get());
59 } 61 }
60 62
61 AudioOutputController::~AudioOutputController() { 63 AudioOutputController::~AudioOutputController() {
62 DCHECK_EQ(kClosed, state_); 64 DCHECK_EQ(kClosed, state_);
63 } 65 }
64 66
65 // static 67 // static
66 scoped_refptr<AudioOutputController> AudioOutputController::Create( 68 scoped_refptr<AudioOutputController> AudioOutputController::Create(
67 AudioManager* audio_manager, 69 AudioManager* audio_manager,
68 EventHandler* event_handler, 70 EventHandler* event_handler,
69 const AudioParameters& params, 71 const AudioParameters& params,
72 const std::string& input_device_id,
70 SyncReader* sync_reader) { 73 SyncReader* sync_reader) {
71 DCHECK(audio_manager); 74 DCHECK(audio_manager);
72 DCHECK(sync_reader); 75 DCHECK(sync_reader);
73 76
74 if (!params.IsValid() || !audio_manager) 77 if (!params.IsValid() || !audio_manager)
75 return NULL; 78 return NULL;
76 79
77 scoped_refptr<AudioOutputController> controller(new AudioOutputController( 80 scoped_refptr<AudioOutputController> controller(new AudioOutputController(
78 audio_manager, event_handler, params, sync_reader)); 81 audio_manager, event_handler, params, input_device_id, sync_reader));
79 controller->message_loop_->PostTask(FROM_HERE, base::Bind( 82 controller->message_loop_->PostTask(FROM_HERE, base::Bind(
80 &AudioOutputController::DoCreate, controller, false)); 83 &AudioOutputController::DoCreate, controller, false));
81 return controller; 84 return controller;
82 } 85 }
83 86
84 void AudioOutputController::Play() { 87 void AudioOutputController::Play() {
85 message_loop_->PostTask(FROM_HERE, base::Bind( 88 message_loop_->PostTask(FROM_HERE, base::Bind(
86 &AudioOutputController::DoPlay, this)); 89 &AudioOutputController::DoPlay, this));
87 } 90 }
88 91
(...skipping 18 matching lines...) Expand all
107 SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioOutputController.CreateTime"); 110 SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioOutputController.CreateTime");
108 111
109 // Close() can be called before DoCreate() is executed. 112 // Close() can be called before DoCreate() is executed.
110 if (state_ == kClosed) 113 if (state_ == kClosed)
111 return; 114 return;
112 115
113 DoStopCloseAndClearStream(); // Calls RemoveOutputDeviceChangeListener(). 116 DoStopCloseAndClearStream(); // Calls RemoveOutputDeviceChangeListener().
114 DCHECK_EQ(kEmpty, state_); 117 DCHECK_EQ(kEmpty, state_);
115 118
116 stream_ = diverting_to_stream_ ? diverting_to_stream_ : 119 stream_ = diverting_to_stream_ ? diverting_to_stream_ :
117 audio_manager_->MakeAudioOutputStreamProxy(params_); 120 audio_manager_->MakeAudioOutputStreamProxy(params_, input_device_id_);
118 if (!stream_) { 121 if (!stream_) {
119 state_ = kError; 122 state_ = kError;
120 handler_->OnError(); 123 handler_->OnError();
121 return; 124 return;
122 } 125 }
123 126
124 if (!stream_->Open()) { 127 if (!stream_->Open()) {
125 DoStopCloseAndClearStream(); 128 DoStopCloseAndClearStream();
126 state_ = kError; 129 state_ = kError;
127 handler_->OnError(); 130 handler_->OnError();
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 DCHECK(base::AtomicRefCountIsZero(&num_allowed_io_)); 440 DCHECK(base::AtomicRefCountIsZero(&num_allowed_io_));
438 base::AtomicRefCountInc(&num_allowed_io_); 441 base::AtomicRefCountInc(&num_allowed_io_);
439 } 442 }
440 443
441 void AudioOutputController::DisallowEntryToOnMoreIOData() { 444 void AudioOutputController::DisallowEntryToOnMoreIOData() {
442 const bool is_zero = !base::AtomicRefCountDec(&num_allowed_io_); 445 const bool is_zero = !base::AtomicRefCountDec(&num_allowed_io_);
443 DCHECK(is_zero); 446 DCHECK(is_zero);
444 } 447 }
445 448
446 } // namespace media 449 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698