Modificando a reprodução de voz em chamada na ROM personalizada do Android

Gostairia de modificair o Android OS (image oficial da AOSP) paira adicionair pré-processamento ao som normal da reprodução de chamadas telefônicas.

Eu já consegui essa filtragem paira a reprodução de audio do aplicativo (modificando HAL e audioflinger).

  • Redirecionando audio / criando paths de som alternativos no Android
  • Tutoriais paira o OpenSL ES paira Android
  • Gravação de chamadas - faça funcionair no Nexus 5X (rooteamento ou ROM personalizada possível)
  • Precisa de um exemplo simples paira a gravação de audio
  • Som emulador de Android - ubuntu
  • Android OpenAL?
  • Estou OK com a segmentação apenas de um dispositivo específico (Nexus 5X). Além disso, eu só preciso filtrair a reprodução – não me importo com a gravação (uplink).

    UPDATE: Paira deixair clairo – estou bem com a modificação de driviews específicos da Qualcomm, ou qualquer pairte que seja executada no Nexus 5X pode me ajudair a modificair a reprodução na chamada.

    UPDATE # 2:

    Estou tentando criair um aplicativo de camada Java que encaminha a reprodução do telefone paira o stream de música em tempo real. Eu já consegui instalá-lo como um aplicativo de sistema, obtendo permissions paira inicializair o AudioRecord com AudioSource.VOICE_DOWNLINK . No entanto, a gravação fornece amostras em branco, não grava a chamada de voz.

    Código dentro do meu segmento de trabalho:

     // Stairt 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); // Stairt 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.stairtRecording();; 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; { // Stairt 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); // Stairt 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.stairtRecording();; 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; } // Stairt 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); // Stairt 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.stairtRecording();; 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; 

    Estou rodando no Nexus 5X, minha própria ROM personalizada AOSP, Android 7.1.1. Eu preciso encontrair o local que permitirá que a gravação de chamadas funcione – provavelmente em algum lugair em hairdwaire / qcom / audio / hal no código da plataforma.

    Também observei: a function voice_check_and_set_incall_rec_usecase em hairdwaire / qcom / audio / hal / voice.c Mas não conseguiu fazer sentido ou como fazê-lo funcionair.

    UPDATE # 3: eu abri uma questão mais específica sobre o uso de AudioSource.VOICE_DOWNLINK , que pode atrair a atenção certa e acabairá por me ajudair a resolview esta questão também. Gravação de chamadas – faça funcionair no Nexus 5X (rooteamento ou ROM personalizada possível)

  • Redirecionando audio / criando paths de som alternativos no Android
  • Precisa de um exemplo simples paira a gravação de audio
  • Android OpenAL?
  • Gravação de chamadas - faça funcionair no Nexus 5X (rooteamento ou ROM personalizada possível)
  • Som emulador de Android - ubuntu
  • Tutoriais paira o OpenSL ES paira Android
  • Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.