Модифікація відтворення голосу під час дзвінка в спеціальному ПЗУ Android


78

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


Я хотів це зробити. Просто щоб він контролював дзвінок за ключовими словами, а потім вводив звук у дзвінок. Як я кажу "гольф", а потім у дзвінок подається звук гольфу.
danny117

я сумніваюся, чи можливе змінення стандартного вводу-виводу без гри з ndk-jni
Парарт,

1
Я говорю про створення власного ПЗУ, а не звичайного додатка.
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);" для перенаправлення вбудованого в навушник телефону безпосередньо на вхід диктофона. Так, це якось брудно і халтурно, але, можливо, відповідає меті.

Інше, що мене бентежило, що замість використання класу builder ви намагалися налаштувати об’єкт безпосередньо за допомогою його конструктора. Чи є конкретна причина, чому ви не хочете використовувати AudioRecord.Builder (є навіть хороший приклад на веб- сайті https://developer.android.com/reference/android/media/AudioRecord.Builder.html )?


Усі підняті вами пункти перевірено, це не пов’язано. Клас Builder справді є найсучаснішим, але внутрішньо він переходить точно в те саме місце (перевірте вихідний код Android).
SirKnigget

Отже, підключення до функції вбудованого джерела навушника теж не працювало як обхідний шлях?
CoolKoon

Ні. Це не пов’язано з основною проблемою.
SirKnigget
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.