gpt4 book ai didi

android - OpenSL ES 安卓 : "Too many objects" SL_RESULT_MEMORY_FAILURE

转载 作者:太空狗 更新时间:2023-10-29 13:24:45 25 4
gpt4 key购买 nike

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

播放一段时间后,我开始出现以下错误:

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

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

我现在唯一的猜测是我在清理玩家对象时做错了什么。一个可能的问题是 Destroy 通常在播放器回调的上下文中调用(基本上是在播放结束后销毁播放器),尽管我找不到任何引用表明这是一个问题。除了“销毁”播放器对象之外,我还应该采取其他清理步骤吗?接口(interface)是否也需要以某种方式清理?

-- 添加了 --

经过更多测试后,在创建第 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. if (playerState == SL_OBJECT_STATE_REALIZED)

    不需要。尝试始终这样做。

  2. AbortAsyncOperationDestroy => 中调用,不需要。

  3. 所以只需尝试 (*pPlayerObject)->Destroy(pPlayerObject); 就足够了。

编辑:我测试了,并找到了解决方案。您不能从播放器 callback 调用 Destroy()。应该制作“destroy”列表并在其他地方销毁它,例如,在主线程中。

关于android - OpenSL ES 安卓 : "Too many objects" SL_RESULT_MEMORY_FAILURE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22724741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com