mpd/src/pcm/Normalizer.hxx

50 lines
1.1 KiB
C++
Raw Normal View History

2023-03-13 11:39:47 +01:00
// SPDX-License-Identifier: LGPL-2.1
2023-03-13 11:56:06 +01:00
// Copyright The Music Player Daemon Project
// Based on AudioCompress (c)2007 busybee (http://beesbuzz.biz/
2023-03-13 11:56:06 +01:00
#pragma once
2023-03-13 12:20:54 +01:00
#include <cstddef>
2023-03-13 11:56:06 +01:00
#include <cstdint>
2023-03-13 12:45:01 +01:00
#include <span>
class PcmNormalizer {
///! Target level (on a scale of 0-32767)
static constexpr int target = 16384;
//! The maximum amount to amplify by
static constexpr int maxgain = 32;
//! How much inertia ramping has
static constexpr int smooth = 8;
//! History of the peak values
int *const peaks;
//! History of the gain values
int *const gain;
2023-03-13 12:20:54 +01:00
std::size_t pos = 0;
const std::size_t bufsz;
public:
2023-03-13 12:20:54 +01:00
PcmNormalizer(std::size_t history=400) noexcept
:peaks(new int[history]{}),
gain(new int[history]{}),
bufsz(history)
{
}
~PcmNormalizer() noexcept {
delete[] peaks;
delete[] gain;
}
//! Process 16-bit signed data
2023-03-13 12:45:01 +01:00
void ProcessS16(std::span<int16_t> audio) noexcept;
};
//! TODO: Compressor_Process_int32, Compressor_Process_float, others as needed
//! TODO: functions for getting at the peak/gain/clip history buffers (for monitoring)