以åã«OpenALã«ã€ããŠæžããŸãã ã åå¿zagayevskiy ã¯ã åŸã«OpenSL ESã«é¢ããè¯ãèšäºãæžããŸãã ã ç§ãã¡ã®ã²ãŒã ã®1ã€ã§ã¯ããµãŠã³ããæäœããããã®ãã¹ãŠã®ã³ãŒããæžãçŽããªãããã«ãOpenSL ESïŒAndroidã®ããŒãã䜿çšïŒã®ãã¹ãŠãæžãçŽããŸããã§ããã ã²ãŒã ã§ã¯å€ãã®ãµãŠã³ãã䜿çšãããŠããªãã£ããããOpenALã«åé¡ã¯ãããŸããã§ããã ããããååã®ã²ãŒã ã§ã¯ãå€ãã®ãµãŠã³ãã䜿çšãïŒã²ãŒã ã®è©³çŽ°ãç§ãã¡ã«çŸ©åã課ããŠããŸããïŒãããã§å€§ããªåé¡ã«çŽé¢ããŸããïŒãã¬ã€ã®é 延-å°ããæ¹ïŒã OpenSL ESã®ãã¹ãŠãæžãçŽãããšã«ããŸãã ã ãããè¡ãããã«ãæ¢ã«è©±ããã©ãããŒãããã€ãæžããŸããã ãããããã§å ±æããããšã«ããŸããã誰ãã圹ã«ç«ã€ãããããŸããã
- OpenSL ESã®ç°¡åãªèª¬æ ã
- ãªãŒãã£ãªã³ã³ãã³ã ã
- ã©ãããŒã«ã€ããŠå°ã ã
- ãªããžã§ã¯ããæ±ãåå ã
- ã©ã€ãã©ãªïŒã³ã³ããã¹ãïŒã®åæå ã
- ãµãŠã³ããæäœããŸãã
- PCMåç ã
- å§çž®åœ¢åŒãåçããŸã ã
- ãããã«
- è¿œå ããŸãã æ å ± ã
OpenSL ESç°¡åãªèª¬æ
ãã®ããšã¯ãAndroid API 9ïŒAndroid 2.3ïŒä»¥éã§å©çšå¯èœã§ãã äžéšã®æ©èœã¯ãAndroid API 14ïŒAndroid 4.0ïŒä»¥éã§ã®ã¿äœ¿çšã§ããŸãã OpenSL ESã¯ãC ++ããåŒã³åºãããšãã§ããCèšèªã€ã³ã¿ãŒãã§ã€ã¹ãæäŸãããµãŠã³ããæäœããããã®Android Java APIã®äžéšãšåãæ©èœãæäŸããŸãã泚 ïŒOpenSL ESã«åºã¥ããŠããŸããããã®APIã¯OpenSL ES 1.0.1ã®ãããã¡ã€ã«ã®å®å šãªå®è£ ã§ã¯ãããŸããã
Libaã¯ãæ³åã®ãšãããçŽç²ãªCã§èšè¿°ãããŠããŸãããããã£ãŠãå®å šãªOOPã¯ãããŸããã ç¹å¥ãªæ§é ã䜿çšãããŸãïŒç䌌ãªããžã§ã¯ãæåæ§é ïŒ:)ãšåŒã³ãŸããããããã¯ãæ§é ãžã®ãã€ã³ã¿ãŒãæåã®åŒæ°ãšããŠåãé¢æ°ãžã®ãã€ã³ã¿ãŒãå«ãéåžžã®Cæ§é ã§ããC++ã§ã¯ãã®ããã«ãªããŸãããæ瀺çã«ã ESã¯2çš®é¡ã®æ§é ã§ãã
- ãªããžã§ã¯ã ïŒ
SLObjectItf
ïŒã¯ãç¹å®ã®ç¯å²ã®ã¿ã¹ã¯ãå®è¡ãããããã®ãªãœãŒã¹ã«é¢ããæ å ±ãä¿åããããã«èšèšãããäžé£ã®ãªãœãŒã¹ã®æœè±¡åã§ãã ãªããžã§ã¯ããäœæãããšããã®ã¿ã€ãã決å®ãããŸããããã«ããããã«ãã䜿çšããŠè§£æ±ºã§ããã¿ã¹ã¯ã®ç¯å²ã決å®ãããŸãã - ã€ã³ã¿ãŒãã§ã€ã¹ ïŒ
SLEngineItf
ãSLSeekItf
ãªã©ïŒã¯ãç¹å®ã®ãªããžã§ã¯ãã«ãã£ãŠæäŸãããäžé£ã®çžäºã«é¢é£ããæ©èœã®æœè±¡åã§ãã ã€ã³ã¿ãŒãã§ã€ã¹ã«ã¯ããªããžã§ã¯ãã«å¯ŸããŠã¢ã¯ã·ã§ã³ãå®è¡ããããã«äœ¿çšãããå€ãã®ã¡ãœãããå«ãŸããŠããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ã¯ããã®ã€ã³ã¿ãŒãã§ã€ã¹ã§ãµããŒããããã¡ãœããã®æ£ç¢ºãªãªã¹ããå®çŸ©ããã¿ã€ãã§ãã ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã®ã¿ã€ããåç §ããããã«ã³ãŒãã§äœ¿çšã§ããèå¥åã«ãã£ãŠå®çŸ©ãããŸãïŒããšãã°ãSL_IID_VOLUME, SL_IID_SEEK
ïŒã ã€ã³ã¿ãŒãã§ã€ã¹ã®ãã¹ãŠã®å®æ°ãšååã¯éåžžã«æçœãªã®ã§ãç¹å¥ãªåé¡ã¯ãããŸããã
èŠçŽãããšããªããžã§ã¯ãã¯ãªãœãŒã¹ã®å²ãåœãŠãšã€ã³ã¿ãŒãã§ãŒã¹ã®ååŸã«äœ¿çšãããŸãã ãããŠããããã®ã€ã³ã¿ãŒãã§ã€ã¹ã®å©ããåããŠåããŠãªããžã§ã¯ããæäœããŸãã 1ã€ã®ãªããžã§ã¯ãã«è€æ°ã®ã€ã³ã¿ãŒãã§ã€ã¹ãèšå®ã§ããŸãïŒããªã¥ãŒã ã®å€æŽãäœçœ®ã®å€æŽãªã©ïŒã ããã€ã¹ïŒãŸãã¯ãªããžã§ã¯ãã®çš®é¡ïŒã«ãã£ãŠã¯ãäžéšã®ã€ã³ã¿ãŒãã§ã€ã¹ãå©çšã§ããªãå ŽåããããŸãã
SLDataLocator_AndroidFD
ã䜿çšããŠã¢ã»ãããã£ã¬ã¯ããªãããªãŒãã£ãªãã¹ããªãŒãã³ã°ã§ããããšãäºåã«èª¬æããŸã
SLDataLocator_AndroidFD
ã¯ããã©ãã¯äžã®äœçœ®ã移åããããã®ã€ã³ã¿ãŒãã§ãŒã¹ããµããŒãããŠããŸãã åæã«ããã¡ã€ã«å šäœããããã¡ãŒã«ããŒããïŒ
SLDataLocator_AndroidFD
ã䜿çšïŒãæ¢ã«ããããåçããããšãã§ããŸãã ãã ãããã®ãªããžã§ã¯ãã¯
SL_IID_SEEK
ã€ã³ã¿ãŒãã§ã€ã¹ããµããŒãããŠããªãããããã©ãã¯å ã移åããŠãæ©èœããŸãã= /
é³å£°ã³ã³ãã³ã
ãªãŒãã£ãªã³ã³ãã³ããã¢ããªã±ãŒã·ã§ã³ã«ããã¯ããæ¹æ³ã¯å€æ°ãããŸãã- ãªãœãŒã¹ res / raw /ãã£ã¬ã¯ããªã«ãªãŒãã£ãªãã¡ã€ã«ãé 眮ãããšã ãªãœãŒã¹ã®APIã䜿çšããŠç°¡åã«ã¢ã¯ã»ã¹ã§ããŸãã ãã ãããããã®ãªãœãŒã¹ãžã®çŽæ¥ã®ãã€ãã£ãã¢ã¯ã»ã¹ã¯ãªããããJavaã³ãŒãããã³ããŒããå¿ èŠããããŸãã
- è³ç£ ã¢ã»ãã/ãã£ã¬ã¯ããªã«ãªãŒãã£ãªãã¡ã€ã«ãé 眮ããããšã«ããããã€ãã£ããããŒãžã£ãŒã䜿çšããŠC ++ãããããã«ã¢ã¯ã»ã¹ã§ããŸãã 詳现ã«ã€ããŠã¯ã android / asset_manager.hããã³android / asset_manager_jni.hããããŒãåç §ããŠãã ããã
- ãããã¯ãŒã¯ ã URIããŒã¿ãã±ãŒã¿ãŒã䜿çšããŠããããã¯ãŒã¯ããçŽæ¥ãªãŒãã£ãªãåçã§ããŸãã ããã«å¿ èŠãªèš±å¯ãå¿ããªãã§ãã ããïŒïŒ
- ããŒã«ã«ãã¡ã€ã«ã·ã¹ãã ã URIããŒã¿ãã±ãŒã¿ãŒã¯ãããŒã«ã«ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ããããã®fileïŒã¹ããŒã ããµããŒãããŸãããã ãããã¡ã€ã«ãã¢ããªã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ã§ããå ŽåïŒã€ãŸããå¥ã®ã¢ããªã±ãŒã·ã§ã³ã®å éšã¹ãã¬ãŒãžããã®ãã¡ã€ã«ã®èªã¿åãã¯å€±æããŸãïŒã Androidã§ã¯ãLinuxãŠãŒã¶ãŒIDããã³ã°ã«ãŒãIDã¡ã«ããºã ã䜿çšããŠãã¡ã€ã«ãžã®ã¢ã¯ã»ã¹ãå¶éãããŠããããšã«æ³šæããŠãã ããã
- èšé²ããŸãã ã¢ããªã±ãŒã·ã§ã³ã¯ããã€ã¯ãããªãŒãã£ãªãé²é³ããã³ã³ãã³ããä¿åããŠãåŸã§åçã§ããŸãã
- ã€ã³ã©ã€ã³ã§ã³ã³ãã€ã«ããã³ãªã³ã¯ãããŸã ã ãªãŒãã£ãªã³ã³ãã³ããã©ã€ãã©ãªã«çŽæ¥ããã·ã¥ããŠããããããã¡ãŒãã¥ãŒããŒã¿ãã±ãŒã¿ãŒã§åçã§ããŸãã ããã¯ãPCM圢åŒã®çãæ²ã«éåžžã«é©ããŠããŸãã PCMããŒã¿ã¯ãbin2cããŒã«ã䜿çšããŠ16é²æååã«å€æãããŸãã
- ãªã¢ã«ã¿ã€ã çæ ã ã¢ããªã±ãŒã·ã§ã³ã¯ããªã³ã¶ãã©ã€ã§PCMããŒã¿ãçæïŒåæïŒãããããã¡ãŒãã¥ãŒããŒã¿ãã±ãŒã¿ãŒã䜿çšããŠåçã§ããŸãã
ã©ãããŒã«ã€ããŠå°ã
ç§ã¯äžè¬çã«OOPã®ãã¡ã³ãªã®ã§ãäœããã®æ¹æ³ã§Cã¡ãœããã®ç¹å®ã®æ©èœãã°ã«ãŒãåãããããã¯ã©ã¹ã§ã©ããããŠãå°æ¥çã«äœæ¥ããããããããã«ããŠããŸãã OpenALã§ãããè¡ã£ãæ¹æ³ãšã®é¡æšã«ãããã¯ã©ã¹ãç»å ŽããŸããã-
OSLContext
圌ã¯ãã©ã€ãã©ãªãåæåããå¿ èŠãªãããã¡ãã€ã³ã¹ã¿ã³ã¹åãã責任ããããŸãã -
OSLSound
ãµãŠã³ããæäœããããã®åºæ¬ã¯ã©ã¹ã -
OSLWav
WAVãæäœããããã®ã¯ã©ã¹ã OSLSoundããç¶æ¿ããŠãæäœçšã®å ±éã€ã³ã¿ãŒãã§ã€ã¹ãç¶æããŸãã oggã䜿çšããã«ã¯ãOpenALã§è¡ã£ãããã«OSLOggã¯ã©ã¹ãäœæã§ããŸãã ãããã®åœ¢åŒã§ã¯ããŠã³ããŒãããã»ã¹ãæ ¹æ¬çã«ç°ãªãããããã®ãããªåºå¥ãããŸããã WAVã¯ããããªåœ¢åŒã§ãããã«ãã€ããèªã¿èŸŒãã®ã«ååã§ããoggã¯Ogg Vorbisã䜿çšããŠè§£åããå¿ èŠããããŸãããmp3ïŒïŒ -
OSLMp3
Mp3ãæäœããããã®ã¯ã©ã¹ã OSLSoundããç¶æ¿ããŠãæäœçšã®å ±éã€ã³ã¿ãŒãã§ã€ã¹ãç¶æããŸãã mp3ãã¹ããªãŒãã³ã°ããã®ã§ããã®ã¯ã©ã¹ã¯ç§ã«ã¯ããŸã圹ã«ç«ããªãã ããããã©ã¡ãªã©ã䜿çšããŠmp3ããã³ãŒãããå Žåã¯ãloadïŒchar * filenameïŒã¡ãœããã§ãã³ãŒããå®è£ ããBufferPlayerã䜿çšã§ããŸãã -
OSLPlayer
å®éã«ã¯ããµãŠã³ããæäœããããã®ã¡ã€ã³ã¯ã©ã¹ã§ãã å®éã®ãšãããOpenSL ESã®äœæ¥ã¡ã«ããºã ã¯OpenALãšã¯ç°ãªããŸãã OpenALã«ã¯ããããã¡ãŒãšé³æºïŒãããã¡ãŒãæããïŒã®ããã®ç¹å¥ãªæ§é ããããŸãã OpenSL ESã§ã¯ããã¹ãŠãç°ãªããã¬ã€ã€ãŒãäžå¿ã«å±éããŸãã -
OSLBufferPlayer
ã ãã¡ã€ã«å šäœãã¡ã¢ãªã«ããŒãããå Žåããã®ãã¬ãŒã€ãŒã䜿çšããŸãã éåžžãçãå¹æé³ïŒã·ã§ãããççºãªã©ïŒã«äœ¿çšãããŸãã æ¢ã«è¿°ã¹ãããã«ãSL_IID_SEEK
ã€ã³ã¿ãŒãã§ãŒã¹ããµããŒãããŠããªãããããã©ãã¯å ã移åããããšã¯ã§ããŸããã -
OSLAssetPlayer
ã䜿çšãããšãassetsãã£ã¬ã¯ããªããã¹ããªãŒãã³ã°ã§ããŸãïŒã€ãŸãããã¡ã€ã«å šäœãã¡ã¢ãªã«ããŒãããŸããïŒã é·ããã©ãã¯ïŒããã¯ã°ã©ãŠã³ããã¥ãŒãžãã¯ãªã©ïŒãåçããããã«äœ¿çšããŸãã
ãªããžã§ã¯ããæ±ãåå
ãªããžã§ã¯ããæäœãããµã€ã¯ã«å šäœã¯æ¬¡ã®ãããªãã®ã§ãã- ç®çã®ã€ã³ã¿ãŒãã§ã€ã¹ãæå®ããŠãªããžã§ã¯ããååŸããŸãã
-
(*obj)->Realize(obj, async)
åŒã³åºããŠå®è£ ããŸãã -
(*obj)-> GetInterface (obj, ID, &itf)
åŒã³åºããŠãå¿ èŠãªã€ã³ã¿ãŒãã§ã€ã¹ãååŸããŸã - ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠäœæ¥ããŸãã
- ãªããžã§ã¯ããåé€ãã
(*obj)->Destroy(obj)
åŒã³åºããŠäœ¿çšãããªãœãŒã¹ãã¯ãªãŒã³ã¢ããããŸãã
ã©ã€ãã©ãªãŒã®åæåïŒã³ã³ããã¹ãïŒ
ãŸãããã©ã°lOpenSLESãjniãã£ã¬ã¯ããªã®Android.mkãã¡ã€ã«ã®LOCAL_LDLIBSã»ã¯ã·ã§ã³ã«è¿œå ããŸãïŒLOCAL_LDLIBS += -lOpenSLES
ãš2ã€ã®ããããŒãã¡ã€ã«ãæ¥ç¶ããŸãã
#include <SLES/OpenSLES.h> #include <SLES/OpenSLES_Android.h>
次ã«ã
slCreateEngine
ã¡ãœããã䜿çšããŠãã©ã€ãã©ãªïŒOpenALã®ã³ã³ããã¹ãã«äŒŒããã®ïŒã
slCreateEngine
ãããªããžã§ã¯ããäœæããå¿ èŠããããŸãã çµæã®ãªããžã§ã¯ãã¯ãOpenSL ES APIã«ã¢ã¯ã»ã¹ããããã®äžå¿çãªãªããžã§ã¯ãã«ãªããŸãã 次ã«ã
Realize
ã¡ãœããã䜿çšããŠãªããžã§ã¯ããåæåããŸãã
result = slCreateEngine(&engineObj, //pointer to object 0, // count of elements is array of additional options NULL, // array of additional options lEngineMixIIDCount, // interface count lEngineMixIIDs, // array of interface ids lEngineMixReqs); if (result != SL_RESULT_SUCCESS ) { LOGE("Error after slCreateEngine"); return; } result = (*engineObj)->Realize(engineObj, SL_BOOLEAN_FALSE ); if (result != SL_RESULT_SUCCESS ) { LOGE("Error after Realize"); return; }
次ã«ã
SL_IID_ENGINE
ã€ã³ã¿ãŒãã§ã€ã¹ãååŸããå¿ èŠããããŸãã
SL_IID_ENGINE
ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠãã¹ããŒã«ãŒãžã®ã¢ã¯ã»ã¹ããµãŠã³ãã®åçãªã©ãå¯èœã«ãªããŸãã
result = (*engineObj)->GetInterface(engineObj, SL_IID_ENGINE, &engine); if (result != SL_RESULT_SUCCESS ) { LOGE("Error after GetInterface"); return; }
CreateOutputMix
ã¡ãœããã䜿çšããŠã¹ããŒã«ãŒãæäœããããã«OutputMixãªããžã§ã¯ããååŸããŠåæåããããšã¯æ®ããŸãã
result = (*engine)->CreateOutputMix(engine, &outputMixObj, lOutputMixIIDCount, lOutputMixIIDs, lOutputMixReqs); if(result != SL_RESULT_SUCCESS){ LOGE("Error after CreateOutputMix"); return; } result = (*outputMixObj)->Realize(outputMixObj, SL_BOOLEAN_FALSE); if(result != SL_RESULT_SUCCESS){ LOGE("Error after Realize"); return; }
OSLContext
ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã§ã¡ã€ã³ãªããžã§ã¯ããåæåããããšã«å ããŠãå¿ èŠãªãã¹ãŠã®ãã¬ãŒã€ãŒã®åæåãè¡ãããŸãã ãã¬ãŒã€ãŒã®æ倧æ°ã¯å¶éãããŠããŸãã 20åãŸã§äœæããããšããå§ãããŸãã
void OSLContext::initPlayers(){ for(int i = 0; i< MAX_ASSET_PLAYERS_COUNT; ++i) assetPlayers[i] = new OSLAssetPlayer(this); for(int i = 0; i< MAX_BUF_PLAYERS_COUNT; ++i) bufPlayers[i] = new OSLBufferPlayer(this); }
é³ãæ±ã
å®éããµãŠã³ãã®çš®é¡ã¯2ã€ã®ã«ããŽãªã«åããããšãã§ããŸããWAVãšå§çž®åœ¢åŒïŒmp3ãoggãªã©ïŒã«å«ãŸããã¯ãªãŒã³ïŒå§çž®ããŒã¿ã§ã¯ãªãïŒPCMã§ãã Mp3ãšoggããã³ãŒãããŠããã¹ãŠåãéå§çž®PCMãªãŒãã£ãªããŒã¿ãååŸã§ããŸãã PCMã§ã®äœæ¥ã«ã¯ãBufferPlayerã䜿çšããŸãã å§çž®ãããAssetPlayer圢åŒã®å Žåããã¡ã€ã«ã®ãã³ãŒãã«ã¯ããªãã®è²»çšããããããã§ãã mp3ã䜿çšããå Žåãå€ãæºåž¯é»è©±ã§ããŒããŠã§ã¢ããã³ãŒãããããšã¯ã§ããŸããããµãŒãããŒãã£ã®ãœãããŠã§ã¢ãœãªã¥ãŒã·ã§ã³ã®å©ããåããŠããã³ãŒãã«ã¯æ°åç§ä»¥äžããããŸãããããã¯åãå ¥ããããŸããã ããã«ããã®ãããªPCMããŒã¿ã¯éåžžã«éããªããŸããã¡ãœãããåŒã³åºããããšãplayerïŒïŒã¯ã³ã³ããã¹ãïŒ
OSLContext
ïŒããç¡æã®ãã¬ãŒã€ãŒãèŠæ±ããŸãã ãµãŠã³ãã®ã«ãŒããå¿ èŠãªå Žåã¯
OSLAssetPlayer
ãååŸããããã§ãªãå Žåã¯
OSLBufferPlayer
ãååŸããŸãã
PCMãã¬ã€
ç§ã¯åã³WAVèªäœãèªãããšã«ã€ããŠã¯æžããŸãããããã«ã€ããŠã¯OpenALã«é¢ããèšäºã§èŠãããšãã§ããŸãã åãèšäºã§ãåä¿¡ããPCMããŒã¿ã䜿çšããŠBufferPlayerãäœæããæ¹æ³ã説æããŸãã PCMçšã®BufferPlayerã®åæå
locatorBufferQueue.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE; locatorBufferQueue.numBuffers = 16; // , SLDataFormat_PCM formatPCM; formatPCM.formatType = SL_DATAFORMAT_PCM; formatPCM.numChannels = 2; formatPCM.samplesPerSec = SL_SAMPLINGRATE_44_1;// header.samplesPerSec*1000; formatPCM.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16 ;//header.bitsPerSample; formatPCM.containerSize = SL_PCMSAMPLEFORMAT_FIXED_16;// header.fmtSize; formatPCM.channelMask = SL_SPEAKER_FRONT_LEFT|SL_SPEAKER_FRONT_RIGHT ; formatPCM.endianness = SL_BYTEORDER_LITTLEENDIAN; audioSrc.pLocator = &locatorBufferQueue; audioSrc.pFormat = &formatPCM; locatorOutMix.locatorType = SL_DATALOCATOR_OUTPUTMIX; locatorOutMix.outputMix = context->getOutputMixObject(); audioSnk.pLocator = &locatorOutMix; audioSnk.pFormat = NULL; // const SLInterfaceID ids[2] = {SL_IID_ANDROIDSIMPLEBUFFERQUEUE,/*SL_IID_MUTESOLO,*/ /*SL_IID_EFFECTSEND,SL_IID_SEEK,*/ /*SL_IID_MUTESOLO,*/ SL_IID_VOLUME}; const SLboolean req[2] = {SL_BOOLEAN_TRUE,SL_BOOLEAN_TRUE}; result = (*context->getEngine())->CreateAudioPlayer(context->getEngine(), &playerObj, &audioSrc, &audioSnk,2, ids, req); assert(SL_RESULT_SUCCESS == result); result = (*playerObj)->Realize(playerObj, SL_BOOLEAN_FALSE ); assert(SL_RESULT_SUCCESS == result); if (result != SL_RESULT_SUCCESS ) { LOGE("Can not CreateAudioPlayer %d", result); playerObj = NULL; } // result = (*playerObj)->GetInterface(playerObj, SL_IID_PLAY, &player); assert(SL_RESULT_SUCCESS == result); // result = (*playerObj)->GetInterface(playerObj, SL_IID_VOLUME, &fdPlayerVolume); assert(SL_RESULT_SUCCESS == result); result = (*playerObj)->GetInterface(playerObj, SL_IID_ANDROIDSIMPLEBUFFERQUEUE, &bufferQueue); assert(SL_RESULT_SUCCESS == result);
äžè¬çã«ãè€éãªããšã¯äœããããŸããã ããã¯ãã 倧ããªåé¡ã§ãã
SLDataFormat_PCM
ã®æ§é ã«æ³šæããŠ
SLDataFormat_PCM
ã WAVãã¡ã€ã«ã®ããããŒããèªã¿åãããèªåã§ãã©ã¡ãŒã¿ãŒãæ瀺çã«å ¥åããã®ã¯ãªãã§ããïŒ ç§ã¯ãã¹ãŠã®WAVãã¡ã€ã«ãåäžã®åœ¢åŒãã€ãŸã åããã£ã³ãã«æ°ãåšæ³¢æ°ããããã¬ãŒããªã© å®éã«ã¯ããããã¡ãäœæãããã©ã¡ãŒã¿ã§2ã€ã®ãã£ãã«ãæå®ãã1ã€ã®ãã£ãã«ã§ãã©ãã¯ãåçããããšãããšãã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããŸãã å¯äžã®ãªãã·ã§ã³ã¯ããã¡ã€ã«ã®åœ¢åŒãç°ãªãå Žåããããã¡å šäœãååæåããããšã§ãã ããããå šäœã®é åã¯ããã¬ãŒã€ãŒã1ååæåããŠããããã®ãããã¡ãŒãå€æŽããã ãã§ãã ãããã£ãŠã2ã€ã®ãªãã·ã§ã³ããããŸããç°ãªããã©ã¡ãŒã¿ãŒãæã€è€æ°ã®ãã¬ãŒã€ãŒãäœæãããããã¹ãŠã®.wavãã¡ã€ã«ãåã圢åŒã«ãããã§ãã ãŸãããŸãã¯æ¯åãããã¡ãååæåãã-_-
ããªã¥ãŒã çšã®ã€ã³ã¿ãŒãã§ã€ã¹ã«å ããŠã2ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ããããŸãã
- ãã£ãã«ç®¡ççšã®
SL_IID_MUTESOLO
ïŒãã«ããã£ãã«ãªãŒãã£ãªã®ã¿ã®å Žåãããã¯SLDataFormat_PCMæ§é äœã®numChannelsãã£ãŒã«ãã«ç€ºãããŸãïŒã -
SL_IID_EFFECTSEND
ãã¹ãŒããŒã€ã³ããŒãºå¹æïŒä»æ§ã«ãã-ãªããŒãå¹æã®ã¿ïŒã
ãã¬ãŒã€ãŒãéžæããŠãµãŠã³ããã€ã³ã¹ããŒã«ãããšãã«ãã¥ãŒã«ãµãŠã³ããè¿œå ããïŒ
void OSLBufferPlayer::setSound(OSLSound * sound){ if(bufferQueue == NULL) LOGD("bufferQueue is null"); this->sound = sound; (*bufferQueue)->Clear(bufferQueue); (*bufferQueue)->Enqueue(bufferQueue, sound->getBuffer() , sound->getSize()); }
å§çž®åœ¢åŒãåçãã
WAVã§ã¯ããã¹ãŠã®ãµãŠã³ããä¿åããããšã¯ãªãã·ã§ã³ã§ã¯ãããŸããã ãŸãããã¡ã€ã«èªäœãå€ãã®ã¹ããŒã¹ãå æããããã§ã¯ãªãïŒãããïŒãã¡ã¢ãªã«ããŒãããã ãã§ã¯ããã®ããã®RAMãååã«ãããŸããïŒïŒå圢åŒã®ã¯ã©ã¹ãäœæããå°æ¥ãå¿ èŠã«å¿ããŠãããã®ãã³ãŒãã®äžéšãäœæããŸãã mp3ã«ã¯ã
OSLMp3
ã¯ã©ã¹ããããŸããå®éã«ã¯ãå°æ¥ãã¬ãŒã€ãŒã«ã€ã³ã¹ããŒã«ããããã«ãã¡ã€ã«åã®ã¿ãä¿åããŸãã åãããšãoggããã®ä»ã®ãµããŒããããŠãã圢åŒã§ãå¯èœã§ãã
åæåã®å®å šãªæ¹æ³ãã³ã¡ã³ãã®èª¬æãããŸãã
å§çž®åœ¢åŒã§äœæ¥ããããã®AssetPlayerã®åæå
void OSLAssetPlayer::init(char * filename){ SLresult result; AAsset* asset = AAssetManager_open(mgr, filename, AASSET_MODE_UNKNOWN); if (NULL == asset) { return JNI_FALSE; } // off_t start, length; int fd = AAsset_openFileDescriptor(asset, &start, &length); assert(0 <= fd); AAsset_close(asset); // SLDataLocator_AndroidFD loc_fd = {SL_DATALOCATOR_ANDROIDFD, fd, start, length}; SLDataFormat_MIME format_mime = {SL_DATAFORMAT_MIME, NULL, SL_CONTAINERTYPE_UNSPECIFIED}; SLDataSource audioSrc = {&loc_fd, &format_mime}; SLDataLocator_OutputMix loc_outmix = {SL_DATALOCATOR_OUTPUTMIX, context->getOutputMixObject()}; SLDataSink audioSnk = {&loc_outmix, NULL}; // const SLInterfaceID ids[3] = {SL_IID_SEEK, SL_IID_MUTESOLO, SL_IID_VOLUME}; const SLboolean req[3] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE}; result = (*context->getEngine())->CreateAudioPlayer(context->getEngine(), &playerObj, &audioSrc, &audioSnk, 3, ids, req); assert(SL_RESULT_SUCCESS == result); // result = (*playerObj)->Realize(playerObj, SL_BOOLEAN_FALSE); assert(SL_RESULT_SUCCESS == result); // result = (*playerObj)->GetInterface(playerObj, SL_IID_PLAY, &player); assert(SL_RESULT_SUCCESS == result); // result = (*playerObj)->GetInterface(playerObj, SL_IID_SEEK, &fdPlayerSeek); assert(SL_RESULT_SUCCESS == result); // result = (*playerObj)->GetInterface(playerObj, SL_IID_MUTESOLO, &fdPlayerMuteSolo); assert(SL_RESULT_SUCCESS == result); // result = (*playerObj)->GetInterface(playerObj, SL_IID_VOLUME, &fdPlayerVolume); assert(SL_RESULT_SUCCESS == result); // result = (*fdPlayerSeek)->SetLoop(fdPlayerSeek, sound->isLooping() ? SL_BOOLEAN_TRUE : SL_BOOLEAN_FALSE, 0, SL_TIME_UNKNOWN); assert(SL_RESULT_SUCCESS == result); // return JNI_TRUE; }
ãããã«
OpenSL ESã®åŠç¿ã¯éåžžã«ç°¡åã§ãã ãŸãã圌ã«ã¯å€ãã®æ©äŒããããŸãïŒããšãã°ããªãŒãã£ãªãé²é³ã§ããŸãïŒã ã¯ãã¹ãã©ãããã©ãŒã ã®åé¡ãããã®ã¯æ®å¿µã§ãã OpenALã¯ã¯ãã¹ãã©ãããã©ãŒã ã§ãããAndroidã§ã¯ããŸãããŸãåäœããŸããã OpenSLã«ã¯ããã€ãã®ãã€ãã¹ç¹ãã³ãŒã«ããã¯ã®å¥åŠãªåäœããã¹ãŠã®ä»æ§æ©èœããµããŒããããŠããããã§ã¯ãããŸããã ããããäžè¬çã«ãå®è£ ã®å®¹æããšå®å®ããéçšã¯ãããã®æ¬ ç¹ãã«ããŒããŸãããœãŒã¹ã¯github.comã§ååŸã§ããŸã
è¿œå ããŸãã ã€ã³ãã¡
ãããã¯ã«é¢ããèå³æ·±ãèªæžïŒ
- éçºè ã®ãµã€ãã«ããåã蟌ã¿ãªãŒãã£ãªã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã®æšæº ã
- ã¯ããã¹ã°ã«ãŒãæ ªåŒäŒç€Ÿ OpenSL ESä»æ§ ã
- Android NDKã C / C ++ã§ã®Androidåãã®ã¢ããªã±ãŒã·ã§ã³éçºã
- GG vorbis