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