Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 #ifndef MEDIA_AUDIO_AUDIO_INPUT_CONTROLLER_H_ | 5 #ifndef MEDIA_AUDIO_AUDIO_INPUT_CONTROLLER_H_ |
| 6 #define MEDIA_AUDIO_AUDIO_INPUT_CONTROLLER_H_ | 6 #define MEDIA_AUDIO_AUDIO_INPUT_CONTROLLER_H_ |
| 7 | 7 |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 | 10 |
| 11 #include <memory> | 11 #include <memory> |
| 12 #include <string> | 12 #include <string> |
| 13 | 13 |
| 14 #include "base/files/file.h" | 14 #include "base/files/file.h" |
| 15 #include "base/memory/weak_ptr.h" | 15 #include "base/memory/weak_ptr.h" |
| 16 #include "media/audio/audio_file_writer.h" | 16 #include "media/audio/audio_debug_file_writer.h" |
| 17 #include "media/audio/audio_io.h" | 17 #include "media/audio/audio_io.h" |
| 18 #include "media/audio/audio_manager_base.h" | 18 #include "media/audio/audio_manager_base.h" |
| 19 #include "media/base/audio_bus.h" | 19 #include "media/base/audio_bus.h" |
| 20 #include "media/base/audio_parameters.h" | 20 #include "media/base/audio_parameters.h" |
| 21 | 21 |
| 22 // An AudioInputController controls an AudioInputStream and records data | 22 // An AudioInputController controls an AudioInputStream and records data |
| 23 // from this input stream. The two main methods are Record() and Close() and | 23 // from this input stream. The two main methods are Record() and Close() and |
| 24 // they are both executed on the audio thread which is injected by the two | 24 // they are both executed on the audio thread which is injected by the two |
| 25 // alternative factory methods, Create() or CreateForStream(). | 25 // alternative factory methods, Create() or CreateForStream(). |
| 26 // | 26 // |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 153 }; | 153 }; |
| 154 | 154 |
| 155 // Sets the factory used by the static method Create(). AudioInputController | 155 // Sets the factory used by the static method Create(). AudioInputController |
| 156 // does not take ownership of |factory|. A value of NULL results in an | 156 // does not take ownership of |factory|. A value of NULL results in an |
| 157 // AudioInputController being created directly. | 157 // AudioInputController being created directly. |
| 158 static void set_factory_for_testing(Factory* factory) { factory_ = factory; } | 158 static void set_factory_for_testing(Factory* factory) { factory_ = factory; } |
| 159 AudioInputStream* stream_for_testing() { return stream_; } | 159 AudioInputStream* stream_for_testing() { return stream_; } |
| 160 | 160 |
| 161 // The audio device will be created on the audio thread, and when that is | 161 // The audio device will be created on the audio thread, and when that is |
| 162 // done, the event handler will receive an OnCreated() call from that same | 162 // done, the event handler will receive an OnCreated() call from that same |
| 163 // thread. |user_input_monitor| is used for typing detection and can be NULL, | 163 // thread. |user_input_monitor| is used for typing detection and can be NULL. |
| 164 // and |debug_writer| can be null if debug recording is not required. | 164 // |file_task_runner| is used for debug recordings. |
| 165 // TODO(grunell): Move handling of debug recording to AudioManager. | |
| 165 static scoped_refptr<AudioInputController> Create( | 166 static scoped_refptr<AudioInputController> Create( |
| 166 AudioManager* audio_manager, | 167 AudioManager* audio_manager, |
| 167 EventHandler* event_handler, | 168 EventHandler* event_handler, |
| 168 SyncWriter* sync_writer, | 169 SyncWriter* sync_writer, |
| 169 UserInputMonitor* user_input_monitor, | 170 UserInputMonitor* user_input_monitor, |
| 170 std::unique_ptr<AudioFileWriter> debug_writer, | |
| 171 const AudioParameters& params, | 171 const AudioParameters& params, |
| 172 const std::string& device_id, | 172 const std::string& device_id, |
| 173 // External synchronous writer for audio controller. | 173 // External synchronous writer for audio controller. |
| 174 bool agc_is_enabled); | 174 bool agc_is_enabled, |
| 175 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner); | |
| 175 | 176 |
| 176 // Factory method for creating an AudioInputController with an existing | 177 // Factory method for creating an AudioInputController with an existing |
| 177 // |stream|. The stream will be opened on the audio thread, and when that is | 178 // |stream|. The stream will be opened on the audio thread, and when that is |
| 178 // done, the event handler will receive an OnCreated() call from that same | 179 // done, the event handler will receive an OnCreated() call from that same |
| 179 // thread. |user_input_monitor| is used for typing detection and can be NULL. | 180 // thread. |user_input_monitor| is used for typing detection and can be NULL. |
| 181 // |file_task_runner| and |params| are used for debug recordings. | |
| 180 static scoped_refptr<AudioInputController> CreateForStream( | 182 static scoped_refptr<AudioInputController> CreateForStream( |
| 181 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | 183 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
| 182 EventHandler* event_handler, | 184 EventHandler* event_handler, |
| 183 AudioInputStream* stream, | 185 AudioInputStream* stream, |
| 184 // External synchronous writer for audio controller. | 186 // External synchronous writer for audio controller. |
| 185 SyncWriter* sync_writer, | 187 SyncWriter* sync_writer, |
| 186 std::unique_ptr<AudioFileWriter> debug_writer, | 188 UserInputMonitor* user_input_monitor, |
| 187 UserInputMonitor* user_input_monitor); | 189 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, |
| 190 const AudioParameters& params); | |
| 188 | 191 |
| 189 // Starts recording using the created audio input stream. | 192 // Starts recording using the created audio input stream. |
| 190 // This method is called on the creator thread. | 193 // This method is called on the creator thread. |
| 191 virtual void Record(); | 194 virtual void Record(); |
| 192 | 195 |
| 193 // Closes the audio input stream. The state is changed and the resources | 196 // Closes the audio input stream. The state is changed and the resources |
| 194 // are freed on the audio thread. |closed_task| is then executed on the thread | 197 // are freed on the audio thread. |closed_task| is then executed on the thread |
| 195 // that called Close(). | 198 // that called Close(). |
| 196 // Callbacks (EventHandler and SyncWriter) must exist until |closed_task| | 199 // Callbacks (EventHandler and SyncWriter) must exist until |closed_task| |
| 197 // is called. | 200 // is called. |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 246 // SILENCE_STATE_NO_MEASUREMENT | 249 // SILENCE_STATE_NO_MEASUREMENT |
| 247 enum SilenceState { | 250 enum SilenceState { |
| 248 SILENCE_STATE_NO_MEASUREMENT = 0, | 251 SILENCE_STATE_NO_MEASUREMENT = 0, |
| 249 SILENCE_STATE_ONLY_AUDIO = 1, | 252 SILENCE_STATE_ONLY_AUDIO = 1, |
| 250 SILENCE_STATE_ONLY_SILENCE = 2, | 253 SILENCE_STATE_ONLY_SILENCE = 2, |
| 251 SILENCE_STATE_AUDIO_AND_SILENCE = 3, | 254 SILENCE_STATE_AUDIO_AND_SILENCE = 3, |
| 252 SILENCE_STATE_MAX = SILENCE_STATE_AUDIO_AND_SILENCE | 255 SILENCE_STATE_MAX = SILENCE_STATE_AUDIO_AND_SILENCE |
| 253 }; | 256 }; |
| 254 #endif | 257 #endif |
| 255 | 258 |
| 256 AudioInputController(scoped_refptr<base::SingleThreadTaskRunner> task_runner, | 259 AudioInputController( |
| 257 EventHandler* handler, | 260 scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
| 258 SyncWriter* sync_writer, | 261 EventHandler* handler, |
| 259 std::unique_ptr<AudioFileWriter> debug_writer, | 262 SyncWriter* sync_writer, |
| 260 UserInputMonitor* user_input_monitor, | 263 UserInputMonitor* user_input_monitor, |
| 261 StreamType type); | 264 const AudioParameters& params, |
| 265 StreamType type, | |
| 266 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner); | |
|
o1ka
2017/02/21 12:07:45
It may look more comprehensive to have two task ru
Henrik Grunell
2017/02/21 14:10:52
:) I actually started to move it that way when wor
DaleCurtis
2017/02/21 18:01:52
This is just going to be deleted in the next CL, s
Henrik Grunell
2017/02/21 21:07:52
Right, agree. (To be exact: the second next CL; no
| |
| 262 virtual ~AudioInputController(); | 267 virtual ~AudioInputController(); |
| 263 | 268 |
| 264 const scoped_refptr<base::SingleThreadTaskRunner>& GetTaskRunnerForTesting() | 269 const scoped_refptr<base::SingleThreadTaskRunner>& GetTaskRunnerForTesting() |
| 265 const { | 270 const { |
| 266 return task_runner_; | 271 return task_runner_; |
| 267 } | 272 } |
| 268 | 273 |
| 269 EventHandler* GetHandlerForTesting() const { return handler_; } | 274 EventHandler* GetHandlerForTesting() const { return handler_; } |
| 270 | 275 |
| 271 private: | 276 private: |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 360 // The silence report sent as UMA stat at the end of a session. | 365 // The silence report sent as UMA stat at the end of a session. |
| 361 SilenceState silence_state_ = SILENCE_STATE_NO_MEASUREMENT; | 366 SilenceState silence_state_ = SILENCE_STATE_NO_MEASUREMENT; |
| 362 #endif | 367 #endif |
| 363 | 368 |
| 364 size_t prev_key_down_count_ = 0; | 369 size_t prev_key_down_count_ = 0; |
| 365 | 370 |
| 366 // Time when the stream started recording. | 371 // Time when the stream started recording. |
| 367 base::TimeTicks stream_create_time_; | 372 base::TimeTicks stream_create_time_; |
| 368 | 373 |
| 369 // Used for audio debug recordings. Accessed on audio thread. | 374 // Used for audio debug recordings. Accessed on audio thread. |
| 370 const std::unique_ptr<AudioFileWriter> debug_writer_; | 375 const std::unique_ptr<AudioDebugFileWriter> debug_writer_; |
| 371 | 376 |
| 372 class AudioCallback; | 377 class AudioCallback; |
| 373 // Holds a pointer to the callback object that receives audio data from | 378 // Holds a pointer to the callback object that receives audio data from |
| 374 // the lower audio layer. Valid only while 'recording' (between calls to | 379 // the lower audio layer. Valid only while 'recording' (between calls to |
| 375 // stream_->Start() and stream_->Stop()). | 380 // stream_->Start() and stream_->Stop()). |
| 376 // The value of this pointer is only set and read on the audio thread while | 381 // The value of this pointer is only set and read on the audio thread while |
| 377 // the callbacks themselves occur on the hw callback thread. More details | 382 // the callbacks themselves occur on the hw callback thread. More details |
| 378 // in the AudioCallback class in the cc file. | 383 // in the AudioCallback class in the cc file. |
| 379 std::unique_ptr<AudioCallback> audio_callback_; | 384 std::unique_ptr<AudioCallback> audio_callback_; |
| 380 | 385 |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 391 // The weak_ptr_factory_ and all outstanding weak pointers, are invalidated | 396 // The weak_ptr_factory_ and all outstanding weak pointers, are invalidated |
| 392 // at the end of DoClose. | 397 // at the end of DoClose. |
| 393 base::WeakPtrFactory<AudioInputController> weak_ptr_factory_; | 398 base::WeakPtrFactory<AudioInputController> weak_ptr_factory_; |
| 394 | 399 |
| 395 DISALLOW_COPY_AND_ASSIGN(AudioInputController); | 400 DISALLOW_COPY_AND_ASSIGN(AudioInputController); |
| 396 }; | 401 }; |
| 397 | 402 |
| 398 } // namespace media | 403 } // namespace media |
| 399 | 404 |
| 400 #endif // MEDIA_AUDIO_AUDIO_INPUT_CONTROLLER_H_ | 405 #endif // MEDIA_AUDIO_AUDIO_INPUT_CONTROLLER_H_ |
| OLD | NEW |