diff options
author | Phil Burk <philburk@google.com> | 2015-08-28 15:08:22 -0700 |
---|---|---|
committer | The Android Automerger <android-build@google.com> | 2015-09-02 14:03:33 -0700 |
commit | 89ecf54ec78e1ed61b19f0ac510fe40f687ff127 (patch) | |
tree | ac647899510e6970ec7387c34cbb5b07b9d40532 | |
parent | f205e61c51d8a4218b75385b778dc05d33aa6d0f (diff) | |
download | fugu-android-cts-6.0_r7.tar.gz |
Fugu Audio HAL: allow EAC3 at low sample ratesandroid-cts-6.0_r9android-cts-6.0_r8android-cts-6.0_r7android-cts-6.0_r6android-cts-6.0_r5android-cts-6.0_r4android-cts-6.0_r32android-cts-6.0_r31android-cts-6.0_r30android-cts-6.0_r3android-cts-6.0_r29android-cts-6.0_r28android-cts-6.0_r27android-cts-6.0_r26android-cts-6.0_r25android-cts-6.0_r24android-cts-6.0_r23android-cts-6.0_r22android-cts-6.0_r21android-cts-6.0_r20android-cts-6.0_r2android-cts-6.0_r19android-cts-6.0_r18android-cts-6.0_r17android-cts-6.0_r16android-cts-6.0_r15android-cts-6.0_r14android-cts-6.0_r13android-cts-6.0_r12android-cts-6.0_r1android-6.0.0_r7android-6.0.0_r6android-6.0.0_r5android-6.0.0_r4android-6.0.0_r3android-6.0.0_r2android-6.0.0_r1marshmallow-releasemarshmallow-cts-release
The HAL was not allowing HDMI pasthrough of EAC3 when the device reports
that it does not support the 4X rate. This allows it to play anyway.
Bug: 23596552
Change-Id: I37e5a1c28df33954aef20a7de991193e18599d1c
Signed-off-by: Phil Burk <philburk@google.com>
-rw-r--r-- | libaudio/AudioStreamOut.cpp | 3 | ||||
-rw-r--r-- | libaudio/HDMIAudioOutput.cpp | 3 | ||||
-rw-r--r-- | libaudio/alsa_utils.cpp | 18 | ||||
-rw-r--r-- | libaudio/alsa_utils.h | 3 |
4 files changed, 23 insertions, 4 deletions
diff --git a/libaudio/AudioStreamOut.cpp b/libaudio/AudioStreamOut.cpp index bb70bbd..0ae8e3b 100644 --- a/libaudio/AudioStreamOut.cpp +++ b/libaudio/AudioStreamOut.cpp @@ -113,7 +113,8 @@ status_t AudioStreamOut::set( } else { // Else check to see if our HDMI sink supports this format before proceeding. if (!mOwnerHAL.getHDMIAudioCaps().supportsFormat( - lFormat, lRate, audio_channel_count_from_out_mask(lChannels))) { + lFormat, lRate, audio_channel_count_from_out_mask(lChannels), + mIsIec958NonAudio)) { ALOGW("set: parameters incompatible with hdmi capabilities"); return BAD_VALUE; } diff --git a/libaudio/HDMIAudioOutput.cpp b/libaudio/HDMIAudioOutput.cpp index d79cb5e..8d1dc67 100644 --- a/libaudio/HDMIAudioOutput.cpp +++ b/libaudio/HDMIAudioOutput.cpp @@ -51,7 +51,8 @@ status_t HDMIAudioOutput::setupForStream(const AudioStreamOut& stream) if (!gAudioHardwareOutput.getHDMIAudioCaps().supportsFormat( stream.format(), stream.sampleRate(), - mChannelCnt)) { + mChannelCnt, + stream.isIec958NonAudio())) { ALOGE("HDMI Sink does not support format = 0x%0X, srate = %d, #channels = 0%d", stream.format(), mFramesPerSec, mChannelCnt); return BAD_VALUE; 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; diff --git a/libaudio/alsa_utils.h b/libaudio/alsa_utils.h index b770468..f0f1b21 100644 --- a/libaudio/alsa_utils.h +++ b/libaudio/alsa_utils.h @@ -108,7 +108,8 @@ class HDMIAudioCaps { void getChannelMasksForAF(String8& masks); bool supportsFormat(audio_format_t format, uint32_t sampleRate, - uint32_t channelCount); + uint32_t channelCount, + bool isIec958NonAudio); bool basicAudioSupport() const { return mBasicAudioSupported; } uint16_t speakerAllocation() const { return mSpeakerAlloc; } |