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