Marshmallow中支持的OpenSL AudioBuffers的Andrioid#(API23)

时间:2016-07-20 21:57:54

标签: audio android-ndk opensl

我有一个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支持的对象数量吗?或者,也许我说这一切都错了,还有更好的方法吗?

谢谢,

0 个答案:

没有答案