Skip to content

Commit cdd5484

Browse files
committed
Merge M72: "Cleanup comments and interfaces for AudioRendererMixer+Input."
Some cleanups I noticed while working on adding the async callback; does the following: - Fixes some spelling errors. - Removes the need to save a callback to subscribe for errors. - Removes a stale comment associated with the error callbcks. - Removes some unused methods from the ARM interface. - Always posts the OutputDeviceInfoCB per documented contract. - Switches to "using", "RepeatingCallback", etc where appropriate. - Switches to base::flat_set/map where appropriate. BUG=905506 TEST=existing tests all pass. Change-Id: Ib670c04ed59b98b07c18cc3f3afac44d802a2a68 Reviewed-on: https://chromium-review.googlesource.com/c/1357540 Reviewed-by: Olga Sharonova <[email protected]> Commit-Queue: Dale Curtis <[email protected]> Cr-Original-Commit-Position: refs/heads/master@{#613731}(cherry picked from commit 3b3f55b) Reviewed-on: https://chromium-review.googlesource.com/c/1362216 Reviewed-by: Dale Curtis <[email protected]> Cr-Commit-Position: refs/branch-heads/3626@{#51} Cr-Branched-From: d897fb1-refs/heads/master@{#612437}
1 parent 38e8f7e commit cdd5484

7 files changed

+79
-98
lines changed

content/renderer/media/audio/audio_renderer_mixer_manager.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ media::AudioRendererMixer* AudioRendererMixerManager::GetMixer(
211211
GetMixerOutputParams(input_params, sink_info.output_params(), latency);
212212
media::AudioRendererMixer* mixer = new media::AudioRendererMixer(
213213
mixer_output_params, std::move(sink),
214-
base::BindRepeating(LogMixerUmaHistogram, latency));
214+
base::BindRepeating(&LogMixerUmaHistogram, latency));
215215
mixers_[key] = {mixer, 1};
216216
DVLOG(1) << __func__ << " mixer: " << mixer << " latency: " << latency
217217
<< "\n input: " << input_params.AsHumanReadableString()

content/renderer/media/audio/audio_renderer_mixer_manager.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,13 @@ class CONTENT_EXPORT AudioRendererMixerManager
6060
media::AudioLatency::LatencyType latency);
6161

6262
// AudioRendererMixerPool implementation.
63-
6463
media::AudioRendererMixer* GetMixer(
6564
int source_render_frame_id,
6665
const media::AudioParameters& input_params,
6766
media::AudioLatency::LatencyType latency,
6867
const media::OutputDeviceInfo& sink_info,
6968
scoped_refptr<media::AudioRendererSink> sink) final;
70-
7169
void ReturnMixer(media::AudioRendererMixer* mixer) final;
72-
7370
scoped_refptr<media::AudioRendererSink> GetSink(
7471
int source_render_frame_id,
7572
const std::string& device_id) final;

content/renderer/media/audio/audio_renderer_mixer_manager_unittest.cc

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -564,21 +564,21 @@ TEST_F(AudioRendererMixerManagerTest, MixerParamsLatencyPlayback) {
564564

565565
if (AudioLatency::IsResamplingPassthroughSupported(params.latency_tag())) {
566566
// Expecting input sample rate
567-
EXPECT_EQ(32000, mixer->GetOutputParamsForTesting().sample_rate());
567+
EXPECT_EQ(32000, mixer->get_output_params_for_testing().sample_rate());
568568
// Round up 20 ms (640) to the power of 2.
569-
EXPECT_EQ(1024, mixer->GetOutputParamsForTesting().frames_per_buffer());
569+
EXPECT_EQ(1024, mixer->get_output_params_for_testing().frames_per_buffer());
570570
} else {
571571
// Expecting hardware sample rate
572-
EXPECT_EQ(44100, mixer->GetOutputParamsForTesting().sample_rate());
572+
EXPECT_EQ(44100, mixer->get_output_params_for_testing().sample_rate());
573573

574574
// 20 ms at 44100 is 882 frames per buffer.
575575
#if defined(OS_WIN)
576576
// Round up 882 to the nearest multiple of the output buffer size (128).
577577
// which is 7 * 128 = 896
578-
EXPECT_EQ(896, mixer->GetOutputParamsForTesting().frames_per_buffer());
578+
EXPECT_EQ(896, mixer->get_output_params_for_testing().frames_per_buffer());
579579
#else
580580
// Round up 882 to the power of 2.
581-
EXPECT_EQ(1024, mixer->GetOutputParamsForTesting().frames_per_buffer());
581+
EXPECT_EQ(1024, mixer->get_output_params_for_testing().frames_per_buffer());
582582
#endif // defined(OS_WIN)
583583
}
584584

@@ -606,14 +606,14 @@ TEST_F(AudioRendererMixerManagerTest,
606606
// 20 ms at 44100 is 882 frames per buffer.
607607
if (AudioLatency::IsResamplingPassthroughSupported(params.latency_tag())) {
608608
// Expecting input sample rate
609-
EXPECT_EQ(32000, mixer->GetOutputParamsForTesting().sample_rate());
609+
EXPECT_EQ(32000, mixer->get_output_params_for_testing().sample_rate());
610610
} else {
611611
// Expecting hardware sample rate
612-
EXPECT_EQ(44100, mixer->GetOutputParamsForTesting().sample_rate());
612+
EXPECT_EQ(44100, mixer->get_output_params_for_testing().sample_rate());
613613
}
614614

615615
// Prefer device buffer size (2048) if is larger than 20 ms buffer size.
616-
EXPECT_EQ(2048, mixer->GetOutputParamsForTesting().frames_per_buffer());
616+
EXPECT_EQ(2048, mixer->get_output_params_for_testing().frames_per_buffer());
617617

618618
ReturnMixer(mixer);
619619
}
@@ -635,15 +635,15 @@ TEST_F(AudioRendererMixerManagerTest, MixerParamsLatencyPlaybackFakeAudio) {
635635
kDefaultDeviceId, SinkUseState::kNewSink);
636636

637637
// Expecting input sample rate
638-
EXPECT_EQ(32000, mixer->GetOutputParamsForTesting().sample_rate());
638+
EXPECT_EQ(32000, mixer->get_output_params_for_testing().sample_rate());
639639

640640
// 20 ms at 32000 is 640 frames per buffer.
641641
#if defined(OS_WIN)
642642
// Use 20 ms buffer.
643-
EXPECT_EQ(640, mixer->GetOutputParamsForTesting().frames_per_buffer());
643+
EXPECT_EQ(640, mixer->get_output_params_for_testing().frames_per_buffer());
644644
#else
645645
// Ignore device buffer size, round up 640 to the power of 2.
646-
EXPECT_EQ(1024, mixer->GetOutputParamsForTesting().frames_per_buffer());
646+
EXPECT_EQ(1024, mixer->get_output_params_for_testing().frames_per_buffer());
647647
#endif // defined(OS_WIN)
648648

649649
ReturnMixer(mixer);
@@ -675,19 +675,19 @@ TEST_F(AudioRendererMixerManagerTest, MixerParamsLatencyRtc) {
675675
: 44100;
676676

677677
EXPECT_EQ(output_sample_rate,
678-
mixer->GetOutputParamsForTesting().sample_rate());
678+
mixer->get_output_params_for_testing().sample_rate());
679679

680680
#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_FUCHSIA)
681681
// Use 10 ms buffer (441 frames per buffer).
682682
EXPECT_EQ(output_sample_rate / 100,
683-
mixer->GetOutputParamsForTesting().frames_per_buffer());
683+
mixer->get_output_params_for_testing().frames_per_buffer());
684684
#elif defined(OS_ANDROID)
685685
// If hardware buffer size (128) is less than 20 ms (882), use 20 ms buffer
686686
// (otherwise, use hardware buffer).
687-
EXPECT_EQ(882, mixer->GetOutputParamsForTesting().frames_per_buffer());
687+
EXPECT_EQ(882, mixer->get_output_params_for_testing().frames_per_buffer());
688688
#else
689689
// Use hardware buffer size (128).
690-
EXPECT_EQ(128, mixer->GetOutputParamsForTesting().frames_per_buffer());
690+
EXPECT_EQ(128, mixer->get_output_params_for_testing().frames_per_buffer());
691691
#endif // defined(OS_LINUX) || defined(OS_MACOSX)
692692

693693
ReturnMixer(mixer);
@@ -709,11 +709,11 @@ TEST_F(AudioRendererMixerManagerTest, MixerParamsLatencyRtcFakeAudio) {
709709
kDefaultDeviceId, SinkUseState::kNewSink);
710710

711711
// Expecting input sample rate.
712-
EXPECT_EQ(32000, mixer->GetOutputParamsForTesting().sample_rate());
712+
EXPECT_EQ(32000, mixer->get_output_params_for_testing().sample_rate());
713713

714714
// 10 ms at 32000 is 320 frames per buffer. Expect it on all the platforms for
715715
// fake audio output.
716-
EXPECT_EQ(320, mixer->GetOutputParamsForTesting().frames_per_buffer());
716+
EXPECT_EQ(320, mixer->get_output_params_for_testing().frames_per_buffer());
717717

718718
ReturnMixer(mixer);
719719
}
@@ -741,14 +741,14 @@ TEST_F(AudioRendererMixerManagerTest, MixerParamsLatencyInteractive) {
741741

742742
if (AudioLatency::IsResamplingPassthroughSupported(params.latency_tag())) {
743743
// Expecting input sample rate.
744-
EXPECT_EQ(32000, mixer->GetOutputParamsForTesting().sample_rate());
744+
EXPECT_EQ(32000, mixer->get_output_params_for_testing().sample_rate());
745745
} else {
746746
// Expecting hardware sample rate.
747-
EXPECT_EQ(44100, mixer->GetOutputParamsForTesting().sample_rate());
747+
EXPECT_EQ(44100, mixer->get_output_params_for_testing().sample_rate());
748748
}
749749

750750
// Expect hardware buffer size.
751-
EXPECT_EQ(128, mixer->GetOutputParamsForTesting().frames_per_buffer());
751+
EXPECT_EQ(128, mixer->get_output_params_for_testing().frames_per_buffer());
752752

753753
ReturnMixer(mixer);
754754
}
@@ -772,13 +772,13 @@ TEST_F(AudioRendererMixerManagerTest, MixerParamsBitstreamFormat) {
772772

773773
// Output parameters should be the same as input properties for bitstream
774774
// formats.
775-
EXPECT_EQ(params.format(), mixer->GetOutputParamsForTesting().format());
775+
EXPECT_EQ(params.format(), mixer->get_output_params_for_testing().format());
776776
EXPECT_EQ(params.channel_layout(),
777-
mixer->GetOutputParamsForTesting().channel_layout());
777+
mixer->get_output_params_for_testing().channel_layout());
778778
EXPECT_EQ(params.sample_rate(),
779-
mixer->GetOutputParamsForTesting().sample_rate());
779+
mixer->get_output_params_for_testing().sample_rate());
780780
EXPECT_EQ(params.frames_per_buffer(),
781-
mixer->GetOutputParamsForTesting().frames_per_buffer());
781+
mixer->get_output_params_for_testing().frames_per_buffer());
782782

783783
ReturnMixer(mixer);
784784
}

media/base/audio_renderer_mixer.cc

Lines changed: 17 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "base/memory/ptr_util.h"
1313
#include "base/metrics/histogram_macros.h"
1414
#include "base/trace_event/trace_event.h"
15+
#include "media/base/audio_renderer_mixer_input.h"
1516
#include "media/base/audio_timestamp_helper.h"
1617

1718
namespace media {
@@ -23,8 +24,8 @@ enum { kPauseDelaySeconds = 10 };
2324
// lock.
2425
class AudioRendererMixer::UMAMaxValueTracker {
2526
public:
26-
UMAMaxValueTracker(const UmaLogCallback& log_callback)
27-
: log_callback_(log_callback), count_(0), max_count_(0) {}
27+
UMAMaxValueTracker(UmaLogCallback log_callback)
28+
: log_callback_(std::move(log_callback)), count_(0), max_count_(0) {}
2829

2930
~UMAMaxValueTracker() = default;
3031

@@ -52,15 +53,15 @@ class AudioRendererMixer::UMAMaxValueTracker {
5253

5354
AudioRendererMixer::AudioRendererMixer(const AudioParameters& output_params,
5455
scoped_refptr<AudioRendererSink> sink,
55-
const UmaLogCallback& log_callback)
56+
UmaLogCallback log_callback)
5657
: output_params_(output_params),
5758
audio_sink_(std::move(sink)),
5859
master_converter_(output_params, output_params, true),
5960
pause_delay_(base::TimeDelta::FromSeconds(kPauseDelaySeconds)),
6061
last_play_time_(base::TimeTicks::Now()),
6162
// Initialize |playing_| to true since Start() results in an auto-play.
6263
playing_(true),
63-
input_count_tracker_(new UMAMaxValueTracker(log_callback)) {
64+
input_count_tracker_(new UMAMaxValueTracker(std::move(log_callback))) {
6465
DCHECK(audio_sink_);
6566
audio_sink_->Initialize(output_params, this);
6667
audio_sink_->Start();
@@ -73,7 +74,7 @@ AudioRendererMixer::~AudioRendererMixer() {
7374
// Ensure that all mixer inputs have removed themselves prior to destruction.
7475
DCHECK(master_converter_.empty());
7576
DCHECK(converters_.empty());
76-
DCHECK_EQ(error_callbacks_.size(), 0U);
77+
DCHECK(error_callbacks_.empty());
7778
}
7879

7980
void AudioRendererMixer::AddMixerInput(const AudioParameters& input_params,
@@ -93,12 +94,11 @@ void AudioRendererMixer::AddMixerInput(const AudioParameters& input_params,
9394
if (converter == converters_.end()) {
9495
std::pair<AudioConvertersMap::iterator, bool> result =
9596
converters_.insert(std::make_pair(
96-
input_sample_rate, base::WrapUnique(
97+
input_sample_rate, std::make_unique<LoopbackAudioConverter>(
9798
// We expect all InputCallbacks to be
9899
// capable of handling arbitrary buffer
99100
// size requests, disabling FIFO.
100-
new LoopbackAudioConverter(
101-
input_params, output_params_, true))));
101+
input_params, output_params_, true)));
102102
converter = result.first;
103103

104104
// Add newly-created resampler as an input to the master mixer.
@@ -132,39 +132,25 @@ void AudioRendererMixer::RemoveMixerInput(
132132
input_count_tracker_->Decrement();
133133
}
134134

135-
void AudioRendererMixer::AddErrorCallback(const base::Closure& error_cb) {
135+
void AudioRendererMixer::AddErrorCallback(AudioRendererMixerInput* input) {
136136
base::AutoLock auto_lock(lock_);
137-
error_callbacks_.push_back(error_cb);
137+
error_callbacks_.insert(input);
138138
}
139139

140-
void AudioRendererMixer::RemoveErrorCallback(const base::Closure& error_cb) {
140+
void AudioRendererMixer::RemoveErrorCallback(AudioRendererMixerInput* input) {
141141
base::AutoLock auto_lock(lock_);
142-
for (auto it = error_callbacks_.begin(); it != error_callbacks_.end(); ++it) {
143-
if (it->Equals(error_cb)) {
144-
error_callbacks_.erase(it);
145-
return;
146-
}
147-
}
142+
error_callbacks_.erase(input);
143+
}
148144

149-
// An error callback should always exist when called.
150-
NOTREACHED();
145+
bool AudioRendererMixer::CurrentThreadIsRenderingThread() {
146+
return audio_sink_->CurrentThreadIsRenderingThread();
151147
}
152148

153149
void AudioRendererMixer::SetPauseDelayForTesting(base::TimeDelta delay) {
154150
base::AutoLock auto_lock(lock_);
155151
pause_delay_ = delay;
156152
}
157153

158-
void AudioRendererMixer::GetOutputDeviceInfoAsync(
159-
AudioRendererSink::OutputDeviceInfoCB info_cb) {
160-
DVLOG(1) << __func__;
161-
return audio_sink_->GetOutputDeviceInfoAsync(std::move(info_cb));
162-
}
163-
164-
bool AudioRendererMixer::CurrentThreadIsRenderingThread() {
165-
return audio_sink_->CurrentThreadIsRenderingThread();
166-
}
167-
168154
int AudioRendererMixer::Render(base::TimeDelta delay,
169155
base::TimeTicks delay_timestamp,
170156
int prior_frames_skipped,
@@ -192,8 +178,8 @@ int AudioRendererMixer::Render(base::TimeDelta delay,
192178
void AudioRendererMixer::OnRenderError() {
193179
// Call each mixer input and signal an error.
194180
base::AutoLock auto_lock(lock_);
195-
for (const auto& cb : error_callbacks_)
196-
cb.Run();
181+
for (auto* input : error_callbacks_)
182+
input->OnRenderError();
197183
}
198184

199185
} // namespace media

media/base/audio_renderer_mixer.h

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
#include <memory>
1212
#include <string>
1313

14+
#include "base/containers/flat_map.h"
15+
#include "base/containers/flat_set.h"
1416
#include "base/macros.h"
1517
#include "base/synchronization/lock.h"
1618
#include "base/thread_annotations.h"
@@ -20,18 +22,19 @@
2022
#include "media/base/loopback_audio_converter.h"
2123

2224
namespace media {
25+
class AudioRendererMixerInput;
2326

2427
// Mixes a set of AudioConverter::InputCallbacks into a single output stream
2528
// which is funneled into a single shared AudioRendererSink; saving a bundle
2629
// on renderer side resources.
2730
class MEDIA_EXPORT AudioRendererMixer
2831
: public AudioRendererSink::RenderCallback {
2932
public:
30-
typedef base::Callback<void(int)> UmaLogCallback;
33+
using UmaLogCallback = base::RepeatingCallback<void(int)>;
3134

3235
AudioRendererMixer(const AudioParameters& output_params,
3336
scoped_refptr<AudioRendererSink> sink,
34-
const UmaLogCallback& log_callback);
37+
UmaLogCallback log_callback);
3538
~AudioRendererMixer() override;
3639

3740
// Add or remove a mixer input from mixing; called by AudioRendererMixerInput.
@@ -41,35 +44,29 @@ class MEDIA_EXPORT AudioRendererMixer
4144
AudioConverter::InputCallback* input);
4245

4346
// Since errors may occur even when no inputs are playing, an error callback
44-
// must be registered separately from adding a mixer input. The same callback
45-
// must be given to both the functions.
46-
void AddErrorCallback(const base::Closure& error_cb);
47-
void RemoveErrorCallback(const base::Closure& error_cb);
48-
49-
void SetPauseDelayForTesting(base::TimeDelta delay);
50-
51-
void GetOutputDeviceInfoAsync(AudioRendererSink::OutputDeviceInfoCB info_cb);
47+
// must be registered separately from adding a mixer input.
48+
void AddErrorCallback(AudioRendererMixerInput* input);
49+
void RemoveErrorCallback(AudioRendererMixerInput* input);
5250

5351
// Returns true if called on rendering thread, otherwise false.
5452
bool CurrentThreadIsRenderingThread();
5553

56-
const AudioParameters& GetOutputParamsForTesting() { return output_params_; };
54+
void SetPauseDelayForTesting(base::TimeDelta delay);
55+
const AudioParameters& get_output_params_for_testing() const {
56+
return output_params_;
57+
}
5758

5859
private:
5960
class UMAMaxValueTracker;
6061

61-
// Maps input sample rate to the dedicated converter.
62-
using AudioConvertersMap =
63-
std::map<int, std::unique_ptr<LoopbackAudioConverter>>;
64-
6562
// AudioRendererSink::RenderCallback implementation.
6663
int Render(base::TimeDelta delay,
6764
base::TimeTicks delay_timestamp,
6865
int prior_frames_skipped,
6966
AudioBus* audio_bus) override;
7067
void OnRenderError() override;
7168

72-
bool is_master_sample_rate(int sample_rate) {
69+
bool is_master_sample_rate(int sample_rate) const {
7370
return sample_rate == output_params_.sample_rate();
7471
}
7572

@@ -83,11 +80,14 @@ class MEDIA_EXPORT AudioRendererMixer
8380
base::Lock lock_;
8481

8582
// List of error callbacks used by this mixer.
86-
typedef std::list<base::Closure> ErrorCallbackList;
87-
ErrorCallbackList error_callbacks_ GUARDED_BY(lock_);
83+
base::flat_set<AudioRendererMixerInput*> error_callbacks_ GUARDED_BY(lock_);
84+
85+
// Maps input sample rate to the dedicated converter.
86+
using AudioConvertersMap =
87+
base::flat_map<int, std::unique_ptr<LoopbackAudioConverter>>;
8888

8989
// Each of these converters mixes inputs with a given sample rate and
90-
// resamples them to the output sample rate. Inputs not reqiuring resampling
90+
// resamples them to the output sample rate. Inputs not requiring resampling
9191
// go directly to |master_converter_|.
9292
AudioConvertersMap converters_ GUARDED_BY(lock_);
9393

0 commit comments

Comments
 (0)