diff --git a/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/SignalAudioManager.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/SignalAudioManager.java index ec6a7bc46a..9766c1398c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/SignalAudioManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/SignalAudioManager.java @@ -79,7 +79,8 @@ public class SignalAudioManager { audioManager.setSpeakerphoneOn(false); } - soundPool.play(connectedSoundId, 1.0f, 1.0f, 0, 0, 1.0f); + float volume = ringVolumeWithMinimum(audioManager); + soundPool.play(connectedSoundId, volume, volume, 0, 0, 1.0f); } public void stop(boolean playDisconnected) { @@ -89,11 +90,27 @@ public class SignalAudioManager { outgoingRinger.stop(); if (playDisconnected) { - soundPool.play(disconnectedSoundId, 1.0f, 1.0f, 0, 0, 1.0f); + float volume = ringVolumeWithMinimum(audioManager); + soundPool.play(disconnectedSoundId, volume, volume, 0, 0, 1.0f); } audioManager.setMode(AudioManager.MODE_NORMAL); audioManagerCompat.abandonCallAudioFocus(); } + + private static float ringVolumeWithMinimum(@NonNull AudioManager audioManager) { + int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING); + int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING); + float volume = logVolume(currentVolume, maxVolume); + float minVolume = logVolume(15, 100); + return Math.max(volume, minVolume); + } + + private static float logVolume(int volume, int maxVolume) { + if (maxVolume == 0 || volume > maxVolume) { + return 0.5f; + } + return (float) (1 - (Math.log(maxVolume + 1 - volume) / Math.log(maxVolume + 1))); + } }