OpenSL ES Android:“太多对象”SL_RESULT_MEMORY_FAILURE

时间:2014-03-28 23:12:04

标签: android opensl

我在Android上遇到OpenSL ES问题。我正在使用OpenSL播放声音效果。目前我每次播放声音时都会创建一个新的播放器。 (我知道这不是非常有效,但它暂时“足够好”。)

播放一段时间后,我开始收到这些错误:

E/libOpenSLES(25131): Too many objects
W/libOpenSLES(25131): Leaving Engine::CreateAudioPlayer (SL_RESULT_MEMORY_FAILURE)

我正在跟踪我的创建/销毁模式,我在任何给定时间都没有超过4个优秀对象,远低于32的系统限制。当然,这是假设Destroy正常工作。

我现在唯一的猜测是,当我清理玩家对象时,我正在做错事。一个可能的问题是Destroy经常在玩家回调的上下文中调用(在游戏结束后基本上会摧毁玩家),虽然我找不到任何暗示这是一个问题的参考。除了“摧毁”玩家对象之外,我还应该采取其他任何清理步骤吗?接口是否也需要以某种方式进行清理?

- 已添加 -

经过更多测试后,它会在创建第30个玩家后持续发生(还有引擎和混合,因此总共会有32个对象)。所以我一定不能正确地摧毁这个物体。这是代码 - 我想知道出了什么问题:

SLuint32 playerState = 0;

SLresult result = (*pPlayerObject)->GetState(pPlayerObject, &playerState);

return_if_fail(result);

if (playerState == SL_OBJECT_STATE_REALIZED)
{
    (*pPlayerObject)->AbortAsyncOperation(pPlayerObject);
    (*pPlayerObject)->Destroy(pPlayerObject);
}
else
{
    __android_log_print(1, LOG_TAG, "Player object in unexpected state (%d)", playerState);
    return 1002;
}

1 个答案:

答案 0 :(得分:2)

  1. if (playerState == SL_OBJECT_STATE_REALIZED)

    不需要。尽量做到这一点。

  2. AbortAsyncOperationDestroy =>中被调用,不需要。
  3. 所以试试(*pPlayerObject)->Destroy(pPlayerObject);就足够了。
  4. 修改 我测试了,找到了解决方案。 您无法从播放器Destroy()拨打callback。应该制作" destroy"列出并在其他地方销毁它,例如,在主线程中。