vdr-plugin-softhddevice-drm-gles 1.5.9-20e15de
audio.h
Go to the documentation of this file.
1
21#ifndef __AUDIO_H
22#define __AUDIO_H
23
24#include <atomic>
25#include <chrono>
26#include <mutex>
27#include <vector>
28
29extern "C" {
30#include <libavcodec/avcodec.h>
31#include <libavfilter/avfilter.h>
32}
33
34#include <alsa/asoundlib.h>
35
36#include "event.h"
37#include "filllevel.h"
38#include "pidcontroller.h"
39#include "ringbuffer.h"
40
41#define NORMALIZE_MAX_INDEX 128
42#define AV_SYNC_BORDER_MS 5000
43
44class cAudioThread;
45class cSoftHdConfig;
46class cSoftHdDevice;
47
52public:
54
55 void LazyInit(void);
56 void Exit(void);
57 int Setup(AVCodecContext *, int , int , int);
58 void SetPaused(bool);
59 bool IsPaused(void) { return m_paused; };
60 void Filter(AVFrame *, AVCodecContext *);
61 void Enqueue(uint16_t *, int, AVFrame *);
63
64 void FlushBuffers(void);
65 int GetUsedBytes(void);
66 int GetFreeBytes(void);
67 int64_t GetHardwareOutputPtsMs(void);
69 int GetPassthrough(void) const { return m_passthrough; }
70 bool HasPts(void) { return m_inputPts != AV_NOPTS_VALUE; }
71 int64_t GetInputPtsMs(void) { return PtsToMs(m_inputPts); }
72 int64_t GetOutputPtsMs(void);
73
74 void SetEq(int[18], int);
75 void SetVolume(int);
76 void SetDownmix(int downMix) { m_downmix = downMix; };
77 void SetSoftvol(bool softVolume) { m_softVolume = softVolume; };
78 void SetNormalize(bool, int);
79 void SetCompression(bool, int);
80 void SetStereoDescent(int);
81 void SetPassthrough(int);
82 void SetAutoAES(bool appendAes) { m_appendAES = appendAes; }
83 void SetTimebase(AVRational *timebase) { m_pTimebase = timebase; };
84
85 void FlushAlsaBuffers(void);
86 bool CyclicCall(void);
87 void DropSamplesOlderThanPtsMs(int64_t);
88 void ProcessEvents(void);
89 void ClockDriftCompensation(void);
90
91private:
92 constexpr static int AUDIO_MIN_BUFFER_FREE = 3072 * 8 * 8;
97 cPidController m_pidController{3, 0.005, 0, 1000};
98 std::chrono::steady_clock::time_point m_lastPidInvocation;
101
102 // thread
104
105 // common audio, alsa
106 bool m_initialized = false;
107 const int m_bytesPerSample = 2;
108 unsigned int m_hwSampleRate = 0;
109 unsigned int m_hwNumChannels = 0;
110 AVRational *m_pTimebase;
111 std::mutex m_mutex;
112 std::mutex m_pauseMutex;
113 std::vector<Event> m_eventQueue;
114 std::atomic<double> m_pitchPpm = 0;
116
118
120 std::atomic<bool> m_paused = true;
121
124 const char *m_pPCMDevice;
127
128 // Normalizer
130 const int m_normalizeSamples = 4096;
136 const int m_normalizeMinFactor = 100;
138
139 // Compressor
143
144 // Amplifier
148
149 // Equalizer
151 float m_equalizerBand[18];
152
153 // mixer
154 const char *m_pMixerDevice = nullptr;
155 const char *m_pMixerChannel;
156
157 // filter
160 AVFilterGraph *m_pFilterGraph = nullptr;
161 AVFilterContext *m_pBuffersrcCtx;
162 AVFilterContext *m_pBuffersinkCtx;
163 AVFrame *FilterGetFrame(void);
164 int CheckForFilterReady(AVCodecContext *);
165
166 // ring buffer variables
167 static constexpr unsigned RINGBUFFER_SIZE = 3 * 5 * 7 * 8 * 2 * 1000;
169
170 void Normalize(uint16_t *, int);
171 void Compress(uint16_t *, int);
172 void SoftAmplify(int16_t *, int);
173 int InitFilter(AVCodecContext *);
174
175 void EnqueueFrame(AVFrame *);
176
177 // alsa
178 snd_pcm_t *m_pAlsaPCMHandle;
179 snd_mixer_t *m_pAlsaMixer = nullptr;
180 snd_mixer_elem_t *m_pAlsaMixerElem = nullptr;
183
184 void HandleError(int);
185 char *OpenAlsaDevice(const char *, int);
186 char *FindAlsaDevice(const char *, const char *, int);
187 int AlsaSetup(int channels, int sample_rate, int passthrough);
188 void AlsaInitPCMDevice(void);
189 void AlsaInitMixer(void);
190 void AlsaSetVolume(int);
191 void AlsaInit(void);
192 void AlsaExit(void);
193 int64_t PtsToMs(int64_t pts) { return pts * av_q2d(*m_pTimebase) * 1000; }
194 int64_t MsToPts(int64_t ptsMs) { return ptsMs / av_q2d(*m_pTimebase) / 1000; }
195 int MsToFrames(int milliseconds) { return (int64_t)milliseconds * m_hwSampleRate / 1000; }
196 int FramesToMs(int frames) { return (int64_t)frames * 1000 / m_hwSampleRate; }
197 double FramesToMsDouble(int frames) { return (double)frames * 1000 / m_hwSampleRate; }
198
199 int64_t GetOutputPtsMsInternal(void);
200};
201
202#endif
#define NORMALIZE_MAX_INDEX
number of average values
Definition audio.h:41
Audio thread class.
Definition threads.h:84
cSoftHdAudio - Audio class
Definition audio.h:51
void LazyInit(void)
Initialize audio output module.
Definition audio.cpp:1018
char * OpenAlsaDevice(const char *, int)
Open alsa device.
Definition audio.cpp:1193
int m_alsaBufferSizeFrames
alsa buffer size in frames
Definition audio.h:99
char * FindAlsaDevice(const char *, const char *, int)
Find alsa device giving some search hints.
Definition audio.cpp:1245
bool m_appendAES
flag ato utomatic append AES
Definition audio.h:126
void Filter(AVFrame *, AVCodecContext *)
Send audio frame to filter and enqueue it.
Definition audio.cpp:772
cSoftHdRingbuffer m_pRingbuffer
sample ring buffer
Definition audio.h:168
int m_pitchAdjustFrameCounter
counter for pitch adjustment frames
Definition audio.h:115
double FramesToMsDouble(int frames)
Definition audio.h:197
int64_t GetInputPtsMs(void)
Definition audio.h:71
int AlsaSetup(int channels, int sample_rate, int passthrough)
Setup alsa audio for requested format.
Definition audio.cpp:1437
int Setup(AVCodecContext *, int, int, int)
Setup alsa.
Definition audio.cpp:683
void Enqueue(uint16_t *, int, AVFrame *)
Send audio data to ringbuffer.
Definition audio.cpp:632
int m_compressionMaxFactor
max. compression factor
Definition audio.h:142
cSoftHdDevice * m_pDevice
pointer to device
Definition audio.h:93
const char * m_pPCMDevice
PCM device name.
Definition audio.h:124
int GetPassthrough(void) const
Definition audio.h:69
int m_volume
current volume (0 .. 1000)
Definition audio.h:147
cAudioThread * m_pAudioThread
pointer to audio thread
Definition audio.h:103
void SetStereoDescent(int)
Set stereo loudness descent.
Definition audio.cpp:993
int64_t GetHardwareOutputPtsMs(void)
Get the hardware output PTS in milliseconds.
Definition audio.cpp:888
std::mutex m_pauseMutex
mutex for a safe thread pausing
Definition audio.h:112
int64_t GetHardwareOutputPtsTimebaseUnits(void)
Get the hardware output PTS in timebase units.
Definition audio.cpp:912
bool HasPts(void)
Definition audio.h:70
AVFilterContext * m_pBuffersinkCtx
Definition audio.h:162
cPidController m_pidController
PID controller for clock drift compensation with tuning values coming from educated guesses.
Definition audio.h:97
void SetVolume(int)
Set mixer volume (0-1000)
Definition audio.cpp:925
AVFilterContext * m_pBuffersrcCtx
Definition audio.h:161
void HandleError(int)
handle error
Definition audio.cpp:1052
AVFilterGraph * m_pFilterGraph
Definition audio.h:160
int m_passthrough
passthrough mask
Definition audio.h:123
const int m_bytesPerSample
number of bytes per sample
Definition audio.h:107
const char * m_pMixerChannel
mixer channel name
Definition audio.h:155
unsigned int m_hwSampleRate
hardware sample rate in Hz
Definition audio.h:108
int64_t PtsToMs(int64_t pts)
Definition audio.h:193
cBufferFillLevelLowPassFilter m_fillLevel
low pass filter for the buffer fill level
Definition audio.h:96
IEventReceiver * m_pEventReceiver
pointer to event receiver
Definition audio.h:95
void ProcessEvents(void)
Process queued events and forward to event receiver.
Definition audio.cpp:1571
int MsToFrames(int milliseconds)
Definition audio.h:195
std::vector< Event > m_eventQueue
event queue for incoming events
Definition audio.h:113
void DropSamplesOlderThanPtsMs(int64_t)
Drop samples older than the given PTS.
Definition audio.cpp:570
AVRational * m_pTimebase
pointer to AVCodecContext pkts_timebase
Definition audio.h:110
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:92
bool m_compression
flag to use compress volume
Definition audio.h:140
int64_t GetOutputPtsMs(void)
Get the output PTS of the ringbuffer.
Definition audio.cpp:867
bool m_normalize
flag to use volume normalize
Definition audio.h:129
AVFrame * FilterGetFrame(void)
Get frame from filter sink.
Definition audio.cpp:706
void ClockDriftCompensation(void)
Calculate clock drift compensation.
Definition audio.cpp:1588
int m_filterChanged
filter has changed
Definition audio.h:158
void AlsaExit(void)
Cleanup alsa audio output module.
Definition audio.cpp:1555
void SetCompression(bool, int)
Set volume compression parameters.
Definition audio.cpp:975
snd_mixer_elem_t * m_pAlsaMixerElem
alsa mixer element
Definition audio.h:180
void AlsaInit(void)
Initialize alsa audio output module.
Definition audio.cpp:1539
void Compress(uint16_t *, int)
Compress audio.
Definition audio.cpp:233
int64_t m_inputPts
pts clock (last pts in ringbuffer)
Definition audio.h:119
int m_normalizeFactor
current normalize factor
Definition audio.h:135
void AlsaSetVolume(int)
Set alsa mixer volume (0-1000)
Definition audio.cpp:1414
int64_t GetOutputPtsMsInternal(void)
Definition audio.cpp:874
cSoftHdConfig * m_pConfig
pointer to config
Definition audio.h:94
std::atomic< double > m_pitchPpm
pitch adjustment in ppm. Positive values are faster
Definition audio.h:114
void Exit(void)
Cleanup audio output module.
Definition audio.cpp:1029
int m_amplifier
software volume amplify factor
Definition audio.h:145
int GetUsedBytes(void)
Get used bytes in audio ringbuffer.
Definition audio.cpp:849
void SetPaused(bool)
Set audio playback paused state.
Definition audio.cpp:948
void AlsaInitMixer(void)
Initialize alsa mixer.
Definition audio.cpp:1360
bool IsPaused(void)
Definition audio.h:59
void SetSoftvol(bool softVolume)
Definition audio.h:77
const char * m_pPassthroughDevice
passthrough device name
Definition audio.h:125
void SetPassthrough(int)
Set audio passthrough mask.
Definition audio.cpp:1004
int m_normalizeMaxFactor
max. normalize factor
Definition audio.h:137
bool m_alsaUseMmap
use mmap
Definition audio.h:182
void Normalize(uint16_t *, int)
Normalize audio.
Definition audio.cpp:152
int m_compressionFactor
current compression factor
Definition audio.h:141
int64_t MsToPts(int64_t ptsMs)
Definition audio.h:194
const int m_normalizeMinFactor
min. normalize factor
Definition audio.h:136
const int m_normalizeSamples
number of normalize samples
Definition audio.h:130
int m_filterReady
filter is ready
Definition audio.h:159
void SetEq(int[18], int)
Set equalizer bands.
Definition audio.cpp:319
int m_normalizeReady
index normalize counter
Definition audio.h:134
const char * m_pMixerDevice
mixer device name (not used)
Definition audio.h:154
uint32_t m_normalizeAverage[NORMALIZE_MAX_INDEX]
average of n last normalize sample blocks
Definition audio.h:132
bool CyclicCall(void)
Cyclic audio playback call.
Definition audio.cpp:1109
void AlsaInitPCMDevice(void)
Search for an alsa pcm device and open it.
Definition audio.cpp:1281
unsigned int m_hwNumChannels
number of hardware channels
Definition audio.h:109
bool m_initialized
class initialized
Definition audio.h:106
int FramesToMs(int frames)
Definition audio.h:196
int m_stereoDescent
volume descent for stereo
Definition audio.h:146
std::mutex m_mutex
mutex for thread safety
Definition audio.h:111
int m_alsaRatio
internal -> mixer ratio * 1000
Definition audio.h:181
int m_packetCounter
packet counter for logging
Definition audio.h:100
void SetDownmix(int downMix)
Definition audio.h:76
int GetFreeBytes(void)
Get free bytes in audio ringbuffer.
Definition audio.cpp:839
static constexpr unsigned RINGBUFFER_SIZE
default ring buffer size ~2s 8ch 16bit (3 * 5 * 7 * 8)
Definition audio.h:167
void EnqueueFrame(AVFrame *)
Place samples in audio output queue.
Definition audio.cpp:602
void SoftAmplify(int16_t *, int)
Software amplifier.
Definition audio.cpp:290
void FlushAlsaBuffers(void)
Flush alsa buffers.
Definition audio.cpp:1066
void SetNormalize(bool, int)
Set normalize volume parameters.
Definition audio.cpp:963
snd_pcm_t * m_pAlsaPCMHandle
alsa pcm handle
Definition audio.h:178
int m_downmix
set stereo downmix
Definition audio.h:117
int m_useEqualizer
flag to use equalizer
Definition audio.h:150
float m_equalizerBand[18]
equalizer band
Definition audio.h:151
snd_mixer_t * m_pAlsaMixer
alsa mixer handle
Definition audio.h:179
int m_normalizeIndex
index into normalize average table
Definition audio.h:133
std::chrono::steady_clock::time_point m_lastPidInvocation
last time the PID controller was invoked
Definition audio.h:98
int m_normalizeCounter
normalize sample counter
Definition audio.h:131
std::atomic< bool > m_paused
audio is paused
Definition audio.h:120
bool IsBufferFull(void)
Definition audio.h:62
int CheckForFilterReady(AVCodecContext *)
Check if the filter has changed and is ready, init the filter if needed.
Definition audio.cpp:739
int InitFilter(AVCodecContext *)
Init filter.
Definition audio.cpp:395
void SetTimebase(AVRational *timebase)
Definition audio.h:83
void FlushBuffers(void)
Flush audio buffers.
Definition audio.cpp:816
bool m_softVolume
flag to use soft volume
Definition audio.h:122
cSoftHdRingbuffer - RingBuffer class
Definition ringbuffer.h:43
size_t FreeBytes(void)
Get free bytes in ring buffer.
State machine and event header file.
#define AV_NOPTS_VALUE
Definition misc.h:69
Proportinal, Integral, Derivative Controller.
Ringbuffer class header file.