Я пытался получить какое-то преобразование 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;
}
}