77 votes

Modifier la lecture de la voix en appel dans une ROM personnalisée Android

Je voudrais modifier Android OS (image officielle de l'AOSP) pour ajouter un prétraitement à un son normal de lecture d'appel téléphonique.

J'ai déjà réalisé ce filtrage pour la lecture de l'audio de l'application (en modifiant HAL y audioflinger ).

Je suis d'accord pour ne cibler qu'un appareil spécifique (Nexus 5X). De plus, j'ai seulement besoin de filtrer la lecture - je ne me soucie pas de l'enregistrement (liaison montante).

UPDATE #1 :

Pour être clair, je suis d'accord pour modifier les pilotes spécifiques à Qualcomm, ou toute autre partie qui fonctionne sur le Nexus 5X et qui peut m'aider à modifier la lecture en appel.

UPDATE #2 :

J'essaie de créer une application en couche Java qui achemine la lecture du téléphone vers le flux musical en temps réel.

J'ai déjà réussi à l'installer en tant qu'application système, à obtenir les permissions pour initialiser AudioRecord avec AudioSource.VOICE_DOWNLINK . Cependant, l'enregistrement donne des échantillons vierges ; il n'enregistre pas l'appel vocal.

Voici le code à l'intérieur de mon fil de travail :

// Start recording
int recBufferSize = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT);
mRecord = new AudioRecord(MediaRecorder.AudioSource.VOICE_DOWNLINK, 44100, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT, recBufferSize);

// Start playback
int playBufferSize = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT);
mTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, playBufferSize, AudioTrack.MODE_STREAM);

mRecord.startRecording();;
mTrack.play();

int bufSize = 1024;
short[] buffer = new short[bufSize];
int res;
while (!interrupted())
{
    // Pull recording buffers and play back
    res = mRecord.read(buffer, 0, bufSize, AudioRecord.READ_NON_BLOCKING);
    mTrack.write(buffer, 0, res, AudioTrack.WRITE_BLOCKING);
}

// Stop recording
mRecord.stop();
mRecord.release();
mRecord = null;

// Stop playback
mTrack.stop();
mTrack.release();;
mTrack = null;

Je fonctionne sur un Nexus 5X, ma propre ROM personnalisée AOSP, Android 7.1.1. J'ai besoin de trouver l'endroit qui permettra à l'enregistrement d'appel de fonctionner - probablement quelque part dans hardware/qcom/audio/hal dans le code de la plate-forme.

J'ai aussi regardé la fonction voice_check_and_set_incall_rec_usecase sur hardware/qcom/audio/hal/voice.c Cependant, je n'ai pas réussi à lui donner un sens (comment le faire fonctionner comme je le souhaite).

UPDATE #3 :

J'ai ouvert une question plus spécifique sur l'utilisation AudioSource.VOICE_DOWNLINK ce qui pourrait attirer l'attention et m'aider à résoudre le problème de cette question également.

2voto

CoolKoon Points 111

Il y a plusieurs problèmes possibles qui me viennent à l'esprit. Le tampon vide peut indiquer que vous avez sélectionné la mauvaise source. De plus, puisque selon https://developer.Android.com/reference/Android/media/AudioRecord.html#AudioRecord(int,%20int,%20int,%20int,%20int,%20int) vous n'obtiendrez pas toujours une exception même si quelque chose ne va pas dans la configuration, vous pourriez vouloir confirmer si votre objet a été initialisé correctement. Si tout le reste échoue, vous pouvez aussi faire un "mRecord.setPreferredDevice(AudioDeviceInfo.TYPE_BUILTIN_EARPIECE) ;" pour diriger l'écouteur intégré du téléphone directement vers l'entrée de votre enregistreur. Oui, c'est un peu sale et bricolé, mais cela convient peut-être à l'objectif.

L'autre chose qui m'a intrigué est qu'au lieu d'utiliser la classe de construction, vous avez essayé de configurer l'objet directement via son constructeur. Y a-t-il une raison spécifique pour laquelle vous ne voulez pas utiliser AudioRecord.Builder (il y a même un bel exemple à l'adresse suivante https://developer.Android.com/reference/Android/media/AudioRecord.Builder.html ) à la place ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X