我想修改Android操作系统(来自AOSP的官方镜像),以添加预处理到普通电话播放声音。
我已经通过修改HAL和audioflinger实现了对应用程序音频播放的过滤。
我只需要针对特定设备(Nexus 5X)进行目标设置。而且,我只需要过滤回放 - 我不关心录制(上行)。
更新#1:
为了清楚起见 - 我可以修改专门的高通驱动程序,或者运行在Nexus 5X上并可以帮助我修改呼叫播放的任何部分。
更新#2:
我正在尝试创建一个Java层应用程序,可以实时将手机回放路由到音乐流中。
我已经成功将其安装为系统应用程序,并获得了使用AudioSource.VOICE_DOWNLINK
初始化AudioRecord
的权限。但是,记录会给出空白样本; 它不会记录语音通话。
这是我的工作线程内部的代码:
// 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
。
此外,我一直在查看hardware/qcom/audio/hal/voice.c
中的voice_check_and_set_incall_rec_usecase
函数。然而,我无法理解它(如何使它按照我想要的方式工作)。
更新#3:
我已经提出了一个更具体的问题,关于使用AudioSource.VOICE_DOWNLINK
,这可能会引起正确的注意,并最终帮助我解决这个问题。