// 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.

#ifndef GARNET_BIN_MEDIA_AUDIO_CORE_MIXER_CONSTANTS_H_
#define GARNET_BIN_MEDIA_AUDIO_CORE_MIXER_CONSTANTS_H_

#include <stdint.h>

namespace media::audio {

constexpr int32_t kMaxInt24In32 = std::numeric_limits<int32_t>::max() & ~0x0FF;
constexpr int32_t kMinInt24In32 = std::numeric_limits<int32_t>::min();

constexpr int32_t kFloatToInt8 = -std::numeric_limits<int8_t>::min();
constexpr int32_t kFloatToInt16 = -std::numeric_limits<int16_t>::min();
constexpr int64_t kFloatToInt24In32 = -static_cast<int64_t>(kMinInt24In32);

constexpr int32_t kOffsetInt8ToUint8 =
    std::numeric_limits<uint8_t>::min() - std::numeric_limits<int8_t>::min();

constexpr float kInt8ToFloat = 1.0f / kFloatToInt8;
constexpr float kInt16ToFloat = 1.0f / kFloatToInt16;
constexpr double kInt24In32ToFloat = 1.0 / kFloatToInt24In32;

// The number of fractional bits used when expressing timestamps (in frame
// units) as fixed point integers.  Ultimately, this determines the resolution
// that a source of PCM frames may be sampled at; there are 2^frac_bits
// positions between audio frames that the source stream may be sampled at.
//
// Using 64-bit signed timestamps means that we have 50 bits of whole frame
// units to work with.  At 192KHz, this allows for ~186.3 years of usable range
// before rollover when starting from a frame counter of 0.
//
// With 13 bits of fractional position, a mix job's interpolation precision is
// only +/-61 ppm. Across multiple jobs we stay in sync, but for any single mix,
// this is our granularity. As an example, when resampling a 48 kHz audio
// packet, the "clicks on the dial" of our actual resampling rates are multiples
// of 6 Hz. Again, we do correct any positional error at mix job boundaries.
//
// This also affects our interpolation accuracy: because fractional position has
// a potential error of 2^-13, the worst-case error for interpolated values is
// [pos_err * max_intersample_delta]. This means full-scale very high-frequency
// signals are only guaranteed bit-for-bit accurate in the top 13 bits.
// TODO(mpuryear): MTWN-86 Consider even more fractional position precision.
constexpr uint32_t kPtsFractionalBits = 13;
// Used in places where PTS must be an integral number of frames.
constexpr uint32_t kPtsFractionalMask = (1 << kPtsFractionalBits) - 1;

// Compile time constant guaranteed to never be used as a valid generation ID
// (by the various things which use generation IDs to track state changes).
constexpr uint32_t kInvalidGenerationId = 0;

}  // namespace media::audio

#endif  // GARNET_BIN_MEDIA_AUDIO_CORE_MIXER_CONSTANTS_H_
