Что такое AudioFlinger и почему не работает TONE_PROP_ACK?

В своем заявлении я делаю следующее заявление:

toneGenerator.startTone(ToneGenerator.TONE_PROP_ACK, 600);

Это очень хорошо работает на дешевом LG LS670 под управлением Android 2.3.3, но совсем не звучит на всех других телефонах, которые у меня есть, от Android 2.2.1 до Android 2.3.4.

Итак, я знаю, что версия ОС здесь не играет роли (я также подтвердил в документации, что она поддерживается с API 1).

Кроме того, для громкости звонка и мультимедиа установлено максимальное значение, а тональный генератор инициализируется с помощью:

toneGenerator = new ToneGenerator(ToneGenerator.TONE_DTMF_1, 100);

И я подтвердил, что Settings.System.DTMF_TONE_WHEN_DIALING установлен в 1.

Озадаченный таким непоследовательным поведением (на разных телефонах), я изучил системные журналы, когда это происходит, и единственное подозрительное различие, которое мне удалось найти, это то, что телефоны, которые не работают, TONE_PROP_ACK имеют эту строку в их журнал:

AudioFlinger    setParameters(): io 25, keyvalue routing=0, tid 155, calling tid 121

Какова цель AudioFlinger и что может быть его связь с отключением звука TONE_PROP_ACK?

Любая идея, как исправить мой код, чтобы этот TONE_PROP_ACK всегда звучал, независимо от модель телефона?


person Eternal Learner    schedule 27.06.2012    source источник
comment
Audio flinger - это системный компонент, который управляет звуком из пользовательского интерфейса Android, прежде чем передать его драйверу ядра. Можете ли вы получить звук с помощью какой-либо функции тона? Вы видели в документации API часть о том, что маршрутизация звука является переменной? В любом случае, чего вы действительно пытаетесь достичь - вы знаете, что эти тоны не проходят через восходящий канал вызова, верно?   -  person Chris Stratton    schedule 27.06.2012
comment
@ChrisStratton Да, я знаю, что эти сигналы не проходят через восходящую линию связи. На самом деле это мое предпочтительное поведение, поскольку я просто пытаюсь дать звуковой сигнал (это не обязательно должен быть DTMF). Я могу слышать звук из функций тонального сигнала, когда я использую набор номера телефона. Не могли бы вы подробнее рассказать о переменной маршрутизации аудио? Где я могу найти эту часть в документации по API? Прямой URL был бы супер. Спасибо +1.   -  person Eternal Learner    schedule 27.06.2012
comment
routing=0 для io 25 означает, что AudioFlinger сообщает конкретному аудиопотоку (в данном случае я предполагаю, что это AudioStreamOut), что он должен маршрутизироваться в никуда. То, как аудио HAL будет обрабатывать, зависит от реализации - поэтому он может, например, оставьте маршрутизацию для этого потока без изменений.   -  person Michael    schedule 06.02.2013


Ответы (2)


Один из способов решения проблемы - создать тон в чем-то вроде Audacity и воспроизвести его через SoundPool или API по вашему выбору.

Согласно документам Android, ToneGenerator.TONE_PROP_ACK:

1200 Гц, 100 мс ВКЛ, 100 мс ВЫКЛ 2 пакета

Если вы выберете SoundPool, я предлагаю сохранить файл в формате ogg и зацикливать звук до завершения. Это обеспечивает бесшовное звучание с очень маленьким клипом и без использования большого количества ресурсов.

person dan    schedule 08.02.2013

Синтаксическим анализом / декодированием занимается Stage fright, который используется службой медиаплеера. Декодированные данные записываются на аудиодорожку через аудиоприемник, а затем дорожки микшируются потоком (ами) микшера Audio Flinger и записываются в выходной поток (аудиооборудование). Объект потока вывода заполняет свой собственный буфер (буферы), а затем записывает данные в файл устройства вывода PCM (который может быть или не быть драйвером ALSA).

person Community    schedule 02.10.2014