web-dev-qa-db-ja.com

オーディオのリダイレクト/ Android

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

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

前もって感謝します!

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

16
jpalm

QualcommのAPQ8064プラットフォーム(ターゲットデバイスのプラットフォームとほぼ同じように見える)をベースにした電話に、必要な機能を実装しました。以下は、私が書いたコードにアクセスできなくなったためにこれから思い出すことができる内容の要約、またはこれらの種類の変更を簡単に行うことができる環境です。したがって、この答えが断片的な記憶の混乱のように読めば、それはまさにそれがそうであるからです。

この情報は、他のクアルコムプラットフォーム(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)で使用されていました。私の理解では、これらの設定はKitKatの mixer_paths.xml という名前のファイルに移動されています。内容はほとんど同じですが、形式が異なります。

オーディオHALコード 。 ALSA UCMはlibalsa-intfにあり、AudioHardware/AudioPolicyManager/ALSADeviceコードはaudio-alsaにあります。このコードはJellybean用のものであることに注意してください。これは、私がよく知っている最新バージョンであるためです。ディレクトリ構造(およびおそらくファイル/クラスの一部)は、KitKatでは異なります。

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

これはverbを定義します(基本的にはオーディオのユースケースの基礎です。同時再生や録音などの動詞の上に適用できるmodifiersもあります)。名前"HiFiPROXY Rx"HiFiモニカはほとんどの非音声呼動詞に使用され、PROXYは使用されるオーディオデバイスを参照し、Rxは出力を意味します)また、ユースケースを有効/無効にする必要がある場合に、書き込むALSAコントロールと、それらに書き込む内容を指定します。最後に、このユースケースで使用するALSA PCM再生/キャプチャデバイスをリストします。たとえば、PlaybackPCM 0は、再生デバイス0を使用する必要があることを意味します(ALSAカードは、組み込みのハードウェアコーデックを表すものであり、通常はカード0です)。これらの動詞は、ユースケース(音楽の再生、音声通話、録音など)、アタッチしたアクセサリなどに基づいてオーディオHALによって選択されます。


msm_qdsp6_widgets table in "AFE_PCM_RX Audio Mixer"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(AFE_PCM_RX)への接続が許可されているフロントエンドDAIをリストします。これらが互いにどのように関連しているかについては、 これらの図 を参照してください。
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行に戻る:これは、MultiMedia1AFE_PCM_RX Audio Mixerに供給していることを示しています。 MultiMedia1は、通常の再生/録音に使用され、pcmC0D0に対応します(adb Shell cat /proc/asound/devicesを使用して、携帯電話のデバイスを一覧表示できるはずです)。 MultiMedia3MultiMedia5のような他のフロントエンドDAIは、低遅延再生や低電力オーディオ再生などの特殊なケースで使用されます。
MultiMedia1AFE_PCM_RX Audio Mixerにフィードすると、カード0の再生デバイス0に書き込んだすべてがAFE_PCM_RXバックエンドDAIにフィードされます。それを読み戻すには、'MultiMedia1 Mixer AFE_PCM_TX':1:1のような処理を行うUCM動詞を設定してから、pcmC0D0c(デフォルトのALSAキャプチャデバイスである必要があります)から読み取ります。


簡単なテストは、携帯電話から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設定ファイルを電話にコピーして戻し(ルート権限が必要)、電話を再起動します。次に、再生を開始し(有線のヘッドセット/ヘッドホンを接続し、低音の動詞が選択されないようにタッチサウンドを無効にします)、AudioSource.MICから録音を開始します。その後、録音を確認し、再生音声を録音できたかどうかを確認します。そうでない場合は、おそらく低電力オーディオ動詞が選択されており、"HiFi Low Power"動詞で行ったのと同様に、"HiFi"動詞を変更する必要があります。オーディオHALですべてのデバッグプリントを有効にしている場合(つまり、すべてのcppファイルで#define LOG_NDEBUG 0のコメントを外してください)、選択されているUCM動詞/修飾子を確認できます。


上記で説明した変更は、すべての関連する動詞と修飾子のMultiMediaフロントエンドDAIをすべてカバーする必要があるため、少々面倒です。
IIRC、これを動詞/修飾子ごとに1行に単純化することができました:

'AFE_PCM_RX Port Mixer SLIM_0_RX':1:1

"HiFi "、"HiFi Low Power"、"HiFi Lowlatency"動詞を見ると、すべてがSLIMBUS_0_RXバックエンドDAIを使用していることがわかります。 AFE_PCM_RX Port Mixerを使用して、バックエンドDAIから別のバックエンドDAIへの接続を設定できます。 afe_pcm_rx_port_mixer_controlsmsm-pcm-routing.cテーブルとinterconテーブルを見ると、SLIM_0_RXAFE_PCM_RX Port Mixerエントリがないことがわかります。そのため、それらを自分で追加します(既存の行の一部をコピーして貼り付け、名前を変更するだけです)。


おそらくあなたがしなければならないであろう他の変更のいくつか:

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

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

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

35
Michael