blob: 2e43a7fdedc9c2b8f8d462b21db0daae357778fe [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 "src/media/audio/audio_core/driver_utils.h"
#include <map>
#include <audio-proto-utils/format-utils.h>
#include <trace/event.h>
#include "src/lib/syslog/cpp/logger.h"
namespace media::driver_utils {
namespace {
static const std::map<fuchsia::media::AudioSampleFormat, DriverSampleFormat>
kSampleFormatToDriver2SampleFormatMap = {
{fuchsia::media::AudioSampleFormat::UNSIGNED_8,
{fuchsia::hardware::audio::SampleFormat::PCM_UNSIGNED, 1, 8}},
{fuchsia::media::AudioSampleFormat::SIGNED_16,
{fuchsia::hardware::audio::SampleFormat::PCM_SIGNED, 2, 16}},
{fuchsia::media::AudioSampleFormat::SIGNED_24_IN_32,
{fuchsia::hardware::audio::SampleFormat::PCM_SIGNED, 4, 24}},
{fuchsia::media::AudioSampleFormat::FLOAT,
{fuchsia::hardware::audio::SampleFormat::PCM_FLOAT, 4, 32}},
};
static constexpr audio_sample_format_t AUDIO_SAMPLE_FORMAT_UNSIGNED_8BIT =
static_cast<audio_sample_format_t>(AUDIO_SAMPLE_FORMAT_8BIT |
AUDIO_SAMPLE_FORMAT_FLAG_UNSIGNED);
static const std::map<audio_sample_format_t, fuchsia::media::AudioSampleFormat>
kDriverSampleFormatToSampleFormatMap = {
{AUDIO_SAMPLE_FORMAT_UNSIGNED_8BIT, fuchsia::media::AudioSampleFormat::UNSIGNED_8},
{AUDIO_SAMPLE_FORMAT_16BIT, fuchsia::media::AudioSampleFormat::SIGNED_16},
{AUDIO_SAMPLE_FORMAT_24BIT_IN32, fuchsia::media::AudioSampleFormat::SIGNED_24_IN_32},
{AUDIO_SAMPLE_FORMAT_32BIT_FLOAT, fuchsia::media::AudioSampleFormat::FLOAT},
};
static const std::map<fuchsia::media::AudioSampleFormat, audio_sample_format_t>
kSampleFormatToDriverSampleFormatMap = {
{fuchsia::media::AudioSampleFormat::UNSIGNED_8, AUDIO_SAMPLE_FORMAT_UNSIGNED_8BIT},
{fuchsia::media::AudioSampleFormat::SIGNED_16, AUDIO_SAMPLE_FORMAT_16BIT},
{fuchsia::media::AudioSampleFormat::SIGNED_24_IN_32, AUDIO_SAMPLE_FORMAT_24BIT_IN32},
{fuchsia::media::AudioSampleFormat::FLOAT, AUDIO_SAMPLE_FORMAT_32BIT_FLOAT},
};
} // namespace
bool AudioSampleFormatToDriverSampleFormat(fuchsia::media::AudioSampleFormat sample_format,
audio_sample_format_t* driver_sample_format_out) {
TRACE_DURATION("audio", "AudioSampleFormatToDriverSampleFormat");
FX_DCHECK(driver_sample_format_out != nullptr);
auto iter = kSampleFormatToDriverSampleFormatMap.find(sample_format);
if (iter == kSampleFormatToDriverSampleFormatMap.end()) {
return false;
}
*driver_sample_format_out = iter->second;
return true;
}
bool DriverSampleFormatToAudioSampleFormat(audio_sample_format_t driver_sample_format,
fuchsia::media::AudioSampleFormat* sample_format_out) {
TRACE_DURATION("audio", "DriverSampleFormatToAudioSampleFormat");
auto iter = kDriverSampleFormatToSampleFormatMap.find(driver_sample_format);
if (iter == kDriverSampleFormatToSampleFormatMap.end()) {
return false;
}
*sample_format_out = iter->second;
return true;
}
bool AudioSampleFormatToDriverSampleFormat(fuchsia::media::AudioSampleFormat sample_format,
DriverSampleFormat* driver_sample_format_out) {
TRACE_DURATION("audio", "AudioSampleFormatToDriverSampleFormat");
FX_DCHECK(driver_sample_format_out != nullptr);
auto iter = kSampleFormatToDriver2SampleFormatMap.find(sample_format);
if (iter == kSampleFormatToDriver2SampleFormatMap.end()) {
return false;
}
*driver_sample_format_out = iter->second;
return true;
}
bool DriverSampleFormatToAudioSampleFormat(DriverSampleFormat driver_sample_format,
fuchsia::media::AudioSampleFormat* sample_format_out) {
TRACE_DURATION("audio", "DriverSampleFormatToAudioSampleFormat");
for (auto& i : kSampleFormatToDriver2SampleFormatMap) {
if (i.second.sample_format == driver_sample_format.sample_format &&
i.second.bytes_per_sample == driver_sample_format.bytes_per_sample &&
i.second.valid_bits_per_sample == driver_sample_format.valid_bits_per_sample) {
*sample_format_out = i.first;
return true;
}
}
return false;
}
} // namespace media::driver_utils