我正在开发一个使用OpenSL for Android的项目,我遇到了一个问题。 在下面这种情况下,在极少数情况下将跳过入队的波形数据。
SLObjectItf mpSLPlayerObject;
SLPlayItf mpPlayItf;
SLAndroidSimpleBufferQueueItf mpBufferQueueItf;
(*mpSLPlayerObject)->GetInterface(mpSLPlayerObject, SL_IID_PLAY, &mpPlayItf);
(*mpSLPlayerObject)->GetInterface(mpSLPlayerObject, SL_IID_BUFFERQUEUE, &mpBufferQueueItf);
(*mpPlayItf)->SetPlayState(mpPlayItf, SL_PLAYSTATE_PLAYING);
(*mpBufferQueueItf)->Enqueue(mpBufferQueueItf, pBuffer, bufferSize);
mpPlayItf的状态将更改为SL_PLAYSTATE_PLAYING,并且数据已成功排入队列。
但是,mpBufferQueueItf中的数据永久保留,mpPlayItf的状态不会改变。
但是,在以下情况中
SLObjectItf mpSLPlayerObject;
SLPlayItf mpPlayItf;
SLAndroidSimpleBufferQueueItf mpBufferQueueItf;
(*mpSLPlayerObject)->GetInterface(mpSLPlayerObject, SL_IID_PLAY, &mpPlayItf);
(*mpSLPlayerObject)->GetInterface(mpSLPlayerObject, SL_IID_BUFFERQUEUE, &mpBufferQueueItf);
(*mpBufferQueueItf)->Enqueue(mpBufferQueueItf, pBuffer, bufferSize);
(*mpPlayItf)->SetPlayState(mpPlayItf, SL_PLAYSTATE_PLAYING);
当我为Enqueue和SetPlayState交换两条线时,所有波形数据都将完美播放。
我在下面的3设备上遇到了这个问题。
Nexus 5X Android 6.0
Xperia X Performance Android 7.0
Xperia Z4 Android 5.0
可能有更多设备遇到同样的问题,但我不知道 这是一个错误,还是我必须在设置播放状态之前将数据排入队列? 有没有人和我面临同样的问题?