排队的声音数据未在Android上使用OpenSL播放

排队的声音数据未在Android上使用OpenSL播放,android,opensl,Android,Opensl,我正在从事一个使用OpenSL for Android的项目,遇到了一个问题。 在以下情况下,很少情况下会跳过排队的波形数据 SLObjectItf mpSLPlayerObject; SLPlayItf    mpPlayItf; SLAndroidSimpleBufferQueueItf mpBufferQueueItf; (*mpSLPlayerObject)->GetInterface(mpSLPlayerObject, SL_IID_PLAY, &mpPlayItf);

我正在从事一个使用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时,所有wave数据都将完美地播放

我在下面的3台设备上遇到这个问题

Nexus 5X安卓6.0
Xperia X性能安卓7.0
Xperia Z4安卓5.0

可能有更多设备出现相同问题,但我不知道。
这是一个bug还是我必须在设置播放状态之前将数据排队?
有人和我有同样的问题吗?

您确定要在缓冲队列中使用与pcm缓冲队列播放器相同的采样和大小吗?(例如,SL_采样光栅_44_1和SL_PCMSAMPLEFORMAT_FIXED_16)。还要确保pBuffer保持有效请参见我的问题:两个缓冲区队列中的采样和大小相同。此外,我们的缓冲区仍然有效。我们确实检查了其他一些设备,它们的播放效果完美无瑕。只有某些设备遇到此问题,所以我猜主要问题是其他问题。谢谢您的回复。您确定要在缓冲队列中使用与pcm缓冲队列播放器相同的采样和大小吗?(例如,SL_采样光栅_44_1和SL_PCMSAMPLEFORMAT_FIXED_16)。还要确保pBuffer保持有效请参见我的问题:两个缓冲区队列中的采样和大小相同。此外,我们的缓冲区仍然有效。我们确实检查了其他一些设备,它们的播放效果完美无瑕。只有某些设备遇到此问题,所以我猜主要问题是其他问题。谢谢你的回复。