Android 사용자 정의 ROM에서 통화 중 음성 재생 수정


78

일반 전화 통화 재생 사운드에 전처리를 추가하기 위해 Android OS (AOSP의 공식 이미지)를 수정하고 싶습니다.

나는 이미 앱 오디오 재생에 대해이 필터링을 달성했습니다 ( HALaudioflinger 수정 ).

특정 기기 (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 :

사용 에 대한 보다 구체적인 질문을 열었습니다. 이 질문AudioSource.VOICE_DOWNLINK올바른주의를 끌 수 있으며 결국이 질문의 문제를 해결하는 데 도움이 될 것입니다.


그렇게하고 싶었습니다. 키워드 호출을 모니터링 한 다음 호출에 사운드를 삽입하도록합니다. 내가 "골프"라고 말하면 골프 박수 소리가 호출에 주입됩니다.
danny117

ndk-jni를 사용하지 않고 표준 i / o를 수정할 수 있는지 의심합니다
Pararth

1
나는 일반 앱이 아닌 맞춤형 ROM을 만드는 것에 대해 이야기하고 있습니다.
SirKnigget

IIRC, 전화 통화는 민감한 정보로 간주되며 개방형 소프트웨어는 이에 액세스 할 수 없습니다. "라디오"로 알려진 폐쇄 소스 펌웨어를 해킹해야합니다. 아마도 불가능할 것입니다.
Zdenek

그건 사실이 아니야. 통화 녹음 API가 있으며 많은 장치에서 다양한 해킹을 사용하여이를 사용하는 방법을 찾은 수많은 앱이 있습니다.
SirKnigget

답변:


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에 멋진 예제가 있습니다 ) 를 사용하지 않으려는 구체적인 이유가 있습니까?


당신이 제기 한 모든 점수가 확인되었습니다. 이것은 관련이 없습니다. Builder 클래스는 실제로 더 최신이지만 내부적으로는 정확히 동일한 위치로 이동합니다 (Android 소스 코드 확인).
SirKnigget

그렇다면 내장형 이어 피스의 소스를 기능에 연결해도 해결 방법으로 작동하지 않습니까?
CoolKoon

아니요. 근본적인 문제와 관련이 없습니다.
SirKnigget
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.