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

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

Issue 23466008: Wire up the output device id and provide an implementation on Windows. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Switch argument order in AudioOutputController for consistency Created 7 years, 3 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
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/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
(...skipping 14 matching lines...) Expand all
25 static const int kPowerMeasurementTimeConstantMillis = 10; 25 static const int kPowerMeasurementTimeConstantMillis = 10;
26 26
27 // Desired frequency of calls to EventHandler::OnPowerMeasured() for reporting 27 // Desired frequency of calls to EventHandler::OnPowerMeasured() for reporting
28 // power levels in the audio signal. 28 // power levels in the audio signal.
29 static const int kPowerMeasurementsPerSecond = 30; 29 static const int kPowerMeasurementsPerSecond = 30;
30 30
31 // Polling-related constants. 31 // Polling-related constants.
32 const int AudioOutputController::kPollNumAttempts = 3; 32 const int AudioOutputController::kPollNumAttempts = 3;
33 const int AudioOutputController::kPollPauseInMilliseconds = 3; 33 const int AudioOutputController::kPollPauseInMilliseconds = 3;
34 34
35 AudioOutputController::AudioOutputController(AudioManager* audio_manager, 35 AudioOutputController::AudioOutputController(
36 EventHandler* handler, 36 AudioManager* audio_manager,
37 const AudioParameters& params, 37 EventHandler* handler,
38 const std::string& input_device_id, 38 const AudioParameters& params,
39 SyncReader* sync_reader) 39 const std::string& output_device_id,
40 const std::string& input_device_id,
41 SyncReader* sync_reader)
40 : audio_manager_(audio_manager), 42 : audio_manager_(audio_manager),
41 params_(params), 43 params_(params),
42 handler_(handler), 44 handler_(handler),
45 output_device_id_(output_device_id),
43 input_device_id_(input_device_id), 46 input_device_id_(input_device_id),
44 stream_(NULL), 47 stream_(NULL),
45 diverting_to_stream_(NULL), 48 diverting_to_stream_(NULL),
46 volume_(1.0), 49 volume_(1.0),
47 state_(kEmpty), 50 state_(kEmpty),
48 num_allowed_io_(0), 51 num_allowed_io_(0),
49 sync_reader_(sync_reader), 52 sync_reader_(sync_reader),
50 message_loop_(audio_manager->GetMessageLoop()), 53 message_loop_(audio_manager->GetMessageLoop()),
51 number_polling_attempts_left_(0), 54 number_polling_attempts_left_(0),
52 power_monitor_( 55 power_monitor_(
53 params.sample_rate(), 56 params.sample_rate(),
54 TimeDelta::FromMilliseconds(kPowerMeasurementTimeConstantMillis)) { 57 TimeDelta::FromMilliseconds(kPowerMeasurementTimeConstantMillis)) {
55 DCHECK(audio_manager); 58 DCHECK(audio_manager);
56 DCHECK(handler_); 59 DCHECK(handler_);
57 DCHECK(sync_reader_); 60 DCHECK(sync_reader_);
58 DCHECK(message_loop_.get()); 61 DCHECK(message_loop_.get());
59 } 62 }
60 63
61 AudioOutputController::~AudioOutputController() { 64 AudioOutputController::~AudioOutputController() {
62 DCHECK_EQ(kClosed, state_); 65 DCHECK_EQ(kClosed, state_);
63 } 66 }
64 67
65 // static 68 // static
66 scoped_refptr<AudioOutputController> AudioOutputController::Create( 69 scoped_refptr<AudioOutputController> AudioOutputController::Create(
67 AudioManager* audio_manager, 70 AudioManager* audio_manager,
68 EventHandler* event_handler, 71 EventHandler* event_handler,
69 const AudioParameters& params, 72 const AudioParameters& params,
73 const std::string& output_device_id,
70 const std::string& input_device_id, 74 const std::string& input_device_id,
71 SyncReader* sync_reader) { 75 SyncReader* sync_reader) {
72 DCHECK(audio_manager); 76 DCHECK(audio_manager);
73 DCHECK(sync_reader); 77 DCHECK(sync_reader);
74 78
75 if (!params.IsValid() || !audio_manager) 79 if (!params.IsValid() || !audio_manager)
76 return NULL; 80 return NULL;
77 81
78 scoped_refptr<AudioOutputController> controller(new AudioOutputController( 82 scoped_refptr<AudioOutputController> controller(new AudioOutputController(
79 audio_manager, event_handler, params, input_device_id, sync_reader)); 83 audio_manager, event_handler, params, output_device_id, input_device_id,
84 sync_reader));
80 controller->message_loop_->PostTask(FROM_HERE, base::Bind( 85 controller->message_loop_->PostTask(FROM_HERE, base::Bind(
81 &AudioOutputController::DoCreate, controller, false)); 86 &AudioOutputController::DoCreate, controller, false));
82 return controller; 87 return controller;
83 } 88 }
84 89
85 void AudioOutputController::Play() { 90 void AudioOutputController::Play() {
86 message_loop_->PostTask(FROM_HERE, base::Bind( 91 message_loop_->PostTask(FROM_HERE, base::Bind(
87 &AudioOutputController::DoPlay, this)); 92 &AudioOutputController::DoPlay, this));
88 } 93 }
89 94
(...skipping 17 matching lines...) Expand all
107 DCHECK(message_loop_->BelongsToCurrentThread()); 112 DCHECK(message_loop_->BelongsToCurrentThread());
108 SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioOutputController.CreateTime"); 113 SCOPED_UMA_HISTOGRAM_TIMER("Media.AudioOutputController.CreateTime");
109 114
110 // Close() can be called before DoCreate() is executed. 115 // Close() can be called before DoCreate() is executed.
111 if (state_ == kClosed) 116 if (state_ == kClosed)
112 return; 117 return;
113 118
114 DoStopCloseAndClearStream(); // Calls RemoveOutputDeviceChangeListener(). 119 DoStopCloseAndClearStream(); // Calls RemoveOutputDeviceChangeListener().
115 DCHECK_EQ(kEmpty, state_); 120 DCHECK_EQ(kEmpty, state_);
116 121
117 stream_ = diverting_to_stream_ ? diverting_to_stream_ : 122 stream_ = diverting_to_stream_ ?
118 audio_manager_->MakeAudioOutputStreamProxy(params_, "", input_device_id_); 123 diverting_to_stream_ :
124 audio_manager_->MakeAudioOutputStreamProxy(params_, output_device_id_,
125 input_device_id_);
119 if (!stream_) { 126 if (!stream_) {
120 state_ = kError; 127 state_ = kError;
121 handler_->OnError(); 128 handler_->OnError();
122 return; 129 return;
123 } 130 }
124 131
125 if (!stream_->Open()) { 132 if (!stream_->Open()) {
126 DoStopCloseAndClearStream(); 133 DoStopCloseAndClearStream();
127 state_ = kError; 134 state_ = kError;
128 handler_->OnError(); 135 handler_->OnError();
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 DCHECK(base::AtomicRefCountIsZero(&num_allowed_io_)); 397 DCHECK(base::AtomicRefCountIsZero(&num_allowed_io_));
391 base::AtomicRefCountInc(&num_allowed_io_); 398 base::AtomicRefCountInc(&num_allowed_io_);
392 } 399 }
393 400
394 void AudioOutputController::DisallowEntryToOnMoreIOData() { 401 void AudioOutputController::DisallowEntryToOnMoreIOData() {
395 const bool is_zero = !base::AtomicRefCountDec(&num_allowed_io_); 402 const bool is_zero = !base::AtomicRefCountDec(&num_allowed_io_);
396 DCHECK(is_zero); 403 DCHECK(is_zero);
397 } 404 }
398 405
399 } // namespace media 406 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698