【问题标题】:Does a finished buffer from an OpenSL ES audio player need to be freed?是否需要释放来自 OpenSL ES 音频播放器的已完成缓冲区?
【发布时间】:2011-08-27 05:39:54
【问题描述】:

只是为了确认。当通过适用于 Android 的 OpenSL ES 创建的音频播放器完成播放缓冲区时,垃圾收集器会自动释放该缓冲区吗?还是我需要自己释放缓冲区?

如果是后者,我可以使用一些帮助。但就目前而言,在我被告知我需要自己做之前,我不会发布任何代码......

【问题讨论】:

    标签: android c android-ndk opensl


    【解决方案1】:

    正如之前的海报所说,您使用之前创建的缓冲区调用 Enqueue。但是,我要指出,除非您在应用程序中只播放一次音频事件,否则您可能应该继续重复使用音频缓冲区来完全避免 GC - C 的美妙之处!

    还可以查看 Android OpenSL ES 文档,该文档涉及在您完成后销毁您的界面,这必须手动完成。

    【讨论】:

    • 虽然你说的是真的,但我已经发现了,并实施了。就像我对上一张海报的评论一样,我已经有一个清理程序,并且已经在重新使用缓冲区。不过,感谢您的时间和评论。 :>
    【解决方案2】:

    缓冲区队列本身并不实际分配缓冲区内存(或需要释放它),您将指针传递给您通过“入队”函数分配的内存。播放完缓冲区后,您需要释放分配的内存。

    由于 OpenSL ES 是 C++ 中的本机库,它对垃圾回收一无所知,您为 API 分配的任何内存都必须由您释放,并且您创建的对象必须调用“销毁”以清理内部内存.

    【讨论】:

    • 是的,我也这么认为,而且我已经实施了一个清理例程。不过,感谢您证实了我的怀疑。
    猜你喜欢
    • 1970-01-01
    • 2018-07-22
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 1970-01-01
    • 2017-12-15
    • 2012-07-04
    相关资源
    最近更新 更多