vdr-plugin-softhddevice-drm-gles 1.6.7
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 <string>
27#include <vector>
28
29extern "C" {
30#include <libavcodec/avcodec.h>
31#include <libavfilter/avfilter.h>
32}
33
34#include <vdr/thread.h>
35
36#include "alsadevice.h"
37#include "audioprocessor.h"
38#include "event.h"
39#include "filllevel.h"
40#include "pidcontroller.h"
41#include "ringbuffer.h"
42
43class cSoftHdConfig;
44class cSoftHdDevice;
45
51class cSoftHdAudio : public cThread {
52public:
54
55 void LazyInit(void);
56 void Exit(void);
57 int Setup(AVRational, int , int , bool);
58 void SetPaused(bool);
59 bool IsPaused(void) { return m_paused; };
60 void Filter(AVFrame *, AVCodecContext *);
61 void EnqueueSpdif(const uint16_t *, int, int64_t pts);
63
64 void FlushBuffers(void);
65 int GetUsedRingbufferBytes(void);
66 int GetUsedRingbufferMs(void);
70 bool HasInputPts(void) { return m_inputPts != AV_NOPTS_VALUE; };
74
75 void SetVolume(int);
77
78 void SetNormalize(bool, int);
79 void SetCompression(bool, int);
80 void SetEqualizer(bool, int[18]);
81 void SetStereoDescent(int);
82
87 int GetPassthroughMask(void) const { return m_alsa.GetPassthroughMask(); };
88
90 void ClockDriftCompensation(void);
91 void ResetHwDelayBaseline(void);
92 void SetHwDelayBaseline(void);
93
94protected:
95 virtual void Action(void);
96
97private:
98 constexpr static int AUDIO_MIN_BUFFER_FREE = 3072 * 8 * 8;
99 constexpr static int AV_SYNC_BORDER_MS = 5000;
100 constexpr static int BYTES_PER_SAMPLE = 2;
101
107 cPidController m_pidController{3, 0.005, 0, 1000};
108 std::chrono::steady_clock::time_point m_lastPidInvocation;
110
111 // common audio
112 bool m_initialized = false;
113 std::mutex m_mutex;
114 std::mutex m_pauseMutex;
115 std::mutex m_queueMutex;
116 std::vector<Event> m_eventQueue;
117 std::atomic<double> m_pitchPpm = 0;
119
120 int m_volume = 0;
123
125 std::atomic<bool> m_paused = true;
126
129 std::vector<uint16_t> m_pauseBurst;
130 int m_hwBaseline = 0;
132
133 void Enqueue(const uint16_t *, int, int64_t);
134 void EnqueueFrame(AVFrame *);
135 bool SendAudio(int);
136 bool SendPause(void);
137 void RebuildPauseBurst(int);
138 void Stop(void);
139 void FlushAlsaBuffers(void);
140 void DropAlsaBuffers(void);
141 bool CyclicCall(void);
142 void ProcessEvents(void);
143
144 // audio manipulation
149
150 // mixer
151 const char *m_pMixerDevice = nullptr;
152 const char *m_pMixerChannel;
153
154 // filter
161 AVFrame *FilterGetFrame(void);
163 std::string BuildChannelMapFilter(const AVChannelLayout &);
164
165 // ring buffer variables
166 static constexpr unsigned RINGBUFFER_SIZE = 3 * 5 * 7 * 8 * 2 * 1000;
168
170};
171
172#endif
ALSA Output Device Header File.
Audio Manipulation Interface Header File.
Event Receiver.
Definition event.h:82
Alsa Interface.
Definition alsadevice.h:36
void SetPassthroughMask(int mask)
Definition alsadevice.h:61
int GetPassthroughMask(void) const
Definition alsadevice.h:62
void SetAutoAES(bool appendAes)
Definition alsadevice.h:63
int64_t PtsToMs(int64_t pts, double timebase)
Definition alsadevice.h:69
void SetDownmix(int downMix)
Definition alsadevice.h:64
Audio Manipulation.
Fill Level Low Pass Filter.
Definition filllevel.h:20
PID Controller.
Audio Interface.
Definition audio.h:51
void LazyInit(void)
Initialize audio output module (alsa)
Definition audio.cpp:933
AVRational m_timebase
AVCodecContext pkts_timebase.
Definition audio.h:122
bool SendPause(void)
Write pause to passthrough device.
Definition audio.cpp:1119
void ResetHwDelayBaseline(void)
Reset the hw delay baseline.
Definition audio.cpp:1149
virtual void Action(void)
Audio thread loop, started with Start().
Definition audio.cpp:993
void Filter(AVFrame *, AVCodecContext *)
Send audio frame to filter and enqueue it.
Definition audio.cpp:679
cSoftHdRingbuffer m_pRingbuffer
sample ring buffer
Definition audio.h:167
int m_pitchAdjustFrameCounter
counter for pitch adjustment frames
Definition audio.h:118
int64_t GetInputPtsMs(void)
Definition audio.h:71
cSoftHdDevice * m_pDevice
pointer to device
Definition audio.h:102
int m_volume
current volume (0 .. 1000)
Definition audio.h:120
void SetHwDelayBaseline(void)
Set the hw delay baseline.
Definition audio.cpp:1131
void SetStereoDescent(int)
Set stereo loudness descent.
Definition audio.cpp:918
void SetTimebase(AVRational timebase)
Definition audio.h:85
int GetUsedRingbufferMs(void)
Get used ms in audio ringbuffer.
Definition audio.cpp:755
int64_t GetHardwareOutputPtsMs(void)
Get the hardware output PTS in milliseconds.
Definition audio.cpp:795
int Setup(AVRational, int, int, bool)
Alsa setup wrapper.
Definition audio.cpp:582
std::mutex m_pauseMutex
mutex for a safe thread pausing
Definition audio.h:114
int64_t GetHardwareOutputPtsTimebaseUnits(void)
Get the hardware output PTS in timebase units.
Definition audio.cpp:832
AVFilterContext * m_pBuffersinkCtx
Definition audio.h:159
cPidController m_pidController
PID controller for clock drift compensation with tuning values coming from educated guesses.
Definition audio.h:107
void SetVolume(int)
Set mixer volume (0-1000)
Definition audio.cpp:846
void SetEqualizer(bool, int[18])
Set equalizer bands.
Definition audio.cpp:906
AVFilterContext * m_pBuffersrcCtx
Definition audio.h:158
AVFilterGraph * m_pFilterGraph
Definition audio.h:157
const char * m_pMixerChannel
mixer channel name
Definition audio.h:152
cBufferFillLevelLowPassFilter m_fillLevel
low pass filter for the buffer fill level
Definition audio.h:106
IEventReceiver * m_pEventReceiver
pointer to event receiver
Definition audio.h:105
void ProcessEvents(void)
Process queued events and forward them to event receiver.
Definition audio.cpp:1161
int GetAvResyncBorderMs(void)
Definition audio.h:73
std::vector< Event > m_eventQueue
event queue for incoming events
Definition audio.h:116
bool SendAudio(int)
Write regular audio data from the ringbuffer to the hardware.
Definition audio.cpp:1085
void DropSamplesOlderThanPtsMs(int64_t)
Drop samples older than the given PTS.
Definition audio.cpp:421
void Enqueue(const uint16_t *, int, int64_t)
Send audio data to ringbuffer.
Definition audio.cpp:527
void SetAutoAES(bool appendAes)
Definition audio.h:84
static constexpr int AUDIO_MIN_BUFFER_FREE
Minimum free space in audio buffer 8 packets for 8 channels.
Definition audio.h:98
int64_t GetOutputPtsMs(void)
Get the output PTS of the ringbuffer.
Definition audio.cpp:774
AVFrame * FilterGetFrame(void)
Get frame from filter sink.
Definition audio.cpp:613
void ClockDriftCompensation(void)
Calculate clock drift compensation.
Definition audio.cpp:1179
int m_filterChanged
filter has changed
Definition audio.h:155
void SetCompression(bool, int)
Set volume compression parameters.
Definition audio.cpp:894
void Stop(void)
Stop the thread.
Definition audio.cpp:1011
int64_t m_inputPts
pts clock (last pts in ringbuffer)
Definition audio.h:124
int64_t GetOutputPtsMsInternal(void)
Definition audio.cpp:781
cSoftHdConfig * m_pConfig
pointer to config
Definition audio.h:103
std::atomic< double > m_pitchPpm
pitch adjustment in ppm. Positive values are faster
Definition audio.h:117
void Exit(void)
Cleanup audio output module (alsa)
Definition audio.cpp:949
void SetPaused(bool)
Set audio playback pause state.
Definition audio.cpp:868
int GetPassthroughMask(void) const
Definition audio.h:87
bool IsPaused(void)
Definition audio.h:59
void SetSoftvol(bool softVolume)
Definition audio.h:76
int64_t GetHardwareOutputDelayMs(void)
Get the hardware delay in milliseconds.
Definition audio.cpp:815
void SetPassthroughMask(int mask)
Definition audio.h:83
bool m_useEqualizer
flag to use equalizer
Definition audio.h:148
int m_spdifBurstSize
size of the current spdif burst
Definition audio.h:128
int m_filterReady
filter is ready
Definition audio.h:156
const char * m_pMixerDevice
mixer device name (not used)
Definition audio.h:151
void DropAlsaBuffers(void)
Drop alsa buffers.
Definition audio.cpp:977
bool HasInputPts(void)
Definition audio.h:70
cAlsaDevice m_alsa
alsa device
Definition audio.h:104
bool CyclicCall(void)
Cyclic audio playback call.
Definition audio.cpp:1031
int m_hwBaseline
saves the hw delay (pause bursts) once a real audio frame to correctly do the AV-Sync
Definition audio.h:130
bool m_initialized
class initialized
Definition audio.h:112
int m_stereoDescent
volume descent for stereo
Definition audio.h:121
std::mutex m_mutex
mutex for thread safety
Definition audio.h:113
static constexpr int AV_SYNC_BORDER_MS
absolute max a/v difference in ms which should trigger a resync
Definition audio.h:99
int m_packetCounter
packet counter for logging
Definition audio.h:109
void SetDownmix(int downMix)
Definition audio.h:86
int GetUsedRingbufferBytes(void)
Get used bytes in audio ringbuffer.
Definition audio.cpp:745
static constexpr unsigned RINGBUFFER_SIZE
default ring buffer size ~2s 8ch 16bit (3 * 5 * 7 * 8)
Definition audio.h:166
void EnqueueFrame(AVFrame *)
Place samples in audio output queue.
Definition audio.cpp:453
void FlushAlsaBuffers(void)
Flush alsa buffers.
Definition audio.cpp:966
void SetNormalize(bool, int)
Set normalize volume parameters.
Definition audio.cpp:882
bool m_useNormalizer
flag to use volume normalize
Definition audio.h:146
static constexpr int BYTES_PER_SAMPLE
number of bytes per sample
Definition audio.h:100
std::chrono::steady_clock::time_point m_lastPidInvocation
last time the PID controller was invoked
Definition audio.h:108
std::atomic< bool > m_paused
audio is paused
Definition audio.h:125
std::mutex m_queueMutex
mutex for queue safety
Definition audio.h:115
bool IsBufferFull(void)
Definition audio.h:62
cAudioProcessor m_audioProcessor
Definition audio.h:145
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:646
int InitFilter(AVCodecContext *)
Init audio filters.
Definition audio.cpp:204
void RebuildPauseBurst(int)
Rebuild the pause spdif burst with the size of the last recognized normal spdif audio if size changed...
Definition audio.cpp:479
std::vector< uint16_t > m_pauseBurst
holds the burst data itself
Definition audio.h:129
void EnqueueSpdif(const uint16_t *, int, int64_t pts)
Enqueue prepared spdif bursts in audio output queue.
Definition audio.cpp:511
void FlushBuffers(void)
Flush audio buffers.
Definition audio.cpp:722
bool m_useCompressor
flag to use compress volume
Definition audio.h:147
bool m_softVolume
flag to use soft volume
Definition audio.h:127
Plugin Configuration.
Definition config.h:49
Output Device Implementation.
Ringbuffer (FIFO) Implementation.
Definition ringbuffer.h:25
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.
std::string BuildChannelMapFilter(const AVChannelLayout &)
Build the "|"-separated mappings list for the channelmap filter.
Definition audio.cpp:142
#define AV_NOPTS_VALUE
Definition misc.h:74
PID (proportional, integral, derivative) Controller Header File.
Audio Ringbuffer Header File.