Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(105)

Unified Diff: webrtc/modules/audio_device/audio_device_buffer.h

Issue 2466613002: Adds thread safety annotations to the AudioDeviceBuffer class (Closed)
Patch Set: Improved thread annotation Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/modules/audio_device/audio_device_buffer.h
diff --git a/webrtc/modules/audio_device/audio_device_buffer.h b/webrtc/modules/audio_device/audio_device_buffer.h
index 7e9f3e3eec30105a5971727002fe9b8bb39d87eb..1cd04acc157a69cd6fb53da0290a42a2fb4f10dd 100644
--- a/webrtc/modules/audio_device/audio_device_buffer.h
+++ b/webrtc/modules/audio_device/audio_device_buffer.h
@@ -14,6 +14,7 @@
#include "webrtc/base/buffer.h"
#include "webrtc/base/criticalsection.h"
#include "webrtc/base/task_queue.h"
+#include "webrtc/base/thread_annotations.h"
#include "webrtc/base/thread_checker.h"
#include "webrtc/modules/audio_device/include/audio_device.h"
#include "webrtc/system_wrappers/include/file_wrapper.h"
@@ -47,27 +48,27 @@ class AudioDeviceBuffer {
void StopPlayout();
void StopRecording();
- int32_t SetRecordingSampleRate(uint32_t fsHz);
- int32_t SetPlayoutSampleRate(uint32_t fsHz);
+ int32_t SetRecordingSampleRate(uint32_t fsHz) LOCKS_EXCLUDED(lock_);
+ int32_t SetPlayoutSampleRate(uint32_t fsHz) LOCKS_EXCLUDED(lock_);
int32_t RecordingSampleRate() const;
int32_t PlayoutSampleRate() const;
- int32_t SetRecordingChannels(size_t channels);
- int32_t SetPlayoutChannels(size_t channels);
+ int32_t SetRecordingChannels(size_t channels) LOCKS_EXCLUDED(lock_);
+ int32_t SetPlayoutChannels(size_t channels) LOCKS_EXCLUDED(lock_);
size_t RecordingChannels() const;
size_t PlayoutChannels() const;
int32_t SetRecordingChannel(const AudioDeviceModule::ChannelType channel);
int32_t RecordingChannel(AudioDeviceModule::ChannelType& channel) const;
virtual int32_t SetRecordedBuffer(const void* audio_buffer,
- size_t num_samples);
+ size_t num_samples) LOCKS_EXCLUDED(lock_);
int32_t SetCurrentMicLevel(uint32_t level);
virtual void SetVQEData(int play_delay_ms, int rec_delay_ms, int clock_drift);
- virtual int32_t DeliverRecordedData();
+ virtual int32_t DeliverRecordedData() LOCKS_EXCLUDED(lock_);
uint32_t NewMicLevel() const;
- virtual int32_t RequestPlayoutData(size_t num_samples);
- virtual int32_t GetPlayoutData(void* audio_buffer);
+ virtual int32_t RequestPlayoutData(size_t num_samples) LOCKS_EXCLUDED(lock_);
+ virtual int32_t GetPlayoutData(void* audio_buffer) LOCKS_EXCLUDED(lock_);
// TODO(henrika): these methods should not be used and does not contain any
// valid implementation. Investigate the possibility to either remove them
@@ -103,19 +104,20 @@ class AudioDeviceBuffer {
void ResetRecStats();
void ResetPlayStats();
- // Ensures that methods are called on the same thread as the thread that
- // creates this object.
rtc::ThreadChecker thread_checker_;
kwiberg-webrtc 2016/11/02 14:14:57 Could this one get a descriptive name too?
henrika_webrtc 2016/11/02 16:23:24 Done.
+ rtc::ThreadChecker playout_thread_checker_;
+ rtc::ThreadChecker recording_thread_checker_;
+
+ rtc::CriticalSection lock_;
kwiberg-webrtc 2016/11/02 14:14:57 OK, *three* thread checkers... *and* a lock. I'd l
henrika_webrtc 2016/11/02 16:23:24 It is actually not that complicated. Let me try to
// Raw pointer to AudioTransport instance. Supplied to RegisterAudioCallback()
- // and it must outlive this object.
+ // and it must outlive this object. It is not possible to change this member
+ // while any media is active. It is possible to start media without calling
+ // RegisterAudioCallback() but that will lead to ignored audio callbacks in
+ // both directions where native audio will be acive but no audio samples will
+ // be transported.
AudioTransport* audio_transport_cb_;
- // TODO(henrika): given usage of thread checker, it should be possible to
- // remove all locks in this class.
- rtc::CriticalSection lock_;
- rtc::CriticalSection lock_cb_;
-
// Task queue used to invoke LogStats() periodically. Tasks are executed on a
// worker thread but it does not necessarily have to be the same thread for
// each task.
@@ -124,74 +126,79 @@ class AudioDeviceBuffer {
// Keeps track of if playout/recording are active or not. A combination
// of these states are used to determine when to start and stop the timer.
// Only used on the creating thread and not used to control any media flow.
- bool playing_;
- bool recording_;
+ bool playing_ ACCESS_ON(thread_checker_);
+ bool recording_ ACCESS_ON(thread_checker_);
// Sample rate in Hertz.
- uint32_t rec_sample_rate_;
- uint32_t play_sample_rate_;
+ uint32_t rec_sample_rate_ GUARDED_BY(lock_);
+ uint32_t play_sample_rate_ GUARDED_BY(lock_);
// Number of audio channels.
- size_t rec_channels_;
- size_t play_channels_;
-
- // Number of bytes per audio sample (2 or 4).
- size_t rec_bytes_per_sample_;
- size_t play_bytes_per_sample_;
+ size_t rec_channels_ GUARDED_BY(lock_);
+ size_t play_channels_ GUARDED_BY(lock_);
// Byte buffer used for recorded audio samples. Size can be changed
// dynamically.
- rtc::Buffer rec_buffer_;
+ rtc::Buffer rec_buffer_ ACCESS_ON(recording_thread_checker_);
// Buffer used for audio samples to be played out. Size can be changed
// dynamically.
- rtc::Buffer play_buffer_;
+ rtc::Buffer play_buffer_ ACCESS_ON(playout_thread_checker_);
// AGC parameters.
- uint32_t current_mic_level_;
- uint32_t new_mic_level_;
+ uint32_t current_mic_level_ ACCESS_ON(recording_thread_checker_);
+ uint32_t new_mic_level_ ACCESS_ON(recording_thread_checker_);
// Contains true of a key-press has been detected.
- bool typing_status_;
+ bool typing_status_ ACCESS_ON(recording_thread_checker_);
// Delay values used by the AEC.
- int play_delay_ms_;
- int rec_delay_ms_;
+ int play_delay_ms_ ACCESS_ON(recording_thread_checker_);
+ int rec_delay_ms_ ACCESS_ON(recording_thread_checker_);
// Contains a clock-drift measurement.
- int clock_drift_;
+ int clock_drift_ ACCESS_ON(recording_thread_checker_);
// Counts number of times LogStats() has been called.
- size_t num_stat_reports_;
+ size_t num_stat_reports_ ACCESS_ON(task_queue_);
kwiberg-webrtc 2016/11/02 14:14:57 Aha, a task queue annotation. Excellent!
henrika_webrtc 2016/11/02 16:23:24 ;-)
// Total number of recording callbacks where the source provides 10ms audio
// data each time.
- uint64_t rec_callbacks_;
+ uint64_t rec_callbacks_ ACCESS_ON(task_queue_);
// Total number of recording callbacks stored at the last timer task.
- uint64_t last_rec_callbacks_;
+ uint64_t last_rec_callbacks_ ACCESS_ON(task_queue_);
// Total number of playback callbacks where the sink asks for 10ms audio
// data each time.
- uint64_t play_callbacks_;
+ uint64_t play_callbacks_ ACCESS_ON(task_queue_);
// Total number of playout callbacks stored at the last timer task.
- uint64_t last_play_callbacks_;
+ uint64_t last_play_callbacks_ ACCESS_ON(task_queue_);
// Total number of recorded audio samples.
- uint64_t rec_samples_;
+ uint64_t rec_samples_ ACCESS_ON(task_queue_);
// Total number of recorded samples stored at the previous timer task.
- uint64_t last_rec_samples_;
+ uint64_t last_rec_samples_ ACCESS_ON(task_queue_);
// Total number of played audio samples.
- uint64_t play_samples_;
+ uint64_t play_samples_ ACCESS_ON(task_queue_);
// Total number of played samples stored at the previous timer task.
- uint64_t last_play_samples_;
+ uint64_t last_play_samples_ ACCESS_ON(task_queue_);
+
+ // Contains max level (max(abs(x))) of recorded audio packets over the last
+ // 10 seconds where a new measurement is done twice per second. The level
+ // is reset to zero at each call to LogStats().
+ int16_t max_rec_level_ ACCESS_ON(task_queue_);
+
+ // Contains max level of recorded audio packets over the last 10 seconds
+ // where a new measurement is done twice per second.
+ int16_t max_play_level_ ACCESS_ON(task_queue_);
// Time stamp of last timer task (drives logging).
- uint64_t last_timer_task_time_;
+ uint64_t last_timer_task_time_ ACCESS_ON(task_queue_);
// Time stamp of last playout callback.
uint64_t last_playout_time_;
@@ -203,25 +210,14 @@ class AudioDeviceBuffer {
// destruction when no audio is running.
uint32_t playout_diff_times_[kMaxDeltaTimeInMs + 1] = {0};
- // Contains max level (max(abs(x))) of recorded audio packets over the last
- // 10 seconds where a new measurement is done twice per second. The level
- // is reset to zero at each call to LogStats(). Only modified on the task
- // queue thread.
- int16_t max_rec_level_;
-
- // Contains max level of recorded audio packets over the last 10 seconds
- // where a new measurement is done twice per second.
- int16_t max_play_level_;
-
// Counts number of audio callbacks modulo 50 to create a signal when
// a new storage of audio stats shall be done.
- // Only updated on the OS-specific audio thread that drives audio.
- int16_t rec_stat_count_;
- int16_t play_stat_count_;
+ int16_t rec_stat_count_ ACCESS_ON(recording_thread_checker_);
+ int16_t play_stat_count_ ACCESS_ON(playout_thread_checker_);
// Time stamps of when playout and recording starts.
- uint64_t play_start_time_;
- uint64_t rec_start_time_;
+ uint64_t play_start_time_ ACCESS_ON(thread_checker_);
+ uint64_t rec_start_time_ ACCESS_ON(thread_checker_);;
// Set to true at construction and modified to false as soon as one audio-
// level estimate larger than zero is detected.
« no previous file with comments | « no previous file | webrtc/modules/audio_device/audio_device_buffer.cc » ('j') | webrtc/modules/audio_device/audio_device_buffer.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698