16

Android でオーディオをリダイレクトしたり、新しいサウンド パスを作成した経験がある人はいますか (OpenSL ES、ALSA などを使用)。最終的な目標は、仮想マイクを作成して外部マイクを置き換えることです。これにより、音声ファイルをマイクに向かって話しているかのように再生できます。でマイクにアクセスするアプリケーションは、AudioSource.MICこの代替ストリームを使用する必要があります。音声通話で動作する必要はありません。すべて無線内で行われるため、そのような機能を実現するのは難しいと思います。

どこから始めるべきかについてのアイデアはありますか? OpenSL と ALSA について調査しましたが、カスタム オーディオ パスを定義するには、新しいファームウェア (ROM) をパッケージ化する必要があるようです。回避できるのであれば、アプリケーション レベルのソリューションを作成したいと考えています。電話は「ルート化」されています(suバイナリがあります)。これのターゲット デバイスは、Samsung Galaxy S4 Google Edition (GT-i9505G) です。具体的には、i9505G のオーディオ ドライバー構成/ソース コードまたはリファレンスを探しています。

前もって感謝します!

編集 - CyanogenMod 10.2 ソース ツリーと、jfltexx ドライバーおよびカーネルをチェックアウトしました。kernel/samsung/jf/sound の内容は次のとおりです: http://pastebin.com/7vK8THcZ。これはどこかに文書化されていますか?

4

1 に答える 1

36

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.xmlKitkat という名前のファイルに移動されました。形が違うだけで内容はほぼ同じです。

オーディオ HAL コード。ALSA UCM は にありlibalsa-intfAudioHardware//コードは にありAudioPolicyManagerます。このコードは Jellybean 用であることに注意してください。Jellybean は私がよく知っている最新バージョンです。Kitkat では、ディレクトリ構造 (および場合によってはファイルやクラスの一部) が異なります。ALSADeviceaudio-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"HiFiPROXYRxPlaybackPCM 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 MixerMultiMedia1は通常の再生/録音に使用され、対応してpcmC0D0います (携帯電話のデバイスを で一覧表示できるはずですadb shell cat /proc/asound/devices)。MultiMedia3やのような他のフロントエンド DAI があり、MultiMedia5低レイテンシの再生や低電力のオーディオ再生などの特別な場合に使用されます。カード 0 の再生デバイス 0 に書き込むすべてのもの
にフィードMultiMedia1すると、バックエンド DAI にフィードされます。それを読み戻すには、 のようなことを行う UCM 動詞をセットアップしてから(デフォルトの ALSA キャプチャ デバイスである必要があります)から読み取ります。AFE_PCM_RX Audio MixerAFE_PCM_RX'MultiMedia1 Mixer AFE_PCM_TX':1:1pcmC0D0c


簡単なテストは、携帯電話から 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_TXAFE_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_RXAFE_PCM_RX Port Mixer


おそらく行う必要があるその他の変更のいくつか:

  • Frameworks/baseおよびframeworks/av (例: AudioManager、 )ではAudioServiceAudioSystem新しい定数を追加しAudioSource、必要なすべての場所で認識されるようにする必要があります。

  • UCM 設定ファイルでは、新しい動詞/修飾子をいくつか追加して、新しい動詞をAudioSource使用するときに ALSA コントロールを適切に設定する必要があります。

  • オーディオ HAL では、新しい動詞/修飾子が使用されたときに新しい動詞/修飾子が選択されるように、いくつかの変更を加える必要がありますAudioSource。また、変更が必要になる可能性のあるAudioPolicyManagerALSAcalledの基本クラスがあることに注意してください(ソース ツリーの別の場所にあります)。AudioPolicyManagerBase

于 2014-01-19T14:22:31.727 に答える