Выход TTS всегда идет в A2DP - PullRequest
       17

Выход TTS всегда идет в A2DP

5 голосов
/ 06 августа 2011

В моем руководстве по Android указано, что я могу явно указать движку TTS, какой поток использовать:

Для воспроизведения музыки:

params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_MUSIC));

И для телефонных звонков:

params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_VOICE_CALL));

Насколько я понимаю, маршрутизация звука на гарнитуру Bluetooth работает таким образом, что STREAM_MUSIC переходит на A2DP (он же "media audio" в настройках Android Bluetooth), а STREAM_VOICE_CALL переходит на HSP (он же "телефонный звук").в настройках Android Bluetooth).

Но независимо от того, использую ли я STREAM_MUSIC или STREAM_VOICE_CALL в моем маленьком приложении, звук всегда по каким-то причинам всегда идет к A2DP.

Что я делаю не так?Есть ли способ направить вывод TTS в профиль HSP гарнитуры?

Ответы [ 3 ]

2 голосов
/ 03 сентября 2011

У меня это работает по большей части, на большинстве устройств. Вот часть, которая запускает TTS в потоке голосовых вызовов, используя Bluetooth SCO вместо A2DP.

if (mTtsReady) {
    myHash = new HashMap<String, String>();

    myHash.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "A2DP_Vol");

    OLD_AUDIO_MODE = am2.getMode();
    if(SMSstream == 1){
        if (am2.isBluetoothScoAvailableOffCall()) {
            am2.startBluetoothSco();
        }
        if(!am2.isSpeakerphoneOn()){
            speakerPhoneWasOn = false;
            am2.setSpeakerphoneOn(true);
        }
        myHash.put(TextToSpeech.Engine.KEY_PARAM_STREAM,
                String.valueOf(AudioManager.STREAM_VOICE_CALL));
        am2.requestAudioFocus(null, AudioManager.STREAM_VOICE_CALL,
                AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);

    }
    else{
        am2.requestAudioFocus(null, AudioManager.STREAM_MUSIC,
        AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
        myHash.put(TextToSpeech.Engine.KEY_PARAM_STREAM,
                String.valueOf(AudioManager.STREAM_MUSIC));
    }

    new CountDownTimer(SMS_DELAY, SMS_DELAY/2) {

        @Override
        public void onFinish() {
            try {
                mTts.speak(str, TextToSpeech.QUEUE_ADD,
                        myHash);
            } catch (Exception e) {
                Toast.makeText(application,
                        R.string.TTSNotReady,
                        Toast.LENGTH_LONG).show();
                e.printStackTrace();
            }

        }

        @Override
        public void onTick(long arg0) {

        }

    }.start();
}

Теперь у меня просто проблема с возвращением потока, когда он закончится. Все отлично работает, чтобы прочитать TTS. Он приостановит любую музыку, воспроизведет TTS, а затем возобновит воспроизведение музыки. Однако при последующем выходе из приложения поток мультимедиа воспроизводится через телефонный наушник до перезагрузки. Я разместил этот вопрос здесь: Аудио поток остается на наушнике после использования AudioManager

Вы можете увидеть весь мой проект здесь: http://code.google.com/p/a2dpvolume/

1 голос
/ 01 декабря 2011

Да, можно воспроизводить вывод TTS (текст-в-речь) через гарнитуру не A2DP, как говорит Джроал, используя SCO.

Используйте AudioManager startBluetoothSco для включения SCO. Затем прослушайте трансляцию AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED с EXTRA_SCO_AUDIO_STATE, для которого установлено значение SCO_AUDIO_STATE_CONNECTED.

Если вы сейчас выполните TextToSpeech для потока STREAM_VOICE_CALL, он окажется в гарнитуре (даже в дешевых устройствах, не поддерживающих A2DP).

1 голос
/ 12 августа 2011

Если ваша гарнитура совместима с профилем a2dp, то использование AudioManager.STREAM_MUSIC и, следовательно, воспроизведение аудио через поток должно завершить работу.

Я также добавил бы, что если вы в настоящее время находитесь в вызовеи вы воспроизводите аудио через голосовой поток, тогда любая гарнитура (a2dp или иная) может слышать звук.К сожалению, вам нужно быть на связи.К сожалению, я обнаружил, что установка режима на MODE_IN_CALL ничего не делает.

Подводя итог: Если все, что вы пытаетесь сделать, это воспроизводить музыку (когда нет вызова), тогда используйте * 1007.* и если гарнитура совместима с A2DP, она будет слышать музыку.

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

...