我有一个Android应用程序,它使用OpenSL ES进行音频处理。它在API17中通过API 22正确运行。在开发应用程序时,我在某处读到虽然OpenSL最多支持32个对象(取决于平台),但Android仅支持11个。所以,我相应地设计了应用程序。
例如,我在JNI中创建了多个缓冲区对象
// buffer queue player interfaces
// FIRST BUFFER
static SLObjectItf buffer_obj_mainBeat_1 = NULL;
static SLPlayItf buffer_itf_mainBeat_1;
static SLAndroidSimpleBufferQueueItf buf_q_mainBeat_1;
// SECOND BUFFER
static SLObjectItf buffer_obj_mainBeat_2 = NULL;
static SLPlayItf buffer_itf_mainBeat_2;
static SLAndroidSimpleBufferQueueItf buf_q_mainBeat_2;
// THIRD BUFFER
static SLObjectItf buffer_obj_mainBeat_3 = NULL;
static SLPlayItf buffer_itf_mainBeat_3;
static SLAndroidSimpleBufferQueueItf buf_q_mainBeat_3;
然后,我还定义了所需的播放器界面等......
在Java代码中,我循环播放每个定义的对象:
public void playMainBeat {
switch (mainBeat_buf_counter) {
case 1:
setPlayStateMainBeat1(true); // play this sound
setPlayStateMainBeat2(false); // stop next bufQ if not done and rewind
mainBeat_buf_counter = 2;
break;
case 2:
setPlayStateMainBeat2(true);
setPlayStateMainBeat3(false);
mainBeat_buf_counter = 3;
break;
case 3:
setPlayStateMainBeat3(true);
setPlayStateMainBeat1(false);
mainBeat_buf_counter = 1;
break;
}
}
我正在播放的每个声音样本大约是300毫秒。当我循环播放序列时,我不想在播放下一个声音时停止一个声音。请注意,我在开始第3个声音后停止了第1个声音。然后循环再次从顶部开始。 Java代码中的循环类似于以下代码:
mainBeat_buf_counter = 1; // initialize counter
while (hasStarted){
playMainBeat();
try {
Thread.sleep(soundInterval);
} catch (InterruptedException e) {; }
}
这一切都很有效,直到API23(Marshmallow)。棉花糖不会播放所有缓冲区。它根本无法发挥。声音不规则。
我找不到任何关于Android for OpenSL ES支持的对象数量的文档。但是,如果我将对象数量减少到7,它就不会跳过声音。但是,减少的缓冲区数量不足以满足我的应用需求。我怀疑在API23上支持的对象数量从11个对象减少到7个对象。
任何人都可以确认Android支持的对象数量吗?或者,也许我说这一切都错了,还有更好的方法吗?
谢谢,