Android OBOE C++ E/AudioAlsApHoalButoSerkBase:OpenPCMDReValver(),PCMYSTART(0xEF82FC0)由于无法启动通道失败:断流管道

Android OBOE C++ E/AudioAlsApHoalButoSerkBase:OpenPCMDReValver(),PCMYSTART(0xEF82FC0)由于无法启动通道失败:断流管道,android,c++,oboe,Android,C++,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 = SoundR

在一些设备上,安卓双簧管高性能音频库运行良好。但是在其他设备上,它在加载声音文件后崩溃

此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_start0xeff82fc0由于无法启动通道而失败:管道破裂

--------- beginning of crash 12-12 14:55:15.047 11622-11622/com.learntomaster.dlmp A/libc: Fatal signal 11 (SIGSEGV),
这意味着什么?我如何解决

这是错误日志:

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\U start0xeff82fc0 由于无法启动通道而失败:管道断裂

--------- beginning of crash 12-12 14:55:15.047 11622-11622/com.learntomaster.dlmp A/libc: Fatal signal 11 (SIGSEGV),
代码1,tid 11622 rntomaster.dlmp 12-12中的故障地址0x90 14:55:15.137 10957-11660/? E/Icing:中止语料库索引 播放列表12-12 14:55:15.151 11895-11895/?I/AEE/AED:* * 12-12 14:55:15.152 11895-11895/? I/AEE/AED:构建指纹: ‘联想/LenovoTB3-850F/TB3-850F:6.0/MRA58K/TB3-850F_S100031_171010_行:用户/释放键’ 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我猜您的应用程序正在尝试使用比可用内存更多的内存。每次调用SoundRecording::loadFromAssets时,您都将声音文件的全部内容加载到内存中,并且有40个声音文件

如果其中一个声音文件加载失败,则生成的SoundRecording*对象将为空指针。这将添加到混合器中。在调用mAudioStream->requestStart之后,第一次回调会在调用Mixer::renderAudio的过程中发生,而Mixer::renderAudio又会调用SoundRecording::renderAudio,从而取消对该空指针的引用

我不是100%确定,但我认为至少需要发生一次回调来启动流,这在使用OpenSL ES时肯定会发生,这可以解释为什么pcm_start方法失败

验证这一点的简单方法是在调用loadFromAssets后检查nullptr:


您还应该查看ThermthGame示例中修复内存泄漏并使用智能指针的

在其他设备上-哪些设备可以正常工作:Moto G6 8.0、Nexus 7 5.1、Galaxy S3 4.3、Pixel 29、K3 2017 6.0。本机崩溃:Mate 9 7.0 LG S6 7.0、Galaxy S9 8.0、Xperia XZ1 Compact 8,0、Moto G4 Play 6.0事实上,与Nexus 7密切合作,本机崩溃似乎有时会发生。本机崩溃是否发生在双簧管样本中,例如RhythmatGame?在办公室的4台测试设备上,RhymatGame没有发生过崩溃。用于测试的其他设备是当您将.apk上传到beta版时从Google Play提供的设备。节奏游戏和我们的应用程序之间的一个巨大区别是,我们使用了一个混音器来处理大约40个声音样本,其中节奏游戏有2个或3个。这跟这事有关系吗?谢谢。在loadingFromAssets上检查nullptr现在提高了稳定性,因为我可以优雅地处理本机错误。如果我发现了这一点,我会从原生的双簧管/c++恢复到传统的Android声音池。只是在各种设备上试用了它,例如三星S9安卓8,0、Mate 9华为7.0、索尼Xperia XZ1 Compact 8.0、三星Galaxy S3安卓4.3,但仍然无法处理SEGV_MAPERR崩溃。以下是S9:Build fingerprint的错误日志:“三星/starqlteue/starqlteue:8.0.0/R16NW/G960U1UEU1ARB7:user/release keys”修订版:“14”ABI:“arm64”pid:24507,tid:24507,名称:rntomaster.dlmp>>>com.learntomaster.dlmp