在Android定制ROM中修改通话中的声音播放

问题描述:

我想修改Android OS(AOSP官方图像),将预处理添加到正常的电话播放声音中。在Android定制ROM中修改通话中的声音播放

我已经(通过修改HALaudioflinger)来实现这种过滤应用程式音频播放。

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

更新#1:

要清楚 - 我和修改特定高通公司司机行,或任何部分,它是在Nexus 5X运行,可以帮我修改的通话中播放。

更新#2:

我试图创建一个Java应用程序层的路由手机播放实时的音乐流。

我已经成功安装它作为系统应用程序,获取初始化AudioRecordAudioSource.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_usecasehardware/qcom/audio/hal/voice.c但是,我无法理解它(如何使它按照我想要的方式工作)。

更新#3:

我关于使用AudioSource.VOICE_DOWNLINK,这可能会得出正确的注意,并最终帮我解决这个问题的问题,以及开a more-specific question

+0

我想这样做。只是为了让它监控关键字的呼叫,然后在呼叫中注入声音。就像我说的“高尔夫球”,然后在呼叫中注入高尔夫拍手声。 – danny117

+0

我怀疑如果修改标准I/O是可能的,而不玩ndk-jni – user2450263

+1

我正在谈论创建自定义ROM,而不是一个正常的应用程序。 – SirKnigget

我认为有几个可能的问题。空白缓冲区可能表示您选择了错误的源。此外,根据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甚至有一个很好的例子)?

+0

您提出的所有观点都已经过检查,这与此无关。 Builder类确实是更新的,但内部它到达完全相同的地方(检查Android源代码)。 – SirKnigget

+0

因此,插入内置听筒信号源的功能无法用作解决方法吗? – CoolKoon

+0

不是。它与潜在问题无关。 – SirKnigget