vdr-plugin-softhddevice-drm-gles 1.6.4-d0291bb
audio.h
Go to the documentation of this file.
1// SPDX-License-Identifier: AGLP-3.0-or-later
2
20#ifndef __AUDIO_H
21#define __AUDIO_H
22
23#include <atomic>
24#include <chrono>
25#include <mutex>
26#include <vector>
27
28extern "C" {
29#include <libavcodec/avcodec.h>
30#include <libavfilter/avfilter.h>
31}
32
33#include <alsa/asoundlib.h>
34
35#include <vdr/thread.h>
36
37#include "event.h"
38#include "filllevel.h"
39#include "pidcontroller.h"
40#include "ringbuffer.h"
41
42class cSoftHdConfig;
43class cSoftHdDevice;
44
50class cSoftHdAudio : public cThread {
51public:
53
54 void LazyInit(void);
55 void Exit(void);
56 int Setup(AVCodecContext *, int , int , int);
57 void SetPaused(bool);
58 bool IsPaused(void) { return m_paused; };
59 void Filter(AVFrame *, AVCodecContext *);
60 void EnqueueSpdif(uint16_t *, int, AVFrame *);
62
63 void FlushBuffers(void);
64 int GetUsedBytes(void);
68 int GetPassthrough(void) const { return m_passthrough; }
69 bool HasInputPts(void) { return m_inputPts != AV_NOPTS_VALUE; }
73
74 void SetEq(int[18], int);
75 void SetVolume(int);
78 void SetNormalize(bool, int);
79 void SetCompression(bool, int);
80 void SetStereoDescent(int);
81 void SetPassthroughMask(int);
84
86 void ClockDriftCompensation(void);
87 void ResetHwDelayBaseline(void);
88 void SetHwDelayBaseline(void);
89
90protected:
91 virtual void Action(void);
92
93private:
94 constexpr static int AUDIO_MIN_BUFFER_FREE = 3072 * 8 * 8;
95 constexpr static int NORMALIZE_MAX_INDEX = 128;
96 constexpr static int AV_SYNC_BORDER_MS = 5000;
101 cPidController m_pidController{3, 0.005, 0, 1000};
102 std::chrono::steady_clock::time_point m_lastPidInvocation;
105
106 // common audio, alsa
107 bool m_initialized = false;
108 const int m_bytesPerSample = 2;
109 unsigned int m_hwSampleRate = 0;
110 unsigned int m_hwNumChannels = 0;
112 std::mutex m_mutex;
113 std::mutex m_pauseMutex;
114 std::vector<Event> m_eventQueue;
115 std::atomic<double> m_pitchPpm = 0;
117
119
121 std::atomic<bool> m_paused = true;
122
125 const char *m_pPCMDevice;
129 std::vector<uint16_t> m_pauseBurst;
132
133 void Enqueue(uint16_t *, int, AVFrame *);
134 void EnqueueFrame(AVFrame *);
135 bool SendAudio(int);
136 bool SendPause(void);
137 void BuildPauseBurst(void);
138 void Stop(void);
139
140 // Normalizer
142 const int m_normalizeSamples = 4096;
148 const int m_normalizeMinFactor = 100;
150 void Normalize(uint16_t *, int);
151
152 // Compressor
156 void Compress(uint16_t *, int);
157
158 // Amplifier
161 int m_volume = 0;
162 void SoftAmplify(int16_t *, int);
163
164 // Equalizer
166 float m_equalizerBand[18];
167
168 // mixer
169 const char *m_pMixerDevice = nullptr;
170 const char *m_pMixerChannel;
171
172 // filter
179 AVFrame *FilterGetFrame(void);
181
182 // ring buffer variables
183 static constexpr unsigned RINGBUFFER_SIZE = 3 * 5 * 7 * 8 * 2 * 1000;
185
186 // alsa
192
193 int AlsaSetup(int, int, int);
194 char *OpenAlsaDevice(const char *, int);
195 char *FindAlsaDevice(const char *, const char *, int);
196 void AlsaInitPCMDevice(void);
197 void AlsaInitMixer(void);
198 void AlsaSetVolume(int);
199 void AlsaInit(void);
200 void AlsaExit(void);
201 void FlushAlsaBuffers(void);
202 void DropAlsaBuffers(void);
203 void FlushAlsaBuffersInternal(bool);
204 bool CyclicCall(void);
205 void ProcessEvents(void);
206 void HandleError(int);
207
209 int64_t PtsToMs(int64_t pts) { return pts * av_q2d(*m_pTimebase) * 1000; }
212 int FramesToMs(int frames) { return (int64_t)frames * 1000 / m_hwSampleRate; }
213 double FramesToMsDouble(int frames) { return (double)frames * 1000 / m_hwSampleRate; }
214};
215
216#endif
Event Receiver.
Definition event.h:91
Fill Level Low Pass Filter.
Definition filllevel.h:20
PID Controller.
Audio Interface.
Definition audio.h:50
void LazyInit(void)
Initialize audio output module (alsa)
Definition audio.cpp:1195
char * OpenAlsaDevice(const char *, int)
Open an alsa device.
Definition audio.cpp:1560
bool SendPause(void)
Write pause to passthrough device.
Definition audio.cpp:1478
int m_alsaBufferSizeFrames
alsa buffer size in frames
Definition audio.h:103
char * FindAlsaDevice(const char *, const char *, int)
Find alsa device giving some search hints.
Definition audio.cpp:1612
void ResetHwDelayBaseline(void)
Reset the hw delay baseline.
Definition audio.cpp:1532
virtual void Action(void)
Audio thread loop, started with Start().
Definition audio.cpp:1319
bool m_appendAES
flag ato utomatic append AES
Definition audio.h:127
void Filter(AVFrame *, AVCodecContext *)
Send audio frame to filter and enqueue it.
Definition audio.cpp:938
cSoftHdRingbuffer m_pRingbuffer
sample ring buffer
Definition audio.h:184
int m_pitchAdjustFrameCounter
counter for pitch adjustment frames
Definition audio.h:116
double FramesToMsDouble(int frames)
Definition audio.h:213
int64_t GetInputPtsMs(void)
Definition audio.h:70
int Setup(AVCodecContext *, int, int, int)
Alsa setup wrapper.
Definition audio.cpp:849
void Enqueue(uint16_t *, int, AVFrame *)
Send audio data to ringbuffer.
Definition audio.cpp:797
int m_compressionMaxFactor
max. compression factor
Definition audio.h:155
cSoftHdDevice * m_pDevice
pointer to device
Definition audio.h:97
const char * m_pPCMDevice
PCM device name.
Definition audio.h:125
int GetPassthrough(void) const
Definition audio.h:68
int m_volume
current volume (0 .. 1000)
Definition audio.h:161
void SetPassthroughMask(int)
Set audio passthrough mask.
Definition audio.cpp:1176
void SetHwDelayBaseline(void)
Set the hw delay baseline.
Definition audio.cpp:1512
void SetStereoDescent(int)
Set stereo loudness descent.
Definition audio.cpp:1165
int64_t GetHardwareOutputPtsMs(void)
Get the hardware output PTS in milliseconds.
Definition audio.cpp:1043
std::mutex m_pauseMutex
mutex for a safe thread pausing
Definition audio.h:113
int64_t GetHardwareOutputPtsTimebaseUnits(void)
Get the hardware output PTS in timebase units.
Definition audio.cpp:1084
void EnqueueSpdif(uint16_t *, int, AVFrame *)
Enqueue prepared spdif bursts in audio output queue.
Definition audio.cpp:775
AVFilterContext * m_pBuffersinkCtx
Definition audio.h:177
cPidController m_pidController
PID controller for clock drift compensation with tuning values coming from educated guesses.
Definition audio.h:101
void SetVolume(int)
Set mixer volume (0-1000)
Definition audio.cpp:1098
AVFilterContext * m_pBuffersrcCtx
Definition audio.h:176
void HandleError(int)
Handle an alsa error.
Definition audio.cpp:1231
AVFilterGraph * m_pFilterGraph
Definition audio.h:175
int m_passthrough
passthrough mask
Definition audio.h:124
const int m_bytesPerSample
number of bytes per sample
Definition audio.h:108
const char * m_pMixerChannel
mixer channel name
Definition audio.h:170
void FlushAlsaBuffersInternal(bool)
Flush alsa buffers internally.
Definition audio.cpp:1264
unsigned int m_hwSampleRate
hardware sample rate in Hz
Definition audio.h:109
int64_t PtsToMs(int64_t pts)
Definition audio.h:209
cBufferFillLevelLowPassFilter m_fillLevel
low pass filter for the buffer fill level
Definition audio.h:100
IEventReceiver * m_pEventReceiver
pointer to event receiver
Definition audio.h:99
void ProcessEvents(void)
Process queued events and forward them to event receiver.
Definition audio.cpp:1544
int GetAvResyncBorderMs(void)
Definition audio.h:72
int MsToFrames(int milliseconds)
Definition audio.h:211
std::vector< Event > m_eventQueue
event queue for incoming events
Definition audio.h:114
bool SendAudio(int)
Write regular audio data from the ringbuffer to the hardware.
Definition audio.cpp:1418
void DropSamplesOlderThanPtsMs(int64_t)
Drop samples older than the given PTS.
Definition audio.cpp:698
AVRational * m_pTimebase
pointer to AVCodecContext pkts_timebase
Definition audio.h:111
void SetAutoAES(bool appendAes)
Definition audio.h:82
static constexpr int AUDIO_MIN_BUFFER_FREE
Minimum free space in audio buffer 8 packets for 8 channels.
Definition audio.h:94
bool m_compression
flag to use compress volume
Definition audio.h:153
int64_t GetOutputPtsMs(void)
Get the output PTS of the ringbuffer.
Definition audio.cpp:1022
bool m_normalize
flag to use volume normalize
Definition audio.h:141
AVFrame * FilterGetFrame(void)
Get frame from filter sink.
Definition audio.cpp:872
void ClockDriftCompensation(void)
Calculate clock drift compensation.
Definition audio.cpp:1966
int m_filterChanged
filter has changed
Definition audio.h:173
void AlsaExit(void)
Cleanup the alsa audio output module.
Definition audio.cpp:1944
void SetCompression(bool, int)
Set volume compression parameters.
Definition audio.cpp:1147
void Stop(void)
Stop the thread.
Definition audio.cpp:1337
snd_mixer_elem_t * m_pAlsaMixerElem
alsa mixer element
Definition audio.h:189
void BuildPauseBurst(void)
Build a pause spdif burst with the size of the last recognized normal spdif audio.
Definition audio.cpp:754
void AlsaInit(void)
Initialize the alsa audio output module.
Definition audio.cpp:1928
void Compress(uint16_t *, int)
Compress audio samples.
Definition audio.cpp:162
int64_t m_inputPts
pts clock (last pts in ringbuffer)
Definition audio.h:120
int m_normalizeFactor
current normalize factor
Definition audio.h:147
void AlsaSetVolume(int)
Set alsa mixer volume (0-1000)
Definition audio.cpp:1781
int64_t GetOutputPtsMsInternal(void)
Definition audio.cpp:1029
cSoftHdConfig * m_pConfig
pointer to config
Definition audio.h:98
std::atomic< double > m_pitchPpm
pitch adjustment in ppm. Positive values are faster
Definition audio.h:115
void Exit(void)
Cleanup audio output module (alsa)
Definition audio.cpp:1210
int m_amplifier
software volume amplify factor
Definition audio.h:159
int GetUsedBytes(void)
Get used bytes in audio ringbuffer.
Definition audio.cpp:1004
void SetPaused(bool)
Set audio playback pause state.
Definition audio.cpp:1121
void AlsaInitMixer(void)
Initialize alsa mixer.
Definition audio.cpp:1727
int AlsaSetup(int, int, int)
Setup alsa audio for requested format.
Definition audio.cpp:1803
bool IsPaused(void)
Definition audio.h:58
void SetSoftvol(bool softVolume)
Definition audio.h:77
static constexpr int NORMALIZE_MAX_INDEX
number of normalize average samples
Definition audio.h:95
const char * m_pPassthroughDevice
passthrough device name
Definition audio.h:126
int m_normalizeMaxFactor
max. normalize factor
Definition audio.h:149
int64_t GetHardwareOutputDelayMs(void)
Get the hardware delay in milliseconds.
Definition audio.cpp:1065
bool m_alsaUseMmap
use mmap
Definition audio.h:191
void Normalize(uint16_t *, int)
Normalize audio samples.
Definition audio.cpp:81
int m_compressionFactor
current compression factor
Definition audio.h:154
int64_t MsToPts(int64_t ptsMs)
Definition audio.h:210
int m_spdifBurstSize
size of the current spdif burst
Definition audio.h:128
const int m_normalizeMinFactor
min. normalize factor
Definition audio.h:148
const int m_normalizeSamples
number of normalize samples
Definition audio.h:142
int m_filterReady
filter is ready
Definition audio.h:174
void SetEq(int[18], int)
Set equalizer bands.
Definition audio.cpp:248
int m_normalizeReady
index normalize counter
Definition audio.h:146
const char * m_pMixerDevice
mixer device name (not used)
Definition audio.h:169
void DropAlsaBuffers(void)
Drop alsa buffers.
Definition audio.cpp:1254
bool HasInputPts(void)
Definition audio.h:69
uint32_t m_normalizeAverage[NORMALIZE_MAX_INDEX]
average of n last normalize sample blocks
Definition audio.h:144
bool CyclicCall(void)
Cyclic audio playback call.
Definition audio.cpp:1357
void AlsaInitPCMDevice(void)
Search for an alsa pcm device and open it.
Definition audio.cpp:1648
unsigned int m_hwNumChannels
number of hardware channels
Definition audio.h:110
bool m_initialized
class initialized
Definition audio.h:107
int FramesToMs(int frames)
Definition audio.h:212
int m_stereoDescent
volume descent for stereo
Definition audio.h:160
std::mutex m_mutex
mutex for thread safety
Definition audio.h:112
static constexpr int AV_SYNC_BORDER_MS
absolute max a/v difference in ms which should trigger a resync
Definition audio.h:96
int m_alsaRatio
internal -> mixer ratio * 1000
Definition audio.h:190
int m_packetCounter
packet counter for logging
Definition audio.h:104
void SetDownmix(int downMix)
Definition audio.h:76
static constexpr unsigned RINGBUFFER_SIZE
default ring buffer size ~2s 8ch 16bit (3 * 5 * 7 * 8)
Definition audio.h:183
void EnqueueFrame(AVFrame *)
Place samples in audio output queue.
Definition audio.cpp:730
void SoftAmplify(int16_t *, int)
Amplify the samples in software.
Definition audio.cpp:219
void FlushAlsaBuffers(void)
Flush alsa buffers.
Definition audio.cpp:1246
void SetNormalize(bool, int)
Set normalize volume parameters.
Definition audio.cpp:1135
snd_pcm_t * m_pAlsaPCMHandle
alsa pcm handle
Definition audio.h:187
int m_downmix
set stereo downmix
Definition audio.h:118
int m_useEqualizer
flag to use equalizer
Definition audio.h:165
float m_equalizerBand[18]
equalizer band
Definition audio.h:166
snd_mixer_t * m_pAlsaMixer
alsa mixer handle
Definition audio.h:188
snd_pcm_sframes_t m_hwBaseline
saves the hw delay (pause bursts) once a real audio frame to correctly do the AV-Sync
Definition audio.h:130
int m_normalizeIndex
index into normalize average table
Definition audio.h:145
std::chrono::steady_clock::time_point m_lastPidInvocation
last time the PID controller was invoked
Definition audio.h:102
int m_normalizeCounter
normalize sample counter
Definition audio.h:143
std::atomic< bool > m_paused
audio is paused
Definition audio.h:121
bool IsBufferFull(void)
Definition audio.h:61
bool m_firstRealAudioReceived
false, as long as no real audio was sent - used to trigger the baseline set
Definition audio.h:131
int CheckForFilterReady(AVCodecContext *)
Check if the filter has changed and is ready, init the filter if needed.
Definition audio.cpp:905
int InitFilter(AVCodecContext *)
Init audio filters.
Definition audio.cpp:473
std::vector< uint16_t > m_pauseBurst
holds the burst data itself
Definition audio.h:129
void SetTimebase(AVRational *timebase)
Definition audio.h:83
void FlushBuffers(void)
Flush audio buffers.
Definition audio.cpp:981
bool m_softVolume
flag to use soft volume
Definition audio.h:123
Plugin Configuration.
Definition config.h:29
Output Device Implementation.
Ringbuffer (FIFO) Implementation.
Definition ringbuffer.h:42
size_t FreeBytes(void)
Get free bytes in ring buffer.
State Machine and Event Header File.
Low-pass Filter for Audio Buffer Fill Level Measurement Header File.
#define AV_NOPTS_VALUE
Definition misc.h:74
PID (proportional, integral, derivative) Controller Header File.
Audio Ringbuffer Header File.