Redirection audio / création de chemins sonores alternatifs dans Android
Quelqu'un a une expérience (à l'aide de OpenSL ES, ALSA, etc.) avec la redirection audio ou la création de nouveaux sons chemins dans Android? L'objectif final est de créer virtuellement un microphone pour remplacer le microphone externe, où l'on peut lire des fichiers audio comme s'ils étaient en parlant dans le microphone. Les Applications accédant au micro avec AudioSource.MIC
devrait utiliser cette autre flux. Il n'est pas nécessaire pour qu'il fonctionne avec les appels vocaux, je crois que la réalisation de ce genre de fonctionnalité est la plus difficile, car tout est fait à l'intérieur de la radio.
Aucune idée de par où commencer? J'ai fait quelques recherches avec OpenSL et ALSA, mais il semble que je vais avoir besoin d'package nouveau firmware (ROM) afin de définir des trajets audio. Si elle peut être évitée j'aimerais créer une application au niveau de la solution. Les téléphones sont "enracinés" (su binaires). Le périphérique cible pour ce est le Samsung Galaxy S4 Google Edition (GT-i9505G). Plus précisément, je suis à la recherche pour pilote audio configurations /code source ou des références pour la i9505G.
Merci d'avance!
edit - j'ai vérifié le CyanogenMod 10.2 source de l'arbre, le long avec la jfltexx les pilotes et le noyau. Voici le contenu de noyau/samsung/jf/son: http://pastebin.com/7vK8THcZ. Est-ce documenté nulle part?
source d'informationauteur jpalm
Vous devez vous connecter pour publier un commentaire.
Une fois, j'ai mis en œuvre la fonctionnalité que vous êtes après sur un téléphone basé sur Qualcomm APQ8064 plate-forme (ce qui semble être presque la même plate-forme que celle de votre périphérique cible). Ci-dessous est un résumé de ce que je me souviens de cela, comme je n'ai plus accès au code que j'ai écrit, ou un environnement où je peux facilement faire ces sortes de modifications. Donc, si cette réponse se lit comme un fouillis de souvenirs fragmentaires, c'est parce que c'est exactement ce qu'il est.
Cette info peut également s'appliquer plus ou moins à d'autres Qualcomm plates-formes (comme le MSM8960 ou MSM8974), mais sera probablement complètement inutile pour les plates-formes à partir d'autres fournisseurs (NVidia Tegra, Samsung Exynos, TI OMAP, etc).
Une brève remarque: La méthode que j'ai utilisé signifie que l'audio que l'application d'enregistrement obtient aura traversé le mélange /contrôle du volume dans le Android un cadre multimédia et/ou de la plate-forme multimédia de la DSP. Donc, si vous avez quelque chose en jouant à 75% de leur volume, de l'enregistrement, puis la lecture de l'enregistrement à 75% de volume, il pourrait finir par sonner assez calme. Si vous souhaitez obtenir non transformés, les données PCM (après décodage, mais avant de les mélanger /contrôle du volume de), vous aurez à chercher dans une autre approche, par exemple, la personnalisation de la
AudioFlinger
mais ce n'est pas quelque chose que j'ai essayé, ou peut fournir des informations sur les.Quelques endroits d'intérêt:
La plate-forme des pilotes audio. En particulier la msm-pcm-routage.fichier c.
ALSA UCM (Gestionnaire de Cas) fichier de paramètres. C'est juste un exemple UCM fichier de paramètres. Il existe de nombreuses variantes de ces fichiers selon la nature exacte de la plate-forme utilisée, de sorte que votre peuvent avoir un nom légèrement différent (bien qu'il devrait commencer avec
snd_soc_msm_
), et son contenu sera probablement aussi différer légèrement de celui que j'liés à.NOTE pour Kitkat et plus tard: de L'UCM, les fichiers de paramètres ont été utilisés sur Jellybean (et, éventuellement, ICS). Ma compréhension est que ces paramètres ont été déplacés vers un fichier nommé
mixer_paths.xml
sur Kitkat. Le contenu est à peu près la même, dans un format différent.L'audio HAL code. ALSA UCM est présent dans
libalsa-intf
et laAudioHardware
/AudioPolicyManager
/ALSADevice
code est présent dansaudio-alsa
. Notez que ce code est pour Jellybean, puisque c'est la dernière version que je suis familier avec. La structure de répertoire (et éventuellement les fichiers /classes) diffère sur Kitkat.Si vous ouvrez l'UCM fichier de réglages et de recherche pour
"HiFiPROXY Rx"
vous trouverez quelque chose comme ceci:Ceci définit une verbe (essentiellement la base d'un audio de cas d'utilisation; il y a aussi des modificateurs qui peuvent être appliquées sur des verbes pour des choses comme les simultané de la lecture et de l'enregistrement) avec le nom
"HiFiPROXY Rx"
(leHiFi
surnom est utilisé pour la plupart des non-voix-appel verbes,PROXY
désigne le périphérique audio utilisé, etRx
moyens de sortie) et il précise ALSA contrôle(s) d'écrire, et de quoi écrire, lorsque le cas d'utilisation doit être activée /désactivée. Enfin, il énumère les ALSA PCM lecture /périphériques de capture à utiliser dans ce cas d'utilisation. Par exemple,PlaybackPCM 0
signifie que le périphérique de lecture 0 doit être utilisée (ALSA carte est supposé être celui qui représente le matériel intégré codec, qui est généralement de carte 0). Ces verbes sont sélectionnés par l'audio HAL basé sur les cas d'utilisation (lecture de la musique, appel vocal, enregistrement, ...), quels sont les accessoires que vous avez fixées, etc.Si vous regardez
"AFE_PCM_RX Audio Mixer"
dans le msm_qdsp6_widgets table dansmsm-pcm-routing.c
vous verrez qu'il se réfère à un liste des contrôles de mixage nomméafe_pcm_rx_mixer_controls
qui ressemble à ceci:Cette liste, l'extrémité avant de l'Estrade que vous êtes autorisé à vous connecter à la fin DAI (
AFE_PCM_RX
). Pour avoir une idée de comment ils se rapportent l'un à l'autre, voir ces diagrammes.AFE_PCM_RX
etAFE_PCM_TX
est une paire de DAIs sur certains de Qualcomm plates-formes qui mettent en œuvre une sorte de mannequin/proxy appareil. Ce que vous faites, c'est de fournir de l'audio dansAFE_PCM_RX
qui est ensuite traité par le multimédia (DSP QDSP), et puis vous pouvez lire en arrière à traversAFE_PCM_TX
. Ce est utilisé pour mettre en œuvre USB et WiFi routage audio, et aussi A2DP IIRC.Retour à la
AFE_PCM_RX Audio Mixer MultiMedia1
ligne: il dit que vous êtes l'alimentationMultiMedia1
dans leAFE_PCM_RX Audio Mixer
.MultiMedia1
est utilisée dans des conditions normales de lecture et d'enregistrement, et correspond àpcmC0D0
(vous devriez être en mesure de faire la liste des périphériques sur votre téléphone avecadb shell cat /proc/asound/devices
). Il y a d'autres avant la fin de l'Estrade, commeMultiMedia3
etMultiMedia5
qui sont utilisés dans des cas particuliers, comme les faibles temps de latence de lecture et de faible puissance, la lecture audio.Lorsque vous nourrissez
MultiMedia1
à laAFE_PCM_RX Audio Mixer
tout ce que vous écrivez à l'appareil de lecture 0 carte 0 seront introduits dans leAFE_PCM_RX
fin DAI. Pour le lire vous pourriez mettre en place un UCM verbe qui fait quelque chose comme'MultiMedia1 Mixer AFE_PCM_TX':1:1
, et puis vous aviez lu depcmC0D0c
(qui doit être la valeur par défaut ALSA périphérique de capture).Un test simple consisterait à tirer de l'UCM, les paramètres de fichier de votre téléphone (doit être situé quelque part sous
/system/etc/
) et de modifier la"HiFi"
verbe duEnableSequence
avec quelque chose comme:(et de même dans le
DisableSequence
mais avec:1:0
à la fin de chaque ligne).Puis aller à la
"Capture Music"
modificateur (c'est la mal nommée modificateur pour l'enregistrement normal) et le changement deSLIM_0_TX
àAFE_PCM_TX
.Copie de votre modifiée UCM paramètres de fichier vers le téléphone (nécessite une racine de l'autorisation), et redémarrer le téléphone. Ensuite démarrer la lecture (filaire casque attaché, et de désactiver les sons de sorte que la faible latence verbe ne pas être sélectionné), et de démarrer un enregistrement à partir d'
AudioSource.MIC
. Ensuite, vérifiez l'enregistrement et de voir si vous avez été en mesure d'enregistrer la sortie audio. Si non, alors peut-être la faible puissance audio verbe a été sélectionné et que vous aurez à modifier la"HiFi Low Power"
verbe de même à ce que vous avez fait avec le"HiFi"
verbe. Il vous aidera si vous avez tout le debug imprime activé dans l'audio HAL (c'est à dire décommentez#define LOG_NDEBUG 0
dans tous les fichiers cpp où vous pouvez la trouver), de sorte que vous pouvez voir qui UCM verbes /les modificateurs d'être sélectionné.La modification que j'ai décrit ci-dessus est un peu fastidieux, puisque vous avez à couvrir tous les
MultiMedia
avant la fin de l'Estrade pour tous les verbes et les modificateurs.Autant que je me souvienne, j'ai été en mesure de le simplifier en une seule ligne par verbe/modificateur:
Si vous regardez la
"HiFi
","HiFi Low Power
","HiFi Lowlatency"
verbes, vous verrez qu'ils utilisent tous laSLIMBUS_0_RX
fin DAI, donc je vais prendre avantage de cela en utilisant laAFE_PCM_RX Port Mixer
qui me permet de configurer une connexion à partir d'un back-end DAI à l'autre extrémité arrière DAI. Si vous regardez laafe_pcm_rx_port_mixer_controls
etintercon
tables dansmsm-pcm-routing.c
vous remarquerez qu'il n'y a pasSLIM_0_RX
entrée pourAFE_PCM_RX Port Mixer
de sorte que vous auriez à les ajouter vous-même (c'est juste une question de copier-coller de certaines lignes existantes, et de changer les noms).Certains autres changements que vous auriez probablement à faire:
Dans cadres/base et cadres/av (par exemple
AudioManager
AudioService
AudioSystem
) vous devez ajouter un nouveauAudioSource
constante et assurez-vous qu'il est reconnu dans tous les endroits nécessaires.À l'UCM fichier de paramètres que vous auriez à ajouter de nouveaux verbes /modificateurs pour configurer ALSA contrôles correctement lorsque votre nouveau
AudioSource
est utilisé.Dans l'audio HAL, vous auriez à faire quelques modifications pour que votre nouveau verbes /modificateurs d'être sélectionné lors de votre nouveau
AudioSource
est utilisé. Noter qu'il y a une classe de base deAudioPolicyManagerALSA
appeléAudioPolicyManagerBase
qui vous pourriez aussi avoir à modifier (c'est situé ailleurs dans l'arborescence des sources).