telefonica - Modificación de reproducción de voz en llamada en ROM personalizada de Android
como grabar una llamada sin aplicaciones (1)
Me gustaría modificar el sistema operativo Android (imagen oficial de AOSP) para agregar preprocesamiento a un sonido normal de reproducción de llamadas telefónicas.
Ya he logrado este filtrado para la reproducción de audio de la aplicación (modificando HAL y audioflinger ).
Estoy de acuerdo con apuntar 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 modificar los controladores específicos de Qualcomm, o cualquier parte que se ejecute en Nexus 5X y pueda ayudarme a modificar la reproducción de llamadas entrantes.
ACTUALIZACIÓN # 2:
Estoy intentando crear una aplicación de capa Java que enrute la reproducción del teléfono a la transmisión de música en tiempo real.
Ya he logrado instalarlo como una aplicación del sistema, obteniendo permisos para inicializar
AudioRecord
con
AudioRecord
.
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;
Estoy corriendo 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 en
hardware/qcom/audio/hal
en el código de la plataforma.
También he estado mirando la función
voice_check_and_set_incall_rec_usecase
en
hardware/qcom/audio/hal/voice.c
Sin embargo, no pude darle sentido (cómo hacer que funcione de la manera que quiero).
ACTUALIZACIÓN # 3:
Abrí
una pregunta más específica
sobre el uso de
AudioSource.VOICE_DOWNLINK
, que podría atraer la atención correcta y eventualmente también me ayudará a resolver el problema de esta pregunta.
Hay varios problemas posibles que me vienen a la mente. El búfer en blanco puede indicar que tiene seleccionada la fuente incorrecta. Además, dado que de acuerdo con 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 algo mal con la configuración, es posible que desee confirmar si su objeto se ha inicializado correctamente. Si todo lo demás falla, también puede hacer un "mRecord.setPreferredDevice (AudioDeviceInfo.TYPE_BUILTIN_EARPIECE);" para enrutar el auricular incorporado del teléfono directamente a la entrada de su grabadora. Sí, está un poco sucio y hacky, pero tal vez se adapte al propósito.
La otra cosa que me desconcertó fue que, en lugar de usar la clase de generador, ha intentado configurar el objeto directamente a través de su constructor. ¿Hay alguna razón específica por la que no desea utilizar AudioRecord.Builder (incluso hay un buen ejemplo en https://developer.android.com/reference/android/media/AudioRecord.Builder.html )?