ניתן להשתמש במנגנונים הבאים כדי להשמיע אודיו ב-Android:
כל מנגנון מאפשר להפעיל אודיו ב-Android. לרדיו
או הפעלה מהתקני קלט, ייתכן שהאפשרויות האלה לא יספיקו
למרות שניתן לשלב כל אחד מהם עם הקלטת אודיו או
MediaRecorder
class כדי להקליט תחילה את האודיו ואז להשמיע אותו מ-Android. למערכת
ספציפי, משתמשים בפרטים הבאים כדי לחבר
למיקסר פלט ב-AAOS.
נגן HwAudioSource
HwAudioSource
מחבר את מכשיר מקור האודיו ישירות למיקסר Android.
גורמים מניעים
יכולות להיות כמה מגבלות כשמשתמשים באודיו ממכשיר למכשיר או מהחומרה תיקון עם Android. כל אפשרות לא יכולה לקבל אירועים מרכזיים במדיה כמו PLAY, השהיה ו-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
)
ישירות ל-sink המדיה לעקוף את מערבל התוכנה. לאחר מכן צריך להשתמש
מיקסר חומרה כדי לשלב את דגימות האודיו מ-Android ומ-FM_TUNER
עבור
ל-sink. כשיוצרים תיקון אודיו ישירות מהמקור של FM_TUNER
למדיה
sink:
בקרת עוצמת הקול חלה על ה-sink מדיה והיא אמורה להשפיע גם על 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>
ממשק API של מנהל התקן אודיו
אפשר להשתמש ב-getExternalSources()
כדי לאחזר רשימה של מקורות זמינים
(מזוהה לפי כתובת), ולאחר מכן ליצור תיקונים לאודיו בין מקורות אלה
יציאות ל-sink לפי שימושים באודיו. נקודות הכניסה המתאימות באודיו 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
כדי לקבל גישה.
אפשר לקרוא פרטים נוספים בקטע הטמעת רדיו. בפיתוח אפליקציית רדיו.