Il y a quelques mois, avec Android ICS (4.0), j'ai développé un Android module noyau qui interceptait le "pcmC0D0p" -module pour récupérer tout l'audio du système.
Mon objectif est de diffuser TOUT l'audio (ou au moins la musique jouée) vers un haut-parleur distant via AirPlay.
Le module du noyau fonctionnait, mais il y avait plusieurs problèmes (versions du noyau, privilèges root, etc.) alors j'ai arrêté de travailler dessus.
Maintenant, nous avons Android 4.1 et 4.2 et j'ai un nouvel espoir!
Qui a une idée de comment capturer l'audio dans Android?
J'avais les idées suivantes:
Connectez-vous via Bluetooth au même téléphone, définissez le routage sur BT et saisissez l'audio à "l'autre extrémité": cela ne devrait pas fonctionner
Intercepter l'audio avec un module du noyau comme fait auparavant: hardcore, ça marche mais pas applicable
JACK Audio Connection Kit : malheureusement Android utilise "tinyALSA" et non "ALSA". TinyALSA ne prend en charge aucun filtre comme JACK (mais cela a amené l'idée avec le noyau) module)
Utilisez PulseAudio en remplacement d'AudioFlinger, mais cela ne s'applique pas non plus
EDIT (les a oubliés):
J'ai compilé "tinymix" (version bébé du mélangeur ALSA) à partir de tinyALSA (l'ALSA sur Android) et j'ai essayé de router la sortie audio vers l'entrée micro - mais sans succès ( pas compréhensible pour moi ). Et cela nécessite également un enracinement: non applicable
J'ai testé OpenSL ES , mais je ne suis pas un C-crack et cela s'est terminé par "Je peux enregistrer un microphone, mais pas plus" (peut-être que j'avais tort?)
Je viens de trouver ROUTE_TYPE_LIVE_AUDIO :
Un appareil qui prend en charge le routage audio en direct permettra au flux audio multimédia d'être acheminé vers les destinations prises en charge. Cela peut inclure des haut-parleurs internes ou des prises audio sur l'appareil lui-même, des appareils A2DP, etc.
Une fois lancé, ce routage est transparent pour l'application. Tout l'audio lu sur le flux multimédia sera acheminé vers la destination sélectionnée.
Peut-être que cela aide en aucune façon?
Je suis à court d'idées mais je veux "casser cette noix", peut-être que quelqu'un peut m'aider?
ÉDITER:
Je suis vraiment nouveau dans le codage C & kernel (mais j'ai réussi à créer un module d'interception audio compilé de manière croisée) - mais n'est-il en aucune façon possible d'écouter au moment où les données PCM vont de l'espace utilisateur (Java , Couche C?) À l'espace noyau (tinyALSA, module noyau), sans piratage ni enracinement?
Vous devez transmettre le trafic audio via votre serveur de socket local:
Créer un serveur de socket local
Modifiez l'adresse du flux http audio en chemin via votre serveur de socket local, par exemple pour l'adresse
http://example.com/stream.mp3 ->
http://127.0.0.1:8888/http://example.com/stream.mp3
où 8888 est votre port de socket.
Jouer
http://127.0.0.1:8888/http://example.com/stream.mp3
avec lecteur multimédia par défaut
Lisez toutes les demandes entrantes vers le port 8888 dans votre serveur de socket local, analysez-le et passez au serveur example.com.
Lisez la réponse d'exemple.com et transmettez-la au client local (lecteur multimédia). ICI vous pouvez capturer le flux audio!