OpenSL ES لأجهزة Android

تحذير: تم إيقاف OpenSL ES نهائيًا. على المطوّرين استخدام مكتبة Oboe المفتوحة المصدر المتوفّرة على GitHub. ‫Oboe هو برنامج تضمين لـ C++ يقدّم واجهة برمجة تطبيقات تشبه إلى حد كبير AAudio. يستدعي Oboe AAudio عندما يكون AAudio متاحًا، ويعود إلى OpenSL ES في حال عدم AAudio.

تقدّم هذه الصفحة تفاصيل عن كيفية اختلاف تنفيذ OpenSL ES™ في NDK عن المواصفة المرجعية لـ OpenSL ES 1.0.1. عند استخدام نموذج رمز من المواصفات، قد تحتاج إلى تعديله لكي يعمل على Android.

ما لم يُذكر خلاف ذلك، تتوفّر جميع الميزات في الإصدار 2.3 من نظام التشغيل Android (المستوى 9 من واجهة برمجة التطبيقات) والإصدارات الأحدث. لا تتوفّر بعض الميزات إلا لنظام التشغيل Android 4.0 (مستوى واجهة برمجة التطبيقات 14)، وسيتم الإشارة إليها.

ملاحظة: يسرد مستند تعريف التوافق مع Android (CDD) متطلبات الأجهزة والبرامج لجهاز Android المتوافق. يمكنك الاطّلاع على التوافق مع Android للحصول على مزيد من المعلومات حول برنامج التوافق العام، و CDD لمعرفة مستند CDD الفعلي.

توفّر OpenSL ES واجهة برمجة تطبيقات بلغة C يمكن الوصول إليها أيضًا باستخدام C++. وهي تقدّم ميزات مشابهة لتلك المضمّنة في أجزاء المهام المتعلقة بالصوت في واجهات برمجة تطبيقات Java لنظام التشغيل Android التالية:

كما هو الحال مع جميع حِزم تطوير البرامج الأصلية لنظام التشغيل Android (NDK)، يتمثل الغرض الأساسي من OpenSL ES لنظام التشغيل Android في تسهيل تنفيذ المكتبات المشتركة التي يتم استدعاؤها باستخدام واجهة Java Native Interface‏ (JNI ). ولا يُقصد باستخدام حِزم NDK كتابة تطبيقات C/C++ خالصة. ومع ذلك، فإنّ OpenSL ES هي واجهة برمجة تطبيقات كاملة الميزات، ونتوقع أن تتمكّن من تلبية معظم احتياجاتك الصوتية باستخدام هذه الواجهة فقط، بدون إجراء طلبات إعادة تشغيل للرمز البرمجي الذي يتم تشغيله في وقت تشغيل Android.

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

الميزات المُكتسَبة من مواصفات المرجع

يكتسب تطبيق OpenSL ES المُنفَّذ في Android NDK الكثير من مجموعة الميزات من المواصفات المرجعية، مع بعض القيود.

نقاط الإدخال الشاملة

تتوافق مكتبة OpenSL ES لنظام التشغيل Android مع جميع نقاط الدخول الشاملة في مواصفات Android. وتشمل نقاط الدخول هذه ما يلي:

  • slCreateEngine
  • slQueryNumSupportedEngineInterfaces
  • slQuerySupportedEngineInterfaces

الكائنات والواجهات

يعرض الجدول التالي الكائنات والواجهات التي يتوافق معها تطبيق Android NDK على OpenSL ES. إذا ظهرت القيمة نعم في الخلية، يعني ذلك أنّ الميزة متاحة في هذا التنفيذ.

توفُّر حِزم تطوير البرامج (NDK) لنظام التشغيل Android للعناصر والواجهات

الميزة مشغّل صوت مسجِّل الصوت محرّك مجموعة القنوات الإعلانية
تحسين الصوت العميق الخفيض نعم لا لا نعم
قائمة المحتوى التالي في المخزن المؤقت نعم لا لا لا
أداة تحديد مواقع بيانات قائمة انتظار المخزن المؤقت نعم: المصدر لا لا لا
إدارة الواجهات الديناميكية نعم نعم نعم نعم
إرسال التأثير نعم لا لا لا
محرّك لا لا نعم لا
تردد الصوت في بيئة المستمع لا لا لا نعم
معادِل الصوت نعم لا لا نعم
أداة تحديد مواقع بيانات أجهزة الإدخال/الإخراج لا نعم: المصدر لا لا
استخراج البيانات الوصفية نعم: فك الترميز إلى PCM لا لا لا
كتم صوت المحادثة بين شخصين نعم لا لا لا
عنصر نعم نعم نعم نعم
أداة تحديد موقع مجموعة الإخراج نعم: الحوض لا لا لا
تشغيل نعم لا لا لا
معدّل التشغيل نعم لا لا لا
حالة الجلب المُسبَق نعم لا لا لا
صدى صوت تم إعداده مسبقًا لا لا لا نعم
تسجيل لا نعم لا لا
استدعاء نعم لا لا لا
محدِّد موقع بيانات معرّف الموارد المنتظم (URI) نعم: المصدر لا لا لا
أداة المحاكاة الظاهرية نعم لا لا نعم
مستوى الصوت نعم لا لا لا

يوضّح القسم التالي القيود المفروضة على بعض هذه الميزات.

القيود

تنطبق بعض القيود على الميزات الواردة في الجدول 1. تمثّل هذه القيود اختلافات عن المواصفات المرجعية. يقدم باقي هذا القسم معلومات حول هذه الاختلافات.

إدارة الواجهة الديناميكية

لا يتيح OpenSL ES لجهاز Android استخدام RemoveInterface أو ResumeInterface.

مجموعات التأثير: صدى البيئة المحيطة والصدى المُعد مسبقًا

لا يمكنك استخدام كلّ من الصدى البيئي والصدى المُعدّ مسبقًا في مزيج الإخراج نفسه.

قد تتجاهل المنصة طلبات التأثيرات إذا توقّعت أنّ حمولة وحدة المعالجة المركزية ستكون مرتفعة جدًا.

إرسال التأثير

تتيح SetSendLevel() مستوى إرسال واحدًا لكل مشغّل صوتي.

تردد الصوت في بيئة المستمع

لا يتيح الصدى البيئية استخدام الحقول reflectionsDelay أو reflectionsLevel أو reverbDelay في بنية SLEnvironmentalReverbSettings.

تنسيق بيانات MIME

لا يمكنك استخدام تنسيق بيانات MIME إلا مع محدِّد موقع بيانات معرّف الموارد المنتظم (URI) ولمشغّل الصوت فقط. لا يمكنك استخدام تنسيق البيانات هذا لمسجّل صوت.

يتطلب تطبيق OpenSL ES على Android ضبط mimeType على NULL أو سلسلة UTF-8 صالحة. عليك أيضًا ضبط containerType على قيمة صالحة. في حال عدم توفّر اعتبارات أخرى، مثل إمكانية نقل التطبيق إلى عمليات تنفيذ أو أشكال محتوى أخرى لا يمكن للتطبيق التعرّف عليها من خلال العنوان، ننصحك بضبطmimeType على NULL وcontainerType على SL_CONTAINERTYPE_UNSPECIFIED.

يتوافق OpenSL ES لنظام التشغيل Android مع تنسيقات الصوت التالية، شرط أن يكون نظام التشغيل Android متوافقًا معها أيضًا:

  • WAV PCM.
  • قانون WAV.
  • WAV ulaw
  • MP3 Ogg Vorbis
  • ‫AAC LC
  • ‫HE-AACv1 (AAC+‎)
  • ‫HE-AACv2 (الترميز المتقدّم للصوت المحسّن)
  • AMR.
  • FLAC

ملاحظة: للحصول على قائمة بتنسيقات الصوت المتوافقة مع نظام التشغيل Android، يُرجى مراجعة تنسيقات الوسائط المتوافقة.

تنطبق القيود التالية على التعامل مع هذه التنسيقات وغيرها في عملية تنفيذ OpenSL ES:

  • يجب وضع تنسيقات AAC ضمن حاوية MP4 أو ADTS.
  • لا يتيح OpenSL ES لجهاز Android استخدام MIDI.
  • لا يُعدّ WMA جزءًا من AOSP، ولم يتم التحقّق من توافقه مع OpenSL ES لنظام التشغيل Android.
  • لا تتيح واجهة برمجة التطبيقات OpenSL ES في حزمة Android NDK تشغيل محتوى مشفَّر أو محمي بإدارة الحقوق الرقمية مباشرةً. لتشغيل محتوى صوتي محمي، يجب أولاً فك تشفيره في تطبيقك قبل تشغيله، مع فرض تطبيقك لأي قيود مرتبطة بإدارة الحقوق الرقمية.

لا تتيح مكتبة OpenSL ES لنظام التشغيل Android الطرق التالية لمعالجة العناصر:

  • Resume()
  • RegisterCallback()
  • AbortAsyncOperation()
  • SetPriority()
  • GetPriority()
  • SetLossOfControlInterfaces()

تنسيق بيانات PCM

‫PCM هو تنسيق البيانات الوحيد الذي يمكنك استخدامه مع قوائم انتظار المخزن المؤقت. تكون لتكوينات تشغيل PCM المتوافقة الخصائص التالية:

  • ‫8 بت غير موقَّع أو 16 بت موقَّع
  • صوت أحادي أو صوت استيريو
  • ترتيب وحدات البايت الصغيرة.
  • معدّلات أخذ العينات:
    • 8000 هرتز
    • ‫11,025 هرتز
    • 12,000 هرتز
    • 16,000 هرتز
    • ‫22,050 هرتز
    • 24,000 هرتز
    • 32,000 هرتز
    • 44,100 هرتز
    • ‫48,000 هرتز

إنّ الإعدادات التي يتيحها OpenSL ES لنظام التشغيل Android للتسجيل تعتمد على الجهاز، وعادةً ما تتوفّر سرعة 16,000 هرتز أحادية/16 بت موقَّعة بغض النظر عن الجهاز.

تكون قيمة الحقل samplesPerSec بوحدات المللي هرتز، على الرغم من الاسم المضلِّل. لتجنُّب استخدام قيمة خاطئة عن طريق الخطأ، ننصحك بتهيئة هذا الحقل باستخدام أحد الثوابت الرمزية المحدّدة لهذا الغرض، مثل SL_SAMPLINGRATE_44_1.

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

سرعة التشغيل

يشير معدل التشغيل في OpenSL ES إلى السرعة التي يعرض بها العنصر البيانات، ويتم التعبير عنه بالألف من السرعة العادية أو بالألف. على سبيل المثال، معدّل التشغيل الذي يبلغ 1,000 لكل ألف هو 1,000/1,000، أو السرعة العادية. نطاق معدّل التشغيل هو فاصل مغلق يعبّر عن نطاق معدّلات التشغيل المحتمَلة.

قد يختلف مدى توفّر نطاقات معدلات التشغيل والإمكانات الأخرى استنادًا إلى إصدار المنصة وطريقة التنفيذ. يمكن لتطبيقك تحديد هذه الإمكانات أثناء التشغيل من خلال استخدام PlaybackRate::GetRateRange() أو PlaybackRate::GetCapabilitiesOfRate() لطلب معلومات من الجهاز.

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

تسجيل

لا يتوافق OpenSL ES لنظام التشغيل Android مع حدث SL_RECORDEVENT_HEADATLIMIT أو SL_RECORDEVENT_HEADMOVING.

استدعاء

تتيح طريقة SetLoop() تكرار الملف بأكمله. لتفعيل التكرار الحلقي، اضبط المعلمة startPos على 0 والمعلَمة endPos على SL_TIME_UNKNOWN.

أداة تحديد مواقع بيانات قائمة انتظار المخزن المؤقت

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

أداة تحديد مواقع بيانات أجهزة الإدخال/الإخراج

لا يتيح OpenSL ES لنظام التشغيل Android استخدام أداة تحديد موقع بيانات جهاز الإدخال/الإخراج إلا عند تحديد أداة التحديد كمصدر البيانات لـ Engine::CreateAudioRecorder(). يمكنك إعداد أداة البحث عن بيانات الجهاز باستخدام القيم الواردة في مقتطف الرمز البرمجي التالي:

SLDataLocator_IODevice loc_dev =
  {SL_DATALOCATOR_IODEVICE, SL_IODEVICE_AUDIOINPUT,
  SL_DEFAULTDEVICEID_AUDIOINPUT, NULL};

أداة تحديد مواقع بيانات معرّف الموارد المنتظم (URI)

لا يمكن أن يستخدم OpenSL ES لنظام التشغيل Android سوى محدد موقع بيانات معرف الموارد المنتظم (URI) بتنسيق بيانات MIME، وفقط لمشغِّل الصوت. لا يمكنك استخدام أداة تحديد موقع بيانات معرّف الموارد المنتظم (URI) لتطبيق مسجّل صوتي. يمكن أن يستخدم معرّف الموارد المنتظم فقط المخطّطَين http: وfile:. لا يُسمح باستخدام المخططات الأخرى، مثل https: أو ftp: أو content:.

لم نتحقّق من توفّر rtsp: مع الصوت على نظام Android الأساسي.

هياكل البيانات

يتوافق Android مع بنية البيانات OpenSL ES 1.0.1 التالية:

  • SLDataFormat_MIME
  • SLDataFormat_PCM
  • SLDataLocator_BufferQueue
  • SLDataLocator_IODevice
  • SLDataLocator_OutputMix
  • SLDataLocator_URI
  • SLDataSink
  • SLDataSource
  • SLEngineOption
  • SLEnvironmentalReverbSettings
  • SLInterfaceID

إعدادات النظام الأساسي

تم تصميم OpenSL ES لنظام التشغيل Android للتطبيقات المتعدّدة المواضيع، وهو آمن من حيث المواضيع. ويتيح استخدام محرّك واحد لكل تطبيق وما يصل إلى 32 عنصرًا لكل محرّك. قد تؤدي ذاكرة الجهاز ووحدة المعالجة المركزية المتاحة إلى تقييد عدد العناصر القابل للاستخدام بشكل أكبر.

يتم التعرّف على خيارات المحرّك هذه، ولكن يتم تجاهلها من قِبل slCreateEngine:

  • SL_ENGINEOPTION_THREADSAFE
  • SL_ENGINEOPTION_LOSSOFCONTROL

يمكن استخدام OpenMAX AL وOpenSL ES معًا في التطبيق نفسه. في هذه الحالة، يكون هناك عنصر محرك مشترَك واحد داخليًا، ويتم مشاركة الحد الأقصى البالغ 32 عنصرًا بين OpenMAX AL وOpenSL ES. يجب أن ينشئ التطبيق كلا المحرّكين ويستخدمهما، ثم يدمّرهما في النهاية. يحافظ التنفيذ على عدد الإحالات إلى المحرّك المشترَك لكي تتم إزالته بشكل صحيح أثناء عملية الإزالة الثانية.

ملاحظات حول البرمجة

ملاحظات حول البرمجة في OpenSL ES : تقدّم هذه الملاحظات معلومات إضافية لضمان التنفيذ الصحيح لواجهة برمجة التطبيقات OpenSL ES.

ملاحظة: سعيًا منا لتوفير أفضل خدمة، أدرجنا نسخة من مواصفات OpenSL ES 1.0.1 مع NDK في docs/opensles/OpenSL_ES_Specification_1.0.1.pdf.

مشاكل النظام الأساسي

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

إدارة الواجهات الديناميكية

لا يعمل DynamicInterfaceManagement::AddInterface. بدلاً من ذلك، حدِّد الواجهة في المصفوفة التي يتم تمريرها إلى Create()، كما هو موضّح في مثال الرمز البرمجي للتأثير البيئي.

التخطيط للإصدارات المستقبلية من OpenSL ES

تستند واجهات برمجة التطبيقات لنظام التشغيل Android المخصّصة للصوت العالي الأداء إلى Khronos Group OpenSL ES 1.0.1. أصدرت Khronos الإصدار 1.1 من المعيار الذي تم تعديله. يتضمّن الإصدار المعدَّل ميزات جديدة وتوضيحات وتصحيحات للأخطاء الكتابية و بعض حالات عدم التوافق. إنّ معظم حالات عدم التوافق المتوقّعة بسيطة نسبيًا أو تحدث في مناطق من OpenSL ES لا يتوافق معها نظام التشغيل Android.

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

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

التخطيط للتوافق الثنائي

ننصحك باتّباع هذه الإرشادات في تطبيقك لتحسين التوافق مع الثنائيات في المستقبل:

  • استخدِم فقط المجموعة الفرعية الموثَّقة من الميزات المتوافقة مع Android من OpenSL ES 1.0.1.
  • لا تعتمد على رمز نتيجة معين لإجراء عملية غير ناجحة، ولكن عليك الاستعداد للتعامل مع رمز نتيجة مختلف.
  • يتم تشغيل معالِجات طلب إعادة الاتصال بالتطبيق بشكل عام في سياق محظور. ويجب كتابتها لإنجاز العمل بسرعة، ثم العودة إليها في أقرب وقت ممكن. لا تُجري عمليات معقدة داخل معالج طلب إعادة الاتصال. على سبيل المثال، ضمن ردّ اتصال لإكمال صفّ انتظار المخزن المؤقت، يمكنك إضافة مخزن مؤقت آخر إلى الصف، ولكن لا تنشئ مشغّل صوت.
  • يجب أن تكون معالجات عمليات الردّ على المكالمات مستعدّة للاتّصال بها بشكل متكرّر أو أقل تكرارًا، لتلقّي أنواع أحداث إضافية، ويجب تجاهل أنواع الأحداث التي لا تتعرّف عليها. يجب إعداد عمليات الاستدعاء التي تم ضبطها باستخدام قناع حدث مكوّن من أنواع الأحداث المفعّلة بحيث يمكن استدعاؤها مع ضبط وحدات بت متعددة لأنواع الأحداث في الوقت نفسه. استخدِم "&" لاختبار كل وحدة بت الخاصة بالحدث بدلاً من حالة تبديل.
  • استخدِم حالة التحميل المُسبَق وطلبات إعادة الاتصال كمؤشرات عامة للتقدّم، ولكن لا تعتمد على مستويات ملء محدّدة أو تسلسلات طلبات إعادة الاتصال الترميزية. قد يتغيّر معنى مستوى حالة التحميل المُسبَق fill وسلوك الأخطاء التي يتم رصدها أثناء التحميل المُسبَق.

ملاحظة: يمكنك الاطّلاع على القسم سلوك قائمة انتظار المخزن المؤقت أدناه للحصول على مزيد من التفاصيل.

التخطيط لتوافق المصدر

كما ذكرنا، من المتوقّع حدوث حالات عدم توافق في رمز المصدر في الإصدار التالي من OpenSL ES من مجموعة Khronos. تشمل مجالات التغيير المحتملة ما يلي:

  • من المتوقّع أن تطرأ تغييرات كبيرة على واجهة قائمة الانتظار المؤقتة، خاصةً في BufferQueue::Enqueue وقائمة المَعلمات الخاصة بـ slBufferQueueCallback واسم الحقل SLBufferQueueState.playIndex. ننصحك بأن يستخدم رمز تطبيقك قوائم انتظار المخزن المؤقت البسيطة في Android بدلاً من ذلك. في مثال الرمز الذي يتم توفيره مع حزمة NDK، استخدمنا قوائم انتظار التخزين المؤقت البسيطة في Android لتشغيل المحتوى لهذا السبب. (نستخدم أيضًا "قائمة انتظار التخزين المؤقت" البسيطة في Android لتسجيل البيانات وفك ترميزها إلى PCM، ولكن يرجع ذلك إلى أنّ الإصدار العادي من OpenSL ES 1.0.1 لا يتيح تسجيل البيانات أو فك ترميزها إلى وجهة data في قائمة انتظار التخزين المؤقت).
  • ستتم إضافة const إلى مَعلمات الإدخال التي يتم تمريرها بالإشارة، و إلى حقول البنية SLchar * المستخدَمة كقيم إدخال. ومن المفترض ألا يتطلّب ذلك إجراء أي تغييرات على الرمز.
  • سيتم استبدال الأنواع غير الموقَّعة ببعض المَعلمات الموقَّعة حاليًا. قد تحتاج إلى تغيير نوع المَعلمة من SLint32 إلى SLuint32 أو ما شابه، أو إضافة عملية تحويل.
  • Equalizer::GetPresetName ينسخ السلسلة إلى ذاكرة التطبيق بدلاً من عرض مؤشر إلى ذاكرة التنفيذ. سيكون هذا التغيير مهمًا، لذا ننصحك بتجنّب استدعاء هذه الطريقة أو عزل طريقة استخدامها.
  • ستكون هناك حقول إضافية في أنواع البنية. أمّا بالنسبة إلى معلَمات الإخراج، فيمكن تجاهل هذه الحقول الجديدة، ولكن بالنسبة إلى معلَمات الإدخال، يجب إعداد الحقول الجديدة. لحسن الحظ، من المتوقّع أن تكون جميع هذه الحقول في مناطق لا يتوفّر فيها نظام التشغيل Android.
  • ستتغير المعرفات الفريدة العامة (GUID) للواجهة. يمكنك الإشارة إلى الواجهات بالاسم الرمزي بدلاً من معرّف GUID لتجنُّب الاعتماد على واجهة أخرى.
  • سيتغيّر سعر الاشتراك SLchar من unsigned char إلى char. ويؤثر ذلك بشكل أساسي في محدِّد موقع بيانات معرّف الموارد المنتظم (URI) وتنسيق بيانات MIME.
  • ستتم إعادة تسمية SLDataFormat_MIME.mimeType إلى pMimeType، وستتم إعادة تسمية SLDataLocator_URI.URI إلى pURI. ننصحك ببدء SLDataFormat_MIME وSLDataLocator_URI من خلال استخدام قائمة قيم مفصولة بفواصل ومغلقة بين قوسين، بدلاً من استخدام اسم الحقل، وذلك لعزل الرمز البرمجي عن هذا التغيير. يتم استخدام هذا الأسلوب في مثال التعليمة البرمجية.
  • لا يسمح SL_DATAFORMAT_PCM للتطبيق بتحديد تمثيل البيانات على أنّها عدد صحيح موجب أو عدد صحيح غير موجب أو عدد عشري. يفترض تنفيذ Android أنّ البيانات التي تبلغ سعتها 8 بت هي عدد صحيح غير موقَّع وأنّ البيانات التي تبلغ سعتها 16 بت هي عدد صحيح موقَّع. بالإضافة إلى ذلك، الحقل samplesPerSec هو اسم غير صحيح، لأنّ الوحدات الفعلية هي ملي هرتز. من المتوقّع حلّ هذه المشاكل في الإصدار التالي من OpenSL ES الذي سيوفّر تنسيقًا جديدًا لبيانات PCM إضافية يتيح للتطبيق تحديد التمثيل بشكل صريح وتصحيح اسم الحقل. لأنّ هذا سيكون تنسيق بيانات جديدًا، وسيظل التنسيق الحالي لبيانات PCM متاحًا (على الرغم من أنّه متوقف)، من المفترض ألا يتطلب أي تغييرات فورية على الرمز الخاص بك.