vdr-plugin-softhddevice-drm-gles 1.4.0
audio.h
Go to the documentation of this file.
1
21#ifndef __AUDIO_H
22#define __AUDIO_H
23
24#include <atomic>
25#include <vector>
26
27extern "C"
28{
29#include <libavfilter/avfilter.h>
30}
31
32#include <alsa/asoundlib.h>
33#include "ringbuffer.h"
34#include "threads.h"
35#include "event.h"
36#include "config.h"
37
38#define NORMALIZE_MAX_INDEX 128
39
40class cSoftHdDevice;
41
46public:
48 virtual ~cSoftHdAudio(void);
49
50 void LazyInit(void);
51 void Exit(void);
52 int Setup(AVCodecContext *, int , int , int);
53 void SetPaused(bool);
54 bool IsPaused(void) { return m_paused; };
55 void Filter(AVFrame *, AVCodecContext *);
56 void Enqueue(uint16_t *, int, AVFrame *);
58
59 void FlushBuffers(void);
60 int GetUsedBytes(void);
61 int GetFreeBytes(void);
62 int64_t GetHardwareOutputPtsMs(void);
64 int GetPassthrough(void) const { return m_passthrough; }
65 bool HasPts(void) { return m_inputPts != AV_NOPTS_VALUE; }
66 int64_t GetInputPtsMs(void) { return PtsToMs(m_inputPts); }
67 int64_t GetOutputPtsMs(void);
68
69 void SetEq(int[18], int);
70 void SetVolume(int);
71 void SetDownmix(int downMix) { m_downmix = downMix; };
72 void SetSoftvol(bool softVolume) { m_softVolume = softVolume; };
73 void SetNormalize(bool, int);
74 void SetCompression(bool, int);
75 void SetStereoDescent(int);
76 void SetPassthrough(int);
77 void SetAutoAES(bool appendAes) { m_appendAES = appendAes; }
78 void SetTimebase(AVRational *timebase) { m_pTimebase = timebase; };
79
80 void FlushAlsaBuffers(void);
81 bool CyclicCall(void);
82 void DropSamplesOlderThanPtsMs(int64_t);
83 void ProcessEvents(void);
84
85private:
86 constexpr static int AUDIO_MIN_BUFFER_FREE = 3072 * 8 * 8;
90
91 // thread
93
94 // common audio, alsa
95 bool m_initialized = false;
96 const int m_bytesPerSample = 2;
97 unsigned int m_hwSampleRate;
98 unsigned int m_hwNumChannels;
99 AVRational *m_pTimebase;
100 std::mutex m_mutex;
101 std::mutex m_pauseMutex;
102 std::vector<Event> m_eventQueue;
103
105
106 int64_t m_inputPts;
107 std::atomic<bool> m_paused = true;
108
111 const char *m_pPCMDevice;
114
115 // Normalizer
117 const int m_normalizeSamples = 4096;
123 const int m_normalizeMinFactor = 100;
125
126 // Compressor
130
131 // Amplifier
135
136 // Equalizer
138 float m_equalizerBand[18];
139
140 // mixer
141 const char *m_pMixerDevice;
142 const char *m_pMixerChannel;
143
144 // filter
147 AVFilterGraph *m_pFilterGraph;
148 AVFilterContext *m_pBuffersrcCtx;
149 AVFilterContext *m_pBuffersinkCtx;
150 AVFrame *FilterGetFrame(void);
151 int CheckForFilterReady(AVCodecContext *);
152
153 // ring buffer variables
154 static constexpr unsigned RINGBUFFER_SIZE = 3 * 5 * 7 * 8 * 2 * 1000;
156
157 void Normalize(uint16_t *, int);
158 void Compress(uint16_t *, int);
159 void SoftAmplify(int16_t *, int);
160 int InitFilter(AVCodecContext *);
161
162 void EnqueueFrame(AVFrame *);
163
164 // alsa
165 snd_pcm_t *m_pAlsaPCMHandle;
166 snd_mixer_t *m_pAlsaMixer;
167 snd_mixer_elem_t *m_pAlsaMixerElem;
171
172 void XrunRecovery(void);
173 char *OpenAlsaDevice(const char *, int);
174 char *FindAlsaDevice(const char *, const char *, int);
175 int AlsaSetup(int channels, int sample_rate, int passthrough);
176 void AlsaInitPCMDevice(void);
177 void AlsaInitMixer(void);
178 void AlsaSetVolume(int);
179 void AlsaInit(void);
180 void AlsaExit(void);
181 int64_t PtsToMs(int64_t pts) { return pts * av_q2d(*m_pTimebase) * 1000; }
182 int64_t MsToPts(int64_t ptsMs) { return ptsMs / av_q2d(*m_pTimebase) / 1000; }
183 int MsToFrames(int milliseconds) { return (int64_t)milliseconds * m_hwSampleRate / 1000; }
184 int FramesToMs(int frames) { return (int64_t)frames * 1000 / m_hwSampleRate; }
185
186 int64_t GetOutputPtsMsInternal(void);
187};
188
189#endif
#define NORMALIZE_MAX_INDEX
number of average values
Definition: audio.h:38
cSoftHdAudio - Audio class
Definition: audio.h:45
void LazyInit(void)
Initialize audio output module.
Definition: audio.cpp:1025
cSoftHdAudio(cSoftHdDevice *)
cSoftHdAudio constructor
Definition: audio.cpp:66
char * OpenAlsaDevice(const char *, int)
Open alsa device.
Definition: audio.cpp:1207
char * FindAlsaDevice(const char *, const char *, int)
Find alsa device giving some search hints.
Definition: audio.cpp:1259
bool m_appendAES
flag ato utomatic append AES
Definition: audio.h:113
void XrunRecovery(void)
xrun recovery
Definition: audio.cpp:1059
void Filter(AVFrame *, AVCodecContext *)
Send audio frame to filter and enqueue it.
Definition: audio.cpp:771
cSoftHdRingbuffer m_pRingbuffer
sample ring buffer
Definition: audio.h:155
int64_t GetInputPtsMs(void)
Definition: audio.h:66
int AlsaSetup(int channels, int sample_rate, int passthrough)
Setup alsa audio for requested format.
Definition: audio.cpp:1444
int Setup(AVCodecContext *, int, int, int)
Setup alsa.
Definition: audio.cpp:682
void Enqueue(uint16_t *, int, AVFrame *)
Send audio data to ringbuffer.
Definition: audio.cpp:657
int m_compressionMaxFactor
max. compression factor
Definition: audio.h:129
cSoftHdDevice * m_pDevice
pointer to device
Definition: audio.h:87
const char * m_pPCMDevice
PCM device name.
Definition: audio.h:111
int GetPassthrough(void) const
Definition: audio.h:64
int m_volume
current volume (0 .. 1000)
Definition: audio.h:134
cAudioThread * m_pAudioThread
pointer to audio thread
Definition: audio.h:92
virtual ~cSoftHdAudio(void)
cSoftHdAudio denstructor
Definition: audio.cpp:105
void SetStereoDescent(int)
Set stereo loudness descent.
Definition: audio.cpp:1005
int64_t GetHardwareOutputPtsMs(void)
Get the hardware output PTS in milliseconds.
Definition: audio.cpp:884
std::mutex m_pauseMutex
mutex for a safe thread pausing
Definition: audio.h:101
int64_t GetHardwareOutputPtsTimebaseUnits(void)
Get the hardware output PTS in timebase units.
Definition: audio.cpp:908
bool HasPts(void)
Definition: audio.h:65
AVFilterContext * m_pBuffersinkCtx
Definition: audio.h:149
void SetVolume(int)
Set mixer volume (0-1000)
Definition: audio.cpp:921
AVFilterContext * m_pBuffersrcCtx
Definition: audio.h:148
bool m_alsaCanPause
hw supports pause
Definition: audio.h:170
AVFilterGraph * m_pFilterGraph
Definition: audio.h:147
int m_passthrough
passthrough mask
Definition: audio.h:110
const int m_bytesPerSample
number of bytes per sample
Definition: audio.h:96
const char * m_pMixerChannel
mixer channel name
Definition: audio.h:142
unsigned int m_hwSampleRate
hardware sample rate in Hz
Definition: audio.h:97
int64_t PtsToMs(int64_t pts)
Definition: audio.h:181
IEventReceiver * m_pEventReceiver
pointer to event receiver
Definition: audio.h:89
void ProcessEvents(void)
Process queued events and forward to event receiver.
Definition: audio.cpp:1585
int MsToFrames(int milliseconds)
Definition: audio.h:183
std::vector< Event > m_eventQueue
event queue for incoming events
Definition: audio.h:102
void DropSamplesOlderThanPtsMs(int64_t)
Drop samples older than the given PTS.
Definition: audio.cpp:599
AVRational * m_pTimebase
pointer to AVCodecContext pkts_timebase
Definition: audio.h:99
void SetAutoAES(bool appendAes)
Definition: audio.h:77
static constexpr int AUDIO_MIN_BUFFER_FREE
Minimum free space in audio buffer 8 packets for 8 channels.
Definition: audio.h:86
bool m_compression
flag to use compress volume
Definition: audio.h:127
int64_t GetOutputPtsMs(void)
Get the output PTS of the ringbuffer.
Definition: audio.cpp:863
bool m_normalize
flag to use volume normalize
Definition: audio.h:116
AVFrame * FilterGetFrame(void)
Get frame from filter sink.
Definition: audio.cpp:705
int m_filterChanged
filter has changed
Definition: audio.h:145
void AlsaExit(void)
Cleanup alsa audio output module.
Definition: audio.cpp:1569
void SetCompression(bool, int)
Set volume compression parameters.
Definition: audio.cpp:987
snd_mixer_elem_t * m_pAlsaMixerElem
alsa mixer element
Definition: audio.h:167
void AlsaInit(void)
Initialize alsa audio output module.
Definition: audio.cpp:1553
void Compress(uint16_t *, int)
Compress audio.
Definition: audio.cpp:262
int64_t m_inputPts
pts clock (last pts in ringbuffer)
Definition: audio.h:106
int m_normalizeFactor
current normalize factor
Definition: audio.h:122
void AlsaSetVolume(int)
Set alsa mixer volume (0-1000)
Definition: audio.cpp:1421
int64_t GetOutputPtsMsInternal(void)
Definition: audio.cpp:870
cSoftHdConfig * m_pConfig
pointer to config
Definition: audio.h:88
void Exit(void)
Cleanup audio output module.
Definition: audio.cpp:1036
int m_amplifier
software volume amplify factor
Definition: audio.h:132
int GetUsedBytes(void)
Get used bytes in audio ringbuffer.
Definition: audio.cpp:845
void SetPaused(bool)
Set audio playback paused state.
Definition: audio.cpp:944
void AlsaInitMixer(void)
Initialize alsa mixer.
Definition: audio.cpp:1367
bool IsPaused(void)
Definition: audio.h:54
void SetSoftvol(bool softVolume)
Definition: audio.h:72
const char * m_pPassthroughDevice
passthrough device name
Definition: audio.h:112
void SetPassthrough(int)
Set audio passthrough mask.
Definition: audio.cpp:1016
int m_normalizeMaxFactor
max. normalize factor
Definition: audio.h:124
bool m_alsaUseMmap
use mmap
Definition: audio.h:169
void Normalize(uint16_t *, int)
Normalize audio.
Definition: audio.cpp:181
int m_compressionFactor
current compression factor
Definition: audio.h:128
int64_t MsToPts(int64_t ptsMs)
Definition: audio.h:182
const int m_normalizeMinFactor
min. normalize factor
Definition: audio.h:123
const int m_normalizeSamples
number of normalize samples
Definition: audio.h:117
int m_filterReady
filter is ready
Definition: audio.h:146
void SetEq(int[18], int)
Set equalizer bands.
Definition: audio.cpp:348
int m_normalizeReady
index normalize counter
Definition: audio.h:121
const char * m_pMixerDevice
mixer device name (not used)
Definition: audio.h:141
uint32_t m_normalizeAverage[NORMALIZE_MAX_INDEX]
average of n last normalize sample blocks
Definition: audio.h:119
bool CyclicCall(void)
Cyclic audio playback call.
Definition: audio.cpp:1118
void AlsaInitPCMDevice(void)
Search for an alsa pcm device and open it.
Definition: audio.cpp:1295
unsigned int m_hwNumChannels
number of hardware channels
Definition: audio.h:98
bool m_initialized
class initialized
Definition: audio.h:95
int FramesToMs(int frames)
Definition: audio.h:184
int m_stereoDescent
volume descent for stereo
Definition: audio.h:133
std::mutex m_mutex
mutex for thread safety
Definition: audio.h:100
int m_alsaRatio
internal -> mixer ratio * 1000
Definition: audio.h:168
void SetDownmix(int downMix)
Definition: audio.h:71
int GetFreeBytes(void)
Get free bytes in audio ringbuffer.
Definition: audio.cpp:835
static constexpr unsigned RINGBUFFER_SIZE
default ring buffer size ~2s 8ch 16bit (3 * 5 * 7 * 8)
Definition: audio.h:154
void EnqueueFrame(AVFrame *)
Place samples in audio output queue.
Definition: audio.cpp:627
void SoftAmplify(int16_t *, int)
Software amplifier.
Definition: audio.cpp:319
void FlushAlsaBuffers(void)
Flush alsa buffers.
Definition: audio.cpp:1075
void SetNormalize(bool, int)
Set normalize volume parameters.
Definition: audio.cpp:975
snd_pcm_t * m_pAlsaPCMHandle
alsa pcm handle
Definition: audio.h:165
int m_downmix
set stereo downmix
Definition: audio.h:104
int m_useEqualizer
flag to use equalizer
Definition: audio.h:137
float m_equalizerBand[18]
equalizer band
Definition: audio.h:138
snd_mixer_t * m_pAlsaMixer
alsa mixer handle
Definition: audio.h:166
int m_normalizeIndex
index into normalize average table
Definition: audio.h:120
int m_normalizeCounter
normalize sample counter
Definition: audio.h:118
std::atomic< bool > m_paused
audio is paused
Definition: audio.h:107
bool IsBufferFull(void)
Definition: audio.h:57
int CheckForFilterReady(AVCodecContext *)
Check if the filter has changed and is ready, init the filter if needed.
Definition: audio.cpp:738
int InitFilter(AVCodecContext *)
Init filter.
Definition: audio.cpp:424
void SetTimebase(AVRational *timebase)
Definition: audio.h:78
void FlushBuffers(void)
Flush audio buffers.
Definition: audio.cpp:815
bool m_softVolume
flag to use soft volume
Definition: audio.h:109
cSoftHdRingbuffer - RingBuffer class
Definition: ringbuffer.h:35
size_t FreeBytes(void)
Get free bytes in ring buffer.
Definition: ringbuffer.cpp:291
SoftHdDevice config header file.
State machine and event header file.
#define AV_NOPTS_VALUE
Definition: misc.h:35
Ringbuffer class header file.
Thread classes header file.