blob: 4f298c28b2d486d2bf49e9e68f2aa11cec79ba61 [file] [log] [blame] [edit]
// Copyright 2020 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 <lib/ddk/debug.h>
#include <lib/simple-codec/simple-codec-helper.h>
namespace audio {
bool IsDaiFormatSupported(const DaiFormat& format,
const std::vector<DaiSupportedFormats>& supported) {
for (size_t i = 0; i < supported.size(); ++i) {
if (IsDaiFormatSupported(format, supported[i])) {
return true;
}
}
return false;
}
bool IsDaiFormatSupported(const DaiFormat& format, const DaiSupportedFormats& supported) {
const SampleFormat sample_format = format.sample_format;
const FrameFormat frame_format = format.frame_format;
const uint32_t frame_rate = format.frame_rate;
const uint8_t bits_per_sample = format.bits_per_sample;
const uint8_t bits_per_slot = format.bits_per_slot;
size_t i = 0;
for (i = 0; i < supported.number_of_channels.size() &&
supported.number_of_channels[i] != format.number_of_channels;
++i) {
}
if (i == supported.number_of_channels.size()) {
zxlogf(INFO, "SimpleCodec did not find number of channels %u", format.number_of_channels);
return false;
}
for (i = 0; i < supported.sample_formats.size() && supported.sample_formats[i] != sample_format;
++i) {
}
if (i == supported.sample_formats.size()) {
zxlogf(INFO, "SimpleCodec did not find sample format %d", static_cast<int>(sample_format));
return false;
}
for (i = 0; i < supported.frame_formats.size(); ++i) {
if (supported.frame_formats[i] == frame_format) {
break;
}
}
if (i == supported.frame_formats.size()) {
zxlogf(INFO, "SimpleCodec did not find frame format %d", static_cast<int>(frame_format));
return false;
}
for (i = 0; i < supported.frame_rates.size() && supported.frame_rates[i] != frame_rate; ++i) {
}
if (i == supported.frame_rates.size()) {
zxlogf(INFO, "SimpleCodec did not find sample rate %u", frame_rate);
return false;
}
for (i = 0;
i < supported.bits_per_sample.size() && supported.bits_per_sample[i] != bits_per_sample;
++i) {
}
if (i == supported.bits_per_sample.size()) {
zxlogf(INFO, "SimpleCodec did not find bits per sample %u", bits_per_sample);
return false;
}
for (i = 0; i < supported.bits_per_slot.size() && supported.bits_per_slot[i] != bits_per_slot;
++i) {
}
if (i == supported.bits_per_slot.size()) {
zxlogf(INFO, "SimpleCodec did not find wanted bits per slot %u", bits_per_slot);
return false;
}
if (bits_per_sample > bits_per_slot) {
zxlogf(INFO, "SimpleCodec found bits per sample (%u) too big for the bits per slot (%u)",
bits_per_sample, bits_per_slot);
return false;
}
zxlogf(INFO, "SimpleCodec found a supported format");
return true;
}
} // namespace audio