AAOS で入力デバイスを接続する

Android では、次のメカニズムを使用して音声を再生できます。

それぞれのメカニズムにより、Android でオーディオの再生を実行できます。ラジオ用 入力デバイスから再生する場合、これらのオプションでは不十分な場合があります。 ただし、それぞれに音声キャプチャや MediaRecorder クラスを使用して、まず音声をキャプチャしてから Android から再生します。システムの場合 入力と接続に以下の情報を接続できます。 AAOS で出力ミキサーに接続します。

HwAudioSource プレーヤー

HwAudioSource は、音源デバイスを Android ミキサーに直接接続します。

目的

Android でデバイス間パッチまたはハードウェア オーディオ パッチを使用すると、いくつかの制限が生じる場合があります。各オプションでは、次のようなメディア キーイベントを受信できません。 PLAYPAUSESTOP です。これらは、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 と組み合わせて使用します。

オーディオ パッチを作成する

ミックスポートまたはデバイスポートの 2 つのオーディオ ポート間にオーディオ パッチを作成できます。通常、ミックスポートからデバイスポートへのオーディオ パッチは再生用で、逆方向はキャプチャ用です。

FM_TUNER ソースからオーディオ サンプルをルーティングするオーディオ パッチなど。 直接メディアシンクに送信すると、ソフトウェア ミキサーをバイパスできます。その後、 ハードウェア ミキサーで Android のオーディオ サンプルと FM_TUNER のオーディオ サンプルを シンクですFM_TUNER ソースからメディアに直接オーディオ パッチを作成する場合 シンク:

  • 音量調節はメディアシンクに適用され、Android と Android の両方に と FM_TUNER 音声。

  • シンプルなアプリで Android と FM_TUNER の音声を切り替えることができます。 スイッチ(明示的なメディアソースの選択は不要)

Automotive の実装では、2 つの間でオーディオ パッチを作成する必要が生じる場合もあります。 接続します。これを行うには、まずデバイスのポートを宣言し、 audio_policy_configuration.xml でルートを作成し、mixport を Pod に 接続します。

構成の例

こちらのサンプル構成をご覧ください。 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 を使用することをおすすめします。 パッチの作成と、メディアキーの処理のためのメディア セッションの両方を処理します。 できます。同じソースとオーディオに対して複数のオーディオ ソースを作成可能 属性です。通常のラジオ用のほかに 2 つ目は交通情報です

FM_TUNER を録音する場合、Android 11 では 実行権限が android.permission.CAPTURE_AUDIO_OUTPUT に変更されました。 適用される OP_RECORD_AUDIO 権限チェックが行われなくなりました。 マイクのみです。FM_TUNER はすでにアプリに影響しているため、アプリには影響ありません。 アクセスするには SYSTEM_API 権限が必要です。

詳細については、ラジオの実装をご覧ください。 ラジオアプリの作成です