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

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

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

مشغِّل HwAudioSource

من خلال ميزة "HwAudioSource"، يتم توصيل جهاز مصدر الصوت مباشرةً بأداة مزج Android.

الدوافع

قد تنشأ العديد من القيود عند استخدام أجهزة صوتية من جهاز إلى آخر أو من جهاز آخر. باستخدام Android. لا يمكن لكل خيار تلقّي الأحداث الرئيسية للوسائط، مثل PLAY وإيقاف مؤقت وإيقاف، لأنّها تتحايل على صوت 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) الصوتية

في هذا المشغِّل الجديد، ضَع في اعتبارك هذه التوقعات في ما يخص 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" ثم ربط منافذ التشكيلة منافذ الأجهزة.

نموذج الإعدادات

اطّلِع على نموذج الضبط هذا 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>

واجهة برمجة تطبيقات برنامج تشغيل الصوت

يمكنك استخدام getExternalSources() لاسترداد قائمة بالمصادر المتاحة. (محددة حسب العنوان)، ثم إنشاء رموز تصحيح صوتية بين هذه المصادر وتستوعب المنافذ حسب استخدامات الصوت. نقاط الإدخال المقابلة في طبقة تجريد الأجهزة (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 للوصول.

راجِع تنفيذ الراديو للحصول على تفاصيل حول: إنشاء تطبيق راديو.