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_sourceAUDIO_SOURCE_FM_TUNERであることを想定しています。

  • in_readオーディオ バッファーにブロードキャスト ラジオのオーディオ データを埋めます。

audio_policy_configuration.xmlでタイプAUDIO_DEVICE_IN_FM_TUNERを使用してチューナー デバイスを構成することをお勧めします。

<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_INPUTSAudioDeviceInfo.TYPE_FM_TUNERを組み合わせて使用​​することで、FM ラジオ入力デバイスを簡単に見つけることができます。

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

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

たとえば、オーディオ サンプルをFM_TUNERソースからメディア シンクに直接ルーティングするオーディオ パッチは、ソフトウェア ミキサーをバイパスします。次に、ハードウェア ミキサーを使用して、Android とシンク用のFM_TUNERからのオーディオ サンプルをミックスする必要があります。 FM_TUNERソースからメディア シンクに直接オーディオ パッチを作成する場合:

  • ボリューム コントロールはメディア シンクに適用され、Android とFM_TUNERオーディオの両方に影響します。

  • ユーザーは、簡単なアプリの切り替えを通じて Android とFM_TUNERオーディオを切り替えることができます (明示的なメディア ソースの選択は必要ありません)。

自動車実装では、2 つのデバイス ポート間にオーディオ パッチを作成する必要がある場合もあります。これを行うには、まずデバイス ポートと可能なルートを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を使用することをお勧めします。同じソースおよびオーディオ属性に対して複数のオーディオ ソースを作成できます。通常のラジオの使用に 1 台を使用するだけでなく、交通アナウンス用に 2 台目を使用することも可能です。

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

ラジオ アプリの構築の詳細については、 「ラジオの実装」を参照してください。