blob: e96db650a4d63082b27685efce52758c3fbc3979 [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <intel-hda/utils/codec-caps.h>
namespace audio {
namespace intel_hda {
bool SampleCaps::SupportsRate(uint32_t rate) const {
switch (rate) {
case 384000: return ((pcm_size_rate_ & IHDA_PCM_RATE_384000) != 0);
case 192000: return ((pcm_size_rate_ & IHDA_PCM_RATE_192000) != 0);
case 176400: return ((pcm_size_rate_ & IHDA_PCM_RATE_176400) != 0);
case 96000: return ((pcm_size_rate_ & IHDA_PCM_RATE_96000) != 0);
case 88200: return ((pcm_size_rate_ & IHDA_PCM_RATE_88200) != 0);
case 48000: return ((pcm_size_rate_ & IHDA_PCM_RATE_48000) != 0);
case 44100: return ((pcm_size_rate_ & IHDA_PCM_RATE_44100) != 0);
case 32000: return ((pcm_size_rate_ & IHDA_PCM_RATE_32000) != 0);
case 22050: return ((pcm_size_rate_ & IHDA_PCM_RATE_22050) != 0);
case 16000: return ((pcm_size_rate_ & IHDA_PCM_RATE_16000) != 0);
case 11025: return ((pcm_size_rate_ & IHDA_PCM_RATE_11025) != 0);
case 8000: return ((pcm_size_rate_ & IHDA_PCM_RATE_8000) != 0);
}
return false;
}
bool SampleCaps::SupportsFormat(audio_sample_format_t sample_format) const {
// Intel HDA controllers should always use host-endian for the samples fed
// to the DMA engine, and do not support unsigned audio samples.
if (sample_format & (AUDIO_SAMPLE_FORMAT_FLAG_UNSIGNED |
AUDIO_SAMPLE_FORMAT_FLAG_INVERT_ENDIAN))
return false;
// TODO(johngro) : Should we be doing specific bitstream/codec matching for
// compressed audio passthru? If so, how?
if (sample_format == AUDIO_SAMPLE_FORMAT_BITSTREAM)
return ((pcm_formats_ & IHDA_PCM_FORMAT_AC3) != 0);
// If the user want's float32, need to have support for float (in the
// formats field) and 32 bit containers (in the size/rate field)
if (sample_format == AUDIO_SAMPLE_FORMAT_32BIT_FLOAT)
return ((pcm_formats_ & IHDA_PCM_FORMAT_FLOAT32) != 0)
&& ((pcm_size_rate_ & AUDIO_SAMPLE_FORMAT_32BIT) != 0);
// User is requesting a PCM format. Start with checking for basic support,
// then match the user's request against the set of containers Intel HDA can
// support.
if (!(pcm_formats_ & IHDA_PCM_FORMAT_PCM))
return false;
switch (sample_format) {
case AUDIO_SAMPLE_FORMAT_8BIT: return ((pcm_size_rate_ & IHDA_PCM_SIZE_8BITS) != 0);
case AUDIO_SAMPLE_FORMAT_16BIT: return ((pcm_size_rate_ & IHDA_PCM_SIZE_16BITS) != 0);
case AUDIO_SAMPLE_FORMAT_20BIT_IN32: return ((pcm_size_rate_ & IHDA_PCM_SIZE_20BITS) != 0);
case AUDIO_SAMPLE_FORMAT_24BIT_IN32: return ((pcm_size_rate_ & IHDA_PCM_SIZE_24BITS) != 0);
case AUDIO_SAMPLE_FORMAT_32BIT: return ((pcm_size_rate_ & IHDA_PCM_SIZE_32BITS) != 0);
default: return false;
}
}
} // namespace intel_hda
} // namespace audio