MythTV master
audiooutputnull.cpp
Go to the documentation of this file.
1#include <algorithm>
2#include <cerrno>
3#include <cstdio>
4#include <cstdlib>
5#include <cstring>
6#include <fcntl.h>
7#include <iostream>
8#include <sys/time.h>
9#include <unistd.h>
10#ifndef _WIN32
11#include <sys/ioctl.h>
12#else
13#include "libmythbase/compat.h"
14#endif
15
17#include "audiooutputnull.h"
18
19static constexpr uint8_t CHANNELS_MIN { 1 };
20static constexpr uint8_t CHANNELS_MAX { 8 };
21
23 AudioOutputBase(settings)
24{
25 InitSettings(settings);
26 if (settings.m_init)
27 Reconfigure(settings);
28}
29
31{
32 KillAudio();
33}
34
36{
37 LOG(VB_GENERAL, LOG_INFO, "Opening NULL audio device, will fail.");
38
41
42 return false;
43}
44
46{
47}
48
50{
51 // Pretend that we support everything
52 auto *settings = new AudioOutputSettings();
53
54 // NOLINTNEXTLINE(bugprone-infinite-loop)
55 while (int rate = settings->GetNextRate())
56 {
57 settings->AddSupportedRate(rate);
58 }
59
60 // NOLINTNEXTLINE(bugprone-infinite-loop)
61 while (AudioFormat fmt = settings->GetNextFormat())
62 {
63 settings->AddSupportedFormat(fmt);
64 }
65
66 for (uint channels = CHANNELS_MIN; channels <= CHANNELS_MAX; channels++)
67 {
68 settings->AddSupportedChannels(channels);
69 }
70
71 settings->setPassthrough(-1); // no passthrough
72
73 return settings;
74}
75
76
77void AudioOutputNULL::WriteAudio(unsigned char* aubuf, int size)
78{
80 {
82 {
83 LOG(VB_GENERAL, LOG_ERR, "null audio output should not have just "
84 "had data written to it");
85 return;
86 }
88 m_pcmOutputBuffer.insert(m_pcmOutputBuffer.end(), aubuf, aubuf+size);
90 }
91}
92
93int AudioOutputNULL::readOutputData(unsigned char *read_buffer, size_t max_length)
94{
95 size_t amount_to_read = std::min(max_length, m_pcmOutputBuffer.size());
96
99 m_pcmOutputBuffer.cbegin() + amount_to_read,
100 read_buffer);
102 m_pcmOutputBuffer.cbegin() + amount_to_read);
103 m_pcmOutputBufferMutex.unlock();
104
105 return amount_to_read;
106}
107
109{
111 {
113 m_pcmOutputBuffer.clear();
114 m_pcmOutputBufferMutex.unlock();
115 }
117}
118
120{
122 return m_pcmOutputBuffer.size();
123
124 return 0;
125}
static constexpr uint8_t CHANNELS_MAX
static constexpr uint8_t CHANNELS_MIN
static constexpr int32_t NULLAUDIO_OUTPUT_BUFFER_SIZE
void KillAudio(void)
Kill the output thread and cleanup.
void Reconfigure(const AudioSettings &settings) override
(Re)Configure AudioOutputBase
void InitSettings(const AudioSettings &settings)
void Reset(void) override
Reset the audiobuffer, timecode and mythmusic visualisation.
void WriteAudio(unsigned char *aubuf, int size) override
int GetBufferedOnSoundcard(void) const override
Return the size in bytes of frames currently in the audio buffer adjusted with the audio playback lat...
QMutex m_pcmOutputBufferMutex
void Reset(void) override
Reset the audiobuffer, timecode and mythmusic visualisation.
AudioOutputNULL(const AudioSettings &settings)
void CloseDevice(void) override
AudioOutputSettings * GetOutputSettings(bool digital) override
~AudioOutputNULL() override
int readOutputData(unsigned char *read_buffer, size_t max_length) override
bool OpenDevice(void) override
std::vector< unsigned char > m_pcmOutputBuffer
bool m_init
If set to false, AudioOutput instance will not try to initially open the audio device.
Definition: audiosettings.h:85
unsigned int uint
Definition: freesurround.h:24
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
MBASE_PUBLIC long long copy(QFile &dst, QFile &src, uint block_size=0)
Copies src file to dst file.