قم بتوصيل جهاز الإدخال في AAOS

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

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

مشغل HwAudioSource

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

الدوافع

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

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