Index: media/audio/audio_debug_recording_helper.h |
diff --git a/media/audio/audio_debug_recording_helper.h b/media/audio/audio_debug_recording_helper.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c5611a4842a4706e7d05087abd08a798add1dc37 |
--- /dev/null |
+++ b/media/audio/audio_debug_recording_helper.h |
@@ -0,0 +1,104 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef MEDIA_AUDIO_AUDIO_DEBUG_RECORDING_HELPER_H_ |
+#define MEDIA_AUDIO_AUDIO_DEBUG_RECORDING_HELPER_H_ |
+ |
+#include <memory> |
+ |
+#include "base/atomicops.h" |
+#include "base/callback.h" |
+#include "base/gtest_prod_util.h" |
+#include "base/memory/weak_ptr.h" |
+#include "base/threading/thread_checker.h" |
+#include "media/audio/audio_debug_file_writer.h" |
+#include "media/base/audio_parameters.h" |
+#include "media/base/media_export.h" |
+ |
+namespace base { |
+class FilePath; |
+class SingleThreadTaskRunner; |
+} |
+ |
+namespace media { |
+ |
+class AudioBus; |
+ |
+// Interface for feeding data to a recorder. |
+class AudioDebugRecorder { |
+ public: |
+ virtual ~AudioDebugRecorder() {} |
+ |
+ // If debug recording is enabled, copies audio data and makes sure it's |
+ // written on the right thread. Otherwise ignores the data. Can be called on |
+ // any thread. |
+ virtual void OnData(const AudioBus* source) = 0; |
+}; |
+ |
+// A helper class for those who want to use AudioDebugFileWriter. It handles |
+// copying AudioBus data, thread jump (OnData() can be called on any |
+// thread), and creating and deleting the AudioDebugFileWriter at enable and |
+// disable. All functions except OnData() must be called on the thread |
+// |task_runner| belongs to. |
+// TODO(grunell): When input debug recording is moved to AudioManager, it should |
+// be possible to merge this class into AudioDebugFileWriter. One thread jump |
+// could be skipped then. Currently we have |
+// soundcard thread -> control thread -> file thread, |
+// and with the merge we should be able to do |
+// soundcard thread -> file thread. |
+class MEDIA_EXPORT AudioDebugRecordingHelper |
+ : public NON_EXPORTED_BASE(AudioDebugRecorder) { |
+ public: |
+ AudioDebugRecordingHelper( |
+ const AudioParameters& params, |
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
+ scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, |
+ base::OnceClosure on_destruction_closure); |
+ ~AudioDebugRecordingHelper() override; |
+ |
+ // Enable debug recording. The create callback is first run to create an |
+ // AudioDebugFileWriter. |
+ virtual void EnableDebugRecording(const base::FilePath& file_name); |
+ |
+ // Disable debug recording. The AudioDebugFileWriter is destroyed. |
+ virtual void DisableDebugRecording(); |
+ |
+ // AudioDebugRecorder implementation. Can be called on any thread. |
+ void OnData(const AudioBus* source) override; |
+ |
+ private: |
+ FRIEND_TEST_ALL_PREFIXES(AudioDebugRecordingHelperTest, EnableDisable); |
+ FRIEND_TEST_ALL_PREFIXES(AudioDebugRecordingHelperTest, OnData); |
+ |
+ // Writes debug data to |debug_writer_|. |
+ void DoWrite(std::unique_ptr<media::AudioBus> data); |
+ |
+ // Creates an AudioDebugFileWriter. Overridden by test. |
+ virtual std::unique_ptr<AudioDebugFileWriter> CreateAudioDebugFileWriter( |
+ const AudioParameters& params, |
+ scoped_refptr<base::SingleThreadTaskRunner> file_task_runner); |
+ |
+ const AudioParameters params_; |
+ std::unique_ptr<AudioDebugFileWriter> debug_writer_; |
+ |
+ // Used as a flag to indicate if recording is enabled, accessed on different |
+ // threads. |
+ base::subtle::Atomic32 recording_enabled_; |
+ |
+ // The task runner for accessing |debug_writer_|. |
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
+ |
+ // Task runner passed to |debug_writer_| to do file output operations on. |
+ scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_; |
+ |
+ // Runs in destructor if set. |
+ base::OnceClosure on_destruction_closure_; |
+ |
+ base::WeakPtrFactory<AudioDebugRecordingHelper> weak_factory_; |
+ DISALLOW_COPY_AND_ASSIGN(AudioDebugRecordingHelper); |
+}; |
+ |
+} // namespace media |
+ |
+#endif // MEDIA_AUDIO_AUDIO_DEBUG_RECORDING_HELPER_H_ |