Как получить громкость AudioTrack в Android?

Я могу установить громкость audioTrack с помощью track.setStereoVolume(a,b);

Но я не смог найти способ получить объем, например, getStereoVolume() или setOnVolumeChangedHandler(...).

Как я могу отслеживать уровень громкости?


person frankish    schedule 10.05.2013    source источник
comment
Я думаю, что использование AudioManager может быть решением. Есть метод getStreamVolume(int streamType);   -  person Opiatefuchs    schedule 10.05.2013
comment
Я думаю, что это общая функция переопределения. Таким образом, даже объем AudioTrack равен 0,0f, AudioManager может вернуть 1,0f для getStreamVolume. Не так ли?   -  person frankish    schedule 10.05.2013


Ответы (2)


Вы не можете получить левый и правый уровни громкости звуковой дорожки.

Поэтому я предлагаю вам создать класс, представляющий AudioTrack.

public class AudioPlayer{
    AudioTrack track;
    float leftVolume;
    float rightVolume;
    public AudioPlayer(){
        //create audio track.
        leftVolume = 1;
        rightVolume = 1;
    }
    public void setStereoVolume(float left, float right){
        this.leftVolume = left;
        this.rightVolume = right;
        track.setStereoVolume(left, right);
    }
}

Когда вы создаете свой AudioTrack, громкость стерео составляет 1,0 для обоих каналов. Когда громкость устанавливается через AudioPlayer, он отслеживает новый уровень.

Это будет работать, если AudioTrack полностью инкапсулирован в AudioPlayer.

Редактировать:

AudioTrack имеет собственный уровень громкости, не зависящий от других треков. Поток, в котором воспроизводится AudioTrack (STREAM_MUSIC, STREAM_SYSTEM и т. д.), также будет влиять на окончательный уровень громкости.

Итак, скажем, ваш AudioTrack имеет значение 0,5, 0,5 для левого и правого каналов, и он воспроизводится на STREAM_MUSIC. Если этот поток имеет громкость 0,5, окончательный уровень звука будет

.5*.5 = .25 //for the left and right channels.

Если какая-то автоматическая регулировка громкости происходит из-за энергосбережения или наушников - что угодно, это должно происходить на уровне потока (или где-то скрытом за его пределами). Тем не менее, это не должно регулировать вашу AudioTrack громкость.

person William Morrison    schedule 02.03.2014
comment
Спасибо за ваш ответ. Если громкость дорожки изменяется операционной системой Android (например, автоматическое изменение громкости на устройствах Samsung при подключении наушников), эти значения не будут синхронизированы. - person frankish; 02.03.2014
comment
Я так не думаю. Есть несколько уровней громкости. Ваша звуковая дорожка будет иметь свой уровень громкости независимо от любого другого уровня. Конечный уровень будет умножен на тип потока, на который он выводится. Я уточню в ответ. - person William Morrison; 02.03.2014

Не настоящий ответ, просто предположение: я еще не тестировал его, но это должно сработать. Я не думаю, что вам нужно переопределить этот метод. Попробуй это

 AudioManager audioManager = (AudioManager) 
          getSystemService(AUDIO_SERVICE);

      float volume = (float) audioManager.
          getStreamVolume(AudioManager.STREAM_MUSIC);
person Opiatefuchs    schedule 12.05.2013
comment
Проблема в том, что я уменьшаю громкость только 1 аудиодорожки. Таким образом, другая аудиодорожка может иметь громкость 1,0 (полная). Таким образом, getStreamvolume в AudioManager может быть установлен на 1,0 или 0,5 независимо от этих значений. - person frankish; 12.05.2013