|
vdr-plugin-softhddevice-drm-gles 1.6.2
|
Audio Interface. More...
#include <audio.h>
Public Member Functions | |
| cSoftHdAudio (cSoftHdDevice *) | |
| Create a new audio context. | |
| void | LazyInit (void) |
| Initialize audio output module (alsa) | |
| void | Exit (void) |
| Cleanup audio output module (alsa) | |
| int | Setup (AVCodecContext *, int, int, int) |
| Alsa setup wrapper. | |
| void | SetPaused (bool) |
| Set audio playback pause state. | |
| bool | IsPaused (void) |
| void | Filter (AVFrame *, AVCodecContext *) |
| Send audio frame to filter and enqueue it. | |
| void | EnqueueSpdif (uint16_t *, int, AVFrame *) |
| Enqueue prepared spdif bursts in audio output queue. | |
| bool | IsBufferFull (void) |
| void | FlushBuffers (void) |
| Flush audio buffers. | |
| int | GetUsedBytes (void) |
| Get used bytes in audio ringbuffer. | |
| int64_t | GetHardwareOutputPtsMs (void) |
| Get the hardware output PTS in milliseconds. | |
| int64_t | GetHardwareOutputDelayMs (void) |
| Get the hardware delay in milliseconds. | |
| int64_t | GetHardwareOutputPtsTimebaseUnits (void) |
| Get the hardware output PTS in timebase units. | |
| int | GetPassthrough (void) const |
| bool | HasInputPts (void) |
| int64_t | GetInputPtsMs (void) |
| int64_t | GetOutputPtsMs (void) |
| Get the output PTS of the ringbuffer. | |
| int | GetAvResyncBorderMs (void) |
| void | SetEq (int[18], int) |
| Set equalizer bands. | |
| void | SetVolume (int) |
| Set mixer volume (0-1000) | |
| void | SetDownmix (int downMix) |
| void | SetSoftvol (bool softVolume) |
| void | SetNormalize (bool, int) |
| Set normalize volume parameters. | |
| void | SetCompression (bool, int) |
| Set volume compression parameters. | |
| void | SetStereoDescent (int) |
| Set stereo loudness descent. | |
| void | SetPassthroughMask (int) |
| Set audio passthrough mask. | |
| void | SetAutoAES (bool appendAes) |
| void | SetTimebase (AVRational *timebase) |
| void | DropSamplesOlderThanPtsMs (int64_t) |
| Drop samples older than the given PTS. | |
| void | ClockDriftCompensation (void) |
| Calculate clock drift compensation. | |
| void | ResetHwDelayBaseline (void) |
| Reset the hw delay baseline. | |
| void | SetHwDelayBaseline (void) |
| Set the hw delay baseline. | |
| void | Stop (void) |
| Stop the thread. | |
Protected Member Functions | |
| virtual void | Action (void) |
| Audio thread loop, started with Start(). | |
Private Member Functions | |
| void | Enqueue (uint16_t *, int, AVFrame *) |
| Send audio data to ringbuffer. | |
| void | EnqueueFrame (AVFrame *) |
| Place samples in audio output queue. | |
| bool | SendAudio (int) |
| Write regular audio data from the ringbuffer to the hardware. | |
| bool | SendPause (void) |
| Write pause to passthrough device. | |
| void | BuildPauseBurst (void) |
| Build a pause spdif burst with the size of the last recognized normal spdif audio. | |
| void | Normalize (uint16_t *, int) |
| Normalize audio samples. | |
| void | Compress (uint16_t *, int) |
| Compress audio samples. | |
| void | SoftAmplify (int16_t *, int) |
| Amplify the samples in software. | |
| int | InitFilter (AVCodecContext *) |
| Init audio filters. | |
| AVFrame * | FilterGetFrame (void) |
| Get frame from filter sink. | |
| int | CheckForFilterReady (AVCodecContext *) |
| Check if the filter has changed and is ready, init the filter if needed. | |
| int | AlsaSetup (int channels, int sample_rate, int passthrough) |
| Setup alsa audio for requested format. | |
| char * | OpenAlsaDevice (const char *, int) |
| Opens an alsa device. | |
| char * | FindAlsaDevice (const char *, const char *, int) |
| Find alsa device giving some search hints. | |
| void | AlsaInitPCMDevice (void) |
| Search for an alsa pcm device and open it. | |
| void | AlsaInitMixer (void) |
| Initialize alsa mixer. | |
| void | AlsaSetVolume (int) |
| Set alsa mixer volume (0-1000) | |
| void | AlsaInit (void) |
| Initialize the alsa audio output module. | |
| void | AlsaExit (void) |
| Cleanup the alsa audio output module. | |
| void | FlushAlsaBuffers (void) |
| Flush alsa buffers. | |
| void | DropAlsaBuffers (void) |
| Drop alsa buffers. | |
| void | FlushAlsaBuffersInternal (bool) |
| Flush alsa buffers internally. | |
| bool | CyclicCall (void) |
| Cyclic audio playback call. | |
| void | ProcessEvents (void) |
| Process queued events and forward them to event receiver. | |
| void | HandleError (int) |
| Handle an alsa error. | |
| int64_t | GetOutputPtsMsInternal (void) |
| int64_t | PtsToMs (int64_t pts) |
| int64_t | MsToPts (int64_t ptsMs) |
| int | MsToFrames (int milliseconds) |
| int | FramesToMs (int frames) |
| double | FramesToMsDouble (int frames) |
Private Attributes | |
| cSoftHdDevice * | m_pDevice |
| pointer to device | |
| cSoftHdConfig * | m_pConfig |
| pointer to config | |
| IEventReceiver * | m_pEventReceiver |
| pointer to event receiver | |
| cBufferFillLevelLowPassFilter | m_fillLevel |
| low pass filter for the buffer fill level | |
| cPidController | m_pidController {3, 0.005, 0, 1000} |
| PID controller for clock drift compensation with tuning values coming from educated guesses. | |
| std::chrono::steady_clock::time_point | m_lastPidInvocation |
| last time the PID controller was invoked | |
| int | m_alsaBufferSizeFrames = 0 |
| alsa buffer size in frames | |
| int | m_packetCounter = 0 |
| packet counter for logging | |
| bool | m_initialized = false |
| class initialized | |
| const int | m_bytesPerSample = 2 |
| number of bytes per sample | |
| unsigned int | m_hwSampleRate = 0 |
| hardware sample rate in Hz | |
| unsigned int | m_hwNumChannels = 0 |
| number of hardware channels | |
| AVRational * | m_pTimebase |
| pointer to AVCodecContext pkts_timebase | |
| std::mutex | m_mutex |
| mutex for thread safety | |
| std::mutex | m_pauseMutex |
| mutex for a safe thread pausing | |
| std::vector< Event > | m_eventQueue |
| event queue for incoming events | |
| std::atomic< double > | m_pitchPpm = 0 |
| pitch adjustment in ppm. Positive values are faster | |
| int | m_pitchAdjustFrameCounter = 0 |
| counter for pitch adjustment frames | |
| int | m_downmix |
| set stereo downmix | |
| int64_t | m_inputPts = AV_NOPTS_VALUE |
| pts clock (last pts in ringbuffer) | |
| std::atomic< bool > | m_paused = true |
| audio is paused | |
| bool | m_softVolume |
| flag to use soft volume | |
| int | m_passthrough |
| passthrough mask | |
| const char * | m_pPCMDevice |
| PCM device name. | |
| const char * | m_pPassthroughDevice |
| passthrough device name | |
| bool | m_appendAES |
| flag ato utomatic append AES | |
| int | m_spdifBurstSize = 0 |
| size of the current spdif burst | |
| std::vector< uint16_t > | m_pauseBurst |
| holds the burst data itself | |
| snd_pcm_sframes_t | m_hwBaseline = 0 |
| saves the hw delay (pause bursts) once a real audio frame to correctly do the AV-Sync | |
| bool | m_firstRealAudioReceived = false |
| false, as long as no real audio was sent - used to trigger the baseline set | |
| bool | m_normalize |
| flag to use volume normalize | |
| const int | m_normalizeSamples = 4096 |
| number of normalize samples | |
| int | m_normalizeCounter |
| normalize sample counter | |
| uint32_t | m_normalizeAverage [NORMALIZE_MAX_INDEX] |
| average of n last normalize sample blocks | |
| int | m_normalizeIndex |
| index into normalize average table | |
| int | m_normalizeReady |
| index normalize counter | |
| int | m_normalizeFactor |
| current normalize factor | |
| const int | m_normalizeMinFactor = 100 |
| min. normalize factor | |
| int | m_normalizeMaxFactor |
| max. normalize factor | |
| bool | m_compression |
| flag to use compress volume | |
| int | m_compressionFactor = 0 |
| current compression factor | |
| int | m_compressionMaxFactor |
| max. compression factor | |
| int | m_amplifier |
| software volume amplify factor | |
| int | m_stereoDescent |
| volume descent for stereo | |
| int | m_volume = 0 |
| current volume (0 .. 1000) | |
| int | m_useEqualizer |
| flag to use equalizer | |
| float | m_equalizerBand [18] |
| equalizer band | |
| const char * | m_pMixerDevice = nullptr |
| mixer device name (not used) | |
| const char * | m_pMixerChannel |
| mixer channel name | |
| int | m_filterChanged = 0 |
| filter has changed | |
| int | m_filterReady = 0 |
| filter is ready | |
| AVFilterGraph * | m_pFilterGraph = nullptr |
| AVFilterContext * | m_pBuffersrcCtx |
| AVFilterContext * | m_pBuffersinkCtx |
| cSoftHdRingbuffer | m_pRingbuffer {RINGBUFFER_SIZE} |
| sample ring buffer | |
| snd_pcm_t * | m_pAlsaPCMHandle |
| alsa pcm handle | |
| snd_mixer_t * | m_pAlsaMixer = nullptr |
| alsa mixer handle | |
| snd_mixer_elem_t * | m_pAlsaMixerElem = nullptr |
| alsa mixer element | |
| int | m_alsaRatio |
| internal -> mixer ratio * 1000 | |
| bool | m_alsaUseMmap |
| use mmap | |
Static Private Attributes | |
| static constexpr int | AUDIO_MIN_BUFFER_FREE = 3072 * 8 * 8 |
| Minimum free space in audio buffer 8 packets for 8 channels. | |
| static constexpr int | NORMALIZE_MAX_INDEX = 128 |
| number of normalize average samples | |
| static constexpr int | AV_SYNC_BORDER_MS = 5000 |
| absolute max a/v difference in ms which should trigger a resync | |
| static constexpr unsigned | RINGBUFFER_SIZE = 3 * 5 * 7 * 8 * 2 * 1000 |
| default ring buffer size ~2s 8ch 16bit (3 * 5 * 7 * 8) | |
Definition at line 209 of file audio.h.
References m_hwSampleRate.
Referenced by GetHardwareOutputDelayMs(), GetHardwareOutputPtsMs(), GetOutputPtsMsInternal(), and SetHwDelayBaseline().
Definition at line 210 of file audio.h.
References m_hwSampleRate.
Referenced by ClockDriftCompensation().
Definition at line 68 of file audio.h.
References AV_SYNC_BORDER_MS.
Referenced by cVideoRender::DisplayFrame().
Definition at line 66 of file audio.h.
References m_inputPts, and PtsToMs().
Referenced by cSoftHdDevice::IsBufferingThresholdReached().
Definition at line 64 of file audio.h.
References m_passthrough.
Definition at line 65 of file audio.h.
References AV_NOPTS_VALUE, and m_inputPts.
Referenced by DropSamplesOlderThanPtsMs(), cSoftHdDevice::IsBufferingThresholdReached(), and cSoftHdDevice::OnEventReceived().
Definition at line 57 of file audio.h.
References AUDIO_MIN_BUFFER_FREE, cSoftHdRingbuffer::FreeBytes(), and m_pRingbuffer.
Referenced by cSoftHdDevice::PlayAudio(), cSoftHdDevice::PlayAudioPkts(), and cSoftHdDevice::Poll().
Definition at line 54 of file audio.h.
References m_paused.
Referenced by cVideoRender::DisplayFrame().
Definition at line 208 of file audio.h.
References m_hwSampleRate.
Referenced by AlsaSetup(), and DropSamplesOlderThanPtsMs().
Definition at line 207 of file audio.h.
References m_pTimebase.
Referenced by GetHardwareOutputPtsTimebaseUnits().
Definition at line 206 of file audio.h.
References m_pTimebase.
Referenced by Enqueue(), GetInputPtsMs(), and GetOutputPtsMsInternal().
Definition at line 78 of file audio.h.
References m_appendAES.
Referenced by cMenuSetupSoft::Store().
Definition at line 73 of file audio.h.
References m_softVolume.
Referenced by cMenuSetupSoft::Store().
|
inline |
Definition at line 79 of file audio.h.
References m_pTimebase.
Referenced by cAudioDecoder::DecodePassthrough().
Minimum free space in audio buffer 8 packets for 8 channels.
Definition at line 92 of file audio.h.
Referenced by IsBufferFull().
absolute max a/v difference in ms which should trigger a resync
Definition at line 94 of file audio.h.
Referenced by Enqueue(), and GetAvResyncBorderMs().
|
private |
alsa buffer size in frames
Definition at line 101 of file audio.h.
Referenced by AlsaSetup(), and ClockDriftCompensation().
|
private |
internal -> mixer ratio * 1000
Definition at line 187 of file audio.h.
Referenced by AlsaInitMixer(), and AlsaSetVolume().
|
private |
use mmap
Definition at line 188 of file audio.h.
Referenced by AlsaSetup(), SendAudio(), and SendPause().
|
private |
software volume amplify factor
Definition at line 156 of file audio.h.
Referenced by SetVolume(), and SoftAmplify().
|
private |
flag ato utomatic append AES
Definition at line 125 of file audio.h.
Referenced by OpenAlsaDevice(), and SetAutoAES().
number of bytes per sample
Definition at line 106 of file audio.h.
Referenced by Compress(), EnqueueFrame(), Normalize(), and SoftAmplify().
|
private |
flag to use compress volume
Definition at line 150 of file audio.h.
Referenced by EnqueueFrame(), and SetCompression().
|
private |
current compression factor
Definition at line 151 of file audio.h.
Referenced by Compress(), FlushAlsaBuffersInternal(), and SetCompression().
|
private |
max. compression factor
Definition at line 152 of file audio.h.
Referenced by Compress(), FlushAlsaBuffersInternal(), and SetCompression().
|
private |
set stereo downmix
Definition at line 116 of file audio.h.
Referenced by AlsaSetup(), InitFilter(), SetDownmix(), and Setup().
|
private |
|
private |
event queue for incoming events
Definition at line 112 of file audio.h.
Referenced by Enqueue(), HandleError(), and ProcessEvents().
|
private |
low pass filter for the buffer fill level
Definition at line 98 of file audio.h.
Referenced by ClockDriftCompensation(), DropSamplesOlderThanPtsMs(), Enqueue(), FlushBuffers(), and SendAudio().
|
private |
filter has changed
Definition at line 170 of file audio.h.
Referenced by CheckForFilterReady(), Filter(), FlushBuffers(), InitFilter(), and SetEq().
|
private |
filter is ready
Definition at line 171 of file audio.h.
Referenced by CheckForFilterReady(), and InitFilter().
false, as long as no real audio was sent - used to trigger the baseline set
Definition at line 129 of file audio.h.
Referenced by ResetHwDelayBaseline(), and SetHwDelayBaseline().
|
private |
saves the hw delay (pause bursts) once a real audio frame to correctly do the AV-Sync
Definition at line 128 of file audio.h.
Referenced by GetHardwareOutputPtsMs(), ResetHwDelayBaseline(), and SetHwDelayBaseline().
number of hardware channels
Definition at line 108 of file audio.h.
Referenced by AlsaSetup(), InitFilter(), Setup(), and SetVolume().
hardware sample rate in Hz
Definition at line 107 of file audio.h.
Referenced by AlsaSetup(), FramesToMs(), FramesToMsDouble(), GetHardwareOutputDelayMs(), GetHardwareOutputPtsMs(), InitFilter(), MsToFrames(), and Setup().
class initialized
Definition at line 105 of file audio.h.
Referenced by Exit(), FlushBuffers(), and LazyInit().
|
private |
pts clock (last pts in ringbuffer)
Definition at line 118 of file audio.h.
Referenced by Enqueue(), FlushBuffers(), GetHardwareOutputDelayMs(), GetHardwareOutputPtsMs(), GetInputPtsMs(), GetOutputPtsMsInternal(), and HasInputPts().
|
private |
last time the PID controller was invoked
Definition at line 100 of file audio.h.
Referenced by ClockDriftCompensation().
|
private |
mutex for thread safety
Definition at line 110 of file audio.h.
Referenced by CyclicCall(), DropSamplesOlderThanPtsMs(), Enqueue(), FlushBuffers(), GetHardwareOutputDelayMs(), GetHardwareOutputPtsMs(), GetOutputPtsMs(), and ResetHwDelayBaseline().
|
private |
flag to use volume normalize
Definition at line 138 of file audio.h.
Referenced by EnqueueFrame(), and SetNormalize().
|
private |
average of n last normalize sample blocks
Definition at line 141 of file audio.h.
Referenced by FlushAlsaBuffersInternal(), and Normalize().
|
private |
normalize sample counter
Definition at line 140 of file audio.h.
Referenced by FlushAlsaBuffersInternal(), and Normalize().
|
private |
current normalize factor
Definition at line 144 of file audio.h.
Referenced by FlushAlsaBuffersInternal(), and Normalize().
|
private |
index into normalize average table
Definition at line 142 of file audio.h.
Referenced by Normalize().
|
private |
max. normalize factor
Definition at line 146 of file audio.h.
Referenced by Normalize(), and SetNormalize().
|
private |
index normalize counter
Definition at line 143 of file audio.h.
Referenced by FlushAlsaBuffersInternal(), and Normalize().
|
private |
packet counter for logging
Definition at line 102 of file audio.h.
Referenced by ClockDriftCompensation().
|
private |
alsa mixer handle
Definition at line 185 of file audio.h.
Referenced by AlsaExit(), AlsaInitMixer(), and AlsaSetVolume().
|
private |
alsa mixer element
Definition at line 186 of file audio.h.
Referenced by AlsaExit(), AlsaInitMixer(), and AlsaSetVolume().
|
private |
alsa pcm handle
Definition at line 184 of file audio.h.
Referenced by AlsaExit(), AlsaInitPCMDevice(), AlsaSetup(), ClockDriftCompensation(), CyclicCall(), DropSamplesOlderThanPtsMs(), Enqueue(), FlushAlsaBuffersInternal(), GetHardwareOutputDelayMs(), GetHardwareOutputPtsMs(), GetOutputPtsMsInternal(), HandleError(), OpenAlsaDevice(), SendAudio(), SendPause(), and SetHwDelayBaseline().
|
private |
passthrough mask
Definition at line 122 of file audio.h.
Referenced by AlsaInitPCMDevice(), ClockDriftCompensation(), CyclicCall(), FlushAlsaBuffersInternal(), GetPassthrough(), HandleError(), SendAudio(), SetHwDelayBaseline(), SetPassthroughMask(), and SetVolume().
|
private |
holds the burst data itself
Definition at line 127 of file audio.h.
Referenced by BuildPauseBurst(), EnqueueSpdif(), and SendPause().
audio is paused
Definition at line 119 of file audio.h.
Referenced by CyclicCall(), IsPaused(), and SetPaused().
|
private |
mutex for a safe thread pausing
Definition at line 111 of file audio.h.
Referenced by CyclicCall(), EnqueueSpdif(), and SetPaused().
|
private |
Definition at line 174 of file audio.h.
Referenced by FilterGetFrame(), and InitFilter().
|
private |
Definition at line 173 of file audio.h.
Referenced by Filter(), and InitFilter().
|
private |
|
private |
|
private |
|
private |
Definition at line 172 of file audio.h.
Referenced by CheckForFilterReady(), Exit(), and InitFilter().
|
private |
PID controller for clock drift compensation with tuning values coming from educated guesses.
Definition at line 99 of file audio.h.
Referenced by ClockDriftCompensation(), DropSamplesOlderThanPtsMs(), and FlushBuffers().
|
private |
|
private |
pitch adjustment in ppm. Positive values are faster
Definition at line 113 of file audio.h.
Referenced by ClockDriftCompensation(), Enqueue(), and SetPassthroughMask().
|
private |
sample ring buffer
Definition at line 181 of file audio.h.
Referenced by DropSamplesOlderThanPtsMs(), Enqueue(), FlushBuffers(), GetOutputPtsMsInternal(), GetUsedBytes(), IsBufferFull(), and SendAudio().
|
private |
pointer to AVCodecContext pkts_timebase
Definition at line 109 of file audio.h.
Referenced by InitFilter(), MsToPts(), PtsToMs(), SetTimebase(), and Setup().
|
private |
flag to use soft volume
Definition at line 121 of file audio.h.
Referenced by SendAudio(), SetSoftvol(), and SetVolume().
|
private |
size of the current spdif burst
Definition at line 126 of file audio.h.
Referenced by BuildPauseBurst(), CyclicCall(), EnqueueSpdif(), and SendPause().
|
private |
volume descent for stereo
Definition at line 157 of file audio.h.
Referenced by SetStereoDescent(), and SetVolume().
|
private |
flag to use equalizer
Definition at line 162 of file audio.h.
Referenced by InitFilter(), and SetEq().
|
private |
current volume (0 .. 1000)
Definition at line 158 of file audio.h.
Referenced by SendAudio(), SetStereoDescent(), SetVolume(), and SoftAmplify().
number of normalize average samples
Definition at line 93 of file audio.h.
Referenced by FlushAlsaBuffersInternal(), and Normalize().