يمكنك استخدام الآليات التالية لتشغيل الصوت في Android:
تتيح كل آلية تشغيل الصوت في Android. بالنسبة إلى تشغيل الراديو أو التشغيل من أجهزة الإدخال، قد لا تكون هذه الخيارات كافية، على الرغم من إمكانية ربط كل خيار بتسجيل الصوت أو استخدام فئة MediaRecorder
لتسجيل الصوت أولاً ثم تشغيله من Android. بالنسبة إلى تطبيقات النظام على وجه الخصوص، يمكن استخدام المعلومات التالية لربط جهاز إدخال بخلاط إخراج في AAOS.
HwAudioSource player
HwAudioSource
يربط جهاز مصدر الصوت مباشرةً بجهاز خلط الصوت Android.
الدوافع
قد تنشأ عدة قيود عند استخدام وصلة صوتية من جهاز إلى جهاز أو وصلة صوتية للأجهزة مع Android. لا يمكن لكل خيار تلقّي أحداث مفاتيح الوسائط، مثل PLAY وPAUSE وSTOP، ولأنّها تتجاوز حزمة الصوت في Android، يتطلّب كل خيار أجهزة لمزج التصحيح مع الصوت الآخر من Android.
Use 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>
واجهة برمجة تطبيقات برنامج تشغيل الصوت
يمكنك استخدام 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
، تم تغيير إذن التسجيل في الإصدار 11 من نظام التشغيل Android إلى android.permission.CAPTURE_AUDIO_OUTPUT
.
ولم يعُد يخضع لفحص إذن OP_RECORD_AUDIO
الذي ينطبق على الميكروفونات فقط. من المفترض ألا يؤثر ذلك في التطبيقات لأنّ FM_TUNER
يتطلّب حاليًا الإذن SYSTEM_API
للوصول إلى البيانات.
اطّلِع على تنفيذ الراديو للحصول على تفاصيل حول إنشاء تطبيق راديو.