Как исправить E libOpenSLES: слишком много объектов в SoundEffect qml

Я пишу небольшое приложение для звуковой панели Android и использую компонент SoundEffect внутри файла ListDelegate. Но после нажатия определенного количества кнопок (вызывается sound.play()) он перестает воспроизводить звуки, и я получаю эту ошибку в выводе приложения:

E libOpenSLES: Слишком много объектов W libOpenSLES: Остается

Engine::CreateAudioPlayer (SL_RESULT_MEMORY_FAILURE)

Звук W: невозможно создать AudioPlayer

Внутри ListDelegate:

Rectangle{

   ...

  Button{
    id: delegateButton
    anchors.fill: parent
    Material.elevation: 0
    onPressed: sound.play();
  }

  SoundEffect{
    id: sound
    source: soundsource
  }
}

person Marc Ghanime    schedule 02.05.2019    source источник
comment
SoundEffect внутри делегата??? Для чего??   -  person folibis    schedule 02.05.2019
comment
Я использую soundEffect внутри делегата, поэтому я могу указать другой источник звука для каждой кнопки, используя модель списка.   -  person Marc Ghanime    schedule 03.05.2019
comment
Эмм... Ты играешь все эти звуки одновременно? Если нет - создайте один экземпляр и так установите источник из делегата. SoundEffect должен быть одноэлементным.   -  person folibis    schedule 03.05.2019


Ответы (1)


Я смог исправить это, переместив компонент звукового эффекта из делегата и динамически изменив источник звука при нажатии кнопки следующим образом:

Внутри делегата:

Rectangle{
 signal tapped();
   ...

  Button{
    id: delegateButton
    anchors.fill: parent
    Material.elevation: 0
    onPressed: tapped()
  }
}

Внутри моей главной страницы:

SoundEffect{
  id: sound
}

 ...

ListView{
  delegate:{
    ...

    onTapped: {sound.source = audiosource; sound.play()}
  }
}
person Marc Ghanime    schedule 04.05.2019
comment
Да, это то, что я имел в виду. Кроме того, я бы переместил play() в onStatusChanged(), поскольку установка source не гарантирует, что элемент будет немедленно готов к воспроизведению. - person folibis; 04.05.2019