Изменение воспроизведения голоса во время вызова в пользовательском ПЗУ Android

Я хотел бы изменить ОС 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, мой собственный ROM 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, который может привлечь внимание и в конечном итоге поможет мне решить проблему с этим вопросом.


person SirKnigget    schedule 15.02.2017    source источник
comment
Я хотел это сделать. Просто чтобы он отслеживал вызов по ключевым словам, а затем вставлял звук в вызов. Как я говорю, гольф, а затем в звонок добавляется звук хлопка в ладоши.   -  person danny117    schedule 22.02.2017
comment
Я сомневаюсь, что изменение стандартного ввода-вывода возможно без игры с ndk-jni   -  person Pararth    schedule 05.05.2017
comment
Я говорю о создании пользовательского ПЗУ, а не обычного приложения.   -  person SirKnigget    schedule 05.05.2017
comment
IIRC, телефонный звонок считается конфиденциальной информацией, и открытое программное обеспечение не имеет к ней доступа. Вам придется взломать прошивку с закрытым исходным кодом, известную как радио. Наверное, это невозможно.   -  person Zdenek    schedule 15.08.2017
comment
Это не правда. Существует API записи разговоров и множество приложений, которые нашли способ использовать его, используя различные хаки на множестве устройств.   -  person SirKnigget    schedule 16.08.2017
comment
@SirKnigget, можете ли вы привести несколько примеров таких приложений?   -  person Lex Hobbit    schedule 26.08.2017
comment
Я написал подобное приложение. Выпустил 2 года назад. Можно записывать поток, поэтому я предполагаю, что его легко отфильтровать. Однако некоторые устройства просто не имеют аппаратного соединения между радиомодулем и чипом кодирования. Это сделано для того, чтобы никто не взломал ваш телефон и не записал ваши звонки. Китайские дешёвые как фишки модели всегда почему-то работают.   -  person Namphibian    schedule 13.09.2017
comment
Спасибо @Namphibian, вы можете поделиться своим решением? Я готов платить за то, что работает.   -  person SirKnigget    schedule 13.09.2017
comment
@SirKnigget мы можем обсудить некоторые детали в чате. Дай мне знать, когда освободишься. Я более чем готов помочь и, вероятно, собираюсь открыть исходный код кода. Я вижу, что вы в HCMC (я люблю Вьетнам), а я в Сиднее, так что у нас разница в 3 часа. Позвольте мне знать.   -  person Namphibian    schedule 18.09.2017
comment
@Namphibian Я попытался добавить вас в LinkedIn. Я не знаю функции чата в StackOverflow ...   -  person SirKnigget    schedule 18.09.2017
comment
@Namphibian Я создал комнату в чате StackOverflow. Надеюсь, вы получите уведомление об этом. В противном случае дайте мне знать, как с вами связаться ...   -  person SirKnigget    schedule 23.09.2017
comment
@Namphibian В настоящее время я работаю над аналогичной функциональностью в сборке AOSP, и мне удалось записать запись голосового вызова. Но застрял в проигрываемом аудиофайле в потоке телефонных звонков по восходящей линии связи. Не могли бы вы объяснить, как вы, ребята, модифицируете HAL & AudioFlinger для потоковой передачи аудио во время телефонных звонков. Я действительно ценю твою помощь. Заранее спасибо!   -  person Krunal Indrodiya    schedule 15.04.2021
comment
Извините, этот проект был заброшен 4 года назад. Код пропал, и я больше не работаю на мобильных устройствах.   -  person Namphibian    schedule 16.04.2021


Ответы (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)?

person CoolKoon    schedule 27.01.2018
comment
Все поднятые вами вопросы проверены, это не имеет отношения. Класс Builder действительно более актуален, но внутри он находится точно в том же месте (проверьте исходный код Android). - person SirKnigget; 31.01.2018
comment
Значит, подключение к функции встроенного источника наушника тоже не помогло? - person CoolKoon; 02.02.2018
comment
Нет. Это не связано с основной проблемой. - person SirKnigget; 02.02.2018