Android oboe c ++ E / AudioALSAPlaybackHandlerBase: openPcmDriver (), pcm_start (0xeff82fc0) завершается ошибкой из-за невозможности запустить канал: Сломанный канал

На некоторых устройствах хорошо работает библиотека Android oboe для высокопроизводительного аудио. Однако на других устройствах происходит сбой после загрузки звуковых файлов.

Этот метод jni выполняется нормально:

void SoundFunctions::loadSounds() {

LOGD("SoundFunctions loadSounds called");

// Load the RAW PCM data files for both the clap sound and backing track into memory.
stdB = SoundRecording::loadFromAssets(mAssetManager, "std_kit_b.wav");
stdSN= SoundRecording::loadFromAssets(mAssetManager, "std_kit_sn.wav");

// Add all to mixer
mMixer.addTrack(stdB);
mMixer.addTrack(stdSN);// Create a builder
AudioStreamBuilder builder;
builder.setFormat(AudioFormat::I16);
builder.setChannelCount(1);
builder.setSampleRate(kSampleRateHz);
builder.setCallback(this);
builder.setPerformanceMode(PerformanceMode::LowLatency);
builder.setSharingMode(SharingMode::Exclusive);
LOGD("After creating a builder");

// Open stream
Result result = builder.openStream(&mAudioStream);
if (result != Result::OK){
LOGE("Failed to open stream. Error: %s", convertToText(result));
}
LOGD("After openstream");

// Reduce stream latency by setting the buffer size to a multiple of the burst size
mAudioStream->setBufferSizeInFrames(mAudioStream->getFramesPerBurst() * 2);

// Start the stream
result = mAudioStream->requestStart();
if (result != Result::OK){
LOGE("Failed to start stream. Error: %s", convertToText(result));
}
LOGD("After starting stream");}

Однако вскоре после этого происходит собственный сбой E / AudioALSAPlaybackHandlerBase: openPcmDriver (), pcm_start (0xeff82fc0) завершается неудачно из-за невозможности запустить канал: Сломанный канал

Что это значит и как я могу решить?

Это журнал ошибок:

12-12 14: 55: 14.995 11622-11622 / com.learntomaster.dlmp D / RhythmGame:
После запуска потока 12-12 14: 55: 15.006 1462-1987 /?
E / AudioALSAPlaybackHandlerBase: openPcmDriver (), pcm_start (0xeff82fc0)
ошибка из-за невозможности запустить канал: сломанная труба

--------- beginning of crash 12-12 14:55:15.047 11622-11622/com.learntomaster.dlmp A/libc: Fatal signal 11 (SIGSEGV),

код 1, адрес ошибки 0x90 в тид 11622 (rntomaster.dlmp) 12-12
14: 55: 15.137 10957-11660 /? E / Обледенение: прекращение индексации корпуса
плейлисты 12-12 14: 55: 15.151 11895-11895 /? I / AEE / AED: *
* 12-12 14: 55: 15.152 11895-11895 /? I / AEE / AED: Построить отпечаток пальца:
‘Lenovo / LenovoTB3-850F / TB3-850F: 6,0 / MRA58K / TB3-850F_S100031_171010_ROW: пользователь / отпускание клавиши’
12-12 14: 55: 15.152 11895-11895 /? I / AEE / AED: редакция: ‘0’ 12-12
14: 55: 15.152 11895-11895 /? I / AEE / AED: ABI: ‘arm64’ 12-12 14: 55: 15.152
11895-11895 /? I / AEE / AED: pid: 11622, tid: 11622, имя: rntomaster.dlmp

com.learntomaster.dlmp <<< 12-12 14: 55: 15.152 11895-11895 /? I / AEE / AED: сигнал 11 (SIGSEGV), код 1 (SEGV_MAPERR), адрес ошибки 0x90
12-12 14: 55: 15,174 11895-11895 /? I / AEE / AED: x0 0000000000000090
x1 0000007fdedc7540 x2 0000000000000000 x3 0000000000000000
12-12 14: 55: 15,174 11895-11895 /? I / AEE / AED: x4 0000000000000000
x5 0000000000000000 x6 0000000000000000 x7 0000000000000000
12-12 14: 55: 15,174 11895-11895 /? I / AEE / AED: x8 0000000000000001
x9 0000007f956290a0 x10 0000000000000001 x11 0000007f937c20e0
12-12 14: 55: 15,174 11895-11895 /? I / AEE / AED: x12 0000007f96ecea40
x13 0000000000000004 x14 0000000000000005 x15 00000000000000c0
12-12 14: 55: 15,174 11895-11895 /? I / AEE / AED: x16 0000007f9562e760
x17 0000007f96e9048c x18 0000007f937c20e0 x19 0000000000000000
12-12 14: 55: 15,174 11895-11895 /? I / AEE / AED: x20 0000000000000090
x21 0000007f7ea3b488 x22 0000007f7ea3b380 x23 0000007f7ea3b4b0
12-12 14: 55: 15,174 11895-11895 /? I / AEE / AED: x24 0000007fdedc7540
x25 0000000000000000 x26 0000007fdedc7a78 x27 0000279200002d66
12-12 14: 55: 15,174 11895-11895 /? I / AEE / AED: x28 0000279200002d66
x29 0000007fdedc7490 x30 0000007f955948a4 12-12 14: 55: 15.174
11895-11895 /? I / AEE / AED: sp 0000007fdedc7490 pc
0000007f96e90494 pstate 0000000060000000 12-12 14: 55: 15.195
1462-1988 /? E / AudioFlinger: getNextBuffer, получить нулевой буфер 12-12
14: 55: 15.203 11895-11895 /? I / AEE / AED: обратная трассировка: 12-12 14: 55: 15.203
11895-11895 /? I / AEE / AED: # 00 шт. 0000000000068494
/system/lib64/libc.so (pthread_mutex_lock + 8) 12-12 14: 55: 15.203
11895-11895 /? I / AEE / AED: # 01 шт. 000000000002f8a0
/system/lib64/libhwui.so
(_ZN7android10uirenderer12renderthread12RenderThread5queueEPNS1_10RenderTaskE + 28)
12-12 14: 55: 15.203 11895-11895 /? I / AEE / AED: # 02 шт
000000000002e324 /system/lib64/libhwui.so
(_ZN7android10uirenderer12renderthread11RenderProxy11postAndWaitEPNS1_22MethodInvokeRenderTaskE + 132)
12-12 14: 55: 15.203 11895-11895 /? I / AEE / AED: # 03 шт
000000000002e600 /system/lib64/libhwui.so
(_ZN7android10uirenderer12renderthread11RenderProxy20loadSystemPropertiesEv + 92)
12-12 14: 55: 15.203 11895-11895 /? I / AEE / AED: # 04 шт
0000000002a1b990 /system/framework/arm64/boot.oat (смещение 0x2439000)
12-12 14: 55: 15,795 1858-1858 /? E / WifiTrafficPoller: TRAFFIC_STATS_POLL
истинный токен 14 число клиентов 9 12-12 14: 55: 15.796 1858-1858 /?
E / WifiTrafficPoller: количество пакетов Tx = 11477 Rx = 15018 12-12
14: 55: 15,823 11895-11895 /? I / AEE / AED: Надгробная плита написана:
/ данные / надгробия / надгробие_04 12-12 14: 55: 15,824 11895-11895 /?
E / AEE / AED: AM запись не удалась: сломанная труба 12-12 14: 55: 15,824
11895-11895 /? E / AEE / AED: request.action: 0

0

Решение

Я предполагаю, что ваше приложение пытается использовать больше памяти, чем доступно для него. Каждый раз, когда вы звоните SoundRecording::loadFromAssets Вы загружаете все содержимое звукового файла в память, и у вас есть 40 звуковых файлов.

Если хотя бы один из этих звуковых файлов не загружается, то SoundRecording * объект будет нулевым указателем. Это добавлено к Mixer, После звонка mAudioStream->requestStart() первый обратный вызов происходит во время которого Mixer::renderAudio называется, который в свою очередь вызывает SoundRecording::renderAudio который разыменовывает этот нулевой указатель вызывая SEGV_MAPERR.

Я не уверен на 100%, но я думаю, что по крайней мере один обратный вызов должен произойти, чтобы запустить поток (это, безусловно, делает при использовании OpenSL ES), что объясняет, почему pcm_start метод не удался.

Простой способ убедиться в этом — проверить nullptr после звонка loadFromAssets:

if (stdB == nullptr){ LOGE("Failed to load sound file"); }

Вы также должны проверить обновленный пример кода исправляет утечку памяти в образце RhythmGame и использует умные указатели.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]