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, |