Qualcomm の APQ8064 プラットフォーム (ターゲット デバイスのプラットフォームとほぼ同じように見えます) に基づく電話で、あなたが求めている機能を実装したことがあります。以下は、私が書いたコードや、この種の変更を簡単に行うことができる環境にアクセスできなくなったため、このことから思い出せることの要約です。したがって、この答えが断片的な記憶の混乱のように見える場合、それはまさにそれが何であるかによるものです.
この情報は、多かれ少なかれ他の Qualcomm プラットフォーム (MSM8960 や MSM8974 など) にも適用される可能性がありますが、他のベンダーのプラットフォーム (NVidia Tegra、Samsung Exynos、TI OMAP など) にはほとんど役に立たないでしょう。
簡単なメモ: 私が使用した方法は、録音アプリケーションが取得するオーディオが、Android マルチメディア フレームワークおよび/またはプラットフォームのマルチメディア DSP でのミキシング/ボリューム コントロールを通過することを意味します。そのため、何かを 75% の音量で再生し、それを録音してから 75% の音量で録音を再生すると、かなり静かな音になってしまう可能性があります。未処理の PCM データを取得したい場合 (デコード後、ミキシング/ボリューム コントロールの前) をカスタマイズするなど、他のアプローチを検討する必要がありますが、AudioFlinger
それは私が試したものではなく、情報を提供できるものでもありません。
いくつかの興味深い場所:
プラットフォームのオーディオ ドライバー。特にmsm-pcm-routing.c ファイル.
ALSA UCM (Use-Case Manager) 設定ファイル。これは、UCM 設定ファイルの単なる例です。これらのファイルには、使用する正確なプラットフォームに応じて多くのバリエーションがあるため、名前が少し異なる場合があり( snd_soc_msm_
.
Kitkat 以降の注意: UCM 設定ファイルは Jellybean (およびおそらく ICS) で使用されていました。私の理解では、これらの設定はmixer_paths.xml
Kitkat という名前のファイルに移動されました。形が違うだけで内容はほぼ同じです。
オーディオ HAL コード。ALSA UCM は にありlibalsa-intf
、AudioHardware
//コードは にありAudioPolicyManager
ます。このコードは Jellybean 用であることに注意してください。Jellybean は私がよく知っている最新バージョンです。Kitkat では、ディレクトリ構造 (および場合によってはファイルやクラスの一部) が異なります。ALSADevice
audio-alsa
UCM 設定ファイルを開いて検索すると、"HiFiPROXY Rx"
次のようなものが見つかります。
SectionVerb
Name "HiFiPROXY Rx"
EnableSequence
'AFE_PCM_RX Audio Mixer MultiMedia1':1:1
EndSequence
DisableSequence
'AFE_PCM_RX Audio Mixer MultiMedia1':1:0
EndSequence
# ALSA PCMs
CapturePCM 0
PlaybackPCM 0
EndSection
これは動詞を定義します(基本的にオーディオのユースケースの基礎です。同時再生や録音などのために動詞の上に適用できる修飾子もあります)。動詞、使用されるオーディオデバイスを指し、出力を意味します)、ユースケースを有効/無効にするときに、どの ALSA コントロールに書き込むか、およびそれらに何を書き込むかを指定します。最後に、このユース ケースで使用する ALSA PCM 再生/キャプチャ デバイスを一覧表示します。例えば、"HiFiPROXY Rx"
HiFi
PROXY
Rx
PlaybackPCM 0
再生デバイス 0 を使用する必要があることを意味します (ALSA カードは、組み込みのハードウェア コーデックを表すものであることが暗示され、通常はカード 0 です)。これらの動詞は、ユースケース (音楽の再生、音声通話、録音など)、接続されているアクセサリなどに基づいて、オーディオ HAL によって選択されます。
"AFE_PCM_RX Audio Mixer"
のmsm_qdsp6_widgets テーブルを調べると、次のような名前のミキサー コントロールmsm-pcm-routing.c
のリストを参照していることがわかります。afe_pcm_rx_mixer_controls
static const struct snd_kcontrol_new afe_pcm_rx_mixer_controls[] = {
SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_AFE_PCM_RX,
MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
msm_routing_put_audio_mixer),
SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_AFE_PCM_RX,
... and so on...
これは、バックエンド DAI への接続が許可されているフロント エンド DAI をリストします ( AFE_PCM_RX
)。これらが互いにどのように関連しているかを理解するには、これらの図を参照してください。
AFE_PCM_RX
およびAFE_PCM_TX
一種のダミー/プロキシ デバイスを実装する一部の Qualcomm プラットフォーム上の DAI のペアです。あなたがすることはAFE_PCM_RX
、マルチメディア DSP (QDSP) によって処理される音声をフィードすることAFE_PCM_TX
です。これは、USB および WiFi オーディオ ルーティング、および A2DP IIRC の実装に使用されます。
行に戻るAFE_PCM_RX Audio Mixer MultiMedia1
: これは、 にフィードMultiMedia1
していることを示していますAFE_PCM_RX Audio Mixer
。MultiMedia1
は通常の再生/録音に使用され、対応してpcmC0D0
います (携帯電話のデバイスを で一覧表示できるはずですadb shell cat /proc/asound/devices
)。MultiMedia3
やのような他のフロントエンド DAI があり、MultiMedia5
低レイテンシの再生や低電力のオーディオ再生などの特別な場合に使用されます。カード 0 の再生デバイス 0 に書き込むすべてのもの
にフィードMultiMedia1
すると、バックエンド DAI にフィードされます。それを読み戻すには、 のようなことを行う UCM 動詞をセットアップしてから(デフォルトの ALSA キャプチャ デバイスである必要があります)から読み取ります。AFE_PCM_RX Audio Mixer
AFE_PCM_RX
'MultiMedia1 Mixer AFE_PCM_TX':1:1
pcmC0D0c
簡単なテストは、携帯電話から UCM 設定ファイル ( の下のどこかにあるはずです) を取得し、動詞を次のよう/system/etc/
に修正することです。"HiFi"
EnableSequence
'AFE_PCM_RX Audio Mixer MultiMedia1':1:1
'AFE_PCM_RX Audio Mixer MultiMedia3':1:1
'AFE_PCM_RX Audio Mixer MultiMedia5':1:1
(および同様ですがDisableSequence
、:1:0
各行の最後にあります)。
次に、"Capture Music"
修飾子 (これは、通常の記録では不適切な名前の修飾子です) に移動し、 に変更SLIM_0_TX
しAFE_PCM_TX
ます。
変更した UCM 設定ファイルを電話機にコピーして戻し (root 権限が必要)、電話機を再起動します。次に、再生を開始し (有線のヘッドセット/ヘッドフォンを接続し、タッチ サウンドを無効にして、低遅延の動詞が選択されないようにします)、から録音を開始しAudioSource.MIC
ます。その後、録音を確認し、再生オーディオを録音できたかどうかを確認します。そうでない場合は、低出力のオーディオ動詞が選択されている可能性があり、動詞"HiFi Low Power"
で行ったのと同様に動詞を変更する必要があります"HiFi"
。オーディオ HAL ですべてのデバッグ プリントを有効にすると (つまり#define LOG_NDEBUG 0
、それを見つけることができるすべての cpp ファイルでコメントを外して)、どの UCM 動詞/修飾子が選択されているかを確認できるようになります。
上記の変更は、MultiMedia
関連するすべての動詞と修飾子のすべてのフロント エンド DAI をカバーする必要があるため、少し面倒です。
IIRC のおかげで、これを動詞/修飾子ごとに 1 行だけに単純化できました。
'AFE_PCM_RX Port Mixer SLIM_0_RX':1:1
"HiFi
「、"HiFi Low Power
」、動詞を見る"HiFi Lowlatency"
と、すべてバックエンド DAI を使用していることがわかります。そのため、バックエンド DAI から別のバックエンドへの接続をセットアップできる を使用して、それSLIMBUS_0_RX
を利用しています。AFE_PCM_RX Port Mixer
大。afe_pcm_rx_port_mixer_controls
のとintercon
テーブルを見ると、のエントリmsm-pcm-routing.c
がないことがわかります。そのため、自分で追加する必要があります (既存の行の一部をコピーして貼り付け、名前を変更するだけです)。SLIM_0_RX
AFE_PCM_RX Port Mixer
おそらく行う必要があるその他の変更のいくつか:
Frameworks/baseおよびframeworks/av (例: AudioManager
、 )ではAudioService
、AudioSystem
新しい定数を追加しAudioSource
、必要なすべての場所で認識されるようにする必要があります。
UCM 設定ファイルでは、新しい動詞/修飾子をいくつか追加して、新しい動詞をAudioSource
使用するときに ALSA コントロールを適切に設定する必要があります。
オーディオ HAL では、新しい動詞/修飾子が使用されたときに新しい動詞/修飾子が選択されるように、いくつかの変更を加える必要がありますAudioSource
。また、変更が必要になる可能性のあるAudioPolicyManagerALSA
calledの基本クラスがあることに注意してください(ソース ツリーの別の場所にあります)。AudioPolicyManagerBase