إضافات Android

توسّع أداة OpenSL ES في Android مواصفات OpenSL ES المرجعية لجعلها متوافقة مع Android، والاستفادة من إمكانيات النظام الأساسي Android ومرونته.

يتوفّر تعريف واجهة برمجة التطبيقات لإضافات Android في OpenSLES_Android.h. وملفات الرأس التي تتضمنها. استشارة "OpenSLES_Android.h" للحصول على تفاصيل حول هذه الإضافات. يقع هذا الملف في جذر التثبيت، في دليل sysroot/usr/include/SLES. ما لم يكن خلاف ذلك جميع الواجهات واضحة.

تحدّ هذه الإضافات من إمكانية نقل تطبيقك إلى تطبيقات OpenSL ES الأخرى، لأنها خاصة بنظام Android. يمكنك التخفيف من حدة هذه المشكلة عن طريق من خلال تجنُّب استخدام الإضافات أو استخدام #ifdef لاستبعادها أثناء التجميع.

يعرض الجدول التالي الواجهات الخاصة بنظام التشغيل Android وأدوات تحديد مواقع البيانات التي يوفّرها Android OpenSL ES. لكل نوع من أنواع الكائنات. تشير قيم Yes في الخلايا إلى الواجهات والبيانات محددات المواقع المتوفرة لكل نوع من أنواع الكائنات.

الميزة مشغِّل الصوت مسجِّل الصوت محرّك تشكيلة الإخراج
قائمة انتظار المخزن المؤقت لنظام التشغيل Android نعم: المصدر (فك الترميز) لا لا لا
إعدادات Android نعم نعم لا لا
تأثير Android نعم لا لا نعم
إمكانات تأثيرات Android لا لا نعم لا
إرسال تأثير Android نعم لا لا لا
قائمة انتظار المخزن المؤقت البسيط في Android نعم: المصدر (التشغيل) أو البالوعة (فك الترميز) نعم لا لا
أداة البحث عن بيانات قائمة انتظار المخزن المؤقت على Android نعم: المصدر (فك الترميز) لا لا لا
أداة البحث عن البيانات في أداة وصف ملفات Android نعم: المصدر لا لا لا
أداة البحث البسيط عن بيانات قائمة انتظار المخزن المؤقت على Android نعم: المصدر (التشغيل) أو البالوعة (فك الترميز) نعم: مغاسل لا لا

واجهة إعداد Android

توفر واجهة تهيئة Android وسيلة لضبط والمعلمات الخاصة بالنظام الأساسي للكائنات. تختلف هذه الواجهة عن واجهة OpenSL ES الأخرى. 1.0.1 الواجهات التي يمكن للتطبيق استخدامها قبل إنشاء مثيل للعنصر ذي الصلة وبالتالي، يمكنك تكوين الكائن قبل إنشاء مثيل له. تشير رسالة الأشكال البيانية ملف العنوان OpenSLES_AndroidConfiguration.h، يوجد في /sysroot/usr/include/SLES, لتوثيق مفاتيح وقيم التهيئة المتاحة التالية:

  • نوع البث لمشغّلات الصوت (القيمة التلقائية SL_ANDROID_STREAM_MEDIA).
  • تسجيل الملف الشخصي لمسجّلات الصوت (الإعداد التلقائي SL_ANDROID_RECORDING_PRESET_GENERIC).

يعرض مقتطف الرمز التالي مثالاً على كيفية ضبط نوع البث الصوتي في Android على مقطع صوتي. اللاعب:

// CreateAudioPlayer and specify SL_IID_ANDROIDCONFIGURATION
// in the required interface ID array. Do not realize player yet.
// ...
SLAndroidConfigurationItf playerConfig;
result = (*playerObject)->GetInterface(playerObject,
    SL_IID_ANDROIDCONFIGURATION, &playerConfig);
assert(SL_RESULT_SUCCESS == result);
SLint32 streamType = SL_ANDROID_STREAM_ALARM;
result = (*playerConfig)->SetConfiguration(playerConfig,
    SL_ANDROID_KEY_STREAM_TYPE, &streamType, sizeof(SLint32));
assert(SL_RESULT_SUCCESS == result);
// ...
// Now realize the player here.

يمكنك استخدام رمز مشابه لضبط الإعدادات المسبقة لمسجّل الصوت:

// ... obtain the configuration interface as the first four lines above, then:
SLuint32 presetValue = SL_ANDROID_RECORDING_PRESET_VOICE_RECOGNITION;
result = (*playerConfig)->SetConfiguration(playerConfig,
    RECORDING_PRESET, &presetValue, sizeof(SLuint32));

واجهات تأثيرات Android

توفر واجهات إمكانيات التأثير وإرسال التأثيرات والتأثيرات في Android آلية عامة لأحد التطبيقات للاستعلام عن طلبات البحث الخاصة بالأجهزة واستخدامها والمؤثرات الصوتية. يجب أن توثّق الشركات المصنّعة للأجهزة أي تأثيرات صوتية متاحة خاصة بالأجهزة. التي يقدمونها.

يجب أن تستخدم التطبيقات المحمولة واجهات برمجة التطبيقات OpenSL ES 1.0.1 API للحصول على التأثيرات الصوتية بدلاً من Android إضافات التأثيرات.

أداة البحث عن البيانات في واصف ملفات Android

يسمح لك محدِّد موقع بيانات واصف ملفات Android بتحديد مصدر مشغّل صوت كواصف ملفات مفتوح مع إذن بالقراءة يجب أن يكون تنسيق البيانات بتنسيق MIME.

تكون هذه الإضافة مفيدة بشكل خاص في حالة الاستعانة بنظام إدارة مواد العرض المدمجة مع المحتوى، لأن يقرأ التطبيق مواد العرض من حزمة APK باستخدام واصف الملف.

واجهة ومحدِّد موقع بيانات قائمة انتظار المخزن المؤقت البسيط على Android

في المواصفات المرجعية لـ OpenSL ES 1.0.1، يمكن استخدام قوائم انتظار المخزن المؤقت لمشغّلات الصوت فقط، وهي متوافقة مع PCM وتنسيقات البيانات الأخرى. يمكن لمحدِّد موقع بيانات قائمة انتظار المخزن المؤقت على Android ومواصفات الواجهة مطابقة لمواصفات المرجع، مع استثناءَين:

  • يمكنك استخدام قوائم انتظار المخزن المؤقت البسيط على Android مع مسجِّلات الصوت ومشغّلات الصوت.
  • يمكنك فقط استخدام تنسيق بيانات PCM مع قوائم الانتظار هذه.

للتسجيل، يجب أن يدرِج تطبيقك مخازن مؤقتة فارغة. عندما يرسل رد اتصال مسجَّل إخطارًا بأن النظام قد انتهى من كتابة البيانات في مخزن مؤقت، فيمكن للتطبيق القراءة من هذا المورد الاحتياطي.

تعمل ميزة التشغيل بالطريقة نفسها. لرمز المصدر المستقبلي إلا أننا نقترح أن تستخدم التطبيقات نظام Android قوائم انتظار المخزن المؤقت بدلاً من قوائم انتظار المخزن المؤقت OpenSL ES 1.0.1.

سلوك قائمة انتظار المخزن المؤقت

لا تشمل آلية تنفيذ Android للمواصفات المرجعية الذي يقضي بعودة مؤشر التشغيل إلى البداية من المخزن المؤقت قيد التشغيل حاليًا عند دخول عملية التشغيل في SL_PLAYSTATE_STOPPED الولاية. وقد يتوافق هذا التنفيذ مع هذا السلوك، أو قد يخرج مكان التشغيل. بدون تغيير. ونتيجةً لذلك، لا يمكن لتطبيقك افتراض حدوث أيٍّ من السلوكَين. ولذلك، يجب عليك استدعاء طريقة BufferQueue::Clear() بشكل صريح بعد الانتقال إلى SL_PLAYSTATE_STOPPED يؤدي ذلك إلى تعيين قائمة انتظار المخزن المؤقت على حالة معروفة.

وبالمثل، لا توجد مواصفات تحدد ما إذا كان مشغل استدعاء قائمة انتظار المخزن المؤقت يجب أن أن يكون انتقالاً إلى SL_PLAYSTATE_STOPPED أو تنفيذًا BufferQueue::Clear() لذلك، ننصحك بعدم إنشاء تبعية على أحدهما أو الآخر وإنما يجب أن يتمكن التطبيق من التعامل مع الاثنين معًا.

واجهات ديناميكية عند إنشاء العناصر

ولتسهيل الأمر، تم تنفيذ بروتوكول OpenSL ES 1.0.1 على نظام التشغيل Android يسمح لتطبيقك بتحديد واجهات ديناميكية عند إنشاء مثيل لأحد الكائنات. يمكنك بدلاً من ذلك استخدام DynamicInterfaceManagement::AddInterface(). لإضافة هذه الواجهات بعد إنشاء مثيلها.

إعداد تقارير عن الإضافات

هناك ثلاث طرق للاستعلام عن ما إذا كان النظام الأساسي متوافقًا مع إضافات Android. هذه الطرق هي:

  • Engine::QueryNumSupportedExtensions()
  • Engine::QuerySupportedExtension()
  • Engine::IsExtensionSupported()

وتُرجع أي من هذه الطرق ANDROID_SDK_LEVEL_<API-level>، حيث API-level هو مستوى واجهة برمجة التطبيقات للنظام الأساسي على سبيل المثال، ANDROID_SDK_LEVEL_23. يعني المستوى 9 أو أعلى من واجهة برمجة التطبيقات للنظام الأساسي أنّ المنصة تتيح الإضافات.

فك ترميز الصوت إلى PCM

يصف هذا القسم إضافة تم إيقافها نهائيًا خاصة بنظام Android إلى الإصدار OpenSL ES 1.0.1. لفك ترميز بث مرمّز إلى PCM بدون تشغيل فوري. يقدِّم الجدول أدناه اقتراحات لاستخدام هذه الإضافة والبدائل.

مستوى واجهة برمجة التطبيقات الحلول البديلة
15 سنة أو أقل برنامج ترميز مفتوح المصدر حاصل على ترخيص مناسب
16 إلى 20 الفئة MediaCodec أو برنامج ترميز مفتوح المصدر يحمل ترخيصًا مناسبًا
21 والإصدارات الأحدث NDK MediaCodec في ملفات العنوان <media/NdkMedia*.h>، MediaCodec فئة، أو برنامج ترميز مفتوح المصدر يحمل ترخيصًا مناسبًا

ملاحظة: ما مِن مستندات حاليًا حول إصدار NDK لواجهة برمجة تطبيقات MediaCodec. ومع ذلك، يمكنك الرجوع إلى نموذج التعليمات البرمجية أصلي كمثال.

يتم تشغيل مشغِّل صوت عادي على جهاز سماعي، مع تحديد مزيج الإخراج على أنه مستودع البيانات. تختلف إضافة Android في أن مشغّل الصوت بدلاً من ذلك أداة فك الترميز إذا كان التطبيق قد حدد مصدر البيانات إما كمعرّف موارد منتظم (URI) أو بنظام Android أداة البحث عن بيانات واصف الملفات الموصوفة باستخدام تنسيق بيانات MIME. في هذه الحالة، يكون مستودع البيانات محدِّد موقع بيانات قائمة انتظار المخزن المؤقت البسيط على Android الذي يستخدم تنسيق بيانات PCM.

تهدف هذه الميزة في المقام الأول إلى تحميل الألعاب مسبقًا لمواد العرض الصوتية عند الانتقال إلى مستوى جديد في اللعبة، مشابه للوظائف التي يوفّرها SoundPool التي يقدمها هذا الفصل الدراسي.

يجب أن يدرِج التطبيق مجموعة من المخازن المؤقتة الفارغة في قائمة انتظار Android البسيطة قائمة انتظار المخزن المؤقت. بعد ذلك، يملأ التطبيق الموارد الاحتياطية ببيانات PCM. تصميم Android البسيط يتم تنشيط استدعاء قائمة انتظار المخزن المؤقت بعد ملء كل مورد. يعالج معالج معاودة الاتصال بيانات PCM، وتُعيد إدراج المخزن المؤقت الفارغ الآن في قائمة الانتظار، ثم تُرجع. يكون التطبيق مسؤولاً عن تتبع الموارد الاحتياطية التي تم فك ترميزها فإن قائمة معلمات معاودة الاتصال لا تتضمن معلومات كافية للإشارة إلى المورد الاحتياطي الذي يحتوي على بيانات أو المورد الاحتياطي الذي ينبغي المضافة إلى قائمة الانتظار بعد ذلك.

يُبلغ مصدر البيانات ضمنيًا عن نهاية البث (EOS) من خلال تقديم حدث SL_PLAYEVENT_HEADATEND في نهاية البث المباشر. بعد فك ترميز التطبيق جميع البيانات التي تلقاها، فإنها لا تجري أي اتصالات إضافية لمعاودة الاتصال بقائمة انتظار المخزن المؤقت البسيط في Android.

عادةً ما يتطابق تنسيق بيانات PCM الخاص بالحوض مع تنسيق مصدر البيانات المشفّر في ما يتعلق بمعدل العينة وعدد القنوات وعمق البت. ومع ذلك، يمكنك فك الترميز إلى معدل العينة أو عدد القنوات أو عمق البت. للحصول على معلومات عن أحد المتطلبات لاكتشاف تنسيق PCM الفعلي، راجع حدِّد تنسيق بيانات PCM التي تم فك ترميزها من خلال البيانات الوصفية.

يتيح OpenSL ES لميزة فك ترميز PCM على Android إمكانية الإيقاف المؤقت والعرض الأولي. لا يدعم ذلك عنصر التحكم في الصوت أو التأثيرات أو التكرار أو معدل التشغيل.

قد يتطلب فك التشفير موارد بناءً على منصة التنفيذ الأساسية لا يمكن تركها خاملة. لذلك، ننصحك بالتأكد من تقديم عدد كافٍ من المخازن المؤقتة بتنسيق PCM الفارغة وإلا، يتضور برنامج فك الترميز. قد يحدث هذا، على سبيل المثال، إذا كان تطبيقك يعود من قائمة معاودة الاتصال بقائمة انتظار المخزن المؤقت البسيط على Android بدون إضافة مورد احتياطي فارغ آخر إلى قائمة الانتظار. إن نتيجة تجويع برنامج فك الترميز هي غير محددة، ولكنها قد تتضمن ما يلي: حذف البيانات التي تم فك ترميزها بيانات PCM أو إيقاف عملية فك الترميز مؤقتًا أو إنهاء برنامج فك الترميز تمامًا

ملاحظة: لفك ترميز بث مُرمَّز إلى PCM مع عدم تشغيله فورًا للتطبيقات التي تعمل على في الإصدار 4.x من نظام التشغيل Android (مستويات واجهة برمجة التطبيقات من 16 إلى 20)، ننصح باستخدام الفئة MediaCodec. بالنسبة إلى التطبيقات الجديدة التي تعمل بنظام التشغيل Android 5.0 (المستوى 21 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، ننصح باستخدام NDK. ما يعادل <NdkMedia*.h>. توجد ملفات العناوين هذه في الدليل media/ ضمن جذر التثبيت.

فك ترميز البث من ADTS AAC إلى PCM

ويعمل مشغّل الصوت كبرنامج فك ترميز البث إذا كان مصدر البيانات أداة البحث عن بيانات قائمة انتظار المخزن المؤقت على Android الذي يستخدم تنسيق بيانات MIME وموقع Android هو محدِّد بسيط لبيانات قائمة انتظار المخزن المؤقت على Android ويستخدم تنسيق بيانات PCM. اضبط تنسيق بيانات MIME على النحو التالي:

  • الحاوية: SL_CONTAINERTYPE_RAW
  • سلسلة نوع MIME: SL_ANDROID_MIME_AACADTS

هذه الميزة مخصصة في المقام الأول لبث تطبيقات الوسائط التي التعامل مع صوت AAC ولكنهم يحتاجون إلى معالجة صوت مخصّصة قبل التشغيل. معظم التطبيقات التي تحتاج إلى فك ترميز الصوت إلى PCM الطريقة التي يصفها فك ترميز الصوت إلى PCM لأنّ هذه الطريقة أبسط وتعالج المزيد من تنسيقات الصوت. الأسلوب الموصوف فإليك نهجًا أكثر تخصصًا، ليتم استخدامه فقط إذا تسري الشروط:

  • مصدر الصوت المضغوط هو مجموعة من إطارات AAC المضمّنة في عناوين ADTS.
  • يدير التطبيق هذا البث. لا تقع البيانات داخل مورد شبكة يكون معرفه هو معرف موارد منتظم (URI) أو داخل ملف محلي يكون معرفه واصف ملف.

من المفترض أن يدرِج التطبيق مجموعة من المخازن المؤقتة التي تم ملؤها في قائمة انتظار المخزن المؤقت Android في البداية. يحتوي كل مخزن مؤقت على إطار واحد أو أكثر من إطارات ADTS AAC مكتملة. يتم تنشيط معاودة الاتصال لقائمة انتظار المخزن المؤقت لنظام التشغيل Android بعد إفراغ كل ذاكرة تخزين مؤقت. من المفترض أن تتم إعادة تعبئة المخزن المؤقت وإعادة إدراجه في قائمة طلبات معاودة الاتصال، ثم العودة. لا يحتاج التطبيق إلى تتبع الموارد الاحتياطية المشفرة؛ مَعلمة معاودة الاتصال معلومات كافية لتحديد المورد الاحتياطي الذي يجب وضعه في قائمة الانتظار بعد ذلك. يتم وضع علامة EOS على نهاية البث بشكل واضح من خلال إدراج عنصر EOS في قائمة الانتظار. بعد EOS، لن يُسمح بمزيد من القوائم.

نوصيك بالتأكد من تقديم كامل يقوم ADTS AAC بتخزين مؤقت، لتجنب تجويع برنامج فك الترميز. قد يحدث ذلك، على سبيل المثال، إذا كان تطبيقك من قائمة معاودة الاتصال لقائمة انتظار المخزن المؤقت لنظام التشغيل Android بدون إدراج مخزن مؤقت آخر كامل في قائمة الانتظار. لم يتم تحديد نتيجة تجويع برنامج فك الترميز.

في جميع الجوانب باستثناء مصدر البيانات، تكون طريقة فك ترميز البث هي نفسها الذي يصفه فك ترميز الصوت إلى PCM.

على الرغم من التشابه في الأسماء، ليست قائمة انتظار المخزن المؤقت في Android هو نفسه قائمة انتظار المخزن المؤقت البسيط في Android. برنامج فك ترميز البث يستخدم كلا نوعي قوائم انتظار المخزن المؤقت: قائمة انتظار المخزن المؤقت في Android لخدمة ADTS مصدر بيانات AAC وقائمة انتظار تخزين مؤقت بسيطة لنظام Android لبيانات PCM خَطَأْ للحصول على مزيد من المعلومات حول واجهة برمجة تطبيقات قائمة انتظار المخزن المؤقت البسيط على Android، يمكنك الاطّلاع على نظام التشغيل Android. وواجهة ومحدِّد موقع بيانات قائمة انتظار المخزن المؤقت البسيط. لمزيد من المعلومات حول واجهة برمجة تطبيقات قائمة انتظار المخزن المؤقت على Android، يمكنك الاطّلاع على الملف index.html في الدليل docs/Additional_library_docs/openmaxal/ ضمن جذر التثبيت.

تحديد تنسيق بيانات PCM التي تم فك ترميزها عبر البيانات الوصفية

الواجهة SLMetadataExtractionItf هي جزء من مواصفات المراجع. ومع ذلك، فإن مفاتيح بيانات التعريف التي تشير إلى التنسيق الفعلي لبيانات PCM التي تم فك ترميزها مخصصة Android يحدّد ملف العنوان OpenSLES_AndroidMetadata.h مفاتيح البيانات الوصفية هذه. يتوفّر ملف الرأس هذا في جذر التثبيت، في دليل /sysroot/usr/include/SLES.

تتوفر الفهارس الرئيسية للبيانات الوصفية فور ينتهي تنفيذ الطريقة Object::Realize(). ومع ذلك، فإن القيم المرتبطة ليست متاح إلى أن يفكّ التطبيق ترميز أول بيانات مشفّرة. جيدة التدريب العملي على البحث عن الفهارس الرئيسية في سلسلة التعليمات الرئيسية بعد استدعاء طريقة Object::Realize، وقراءة قيم البيانات الوصفية لتنسيق PCM بطريقة بسيطة في Android معالِج معاودة الاتصال لقائمة انتظار المخزن المؤقت عند طلبه لأول مرة. الرجوع إلى مثال للرمز في حزمة NDK للحصول على أمثلة للعمل باستخدام هذه الواجهة.

أسماء مفاتيح البيانات الوصفية ثابتة، لكن الفهارس الرئيسية غير موثقة، وهي عرضة للتغيير. يجب ألا يفترض التطبيق أنّ الفهارس ثابتة عبر عمليات تنفيذ مختلفة، ولا ينبغي أن تفترض أن تشترك مثيلات الكائنات المتعددة في الفهارس ضمن نفس عملية التشغيل.

بيانات النقطة العائمة

يمكن لأي تطبيق يعمل على نظام التشغيل Android 5.0 (المستوى 21 من واجهة برمجة التطبيقات) والإصدارات الأحدث تقديم بيانات إلى مشغِّل الصوت في تنسيق نقطة عائمة أحادي الدقة.

في نموذج الرمز التالي، تنشئ الطريقة Engine::CreateAudioPlayer() مشغّل صوت. التي تستخدم بيانات النقطة العائمة:

#include <SLES/OpenSLES_Android.h>
...
SLAndroidDataFormat_PCM_EX pcm;
pcm.formatType = SL_ANDROID_DATAFORMAT_PCM_EX;
pcm.numChannels = 2;
pcm.sampleRate = SL_SAMPLINGRATE_44_1;
pcm.bitsPerSample = 32;
pcm.containerSize = 32;
pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
pcm.endianness = SL_BYTEORDER_LITTLEENDIAN;
pcm.representation = SL_ANDROID_PCM_REPRESENTATION_FLOAT;
...
SLDataSource audiosrc;
audiosrc.pLocator = ...
audiosrc.pFormat = &pcm;
مزيد من المعلومات حول صوت النقطة العائمة في صفحة "تحليل عيّنات الصوت"