vdr-plugin-softhddevice-drm-gles 1.7.3-98a2ef7
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 "filllevel.h"
39#include "pidcontroller.h"
40#include "ringbuffer.h"
41#include "statemachine.h"
42
43class cSoftHdConfig;
44class cSoftHdDevice;
45
51class cSoftHdAudio : public cThread {
52public:
54
55 int 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 bool IsBufferEmpty(void) { return m_pRingbuffer.UsedBytes() == 0 && m_alsa.GetHwDelayFrames() == 0; };
64
65 void FlushBuffers(void);
66 int GetUsedRingbufferBytes(void);
67 int GetUsedRingbufferMs(void);
71 bool HasInputPts(void) { return m_inputPts != AV_NOPTS_VALUE; };
75
76 void SetTrickSpeed(double, bool, bool);
81 bool IsSlowTrickSpeed(void) { return m_trickspeedFactor <= 1.0 ; };
82
83 void SetVolume(int);
85
86 void SetNormalize(bool, int);
87 void SetCompression(bool, int);
88 void SetEqualizer(bool, int[18]);
89 void SetStereoDescent(int);
90
95 int GetPassthroughMask(void) const { return m_alsa.GetPassthroughMask(); };
96
98 void ClockDriftCompensation(void);
99 void ResetHwDelayBaseline(void);
100 void SetHwDelayBaseline(void);
101
102protected:
103 virtual void Action(void);
104
105private:
106 constexpr static int AUDIO_MIN_BUFFER_FREE = 3072 * 8 * 8;
107 constexpr static int AV_SYNC_BORDER_MS = 5000;
108 constexpr static int BYTES_PER_SAMPLE = 2;
109 constexpr static int64_t PTS_WRAP = 1LL << 33;
110 constexpr static double MAX_TRICKSPEED_STEP_DELAY_MS = 3000;
111
116 cPidController m_pidController{3, 0.005, 0, 1000};
117 std::chrono::steady_clock::time_point m_lastPidInvocation;
119
120 // common audio
121 bool m_initialized = false;
122 std::mutex m_mutex;
123 std::mutex m_pauseMutex;
124 std::mutex m_queueMutex;
125 std::vector<Event> m_eventQueue;
126 std::atomic<double> m_pitchPpm = 0;
128
129 int m_volume = 0;
132
134 std::atomic<bool> m_paused = true;
135 std::atomic<int64_t> m_trickSpeedPts = AV_NOPTS_VALUE;
136 std::atomic<double> m_trickspeedFactor = 0;
137 std::atomic<bool> m_trickspeed = false;
138 std::atomic<bool> m_forwardTrickspeed = true;
139
142 std::vector<uint16_t> m_pauseBurst;
143 int m_hwBaseline = 0;
145
146 void Enqueue(const uint16_t *, int, int64_t);
147 void EnqueueFrame(AVFrame *);
148 bool SendAudio(int);
149 bool SendPause(void);
150 void RebuildPauseBurst(int);
151 void Stop(void);
152 void FlushAlsaBuffers(void);
153 void DropAlsaBuffers(void);
154 bool CyclicCall(void);
155 void ProcessEvents(void);
156
157 // audio manipulation
162
163 // mixer
164 const char *m_pMixerDevice = nullptr;
165 const char *m_pMixerChannel;
166
167 // filter
174 AVFrame *FilterGetFrame(void);
176 std::string BuildChannelMapFilter(const AVChannelLayout &);
177
178 // ring buffer variables
179 static constexpr unsigned RINGBUFFER_SIZE = 3 * 5 * 7 * 8 * 2 * 1000;
181
183};
184
185#endif
ALSA Output Device Header File.
Audio Manipulation Interface Header File.
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
int GetHwDelayFrames(void)
Return the current hardware audio delay in frames.
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
AVRational m_timebase
AVCodecContext pkts_timebase.
Definition audio.h:131
bool SendPause(void)
Write pause to passthrough device.
Definition audio.cpp:1214
static constexpr int64_t PTS_WRAP
wraparound mod for a 33-bit PTS
Definition audio.h:109
void ResetHwDelayBaseline(void)
Reset the hw delay baseline.
Definition audio.cpp:1244
virtual void Action(void)
Audio thread loop, started with Start().
Definition audio.cpp:1079
void Filter(AVFrame *, AVCodecContext *)
Send audio frame to filter and enqueue it.
Definition audio.cpp:680
cSoftHdRingbuffer m_pRingbuffer
sample ring buffer
Definition audio.h:180
int m_pitchAdjustFrameCounter
counter for pitch adjustment frames
Definition audio.h:127
int64_t GetInputPtsMs(void)
Definition audio.h:72
cSoftHdDevice * m_pDevice
pointer to device
Definition audio.h:112
int m_volume
current volume (0 .. 1000)
Definition audio.h:129
void SetHwDelayBaseline(void)
Set the hw delay baseline.
Definition audio.cpp:1226
void SetStereoDescent(int)
Set stereo loudness descent.
Definition audio.cpp:995
void SetTimebase(AVRational timebase)
Definition audio.h:93
int GetUsedRingbufferMs(void)
Get used ms in audio ringbuffer.
Definition audio.cpp:756
void AdvanceTrickSpeedPts(int64_t)
Advance the pts in trickspeed mode and delay "playback".
Definition audio.cpp:820
int64_t GetHardwareOutputPtsMs(void)
Get the hardware output PTS in milliseconds.
Definition audio.cpp:866
int Setup(AVRational, int, int, bool)
Alsa setup wrapper.
Definition audio.cpp:583
std::mutex m_pauseMutex
mutex for a safe thread pausing
Definition audio.h:123
int64_t GetHardwareOutputPtsTimebaseUnits(void)
Get the hardware output PTS in timebase units.
Definition audio.cpp:909
AVFilterContext * m_pBuffersinkCtx
Definition audio.h:172
cPidController m_pidController
PID controller for clock drift compensation with tuning values coming from educated guesses.
Definition audio.h:116
void SetVolume(int)
Set mixer volume (0-1000)
Definition audio.cpp:923
void SetEqualizer(bool, int[18])
Set equalizer bands.
Definition audio.cpp:983
AVFilterContext * m_pBuffersrcCtx
Definition audio.h:171
AVFilterGraph * m_pFilterGraph
Definition audio.h:170
const char * m_pMixerChannel
mixer channel name
Definition audio.h:165
cBufferFillLevelLowPassFilter m_fillLevel
low pass filter for the buffer fill level
Definition audio.h:115
void ProcessEvents(void)
Process queued events and forward them to event receiver.
Definition audio.cpp:1256
int GetAvResyncBorderMs(void)
Definition audio.h:74
std::vector< Event > m_eventQueue
event queue for incoming events
Definition audio.h:125
bool SendAudio(int)
Write regular audio data from the ringbuffer to the hardware.
Definition audio.cpp:1180
void DropSamplesOlderThanPtsMs(int64_t)
Drop samples older than the given PTS.
Definition audio.cpp:420
void Enqueue(const uint16_t *, int, int64_t)
Send audio data to ringbuffer.
Definition audio.cpp:526
void SetAutoAES(bool appendAes)
Definition audio.h:92
static constexpr int AUDIO_MIN_BUFFER_FREE
Minimum free space in audio buffer 8 packets for 8 channels.
Definition audio.h:106
int64_t GetOutputPtsMs(void)
Get the output PTS of the ringbuffer.
Definition audio.cpp:775
AVFrame * FilterGetFrame(void)
Get frame from filter sink.
Definition audio.cpp:614
void ClockDriftCompensation(void)
Calculate clock drift compensation.
Definition audio.cpp:1274
int m_filterChanged
filter has changed
Definition audio.h:168
void SetTrickSpeed(double, bool, bool)
Set the trickspeed.
Definition audio.cpp:789
std::atomic< bool > m_trickspeed
true, if trickspeed is active
Definition audio.h:137
void SetCompression(bool, int)
Set volume compression parameters.
Definition audio.cpp:971
void Stop(void)
Stop the thread.
Definition audio.cpp:1097
std::atomic< int64_t > m_trickSpeedPts
pts of the last received (undecoded) packet during audio-only trickspeed
Definition audio.h:135
int64_t m_inputPts
pts clock (last pts in ringbuffer)
Definition audio.h:133
int64_t GetOutputPtsMsInternal(void)
Definition audio.cpp:843
cSoftHdConfig * m_pConfig
pointer to config
Definition audio.h:113
std::atomic< double > m_pitchPpm
pitch adjustment in ppm. Positive values are faster
Definition audio.h:126
void Exit(void)
Cleanup audio output module (alsa)
Definition audio.cpp:1035
bool IsSlowTrickSpeed(void)
Definition audio.h:81
void SetPaused(bool)
Set audio playback pause state.
Definition audio.cpp:945
int GetPassthroughMask(void) const
Definition audio.h:95
bool IsPaused(void)
Definition audio.h:59
void SetSoftvol(bool softVolume)
Definition audio.h:84
int64_t GetHardwareOutputDelayMs(void)
Get the hardware delay in milliseconds.
Definition audio.cpp:892
bool IsBufferEmpty(void)
Definition audio.h:63
static constexpr double MAX_TRICKSPEED_STEP_DELAY_MS
upper bound for a single AdvanceTrickSpeedPts(), in case of large/ erratic pts jumps
Definition audio.h:110
void SetPassthroughMask(int mask)
Definition audio.h:91
bool m_useEqualizer
flag to use equalizer
Definition audio.h:161
int m_spdifBurstSize
size of the current spdif burst
Definition audio.h:141
int LazyInit(void)
Initialize audio output module (alsa)
Definition audio.cpp:1013
int m_filterReady
filter is ready
Definition audio.h:169
const char * m_pMixerDevice
mixer device name (not used)
Definition audio.h:164
void DropAlsaBuffers(void)
Drop alsa buffers.
Definition audio.cpp:1063
bool HasInputPts(void)
Definition audio.h:71
cAlsaDevice m_alsa
alsa device
Definition audio.h:114
bool CyclicCall(void)
Cyclic audio playback call.
Definition audio.cpp:1117
int m_hwBaseline
saves the hw delay (pause bursts) once a real audio frame to correctly do the AV-Sync
Definition audio.h:143
bool m_initialized
class initialized
Definition audio.h:121
int m_stereoDescent
volume descent for stereo
Definition audio.h:130
std::mutex m_mutex
mutex for thread safety
Definition audio.h:122
void ResetTrickSpeedPts(void)
Definition audio.h:79
bool IsForwardTrickSpeed(void)
Definition audio.h:80
static constexpr int AV_SYNC_BORDER_MS
absolute max a/v difference in ms which should trigger a resync
Definition audio.h:107
int m_packetCounter
packet counter for logging
Definition audio.h:118
void SetDownmix(int downMix)
Definition audio.h:94
int GetUsedRingbufferBytes(void)
Get used bytes in audio ringbuffer.
Definition audio.cpp:746
static constexpr unsigned RINGBUFFER_SIZE
default ring buffer size ~2s 8ch 16bit (3 * 5 * 7 * 8)
Definition audio.h:179
std::atomic< double > m_trickspeedFactor
current trickspeed factor for AdvanceTrickSpeedPts()
Definition audio.h:136
void EnqueueFrame(AVFrame *)
Place samples in audio output queue.
Definition audio.cpp:452
void FlushAlsaBuffers(void)
Flush alsa buffers.
Definition audio.cpp:1052
void SetNormalize(bool, int)
Set normalize volume parameters.
Definition audio.cpp:959
bool m_useNormalizer
flag to use volume normalize
Definition audio.h:159
std::atomic< bool > m_forwardTrickspeed
current trickspeed direction
Definition audio.h:138
static constexpr int BYTES_PER_SAMPLE
number of bytes per sample
Definition audio.h:108
std::chrono::steady_clock::time_point m_lastPidInvocation
last time the PID controller was invoked
Definition audio.h:117
std::atomic< bool > m_paused
audio is paused
Definition audio.h:134
std::mutex m_queueMutex
mutex for queue safety
Definition audio.h:124
bool IsBufferFull(void)
Definition audio.h:62
cAudioProcessor m_audioProcessor
Definition audio.h:158
bool m_firstRealAudioReceived
false, as long as no real audio was sent - used to trigger the baseline set
Definition audio.h:144
int CheckForFilterReady(AVCodecContext *)
Check if the filter has changed and is ready, init the filter if needed.
Definition audio.cpp:647
int64_t GetTrickSpeedPtsTimebaseUnits(void)
Definition audio.h:78
int InitFilter(AVCodecContext *)
Init audio filters.
Definition audio.cpp:203
void RebuildPauseBurst(int)
Rebuild the pause spdif burst with the size of the last recognized normal spdif audio if size changed...
Definition audio.cpp:478
std::vector< uint16_t > m_pauseBurst
holds the burst data itself
Definition audio.h:142
void EnqueueSpdif(const uint16_t *, int, int64_t pts)
Enqueue prepared spdif bursts in audio output queue.
Definition audio.cpp:510
void FlushBuffers(void)
Flush audio buffers.
Definition audio.cpp:723
bool m_useCompressor
flag to use compress volume
Definition audio.h:160
bool m_softVolume
flag to use soft volume
Definition audio.h:140
Plugin Configuration.
Definition config.h:65
Output Device Implementation.
Ringbuffer (FIFO) Implementation.
Definition ringbuffer.h:25
size_t UsedBytes(void)
Get used bytes in ring buffer.
size_t FreeBytes(void)
Get free bytes in ring buffer.
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:141
#define AV_NOPTS_VALUE
Definition misc.h:76
PID (proportional, integral, derivative) Controller Header File.
Audio Ringbuffer Header File.
Device State Machine and Event Handler Header File.