1b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani/* AudioUtil.cpp
2b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani *
3b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani * Copyright (C) 2012 The Android Open Source Project
4b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani *
5b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani * Licensed under the Apache License, Version 2.0 (the "License");
6b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani * you may not use this file except in compliance with the License.
7b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani * You may obtain a copy of the License at
8b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani *
9b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani *      http://www.apache.org/licenses/LICENSE-2.0
10b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani *
11b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani * Unless required by applicable law or agreed to in writing, software
12b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani * distributed under the License is distributed on an "AS IS" BASIS,
13b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani * See the License for the specific language governing permissions and
15b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani * limitations under the License.
16b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani */
17b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani
18b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani#define LOG_TAG "AudioUtil"
19b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani//#define LOG_NDEBUG 0
20b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani#include <utils/Log.h>
21b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani
22b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani#include "AudioUtil.h"
23b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani
24b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Maniint AudioUtil::printFormatFromEDID(unsigned char format) {
25b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    switch (format) {
26b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    case LPCM:
27b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("Format:LPCM");
28b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        break;
29b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    case AC3:
30b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("Format:AC-3");
31b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        break;
32b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    case MPEG1:
33b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("Format:MPEG1 (Layers 1 & 2)");
34b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        break;
35b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    case MP3:
36b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("Format:MP3 (MPEG1 Layer 3)");
37b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        break;
38b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    case MPEG2_MULTI_CHANNEL:
39b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("Format:MPEG2 (multichannel)");
40b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        break;
41b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    case AAC:
42b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("Format:AAC");
43b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        break;
44b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    case DTS:
45b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("Format:DTS");
46b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        break;
47b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    case ATRAC:
48b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("Format:ATRAC");
49b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        break;
50b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    case SACD:
51b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("Format:One-bit audio aka SACD");
52b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        break;
53b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    case DOLBY_DIGITAL_PLUS:
54b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("Format:Dolby Digital +");
55b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        break;
56b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    case DTS_HD:
57b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("Format:DTS-HD");
58b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        break;
59b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    case MAT:
60b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("Format:MAT (MLP)");
61b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        break;
62b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    case DST:
63b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("Format:DST");
64b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        break;
65b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    case WMA_PRO:
66b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("Format:WMA Pro");
67b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        break;
68b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    default:
69b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("Invalid format ID....");
70b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        break;
71b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    }
72b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    return format;
73b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani}
74b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani
75b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Maniint AudioUtil::getSamplingFrequencyFromEDID(unsigned char byte) {
76b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    int nFreq = 0;
77b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani
78b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    if (byte & BIT(6)) {
79b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("192kHz");
80b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        nFreq = 192000;
81b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    } else if (byte & BIT(5)) {
82b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("176kHz");
83b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        nFreq = 176000;
84b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    } else if (byte & BIT(4)) {
85b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("96kHz");
86b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        nFreq = 96000;
87b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    } else if (byte & BIT(3)) {
88b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("88.2kHz");
89b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        nFreq = 88200;
90b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    } else if (byte & BIT(2)) {
91b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("48kHz");
92b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        nFreq = 48000;
93b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    } else if (byte & BIT(1)) {
94b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("44.1kHz");
95b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        nFreq = 44100;
96b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    } else if (byte & BIT(0)) {
97b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("32kHz");
98b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        nFreq = 32000;
99b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    }
100b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    return nFreq;
101b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani}
102b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani
103b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Maniint AudioUtil::getBitsPerSampleFromEDID(unsigned char byte,
104b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    unsigned char format) {
105b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    int nBitsPerSample = 0;
106b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    if (format == 1) {
107b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        if (byte & BIT(2)) {
108b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            ALOGV("24bit");
109b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            nBitsPerSample = 24;
110b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        } else if (byte & BIT(1)) {
111b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            ALOGV("20bit");
112b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            nBitsPerSample = 20;
113b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        } else if (byte & BIT(0)) {
114b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            ALOGV("16bit");
115b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            nBitsPerSample = 16;
116b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        }
117b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    } else {
118b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("not lpcm format, return 0");
119b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        return 0;
120b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    }
121b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    return nBitsPerSample;
122b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani}
123b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani
124b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Manibool AudioUtil::getHDMIAudioSinkCaps(EDID_AUDIO_INFO* pInfo) {
125b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    unsigned char channels[16];
126b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    unsigned char formats[16];
127b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    unsigned char frequency[16];
128b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    unsigned char bitrate[16];
129b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    unsigned char* data = NULL;
130b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    unsigned char* original_data_ptr = NULL;
131b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    int count = 0;
132b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    bool bRet = false;
133b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    const char* file = "/sys/class/graphics/fb1/audio_data_block";
134b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    FILE* fpaudiocaps = fopen(file, "rb");
135b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    if (fpaudiocaps) {
136b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("opened audio_caps successfully...");
137b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        fseek(fpaudiocaps, 0, SEEK_END);
138b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        long size = ftell(fpaudiocaps);
139b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("audiocaps size is %ld\n",size);
140b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        data = (unsigned char*) malloc(size);
141b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        if (data) {
142b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            fseek(fpaudiocaps, 0, SEEK_SET);
143b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            original_data_ptr = data;
144b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            fread(data, 1, size, fpaudiocaps);
145b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        }
146b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        fclose(fpaudiocaps);
147b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    } else {
148b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGE("failed to open audio_caps");
149b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    }
150b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani
151b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    if (pInfo && data) {
152b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        int length = 0;
153b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        memcpy(&count,  data, sizeof(int));
154b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        data+= sizeof(int);
155b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("#Audio Block Count is %d",count);
156b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        memcpy(&length, data, sizeof(int));
157b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        data += sizeof(int);
158b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("Total length is %d",length);
159b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        unsigned int sad[MAX_SHORT_AUDIO_DESC_CNT];
160b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        int nblockindex = 0;
161b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        int nCountDesc = 0;
162b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        while (length >= MIN_AUDIO_DESC_LENGTH && count < MAX_SHORT_AUDIO_DESC_CNT) {
163b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            sad[nblockindex] = (unsigned int)data[0] + ((unsigned int)data[1] << 8)
164b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani                               + ((unsigned int)data[2] << 16);
165b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            nblockindex+=1;
166b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            nCountDesc++;
167b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            length -= MIN_AUDIO_DESC_LENGTH;
168b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            data += MIN_AUDIO_DESC_LENGTH;
169b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        }
170b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        memset(pInfo, 0, sizeof(EDID_AUDIO_INFO));
171b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        pInfo->nAudioBlocks = nCountDesc;
172b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("Total # of audio descriptors %d",nCountDesc);
173b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        int nIndex = 0;
174b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        while (nCountDesc--) {
175b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani              channels [nIndex]   = (sad[nIndex] & 0x7) + 1;
176b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani              formats  [nIndex]   = (sad[nIndex] & 0xFF) >> 3;
177b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani              frequency[nIndex]   = (sad[nIndex] >> 8) & 0xFF;
178b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani              bitrate  [nIndex]   = (sad[nIndex] >> 16) & 0xFF;
179b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani              nIndex++;
180b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        }
181b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        bRet = true;
182b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        for (int i = 0; i < pInfo->nAudioBlocks; i++) {
183b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            ALOGV("AUDIO DESC BLOCK # %d\n",i);
184b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani
185b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            pInfo->AudioBlocksArray[i].nChannels = channels[i];
186b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            ALOGV("pInfo->AudioBlocksArray[i].nChannels %d\n", pInfo->AudioBlocksArray[i].nChannels);
187b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani
188b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            ALOGV("Format Byte %d\n", formats[i]);
189b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            pInfo->AudioBlocksArray[i].nFormatId = (EDID_AUDIO_FORMAT_ID)printFormatFromEDID(formats[i]);
190b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            ALOGV("pInfo->AudioBlocksArray[i].nFormatId %d",pInfo->AudioBlocksArray[i].nFormatId);
191b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani
192b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            ALOGV("Frequency Byte %d\n", frequency[i]);
193b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            pInfo->AudioBlocksArray[i].nSamplingFreq = getSamplingFrequencyFromEDID(frequency[i]);
194b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            ALOGV("pInfo->AudioBlocksArray[i].nSamplingFreq %d",pInfo->AudioBlocksArray[i].nSamplingFreq);
195b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani
196b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            ALOGV("BitsPerSample Byte %d\n", bitrate[i]);
197b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            pInfo->AudioBlocksArray[i].nBitsPerSample = getBitsPerSampleFromEDID(bitrate[i],formats[i]);
198b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            ALOGV("pInfo->AudioBlocksArray[i].nBitsPerSample %d",pInfo->AudioBlocksArray[i].nBitsPerSample);
199b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        }
200b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            getSpeakerAllocation(pInfo);
201b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    }
202b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    if (original_data_ptr)
203b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        free(original_data_ptr);
204b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani
205b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    return bRet;
206b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani}
207b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani
208b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Manibool AudioUtil::getSpeakerAllocation(EDID_AUDIO_INFO* pInfo) {
209b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    int count = 0;
210b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    bool bRet = false;
211b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    unsigned char* data = NULL;
212b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    unsigned char* original_data_ptr = NULL;
213b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    const char* spkrfile = "/sys/class/graphics/fb1/spkr_alloc_data_block";
214b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    FILE* fpspkrfile = fopen(spkrfile, "rb");
215b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    if(fpspkrfile) {
216b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("opened spkr_alloc_data_block successfully...");
217b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        fseek(fpspkrfile,0,SEEK_END);
218b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        long size = ftell(fpspkrfile);
219b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("fpspkrfile size is %ld\n",size);
220b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        data = (unsigned char*)malloc(size);
221b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        if(data) {
222b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            original_data_ptr = data;
223b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            fseek(fpspkrfile,0,SEEK_SET);
224b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            fread(data,1,size,fpspkrfile);
225b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        }
226b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        fclose(fpspkrfile);
227b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    } else {
228b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGE("failed to open fpspkrfile");
229b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    }
230b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani
231b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    if(pInfo && data) {
232b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        int length = 0;
233b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        memcpy(&count,  data, sizeof(int));
234b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("Count is %d",count);
235b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        data += sizeof(int);
236b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        memcpy(&length, data, sizeof(int));
237b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("Total length is %d",length);
238b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        data+= sizeof(int);
239b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        ALOGV("Total speaker allocation Block count # %d\n",count);
240b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        bRet = true;
241b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        for (int i = 0; i < count; i++) {
242b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            ALOGV("Speaker Allocation BLOCK # %d\n",i);
243b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            pInfo->nSpeakerAllocation[0] = data[0];
244b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            pInfo->nSpeakerAllocation[1] = data[1];
245b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            pInfo->nSpeakerAllocation[2] = data[2];
246b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            ALOGV("pInfo->nSpeakerAllocation %x %x %x\n", data[0],data[1],data[2]);
247b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani
248b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani
249b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            if (pInfo->nSpeakerAllocation[0] & BIT(7)) {
250b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani                 ALOGV("FLW/FRW");
251b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            } else if (pInfo->nSpeakerAllocation[0] & BIT(6)) {
252b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani                 ALOGV("RLC/RRC");
253b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            } else if (pInfo->nSpeakerAllocation[0] & BIT(5)) {
254b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani                 ALOGV("FLC/FRC");
255b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            } else if (pInfo->nSpeakerAllocation[0] & BIT(4)) {
256b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani                ALOGV("RC");
257b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            } else if (pInfo->nSpeakerAllocation[0] & BIT(3)) {
258b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani                ALOGV("RL/RR");
259b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            } else if (pInfo->nSpeakerAllocation[0] & BIT(2)) {
260b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani                ALOGV("FC");
261b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            } else if (pInfo->nSpeakerAllocation[0] & BIT(1)) {
262b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani                ALOGV("LFE");
263b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            } else if (pInfo->nSpeakerAllocation[0] & BIT(0)) {
264b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani                ALOGV("FL/FR");
265b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            }
266b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani
267b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            if (pInfo->nSpeakerAllocation[1] & BIT(2)) {
268b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani                ALOGV("FCH");
269b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            } else if (pInfo->nSpeakerAllocation[1] & BIT(1)) {
270b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani                ALOGV("TC");
271b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            } else if (pInfo->nSpeakerAllocation[1] & BIT(0)) {
272b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani                ALOGV("FLH/FRH");
273b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani            }
274b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        }
275b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    }
276b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    if (original_data_ptr)
277b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani        free(original_data_ptr);
278b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani    return bRet;
279b357a77dc9c72cb6e327e945421f440052233b51SathishKumar Mani}
280