Chromium Code Reviews| Index: media/audio/audio_debug_file_writer.cc |
| diff --git a/media/audio/audio_debug_file_writer.cc b/media/audio/audio_debug_file_writer.cc |
| index ba181e9e4c24f3f98c27e20d3323e83884f139f2..c79bce1f5c0344b06b3a9254319b2f94c235804c 100644 |
| --- a/media/audio/audio_debug_file_writer.cc |
| +++ b/media/audio/audio_debug_file_writer.cc |
| @@ -12,6 +12,7 @@ |
| #include "base/logging.h" |
| #include "base/memory/ptr_util.h" |
| #include "base/sys_byteorder.h" |
| +#include "base/threading/thread_restrictions.h" |
| #include "media/base/audio_bus.h" |
| #include "media/base/audio_sample_types.h" |
| @@ -134,27 +135,22 @@ void WriteWavHeader(WavHeaderBuffer* buf, |
| } // namespace |
| // Manages the debug recording file and writes to it. Can be created on any |
| -// thread. All the operations must be executed on |task_runner_|. Must be |
| -// destroyed on |task_runner_|. |
| +// thread. All the operations must be executed on a thread that has IO |
| +// permissions. |
| class AudioDebugFileWriter::AudioFileWriter { |
| public: |
| static AudioFileWriterUniquePtr Create( |
| const base::FilePath& file_name, |
| const AudioParameters& params, |
| - scoped_refptr<base::SingleThreadTaskRunner> task_runner); |
| + scoped_refptr<base::SequencedTaskRunner> task_runner); |
| ~AudioFileWriter(); |
| // Write data from |data| to file. |
| void Write(const AudioBus* data); |
| - scoped_refptr<base::SingleThreadTaskRunner> task_runner() { |
| - return task_runner_; |
| - } |
| - |
| private: |
| - AudioFileWriter(const AudioParameters& params, |
| - scoped_refptr<base::SingleThreadTaskRunner> task_runner); |
| + AudioFileWriter(const AudioParameters& params); |
| // Write wave header to file. Called on the |task_runner_| twice: on |
| // construction |
| @@ -179,25 +175,23 @@ class AudioDebugFileWriter::AudioFileWriter { |
| std::unique_ptr<int16_t[]> interleaved_data_; |
| int interleaved_data_size_; |
| - // The task runner this class operates on. |
| - scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
| + SEQUENCE_CHECKER(sequence_checker_); |
| }; |
| -AudioDebugFileWriter::OnThreadDeleter::OnThreadDeleter() {} |
| +AudioDebugFileWriter::OnSequenceDeleter::OnSequenceDeleter() {} |
| -AudioDebugFileWriter::OnThreadDeleter::OnThreadDeleter( |
| - const OnThreadDeleter& other) |
| +AudioDebugFileWriter::OnSequenceDeleter::OnSequenceDeleter( |
| + const OnSequenceDeleter& other) |
| : task_runner_(other.task_runner_) {} |
| -AudioDebugFileWriter::OnThreadDeleter::OnThreadDeleter( |
| - scoped_refptr<base::SingleThreadTaskRunner> task_runner) |
| +AudioDebugFileWriter::OnSequenceDeleter::OnSequenceDeleter( |
| + scoped_refptr<base::SequencedTaskRunner> task_runner) |
| : task_runner_(task_runner) {} |
|
gab
2017/05/18 20:38:17
std::move(task_runner)
Sébastien Marchand
2017/05/18 21:24:25
Done.
|
| -AudioDebugFileWriter::OnThreadDeleter::~OnThreadDeleter() {} |
| +AudioDebugFileWriter::OnSequenceDeleter::~OnSequenceDeleter() {} |
| -// AudioFileWriter deleter. Inspired by |
| -// content::BrowserThread::DeleteOnFileThread. |
| -void AudioDebugFileWriter::OnThreadDeleter::operator()( |
| +// AudioFileWriter deleter. |
| +void AudioDebugFileWriter::OnSequenceDeleter::operator()( |
| AudioDebugFileWriter::AudioFileWriter* ptr) const { |
| if (!task_runner_->DeleteSoon(FROM_HERE, ptr)) { |
| #if defined(UNIT_TEST) |
| @@ -213,9 +207,9 @@ AudioDebugFileWriter::AudioFileWriterUniquePtr |
| AudioDebugFileWriter::AudioFileWriter::Create( |
| const base::FilePath& file_name, |
| const AudioParameters& params, |
| - scoped_refptr<base::SingleThreadTaskRunner> task_runner) { |
| - AudioFileWriterUniquePtr file_writer(new AudioFileWriter(params, task_runner), |
| - OnThreadDeleter(task_runner)); |
| + scoped_refptr<base::SequencedTaskRunner> task_runner) { |
| + AudioFileWriterUniquePtr file_writer(new AudioFileWriter(params), |
| + OnSequenceDeleter(task_runner)); |
| // base::Unretained is safe, because destructor is called on |
| // |task_runner|. |
| @@ -227,21 +221,19 @@ AudioDebugFileWriter::AudioFileWriter::Create( |
| } |
| AudioDebugFileWriter::AudioFileWriter::AudioFileWriter( |
| - const AudioParameters& params, |
| - scoped_refptr<base::SingleThreadTaskRunner> task_runner) |
| - : samples_(0), |
| - params_(params), |
| - interleaved_data_size_(0), |
| - task_runner_(std::move(task_runner)) {} |
| + const AudioParameters& params) |
| + : samples_(0), params_(params), interleaved_data_size_(0) { |
| + DETACH_FROM_SEQUENCE(sequence_checker_); |
| +} |
| AudioDebugFileWriter::AudioFileWriter::~AudioFileWriter() { |
| - DCHECK(task_runner_->BelongsToCurrentThread()); |
| + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| if (file_.IsValid()) |
| WriteHeader(); |
| } |
| void AudioDebugFileWriter::AudioFileWriter::Write(const AudioBus* data) { |
| - DCHECK(task_runner_->BelongsToCurrentThread()); |
| + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| DCHECK_EQ(params_.channels(), data->channels()); |
| if (!file_.IsValid()) |
| return; |
| @@ -268,7 +260,7 @@ void AudioDebugFileWriter::AudioFileWriter::Write(const AudioBus* data) { |
| } |
| void AudioDebugFileWriter::AudioFileWriter::WriteHeader() { |
| - DCHECK(task_runner_->BelongsToCurrentThread()); |
| + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| if (!file_.IsValid()) |
| return; |
| WavHeaderBuffer buf; |
| @@ -282,7 +274,8 @@ void AudioDebugFileWriter::AudioFileWriter::WriteHeader() { |
| void AudioDebugFileWriter::AudioFileWriter::CreateRecordingFile( |
| const base::FilePath& file_name) { |
| - DCHECK(task_runner_->BelongsToCurrentThread()); |
| + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| + base::ThreadRestrictions::AssertIOAllowed(); |
| DCHECK(!file_.IsValid()); |
| file_ = base::File(file_name, |