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
Post a Comment