Android 사용자 정의 ROM에서 통화 중 음성 재생 수정
일반 전화 통화 재생 사운드에 전처리를 추가하기 위해 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 :
사용 에 대한 보다 구체적인 질문을 열었습니다. 이 질문 은 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
'programing tip' 카테고리의 다른 글
조건부 XOR? (0) | 2020.10.20 |
---|---|
Windows 용 최고의 C ++ IDE 또는 편집기 (0) | 2020.10.20 |
javafx가 반투명 커서를 망가 뜨리는 이유는 무엇입니까? (0) | 2020.10.20 |
CSS : transform : translate (-50 %, -50 %)는 텍스트를 흐리게 만듭니다. (0) | 2020.10.20 |
Django의 데이터베이스에서 외래 키에 대한 지원 부족을 해결하는 방법 (0) | 2020.10.20 |