يمكنك استخدام هذه الآليات لتشغيل الصوت في 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
للوصول.
راجع تنفيذ الراديو للحصول على تفاصيل حول إنشاء تطبيق راديو.