diff options
Diffstat (limited to 'libaudio/alsa_utils.cpp')
-rw-r--r-- | libaudio/alsa_utils.cpp | 18 |
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; |