MythTV  master
eldutils.cpp
Go to the documentation of this file.
1 /*
2  * eldutils.cpp (c) Jean-Yves Avenard <jyavenard@mythtv.org>
3  * a utility class to decode EDID Like Data (ELD) byte stream
4  *
5  * Based on ALSA hda_eld.c
6  * Copyright(c) 2008 Intel Corporation.
7  *
8  * Authors:
9  * Wu Fengguang <wfg@linux.intel.com>
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2 of the License, or
14  * (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24  */
25 
26 #include <cinttypes>
27 #include <sys/types.h>
28 
29 #include <QString>
30 
31 #include "mythconfig.h"
32 #include "eldutils.h"
33 #include "bswap.h"
34 #include "audiooutputbase.h"
35 
36 #define LOC QString("ELDUTILS: ")
37 
38 #if HAVE_BIGENDIAN
39 #define LE_SHORT(v) bswap_16(*((uint16_t *)v))
40 #define LE_INT(v) bswap_32(*((uint32_t *)v))
41 #define LE_INT64(v) bswap_64(*((uint64_t *)v))
42 #else
43 #define LE_SHORT(v) (*((uint16_t *)(v)))
44 #define LE_INT(v) (*((uint32_t *)(v)))
45 #define LE_INT64(v) (*((uint64_t *)(v)))
46 #endif
47 
49 {
52 };
53 
55 {
61 };
62 
63 static const std::array<const QString,11> cea_speaker_allocation_names {
64  /* 0 */ "FL/FR",
65  /* 1 */ "LFE",
66  /* 2 */ "FC",
67  /* 3 */ "RL/RR",
68  /* 4 */ "RC",
69  /* 5 */ "FLC/FRC",
70  /* 6 */ "RLC/RRC",
71  /* 7 */ "FLW/FRW",
72  /* 8 */ "FLH/FRH",
73  /* 9 */ "TC",
74  /* 10 */ "FCH",
75 };
76 
77 static const std::array<const QString,4> eld_connection_type_names {
78  "HDMI",
79  "DisplayPort",
80  "2-reserved",
81  "3-reserved"
82 };
83 
85 {
91 };
92 
93 static const std::array<const QString,18> audiotype_names {
94  /* 0 */ "undefined",
95  /* 1 */ "LPCM",
96  /* 2 */ "AC3",
97  /* 3 */ "MPEG1",
98  /* 4 */ "MP3",
99  /* 5 */ "MPEG2",
100  /* 6 */ "AAC-LC",
101  /* 7 */ "DTS",
102  /* 8 */ "ATRAC",
103  /* 9 */ "DSD (One Bit Audio)",
104  /* 10 */ "E-AC3",
105  /* 11 */ "DTS-HD",
106  /* 12 */ "TrueHD",
107  /* 13 */ "DST",
108  /* 14 */ "WMAPro",
109  /* 15 */ "HE-AAC",
110  /* 16 */ "HE-AACv2",
111  /* 17 */ "MPEG Surround",
112 };
113 
114 /*
115  * The following two lists are shared between
116  * - HDMI audio InfoFrame (source to sink)
117  * - CEA E-EDID Extension (sink to source)
118  */
119 
120 /*
121  * SF2:SF1:SF0 index => sampling frequency
122  */
123 #define SNDRV_PCM_RATE_5512 (1<<0) /* 5512Hz */
124 #define SNDRV_PCM_RATE_8000 (1<<1) /* 8000Hz */
125 #define SNDRV_PCM_RATE_11025 (1<<2) /* 11025Hz */
126 #define SNDRV_PCM_RATE_16000 (1<<3) /* 16000Hz */
127 #define SNDRV_PCM_RATE_22050 (1<<4) /* 22050Hz */
128 #define SNDRV_PCM_RATE_32000 (1<<5) /* 32000Hz */
129 #define SNDRV_PCM_RATE_44100 (1<<6) /* 44100Hz */
130 #define SNDRV_PCM_RATE_48000 (1<<7) /* 48000Hz */
131 #define SNDRV_PCM_RATE_64000 (1<<8) /* 64000Hz */
132 #define SNDRV_PCM_RATE_88200 (1<<9) /* 88200Hz */
133 #define SNDRV_PCM_RATE_96000 (1<<10) /* 96000Hz */
134 #define SNDRV_PCM_RATE_176400 (1<<11) /* 176400Hz */
135 #define SNDRV_PCM_RATE_192000 (1<<12) /* 192000Hz */
136 
137 static const std::array<const int,8> cea_sampling_frequencies {
138  0, /* 0: Refer to Stream Header */
139  SNDRV_PCM_RATE_32000, /* 1: 32000Hz */
140  SNDRV_PCM_RATE_44100, /* 2: 44100Hz */
141  SNDRV_PCM_RATE_48000, /* 3: 48000Hz */
142  SNDRV_PCM_RATE_88200, /* 4: 88200Hz */
143  SNDRV_PCM_RATE_96000, /* 5: 96000Hz */
144  SNDRV_PCM_RATE_176400, /* 6: 176400Hz */
145  SNDRV_PCM_RATE_192000, /* 7: 192000Hz */
146 };
147 
148 #define GRAB_BITS(buf, byte, lowbit, bits) \
149 ( \
150  ((buf)[byte] >> (lowbit)) & ((1 << (bits)) - 1) \
151 )
152 
153 ELD::ELD(const char *buf, int size)
154 {
155  m_e.formats = 0LL;
156  update_eld(buf, size);
157 }
158 
159 ELD::ELD(const ELD &rhs)
160 {
161  m_e = rhs.m_e;
162 }
163 
165 {
166  m_e.formats = 0LL;
167  m_e.eld_valid = false;
168 }
169 
170 ELD& ELD::operator=(const ELD &rhs)
171 {
172  if (this == &rhs)
173  return *this;
174  m_e = rhs.m_e;
175  return *this;
176 }
177 
178 void ELD::update_sad(int index,
179  const char *buf)
180 {
181  cea_sad *a = m_e.sad + index;
182 
183  int val = GRAB_BITS(buf, 1, 0, 7);
184  a->rates = 0;
185  for (int i = 0; i < 7; i++)
186  if ((val & (1 << i)) != 0)
187  a->rates |= cea_sampling_frequencies[i + 1];
188 
189  a->channels = GRAB_BITS(buf, 0, 0, 3);
190  a->channels++;
191 
192  a->sample_bits = 0;
193  a->max_bitrate = 0;
194 
195  a->format = GRAB_BITS(buf, 0, 3, 4);
196  m_e.formats |= 1 << a->format;
197  switch (a->format)
198  {
200  VBAUDIO("audio coding type 0 not expected");
201  break;
202 
203  case TYPE_LPCM:
204  a->sample_bits = GRAB_BITS(buf, 2, 0, 3);
205  break;
206 
207  case TYPE_AC3:
208  case TYPE_MPEG1:
209  case TYPE_MP3:
210  case TYPE_MPEG2:
211  case TYPE_AACLC:
212  case TYPE_DTS:
213  case TYPE_ATRAC:
214  a->max_bitrate = GRAB_BITS(buf, 2, 0, 8);
215  a->max_bitrate *= 8000;
216  break;
217 
218  case TYPE_SACD:
219  case TYPE_EAC3:
220  case TYPE_DTS_HD:
221  case TYPE_MLP:
222  case TYPE_DST:
223  break;
224 
225  case TYPE_WMAPRO:
226  a->profile = GRAB_BITS(buf, 2, 0, 3);
227  break;
228 
229  case TYPE_REF_CXT:
230  a->format = GRAB_BITS(buf, 2, 3, 5);
231  if (a->format == XTYPE_HE_REF_CT ||
233  {
234  VBAUDIO(QString("audio coding xtype %1 not expected")
235  .arg(a->format));
236  a->format = 0;
237  }
238  else
239  {
241  }
242  break;
243  }
244 }
245 
246 int ELD::update_eld(const char *buf, int size)
247 {
248  int mnl = 0;
249 
250  m_e.eld_ver = GRAB_BITS(buf, 0, 3, 5);
251  if (m_e.eld_ver != ELD_VER_CEA_861D &&
253  {
254  VBAUDIO(QString("Unknown ELD version %1").arg(m_e.eld_ver));
255  goto out_fail;
256  }
257 
258  m_e.eld_size = size;
259  m_e.baseline_len = GRAB_BITS(buf, 2, 0, 8);
260  mnl = GRAB_BITS(buf, 4, 0, 5);
261  m_e.cea_edid_ver = GRAB_BITS(buf, 4, 5, 3);
262 
263  m_e.support_hdcp = GRAB_BITS(buf, 5, 0, 1);
264  m_e.support_ai = GRAB_BITS(buf, 5, 1, 1);
265  m_e.conn_type = GRAB_BITS(buf, 5, 2, 2);
266  m_e.sad_count = GRAB_BITS(buf, 5, 4, 4);
267 
268  m_e.aud_synch_delay = GRAB_BITS(buf, 6, 0, 8) * 2;
269  m_e.spk_alloc = GRAB_BITS(buf, 7, 0, 7);
270 
271  m_e.port_id = LE_INT64(buf + 8);
272 
273  /* not specified, but the spec's tendency is little endian */
274  m_e.manufacture_id = LE_SHORT(buf + 16);
275  m_e.product_id = LE_SHORT(buf + 18);
276 
277  if (ELD_FIXED_BYTES + mnl > size)
278  {
279  VBAUDIO(QString("out of range MNL %1").arg(mnl));
280  goto out_fail;
281  }
282  else
283  {
284  std::string tmp(buf + ELD_FIXED_BYTES, mnl);
285  m_e.monitor_name = QString::fromStdString(tmp);
286  }
287 
288  for (int i = 0; i < m_e.sad_count; i++)
289  {
290  if (ELD_FIXED_BYTES + mnl + 3 * (i + 1) > size)
291  {
292  VBAUDIO(QString("out of range SAD %1").arg(i));
293  goto out_fail;
294  }
295  update_sad(i, buf + ELD_FIXED_BYTES + mnl + 3 * i);
296  }
297 
298  /*
299  * Assume the highest speakers configuration
300  */
301  if (!m_e.spk_alloc)
302  m_e.spk_alloc = 0xffff;
303 
304  m_e.eld_valid = true;
305  return 0;
306 
307  out_fail:
308  m_e.eld_valid = false;
309  return -1;
310 }
311 
316 QString ELD::print_pcm_rates(int pcm)
317 {
318  static const std::array<const uint32_t,12> rates {
319  5512, 8000, 11025, 16000, 22050, 32000, 44100, 48000, 88200,
320  96000, 176400, 192000 };
321  QString result = QString();
322 
323  for (size_t i = 0; i < rates.size(); i++)
324  {
325  if ((pcm & (1 << i)) != 0)
326  {
327  result += QString(" %1").arg(rates[i]);
328  }
329  }
330  return result;
331 }
332 
337 QString ELD::print_pcm_bits(int pcm)
338 {
339  static const std::array<const uint8_t,3> bits { 16, 20, 24 };
340  QString result = QString();
341 
342  for (size_t i = 0; i < bits.size(); i++)
343  {
344  if ((pcm & (1 << i)) != 0)
345  {
346  result += QString(" %1").arg(bits[i]);
347  }
348  }
349  return result;
350 }
351 
352 QString ELD::sad_desc(int index)
353 {
354  cea_sad *a = m_e.sad + index;
355  if (!a->format)
356  return "";
357 
358  QString buf = print_pcm_rates(a->rates);
359  QString buf2 = ", bits =";
360 
361  if (a->format == TYPE_LPCM)
362  buf2 += print_pcm_bits(a->sample_bits);
363  else if (a->max_bitrate)
364  buf2 = QString(", max bitrate = %1").arg(a->max_bitrate);
365  else
366  buf2 = "";
367 
368  return QString("supports coding type %1:"
369  " channels = %2, rates =%3%4")
370  .arg(audiotype_names[a->format])
371  .arg(a->channels)
372  .arg(buf)
373  .arg(buf2);
374 }
375 
377 {
378  QString result = QString();
379 
380  for (size_t i = 0; i < cea_speaker_allocation_names.size(); i++)
381  {
382  if ((m_e.spk_alloc & (1 << i)) != 0)
383  {
384  result += QString(" %1").arg(cea_speaker_allocation_names[i]);
385  }
386  }
387  return result;
388 }
389 
390 QString ELD::eld_version_name() const
391 {
392  switch (m_e.eld_ver)
393  {
394  case 2: return "CEA-861D or below";
395  case 31: return "partial";
396  default: return "reserved";
397  }
398 }
399 
400 QString ELD::edid_version_name() const
401 {
402  switch (m_e.cea_edid_ver)
403  {
404  case 0: return "no CEA EDID Timing Extension block present";
405  case 1: return "CEA-861";
406  case 2: return "CEA-861-A";
407  case 3: return "CEA-861-B, C or D";
408  default: return "reserved";
409  }
410 }
411 
412 QString ELD::info_desc() const
413 {
414  QString result = QString("manufacture_id\t\t0x%1\n")
415  .arg(m_e.manufacture_id, 0, 16);
416  result += QString("product_id\t\t0x%1\n").arg(m_e.product_id, 0, 16);
417  result += QString("port_id\t\t\t0x%1\n").arg((long long)m_e.port_id);
418  result += QString("support_hdcp\t\t%1\n").arg(m_e.support_hdcp);
419  result += QString("support_ai\t\t%1\n").arg(m_e.support_ai);
420  result += QString("audio_sync_delay\t%1\n").arg(m_e.aud_synch_delay);
421  result += QString("sad_count\t\t%1\n").arg(m_e.sad_count);
422  return result;
423 }
424 
425 bool ELD::isValid() const
426 {
427  return m_e.eld_valid;
428 }
429 
430 void ELD::show()
431 {
432  if (!isValid())
433  {
434  VBAUDIO("Invalid ELD");
435  return;
436  }
437  VBAUDIO(QString("Detected monitor %1 at connection type %2")
438  .arg(product_name().simplified())
439  .arg(connection_name()));
440 
441  if (m_e.spk_alloc)
442  {
443  VBAUDIO(QString("available speakers:%1")
445  }
446  VBAUDIO(QString("max LPCM channels = %1").arg(maxLPCMChannels()));
447  VBAUDIO(QString("max channels = %1").arg(maxChannels()));
448  VBAUDIO(QString("supported codecs = %1").arg(codecs_desc()));
449  for (int i = 0; i < m_e.sad_count; i++)
450  {
451  VBAUDIO(sad_desc(i));
452  }
453 }
454 
455 QString ELD::product_name() const
456 {
457  return m_e.monitor_name;
458 }
459 
460 QString ELD::connection_name() const
461 {
463 }
464 
466 {
467  int channels = 2; // assume stereo at the minimum
468  for (int i = 0; i < m_e.sad_count; i++)
469  {
470  struct cea_sad *a = m_e.sad + i;
471  if (a->format == TYPE_LPCM)
472  {
473  if (a->channels > channels)
474  channels = a->channels;
475  }
476  }
477  return channels;
478 }
479 
481 {
482  int channels = 2; // assume stereo at the minimum
483  for (int i = 0; i < m_e.sad_count; i++)
484  {
485  struct cea_sad *a = m_e.sad + i;
486  if (a->channels > channels)
487  channels = a->channels;
488  }
489  return channels;
490 }
491 
492 QString ELD::codecs_desc() const
493 {
494  QString result = QString();
495  bool found_one = false;
496  for (size_t i = 0; i < audiotype_names.size(); i++)
497  {
498  if ((m_e.formats & (1 << i)) != 0)
499  {
500  if (found_one)
501  result += ", ";
502  result += audiotype_names[i];
503  found_one = true;
504  }
505  }
506  return result;
507 }
ELD::TYPE_AACLC
@ TYPE_AACLC
Definition: eldutils.h:64
ELD::eld_data::cea_edid_ver
int cea_edid_ver
Definition: eldutils.h:109
ELD::TYPE_REF_STREAM_HEADER
@ TYPE_REF_STREAM_HEADER
Definition: eldutils.h:58
eld_versions
eld_versions
Definition: eldutils.cpp:49
ELD::TYPE_EAC3
@ TYPE_EAC3
Definition: eldutils.h:68
VBAUDIO
#define VBAUDIO(str)
Definition: audiooutputbase.h:19
XTYPE_MPEG_SURROUND
@ XTYPE_MPEG_SURROUND
Definition: eldutils.cpp:89
GRAB_BITS
#define GRAB_BITS(buf, byte, lowbit, bits)
Definition: eldutils.cpp:148
SNDRV_PCM_RATE_176400
#define SNDRV_PCM_RATE_176400
Definition: eldutils.cpp:134
ELD::maxLPCMChannels
int maxLPCMChannels()
Definition: eldutils.cpp:465
ELD::cea_sad::max_bitrate
int max_bitrate
Definition: eldutils.h:97
ELD::eld_data::product_id
int product_id
Definition: eldutils.h:112
LE_SHORT
#define LE_SHORT(v)
Definition: eldutils.cpp:43
CEA_EDID_VER_CEA861BCD
@ CEA_EDID_VER_CEA861BCD
Definition: eldutils.cpp:59
ELD::edid_version_name
QString edid_version_name() const
Definition: eldutils.cpp:400
CEA_EDID_VER_CEA861
@ CEA_EDID_VER_CEA861
Definition: eldutils.cpp:57
ELD::eld_data::support_hdcp
int support_hdcp
Definition: eldutils.h:115
SNDRV_PCM_RATE_88200
#define SNDRV_PCM_RATE_88200
Definition: eldutils.cpp:132
arg
arg(title).arg(filename).arg(doDelete))
ELD::TYPE_AC3
@ TYPE_AC3
Definition: eldutils.h:60
ELD::ELD
ELD()
Definition: eldutils.cpp:164
ELD::update_sad
void update_sad(int index, const char *buf)
Definition: eldutils.cpp:178
ELD::channel_allocation_desc
QString channel_allocation_desc() const
Definition: eldutils.cpp:376
ELD::TYPE_MPEG2
@ TYPE_MPEG2
Definition: eldutils.h:63
ELD::sad_desc
QString sad_desc(int index)
Definition: eldutils.cpp:352
ELD::connection_name
QString connection_name() const
Definition: eldutils.cpp:460
XTYPE_FIRST_RESERVED
@ XTYPE_FIRST_RESERVED
Definition: eldutils.cpp:90
ELD::isValid
bool isValid() const
Definition: eldutils.cpp:425
ELD::TYPE_MLP
@ TYPE_MLP
Definition: eldutils.h:70
cea_audio_coding_xtypes
cea_audio_coding_xtypes
Definition: eldutils.cpp:85
ELD::TYPE_DST
@ TYPE_DST
Definition: eldutils.h:71
ELD_FIXED_BYTES
#define ELD_FIXED_BYTES
Definition: eldutils.h:30
ELD::info_desc
QString info_desc() const
Definition: eldutils.cpp:412
eldutils.h
ELD::eld_version_name
QString eld_version_name() const
Definition: eldutils.cpp:390
tmp
static guint32 * tmp
Definition: goom_core.cpp:31
ELD_VER_PARTIAL
@ ELD_VER_PARTIAL
Definition: eldutils.cpp:51
ELD::TYPE_LPCM
@ TYPE_LPCM
Definition: eldutils.h:59
ELD::operator=
ELD & operator=(const ELD &)
Definition: eldutils.cpp:170
ELD
Definition: eldutils.h:38
ELD::codecs_desc
QString codecs_desc() const
Definition: eldutils.cpp:492
ELD::TYPE_MPEG1
@ TYPE_MPEG1
Definition: eldutils.h:61
ELD::eld_data::sad_count
int sad_count
Definition: eldutils.h:120
ELD::eld_data::baseline_len
int baseline_len
Definition: eldutils.h:107
ELD::cea_sad::format
int format
Definition: eldutils.h:94
cea_sampling_frequencies
static const std::array< const int, 8 > cea_sampling_frequencies
Definition: eldutils.cpp:137
ELD::TYPE_ATRAC
@ TYPE_ATRAC
Definition: eldutils.h:66
ELD::eld_data::formats
uint64_t formats
Definition: eldutils.h:114
ELD::TYPE_MP3
@ TYPE_MP3
Definition: eldutils.h:62
ELD::eld_data::port_id
uint64_t port_id
Definition: eldutils.h:113
ELD::eld_data::conn_type
int conn_type
Definition: eldutils.h:117
SNDRV_PCM_RATE_48000
#define SNDRV_PCM_RATE_48000
Definition: eldutils.cpp:130
ELD::cea_sad::rates
int rates
Definition: eldutils.h:95
CEA_EDID_VER_RESERVED
@ CEA_EDID_VER_RESERVED
Definition: eldutils.cpp:60
ELD::print_pcm_rates
static QString print_pcm_rates(int pcm)
SNDRV_PCM_RATE_* and AC_PAR_PCM values don't match, print correct rates with hdmi-specific routine.
Definition: eldutils.cpp:316
ELD::eld_data::eld_size
int eld_size
Definition: eldutils.h:106
ELD::eld_data::eld_valid
bool eld_valid
Definition: eldutils.h:105
cea_edid_versions
cea_edid_versions
Definition: eldutils.cpp:55
ELD::TYPE_REF_CXT
@ TYPE_REF_CXT
Definition: eldutils.h:73
ELD::m_e
eld_data m_e
Definition: eldutils.h:125
SNDRV_PCM_RATE_32000
#define SNDRV_PCM_RATE_32000
Definition: eldutils.cpp:128
ELD::eld_data::sad
struct cea_sad sad[ELD_MAX_SAD]
Definition: eldutils.h:122
ELD::eld_data::aud_synch_delay
int aud_synch_delay
Definition: eldutils.h:118
XTYPE_HE_REF_CT
@ XTYPE_HE_REF_CT
Definition: eldutils.cpp:86
eld_connection_type_names
static const std::array< const QString, 4 > eld_connection_type_names
Definition: eldutils.cpp:77
ELD::eld_data::spk_alloc
int spk_alloc
Definition: eldutils.h:119
SNDRV_PCM_RATE_44100
#define SNDRV_PCM_RATE_44100
Definition: eldutils.cpp:129
ELD::TYPE_HE_AAC
@ TYPE_HE_AAC
Definition: eldutils.h:75
audiooutputbase.h
ELD_VER_CEA_861D
@ ELD_VER_CEA_861D
Definition: eldutils.cpp:50
ELD::TYPE_DTS_HD
@ TYPE_DTS_HD
Definition: eldutils.h:69
ELD::TYPE_WMAPRO
@ TYPE_WMAPRO
Definition: eldutils.h:72
XTYPE_HE_AAC2
@ XTYPE_HE_AAC2
Definition: eldutils.cpp:88
ELD::cea_sad::profile
int profile
Definition: eldutils.h:98
ELD::eld_data::eld_ver
int eld_ver
Definition: eldutils.h:108
ELD::eld_data::manufacture_id
int manufacture_id
Definition: eldutils.h:111
ELD::TYPE_SACD
@ TYPE_SACD
Definition: eldutils.h:67
SNDRV_PCM_RATE_192000
#define SNDRV_PCM_RATE_192000
Definition: eldutils.cpp:135
bswap.h
ELD::cea_sad::channels
int channels
Definition: eldutils.h:93
CEA_EDID_VER_NONE
@ CEA_EDID_VER_NONE
Definition: eldutils.cpp:56
ELD::eld_data::monitor_name
QString monitor_name
Definition: eldutils.h:110
ELD::update_eld
int update_eld(const char *buf, int size)
Definition: eldutils.cpp:246
ELD::cea_sad
Definition: eldutils.h:92
CEA_EDID_VER_CEA861A
@ CEA_EDID_VER_CEA861A
Definition: eldutils.cpp:58
cea_speaker_allocation_names
static const std::array< const QString, 11 > cea_speaker_allocation_names
Definition: eldutils.cpp:63
ELD::product_name
QString product_name() const
Definition: eldutils.cpp:455
XTYPE_HE_AAC
@ XTYPE_HE_AAC
Definition: eldutils.cpp:87
LE_INT64
#define LE_INT64(v)
Definition: eldutils.cpp:45
audiotype_names
static const std::array< const QString, 18 > audiotype_names
Definition: eldutils.cpp:93
ELD::print_pcm_bits
static QString print_pcm_bits(int pcm)
Print the supported PCM fmt bits to the string buffer.
Definition: eldutils.cpp:337
ELD::show
void show()
Definition: eldutils.cpp:430
ELD::maxChannels
int maxChannels()
Definition: eldutils.cpp:480
ELD::TYPE_DTS
@ TYPE_DTS
Definition: eldutils.h:65
SNDRV_PCM_RATE_96000
#define SNDRV_PCM_RATE_96000
Definition: eldutils.cpp:133
ELD::cea_sad::sample_bits
int sample_bits
Definition: eldutils.h:96
ELD::eld_data::support_ai
int support_ai
Definition: eldutils.h:116