Pregunta Modificación de la reproducción de voz en llamada en la ROM personalizada de Android


Me gustaría modificar el sistema operativo Android (imagen oficial de AOSP) para agregar el preprocesamiento a un sonido de reproducción de llamada telefónica normal.

Ya he logrado este filtrado para la reproducción de audio de la aplicación (modificando HAL y audioflinger)

Estoy bien con la orientación solo a un dispositivo específico (Nexus 5X). Además, solo necesito filtrar la reproducción: no me importa la grabación (enlace ascendente).

ACTUALIZACIÓN # 1: 

Para que quede claro: estoy de acuerdo con la modificación de los controladores específicos de Qualcomm, o cualquier otra parte que se ejecute en Nexus 5X y puede ayudarme a modificar la reproducción durante la llamada.

ACTUALIZACIÓN # 2: 

Estoy intentando crear una aplicación de capa de Java que enrute la reproducción del teléfono a la secuencia de música en tiempo real.

Ya logré instalarlo como una aplicación de sistema, obteniendo permisos para inicializar AudioRecord con AudioSource.VOICE_DOWNLINK. Sin embargo, la grabación da muestras en blanco; no graba la llamada de voz.

Este es el código dentro de mi hilo de trabajo:

// 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;

Me estoy ejecutando en un Nexus 5X, mi propia ROM personalizada AOSP, Android 7.1.1. Necesito encontrar el lugar que permita que funcione la grabación de llamadas, probablemente en algún lugar de hardware/qcom/audio/hal en código de plataforma.

También he estado mirando la función voice_check_and_set_incall_rec_usecase a hardware/qcom/audio/hal/voice.c Sin embargo, no pude darle sentido (cómo hacerlo funcionar de la manera que yo quiero).

ACTUALIZACIÓN # 3:

He abierto una pregunta más específica sobre el uso AudioSource.VOICE_DOWNLINK, que podría atraer la atención adecuada y, a la larga, también me ayudará a resolver el problema de esta pregunta.


74
2018-02-15 13:52


origen


Respuestas:


Hay varios problemas posibles que vienen a mi mente. El buffer en blanco podría indicar que tiene la fuente incorrecta seleccionada. También dado que según https://developer.android.com/reference/android/media/AudioRecord.html#AudioRecord(int,%20int,%20int,%20int,%20int) es posible que no siempre obtenga una excepción, incluso si hay algún problema con la configuración, es posible que desee confirmar si su objeto se ha inicializado correctamente. Si todo lo demás falla, también podría hacer una "mRecord.setPreferredDevice (AudioDeviceInfo.TYPE_BUILTIN_EARPIECE);" para enrutar el auricular incorporado del teléfono directamente a la entrada de su grabadora. Sí, es un poco sucio y hacky, pero tal vez se adapte al propósito.

La otra cosa que me desconcertaba es que en vez de usar la clase de constructores has intentado configurar el objeto directamente a través de su constructor. ¿Hay alguna razón específica por la que no desee utilizar AudioRecord.Builder (incluso hay un buen ejemplo en https://developer.android.com/reference/android/media/AudioRecord.Builder.html ) en su lugar?


1
2018-01-27 23:23