חבר התקן קלט ב-AAOS

אתה יכול להשתמש במנגנונים הבאים כדי לנגן אודיו באנדרואיד:

כל מנגנון מאפשר לבצע השמעת אודיו באנדרואיד. עבור השמעת רדיו או השמעה מהתקני קלט, ייתכן שהאפשרויות הללו לא יספיקו, אם כי כל אחת מהן יכולה להיות מחוברת ללכידת אודיו או למחלקת MediaRecorder כדי ללכוד תחילה את האודיו ולאחר מכן להשמיע אותו מאנדרואיד. עבור אפליקציות מערכת במיוחד, ניתן להשתמש במידע הבא כדי לחבר התקן קלט למיקסר פלט ב-AAOS.

נגן HwAudioSource

HwAudioSource מחבר את התקן מקור השמע ישירות למיקסר אנדרואיד.

מוטיבציות

מספר מגבלות עשויות להיווצר בעת שימוש בתיקון שמע בין מכשיר למכשיר או חומרה עם אנדרואיד. כל אפשרות אינה מסוגלת לקבל אירועי מפתח מדיה כגון PLAY , PAUSE ו- STOP , ומכיוון שהם עוקפים את ערימת האודיו של אנדרואיד, כל אחת מהאפשרויות דורשת חומרה כדי לערבב את התיקון לאודיו אחר מאנדרואיד.

השתמש ב-HwAudioSource

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

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

API של מנהל השמע

אתה יכול להשתמש 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 לגישה.

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