یک دستگاه ورودی را در AAOS وصل کنید

برای پخش صدا در اندروید می توانید از این مکانیسم ها استفاده کنید:

هر مکانیزم امکان پخش صدا را در اندروید می دهد. برای پخش رادیو یا پخش از دستگاه‌های ورودی، این گزینه‌ها ممکن است کافی نباشند، اگرچه هر کدام می‌توانند با ضبط صدا یا کلاس MediaRecorder همراه شوند تا ابتدا صدا را ضبط کرده و سپس آن را از Android پخش کنند. به طور خاص برای برنامه های سیستم، اطلاعات زیر را می توان برای اتصال یک دستگاه ورودی به یک میکسر خروجی در AAOS استفاده کرد.

پخش کننده HwAudioSource

HwAudioSource دستگاه منبع صوتی را مستقیماً به یک میکسر اندروید متصل می کند.

انگیزه ها

ممکن است هنگام استفاده از وصله صوتی دستگاه به دستگاه یا سخت افزار با Android، چندین محدودیت ایجاد شود. هر گزینه نمی‌تواند رویدادهای کلیدی رسانه‌ای مانند PLAY ، MAUSE و STOP را دریافت کند و چون پشته صوتی 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>

با پیکربندی این دستگاه، می‌توانید با استفاده از AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS در ارتباط با AudioDeviceInfo.TYPE_FM_TUNER ، دستگاه ورودی رادیو FM را پیدا کنید.

پچ های صوتی ایجاد کنید

شما می توانید یک پچ صوتی بین دو پورت صدا ایجاد کنید، یک پورت میکس یا یک پورت دستگاه. به طور معمول، یک پچ صوتی از پورت ترکیبی به پورت دستگاه برای پخش است در حالی که جهت معکوس برای ضبط است.

به عنوان مثال، یک وصله صوتی که نمونه های صوتی را از منبع FM_TUNER مستقیماً به سینک رسانه هدایت می کند، میکسر نرم افزار را دور می زند. سپس باید از یک میکسر سخت افزاری برای مخلوط کردن نمونه های صوتی از Android و FM_TUNER برای سینک استفاده کنید. هنگام ایجاد یک وصله صوتی مستقیماً از منبع FM_TUNER به سینک رسانه:

  • کنترل صدا روی سینک رسانه اعمال می‌شود و باید روی صدای Android و FM_TUNER تأثیر بگذارد.

  • کاربران می‌توانند از طریق یک سوئیچ برنامه ساده، بین صدای Android و FM_TUNER جابجا شوند (بدون نیاز به انتخاب منبع رسانه صریح).

پیاده سازی های خودرو همچنین ممکن است نیاز به ایجاد یک پچ صوتی بین دو پورت دستگاه داشته باشند. برای انجام این کار، ابتدا باید پورت های دستگاه و مسیرهای احتمالی را در audio_policy_configuration.xml اعلام کنید و سپس mixport ها را با پورت های دستگاه مرتبط کنید.

پیکربندی نمونه

این نمونه پیکربندی، 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 نیاز دارد.

برای جزئیات در مورد ساخت یک برنامه رادیویی به Implement radio مراجعه کنید.