Commit 33f44a2c authored by Ken MacKay's avatar Ken MacKay Committed by Commit Bot

[Chromecast] Use a different thread for posting to the mixer

To avoid priority inversion, we need to use a different thread for post
*to* the mixer than we use for post data *from* the mixer.

Bug: internal b/106289282
Change-Id: I9dec6b2a4f8b38d7895de3d076e48c1e1ef6491b
Reviewed-on: https://chromium-review.googlesource.com/1095858Reviewed-by: default avatarStephen Lanham <slan@chromium.org>
Commit-Queue: Kenneth MacKay <kmackay@chromium.org>
Cr-Commit-Position: refs/heads/master@{#566544}
parent 4610d04f
......@@ -28,8 +28,8 @@
#include "chromecast/public/media/mixer_output_stream.h"
#include "media/audio/audio_device_description.h"
#define POST_THROUGH_SHIM_THREAD(method, ...) \
shim_task_runner_->PostTask( \
#define POST_THROUGH_INPUT_THREAD(method, ...) \
input_task_runner_->PostTask( \
FROM_HERE, base::BindOnce(&PostTaskShim, mixer_task_runner_, \
base::BindOnce(method, base::Unretained(this), \
##__VA_ARGS__)));
......@@ -234,8 +234,14 @@ StreamMixer::StreamMixer(
shim_thread_->StartWithOptions(shim_options);
shim_task_runner_ = shim_thread_->task_runner();
shim_task_runner_->PostTask(FROM_HERE, base::BindOnce(&UseHighPriority));
input_thread_ = std::make_unique<base::Thread>("CMA mixer PI input");
input_thread_->StartWithOptions(shim_options);
input_task_runner_ = input_thread_->task_runner();
input_task_runner_->PostTask(FROM_HERE, base::BindOnce(&UseHighPriority));
} else {
shim_task_runner_ = mixer_task_runner_;
input_task_runner_ = mixer_task_runner_;
}
if (fixed_sample_rate_ != MixerOutputStream::kInvalidSampleRate) {
......@@ -498,7 +504,7 @@ void StreamMixer::SignalError(MixerInput::Source::MixerError error) {
}
void StreamMixer::AddInput(MixerInput::Source* input_source) {
POST_THROUGH_SHIM_THREAD(&StreamMixer::AddInputOnThread, input_source);
POST_THROUGH_INPUT_THREAD(&StreamMixer::AddInputOnThread, input_source);
}
void StreamMixer::AddInputOnThread(MixerInput::Source* input_source) {
......@@ -564,7 +570,7 @@ void StreamMixer::AddInputOnThread(MixerInput::Source* input_source) {
}
void StreamMixer::RemoveInput(MixerInput::Source* input_source) {
POST_THROUGH_SHIM_THREAD(&StreamMixer::RemoveInputOnThread, input_source);
POST_THROUGH_INPUT_THREAD(&StreamMixer::RemoveInputOnThread, input_source);
}
void StreamMixer::RemoveInputOnThread(MixerInput::Source* input_source) {
......@@ -792,7 +798,7 @@ void StreamMixer::LoopbackInterrupted() {
}
void StreamMixer::SetVolume(AudioContentType type, float level) {
POST_THROUGH_SHIM_THREAD(&StreamMixer::SetVolumeOnThread, type, level);
POST_THROUGH_INPUT_THREAD(&StreamMixer::SetVolumeOnThread, type, level);
}
void StreamMixer::SetVolumeOnThread(AudioContentType type, float level) {
......@@ -817,7 +823,7 @@ void StreamMixer::SetVolumeOnThread(AudioContentType type, float level) {
}
void StreamMixer::SetMuted(AudioContentType type, bool muted) {
POST_THROUGH_SHIM_THREAD(&StreamMixer::SetMutedOnThread, type, muted);
POST_THROUGH_INPUT_THREAD(&StreamMixer::SetMutedOnThread, type, muted);
}
void StreamMixer::SetMutedOnThread(AudioContentType type, bool muted) {
......@@ -836,7 +842,7 @@ void StreamMixer::SetMutedOnThread(AudioContentType type, bool muted) {
}
void StreamMixer::SetOutputLimit(AudioContentType type, float limit) {
POST_THROUGH_SHIM_THREAD(&StreamMixer::SetOutputLimitOnThread, type, limit);
POST_THROUGH_INPUT_THREAD(&StreamMixer::SetOutputLimitOnThread, type, limit);
}
void StreamMixer::SetOutputLimitOnThread(AudioContentType type, float limit) {
......@@ -868,8 +874,8 @@ void StreamMixer::SetOutputLimitOnThread(AudioContentType type, float limit) {
void StreamMixer::SetVolumeMultiplier(MixerInput::Source* source,
float multiplier) {
POST_THROUGH_SHIM_THREAD(&StreamMixer::SetVolumeMultiplierOnThread, source,
multiplier);
POST_THROUGH_INPUT_THREAD(&StreamMixer::SetVolumeMultiplierOnThread, source,
multiplier);
}
void StreamMixer::SetVolumeMultiplierOnThread(MixerInput::Source* source,
......@@ -883,8 +889,8 @@ void StreamMixer::SetVolumeMultiplierOnThread(MixerInput::Source* source,
void StreamMixer::SetPostProcessorConfig(const std::string& name,
const std::string& config) {
POST_THROUGH_SHIM_THREAD(&StreamMixer::SetPostProcessorConfigOnThread, name,
config);
POST_THROUGH_INPUT_THREAD(&StreamMixer::SetPostProcessorConfigOnThread, name,
config);
}
void StreamMixer::SetPostProcessorConfigOnThread(const std::string& name,
......
......@@ -205,6 +205,8 @@ class StreamMixer {
// Special thread to avoid underruns due to priority inversion.
std::unique_ptr<base::Thread> shim_thread_;
scoped_refptr<base::SingleThreadTaskRunner> shim_task_runner_;
std::unique_ptr<base::Thread> input_thread_;
scoped_refptr<base::SingleThreadTaskRunner> input_task_runner_;
int num_output_channels_;
const int low_sample_rate_cutoff_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment