Skip to content

oboe::AudioStreamOpenSLES::enqueueCallbackBuffer crash on Huawei devices with OS version 6, 7 #2342

@kumarjatin

Description

@kumarjatin

Android version(s): 6, 7 mostly
Android device(s): Huawei devices exclusively
Oboe version: 1.10
App name used for testing: None
(Please try to reproduce the issue using the OboeTester or an Oboe sample.)

Short description
We are running into this crash and there are a couple of different paths leading up to this crash (always ending in enqueueCallbackBuffer).

  1. Record path:
    SIGSEGV
libaudioclient.so 0X7697103500 android::sp<android::AudioIoDescriptor>::operator=(android::sp<android::AudioIoDescriptor> const&) (+0x30) + 0x7f500
libaudioclient.so 0X7697101324 android::AudioSystem::AudioFlingerClient::getIoDescriptor_l(int) (+0x114) + 0x7d324
libaudioclient.so 0X7697103AC4 android::AudioSystem::getIoDescriptor(int) [clone .cfi] (+0x84) + 0x7fac4
libaudioclient.so 0X76971178A0 android::AudioSystem::getDeviceIdForIo(int) [clone .cfi] (+0x40) + 0x938a0
libaudioclient.so 0X7697142CF4 android::AudioTrack::getRoutedDeviceId() (+0x84) + 0xbecf4
libwilhelm.so 0X769746E9FC android_audioPlayer_bufferQueue_onRefilled_l(CAudioPlayer_struct*) (+0x1c) + 0x209fc
libwilhelm.so 0X7697469824 handler_AudioPlayer_bq_enqueue (+0x14) + 0x1b824
libwilhelm.so 0X7697469ED8 object_unlock_exclusive_attributes_(Object_interface*, unsigned int, char const*, int) (+0xd8) + 0x1bed8
libwilhelm.so 0X76974802CC IBufferQueue_Enqueue(SLBufferQueueItf_ const* const*, void const*, unsigned int) (+0x15c) + 0x322cc
libmyapp.so 0x7550206848 oboe::AudioStreamOpenSLES::enqueueCallbackBuffer(SLAndroidSimpleBufferQueueItf_ const* const*) [oboe/oboe-1.10.0/src/opensles/AudioStreamOpenSLES.cpp:414 + 0x8]
libmyapp.so 0x7550206928 oboe::AudioStreamOpenSLES::processBufferCallback(SLAndroidSimpleBufferQueueItf_ const* const*) [oboe/oboe-1.10.0/src/opensles/AudioStreamOpenSLES.cpp:433 + 0x8]
libmyapp.so 0x75502069e8 bqCallbackGlue(SLAndroidSimpleBufferQueueItf_ const* const*, void*) [oboe/oboe-1.10.0/src/opensles/AudioStreamOpenSLES.cpp:460 + 0x4]
libwilhelm.so 0X769746C21C audioTrack_handleMoreData_lockPlay(CAudioPlayer_struct*, android::AudioTrack::Buffer const&) (+0x7c) + 0x1e21c
libwilhelm.so 0X769746EF3C android::AudioTrackCallback::onMoreData(android::AudioTrack::Buffer const&) (+0x2c) + 0x20f3c
libaudioclient.so 0X7697133B24 android::AudioTrack::processAudioBuffer() (+0xd34) + 0xafb24
libaudioclient.so 0X7697132A18 android::AudioTrack::AudioTrackThread::threadLoop() (+0x178) + 0xaea18
libutils.so 0X769F05A30C android::Thread::_threadLoop(void*) (+0x11c) + 0x1430c
libandroid_runtime.so 0X7679C5080C android::AndroidRuntime::javaThreadShell(void*) (+0x8c) + 0xf480c
libc.so 0X768578CD5C __pthread_start(void*) (+0xcc) + 0x101d5c
libc.so 0X7685720BC0 __start_thread (+0x40) + 0x95bc0)
  1. More generic one, not sure if it is on the record or play path
libwilhelm.so    [offset: 0x212d4, 2759ED8CAA0B71C8FC5C784EC02A09D50]
libwilhelm.so    [offset: 0x213e0, 2759ED8CAA0B71C8FC5C784EC02A09D50]
libwilhelm.so    [offset: 0x213e0, 2759ED8CAA0B71C8FC5C784EC02A09D50]
libmyapp.so, 	 File "oboe/oboe-1.10.0/src/opensles/AudioStreamOpenSLES.cpp", line 414, in oboe::AudioStreamOpenSLES::enqueueCallbackBuffer(SLAndroidSimpleBufferQueueItf_ const* const*)
libmyapp.so, 	 File "oboe/oboe-1.10.0/src/opensles/AudioStreamOpenSLES.cpp", line 460, in bqCallbackGlue(SLAndroidSimpleBufferQueueItf_ const* const*, void*)
libwilhelm.so    [offset: 0xd684, 2759ED8CAA0B71C8FC5C784EC02A09D50]
libwilhelm.so    [offset: 0xd684, 2759ED8CAA0B71C8FC5C784EC02A09D50]
libmedia.so    [offset: 0x7ddd8, 268022A4D9712BFDD24211423A99D51C0]
libmedia.so    [offset: 0x7e4dc, 268022A4D9712BFDD24211423A99D51C0]
libutils.so    [offset: 0x125e0, ADFDFD300CBB5E70DCBFEBBD571650800]
libc.so    [offset: 0x689a4, 61AEF086B8CFE5276BBE04FAAB1A2FFE0]
libc.so    [offset: 0x1db00, 61AEF086B8CFE5276BBE04FAAB1A2FFE0]
  1. During creation of recorder
libwilhelm.so 0X775E786C5C IBufferQueue_Enqueue(SLBufferQueueItf_ const* const*, void const*, unsigned int) (+0x118) + 0x31c5c
libmyapp.so   0x7562c3c848 oboe::AudioStreamOpenSLES::enqueueCallbackBuffer(SLAndroidSimpleBufferQueueItf_ const* const*) [oboe/oboe-1.10.0/src/opensles/AudioStreamOpenSLES.cpp:414 + 0x8]
libmyapp.so   0x7562c3a6d0 oboe::AudioInputStreamOpenSLES::requestStart() [oboe/oboe-1.10.0/src/opensles/AudioInputStreamOpenSLES.cpp:272 + 0x8]

I have come across #1431 and I was hopeful that upgrading from 1.7.0 to 1.10.0 will solve this crash for our use case too, but I still continue to see the crash specifically on Huawei devices only running OS 6 or 7 (very few on 8).

Few other things to note:

  • We always force Oboe to use OpenSLES API for now.
  • Other settings: 16K sample rate, 320 samples per frame, VOICE_COMMUNICATION preset

Steps to reproduce

Expected behavior

Actual behavior

Device
Huawei P9 Lite, Huawei Y5. I don't have these devices at hand and I see these being problematic from production logs.

Any additional context
I have ensured that both the previous fixes #1621 and #1570 are already part of my build.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions