summaryrefslogtreecommitdiff
path: root/libaudio/alsa_utils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libaudio/alsa_utils.cpp')
-rw-r--r--libaudio/alsa_utils.cpp18
1 files changed, 17 insertions, 1 deletions
diff --git a/libaudio/alsa_utils.cpp b/libaudio/alsa_utils.cpp
index f90c6de..81e7355 100644
--- a/libaudio/alsa_utils.cpp
+++ b/libaudio/alsa_utils.cpp
@@ -356,9 +356,12 @@ ssize_t HDMIAudioCaps::getMaxChModeNdx_l() {
bool HDMIAudioCaps::supportsFormat(audio_format_t format,
uint32_t sampleRate,
- uint32_t channelCount) {
+ uint32_t channelCount,
+ bool isIec958NonAudio) {
Mutex::Autolock _l(mLock);
+ ALOGV("supportsFormat() format = 0x%08X, sampleRate = %u, channels = 0x%08X, iec958 = %d",
+ format, sampleRate, channelCount, isIec958NonAudio ? 1 : 0);
// If the sink does not support basic audio, then it supports no audio.
if (!mBasicAudioSupported)
return false;
@@ -373,6 +376,19 @@ bool HDMIAudioCaps::supportsFormat(audio_format_t format,
default: return false;
}
+ // EAC3 uses a PCM sample rate of 4X the base rate.
+ // We try to detect that situation and allow 4X rate even if the
+ // EDID does not report that it is supported.
+ // This rate was chosen because it is between the region of typical PCM rates
+ // and the extreme rates used for IEC61973.
+ // It is > 96000 and < 4*32000.
+ const uint32_t maxReasonableRate = 100000; // FIXME review for N
+ if (isIec958NonAudio && (alsaFormat == kFmtLPCM) && (sampleRate > maxReasonableRate)) {
+ ALOGI("supportsFormat() dividing sample %u by 4 to test support for EAC3 over HDMI",
+ sampleRate);
+ sampleRate = sampleRate / 4;
+ }
+
SRMask srMask;
switch (sampleRate) {
case 32000: srMask = kSR_32000; break;