blob: 25cfb09c97da1fde41415dc6cc833add3016489e [file] [log] [blame]
// 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.
#ifndef SRC_MEDIA_AUDIO_LIB_FORMAT_TRAITS_H_
#define SRC_MEDIA_AUDIO_LIB_FORMAT_TRAITS_H_
#include <fuchsia/media/cpp/fidl.h>
#include <cmath>
#include <memory>
#include "src/lib/fxl/strings/string_printf.h"
#include "src/media/audio/lib/format/constants.h"
#include "src/media/audio/lib/format/format.h"
#include "src/media/audio/lib/format2/sample_converter.h"
namespace media::audio {
template <fuchsia::media::AudioSampleFormat SampleFormat>
struct SampleFormatTraits {
// type SampleT = type of an individual sample
// SampleT kSilentValue = when repeated, produces silent audio
// SampleT kUnityValue = full-scale amplitude
// float ToFloat(SampleT) = convert from SampleT to float
// std::string ToString(SampleT) = convert from SampleT to text
// size_t CharsPerSample = width of a ToString value
};
template <>
struct SampleFormatTraits<fuchsia::media::AudioSampleFormat::UNSIGNED_8> {
using SampleT = uint8_t;
static constexpr SampleT kSilentValue = 0x80;
static constexpr SampleT kUnityValue = 0xFF;
static float ToFloat(SampleT sample) {
return media_audio::SampleConverter<SampleT>::ToFloat(sample);
}
static std::string ToString(SampleT sample) { return fxl::StringPrintf("%02X", 0x0ff & sample); }
static constexpr size_t kCharsPerSample = 2;
};
template <>
struct SampleFormatTraits<fuchsia::media::AudioSampleFormat::SIGNED_16> {
using SampleT = int16_t;
static constexpr SampleT kSilentValue = 0;
static constexpr SampleT kUnityValue = 0x7FFF;
static float ToFloat(SampleT sample) {
return media_audio::SampleConverter<SampleT>::ToFloat(sample);
}
static std::string ToString(SampleT sample) {
return fxl::StringPrintf("%04X", static_cast<uint16_t>(sample));
}
static constexpr size_t kCharsPerSample = 4;
};
template <>
struct SampleFormatTraits<fuchsia::media::AudioSampleFormat::SIGNED_24_IN_32> {
using SampleT = int32_t;
static constexpr SampleT kSilentValue = 0;
static constexpr SampleT kUnityValue = 0x7FFFFF00;
static float ToFloat(SampleT sample) {
return media_audio::SampleConverter<SampleT>::ToFloat(sample);
}
static std::string ToString(SampleT sample) { return fxl::StringPrintf("%08X", sample); }
static constexpr size_t kCharsPerSample = 8;
};
template <>
struct SampleFormatTraits<fuchsia::media::AudioSampleFormat::FLOAT> {
using SampleT = float;
static constexpr SampleT kSilentValue = 0;
static constexpr SampleT kUnityValue = 1.0f;
static float ToFloat(SampleT sample) {
return media_audio::SampleConverter<SampleT>::ToFloat(sample);
}
static std::string ToString(SampleT sample) { return fxl::StringPrintf("%9.6f", sample); }
static constexpr size_t kCharsPerSample = 9;
};
} // namespace media::audio
#endif // SRC_MEDIA_AUDIO_LIB_FORMAT_TRAITS_H_