c++ - OpenSLES SLPlaybackRateItf SetRate not working on Android 5.x, but works on Android 4.x -


opensles slplaybackrateitf setrate works on android 4.x, not on android 5.x.

it seems if setrate interface has no implementation on android 5.x.

below code snippets, , complete code can found here: https://github.com/jimrange/cocos2d-x/blob/audioengineupdate/cocos/audio/android/audioengine-inl.cpp

slplaybackrateitf _fdplayerplaybackrate; slobjectitf _fdplayerobject; 

other initialization code not shown brevity.

// playback rate interface result = (*_fdplayerobject)->getinterface(_fdplayerobject, sl_iid_playbackrate, &_fdplayerplaybackrate); if(sl_result_success != result){ errorlog("get rate interface failed"); break; }  slpermille stepsize; sluint32 capabilities; auto rangeresult = (*_fdplayerplaybackrate)->getraterange(_fdplayerplaybackrate, 0, &_minrate, &_maxrate, &stepsize, &capabilities); if(sl_result_success != rangeresult) {      log("%s error:%u",__func__, rangeresult); } 

at point

_minrate == 500

_maxrate == 2000

stepsize == 0

capabilities == sl_rateprop_nopitchcoraudio

later when calling following, result sl_result_success, playback rate not change.

void audioengineimpl::setpitch(int audioid,float pitch) {     auto& player = _audioplayers[audioid];      slpermille playbackrate = (slpermille)1000 * pitch;      if (playbackrate < player._minrate)     {         log("warning: audioengine attempting set rate:%d lower minrate=%d.", playbackrate, player._minrate);         playbackrate = player._minrate;     }     else if (playbackrate > player._maxrate)     {         log("warning: audioengine attempting set rate:%d higher maxrate=%d.", playbackrate, player._maxrate);         playbackrate = player._maxrate;     }      // works on android 4.4.4 on nexus 7, not on android 5.x on nexus 7 or nexus 9.     auto result = (*player._fdplayerplaybackrate)->setrate(player._fdplayerplaybackrate, playbackrate);     if(sl_result_success != result)     {         log("%s error:%u",__func__, result);     } } 

here experiencing:

requesting sl_iid_playbackrate interface returns sl_result_success.

i can query interface capabilities , range of 500 2000, step size of 0 , capabilities flag of sl_rateprop_nopitchcoraudio. same on android 4.x , 5.x.

so interface telling me setup , ready go.

calling setrate returns sl_result_success on android 4.x , android 5.x.

but on 5.x setrate not have effect on audio.

there post suggests using sl_rateprop_pitchcoraudio, want use sl_rateprop_nopitchcoraudio there no pitch correction when changing rate of audio. , sl_rateprop_nopitchcoraudio default setting, no need change that.

from opensl_es_specification_1.0.1.pdf:

sl_rateprop_nopitchcoraudio - plays audio @ current rate, without pitch correction.

sl_rateprop_pitchcoraudio - plays audio @ current rate, pitch correction.

i working on code expand cocos2d-x audioengine.

the cocos2d-x version 3.7rc0 , ndk version ndk-r10d.


Comments