我想修改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
但是我无法理解它(如何使其以我想要的方式工作)。
更新#3:
我已经打开了一个有关using的更具体的问题AudioSource.VOICE_DOWNLINK
,它可能引起正确的注意,并最终也将帮助我解决该问题。