خدمة المكوّن الإضافي للصوت في السيارة

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

  • التحكّم في أولويّة الصوت
  • التحكّم في مستوى الصوت وكتمه
  • التحكّم في تجنّب التداخل مع أصوات أخرى

بنية خدمة المكوّنات الإضافية للسيارة

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

صورة

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

public final class OemCarServiceImp extends OemCarService {
    @Override
    public OemCarAudioFocusService getOemAudioFocusService();

    @Override
    public OemCarAudioDuckingService getOemAudioDuckingService();

    @Override
    public OemCarAudioVolumeService getOemAudioVolumeService();
}

على سبيل المثال، يمكنك الاطّلاع على التطبيق المرجعي للاختبار المحدّد في packages/services/Car/tests/OemCarServiceTestApp.

على الرغم من أنّ خدمة السيارة هي التي تبدأ الخدمة، فإنّها لا تكتسب تلقائيًا الأذونات المتاحة لخدمة الصوت في السيارة. وبالتالي، يجب الحصول على أي إذن مطلوب من خدمات المصنّع الأصلي للسيارة باستخدام الآلية المناسبة. على سبيل المثال، يمكنك الاطّلاع على packages/services/Car/data/etc/com.android.car.oemcarservice.testapp.xml.

بنية خدمة الصوت في السيارة مع بنية خدمة المصنّع الأصلي للسيارة

في AAOS، تدير خدمة الصوت في السيارة هذه الإجراءات:

  • التوجيه الصوتي
  • أولويّة الصوت
  • تجنّب التداخل مع أصوات أخرى
  • مستوى الصوت وكتمه

قبل Android 14، كان هذا السلوك ثابتًا إلى حد كبير ولا يمكن تعديله إلا من خلال الإعدادات، ولكن في مجموعة محدودة جدًا من الحالات. قدّم Android 14 آلية لخدمة الصوت في السيارة للتواصل مع مكوّن محدّد من قِبل المصنّع الأصلي للسيارة يدير ما يلي:

  • أولويّة الصوت
  • تجنّب التداخل مع أصوات أخرى
  • مستوى الصوت وكتمه

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

صورة

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

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

لاتّخاذ إجراءات، تستدعي خدمة الصوت في السيارة خدمات المصنّع الأصلي للسيارة. يتم إجراء هذه المكالمات بين العمليات، ما يتطلّب التواصل بين العمليات (IPC). يضيف التواصل بين العمليات وقت استجابة إلى كل مكالمة. من المهم تقليل وقت الاستجابة في خدمة المصنّع الأصلي للسيارة.

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

تعريفات خدمة الصوت في السيارة من المصنّع الأصلي

خدمة أولويّة الصوت في السيارة من المصنّع الأصلي

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

  • تفاعل متزامن يمكن لحاملي التركيز الحفاظ على التركيز في الوقت نفسه.

  • تفاعلات حصرية يأخذ طلب التركيز الوارد التركيز من حامل التركيز الحالي.

  • تفاعل الرفض يتم رفض طلب التركيز الوارد استنادًا إلى حامل التركيز الحالي.

على الرغم من أنّ هذا يكفي لبعض حالات الاستخدام في السيارات، فإنّه لا يفي بجميع احتياجات التفاعل التي قد تختلف بسبب متطلبات المصنّع الأصلي للسيارة. لهذا السبب، نقدّم OemCarAudioFocusService:

public interface OEmCarAudioFocusService {
    OemCarAuddioFocusResults evaluateAudioFocusRequest(
        OemCarAudioFocusEvaluationRequest request);
    
    void notifyAudioFocusChange(
        List<AudioFocusEntry> holder,
        List<AudioFocusEntry> losers, int zoneId);
}

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

يمكن استخدام هذه المعلومات لتقييم newFocusRequest مقارنةً بحاملي التركيز الحاليين في focusHolders وخاسري التركيز الحاليين في focusLosers. يجب أن تعرض واجهة برمجة التطبيقات النتائج:

class OemCarAudioFocusResult {
    int audioZoneId;
    int audioFocusEvaluationResults;
    AudioFocusEntry focusResult;
    List<AudioFocusEntry> newLosers;
    List<AudioFocusEntry> newlyBlocked;
}

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

يحتوي newLosers على الإدخالات التي كانت تحتفظ بالتركيز سابقًا ولكن يجب أن تفقد التركيز الآن، إما بشكل دائم أو مؤقت. ستتم إزالة خاسري التركيز الدائمين من مجموعة التركيز على الصوت، وسيتم نقل خاسري التركيز المؤقتين إلى مجموعة خاسري التركيز الحالية إلى أن يستعيدوا التركيز أو يتم إيقاف طلب التركيز الأصلي. على أي حال، سيتلقّى مستمع التركيز للطلبات إشعارًا بفقدان التركيز المقابل.

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

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

إرشادات تقييم التركيز

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

  • بدون أي تركيز على الصوت بأولوية عالية (مثل مكالمة هاتفية أو حالة طوارئ أو حالة أمان)، يجب أن تتمكّن التطبيقات من الحصول على التركيز على الصوت إما بشكل مؤقت أو دائم.

  • أثناء تفعيل التركيز على الوسائط، يجب أن تتمكّن التطبيقات التي تطلب ما يلي من الحصول على التركيز إما بشكل متزامن أو حصري:

    • التركيز على استخدام المكالمات

    • التركيز على استخدام التنقّل

    • التركيز على استخدام "مساعد Google"

  • أثناء تفعيل التطبيقات التي تستخدم التركيز على الصوت بأولوية عالية (مثل مكالمة هاتفية أو تنبيه طوارئ أو تنبيه أمان)، يجب منح أي طلب وارد للتركيز على الصوت تم تأخيره أو تأخيره حسب الحاجة.

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

خدمة مستوى الصوت في السيارة من المصنّع الأصلي

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

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

  1. التنقّل
  2. الاتصال
  3. موسيقى
  4. إشعار
  5. بطلب صوتي
  6. نغمة رنين الاتصال
  7. صوت النظام
  8. الأمان
  9. المنبّه
  10. إشعار
  11. حالة المركبة
  12. طوارئ

لجعل إدارة أحداث مفتاح مستوى الصوت أقل تعقيدًا، تتضمّن خدمة الصوت في السيارة قائمة ثانية بأولوية سياق الصوت:

  1. الاتصال
  2. الوسائط
  3. إشعار
  4. بطلب صوتي

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

يمكن ضبط الإصدار الفعلي لمستوى الصوت باستخدام الإعداد audioVolumeAdjustmentContextsVersion. يمكن ضبط الإعداد على 1 أو 2 (2 هو الإعداد التلقائي).

لتوفير المزيد من المرونة لإدارة مستوى الصوت، تم تقديم OemCarAudioVolumeService في Android 14:

public interface OemCarAudioVolumeService {
    OemCarvolumeChangeInfo getSuggestedGroupForVolumeChange(
OemCarAudioVolumeRequest request, int volumeAdjustment);
}

تتضمّن خدمة مستوى الصوت في السيارة من المصنّع الأصلي طريقة واحدة تأخذ volumeAdjustment وOemCarAudioVolumeRequest:

class OemCarAudioVolumeRequest {
    int audioZoneId;
    int callState;
    List<AudioAttributes> activePlaybackAttributes;
    List<AudioAttributes> duckedAttributes;
    List<CarVolumeGroupInfo> volumeGroupState;
}

تحتوي activePlaybackAttributes في الطلب على سمات الصوت النشطة. duckedAttributes هي جميع سمات الصوت التي تم تجنّب التداخل معها حاليًا. volumeGroupState هي الحالة الحالية لمجموعة مستويات الصوت. يمثّل الطلب الحالة الحالية لمجموعة الصوت ويمكن استخدامه لتحديد مجموعة مستوى الصوت التي يجب تغييرها. يجب عرض النتائج في OemCarVolumeChangeInfo:

class OemCarVolumeChangeInfo {
    boolean change;
    CarVolumeGroupInfo volumeGroupChanged;
}

تشير القيمة المنطقية change إلى ما إذا تم تغيير أي مستوى صوت، وتشير القيمة true إلى حدوث تغيير ويجب تعديل مجموعة مستوى الصوت. volumeGroupChanged هي مجموعة مستوى الصوت الفعلية التي يجب تغييرها. يجب تغيير هذه المجموعة وفقًا للمعلمة الأصلية volumeAdjustment التي تم تمريرها إلى واجهة برمجة التطبيقات. على سبيل المثال، إذا أشارت النتائج إلى أنّه يجب كتم مجموعة مستوى صوت التنقّل، ستكون القيمة المنطقية true ويجب أن تكون مجموعة مستوى الصوت المعروضة هي مجموعة مستوى صوت التنقّل.

خدمة تجنّب التداخل مع أصوات أخرى في السيارة من المصنّع الأصلي

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

  • تجنّب التداخل مع أصوات الطوارئ مع كل الأصوات باستثناء أصوات المكالمات
  • تجنّب التداخل مع أصوات الأمان مع كل الأصوات باستثناء أصوات الطوارئ
  • تجنّب التداخل مع أصوات التنقّل مع كل الأصوات باستثناء أصوات الأمان والطوارئ
  • تجنّب التداخل مع أصوات المكالمات مع كل الأصوات باستثناء أصوات الأمان والطوارئ والتنقّل
  • تجنّب التداخل مع أصوات "مساعد Google" مع أصوات رنين المكالمات
  • يجب تجنّب التداخل مع أصوات الموسيقى والإشعارات مع كل الأصوات

هذه القواعد ليست شاملة ويظل المصنّعون الأصليون للسيارات مسؤولين عن تحديد كيفية تجنّب التداخل مع الأصوات استنادًا إلى هذه الإرشادات. يمكن للمصنّعين الأصليين للسيارات التحكّم في هذه الاقتراحات بشكل أكثر نشاطًا استنادًا إلى المتطلبات المتاحة. تم تقديم OemCarDuckingService في Android 14:

class OemCarAudioDuckingService {
List<AudioAttributes>   evaluateAttributesToDuck(
        OemCarAudioVolumeRequest request);
}

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

  • سمة الصوت التي يتم تجنّب التداخل معها حاليًا:

    • إذا كانت السمة مدرَجة في القائمة، سيستمر تجنّب التداخل معها
    • إذا لم تكن السمة مدرَجة في القائمة، سيتم إيقاف تجنّب التداخل معها
  • سمة الصوت التي لا يتم تجنّب التداخل معها حاليًا:

    • إذا كانت السمة مدرَجة في القائمة، سيتم تجنّب التداخل معها
    • إذا لم تكن السمة مدرَجة في القائمة، سيتم إيقاف تجنّب التداخل معها

تحدّد خدمة الصوت في السيارة بعد ذلك مصادر إخراج الصوت التي تنتمي إليها سمات الصوت وتضيفها إلى قائمة أجهزة إخراج الصوت التي تم تجنّب التداخل معها أو قائمة أجهزة الصوت التي لم يتم تجنّب التداخل معها، على التوالي. يتم إرسال ذلك في النهاية إلى AudioControl HAL لإجراء عملية تجنّب التداخل المطلوبة على مستوى الأجهزة.

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

صورة

يبدأ التسلسل عندما يطلب أحد التطبيقات إدارة أولويّة الصوت من خلال واجهات برمجة تطبيقات مدير الصوت العامة. تتم إعادة توجيه الطلب إلى خدمة الصوت في السيارة لتحديد النتائج. عند تحديد أولويّة الصوت، يتم تقييم تجنّب التداخل مع أصوات أخرى من خلال استدعاء خدمة الصوت في السيارة OemCarAudioDuckingService لتقييم سمات الصوت التي يجب تجنّب التداخل معها. بعد عرض النتائج من واجهة برمجة التطبيقات evaluateAttributesToDuck، يتم احتساب أجهزة الصوت التي يجب تجنّب التداخل معها، وأخيرًا يتم إرسال المعلومات إلى AudioControl لتطبيق تجنّب التداخل مع أجهزة الصوت.

التنفيذ المرجعي لخدمة الصوت في السيارة من المصنّع الأصلي

تقدّم AAOS تنفيذًا مرجعيًا لخدمة المصنّع الأصلي للسيارة في packages/services/Car/tests/OemCarServiceTestApp، التي تنفّذ OemCarService، بالإضافة إلى OemCarAudioFocusService و OemCarAudioDuckingService وOemCarAudioVolumeService. بالنسبة إلى الخدمة الأخيرة، تستخدم كل خدمة ملف XML لتحميل سلوك ثابت. على سبيل المثال، تحمِّل OemCarAudioFocusServiceImp الملف oem_focus_config.xml الذي يحتوي على مصفوفة تفاعل. تُستخدم المصفوفة لتقييم طلب التركيز عند استدعاء evaluateAudioFocusRequest.

تصحيح أخطاء التطبيق المرجعي للاختبار

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

<!-- This is the component name for the OEM customization service. OEM can choose to implement
this service to customize car service behavior for different policies. If OEMs choose to
implement it, they have to implement a service extending OemCarService exposed by car-lib,
and implement the required component services.
If the component name is invalid, CarService would not connect to any OEM service.
Component name can not be a third party package. It should be pre-installed -->
<string name="config_oemCarService" translatable="false">
com.android.car.oemcarservice.testapp/.OemCarServiceImpl
</string>

للتحقّق من أنّ خدمة المصنّع الأصلي للسيارة تستخدم أمر dump لخدمة السيارة من أجل خدمة المصنّع الأصلي للسيارة:

adb shell dumpsys car_service --oem-service

قد تكون النتائج مشابهة للناتج أدناه:

***CarOemProxyService dump***
  mIsFeatureEnabled: true
  mIsOemServiceBound: true
  mIsOemServiceReady: true
  mIsOemServiceConnected: true
  mInitComplete: true
  OEM_CAR_SERVICE_CONNECTED_TIMEOUT_MS: 5000
  OEM_CAR_SERVICE_READY_TIMEOUT_MS: 5000
  mComponentName: com.android.car.oemcarservice.testapp/.OemCarServiceImpl

تحدّد كل قيمة منطقية في كل مجموعة من معلومات dump حالة الميزة والخدمة. على سبيل المثال، تحدّد معلومات `dump`‏ mIsOemServiceReady ما إذا كانت الخدمة جاهزة للاستخدام، حيث تشير القيمة true إلى أنّها جاهزة وتشير القيمة false إلى أنّها غير جاهزة.