یک دستگاه ورودی را در 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>

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

ایجاد پچ‌های صوتی

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

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

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

  • کاربران می‌توانند از طریق یک سوئیچ ساده در برنامه، بین صدای اندروید و 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>

رابط برنامه‌نویسی درایور صوتی

شما می‌توانید از 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.permission.CAPTURE_AUDIO_OUTPUT تغییر یافته است. دیگر از طریق بررسی مجوز OP_RECORD_AUDIO که فقط برای میکروفون‌ها اعمال می‌شود، انجام نمی‌شود. این موضوع نباید روی برنامه‌ها تأثیر بگذارد زیرا FM_TUNER از قبل برای دسترسی به مجوز SYSTEM_API نیاز دارد.

برای جزئیات بیشتر در مورد ساخت یک برنامه رادیویی، به بخش پیاده‌سازی رادیو مراجعه کنید.