WedX - журнал о программировании и компьютерных науках

AudioManager вводит задержку в setMode (MODE_IN_COMMUNICATION)

Я пытаюсь воспроизвести звук на динамике, даже если наушники включены, НО, если в фоновом режиме играет музыка, я хочу, чтобы музыка воспроизводилась в наушниках до тех пор, пока звук не будет воспроизведен.

Итак, я делаю следующие шаги:

  • Перед воспроизведением звука я получаю audioFocus, поэтому вся фоновая музыка останавливается.
  • После того, как audioFocus получен, я установил MODE_COMMUNICATION в AudioManager, чтобы звук можно было воспроизводить на динамике.
  • После окончания звука я отказываюсь от AudioFocus и устанавливаю обратно MODE_NORMAL на AudioManager, чтобы фоновая музыка могла продолжать играть в наушниках.

Странно то, что это зависит от устройства, на некоторых устройствах это нормально, но на устройствах Nexus 6P (Huawei) после установки MODE_COMMUNICATION есть задержка 3-4 секунды, прежде чем звук может быть воспроизведен. Если воспроизвести звук без задержки, то он не воспроизводится ни в динамик, ни в наушники.

ВОПРОС

Как я могу узнать, какую задержку установить перед воспроизведением звука? Есть ли какой-нибудь прослушиватель, который я могу подключить, чтобы он мог уведомить меня, что после установки MODE_COMMUNICATION звук готов к воспроизведению?

Я не хочу устанавливать задержку, даже если в этом нет необходимости!

Решение не в том, чтобы установить режим в конструкторе класса (чтобы пропустить задержку), потому что мне нужно, чтобы звук воспроизводился на динамике в определенный момент!

P.S: Я проигрываю звук с AudioTrack, но пробовал и с MediaPlayer (настройка setAudioStreamType(MODE_IN_COMMUNICATION)), но безрезультатно, задержка осталась!

Итак, какие-либо предложения?



Ответы:


1

На случай, если кто-то наткнется на этот пост, у меня сработало вызов AudioManager.setMode(), а затем воссоздание моего MediaPlayer (с помощью конструктора, а не create()) и использование setAudioAttributes() для изменения источника вывода.

Фрагмент Котлина:

fun switchOutput(inCommunication: Boolean) {

    //STEP 1: Change the AudioManager's audio mode
    if(inCommunication) {
        audioManager.mode = AudioManager.MODE_IN_CALL
        audioManager.isSpeakerphoneOn = false
    } else {
        audioManager.mode = AudioManager.MODE_NORMAL
        audioManager.isSpeakerphoneOn = true
    }

    //STEP 2: Recreate the MediaPlayer
    if (player != null) {
        try {
            player?.stop()
        } catch (e: RuntimeException) {
        } finally {
            player?.reset()
            player?.release()
            player = null
        }
    }

    player = MediaPlayer()
    try {
        val streamType =
                if (inCommunication) AudioManager.STREAM_VOICE_CALL
                else AudioManager.STREAM_MUSIC
        player?.setDataSource(dataSource)
        player?.setAudioAttributes(AudioAttributes.Builder()
                .setLegacyStreamType(streamType)
                .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                .build())
        player?.prepare()
        player?.start()
    } catch (e: java.lang.Exception) {}
}

Надеюсь это поможет :)

P.S. Обратите внимание, что я использовал MODE_IN_CALL вместо MODE_IN_COMMUNICATION.

02.05.2020
  • для вашего решения требуется уровень API не ниже 21. 11.07.2020
  • @MuhammadSaqib Прошло много времени с тех пор, как я разработал приложение с minSDK ниже 21 ›.‹ 24.09.2020
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]