{"id":176559,"date":"2013-04-13T17:43:03","date_gmt":"2013-04-13T13:43:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=176559"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=176559","title":{"rendered":"<span class=\"post_title\">\u041e\u0441\u043d\u043e\u0432\u044b Android NDK \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 OpenAL<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t\u0414\u0435\u043d\u044c \u0434\u043e\u0431\u0440\u044b\u0439, \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0435 \u0425\u0430\u0431\u0440\u0430\u044e\u0437\u0435\u0440\u044b!<\/p>\n<p>  \u0421 \u043d\u0435\u0434\u0430\u0432\u043d\u0438\u0445 \u043f\u043e\u0440 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043f\u043e\u0434 Android, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0438\u0433\u0440. \u0422\u0430\u043a \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Android ndk. \u0412\u0441\u0435 \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u0438 \u0438 \u043d\u044e\u0430\u043d\u0441\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 native \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u0440\u0435\u0448\u0438\u043b \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 ndk \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c.<br \/>  \u0410 \u0447\u0442\u043e\u0431\u044b \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u044b\u043b\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0432\u0438\u0447\u043a\u0430\u043c, \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 OpenAL \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u043c\u0438 WAV, OGG.<\/p>\n<p>  <a name=\"habracut\"><\/a><\/p>\n<h4>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h4>\n<p>  \u041f\u0440\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u0441\u0440\u0435\u0434\u044b \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043d\u0435 \u0441\u0442\u043e\u0438\u0442, \u043a\u0430\u043a \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f. \u041d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0442\u043e\u0433\u043e, \u0432 \u043a\u0430\u043a\u043e\u0439 \u0441\u0440\u0435\u0434\u0435 \u0432\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0435 (Eclipse, IntelliJ IDEA \u0438 \u0442.\u0434.), \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f.  <\/p>\n<ol>\n<li>\u0421\u0430\u043c <a href=\"http:\/\/developer.android.com\/sdk\/ndk\/index.html\">Android NDK<\/a>.<\/li>\n<li>\u0414\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u043e\u0434 WIn \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f <a href=\"http:\/\/www.cygwin.com\/\">Cygwin <\/a>.<\/li>\n<li>\u041f\u043b\u0430\u0433\u0438\u043d\u044b, \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0436\u0435 Eclipse: <a href=\"http:\/\/download.eclipse.org\/tools\/cdt\/releases\/indigo\/\">CDT<\/a>. <\/li>\n<\/ol>\n<p>  \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0442\u043e\u044f\u0442\u044c ADT, JDK.<\/p>\n<h5>\u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d NDK?<\/h5>\n<p>  <\/p>\n<ul>\n<li>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 OpenGL ES. \u0414\u0443\u043c\u0430\u044e, \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0442\u0435\u0445, \u043a\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 NDK, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0435\u0433\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438\u0433\u0440. <\/li>\n<li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0440\u043e\u0441\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u0433\u0440\u043e\u0432\u044b\u0445 \u0434\u0432\u0438\u0436\u043a\u043e\u0432 \u0432\u0440\u043e\u0434\u0435 Cocos2Dx<\/li>\n<li>\u0421\u0430\u043c\u044b\u0439 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u2013 \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u0430\u043c \u043d\u0430\u0434\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 C++ \u043a\u043e\u0434. \u0417\u0430 \u0434\u0435\u0441\u044f\u0442\u0438\u043b\u0435\u0442\u0438\u044f \u043d\u0430 C++ \u0443\u0436\u0435 \u043a\u0443\u0447\u0430 \u0432\u0441\u0435\u0433\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e. \u0414\u0430 \u0438 \u043d\u0435 \u0432\u0441\u0451 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c, \u0434\u0443\u043c\u0430\u044e \u0442\u043e\u0442 \u0436\u0435 openCV \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e \u0431\u044b \u0431\u044b\u043b\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c, \u0432 \u0442\u043e\u043c \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438.<\/li>\n<\/ul>\n<h4>\u0412\u044b\u0437\u043e\u0432 C++ \u043a\u043e\u0434\u0430 \u0438\u0437 Java<\/h4>\n<p>  \u0412 \u0446\u0435\u043b\u043e\u043c \u0432\u0441\u0451 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0448\u0430\u0433\u0438:  <\/p>\n<ol>\n<li>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 C++ \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430.<\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 .mk \u0444\u0430\u0439\u043b\u043e\u0432.<\/li>\n<li>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<\/li>\n<li>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 Java.<\/li>\n<\/ol>\n<p>  \u041f\u0440\u043e Makefiles(.mk) \u0440\u0430\u0441\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443. \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u043e \u043d\u0435\u0433\u043e <a href=\"http:\/\/mrbook.org\/tutorials\/make\/\">\u0442\u0443\u0442<\/a>. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435, \u043d\u0430 \u0445\u0430\u0431\u0440\u0435 \u0435\u0441\u0442\u044c <a href=\"http:\/\/habrahabr.ru\/post\/155201\/\">\u0445\u043e\u0440\u043e\u0448\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 .mk \u0444\u0430\u0439\u043b\u0430\u043c\u0438<\/a> \u043e\u0442 <a href=\"http:\/\/habrahabr.ru\/users\/bubavv\/\" class=\"user_link\">BubaVV<\/a>.<\/p>\n<p>  \u041f\u0440\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u0437 ndk \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"http:\/\/mobilepearls.com\/labs\/native-android-api\/\">\u0442\u0443\u0442<\/a>.<\/p>\n<h5>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 C++ \u0444\u0430\u0439\u043b\u043e\u0432<\/h5>\n<p>  \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u0437 Java. \u041a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043c\u0443\u0437\u044b\u043a\u0443 \u0432 OpenAL. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043c\u0435\u0442\u043e\u0434:  <\/p>\n<pre><code class=\"cpp\">JNIEXPORT void JNICALL Java_ru_suvitruf_androidndk_tutorial4_MainActivity_loadAudio(JNIEnv *pEnv, jobject pThis, jobject pNativeCallListener, jobject assetManager); <\/code><\/pre>\n<p>  \u042f \u0432\u0441\u0451 \u044d\u0442\u043e \u0440\u0443\u0447\u043a\u0430\u043c\u0438 \u043f\u0438\u0448\u0443, \u043d\u043e \u0435\u0441\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 <a href=\"http:\/\/docs.oracle.com\/javase\/6\/docs\/technotes\/tools\/solaris\/javah.html\">javah<\/a>.<\/p>\n<p>  \u0417\u0430\u0442\u0435\u043c \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u0443\u0434\u0435\u0442 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c, \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0437\u0436\u0435.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435<\/b><\/p>\n<div class=\"spoiler_text\">\u0421\u0442\u043e\u0438\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. <b>Java_<\/b> \u2013 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0435\u0444\u0438\u043a\u0441. <b>ru_suvitruf_androidndk_tutorial4<\/b>, \u0442\u0430\u043a \u043a\u0430\u043a \u0443 \u043d\u0430\u0441 \u043f\u0430\u043a\u0435\u0442 <b>ru.suvitruf.androidndk.tutorial4<\/b>, \u043d\u0443 \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u043c\u0435\u0442\u043e\u0434\u0430 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 Java. \u0412 \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0438\u043c\u0435\u0435\u0442\u0441\u044f <b>JNIEnv*<\/b> \u2014 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Java, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c Java-\u043c\u0435\u0442\u043e\u0434\u044b, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c Java-\u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u0412\u0442\u043e\u0440\u043e\u0439 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u2014 <b>jobject <\/b>\u0438\u043b\u0438 <b>jclass<\/b> \u2014 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u043c\u0435\u0442\u043e\u0434 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c. \u0415\u0441\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439, \u0442\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u0442\u0438\u043f\u0430 <b>jclass<\/b> (\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043a\u043b\u0430\u0441\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u043c\u0435\u0442\u043e\u0434), \u0435\u0441\u043b\u0438 \u043d\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u2014 <b>jobject <\/b>\u2014 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u044b\u043b \u0432\u044b\u0437\u0432\u0430\u043d \u043c\u0435\u0442\u043e\u0434.   <\/div>\n<\/div>\n<h5>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 Java<\/h5>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0435\u0451 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432 Java.  <\/p>\n<pre><code class=\"java\">static { \t\tSystem.loadLibrary(&quot;AndroidNDK&quot;); \t} <\/code><\/pre>\n<p>  \u0418 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0441 \u0442\u0435\u043c \u0436\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c, \u043a\u0430\u043a \u0438 \u0432 C++ \u043a\u043e\u0434\u0435:  <\/p>\n<pre><code class=\"cpp\">\/\/\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 native public void loadAudio(NativeCalls nativeCallListener, AssetManager mng); <\/code><\/pre>\n<p>  \u0412\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"cpp\">loadAudio(activity, activity.getResources().getAssets()); <\/code><\/pre>\n<h4>\u0412\u044b\u0437\u043e\u0432 Java \u0438\u0437 C++<\/h4>\n<p>  \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u043d\u043e \u043d\u0435 \u0432\u0441\u0451 \u0442\u0430\u043a \u0441\u0442\u0440\u0430\u0448\u043d\u043e. \u0427\u0442\u043e \u043d\u0430\u043c \u043d\u0430\u0434\u043e:   <\/p>\n<ol>\n<li>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443 \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u0435\u0442\u043e\u0434 (\u0432 Java), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0442\u0438\u043c \u0432\u044b\u0437\u0432\u0430\u0442\u044c.<\/li>\n<li>\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 (\u0432 C++).<\/li>\n<li>\u041e\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443 \u043c\u0435\u0442\u043e\u0434\u0430.<\/li>\n<li>\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043c\u0435\u0442\u043e\u0434\u0430 (\u0441\u0441\u044b\u043b\u043a\u0443).<\/li>\n<li>\u0412\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0443 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/li>\n<\/ol>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0443 \u043a\u043b\u0430\u0441\u0441\u0430, \u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b. \u0422\u043e\u0433\u0434\u0430 \u043d\u0430\u043c \u043d\u0435 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043c\u0435\u043d\u044f\u0442\u044c native \u043a\u043e\u0434, \u0435\u0441\u043b\u0438 \u0437\u0430\u0445\u043e\u0442\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c.<\/p>\n<p>  \u041a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432\u0441\u0435\u0433\u043e \u0441 \u043e\u0434\u043d\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c:  <\/p>\n<pre><code class=\"java\">public interface NativeCalls { \tpublic void sendLog(String result); } <\/code><\/pre>\n<div class=\"spoiler\"><b class=\"spoiler_title\">CalledFromWrongThreadException \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\u041e\u0445 \u0443\u0436 \u044d\u0442\u0438 \u043f\u043e\u0442\u043e\u043a\u0438. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u043e\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0432\u044c\u044e\u0445\u0443 \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439:  <\/p>\n<pre><code class=\"java\">protected Handler handler = new Handler()     {       \t @Override          public void handleMessage(Message msg) {     \t\t showResult(msg.getData().getString(&quot;result&quot;));   \t\t      \t }     }; \t          public void showResult(String result){     \t((TextView) findViewById(R.id.log)).     \tsetText(((TextView) findViewById(R.id.log)).getText()+result+&quot;\\n&quot;);          } \t     \/\/\u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u044b\u0445 \u0431\u0430\u0439\u0442 \t@Override  \tpublic void sendLog(String result){ \t\tMessage msg = new Message(); \t\tBundle data = new Bundle(); \t\tdata.putString(&quot;result&quot;, result); \t\tmsg.setData(data); \t\t\t\t \t\thandler.sendMessage(msg); \t} <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435 \u0431\u044b\u0442\u044c, \u043d\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043d\u0430\u0441 \u0432\u043e\u043f\u0440\u043e\u0441 \u0430\u043a\u0442\u0443\u0430\u043b\u0435\u043d.<\/p>\n<p>  Java \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 \u0432 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u043d\u0430 C++ \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043b\u0430\u0441\u0441:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">NativeCallListener<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">class NativeCallListener { public:  \tNativeCallListener(JNIEnv* pJniEnv, jobject pWrapperInstance); \tNativeCallListener() {} \t\/\/\u0430\u043f\u0443\u0441\u043a \u0442\u0430\u0439\u043c\u0435\u0440\u0430  \t\/\/\u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 Java \u043c\u0435\u0442\u043e\u0434     void sendLog(jobject log);     \/\/\u043e\u0447\u0438\u0441\u0442\u043a\u0430 \u0432\u0441\u0435\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432     void destroy(); \t~NativeCallListener(){  \t} \tvoid loadAudio(); \t\/\/void play(); \t\/\/void playOGG(); \tALCdevice* device; \tALCcontext* context; private: \tJNIEnv* getJniEnv();      \/\/\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434 \tjmethodID sendLogID; \t\/\/\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \tjobject mObjectRef; \tJavaVM* mJVM;   \tALuint soundWAV; \tALuint soundOGG; \tvoid load(); \tvoid clean();  }; <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e loadAudio \u043c\u0435\u0442\u043e\u0434\u0430, \u0445\u044d\u0434\u0435\u0440 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u0431\u044b\u043b.  <\/p>\n<pre><code class=\"cpp\">JNIEXPORT void JNICALL Java_ru_suvitruf_androidndk_tutorial4_MainActivity_loadAudio(JNIEnv *pEnv, jobject pThis, jobject pNativeCallListener, jobject assetManager) { \tlistener = NativeCallListener(pEnv, pNativeCallListener); \tmgr = AAssetManager_fromJava(pEnv, assetManager); \tlistener.loadAudio(); } <\/code><\/pre>\n<p>  \u0412 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434:  <\/p>\n<pre><code class=\"cpp\">NativeCallListener::NativeCallListener(JNIEnv* pJniEnv, jobject pWrappedInstance) { \tpJniEnv-&gt;GetJavaVM(&mJVM); \tmObjectRef = pJniEnv-&gt;NewGlobalRef(pWrappedInstance); \tjclass cl = pJniEnv-&gt;GetObjectClass(pWrappedInstance);         \/\/\u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439, \u0447\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d \u0432 \u043d\u0430\u0448\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u0432 Java \tsendLogID = pJniEnv-&gt;GetMethodID(cl, &quot;sendLog&quot;, &quot;(Ljava\/lang\/String;)V&quot;);  } <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c Java \u043c\u0435\u0442\u043e\u0434 \u043d\u0430\u043f\u0438\u0441\u0430\u0432:  <\/p>\n<pre><code class=\"cpp\">void NativeCallListener::sendLog(jobject log) { \tJNIEnv* jniEnv = getJniEnv(); \tjniEnv-&gt;CallIntMethod(mObjectRef, sendLogID, log);  } <\/code><\/pre>\n<h4>AAssetManager<\/h4>\n<p>  \u0420\u0430\u043d\u044c\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c open source \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 libzip \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<br \/>  \u0421 2.3 \u0432\u0435\u0440\u0441\u0438\u0438 API \u0432 Android ndk \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0435\u0439 assets \u043f\u0440\u044f\u043c\u043e \u0438\u0437 C++ \u043a\u043e\u0434\u0430. <br \/>  \u041c\u0435\u0442\u043e\u0434\u044b \u043f\u043e\u0445\u043e\u0436\u0438 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u0438\u0437 stdio.h. AAssetManager_open \u0432\u043c\u0435\u0441\u0442\u043e fopen, AAsset_read \u0432\u043c\u0435\u0441\u0442\u043e fread, AAsset_close \u0432\u043c\u0435\u0441\u0442\u043e fclose. <\/p>\n<p>  \u042f \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043e\u0431\u0451\u0440\u0442\u043a\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u043b. \u041a\u043e\u0434 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u044e\u0434\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u0446\u0435\u043b\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430 \u0442\u0430 \u0436\u0435, \u0447\u0442\u043e \u0438 \u0441 FILE \u043e\u0431\u044b\u0447\u043d\u044b\u043c.<\/p>\n<h4>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 OpenAL<\/h4>\n<p>  \u0421\u0442\u0430\u0442\u044c\u044f \u0443\u0436\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u0430\u044f \u0431\u043e\u043b\u044c\u0448\u0430\u044f, \u0430 \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443 \u0442\u0430\u043a \u0438 \u043d\u0435 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043b. \u041f\u0440\u043e\u0448\u0443 \u043c\u0435\u043d\u044f \u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0437\u0430 \u044d\u0442\u043e\u2026<\/p>\n<h5>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/h5>\n<p>  \u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c OpenAL. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 WAV \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043d\u043e \u043c\u044b \u0436\u0435 \u0435\u0449\u0451 \u0445\u043e\u0442\u0438\u043c \u0438 \u0441 OGG \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u0414\u043b\u044f OGG \u043d\u0443\u0436\u0435\u043d \u0434\u0435\u043a\u043e\u0434\u0435\u0440 <a href=\"http:\/\/svn.xiph.org\/trunk\/Tremor\/\">Tremor<\/a>.<\/p>\n<p>  \u0414\u043b\u044f \u0437\u0432\u0443\u043a\u0430 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043e\u0431\u0451\u0440\u0442\u043a\u0438 \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438. \u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u0442\u0443\u0442 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u043c\u044b\u0441\u043b\u0430 \u043d\u0435\u0442, \u043e\u0441\u0432\u0435\u0449\u0443 \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443.<\/p>\n<h5>\u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c WAV \u0444\u0430\u0439\u043b<\/h5>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u043b\u044f \u0445\u044d\u0434\u0435\u0440\u043e\u0432:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">BasicWAVEHeader<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">typedef struct {   char  riff[4];\/\/'RIFF'   unsigned int riffSize;   char  wave[4];\/\/'WAVE'   char  fmt[4];\/\/'fmt '   unsigned int fmtSize;   unsigned short format;   unsigned short channels;   unsigned int samplesPerSec;   unsigned int bytesPerSec;   unsigned short blockAlign;   unsigned short bitsPerSample;   char  data[4];\/\/'data'   unsigned int dataSize; }BasicWAVEHeader; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0447\u0438\u0442\u0430\u0435\u043c:  <\/p>\n<pre><code class=\"cpp\">void OALWav::load(AAssetManager *mgr, const char* filename){ \tthis-&gt;filename = filename; \tthis-&gt;data = 0;         \/\/\u0447\u0438\u0442\u0430\u0435\u043c \u0444\u0430\u0439\u043b \tthis-&gt;data = this-&gt;readWAVFull(mgr, &header);         \/\/\u0443\u0437\u043d\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442 \tgetFormat();         \/\/\u0441\u043e\u0437\u0434\u0430\u0451\u043c OpenAL \u0431\u0443\u0444\u0435\u0440 \tcreateBufferFromWave(data); \tsource = 0; \talGenSources(1, &source); \talSourcei(source, AL_BUFFER, buffer); } <\/code><\/pre>\n<div class=\"spoiler\"><b class=\"spoiler_title\">readWAVFull<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">char* OALWav::readWAVFull(AAssetManager *mgr, BasicWAVEHeader* header){ \tchar* buffer = 0;  \tAAssetFile f = AAssetFile(mgr, filename);  \tif (f.null()) { \t\tLOGE(&quot;no file %s in readWAV&quot;,filename); \t\treturn 0; \t} \tint res = f.read(header,sizeof(BasicWAVEHeader),1); \tif(res){ \t\tif (!( \t\t\t\/\/ \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u043d\u044b. \t\t\t\/\/ \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0442\u0430\u043a. \t\t\t\/\/ \u041c\u043d\u043e\u0433\u0438\u0435 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u044b \u043d\u0435\u0434\u043e\u0431\u0440\u043e\u0441\u043e\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u043f\u0438\u0445\u0430\u044e\u0442 \u0432 \u044d\u0442\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0441\u0432\u043e\u0438 \u043b\u043e\u0433\u043e\u0442\u0438\u043f\u044b =\/ \t\t\tmemcmp(&quot;RIFF&quot;,header-&gt;riff,4) || \t\t\tmemcmp(&quot;WAVE&quot;,header-&gt;wave,4) || \t\t\tmemcmp(&quot;fmt &quot;,header-&gt;fmt,4)  || \t\t\tmemcmp(&quot;data&quot;,header-&gt;data,4) \t\t)){ \t\t\tbuffer = (char*)malloc(header-&gt;dataSize); \t\t\tif (buffer){ \t\t\t\tif(f.read(buffer,header-&gt;dataSize,1)){ \t\t\t\t\tf.close(); \t\t\t\t\treturn buffer; \t\t\t\t} \t\t\t\tfree(buffer); \t\t\t} \t\t} \t} \tf.close(); \treturn 0; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0421\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 WAV \u043a\u043e\u0435-\u0447\u0442\u043e. \u041f\u043e\u0440\u043e\u0439, \u0444\u0430\u0439\u043b \u043d\u0430 PC \u0432\u0440\u043e\u0434\u0435 \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u043b\u0438\u0447\u043d\u043e, \u043d\u043e \u0432 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0432 OpenAL \u0441 \u043d\u0438\u043c \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043e\u0448\u0438\u0431\u043a\u0438. \u042d\u0442\u043e \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u0438\u0442\u044b\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438. \u042f \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u0445\u044d\u0434\u0435\u0440\u044b \u043f\u0438\u0441\u0430\u043b \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0447\u0443\u0448\u044c (\u0441\u0432\u043e\u0439 \u043b\u043e\u0433\u043e\u0442\u0438\u043f \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440), \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0432 <b>dataSize<\/b>. \u0422\u0430\u043a \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0430 \u043d\u0430 PC \u0438\u0433\u0440\u0430\u0435\u0442? <br \/>  \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0430\u0443\u0434\u0438\u043e \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0445\u044d\u0434\u0435\u0440\u0430 \u0438 \u0438\u0445 \u0440\u0430\u0437\u043c\u0435\u0440 \u0432 <b>dataSize<\/b>. \u0415\u0441\u043b\u0438 \u0441 \u044d\u0442\u0438\u043c \u043f\u043e\u043b\u0435\u043c \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0442\u0430\u043a, \u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u043e\u0448\u0438\u0431\u043a\u0438. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u0430\u0432\u0434\u0430 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0432 \u043b\u043e\u0431. <b>\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 = \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430 \u2014 \u0440\u0430\u0437\u043c\u0435\u0440 \u0445\u044d\u0434\u0435\u0440\u0430<\/b>. \u0422\u0430\u043a \u0447\u0442\u043e, \u0434\u0443\u043c\u0430\u044e, \u043f\u043b\u0435\u0435\u0440\u044b \u0431\u0435\u0440\u0443\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0442\u0430\u044f, \u0430 \u043d\u0435 \u0438\u0437 \u0445\u044d\u0434\u0435\u0440\u0430.<\/p>\n<p>  \u041f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 WAV \u0432\u0440\u043e\u0434\u0435 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0444\u043e\u0440\u043c\u0430\u0442 \u043d\u0435 \u0441\u0436\u0430\u0442\u044b\u0439. \u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 <b>.Ogg<\/b> \u0432\u0441\u0451 \u043f\u043e\u0441\u043b\u043e\u0436\u043d\u0435\u0435.<\/p>\n<h5>\u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c Ogg \u0444\u0430\u0439\u043b<\/h5>\n<p>  \u0412 \u0447\u0451\u043c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c <b>Ogg<\/b> \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 <b>WAV<\/b>? \u042d\u0442\u043e \u0441\u0436\u0430\u0442\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442. \u0422\u0430\u043a \u0447\u0442\u043e, \u043f\u0435\u0440\u0435\u0434 \u0442\u0430\u043c \u043a\u0430\u043a \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0431\u0443\u0444\u0435\u0440 OpenAL, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<br \/>  \u0417\u0430\u0433\u0432\u043e\u0437\u0434\u043a\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e Vorbis \u0441\u0442\u0440\u0438\u043c\u0438\u0442 \u0438\u0437 FILE, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u0441\u0435 callback \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">callbacks<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">static size_t  read_func(void* ptr, size_t size, size_t nmemb, void* datasource) {     unsigned int uiBytes = Min(suiSize - suiCurrPos, (unsigned int)nmemb * (unsigned int)size);     memcpy(ptr, (unsigned char*)datasource + suiCurrPos, uiBytes);     suiCurrPos += uiBytes;      return uiBytes; }  static int seek_func(void* datasource, ogg_int64_t offset, int whence) {     if (whence == SEEK_SET)         suiCurrPos = (unsigned int)offset;     else if (whence == SEEK_CUR)         suiCurrPos = suiCurrPos + (unsigned int)offset;     else if (whence == SEEK_END)         suiCurrPos = suiSize;      return 0; }  static int close_func(void* datasource) {     return 0; }  static long tell_func(void* datasource) {     return (long)suiCurrPos; }  <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0427\u0442\u0435\u043d\u0438\u0435 Ogg<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">void OALOgg::getInfo(unsigned int uiOggSize, char* pvOggBuffer){ \t\/\/ \u0417\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u043a\u043e\u043b\u0431\u044d\u043a\u0438 \t    ov_callbacks callbacks; \t    callbacks.read_func = &read_func; \t    callbacks.seek_func = &seek_func; \t    callbacks.close_func = &close_func; \t    callbacks.tell_func = &tell_func;   \t    suiCurrPos = 0; \t    suiSize = uiOggSize; \t    int iRet = ov_open_callbacks(pvOggBuffer, &vf, NULL, 0, callbacks);  \t    \/\/ \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \t    vi = ov_info(&vf, -1);  \t    uiPCMSamples = (unsigned int)ov_pcm_total(&vf, -1); } void * OALOgg::ConvertOggToPCM(unsigned int uiOggSize, char* pvOggBuffer) { \tif(suiSize == 0){ \t\tgetInfo( uiOggSize, pvOggBuffer); \t\tcurrent_section = 0; \t\tiRead = 0; \t\tuiCurrPos = 0; \t}      void* pvPCMBuffer = malloc(uiPCMSamples * vi-&gt;channels * sizeof(short));      \/\/ \u0414\u0435\u043a\u043e\u0434\u0438\u043c     do     {         iRead = ov_read(&vf, (char*)pvPCMBuffer + uiCurrPos, 4096, &current_section);         uiCurrPos += (unsigned int)iRead;     }     while (iRead != 0);      return pvPCMBuffer; }  void OALOgg::load(AAssetManager *mgr, const char* filename){ \tthis-&gt;filename = filename; \tchar* buf = 0; \tAAssetFile f = AAssetFile(mgr, filename); \tif (f.null()) { \t\tLOGE(&quot;no file %s in readOgg&quot;,filename); \t\treturn ; \t}  \tbuf = 0; \tbuf = (char*)malloc(f.size()); \tif (buf){ \t\tif(f.read(buf,f.size(),1)){ \t\t} \t\telse { \t\t\tfree(buf); \t\t\tf.close(); \t\t\treturn; \t\t} \t}  \tchar * data = (char *)ConvertOggToPCM(f.size(),buf); \tf.close();  \t if (vi-&gt;channels == 1) \t    format = AL_FORMAT_MONO16; \t  else \t    format = AL_FORMAT_STEREO16;  \talGenBuffers(1,&buffer); \talBufferData(buffer,format,data,uiPCMSamples * vi-&gt;channels * sizeof(short),vi-&gt;rate);  \tsource = 0; \talGenSources(1, &source); \talSourcei(source, AL_BUFFER, buffer); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041c\u044b \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c C++ \u043c\u0435\u0442\u043e\u0434 loadAudio, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 load \u0443 NativeCallListener, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0433\u0440\u0443\u0437\u0438\u0442 \u0437\u0432\u043a\u0443\u0438:  <\/p>\n<pre><code class=\"cpp\">void NativeCallListener:: load(){ \toalContext = new OALContext();         \/\/sound = new OALOgg(); \tsound = new OALWav();  \tchar *  fileName = new char[64]; \tstrcpy(fileName, &quot;audio\/industrial_suspense1.wav&quot;); \t\/\/strcpy(fileName, &quot;audio\/Katatonia - Deadhouse_(piano version).ogg&quot;); \tsound-&gt;load(mgr,fileName); } <\/code><\/pre>\n<p>  <code>sound<\/code> \u0443 \u043c\u0435\u043d\u044f \u0442\u0438\u043f\u0430 <code>OALSound<\/code>. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 WAV \u0438 Ogg \u0443 \u043c\u0435\u043d\u044f \u043a\u043b\u0430\u0441\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442\u0441\u044f \u043e\u0442 \u043d\u0435\u0433\u043e. \u041d\u0430\u043c \u0434\u043b\u044f \u043d\u0438\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043b\u0438\u0448\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0432 \u043c\u0435\u0442\u043e\u0434 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <code>virtual void load(AAssetManager *mgr, const char* filename)= 0;<\/code><br \/>  \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u043e \u0437\u0432\u0443\u043a\u043e\u0432.<\/p>\n<h4>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h4>\n<p>  \u0415\u0449\u0451 \u0440\u0430\u0437 \u0438\u0437\u0432\u0438\u043d\u044f\u044e\u0441\u044c, \u0447\u0442\u043e \u0441\u0442\u0430\u0442\u044c\u044f \u0432\u044b\u0448\u043b\u0430 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0431\u044a\u0451\u043c\u043d\u0430\u044f, \u0438\u043d\u0430\u0447\u0435 \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u043a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e \u0437\u0432\u0443\u043a\u043e\u043c \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u0421\u043a\u0430\u0436\u0435\u043c, \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u0438\u0448\u0438\u0442\u0435 \u0434\u0432\u0438\u0436\u043e\u043a \u0438\u0433\u0440\u044b \u0434\u043b\u044f iOS \u0438 Android.<\/p>\n<p>  \u0415\u0441\u0442\u044c \u0442\u0443\u0442 \u043d\u044e\u0430\u043d\u0441 \u2014 \u0430\u0443\u0434\u0438\u043e \u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0437\u0432\u0443\u043a\u043e\u0432 \u0442\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0435, \u043d\u043e \u0434\u043b\u044f \u043c\u0443\u0437\u044b\u043a\u0438 \u043d\u0435\u0442. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0442\u044c \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u0430\u044f .ogg \u043f\u0435\u0441\u043d\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u043e, \u0435\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u043f\u0438\u0448\u0435\u0442 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u0430\u0443\u0434\u0438\u043e \u0441\u043e \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u043e\u043c, \u0430 \u043d\u0435 \u043f\u043e\u043b\u043d\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0432 \u0431\u0443\u0444\u0435\u0440.<\/p>\n<h6>\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438<\/h6>\n<p>  \u041f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Eclipse. \u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 <a href=\"https:\/\/github.com\/Suvitruf\/Android-ndk\/tree\/master\/AndroidNDK-Tutorial4\">github<\/a>.<\/p>\n<p>  P.S. \u0436\u0434\u0443 \u043a\u0440\u0438\u0442\u0438\u043a\u0438 \u0438 \u0441\u043e\u0432\u0435\u0442\u043e\u0432<br \/>  P.P.S. \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0430\u0448\u043b\u0438 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435, \u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043f\u043c.    \t \t\t   \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/176559\/\"> http:\/\/habrahabr.ru\/post\/176559\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t\u0414\u0435\u043d\u044c \u0434\u043e\u0431\u0440\u044b\u0439, \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0435 \u0425\u0430\u0431\u0440\u0430\u044e\u0437\u0435\u0440\u044b!<\/p>\n<p>  \u0421 \u043d\u0435\u0434\u0430\u0432\u043d\u0438\u0445 \u043f\u043e\u0440 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043f\u043e\u0434 Android, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0438\u0433\u0440. \u0422\u0430\u043a \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Android ndk. \u0412\u0441\u0435 \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u0438 \u0438 \u043d\u044e\u0430\u043d\u0441\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 native \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u0440\u0435\u0448\u0438\u043b \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 ndk \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c.<br \/>  \u0410 \u0447\u0442\u043e\u0431\u044b \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u044b\u043b\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0432\u0438\u0447\u043a\u0430\u043c, \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 OpenAL \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u043c\u0438 WAV, OGG.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-176559","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/176559","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=176559"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/176559\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=176559"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=176559"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=176559"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}