חיבור מכשיר לקליטת נתונים ב-AAOS

ניתן להשתמש במנגנונים הבאים כדי להשמיע אודיו ב-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 כדי לקבל גישה.

אפשר לקרוא פרטים נוספים בקטע הטמעת רדיו. בפיתוח אפליקציית רדיו.