Skip to content

Commit

Permalink
Cherry pick PR #1399: [android] Refine audio output device querying (#…
Browse files Browse the repository at this point in the history
…1403)

Refer to the original PR: #1399

`SbMediaGetAudioOutputCount()` was hard coded to return 1. This worked
when `SbMediaGetAudioConfiguration()` was hard coded to return HDMI, and
breaks 5.1 playbacks on some devices after
`SbMediaGetAudioConfiguration()` is refined to return configurations for
all audio outputs (including non-HDMI devices) in the system.

For example, when the first output is non-HDMI stereo, and the second
output is HDMI with 5.1 support, the second output won't be checked in
`IsAudioOutputSupported()` because `SbMediaGetAudioOutputCount()`
returns 1, and 5.1 streams will be incorrectly rejected.

Now `SbMediaGetAudioOutputCount()` tentatively returns 16 on Android TV,
and `IsAudioOutputSupported()` will break the loop when
`SbMediaGetAudioConfiguration()` returns false. This minimizes the
changes required while still allows 5.1 playbacks.

Follow up changes should be made to remove
`SbMediaGetAudioOutputCount()` completely once this is verified on all
platforms.

b/284140486
b/297426689

Co-authored-by: xiaomings <[email protected]>
  • Loading branch information
cobalt-github-releaser-bot and xiaomings authored Aug 25, 2023
1 parent 834346a commit b6e23f7
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 7 deletions.
23 changes: 19 additions & 4 deletions starboard/android/shared/media_get_audio_configuration.cc
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include "starboard/android/shared/jni_env_ext.h"
#include "starboard/android/shared/jni_utils.h"
#include "starboard/android/shared/media_capabilities_cache.h"
#include "starboard/common/media.h"

// Constants for output types from
// https://developer.android.com/reference/android/media/AudioDeviceInfo.
Expand Down Expand Up @@ -129,11 +130,19 @@ SbMediaAudioConnector GetConnectorFromAndroidOutputType(
bool SbMediaGetAudioConfiguration(
int output_index,
SbMediaAudioConfiguration* out_configuration) {
using starboard::GetMediaAudioConnectorName;
using starboard::android::shared::JniEnvExt;
using starboard::android::shared::MediaCapabilitiesCache;
using starboard::android::shared::ScopedLocalJavaRef;

if (output_index < 0 || out_configuration == NULL) {
if (output_index < 0) {
SB_LOG(WARNING) << "output_index is " << output_index
<< ", which cannot be negative.";
return false;
}

if (out_configuration == nullptr) {
SB_LOG(WARNING) << "out_configuration cannot be nullptr.";
return false;
}

Expand All @@ -152,6 +161,8 @@ bool SbMediaGetAudioConfiguration(
output_index, j_output_device_info.Get());

if (!succeeded) {
SB_LOG(WARNING)
<< "Call to AudioOutputManager.getOutputDeviceInfo() failed.";
return false;
}

Expand All @@ -171,9 +182,8 @@ bool SbMediaGetAudioConfiguration(
int channels =
MediaCapabilitiesCache::GetInstance()->GetMaxAudioOutputChannels();
if (channels < 2) {
SB_LOG(WARNING)
<< "The supported channels from output device is smaller than 2. "
"Fallback to 2 channels";
SB_LOG(WARNING) << "The supported channels from output device is "
<< channels << ", set to 2 channels instead.";
out_configuration->number_of_channels = 2;
} else {
out_configuration->number_of_channels = channels;
Expand All @@ -182,5 +192,10 @@ bool SbMediaGetAudioConfiguration(
out_configuration->number_of_channels = 2;
}

SB_LOG(INFO) << "Audio connector type for index " << output_index << " is "
<< GetMediaAudioConnectorName(out_configuration->connector)
<< " and it has " << out_configuration->number_of_channels
<< " channels.";

return true;
}
7 changes: 5 additions & 2 deletions starboard/android/shared/media_get_audio_output_count.cc
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
#include "starboard/media.h"

int SbMediaGetAudioOutputCount() {
// Only supports one HDMI output.
return 1;
// TODO(b/284140486, b/297426689): Tentatively returns 16 to ensure that all
// audio output devices are checked in `IsAudioOutputSupported()`. We should
// revisit this, and probably remove `SbMediaGetAudioOutputCount()` completely
// from Starboard.
return 16;
}
5 changes: 4 additions & 1 deletion starboard/shared/starboard/media/mime_util.cc
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,15 @@ namespace {
// Use SbMediaGetAudioConfiguration() to check if the platform can support
// |channels|.
bool IsAudioOutputSupported(SbMediaAudioCodingType coding_type, int channels) {
// TODO(b/284140486, b/297426689): Consider removing the call to
// `SbMediaGetAudioOutputCount()` completely as the loop will be terminated
// once `SbMediaGetAudioConfiguration()` returns false.
int count = SbMediaGetAudioOutputCount();

for (int output_index = 0; output_index < count; ++output_index) {
SbMediaAudioConfiguration configuration;
if (!SbMediaGetAudioConfiguration(output_index, &configuration)) {
continue;
break;
}

if (configuration.coding_type == coding_type &&
Expand Down

0 comments on commit b6e23f7

Please sign in to comment.