MythTV  master
audiooutputsettings.cpp
Go to the documentation of this file.
1 /* -*- Mode: c++ -*-
2  *
3  * Copyright (C) 2010 foobum@gmail.com and jyavenard@gmail.com
4  *
5  * Licensed under the GPL v2 or a later version at your choosing.
6  */
7 
8 #include <array>
9 #include <algorithm>
10 #include <vector>
11 
12 #include "audiooutputsettings.h"
13 #include "mythlogging.h"
14 #include "mythcorecontext.h"
15 
16 extern "C" {
17 #include "libavutil/avutil.h" // to check version of libavformat
18 }
19 #include "eldutils.h"
20 
21 #define LOC QString("AOS: ")
22 
24 {
25  5512, 8000, 11025, 16000, 22050, 32000, 44100,
26  48000, 88200, 96000, 176400, 192000
27 };
28 
30 {
32 };
33 
35  m_invalid(invalid)
36 {
37  m_srIt = kStdRates.begin();
38  m_sfIt = kStdFormats.begin();
39 }
40 
42 {
43  m_rates.clear();
44  m_formats.clear();
45  m_channels.clear();
46 }
47 
49  const AudioOutputSettings &rhs)
50 {
51  if (this == &rhs)
52  return *this;
53  m_rates = rhs.m_rates;
54  m_formats = rhs.m_formats;
55  m_channels = rhs.m_channels;
57  m_features = rhs.m_features;
58  m_invalid = rhs.m_invalid;
59  m_hasEld = rhs.m_hasEld;
60  m_eld = rhs.m_eld;
61  m_srIt = kStdRates.begin() + (rhs.m_srIt - kStdRates.begin());
62  m_sfIt = kStdFormats.begin() + (rhs.m_sfIt - kStdFormats.begin());
63  return *this;
64 }
65 
67 {
68  if (m_srIt == kStdRates.end())
69  {
70  m_srIt = kStdRates.begin();
71  return 0;
72  }
73 
74  return *m_srIt++;
75 }
76 
78 {
79  m_rates.push_back(rate);
80  LOG(VB_AUDIO, LOG_INFO, LOC +
81  QString("Sample rate %1 is supported").arg(rate));
82 }
83 
85 {
86  if (m_rates.empty() && rate == 48000)
87  return true;
88 
89  auto result = std::find(m_rates.cbegin(), m_rates.cend(), rate);
90  return result != m_rates.end();
91 }
92 
94 {
95  if (m_rates.empty())
96  return 48000;
97  return m_rates.back();
98 }
99 
101 {
102  if (m_rates.empty())
103  return 48000;
104 
105  // Assume rates vector is sorted
106  auto it = std::find_if(m_rates.cbegin(), m_rates.cend(),
107  [rate](const auto entry){ return entry >= rate; } );
108  if (it != m_rates.cend())
109  return *it;
110 
111  // Not found, so return highest available rate
112  return m_rates.back();
113 }
114 
116 {
117  if (m_sfIt == kStdFormats.end())
118  {
119  m_sfIt = kStdFormats.begin();
120  return FORMAT_NONE;
121  }
122 
123  return *m_sfIt++;
124 }
125 
127 {
128  LOG(VB_AUDIO, LOG_INFO, LOC +
129  QString("Format %1 is supported").arg(FormatToString(format)));
130  m_formats.push_back(format);
131 }
132 
134 {
135  if (m_formats.empty() && format == FORMAT_S16)
136  return true;
137 
138  auto result = std::find(m_formats.cbegin(), m_formats.cend(), format);
139  return result != m_formats.end();
140 }
141 
143 {
144  if (m_formats.empty())
145  return FORMAT_S16;
146  return m_formats.back();
147 }
148 
150 {
151  switch (format)
152  {
153  case FORMAT_U8: return 8;
154  case FORMAT_S16: return 16;
155  case FORMAT_S24LSB:
156  case FORMAT_S24: return 24;
157  case FORMAT_S32:
158  case FORMAT_FLT: return 32;
159  case FORMAT_NONE:
160  default: return -1;
161  }
162 }
163 
165 {
166  switch (format)
167  {
168  case FORMAT_U8: return "unsigned 8 bit";
169  case FORMAT_S16: return "signed 16 bit";
170  case FORMAT_S24: return "signed 24 bit MSB";
171  case FORMAT_S24LSB: return "signed 24 bit LSB";
172  case FORMAT_S32: return "signed 32 bit";
173  case FORMAT_FLT: return "32 bit floating point";
174  case FORMAT_NONE: return "none";
175  default: return "unknown";
176  }
177 }
178 
180 {
181  switch (format)
182  {
183  case FORMAT_U8: return 1;
184  case FORMAT_S16: return 2;
185  case FORMAT_S24:
186  case FORMAT_S24LSB:
187  case FORMAT_S32:
188  case FORMAT_FLT: return 4;
189  case FORMAT_NONE:
190  default: return 0;
191  }
192 }
193 
198 {
199  switch (av_get_packed_sample_fmt(format))
200  {
201  case AV_SAMPLE_FMT_U8: return FORMAT_U8;
202  case AV_SAMPLE_FMT_S16: return FORMAT_S16;
203  case AV_SAMPLE_FMT_FLT: return FORMAT_FLT;
204  case AV_SAMPLE_FMT_DBL: return FORMAT_NONE;
205  case AV_SAMPLE_FMT_S32:
206  switch (bits)
207  {
208  case 0: return FORMAT_S32;
209  case 24: return FORMAT_S24;
210  case 32: return FORMAT_S32;
211  default: return FORMAT_NONE;
212  }
213  default: return FORMAT_NONE;
214  }
215 }
216 
223 {
224  switch (format)
225  {
226  case FORMAT_U8: return AV_SAMPLE_FMT_U8;
227  case FORMAT_S16: return AV_SAMPLE_FMT_S16;
228  case FORMAT_FLT: return AV_SAMPLE_FMT_FLT;
229  case FORMAT_S32:
230  case FORMAT_S24:
231  case FORMAT_S24LSB: return AV_SAMPLE_FMT_S32;
232  default: return AV_SAMPLE_FMT_NONE;
233  }
234 }
235 
237 {
238  m_channels.push_back(channels);
239  LOG(VB_AUDIO, LOG_INFO, LOC + QString("%1 channel(s) are supported")
240  .arg(channels));
241 }
242 
244 {
245  if (m_channels.empty() && channels == 2)
246  return true;
247 
248  return std::any_of(m_channels.cbegin(), m_channels.cend(),
249  [channels](const auto entry)
250  { return entry == channels; } );
251 }
252 
254 {
255  if (m_channels.empty())
256  return 2;
257  return m_channels.back();
258 }
259 
261 {
262  if (m_channels.empty())
263  return;
264  sort(m_channels.begin(), m_channels.end());
265 }
266 
268 {
269  if (m_channels.empty())
270  {
271  m_channels.push_back(channels);
272  return;
273  }
274 
275  std::vector<int>tmp;
276  std::copy_if(m_channels.cbegin(), m_channels.cend(),
277  std::back_inserter(tmp),
278  [channels](int value){ return channels > value; } );
279  m_channels = tmp;
280  m_channels.push_back(channels);
281 }
282 
284 {
285  if (val)
286  m_features |= arg;
287  else
288  m_features &= ~arg;
289 };
290 
292 {
293  setFeature(val, (int) arg);
294 };
295 
303 {
304  AudioOutputSettings* aosettings = this;
305 
306  if (newcopy)
307  {
308  aosettings = new AudioOutputSettings;
309  *aosettings = *this;
310  }
311 
312  if (m_invalid)
313  return aosettings;
314 
315  if (BestSupportedPCMChannelsELD() > 2)
316  {
317  aosettings->setFeature(FEATURE_LPCM);
318  }
319 
321  {
322  // E-AC3 is transferred as stereo PCM at 4 times the rates
323  // assume all amplifier supporting E-AC3 also supports 7.1 LPCM
324  // as it's mandatory under the bluray standard
325 //#if LIBAVFORMAT_VERSION_INT > AV_VERSION_INT( 52, 83, 0 )
326  if (m_passthrough >= 0 && IsSupportedChannels(8) &&
327  IsSupportedRate(192000))
328  aosettings->setFeature(FEATURE_TRUEHD | FEATURE_DTSHD |
329  FEATURE_EAC3);
330 //#endif
331  if (m_passthrough >= 0)
332  {
333  if (BestSupportedChannels() == 2)
334  {
335  LOG(VB_AUDIO, LOG_INFO, LOC + "may be AC3 or DTS capable");
336  aosettings->AddSupportedChannels(6);
337  }
338  aosettings->setFeature(FEATURE_AC3 | FEATURE_DTS);
339  }
340  }
341  else
342  {
343  // Can't do digital passthrough without 16 bits audio
344  aosettings->setPassthrough(-1);
345  aosettings->setFeature(false,
348  }
349 
350  return aosettings;
351 }
352 
360 {
361  AudioOutputSettings* aosettings = this;
362 
363  if (newcopy)
364  aosettings = GetCleaned(newcopy);
365 
366  if (aosettings->m_invalid)
367  return aosettings;
368 
369  int cur_channels = gCoreContext->GetNumSetting("MaxChannels", 2);
370  int max_channels = aosettings->BestSupportedChannels();
371 
372  bool bAC3 = aosettings->canFeature(FEATURE_AC3) &&
373  gCoreContext->GetBoolSetting("AC3PassThru", false);
374 
375  bool bDTS = aosettings->canFeature(FEATURE_DTS) &&
376  gCoreContext->GetBoolSetting("DTSPassThru", false);
377 
378  bool bLPCM = aosettings->canFeature(FEATURE_LPCM) &&
379  !gCoreContext->GetBoolSetting("StereoPCM", false);
380 
381  bool bEAC3 = aosettings->canFeature(FEATURE_EAC3) &&
382  gCoreContext->GetBoolSetting("EAC3PassThru", false) &&
383  !gCoreContext->GetBoolSetting("Audio48kOverride", false);
384 
385  // TrueHD requires HBR support.
386  bool bTRUEHD = aosettings->canFeature(FEATURE_TRUEHD) &&
387  gCoreContext->GetBoolSetting("TrueHDPassThru", false) &&
388  !gCoreContext->GetBoolSetting("Audio48kOverride", false) &&
389  gCoreContext->GetBoolSetting("HBRPassthru", true);
390 
391  bool bDTSHD = aosettings->canFeature(FEATURE_DTSHD) &&
392  gCoreContext->GetBoolSetting("DTSHDPassThru", false) &&
393  !gCoreContext->GetBoolSetting("Audio48kOverride", false);
394 
395  if (max_channels > 2 && !bLPCM)
396  max_channels = 2;
397  if (max_channels == 2 && (bAC3 || bDTS))
398  max_channels = 6;
399 
400  if (cur_channels > max_channels)
401  cur_channels = max_channels;
402 
403  aosettings->SetBestSupportedChannels(cur_channels);
404  aosettings->setFeature(bAC3, FEATURE_AC3);
405  aosettings->setFeature(bDTS, FEATURE_DTS);
406  aosettings->setFeature(bLPCM, FEATURE_LPCM);
407  aosettings->setFeature(bEAC3, FEATURE_EAC3);
408  aosettings->setFeature(bTRUEHD, FEATURE_TRUEHD);
409  aosettings->setFeature(bDTSHD, FEATURE_DTSHD);
410 
411  return aosettings;
412 }
413 
415 {
417  return 0;
418 
419  // If no HBR or no LPCM, limit bitrate to 6.144Mbit/s
420  if (!gCoreContext->GetBoolSetting("HBRPassthru", true) ||
422  {
423  return 192000; // E-AC3/DTS-HD High Res: 192k, 16 bits, 2 ch
424  }
425  return 768000; // TrueHD or DTS-HD MA: 192k, 16 bits, 8 ch
426 }
427 
429 {
431  const std::string name;
432 };
433 static const std::array<featureStruct,7> feature {{
434  { FEATURE_AC3, "AC3"},
435  { FEATURE_DTS, "DTS"},
436  { FEATURE_LPCM, "LPCM"},
437  { FEATURE_EAC3, "EAC3"},
438  { FEATURE_TRUEHD, "TRUEHD"},
439  { FEATURE_DTSHD, "DTSHD"},
440  { FEATURE_AAC, "AAC"},
441 }};
442 
444 {
445  QStringList tmp;
446  for (const auto & [flag, name] : feature)
447  {
448  if (arg & flag)
449  tmp += QString::fromStdString(name);
450  }
451  return tmp.join(",");
452 }
453 
454 QString AudioOutputSettings::GetPassthroughParams(int codec, int codec_profile,
455  int &samplerate,
456  int &channels,
457  bool canDTSHDMA)
458 {
459  QString log;
460 
461  channels = 2;
462 
463  switch (codec)
464  {
465  case AV_CODEC_ID_AC3:
466  log = "AC3";
467  break;
468  case AV_CODEC_ID_EAC3:
469  samplerate = samplerate * 4;
470  log = "Dolby Digital Plus (E-AC3)";
471  break;
472  case AV_CODEC_ID_DTS:
473  switch(codec_profile)
474  {
475  case FF_PROFILE_DTS_ES:
476  log = "DTS-ES";
477  break;
478  case FF_PROFILE_DTS_96_24:
479  log = "DTS 96/24";
480  break;
481  case FF_PROFILE_DTS_HD_HRA:
482  samplerate = 192000;
483  log = "DTS-HD High-Res";
484  break;
485  case FF_PROFILE_DTS_HD_MA:
486  samplerate = 192000;
487  if (canDTSHDMA)
488  {
489  log = "DTS-HD MA";
490  channels = 8;
491  }
492  else
493  {
494  log = "DTS-HD High-Res";
495  }
496  break;
497  case FF_PROFILE_DTS:
498  default:
499  log = "DTS Core";
500  break;
501  }
502  break;
503  case AV_CODEC_ID_TRUEHD:
504  channels = 8;
505  log = "TrueHD";
506  switch(samplerate)
507  {
508  case 48000:
509  case 96000:
510  case 192000:
511  samplerate = 192000;
512  break;
513  case 44100:
514  case 88200:
515  case 176400:
516  samplerate = 176400;
517  break;
518  default:
519  log = "TrueHD: Unsupported samplerate";
520  break;
521  }
522  break;
523  default:
524  break;
525  }
526  return log;
527 }
528 
530 {
531  return m_hasEld && m_eld.isValid();
532 };
533 
535 {
536  return m_hasEld;
537 };
538 
539 void AudioOutputSettings::setELD(QByteArray *ba)
540 {
541  m_hasEld = true;
542  m_eld = eld(ba->constData(), ba->size());
543  m_eld.show();
544 }
545 
547 {
549  if (!hasValidELD())
550  return chan;
551  int eldc = m_eld.maxChannels();
552  return eldc < chan ? eldc : chan;
553 }
554 
556 {
558  if (!hasValidELD())
559  return chan;
560  int eldc = m_eld.maxLPCMChannels();
561  return eldc < chan ? eldc : chan;
562 }
FORMAT_U8
@ FORMAT_U8
Definition: audiooutputsettings.h:27
FORMAT_NONE
@ FORMAT_NONE
Definition: audiooutputsettings.h:26
AudioOutputSettings::GetNextRate
int GetNextRate()
Definition: audiooutputsettings.cpp:66
AudioOutputSettings::SortSupportedChannels
void SortSupportedChannels()
Definition: audiooutputsettings.cpp:260
AudioOutputSettings::IsSupportedChannels
bool IsSupportedChannels(int channels)
Definition: audiooutputsettings.cpp:243
AudioOutputSettings::IsSupportedRate
bool IsSupportedRate(int rate)
Definition: audiooutputsettings.cpp:84
AudioOutputSettings::AVSampleFormatToFormat
static AudioFormat AVSampleFormatToFormat(AVSampleFormat format, int bits=0)
Return AVSampleFormat closest equivalent to AudioFormat.
Definition: audiooutputsettings.cpp:197
AudioOutputSettings::BestSupportedRate
int BestSupportedRate()
Definition: audiooutputsettings.cpp:93
AudioOutputSettings::setPassthrough
void setPassthrough(int val)
Definition: audiooutputsettings.h:77
FORMAT_S16
@ FORMAT_S16
Definition: audiooutputsettings.h:28
AudioOutputSettings::AddSupportedFormat
void AddSupportedFormat(AudioFormat format)
Definition: audiooutputsettings.cpp:126
featureStruct
Definition: audiooutputsettings.cpp:429
AudioOutputSettings::operator=
AudioOutputSettings & operator=(const AudioOutputSettings &)
Definition: audiooutputsettings.cpp:48
eld::show
void show()
Definition: eldutils.cpp:430
AudioOutputSettings::FormatToAVSampleFormat
static AVSampleFormat FormatToAVSampleFormat(AudioFormat format)
Return AudioFormat closest equivalent to AVSampleFormat Note that FORMAT_S24LSB and FORMAT_S24 have n...
Definition: audiooutputsettings.cpp:222
AudioOutputSettings::m_eld
eld m_eld
Definition: audiooutputsettings.h:206
eld
Definition: eldutils.h:38
AudioOutputSettings::FeaturesToString
QString FeaturesToString(void) const
Definition: audiooutputsettings.h:152
FEATURE_AC3
@ FEATURE_AC3
Definition: audiooutputsettings.h:37
AudioOutputSettings::FormatToBits
static int FormatToBits(AudioFormat format)
Definition: audiooutputsettings.cpp:149
AudioOutputSettings::kStdRates
static const rate_array kStdRates
Definition: audiooutputsettings.h:214
rate_array
std::array< const int, 12 > rate_array
Definition: audiooutputsettings.h:46
eld::maxLPCMChannels
int maxLPCMChannels()
Definition: eldutils.cpp:465
arg
arg(title).arg(filename).arg(doDelete))
AudioOutputSettings::SampleSize
static int SampleSize(AudioFormat format)
Definition: audiooutputsettings.cpp:179
FEATURE_TRUEHD
@ FEATURE_TRUEHD
Definition: audiooutputsettings.h:41
AudioOutputSettings::m_channels
std::vector< int > m_channels
Definition: audiooutputsettings.h:209
AudioOutputSettings::~AudioOutputSettings
~AudioOutputSettings()
Definition: audiooutputsettings.cpp:41
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:23
AudioOutputSettings::m_sfIt
format_array::iterator m_sfIt
Definition: audiooutputsettings.h:212
AudioOutputSettings::m_features
unsigned int m_features
Definition: audiooutputsettings.h:196
FEATURE_EAC3
@ FEATURE_EAC3
Definition: audiooutputsettings.h:40
eldutils.h
AudioOutputSettings::m_invalid
bool m_invalid
Definition: audiooutputsettings.h:198
tmp
static guint32 * tmp
Definition: goom_core.cpp:31
AudioOutputSettings::AddSupportedChannels
void AddSupportedChannels(int channels)
Definition: audiooutputsettings.cpp:236
AudioOutputSettings::GetCleaned
AudioOutputSettings * GetCleaned(bool newcopy=false)
Returns capabilities supported by the audio device amended to take into account the digital audio opt...
Definition: audiooutputsettings.cpp:302
AudioOutputSettings::GetUsers
AudioOutputSettings * GetUsers(bool newcopy=false)
Returns capabilities supported by the audio device amended to take into account the digital audio opt...
Definition: audiooutputsettings.cpp:359
mythlogging.h
AudioOutputSettings::m_rates
std::vector< int > m_rates
Definition: audiooutputsettings.h:208
AudioOutputSettings::GetMaxHDRate
int GetMaxHDRate() const
return the highest iec958 rate supported.
Definition: audiooutputsettings.cpp:414
AudioOutputSettings::BestSupportedChannelsELD
int BestSupportedChannelsELD()
Reports best supported channel number, restricted to ELD range.
Definition: audiooutputsettings.cpp:546
feature
static const std::array< featureStruct, 7 > feature
Definition: audiooutputsettings.cpp:433
AudioOutputSettings::AudioOutputSettings
AudioOutputSettings(bool invalid=false)
Definition: audiooutputsettings.cpp:34
AudioOutputSettings::BestSupportedChannels
int BestSupportedChannels()
Definition: audiooutputsettings.cpp:253
FEATURE_DTS
@ FEATURE_DTS
Definition: audiooutputsettings.h:38
AudioOutputSettings::kStdFormats
static const format_array kStdFormats
Definition: audiooutputsettings.h:215
FORMAT_S24
@ FORMAT_S24
Definition: audiooutputsettings.h:30
FEATURE_AAC
@ FEATURE_AAC
Definition: audiooutputsettings.h:43
FORMAT_FLT
@ FORMAT_FLT
Definition: audiooutputsettings.h:32
featureStruct::flag
const DigitalFeature flag
Definition: audiooutputsettings.cpp:430
format_array
std::array< const AudioFormat, 6 > format_array
Definition: audiooutputsettings.h:47
FEATURE_LPCM
@ FEATURE_LPCM
Definition: audiooutputsettings.h:39
AudioOutputSettings::AddSupportedRate
void AddSupportedRate(int rate)
Definition: audiooutputsettings.cpp:77
FORMAT_S32
@ FORMAT_S32
Definition: audiooutputsettings.h:31
AudioOutputSettings::hasELD
bool hasELD() const
get the ELD flag
Definition: audiooutputsettings.cpp:534
AudioOutputSettings::m_passthrough
int m_passthrough
passthrough status -1 : no 0: unknown 1: yes
Definition: audiooutputsettings.h:194
AudioOutputSettings::BestSupportedPCMChannelsELD
int BestSupportedPCMChannelsELD()
Reports best supported PCM channel number, restricted to ELD.
Definition: audiooutputsettings.cpp:555
AudioOutputSettings::canFeature
bool canFeature(DigitalFeature arg) const
return DigitalFeature mask.
Definition: audiooutputsettings.h:89
eld::maxChannels
int maxChannels()
Definition: eldutils.cpp:480
gCoreContext
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
Definition: mythcorecontext.cpp:60
AudioOutputSettings::setFeature
void setFeature(DigitalFeature arg)
set the provided digital feature possible values are:
Definition: audiooutputsettings.h:126
MythCoreContext::GetNumSetting
int GetNumSetting(const QString &key, int defaultval=0)
Definition: mythcorecontext.cpp:933
MythCoreContext::GetBoolSetting
bool GetBoolSetting(const QString &key, bool defaultval=false)
Definition: mythcorecontext.cpp:927
mythcorecontext.h
AudioOutputSettings::IsSupportedFormat
bool IsSupportedFormat(AudioFormat format)
Definition: audiooutputsettings.cpp:133
AudioOutputSettings::GetPassthroughParams
static QString GetPassthroughParams(int codec, int codec_profile, int &samplerate, int &channels, bool canDTSHDMA)
Setup samplerate and number of channels for passthrough.
Definition: audiooutputsettings.cpp:454
AudioOutputSettings::m_formats
std::vector< AudioFormat > m_formats
Definition: audiooutputsettings.h:210
AudioOutputSettings
Definition: audiooutputsettings.h:50
AudioOutputSettings::NearestSupportedRate
int NearestSupportedRate(int rate)
Definition: audiooutputsettings.cpp:100
DigitalFeature
DigitalFeature
Definition: audiooutputsettings.h:35
common.utilities.log
def log(debug, txt)
Definition: utilities.py:7
AudioOutputSettings::hasValidELD
bool hasValidELD()
Definition: audiooutputsettings.cpp:529
featureStruct::name
const std::string name
Definition: audiooutputsettings.cpp:431
AudioOutputSettings::m_hasEld
bool m_hasEld
will be set to true if we were able to retrieve the device ELD (EDID like Data).
Definition: audiooutputsettings.h:205
AudioOutputSettings::m_srIt
rate_array::iterator m_srIt
Definition: audiooutputsettings.h:211
AudioOutputSettings::FormatToString
static const char * FormatToString(AudioFormat format)
Definition: audiooutputsettings.cpp:164
AudioOutputSettings::BestSupportedFormat
AudioFormat BestSupportedFormat()
Definition: audiooutputsettings.cpp:142
AudioOutputSettings::setELD
void setELD(QByteArray *ba)
set ELD data
Definition: audiooutputsettings.cpp:539
AudioOutputSettings::SetBestSupportedChannels
void SetBestSupportedChannels(int channels)
Force set the greatest number of channels supported by the audio device.
Definition: audiooutputsettings.cpp:267
AudioFormat
AudioFormat
Definition: audiooutputsettings.h:25
AudioOutputSettings::GetNextFormat
AudioFormat GetNextFormat()
Definition: audiooutputsettings.cpp:115
audiooutputsettings.h
eld::isValid
bool isValid() const
Definition: eldutils.cpp:425
FEATURE_DTSHD
@ FEATURE_DTSHD
Definition: audiooutputsettings.h:42
FORMAT_S24LSB
@ FORMAT_S24LSB
Definition: audiooutputsettings.h:29
find
static pid_list_t::iterator find(const PIDInfoMap &map, pid_list_t &list, pid_list_t::iterator begin, pid_list_t::iterator end, bool find_open)
Definition: dvbstreamhandler.cpp:356
LOC
#define LOC
Definition: audiooutputsettings.cpp:21