vdr-plugin-softhddevice-drm-gles 1.6.8-daba64b
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 SetVolume(int);
78
79 void SetNormalize(bool, int);
80 void SetCompression(bool, int);
81 void SetEqualizer(bool, int[18]);
82 void SetStereoDescent(int);
83
88 int GetPassthroughMask(void) const { return m_alsa.GetPassthroughMask(); };
89
91 void ClockDriftCompensation(void);
92 void ResetHwDelayBaseline(void);
93 void SetHwDelayBaseline(void);
94
95protected:
96 virtual void Action(void);
97
98private:
99 constexpr static int AUDIO_MIN_BUFFER_FREE = 3072 * 8 * 8;
100 constexpr static int AV_SYNC_BORDER_MS = 5000;
101 constexpr static int BYTES_PER_SAMPLE = 2;
102 constexpr static int64_t PTS_WRAP = 1LL << 33;
103
108 cPidController m_pidController{3, 0.005, 0, 1000};
109 std::chrono::steady_clock::time_point m_lastPidInvocation;
111
112 // common audio
113 bool m_initialized = false;
114 std::mutex m_mutex;
115 std::mutex m_pauseMutex;
116 std::mutex m_queueMutex;
117 std::vector<Event> m_eventQueue;
118 std::atomic<double> m_pitchPpm = 0;
120
121 int m_volume = 0;
124
126 std::atomic<bool> m_paused = true;
127
130 std::vector<uint16_t> m_pauseBurst;
131 int m_hwBaseline = 0;
133
134 void Enqueue(const uint16_t *, int, int64_t);
135 void EnqueueFrame(AVFrame *);
136 bool SendAudio(int);
137 bool SendPause(void);
138 void RebuildPauseBurst(int);
139 void Stop(void);
140 void FlushAlsaBuffers(void);
141 void DropAlsaBuffers(void);
142 bool CyclicCall(void);
143 void ProcessEvents(void);
144
145 // audio manipulation
150
151 // mixer
152 const char *m_pMixerDevice = nullptr;
153 const char *m_pMixerChannel;
154
155 // filter
162 AVFrame *FilterGetFrame(void);
164 std::string BuildChannelMapFilter(const AVChannelLayout &);
165
166 // ring buffer variables
167 static constexpr unsigned RINGBUFFER_SIZE = 3 * 5 * 7 * 8 * 2 * 1000;
169
171};
172
173#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:123
bool SendPause(void)
Write pause to passthrough device.
Definition audio.cpp:1145
static constexpr int64_t PTS_WRAP
wraparound mod for a 33-bit PTS
Definition audio.h:102
void ResetHwDelayBaseline(void)
Reset the hw delay baseline.
Definition audio.cpp:1175
virtual void Action(void)
Audio thread loop, started with Start().
Definition audio.cpp:1018
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:168
int m_pitchAdjustFrameCounter
counter for pitch adjustment frames
Definition audio.h:119
int64_t GetInputPtsMs(void)
Definition audio.h:72
cSoftHdDevice * m_pDevice
pointer to device
Definition audio.h:104
int m_volume
current volume (0 .. 1000)
Definition audio.h:121
void SetHwDelayBaseline(void)
Set the hw delay baseline.
Definition audio.cpp:1157
void SetStereoDescent(int)
Set stereo loudness descent.
Definition audio.cpp:934
void SetTimebase(AVRational timebase)
Definition audio.h:86
int GetUsedRingbufferMs(void)
Get used ms in audio ringbuffer.
Definition audio.cpp:756
int64_t GetHardwareOutputPtsMs(void)
Get the hardware output PTS in milliseconds.
Definition audio.cpp:805
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:115
int64_t GetHardwareOutputPtsTimebaseUnits(void)
Get the hardware output PTS in timebase units.
Definition audio.cpp:848
AVFilterContext * m_pBuffersinkCtx
Definition audio.h:160
cPidController m_pidController
PID controller for clock drift compensation with tuning values coming from educated guesses.
Definition audio.h:108
void SetVolume(int)
Set mixer volume (0-1000)
Definition audio.cpp:862
void SetEqualizer(bool, int[18])
Set equalizer bands.
Definition audio.cpp:922
AVFilterContext * m_pBuffersrcCtx
Definition audio.h:159
AVFilterGraph * m_pFilterGraph
Definition audio.h:158
const char * m_pMixerChannel
mixer channel name
Definition audio.h:153
cBufferFillLevelLowPassFilter m_fillLevel
low pass filter for the buffer fill level
Definition audio.h:107
void ProcessEvents(void)
Process queued events and forward them to event receiver.
Definition audio.cpp:1187
int GetAvResyncBorderMs(void)
Definition audio.h:74
std::vector< Event > m_eventQueue
event queue for incoming events
Definition audio.h:117
bool SendAudio(int)
Write regular audio data from the ringbuffer to the hardware.
Definition audio.cpp:1111
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:85
static constexpr int AUDIO_MIN_BUFFER_FREE
Minimum free space in audio buffer 8 packets for 8 channels.
Definition audio.h:99
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:1205
int m_filterChanged
filter has changed
Definition audio.h:156
void SetCompression(bool, int)
Set volume compression parameters.
Definition audio.cpp:910
void Stop(void)
Stop the thread.
Definition audio.cpp:1036
int64_t m_inputPts
pts clock (last pts in ringbuffer)
Definition audio.h:125
int64_t GetOutputPtsMsInternal(void)
Definition audio.cpp:782
cSoftHdConfig * m_pConfig
pointer to config
Definition audio.h:105
std::atomic< double > m_pitchPpm
pitch adjustment in ppm. Positive values are faster
Definition audio.h:118
void Exit(void)
Cleanup audio output module (alsa)
Definition audio.cpp:974
void SetPaused(bool)
Set audio playback pause state.
Definition audio.cpp:884
int GetPassthroughMask(void) const
Definition audio.h:88
bool IsPaused(void)
Definition audio.h:59
void SetSoftvol(bool softVolume)
Definition audio.h:77
int64_t GetHardwareOutputDelayMs(void)
Get the hardware delay in milliseconds.
Definition audio.cpp:831
bool IsBufferEmpty(void)
Definition audio.h:63
void SetPassthroughMask(int mask)
Definition audio.h:84
bool m_useEqualizer
flag to use equalizer
Definition audio.h:149
int m_spdifBurstSize
size of the current spdif burst
Definition audio.h:129
int LazyInit(void)
Initialize audio output module (alsa)
Definition audio.cpp:952
int m_filterReady
filter is ready
Definition audio.h:157
const char * m_pMixerDevice
mixer device name (not used)
Definition audio.h:152
void DropAlsaBuffers(void)
Drop alsa buffers.
Definition audio.cpp:1002
bool HasInputPts(void)
Definition audio.h:71
cAlsaDevice m_alsa
alsa device
Definition audio.h:106
bool CyclicCall(void)
Cyclic audio playback call.
Definition audio.cpp:1056
int m_hwBaseline
saves the hw delay (pause bursts) once a real audio frame to correctly do the AV-Sync
Definition audio.h:131
bool m_initialized
class initialized
Definition audio.h:113
int m_stereoDescent
volume descent for stereo
Definition audio.h:122
std::mutex m_mutex
mutex for thread safety
Definition audio.h:114
static constexpr int AV_SYNC_BORDER_MS
absolute max a/v difference in ms which should trigger a resync
Definition audio.h:100
int m_packetCounter
packet counter for logging
Definition audio.h:110
void SetDownmix(int downMix)
Definition audio.h:87
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:167
void EnqueueFrame(AVFrame *)
Place samples in audio output queue.
Definition audio.cpp:452
void FlushAlsaBuffers(void)
Flush alsa buffers.
Definition audio.cpp:991
void SetNormalize(bool, int)
Set normalize volume parameters.
Definition audio.cpp:898
bool m_useNormalizer
flag to use volume normalize
Definition audio.h:147
static constexpr int BYTES_PER_SAMPLE
number of bytes per sample
Definition audio.h:101
std::chrono::steady_clock::time_point m_lastPidInvocation
last time the PID controller was invoked
Definition audio.h:109
std::atomic< bool > m_paused
audio is paused
Definition audio.h:126
std::mutex m_queueMutex
mutex for queue safety
Definition audio.h:116
bool IsBufferFull(void)
Definition audio.h:62
cAudioProcessor m_audioProcessor
Definition audio.h:146
bool m_firstRealAudioReceived
false, as long as no real audio was sent - used to trigger the baseline set
Definition audio.h:132
int CheckForFilterReady(AVCodecContext *)
Check if the filter has changed and is ready, init the filter if needed.
Definition audio.cpp:647
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:130
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:148
bool m_softVolume
flag to use soft volume
Definition audio.h:128
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:74
PID (proportional, integral, derivative) Controller Header File.
Audio Ringbuffer Header File.
Device State Machine and Event Handler Header File.