Don't apply extra AAudio volume ramps
For shared Audio streams, both the exclusive version and the shared version per client will be applying volume changes to the volume ramp.
The fix is to not apply volume changes to shared streams since the exclusive stream will do the ramp.
Bug: 209877538
Test: OboeTester MMAP exclusive/shared
Test: atest AAudioTests
Change-Id: I6172e7ace0b36f84f2a2005e30ad7667e210fe49
diff --git a/media/libaaudio/src/client/AAudioFlowGraph.cpp b/media/libaaudio/src/client/AAudioFlowGraph.cpp
index 5b46ae0..d0c3238 100644
--- a/media/libaaudio/src/client/AAudioFlowGraph.cpp
+++ b/media/libaaudio/src/client/AAudioFlowGraph.cpp
@@ -42,14 +42,15 @@
audio_format_t sinkFormat,
int32_t sinkChannelCount,
bool useMonoBlend,
- float audioBalance) {
+ float audioBalance,
+ bool isExclusive) {
FlowGraphPortFloatOutput *lastOutput = nullptr;
// TODO change back to ALOGD
ALOGI("%s() source format = 0x%08x, channels = %d, sink format = 0x%08x, channels = %d, "
- "useMonoBlend = %d, audioBalance = %f",
+ "useMonoBlend = %d, audioBalance = %f, isExclusive %d",
__func__, sourceFormat, sourceChannelCount, sinkFormat, sinkChannelCount,
- useMonoBlend, audioBalance);
+ useMonoBlend, audioBalance, isExclusive);
switch (sourceFormat) {
case AUDIO_FORMAT_PCM_FLOAT:
@@ -94,22 +95,25 @@
return AAUDIO_ERROR_UNIMPLEMENTED;
}
- // Apply volume ramps to set the left/right audio balance and target volumes.
- // The signals will be decoupled, volume ramps will be applied, before the signals are
- // combined again.
- mMultiToManyConverter = std::make_unique<MultiToManyConverter>(sinkChannelCount);
- mManyToMultiConverter = std::make_unique<ManyToMultiConverter>(sinkChannelCount);
- lastOutput->connect(&mMultiToManyConverter->input);
- for (int i = 0; i < sinkChannelCount; i++) {
- mVolumeRamps.emplace_back(std::make_unique<RampLinear>(1));
- mPanningVolumes.emplace_back(1.0f);
- lastOutput = mMultiToManyConverter->outputs[i].get();
- lastOutput->connect(&(mVolumeRamps[i].get()->input));
- lastOutput = &(mVolumeRamps[i].get()->output);
- lastOutput->connect(mManyToMultiConverter->inputs[i].get());
+ // Apply volume ramps for only exclusive streams.
+ if (isExclusive) {
+ // Apply volume ramps to set the left/right audio balance and target volumes.
+ // The signals will be decoupled, volume ramps will be applied, before the signals are
+ // combined again.
+ mMultiToManyConverter = std::make_unique<MultiToManyConverter>(sinkChannelCount);
+ mManyToMultiConverter = std::make_unique<ManyToMultiConverter>(sinkChannelCount);
+ lastOutput->connect(&mMultiToManyConverter->input);
+ for (int i = 0; i < sinkChannelCount; i++) {
+ mVolumeRamps.emplace_back(std::make_unique<RampLinear>(1));
+ mPanningVolumes.emplace_back(1.0f);
+ lastOutput = mMultiToManyConverter->outputs[i].get();
+ lastOutput->connect(&(mVolumeRamps[i].get()->input));
+ lastOutput = &(mVolumeRamps[i].get()->output);
+ lastOutput->connect(mManyToMultiConverter->inputs[i].get());
+ }
+ lastOutput = &mManyToMultiConverter->output;
+ setAudioBalance(audioBalance);
}
- lastOutput = &mManyToMultiConverter->output;
- setAudioBalance(audioBalance);
switch (sinkFormat) {
case AUDIO_FORMAT_PCM_FLOAT: