Что возвращает getStreamVolumedB в Android AudioManager? - PullRequest
1 голос
/ 17 июня 2020

Я пытался получить какое-то преобразование SPL в дБ для выходного объема, поступающего с устройства android. Я знаю, что практически невозможно достичь идеального уровня звукового давления в дБ из-за оборудования, калибровок и прочего, но мне просто нужно грубое отключение, чтобы я мог предупредить пользователя, когда громкость носителя, который они воспроизводят слишком громко.

Я нашел функцию getStreamVolumedB в AudioManager, но не могу интерпретировать результаты. Кажется, что все возвращаемые числа с плавающей запятой имеют шкалу от 0 до 1 или от 0 до 0,7i sh, причем от 0 до 1 применяется к голосовым вызовам, а от 0 до 0,7 - к мультимедиа. Я использовал свою галактику s8, чтобы проверить ее, играя в spotify во время запуска функции, и вместо того, чтобы изменять расчет float db в зависимости от того, что выводится, он, кажется, изменяется только в зависимости от настроек громкости на устройстве.

Может ли кто-нибудь помочь мне интерпретировать, что именно выводит функция, и как я могу каким-то образом преобразовать это в db SPL или получить безопасный порог слышимости? Также я совершенно новичок в программировании android, а также Java, поэтому я мог неправильно использовать функцию или что-то в этом роде. Если это так, пожалуйста, дайте мне знать. Спасибо!

Я прикрепил код к соответствующему классу ниже

public class AudioStream {
private AudioManager audioManager;
//private AudioStream audioStreamVol;
private static final String TAG = "AudioStream";

private Set<Integer> deviceTypes =
        new HashSet<>(Arrays.asList(AudioDeviceInfo.TYPE_BUILTIN_EARPIECE,
        AudioDeviceInfo.TYPE_BUILTIN_SPEAKER,
        AudioDeviceInfo.TYPE_WIRED_HEADSET,
        AudioDeviceInfo.TYPE_WIRED_HEADPHONES,
        AudioDeviceInfo.TYPE_LINE_ANALOG,
        AudioDeviceInfo.TYPE_LINE_DIGITAL,
        AudioDeviceInfo.TYPE_BLUETOOTH_SCO,
        AudioDeviceInfo.TYPE_BLUETOOTH_A2DP,
        AudioDeviceInfo.TYPE_HDMI,
        AudioDeviceInfo.TYPE_HDMI_ARC,
        AudioDeviceInfo.TYPE_USB_DEVICE,
        AudioDeviceInfo.TYPE_USB_ACCESSORY,
        AudioDeviceInfo.TYPE_DOCK,
        AudioDeviceInfo.TYPE_FM,
        AudioDeviceInfo.TYPE_BUILTIN_MIC,
        AudioDeviceInfo.TYPE_TELEPHONY,
        AudioDeviceInfo.TYPE_AUX_LINE,
        AudioDeviceInfo.TYPE_IP,
        AudioDeviceInfo.TYPE_BUS,
        AudioDeviceInfo.TYPE_USB_HEADSET,
        AudioDeviceInfo.TYPE_HEARING_AID));

public int findDeviceType() {
    final AudioDeviceInfo[] devices = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS);
    for (AudioDeviceInfo device : devices) {
        final int type = device.getType();
        if (deviceTypes.contains(type)) {
            return type;
        }
    }
    return -1;

}

public float audioStreamVol(Context context){
    audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
    int curType = (int) audioManager.STREAM_MUSIC;
    int vol = audioManager.getStreamVolume(curType);
    int deviceType = findDeviceType();
    float volumedB = audioManager.getStreamVolumeDb(curType, vol, deviceType);
    return volumedB;
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...