在Android自定义ROM中修改通话中语音播放

时间:2017-02-15 13:52:19

标签: android android-source alsa android-kernel android-rom

我想修改Android OS(AOSP的官方图片),为正常的电话回放声音添加预处理。

我已经为应用音频播放实现了此过滤(通过修改 HAL audioflinger )。

我只定位特定设备(Nexus 5X)。另外,我只需要过滤回放 - 我不关心录制(上行链路)。

更新#1:

为了说清楚 - 我可以修改特定于Qualcomm的驱动程序,或者在Nexus 5X上运行的任何部分,并且可以帮助我修改通话中的播放。

更新#2:

我正在尝试创建一个Java层应用程序,将手机播放实时路由到音乐流。

我已经成功将其安装为系统应用,获得了使用AudioRecord初始化AudioSource.VOICE_DOWNLINK的权限。但是,录音会给出空白样本;它不会记录语音通话。

这是我的工作线程中的代码:

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

我正在使用Nexus 5X,我自己的AOSP自定义ROM,Android 7.1.1。我需要找到允许呼叫记录工作的地方 - 可能是平台代码中hardware/qcom/audio/hal的某个地方。

此外,我一直在voice_check_and_set_incall_rec_usecase处查看hardware/qcom/audio/hal/voice.c函数但是,我无法理解它(如何使其按照我想要的方式工作)。< / p>

更新#3:

我已经开放a more-specific question关于使用AudioSource.VOICE_DOWNLINK,这可能引起正确的关注,并最终帮助我解决这个问题的问题。

1 个答案:

答案 0 :(得分:1)

我想到了几个可能的问题。空白缓冲区可能表示您选择了错误的源。此外,根据https://developer.android.com/reference/android/media/AudioRecord.html#AudioRecord(int,%20int,%20int,%20int,%20int),即使配置出现问题,您也可能不会总是遇到异常,您可能需要确认对象是否已正确初始化。如果一切都失败了,你也可以做一个 “mRecord.setPreferredDevice(AudioDeviceInfo.TYPE_BUILTIN_EARPIECE);” 将手机的内置耳机直接连接到录音机的输入端。是的,它有点肮脏和黑客,但也许适合目的。

令我困惑的另一件事是,您尝试通过其构造函数直接配置对象,而不是使用构建器类。是否有一个特定的原因,你不想使用AudioRecord.Builder(在https://developer.android.com/reference/android/media/AudioRecord.Builder.html有一个很好的例子)而不是?