blob: f7259c77e703b8bf37b06fbf742f32fcbdcc1e5a [file] [log] [blame]
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07001/*
Revathi Uddaraju1eac8b02017-05-18 17:13:33 +05302 * Copyright (c) 2014, 2016-2017, The Linux Foundation. All rights reserved.
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07003 * Not a Contribution.
4 *
5 * Copyright (C) 2014 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19
20#define LOG_TAG "audio_hw_edid"
21/*#define LOG_NDEBUG 0*/
22/*#define LOG_NDDEBUG 0*/
23
24#include <errno.h>
25#include <cutils/properties.h>
26#include <stdlib.h>
27#include <dlfcn.h>
28#include <cutils/str_parms.h>
29#include <cutils/log.h>
30
31#include "audio_hw.h"
32#include "platform.h"
33#include "platform_api.h"
34#include "edid.h"
35
Revathi Uddaraju1eac8b02017-05-18 17:13:33 +053036#ifdef DYNAMIC_LOG_ENABLED
37#include <log_xml_parser.h>
38#define LOG_MASK HAL_MOD_FILE_EDID
39#include <log_utils.h>
40#endif
41
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -070042static const char * edid_format_to_str(unsigned char format)
43{
44 char * format_str = "??";
45
46 switch (format) {
47 case LPCM:
48 format_str = "Format:LPCM";
49 break;
50 case AC3:
51 format_str = "Format:AC-3";
52 break;
53 case MPEG1:
54 format_str = "Format:MPEG1 (Layers 1 & 2)";
55 break;
56 case MP3:
57 format_str = "Format:MP3 (MPEG1 Layer 3)";
58 break;
59 case MPEG2_MULTI_CHANNEL:
60 format_str = "Format:MPEG2 (multichannel)";
61 break;
62 case AAC:
63 format_str = "Format:AAC";
64 break;
65 case DTS:
66 format_str = "Format:DTS";
67 break;
68 case ATRAC:
69 format_str = "Format:ATRAC";
70 break;
71 case SACD:
72 format_str = "Format:One-bit audio aka SACD";
73 break;
74 case DOLBY_DIGITAL_PLUS:
75 format_str = "Format:Dolby Digital +";
76 break;
77 case DTS_HD:
78 format_str = "Format:DTS-HD";
79 break;
80 case MAT:
81 format_str = "Format:MAT (MLP)";
82 break;
83 case DST:
84 format_str = "Format:DST";
85 break;
86 case WMA_PRO:
87 format_str = "Format:WMA Pro";
88 break;
89 default:
90 break;
91 }
92 return format_str;
93}
94
Garmond Leung2f78a672016-11-07 16:27:40 -080095static bool is_supported_sr(unsigned char sr_byte, int sampling_rate )
96{
97 int result = 0;
98
99 ALOGV("%s: sr_byte: %d, sampling_freq: %d",__func__, sr_byte, sampling_rate);
100 switch (sampling_rate) {
101 case 192000:
102 result = (sr_byte & BIT(6));
103 break;
104 case 176400:
105 result = (sr_byte & BIT(5));
106 break;
107 case 96000:
108 result = (sr_byte & BIT(4));
109 break;
110 case 88200:
111 result = (sr_byte & BIT(3));
112 break;
113 case 48000:
114 result = (sr_byte & BIT(2));
115 break;
116 case 44100:
117 result = (sr_byte & BIT(1));
118 break;
119 case 32000:
120 result = (sr_byte & BIT(0));
121 break;
122 default:
123 break;
124 }
125
126 if (result)
127 return true;
128
129 return false;
130}
131
132static unsigned char get_edid_bps_byte(unsigned char byte,
133 unsigned char format)
134{
135 if (format == 0) {
136 ALOGV("%s: not lpcm format, return 0",__func__);
137 return 0;
138 }
139 return byte;
140}
141
142static bool is_supported_bps(unsigned char bps_byte, int bps)
143{
144 int result = 0;
145
146 switch (bps) {
147 case 24:
148 ALOGV("24bit");
149 result = (bps_byte & BIT(2));
150 break;
151 case 20:
152 ALOGV("20bit");
153 result = (bps_byte & BIT(1));
154 break;
155 case 16:
156 ALOGV("16bit");
157 result = (bps_byte & BIT(0));
158 break;
159 default:
160 break;
161 }
162
163 if (result)
164 return true;
165
166 return false;
167}
168
169static int get_highest_edid_sf(unsigned char byte)
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -0700170{
171 int nfreq = 0;
172
173 if (byte & BIT(6)) {
Garmond Leung2f78a672016-11-07 16:27:40 -0800174 ALOGV("Highest: 192kHz");
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -0700175 nfreq = 192000;
176 } else if (byte & BIT(5)) {
Garmond Leung2f78a672016-11-07 16:27:40 -0800177 ALOGV("Highest: 176kHz");
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -0700178 nfreq = 176000;
179 } else if (byte & BIT(4)) {
Garmond Leung2f78a672016-11-07 16:27:40 -0800180 ALOGV("Highest: 96kHz");
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -0700181 nfreq = 96000;
182 } else if (byte & BIT(3)) {
Garmond Leung2f78a672016-11-07 16:27:40 -0800183 ALOGV("Highest: 88.2kHz");
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -0700184 nfreq = 88200;
185 } else if (byte & BIT(2)) {
Garmond Leung2f78a672016-11-07 16:27:40 -0800186 ALOGV("Highest: 48kHz");
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -0700187 nfreq = 48000;
188 } else if (byte & BIT(1)) {
Garmond Leung2f78a672016-11-07 16:27:40 -0800189 ALOGV("Highest: 44.1kHz");
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -0700190 nfreq = 44100;
191 } else if (byte & BIT(0)) {
Garmond Leung2f78a672016-11-07 16:27:40 -0800192 ALOGV("Highest: 32kHz");
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -0700193 nfreq = 32000;
194 }
195 return nfreq;
196}
197
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -0700198static void update_channel_map(edid_audio_info* info)
199{
200 /* HDMI Cable follows CEA standard so SAD is received in CEA
201 * Input source file channel map is fed to ASM in WAV standard(audio.h)
202 * so upto 7.1 SAD bits are:
203 * in CEA convention: RLC/RRC,FLC/FRC,RC,RL/RR,FC,LFE,FL/FR
204 * in WAV convention: BL/BR,FLC/FRC,BC,SL/SR,FC,LFE,FL/FR
205 * Corresponding ADSP IDs (apr-audio_v2.h):
206 * PCM_CHANNEL_FL/PCM_CHANNEL_FR,
207 * PCM_CHANNEL_LFE,
208 * PCM_CHANNEL_FC,
209 * PCM_CHANNEL_LS/PCM_CHANNEL_RS,
210 * PCM_CHANNEL_CS,
211 * PCM_CHANNEL_FLC/PCM_CHANNEL_FRC
212 * PCM_CHANNEL_LB/PCM_CHANNEL_RB
213 */
214 if (!info)
215 return;
216 memset(info->channel_map, 0, MAX_CHANNELS_SUPPORTED);
217 if(info->speaker_allocation[0] & BIT(0)) {
218 info->channel_map[0] = PCM_CHANNEL_FL;
219 info->channel_map[1] = PCM_CHANNEL_FR;
220 }
221 if(info->speaker_allocation[0] & BIT(1)) {
222 info->channel_map[2] = PCM_CHANNEL_LFE;
223 }
224 if(info->speaker_allocation[0] & BIT(2)) {
225 info->channel_map[3] = PCM_CHANNEL_FC;
226 }
227 if(info->speaker_allocation[0] & BIT(3)) {
228 /*
229 * As per CEA(HDMI Cable) standard Bit 3 is equivalent
230 * to SideLeft/SideRight of WAV standard
231 */
232 info->channel_map[4] = PCM_CHANNEL_LS;
233 info->channel_map[5] = PCM_CHANNEL_RS;
234 }
235 if(info->speaker_allocation[0] & BIT(4)) {
236 if(info->speaker_allocation[0] & BIT(3)) {
237 info->channel_map[6] = PCM_CHANNEL_CS;
238 info->channel_map[7] = 0;
239 } else if (info->speaker_allocation[1] & BIT(1)) {
240 info->channel_map[6] = PCM_CHANNEL_CS;
241 info->channel_map[7] = PCM_CHANNEL_TS;
242 } else if (info->speaker_allocation[1] & BIT(2)) {
243 info->channel_map[6] = PCM_CHANNEL_CS;
244 info->channel_map[7] = PCM_CHANNEL_CVH;
245 } else {
246 info->channel_map[4] = PCM_CHANNEL_CS;
247 info->channel_map[5] = 0;
248 }
249 }
250 if(info->speaker_allocation[0] & BIT(5)) {
251 info->channel_map[6] = PCM_CHANNEL_FLC;
252 info->channel_map[7] = PCM_CHANNEL_FRC;
253 }
254 if(info->speaker_allocation[0] & BIT(6)) {
255 // If RLC/RRC is present, RC is invalid as per specification
256 info->speaker_allocation[0] &= 0xef;
257 /*
258 * As per CEA(HDMI Cable) standard Bit 6 is equivalent
259 * to BackLeft/BackRight of WAV standard
260 */
261 info->channel_map[6] = PCM_CHANNEL_LB;
262 info->channel_map[7] = PCM_CHANNEL_RB;
263 }
264 // higher channel are not defined by LPASS
265 //info->nSpeakerAllocation[0] &= 0x3f;
266 if(info->speaker_allocation[0] & BIT(7)) {
267 info->channel_map[6] = 0; // PCM_CHANNEL_FLW; but not defined by LPASS
268 info->channel_map[7] = 0; // PCM_CHANNEL_FRW; but not defined by LPASS
269 }
270 if(info->speaker_allocation[1] & BIT(0)) {
271 info->channel_map[6] = 0; // PCM_CHANNEL_FLH; but not defined by LPASS
272 info->channel_map[7] = 0; // PCM_CHANNEL_FRH; but not defined by LPASS
273 }
274
275 ALOGI("%s channel map updated to [%d %d %d %d %d %d %d %d ] [%x %x %x]", __func__
276 , info->channel_map[0], info->channel_map[1], info->channel_map[2]
277 , info->channel_map[3], info->channel_map[4], info->channel_map[5]
278 , info->channel_map[6], info->channel_map[7]
279 , info->speaker_allocation[0], info->speaker_allocation[1]
280 , info->speaker_allocation[2]);
281}
282
283static void dump_speaker_allocation(edid_audio_info* info)
284{
285 if (!info)
286 return;
287
288 if (info->speaker_allocation[0] & BIT(7))
289 ALOGV("FLW/FRW");
290 if (info->speaker_allocation[0] & BIT(6))
291 ALOGV("RLC/RRC");
292 if (info->speaker_allocation[0] & BIT(5))
293 ALOGV("FLC/FRC");
294 if (info->speaker_allocation[0] & BIT(4))
295 ALOGV("RC");
296 if (info->speaker_allocation[0] & BIT(3))
297 ALOGV("RL/RR");
298 if (info->speaker_allocation[0] & BIT(2))
299 ALOGV("FC");
300 if (info->speaker_allocation[0] & BIT(1))
301 ALOGV("LFE");
302 if (info->speaker_allocation[0] & BIT(0))
303 ALOGV("FL/FR");
304 if (info->speaker_allocation[1] & BIT(2))
305 ALOGV("FCH");
306 if (info->speaker_allocation[1] & BIT(1))
307 ALOGV("TC");
308 if (info->speaker_allocation[1] & BIT(0))
309 ALOGV("FLH/FRH");
310}
311
312static void update_channel_allocation(edid_audio_info* info)
313{
314 int16_t ca;
315 int16_t spkr_alloc;
316
317 if (!info)
318 return;
319
320 /* Most common 5.1 SAD is 0xF, ca 0x0b
321 * and 7.1 SAD is 0x4F, ca 0x13 */
322 spkr_alloc = ((info->speaker_allocation[1]) << 8) |
323 (info->speaker_allocation[0]);
324 ALOGV("info->nSpeakerAllocation %x %x\n", info->speaker_allocation[0],
325 info->speaker_allocation[1]);
326 ALOGV("spkr_alloc: %x", spkr_alloc);
327
328 /* The below switch case calculates channel allocation values
329 as defined in CEA-861 section 6.6.2 */
330 switch (spkr_alloc) {
331 case BIT(0): ca = 0x00; break;
332 case BIT(0)|BIT(1): ca = 0x01; break;
333 case BIT(0)|BIT(2): ca = 0x02; break;
334 case BIT(0)|BIT(1)|BIT(2): ca = 0x03; break;
335 case BIT(0)|BIT(4): ca = 0x04; break;
336 case BIT(0)|BIT(1)|BIT(4): ca = 0x05; break;
337 case BIT(0)|BIT(2)|BIT(4): ca = 0x06; break;
338 case BIT(0)|BIT(1)|BIT(2)|BIT(4): ca = 0x07; break;
339 case BIT(0)|BIT(3): ca = 0x08; break;
340 case BIT(0)|BIT(1)|BIT(3): ca = 0x09; break;
341 case BIT(0)|BIT(2)|BIT(3): ca = 0x0A; break;
342 case BIT(0)|BIT(1)|BIT(2)|BIT(3): ca = 0x0B; break;
343 case BIT(0)|BIT(3)|BIT(4): ca = 0x0C; break;
344 case BIT(0)|BIT(1)|BIT(3)|BIT(4): ca = 0x0D; break;
345 case BIT(0)|BIT(2)|BIT(3)|BIT(4): ca = 0x0E; break;
346 case BIT(0)|BIT(1)|BIT(2)|BIT(3)|BIT(4): ca = 0x0F; break;
347 case BIT(0)|BIT(3)|BIT(6): ca = 0x10; break;
348 case BIT(0)|BIT(1)|BIT(3)|BIT(6): ca = 0x11; break;
349 case BIT(0)|BIT(2)|BIT(3)|BIT(6): ca = 0x12; break;
350 case BIT(0)|BIT(1)|BIT(2)|BIT(3)|BIT(6): ca = 0x13; break;
351 case BIT(0)|BIT(5): ca = 0x14; break;
352 case BIT(0)|BIT(1)|BIT(5): ca = 0x15; break;
353 case BIT(0)|BIT(2)|BIT(5): ca = 0x16; break;
354 case BIT(0)|BIT(1)|BIT(2)|BIT(5): ca = 0x17; break;
355 case BIT(0)|BIT(4)|BIT(5): ca = 0x18; break;
356 case BIT(0)|BIT(1)|BIT(4)|BIT(5): ca = 0x19; break;
357 case BIT(0)|BIT(2)|BIT(4)|BIT(5): ca = 0x1A; break;
358 case BIT(0)|BIT(1)|BIT(2)|BIT(4)|BIT(5): ca = 0x1B; break;
359 case BIT(0)|BIT(3)|BIT(5): ca = 0x1C; break;
360 case BIT(0)|BIT(1)|BIT(3)|BIT(5): ca = 0x1D; break;
361 case BIT(0)|BIT(2)|BIT(3)|BIT(5): ca = 0x1E; break;
362 case BIT(0)|BIT(1)|BIT(2)|BIT(3)|BIT(5): ca = 0x1F; break;
363 case BIT(0)|BIT(2)|BIT(3)|BIT(10): ca = 0x20; break;
364 case BIT(0)|BIT(1)|BIT(2)|BIT(3)|BIT(10): ca = 0x21; break;
365 case BIT(0)|BIT(2)|BIT(3)|BIT(9): ca = 0x22; break;
366 case BIT(0)|BIT(1)|BIT(2)|BIT(3)|BIT(9): ca = 0x23; break;
367 case BIT(0)|BIT(3)|BIT(8): ca = 0x24; break;
368 case BIT(0)|BIT(1)|BIT(3)|BIT(8): ca = 0x25; break;
369 case BIT(0)|BIT(3)|BIT(7): ca = 0x26; break;
370 case BIT(0)|BIT(1)|BIT(3)|BIT(7): ca = 0x27; break;
371 case BIT(0)|BIT(2)|BIT(3)|BIT(4)|BIT(9): ca = 0x28; break;
372 case BIT(0)|BIT(1)|BIT(2)|BIT(3)|BIT(4)|BIT(9): ca = 0x29; break;
373 case BIT(0)|BIT(2)|BIT(3)|BIT(4)|BIT(10): ca = 0x2A; break;
374 case BIT(0)|BIT(1)|BIT(2)|BIT(3)|BIT(4)|BIT(10): ca = 0x2B; break;
375 case BIT(0)|BIT(2)|BIT(3)|BIT(9)|BIT(10): ca = 0x2C; break;
376 case BIT(0)|BIT(1)|BIT(2)|BIT(3)|BIT(9)|BIT(10): ca = 0x2D; break;
377 case BIT(0)|BIT(2)|BIT(3)|BIT(8): ca = 0x2E; break;
378 case BIT(0)|BIT(1)|BIT(2)|BIT(3)|BIT(8): ca = 0x2F; break;
379 case BIT(0)|BIT(2)|BIT(3)|BIT(7): ca = 0x30; break;
380 case BIT(0)|BIT(1)|BIT(2)|BIT(3)|BIT(7): ca = 0x31; break;
381 default: ca = 0x0; break;
382 }
383 ALOGD("%s channel allocation: %x", __func__, ca);
384 info->channel_allocation = ca;
385}
386
387static void update_channel_map_lpass(edid_audio_info* info)
388{
389 if (!info)
390 return;
391 if (info->channel_allocation < 0 || info->channel_allocation > 0x1f) {
392 ALOGE("Channel allocation out of supported range");
393 return;
394 }
395 ALOGV("channel_allocation 0x%x", info->channel_allocation);
396 memset(info->channel_map, 0, MAX_CHANNELS_SUPPORTED);
397 switch(info->channel_allocation) {
398 case 0x0:
399 info->channel_map[0] = PCM_CHANNEL_FL;
400 info->channel_map[1] = PCM_CHANNEL_FR;
401 break;
402 case 0x1:
403 info->channel_map[0] = PCM_CHANNEL_FL;
404 info->channel_map[1] = PCM_CHANNEL_FR;
405 info->channel_map[2] = PCM_CHANNEL_LFE;
406 break;
407 case 0x2:
408 info->channel_map[0] = PCM_CHANNEL_FL;
409 info->channel_map[1] = PCM_CHANNEL_FR;
410 info->channel_map[2] = PCM_CHANNEL_FC;
411 break;
412 case 0x3:
413 info->channel_map[0] = PCM_CHANNEL_FL;
414 info->channel_map[1] = PCM_CHANNEL_FR;
415 info->channel_map[2] = PCM_CHANNEL_LFE;
416 info->channel_map[3] = PCM_CHANNEL_FC;
417 break;
418 case 0x4:
419 info->channel_map[0] = PCM_CHANNEL_FL;
420 info->channel_map[1] = PCM_CHANNEL_FR;
421 info->channel_map[2] = PCM_CHANNEL_CS;
422 break;
423 case 0x5:
424 info->channel_map[0] = PCM_CHANNEL_FL;
425 info->channel_map[1] = PCM_CHANNEL_FR;
426 info->channel_map[2] = PCM_CHANNEL_LFE;
427 info->channel_map[3] = PCM_CHANNEL_CS;
428 break;
429 case 0x6:
430 info->channel_map[0] = PCM_CHANNEL_FL;
431 info->channel_map[1] = PCM_CHANNEL_FR;
432 info->channel_map[2] = PCM_CHANNEL_FC;
433 info->channel_map[3] = PCM_CHANNEL_CS;
434 break;
435 case 0x7:
436 info->channel_map[0] = PCM_CHANNEL_FL;
437 info->channel_map[1] = PCM_CHANNEL_FR;
438 info->channel_map[2] = PCM_CHANNEL_LFE;
439 info->channel_map[3] = PCM_CHANNEL_FC;
440 info->channel_map[4] = PCM_CHANNEL_CS;
441 break;
442 case 0x8:
443 info->channel_map[0] = PCM_CHANNEL_FL;
444 info->channel_map[1] = PCM_CHANNEL_FR;
445 info->channel_map[2] = PCM_CHANNEL_LS;
446 info->channel_map[3] = PCM_CHANNEL_RS;
447 break;
448 case 0x9:
449 info->channel_map[0] = PCM_CHANNEL_FL;
450 info->channel_map[1] = PCM_CHANNEL_FR;
451 info->channel_map[2] = PCM_CHANNEL_LFE;
452 info->channel_map[3] = PCM_CHANNEL_LS;
453 info->channel_map[4] = PCM_CHANNEL_RS;
454 break;
455 case 0xa:
456 info->channel_map[0] = PCM_CHANNEL_FL;
457 info->channel_map[1] = PCM_CHANNEL_FR;
458 info->channel_map[2] = PCM_CHANNEL_FC;
459 info->channel_map[3] = PCM_CHANNEL_LS;
460 info->channel_map[4] = PCM_CHANNEL_RS;
461 break;
462 case 0xb:
463 info->channel_map[0] = PCM_CHANNEL_FL;
464 info->channel_map[1] = PCM_CHANNEL_FR;
465 info->channel_map[2] = PCM_CHANNEL_LFE;
466 info->channel_map[3] = PCM_CHANNEL_FC;
467 info->channel_map[4] = PCM_CHANNEL_LS;
468 info->channel_map[5] = PCM_CHANNEL_RS;
469 break;
470 case 0xc:
471 info->channel_map[0] = PCM_CHANNEL_FL;
472 info->channel_map[1] = PCM_CHANNEL_FR;
473 info->channel_map[2] = PCM_CHANNEL_LS;
474 info->channel_map[3] = PCM_CHANNEL_RS;
475 info->channel_map[4] = PCM_CHANNEL_CS;
476 break;
477 case 0xd:
478 info->channel_map[0] = PCM_CHANNEL_FL;
479 info->channel_map[1] = PCM_CHANNEL_FR;
480 info->channel_map[2] = PCM_CHANNEL_LFE;
481 info->channel_map[3] = PCM_CHANNEL_LS;
482 info->channel_map[4] = PCM_CHANNEL_RS;
483 info->channel_map[5] = PCM_CHANNEL_CS;
484 break;
485 case 0xe:
486 info->channel_map[0] = PCM_CHANNEL_FL;
487 info->channel_map[1] = PCM_CHANNEL_FR;
488 info->channel_map[2] = PCM_CHANNEL_FC;
489 info->channel_map[3] = PCM_CHANNEL_LS;
490 info->channel_map[4] = PCM_CHANNEL_RS;
491 info->channel_map[5] = PCM_CHANNEL_CS;
492 break;
493 case 0xf:
494 info->channel_map[0] = PCM_CHANNEL_FL;
495 info->channel_map[1] = PCM_CHANNEL_FR;
496 info->channel_map[2] = PCM_CHANNEL_LFE;
497 info->channel_map[3] = PCM_CHANNEL_FC;
498 info->channel_map[4] = PCM_CHANNEL_LS;
499 info->channel_map[5] = PCM_CHANNEL_RS;
500 info->channel_map[6] = PCM_CHANNEL_CS;
501 break;
502 case 0x10:
503 info->channel_map[0] = PCM_CHANNEL_FL;
504 info->channel_map[1] = PCM_CHANNEL_FR;
505 info->channel_map[2] = PCM_CHANNEL_LS;
506 info->channel_map[3] = PCM_CHANNEL_RS;
507 info->channel_map[4] = PCM_CHANNEL_LB;
508 info->channel_map[5] = PCM_CHANNEL_RB;
509 break;
510 case 0x11:
511 info->channel_map[0] = PCM_CHANNEL_FL;
512 info->channel_map[1] = PCM_CHANNEL_FR;
513 info->channel_map[2] = PCM_CHANNEL_LFE;
514 info->channel_map[3] = PCM_CHANNEL_LS;
515 info->channel_map[4] = PCM_CHANNEL_RS;
516 info->channel_map[5] = PCM_CHANNEL_LB;
517 info->channel_map[6] = PCM_CHANNEL_RB;
518 break;
519 case 0x12:
520 info->channel_map[0] = PCM_CHANNEL_FL;
521 info->channel_map[1] = PCM_CHANNEL_FR;
522 info->channel_map[2] = PCM_CHANNEL_FC;
523 info->channel_map[3] = PCM_CHANNEL_LS;
524 info->channel_map[4] = PCM_CHANNEL_RS;
525 info->channel_map[5] = PCM_CHANNEL_LB;
526 info->channel_map[6] = PCM_CHANNEL_RB;
527 break;
528 case 0x13:
529 info->channel_map[0] = PCM_CHANNEL_FL;
530 info->channel_map[1] = PCM_CHANNEL_FR;
531 info->channel_map[2] = PCM_CHANNEL_LFE;
532 info->channel_map[3] = PCM_CHANNEL_FC;
533 info->channel_map[4] = PCM_CHANNEL_LS;
534 info->channel_map[5] = PCM_CHANNEL_RS;
535 info->channel_map[6] = PCM_CHANNEL_LB;
536 info->channel_map[7] = PCM_CHANNEL_RB;
537 break;
538 case 0x14:
539 info->channel_map[0] = PCM_CHANNEL_FL;
540 info->channel_map[1] = PCM_CHANNEL_FR;
541 info->channel_map[2] = PCM_CHANNEL_FLC;
542 info->channel_map[3] = PCM_CHANNEL_FRC;
543 break;
544 case 0x15:
545 info->channel_map[0] = PCM_CHANNEL_FL;
546 info->channel_map[1] = PCM_CHANNEL_FR;
547 info->channel_map[2] = PCM_CHANNEL_LFE;
548 info->channel_map[3] = PCM_CHANNEL_FLC;
549 info->channel_map[4] = PCM_CHANNEL_FRC;
550 break;
551 case 0x16:
552 info->channel_map[0] = PCM_CHANNEL_FL;
553 info->channel_map[1] = PCM_CHANNEL_FR;
554 info->channel_map[2] = PCM_CHANNEL_FC;
555 info->channel_map[3] = PCM_CHANNEL_FLC;
556 info->channel_map[4] = PCM_CHANNEL_FRC;
557 break;
558 case 0x17:
559 info->channel_map[0] = PCM_CHANNEL_FL;
560 info->channel_map[1] = PCM_CHANNEL_FR;
561 info->channel_map[2] = PCM_CHANNEL_LFE;
562 info->channel_map[3] = PCM_CHANNEL_FC;
563 info->channel_map[4] = PCM_CHANNEL_FLC;
564 info->channel_map[5] = PCM_CHANNEL_FRC;
565 break;
566 case 0x18:
567 info->channel_map[0] = PCM_CHANNEL_FL;
568 info->channel_map[1] = PCM_CHANNEL_FR;
569 info->channel_map[2] = PCM_CHANNEL_CS;
570 info->channel_map[3] = PCM_CHANNEL_FLC;
571 info->channel_map[4] = PCM_CHANNEL_FRC;
572 break;
573 case 0x19:
574 info->channel_map[0] = PCM_CHANNEL_FL;
575 info->channel_map[1] = PCM_CHANNEL_FR;
576 info->channel_map[2] = PCM_CHANNEL_LFE;
577 info->channel_map[3] = PCM_CHANNEL_CS;
578 info->channel_map[4] = PCM_CHANNEL_FLC;
579 info->channel_map[5] = PCM_CHANNEL_FRC;
580 break;
581 case 0x1a:
582 info->channel_map[0] = PCM_CHANNEL_FL;
583 info->channel_map[1] = PCM_CHANNEL_FR;
584 info->channel_map[2] = PCM_CHANNEL_FC;
585 info->channel_map[3] = PCM_CHANNEL_CS;
586 info->channel_map[4] = PCM_CHANNEL_FLC;
587 info->channel_map[5] = PCM_CHANNEL_FRC;
588 break;
589 case 0x1b:
590 info->channel_map[0] = PCM_CHANNEL_FL;
591 info->channel_map[1] = PCM_CHANNEL_FR;
592 info->channel_map[2] = PCM_CHANNEL_LFE;
593 info->channel_map[3] = PCM_CHANNEL_FC;
594 info->channel_map[4] = PCM_CHANNEL_CS;
595 info->channel_map[5] = PCM_CHANNEL_FLC;
596 info->channel_map[6] = PCM_CHANNEL_FRC;
597 break;
598 case 0x1c:
599 info->channel_map[0] = PCM_CHANNEL_FL;
600 info->channel_map[1] = PCM_CHANNEL_FR;
601 info->channel_map[2] = PCM_CHANNEL_LS;
602 info->channel_map[3] = PCM_CHANNEL_RS;
603 info->channel_map[4] = PCM_CHANNEL_FLC;
604 info->channel_map[5] = PCM_CHANNEL_FRC;
605 break;
606 case 0x1d:
607 info->channel_map[0] = PCM_CHANNEL_FL;
608 info->channel_map[1] = PCM_CHANNEL_FR;
609 info->channel_map[2] = PCM_CHANNEL_LFE;
610 info->channel_map[3] = PCM_CHANNEL_LS;
611 info->channel_map[4] = PCM_CHANNEL_RS;
612 info->channel_map[5] = PCM_CHANNEL_FLC;
613 info->channel_map[6] = PCM_CHANNEL_FRC;
614 break;
615 case 0x1e:
616 info->channel_map[0] = PCM_CHANNEL_FL;
617 info->channel_map[1] = PCM_CHANNEL_FR;
618 info->channel_map[2] = PCM_CHANNEL_FC;
619 info->channel_map[3] = PCM_CHANNEL_LS;
620 info->channel_map[4] = PCM_CHANNEL_RS;
621 info->channel_map[5] = PCM_CHANNEL_FLC;
622 info->channel_map[6] = PCM_CHANNEL_FRC;
623 break;
624 case 0x1f:
625 info->channel_map[0] = PCM_CHANNEL_FL;
626 info->channel_map[1] = PCM_CHANNEL_FR;
627 info->channel_map[2] = PCM_CHANNEL_LFE;
628 info->channel_map[3] = PCM_CHANNEL_FC;
629 info->channel_map[4] = PCM_CHANNEL_LS;
630 info->channel_map[5] = PCM_CHANNEL_RS;
631 info->channel_map[6] = PCM_CHANNEL_FLC;
632 info->channel_map[7] = PCM_CHANNEL_FRC;
633 break;
634 default:
635 break;
636 }
637 ALOGD("%s channel map updated to [%d %d %d %d %d %d %d %d ]", __func__
638 , info->channel_map[0], info->channel_map[1], info->channel_map[2]
639 , info->channel_map[3], info->channel_map[4], info->channel_map[5]
640 , info->channel_map[6], info->channel_map[7]);
641}
642
643static void dump_edid_data(edid_audio_info *info)
644{
645
646 int i;
647 for (i = 0; i < info->audio_blocks && i < MAX_EDID_BLOCKS; i++) {
648 ALOGV("%s:FormatId:%d rate:%d bps:%d channels:%d", __func__,
649 info->audio_blocks_array[i].format_id,
Garmond Leung2f78a672016-11-07 16:27:40 -0800650 info->audio_blocks_array[i].sampling_freq_bitmask,
651 info->audio_blocks_array[i].bits_per_sample_bitmask,
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -0700652 info->audio_blocks_array[i].channels);
653 }
654 ALOGV("%s:no of audio blocks:%d", __func__, info->audio_blocks);
655 ALOGV("%s:speaker allocation:[%x %x %x]", __func__,
656 info->speaker_allocation[0], info->speaker_allocation[1],
657 info->speaker_allocation[2]);
658 ALOGV("%s:channel map:[%x %x %x %x %x %x %x %x]", __func__,
659 info->channel_map[0], info->channel_map[1],
660 info->channel_map[2], info->channel_map[3],
661 info->channel_map[4], info->channel_map[5],
662 info->channel_map[6], info->channel_map[7]);
663 ALOGV("%s:channel allocation:%d", __func__, info->channel_allocation);
664 ALOGV("%s:[%d %d %d %d %d %d %d %d ]", __func__,
665 info->channel_map[0], info->channel_map[1],
666 info->channel_map[2], info->channel_map[3],
667 info->channel_map[4], info->channel_map[5],
668 info->channel_map[6], info->channel_map[7]);
669}
670
671bool edid_get_sink_caps(edid_audio_info* info, char *edid_data)
672{
673 unsigned char channels[MAX_EDID_BLOCKS];
674 unsigned char formats[MAX_EDID_BLOCKS];
675 unsigned char frequency[MAX_EDID_BLOCKS];
676 unsigned char bitrate[MAX_EDID_BLOCKS];
677 int i = 0;
678 int length, count_desc;
679
680 if (!info || !edid_data) {
681 ALOGE("No valid EDID");
682 return false;
683 }
684
685 length = (int) *edid_data++;
686 ALOGV("Total length is %d",length);
687
688 count_desc = length/MIN_AUDIO_DESC_LENGTH;
689
690 if (!count_desc) {
691 ALOGE("insufficient descriptors");
692 return false;
693 }
694
695 memset(info, 0, sizeof(edid_audio_info));
696
697 info->audio_blocks = count_desc-1;
698 if (info->audio_blocks > MAX_EDID_BLOCKS) {
699 info->audio_blocks = MAX_EDID_BLOCKS;
700 }
701
702 ALOGV("Total # of audio descriptors %d",count_desc);
703
704 for (i=0; i<info->audio_blocks; i++) {
705 // last block for speaker allocation;
706 channels [i] = (*edid_data & 0x7) + 1;
707 formats [i] = (*edid_data++) >> 3;
708 frequency[i] = *edid_data++;
709 bitrate [i] = *edid_data++;
710 }
711 info->speaker_allocation[0] = *edid_data++;
712 info->speaker_allocation[1] = *edid_data++;
713 info->speaker_allocation[2] = *edid_data++;
714
715 update_channel_map(info);
716 update_channel_allocation(info);
717 update_channel_map_lpass(info);
718
719 for (i=0; i<info->audio_blocks; i++) {
720 ALOGV("AUDIO DESC BLOCK # %d\n",i);
721
722 info->audio_blocks_array[i].channels = channels[i];
Ashish Jain957440f2015-08-28 10:47:13 +0530723 ALOGD("info->audio_blocks_array[i].channels %d\n",
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -0700724 info->audio_blocks_array[i].channels);
725
726 ALOGV("Format Byte %d\n", formats[i]);
727 info->audio_blocks_array[i].format_id = (edid_audio_format_id)formats[i];
Ashish Jain957440f2015-08-28 10:47:13 +0530728 ALOGD("info->audio_blocks_array[i].format_id %s",
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -0700729 edid_format_to_str(formats[i]));
730
Garmond Leung2f78a672016-11-07 16:27:40 -0800731 ALOGV("Frequency Bitmask %d\n", frequency[i]);
732 info->audio_blocks_array[i].sampling_freq_bitmask = frequency[i];
733 ALOGV("info->audio_blocks_array[i].sampling_freq_bitmask %d",
734 info->audio_blocks_array[i].sampling_freq_bitmask);
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -0700735
Garmond Leung2f78a672016-11-07 16:27:40 -0800736 ALOGV("BitsPerSample Bitmask %d\n", bitrate[i]);
737 info->audio_blocks_array[i].bits_per_sample_bitmask =
738 get_edid_bps_byte(bitrate[i],formats[i]);
739 ALOGV("info->audio_blocks_array[i].bits_per_sample_bitmask %d",
740 info->audio_blocks_array[i].bits_per_sample_bitmask);
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -0700741 }
742 dump_speaker_allocation(info);
743 dump_edid_data(info);
744 return true;
745}
Mingming Yinddd610b2016-01-20 17:09:32 -0800746
747bool edid_is_supported_sr(edid_audio_info* info, int sr)
748{
749 int i = 0;
750 if (info != NULL && sr != 0) {
751 for (i = 0; i < info->audio_blocks && i < MAX_EDID_BLOCKS; i++) {
Garmond Leung2f78a672016-11-07 16:27:40 -0800752 if (is_supported_sr(info->audio_blocks_array[i].sampling_freq_bitmask , sr)) {
Mingming Yinddd610b2016-01-20 17:09:32 -0800753 ALOGV("%s: returns true for sample rate [%d]",
754 __func__, sr);
755 return true;
756 }
757 }
758 }
759 ALOGV("%s: returns false for sample rate [%d]",
760 __func__, sr);
761 return false;
762}
763
764bool edid_is_supported_bps(edid_audio_info* info, int bps)
765{
766 int i = 0;
767
768 if (bps == 16) {
769 //16 bit bps is always supported
770 //some oem may not update 16bit support in their edid info
771 return true;
772 }
773
774 if (info != NULL && bps != 0) {
775 for (i = 0; i < info->audio_blocks && i < MAX_EDID_BLOCKS; i++) {
Garmond Leung2f78a672016-11-07 16:27:40 -0800776 if (is_supported_bps(info->audio_blocks_array[i].bits_per_sample_bitmask, bps)) {
Mingming Yinddd610b2016-01-20 17:09:32 -0800777 ALOGV("%s: returns true for bit width [%d]",
778 __func__, bps);
779 return true;
780 }
781 }
782 }
783 ALOGV("%s: returns false for bit width [%d]",
784 __func__, bps);
785 return false;
786}
Garmond Leung2f78a672016-11-07 16:27:40 -0800787
788int edid_get_highest_supported_sr(edid_audio_info* info)
789{
790 int sr = 0;
791 int highest_sr = 0;
792 int i;
793
794 if (info != NULL) {
795 for (i = 0; i < info->audio_blocks && i < MAX_EDID_BLOCKS; i++) {
796 sr = get_highest_edid_sf(info->audio_blocks_array[i].sampling_freq_bitmask);
797 if (sr > highest_sr)
798 highest_sr = sr;
799 }
800 }
801 else
802 ALOGE("%s: info is NULL", __func__);
803
804 ALOGV("%s: returns [%d] for highest supported sr",
805 __func__, highest_sr);
806 return highest_sr;
Revathi Uddaraju1eac8b02017-05-18 17:13:33 +0530807}