توصيل جهاز إدخال في نظام التشغيل Android Automotive

يمكنك استخدام آليات التشغيل التالية لتشغيل الصوت في Android:

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

مشغّل HwAudioSource

HwAudioSource يربط جهاز مصدر الصوت مباشرةً بجهاز مزج صوت على Android.

الدوافع

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

استخدام HwAudioSource

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

mHwAudioSource = new HwAudioSource.Builder()
                .setAudioDeviceInfo(AudioDeviceInfo: info)
                .setAudioAttributes(new AudioAttributes.Builder()
                        .setUsage(AudioAttributes.USAGE_MEDIA)
                        .build())
                .build();
mHwAudioSource.play();
mHwAudioSource.stop();

تغييرات على HAL للصوت

مع هذا المشغّل الجديد، يجب مراعاة التوقعات التالية لواجهة برمجة التطبيقات لمعالجة الصوت. على سبيل المثال، device/generic/car/emulator/audio/driver/audio_hw.c.

  • يتوقّع adev_create_audio_patch أن يطلب إنشاء تصحيح صوتي من جهاز إلى أداة مزج.

  • تتوقّع adev_open_input_stream أن يكون audio_source هو AUDIO_SOURCE_FM_TUNER.

  • in_read تملأ ذاكرة التخزين المؤقت للصوت ببيانات الصوت الإذاعي.

ننصحك بضبط جهاز مزوّد بجهاز تحكّم في القنوات من النوع AUDIO_DEVICE_IN_FM_TUNER في audio_policy_configuration.xml:

<devicePort
    tagName="Tuner_source"
    type="AUDIO_DEVICE_IN_FM_TUNER"
    role="source"
    address="tuner0">
    <profile
        name=""
        format="AUDIO_FORMAT_PCM_16_BIT"
        samplingRates="48000"
        channelMasks="AUDIO_CHANNEL_IN_STEREO"/>
</devicePort>

من خلال ضبط الجهاز على هذا النحو، يمكنك تسهيل العثور على جهاز إدخال راديو FM باستخدام AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS بالاشتراك مع AudioDeviceInfo.TYPE_FM_TUNER.

إنشاء مقاطع صوتية

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

على سبيل المثال، يتجاهل أداة خلط البرامج تصحيحًا صوتيًا يوجّه عيّنات صوتية من مصدر FM_TUNER مباشرةً إلى وحدة تخزين الوسائط. بعد ذلك، يجب استخدام مخرج تجهيزات لمزج عيّنات الصوت من Android وFM_TUNER لأجل الوحدة المُدمجة. عند إنشاء تصحيح صوتي مباشرةً من مصدر FM_TUNER إلى وجهة الوسائط:

  • ينطبق التحكّم في مستوى الصوت على وحدة معالجة الوسائط ومن المفترض أن يؤثر في صوت Android وFM_TUNER.

  • يمكن للمستخدمين التبديل بين الصوت على Android وFM_TUNER من خلال تطبيق بسيط للتبديل (لا حاجة إلى اختيار مصدر وسائط صريح).

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

مثال على الإعداد

اطّلِع على نموذج الإعداد التالي: device/generic/car/emulator/audio/audio_policy_configuration.xml.

<audioPolicyConfiguration>
    <modules>
        <module name="primary" halVersion="3.0">
            <attachedDevices>
                <item>bus0_media_out</item>
                <item>bus1_audio_patch_test_in</item>
            </attachedDevices>
            <mixPorts>
                <mixPort name="mixport_bus0_media_out" role="source"
                        flags="AUDIO_OUTPUT_FLAG_PRIMARY">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000"
                            channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                </mixPort>
                <mixPort name="mixport_audio_patch_in" role="sink">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                           samplingRates="48000"
                           channelMasks="AUDIO_CHANNEL_IN_STEREO"/>
                </mixPort>
            </mixPorts>
            <devicePorts>
                <devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS"
                        address="bus0_media_out">
                    <profile balance="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                    <gains>
                        <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
                                minValueMB="-8400" maxValueMB="4000" defaultValueMB="0" stepValueMB="100"/>
                    </gains>
                </devicePort>
                <devicePort tagName="bus1_audio_patch_test_in" type="AUDIO_DEVICE_IN_BUS" role="source"
                        address="bus1_audio_patch_test_in">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000" channelMasks="AUDIO_CHANNEL_IN_STEREO"/>
                    <gains>
                        <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
                                minValueMB="-8400" maxValueMB="4000" defaultValueMB="0" stepValueMB="100"/>
                    </gains>
                </devicePort>
            </devicePorts>
            <routes>
                <route type="mix" sink="bus0_media_out" sources="mixport_bus0_media_out,bus1_audio_patch_test_in"/>
                <route type="mix" sink="mixport_audio_patch_in" sources="bus1_audio_patch_test_in"/>
            </routes>
        </module>
    </modules>
</audioPolicyConfiguration>

واجهة برمجة تطبيقات Audio driver

يمكنك استخدام getExternalSources() لاسترداد قائمة بالمصادر المتاحة (المحدَّدة حسب العنوان)، ثم إنشاء مقاطع صوتية بين هذه المصادر و ports sink حسب استخدامات الصوت. تظهر نقاط الإدخال المقابلة في Audio HAL في IDevice.hal:

Interface IDevice {
...
/
*   Creates an audio patch between several source and sink ports.  The handle
*   is allocated by the HAL and must be unique for this audio HAL module.
*
*   @param sources patch sources.
*   @param sinks patch sinks.
*   @return retval operation completion status.
*   @return patch created patch handle.
*/
createAudioPatch(vec<AudioPortConfig> sources, vec<AudioPortConfig> sinks)
       generates (Result retval, AudioPatchHandle patch);

*   Release an audio patch.
*
*   @param patch patch handle.
*   @return retval operation completion status.
*/
releaseAudioPatch(AudioPatchHandle patch) generates (Result retval);
...
}

أداة ضبط الراديو

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

في حال تسجيل FM_TUNER، تم في Android 11 تغيير الإذن لإجراء ذلك إلى android.permission.CAPTURE_AUDIO_OUTPUT. لم يعُد يتم التحقّق من إذن OP_RECORD_AUDIO، والذي ينطبق على الميكروفونات فقط. من المفترض ألا يؤثر هذا التغيير في التطبيقات لأنّ FM_TUNER يتطلب حاليًا إذن SYSTEM_API للوصول إلى البيانات.

اطّلِع على مقالة تنفيذ ميزة "الراديو" لمعرفة تفاصيل عن إنشاء تطبيق راديو.