Я хотів би змінити ОС Android (офіційне зображення від 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, 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
, яке може привернути належну увагу і, врешті-решт, допоможе мені також вирішити проблему цього питання.