programing tip

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

itbloger 2020. 10. 20. 07:24
반응형

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


일반 전화 통화 재생 사운드에 전처리를 추가하기 위해 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올바른주의를 끌 수 있으며 결국이 질문의 문제를 해결하는 데 도움이 될 것입니다.


내 마음에 떠오르는 몇 가지 가능한 문제가 있습니다. 빈 버퍼는 잘못된 소스를 선택했음을 나타낼 수 있습니다. 또한 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에 멋진 예제가 있습니다 ) 를 사용하지 않으려는 구체적인 이유가 있습니까?

참고 URL : https://stackoverflow.com/questions/42251267/modifying-in-call-voice-playback-in-android-custom-rom

반응형