この記事では、プレーヤーの作成に代わる方法について説明します。
HwAudioSource プレーヤー
HwAudioSource はオーディオ ソース デバイスを Android ミキサーに直接接続します。
Android でデバイス間パッチまたはハードウェア オーディオ パッチを使用すると、いくつかの制限が生じる場合があります。再生、一時停止、停止などのメディア キーイベントを受信できません。また、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_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_INPUTS
)を AudioDeviceInfo.TYPE_FM_TUNER
と組み合わせて使用することで、FM ラジオ入力デバイスを検出しやすくなります。
オーディオ パッチの作成
ミックスポートまたはデバイスポートの 2 つのオーディオ ポート間にオーディオ パッチを作成できます。通常、ミックスポートからデバイスポートへのオーディオ パッチは再生用で、逆方向はキャプチャ用です。
たとえば、FM_TUNER
ソースからメディアシンクにオーディオ サンプルを直接ルーティングするオーディオ パッチは、ソフトウェア ミキサーをバイパスします。その後、ハードウェア ミキサーを使用して、Android のオーディオ サンプルとシンク用の FM_TUNER
をミックスする必要があります。FM_TUNER
ソースからメディアシンクにオーディオ パッチを直接作成する場合は次の点にご注意ください。
- 音量調節はメディアシンクに適用され、Android と
FM_TUNER
両方のオーディオに影響します。 - ユーザーはシンプルなアプリの切り替え機能で Android と
FM_TUNER
のオーディオを切り替えることができる必要があります(明示的なメディアソースの選択は不要でなければなりません)。
Automotive の実装では、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); ... }
注: これらの API フックは、AUDIO_DEVICE_API_VERSION_3_0
以降で利用可能です。詳細については、device/generic/car/emulator/audio/driver/audio_hw.c
をご覧ください。