web-dev-qa-db-fra.com

Modification de la lecture vocale en appel dans Android custom ROM

Je souhaite modifier le système d'exploitation Android (image officielle de l'AOSP) pour ajouter un prétraitement à un son de lecture d'appel normal.

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

Je ne peux pas cibler uniquement un appareil spécifique (Nexus 5X). En outre, je n'ai besoin que de filtrer la lecture - l'enregistrement (liaison montante) me importe peu.

UPDATE # 1: 

Pour que ce soit bien clair - je suis d'accord avec la modification des pilotes spécifiques à Qualcomm, ou de tout autre élément fonctionnant sous Nexus 5X et pouvant m'aider à modifier la lecture en cours d'appel.

UPDATE # 2: 

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

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

Ceci est le code à l'intérieur de mon thread 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;

J'utilise un Nexus 5X, ma propre ROM personnalisée AOSP, Android 7.1.1. Je dois trouver le lieu qui permettra à l’enregistrement des appels de fonctionner - probablement quelque part dans hardware/qcom/audio/hal dans le code de plate-forme.

De plus, j’ai examiné la fonction voice_check_and_set_incall_rec_usecase à hardware/qcom/audio/hal/voice.c. Cependant, je n’étais pas en mesure de la comprendre (comment la faire fonctionner comme je le voulais).

UPDATE # 3:

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

75
SirKnigget

Plusieurs questions me viennent à l’esprit. Le tampon vide peut indiquer que vous avez sélectionné la mauvaise source. Aussi, selon https://developer.Android.com/reference/Android/media/AudioRecord.html#AudioRecord(int,%20int,%20int,%20int,%20int) , vous risquez de ne pas toujours obtenir un Même si quelque chose ne va pas avec la configuration, vous voudrez peut-être vérifier si votre objet a été initialisé correctement. Si tout le reste échoue, vous pouvez également effectuer un "MRecord.setPreferredDevice (AudioDeviceInfo.TYPE_BUILTIN_EARPIECE);" pour acheminer l'écouteur intégré du téléphone directement à l'entrée de votre enregistreur. Ouais, c'est un peu sale et hacky, mais convient peut-être à cela.

L'autre chose qui me laissait perplexe c'est qu'au lieu d'utiliser la classe de générateur, vous avez essayé de configurer l'objet directement via son constructeur. Existe-t-il une raison spécifique pour laquelle vous ne souhaitez pas utiliser AudioRecord.Builder (il existe même un bel exemple à l'adresse https://developer.Android.com/reference/Android/media/AudioRecord.Builder.html ) ?

1
CoolKoon