Loading include/utils/ResourceTypes.h +2 −0 Original line number Diff line number Diff line Loading @@ -447,6 +447,8 @@ public: } const char16_t* stringAt(size_t idx, size_t* outLen) const; const char* string8At(size_t idx, size_t* outLen) const; const ResStringPool_span* styleAt(const ResStringPool_ref& ref) const; const ResStringPool_span* styleAt(size_t idx) const; Loading libs/audioflinger/AudioPolicyManagerBase.cpp +10 −12 Original line number Diff line number Diff line Loading @@ -82,8 +82,8 @@ status_t AudioPolicyManagerBase::setDeviceConnectionState(AudioSystem::audio_dev // keep track of SCO device address mScoDeviceAddress = String8(device_address, MAX_DEVICE_ADDRESS_LEN); #ifdef WITH_A2DP if ((mA2dpDeviceAddress == mScoDeviceAddress) && (mPhoneState != AudioSystem::MODE_NORMAL)) { if (mA2dpOutput != 0 && mPhoneState != AudioSystem::MODE_NORMAL) { mpClientInterface->suspendOutput(mA2dpOutput); } #endif Loading Loading @@ -116,8 +116,8 @@ status_t AudioPolicyManagerBase::setDeviceConnectionState(AudioSystem::audio_dev if (AudioSystem::isBluetoothScoDevice(device)) { mScoDeviceAddress = ""; #ifdef WITH_A2DP if ((mA2dpDeviceAddress == mScoDeviceAddress) && (mPhoneState != AudioSystem::MODE_NORMAL)) { if (mA2dpOutput != 0 && mPhoneState != AudioSystem::MODE_NORMAL) { mpClientInterface->restoreOutput(mA2dpOutput); } #endif Loading Loading @@ -275,10 +275,8 @@ void AudioPolicyManagerBase::setPhoneState(int state) newDevice = getNewDevice(mHardwareOutput, false); #ifdef WITH_A2DP checkOutputForAllStrategies(newDevice); // suspend A2DP output if SCO device address is the same as A2DP device address. // no need to check that a SCO device is actually connected as mScoDeviceAddress == "" // if none is connected and the test below will fail. if (mA2dpDeviceAddress == mScoDeviceAddress) { // suspend A2DP output if a SCO device is present. if (mA2dpOutput != 0 && mScoDeviceAddress != "") { if (oldState == AudioSystem::MODE_NORMAL) { mpClientInterface->suspendOutput(mA2dpOutput); } else if (state == AudioSystem::MODE_NORMAL) { Loading Loading @@ -1191,7 +1189,7 @@ status_t AudioPolicyManagerBase::handleA2dpConnection(AudioSystem::audio_devices } AudioOutputDescriptor *hwOutputDesc = mOutputs.valueFor(mHardwareOutput); if (mA2dpDeviceAddress == mScoDeviceAddress) { if (mScoDeviceAddress != "") { // It is normal to suspend twice if we are both in call, // and have the hardware audio output routed to BT SCO if (mPhoneState != AudioSystem::MODE_NORMAL) { Loading Loading @@ -1556,9 +1554,9 @@ void AudioPolicyManagerBase::setOutputDevice(audio_io_handle_t output, uint32_t usleep(outputDesc->mLatency*2*1000); } #ifdef WITH_A2DP // suspend A2D output if SCO device is selected // suspend A2DP output if SCO device is selected if (AudioSystem::isBluetoothScoDevice((AudioSystem::audio_devices)device)) { if (mA2dpOutput && mScoDeviceAddress == mA2dpDeviceAddress) { if (mA2dpOutput != 0) { mpClientInterface->suspendOutput(mA2dpOutput); } } Loading @@ -1573,7 +1571,7 @@ void AudioPolicyManagerBase::setOutputDevice(audio_io_handle_t output, uint32_t #ifdef WITH_A2DP // if disconnecting SCO device, restore A2DP output if (AudioSystem::isBluetoothScoDevice((AudioSystem::audio_devices)prevDevice)) { if (mA2dpOutput && mScoDeviceAddress == mA2dpDeviceAddress) { if (mA2dpOutput != 0) { LOGV("restore A2DP output"); mpClientInterface->restoreOutput(mA2dpOutput); } Loading libs/utils/ResourceTypes.cpp +39 −6 Original line number Diff line number Diff line Loading @@ -497,6 +497,34 @@ const uint16_t* ResStringPool::stringAt(size_t idx, size_t* outLen) const return NULL; } const char* ResStringPool::string8At(size_t idx, size_t* outLen) const { if (mError == NO_ERROR && idx < mHeader->stringCount) { const bool isUTF8 = (mHeader->flags&ResStringPool_header::UTF8_FLAG) != 0; const uint32_t off = mEntries[idx]/(isUTF8?sizeof(char):sizeof(char16_t)); if (off < (mStringPoolSize-1)) { if (isUTF8) { const uint8_t* strings = (uint8_t*)mStrings; const uint8_t* str = strings+off; DECODE_LENGTH(str, sizeof(uint8_t), *outLen) size_t encLen; DECODE_LENGTH(str, sizeof(uint8_t), encLen) if ((uint32_t)(str+encLen-strings) < mStringPoolSize) { return (const char*)str; } else { LOGW("Bad string block: string #%d extends to %d, past end at %d\n", (int)idx, (int)(str+encLen-strings), (int)mStringPoolSize); } } } else { LOGW("Bad string block: string #%d entry is at %d, past end at %d\n", (int)idx, (int)(off*sizeof(uint16_t)), (int)(mStringPoolSize*sizeof(uint16_t))); } } return NULL; } const ResStringPool_span* ResStringPool::styleAt(const ResStringPool_ref& ref) const { return styleAt(ref.index); Loading Loading @@ -4018,14 +4046,19 @@ void ResTable::print_value(const Package* pkg, const Res_value& value) const printf("(attribute) 0x%08x\n", value.data); } else if (value.dataType == Res_value::TYPE_STRING) { size_t len; const char16_t* str = pkg->header->values.stringAt( const char* str8 = pkg->header->values.string8At( value.data, &len); if (str == NULL) { printf("(string) null\n"); if (str8 != NULL) { printf("(string8) \"%s\"\n", str8); } else { printf("(string%d) \"%s\"\n", pkg->header->values.isUTF8()?8:16, String8(str, len).string()); const char16_t* str16 = pkg->header->values.stringAt( value.data, &len); if (str16 != NULL) { printf("(string16) \"%s\"\n", String8(str16, len).string()); } else { printf("(string) null\n"); } } } else if (value.dataType == Res_value::TYPE_FLOAT) { printf("(float) %g\n", *(const float*)&value.data); Loading Loading
include/utils/ResourceTypes.h +2 −0 Original line number Diff line number Diff line Loading @@ -447,6 +447,8 @@ public: } const char16_t* stringAt(size_t idx, size_t* outLen) const; const char* string8At(size_t idx, size_t* outLen) const; const ResStringPool_span* styleAt(const ResStringPool_ref& ref) const; const ResStringPool_span* styleAt(size_t idx) const; Loading
libs/audioflinger/AudioPolicyManagerBase.cpp +10 −12 Original line number Diff line number Diff line Loading @@ -82,8 +82,8 @@ status_t AudioPolicyManagerBase::setDeviceConnectionState(AudioSystem::audio_dev // keep track of SCO device address mScoDeviceAddress = String8(device_address, MAX_DEVICE_ADDRESS_LEN); #ifdef WITH_A2DP if ((mA2dpDeviceAddress == mScoDeviceAddress) && (mPhoneState != AudioSystem::MODE_NORMAL)) { if (mA2dpOutput != 0 && mPhoneState != AudioSystem::MODE_NORMAL) { mpClientInterface->suspendOutput(mA2dpOutput); } #endif Loading Loading @@ -116,8 +116,8 @@ status_t AudioPolicyManagerBase::setDeviceConnectionState(AudioSystem::audio_dev if (AudioSystem::isBluetoothScoDevice(device)) { mScoDeviceAddress = ""; #ifdef WITH_A2DP if ((mA2dpDeviceAddress == mScoDeviceAddress) && (mPhoneState != AudioSystem::MODE_NORMAL)) { if (mA2dpOutput != 0 && mPhoneState != AudioSystem::MODE_NORMAL) { mpClientInterface->restoreOutput(mA2dpOutput); } #endif Loading Loading @@ -275,10 +275,8 @@ void AudioPolicyManagerBase::setPhoneState(int state) newDevice = getNewDevice(mHardwareOutput, false); #ifdef WITH_A2DP checkOutputForAllStrategies(newDevice); // suspend A2DP output if SCO device address is the same as A2DP device address. // no need to check that a SCO device is actually connected as mScoDeviceAddress == "" // if none is connected and the test below will fail. if (mA2dpDeviceAddress == mScoDeviceAddress) { // suspend A2DP output if a SCO device is present. if (mA2dpOutput != 0 && mScoDeviceAddress != "") { if (oldState == AudioSystem::MODE_NORMAL) { mpClientInterface->suspendOutput(mA2dpOutput); } else if (state == AudioSystem::MODE_NORMAL) { Loading Loading @@ -1191,7 +1189,7 @@ status_t AudioPolicyManagerBase::handleA2dpConnection(AudioSystem::audio_devices } AudioOutputDescriptor *hwOutputDesc = mOutputs.valueFor(mHardwareOutput); if (mA2dpDeviceAddress == mScoDeviceAddress) { if (mScoDeviceAddress != "") { // It is normal to suspend twice if we are both in call, // and have the hardware audio output routed to BT SCO if (mPhoneState != AudioSystem::MODE_NORMAL) { Loading Loading @@ -1556,9 +1554,9 @@ void AudioPolicyManagerBase::setOutputDevice(audio_io_handle_t output, uint32_t usleep(outputDesc->mLatency*2*1000); } #ifdef WITH_A2DP // suspend A2D output if SCO device is selected // suspend A2DP output if SCO device is selected if (AudioSystem::isBluetoothScoDevice((AudioSystem::audio_devices)device)) { if (mA2dpOutput && mScoDeviceAddress == mA2dpDeviceAddress) { if (mA2dpOutput != 0) { mpClientInterface->suspendOutput(mA2dpOutput); } } Loading @@ -1573,7 +1571,7 @@ void AudioPolicyManagerBase::setOutputDevice(audio_io_handle_t output, uint32_t #ifdef WITH_A2DP // if disconnecting SCO device, restore A2DP output if (AudioSystem::isBluetoothScoDevice((AudioSystem::audio_devices)prevDevice)) { if (mA2dpOutput && mScoDeviceAddress == mA2dpDeviceAddress) { if (mA2dpOutput != 0) { LOGV("restore A2DP output"); mpClientInterface->restoreOutput(mA2dpOutput); } Loading
libs/utils/ResourceTypes.cpp +39 −6 Original line number Diff line number Diff line Loading @@ -497,6 +497,34 @@ const uint16_t* ResStringPool::stringAt(size_t idx, size_t* outLen) const return NULL; } const char* ResStringPool::string8At(size_t idx, size_t* outLen) const { if (mError == NO_ERROR && idx < mHeader->stringCount) { const bool isUTF8 = (mHeader->flags&ResStringPool_header::UTF8_FLAG) != 0; const uint32_t off = mEntries[idx]/(isUTF8?sizeof(char):sizeof(char16_t)); if (off < (mStringPoolSize-1)) { if (isUTF8) { const uint8_t* strings = (uint8_t*)mStrings; const uint8_t* str = strings+off; DECODE_LENGTH(str, sizeof(uint8_t), *outLen) size_t encLen; DECODE_LENGTH(str, sizeof(uint8_t), encLen) if ((uint32_t)(str+encLen-strings) < mStringPoolSize) { return (const char*)str; } else { LOGW("Bad string block: string #%d extends to %d, past end at %d\n", (int)idx, (int)(str+encLen-strings), (int)mStringPoolSize); } } } else { LOGW("Bad string block: string #%d entry is at %d, past end at %d\n", (int)idx, (int)(off*sizeof(uint16_t)), (int)(mStringPoolSize*sizeof(uint16_t))); } } return NULL; } const ResStringPool_span* ResStringPool::styleAt(const ResStringPool_ref& ref) const { return styleAt(ref.index); Loading Loading @@ -4018,14 +4046,19 @@ void ResTable::print_value(const Package* pkg, const Res_value& value) const printf("(attribute) 0x%08x\n", value.data); } else if (value.dataType == Res_value::TYPE_STRING) { size_t len; const char16_t* str = pkg->header->values.stringAt( const char* str8 = pkg->header->values.string8At( value.data, &len); if (str == NULL) { printf("(string) null\n"); if (str8 != NULL) { printf("(string8) \"%s\"\n", str8); } else { printf("(string%d) \"%s\"\n", pkg->header->values.isUTF8()?8:16, String8(str, len).string()); const char16_t* str16 = pkg->header->values.stringAt( value.data, &len); if (str16 != NULL) { printf("(string16) \"%s\"\n", String8(str16, len).string()); } else { printf("(string) null\n"); } } } else if (value.dataType == Res_value::TYPE_FLOAT) { printf("(float) %g\n", *(const float*)&value.data); Loading