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