| 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..583f9433b8198ce6da5e0ca646de771d23f879c0 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,26 @@ 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::OnSequenceDeleter::OnSequenceDeleter(
|
| + AudioDebugFileWriter::OnSequenceDeleter&& other) = default;
|
|
|
| -AudioDebugFileWriter::OnThreadDeleter::OnThreadDeleter(
|
| - const OnThreadDeleter& other)
|
| - : task_runner_(other.task_runner_) {}
|
| +AudioDebugFileWriter::OnSequenceDeleter&
|
| +AudioDebugFileWriter::OnSequenceDeleter::operator=(
|
| + AudioDebugFileWriter::OnSequenceDeleter&&) = default;
|
|
|
| -AudioDebugFileWriter::OnThreadDeleter::OnThreadDeleter(
|
| - scoped_refptr<base::SingleThreadTaskRunner> task_runner)
|
| - : task_runner_(task_runner) {}
|
| +AudioDebugFileWriter::OnSequenceDeleter::OnSequenceDeleter(
|
| + scoped_refptr<base::SequencedTaskRunner> task_runner)
|
| + : task_runner_(std::move(task_runner)) {}
|
|
|
| -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 +210,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 +224,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 +263,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 +277,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,
|
|
|