2017-02-15 2 views
75

Я хотел бы изменить ОС Android (официальное изображение с AOSP), чтобы добавить предварительную обработку к нормальному звуку воспроизведения телефонного звонка.Изменение голосового воспроизведения в режиме реального времени в пользовательском ПЗУ Android

Я уже достиг этой фильтрации для приложений воспроизведения звука (путем изменения HAL и audioflinger).

Я в порядке с таргетингом только на конкретное устройство (Nexus 5X). Кроме того, мне нужно только фильтровать воспроизведение - мне не нужна запись (восходящая линия).

UPDATE # 1:

Для того, чтобы понять - я в порядке с модифицирующими Qualcomm-специальные драйверы, или любой другой части, что это то, что работает на Nexus 5X и может помочь мне изменить в вызову воспроизведения ,

UPDATE # 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 Однако я не смог понять это (как заставить его работать так, как я этого хочу).

UPDATE # 3:

Я открыл a more-specific question об использовании AudioSource.VOICE_DOWNLINK, которые могли бы привлечь внимание правильное и в конечном итоге поможет мне решить проблему на этот вопрос, а также.

+0

Я хотел сделать это. Просто чтобы он отслеживал вызов ключевых слов, затем вставляйте звук в звонок. Как я говорю «гольф», а затем в звонок звучит звук хлопания в гольф. – danny117

+0

Я сомневаюсь, что изменение стандартного ввода-вывода возможно без игры с ndk-jni – user2450263

+1

Я говорю о создании пользовательского ПЗУ, а не обычного приложения. – SirKnigget

ответ

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)?

+0

Все пункты, которые вы подняли, были проверены, это не связано. Класс Builder действительно более современный, но внутри он идет точно в том же месте (проверьте исходный код Android). – SirKnigget

+0

Так что, подключаясь к функции, источник встроенного динамика не работал как обходной путь? – CoolKoon

+0

Нет. Это не связано с основной проблемой. – SirKnigget

Смежные вопросы