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

На некоторых устройствах хорошо работает библиотека 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 в tid 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.15211895-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 <br>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 pc 0000000000068494 /system/lib64/libc.so (pthread_mutex_lock + 8) 12-12 14: 55: 15.203 11895-11895 /?I / AEE / AED: # 01 pc 000000000002f8a0 /system/lib64/libhwui.so (_ZN7android10uirenderer12renderthread12RenderThread5queueEPNS1_10RenderTaskE + 28) 12-12 14: 55: 15.203 11895-11895 /?I / AEE / AED: # 02 pc 000000000002e324 /system/lib64/libhwui.so (_ZN7android10uirenderer12renderthread11RenderProxy11postAndWaitEPNS1_22MethodInvokeRenderTaskE + 132) 12-12 14: 55: 15953 953I / AEE / AED: # 03 pc 000000000002e600 /system/lib64/libhwui.so(_ZN7 android10uirenderer12renderthread11RenderProxy20loadSystemPropertiesEv + 92) 12-12 14: 55: 15.203 11895-11895 /?I / AEE / AED: # 04 pc 0000000002a1b990 /system/framework/arm64/boot.oat (смещение 0x2439000) 12-12 14: 55: 15,795 1858-1858 /?E / WifiTrafficPoller: TRAFFIC_STATS_POLL true Token 14 num клиентов 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: Надгробный камень записывается в: / data / tombstones / tombstone_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

1 Ответ

0 голосов
/ 27 декабря 2018

Я предполагаю, что ваше приложение пытается использовать больше памяти, чем доступно для него.Каждый раз, когда вы звоните 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 и использует умные указатели.

...