source - google android repository



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

Eu gostaria de modificar o sistema operacional Android (imagem oficial do AOSP) para adicionar pré-processamento a um som normal de reprodução de chamadas telefônicas.

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

Estou bem em segmentar apenas um dispositivo específico (Nexus 5X). Além disso, só preciso filtrar a reprodução - não me importo em gravar (uplink).

ATUALIZAÇÃO # 1:

Para deixar claro - estou bem com a modificação dos drivers específicos da Qualcomm, ou qualquer parte que seja executada no Nexus 5X e que possa me ajudar a modificar a reprodução durante a chamada.

ATUALIZAÇÃO 2:

Estou tentando criar um aplicativo de camada Java que roteia a reprodução do telefone para o fluxo de música em tempo real.

Eu já consegui instalá-lo como um aplicativo do sistema, obtendo permissões para inicializar o AudioRecord com AudioSource.VOICE_DOWNLINK . No entanto, a gravação dá amostras em branco; não grava a chamada de voz.

Este é o código dentro do meu segmento de trabalho:

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

Estou correndo em um Nexus 5X, minha própria ROM personalizada AOSP, Android 7.1.1. Eu preciso encontrar o lugar que permitirá a gravação de chamadas para trabalhar - provavelmente em algum lugar em hardware/qcom/audio/hal no código da plataforma.

Também estive olhando a função voice_check_and_set_incall_rec_usecase em hardware/qcom/audio/hal/voice.c No entanto, eu não consegui entender (como fazê-lo funcionar do jeito que eu quero).

ATUALIZAÇÃO 3:

Abri uma pergunta mais específica sobre como usar o AudioSource.VOICE_DOWNLINK , que pode chamar a atenção correta e, eventualmente, me ajudar a resolver o problema dessa pergunta também.

https://src-bin.com


Answer #1

Existem vários problemas possíveis que me vêm à mente. O buffer em branco pode indicar que você tem a fonte errada selecionada. Além disso, de acordo com https://developer.android.com/reference/android/media/AudioRecord.html#AudioRecord(int,%20int,%20int,%20int,%20int) talvez você nem sempre receba uma exceção, mesmo que algo seja errado com a configuração, você pode querer confirmar se o seu objeto foi inicializado corretamente. Se tudo mais falhar, você também pode fazer um "mRecord.setPreferredDevice (AudioDeviceInfo.TYPE_BUILTIN_EARPIECE);" para direcionar o fone de ouvido do telefone diretamente para a entrada do seu gravador. Sim, é meio sujo e hacky, mas talvez seja adequado ao propósito.

A outra coisa que estava me intrigando é que, em vez de usar a classe do construtor, você tentou configurar o objeto diretamente através de seu construtor. Existe uma razão específica pela qual você não deseja usar o AudioRecord.Builder (existe até um bom exemplo em https://developer.android.com/reference/android/media/AudioRecord.Builder.html )?