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

يمكنك استخدام الآليات التالية لتشغيل الصوت في 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();

التغييرات في Audio HAL

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

لمعرفة التفاصيل حول إنشاء تطبيق راديو، يُرجى الاطّلاع على مقالة تنفيذ الراديو.