Skip to content

Commit 5031409

Browse files
committed
Fix broken mute
It should play video with mute on even though another app is playing audio.
1 parent 3c58b34 commit 5031409

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

app/src/main/java/org/schabi/newpipe/player/Player.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1345,7 +1345,34 @@ public void toggleShuffleModeEnabled() {
13451345

13461346
public void toggleMute() {
13471347
final boolean wasMuted = isMuted();
1348+
final boolean wasPlaying = simpleExoPlayer.isPlaying();
1349+
Log.d(TAG, "toggleMute: wasMuted=" + wasMuted + ", wasPlaying=" + wasPlaying);
13481350
simpleExoPlayer.setVolume(wasMuted ? 1 : 0);
1351+
if (wasMuted) {
1352+
Log.d(TAG, "toggleMute: enabling audio focus, willPlay=" + wasPlaying);
1353+
simpleExoPlayer.setAudioAttributes(
1354+
new com.google.android.exoplayer2.audio.AudioAttributes.Builder()
1355+
.setUsage(C.USAGE_MEDIA)
1356+
.setContentType(C.AUDIO_CONTENT_TYPE_MUSIC)
1357+
.build(),
1358+
true // handleAudioFocus = true - ExoPlayer handles focus automatically
1359+
);
1360+
if (wasPlaying) {
1361+
Log.d(TAG, "toggleMute: calling play(), isPlaying=" + simpleExoPlayer.isPlaying());
1362+
simpleExoPlayer.play();
1363+
Log.d(TAG, "toggleMute: after play(), isPlaying=" + simpleExoPlayer.isPlaying());
1364+
}
1365+
} else {
1366+
Log.d(TAG, "toggleMute: disabling audio focus, abandoning focus");
1367+
simpleExoPlayer.setAudioAttributes(
1368+
new com.google.android.exoplayer2.audio.AudioAttributes.Builder()
1369+
.setUsage(C.USAGE_MEDIA)
1370+
.setContentType(C.AUDIO_CONTENT_TYPE_MUSIC)
1371+
.build(),
1372+
false // handleAudioFocus = false
1373+
);
1374+
audioReactor.abandonAudioFocus();
1375+
}
13491376
UIs.call(playerUi -> playerUi.onMuteUnmuteChanged(!wasMuted));
13501377
notifyPlaybackUpdateToListeners();
13511378
}

app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
import android.content.Intent;
55
import android.media.AudioManager;
66
import android.media.audiofx.AudioEffect;
7+
import android.util.Log;
78

89
import androidx.annotation.NonNull;
910
import androidx.core.content.ContextCompat;
11+
import androidx.media.AudioFocusRequestCompat;
1012
import androidx.media.AudioManagerCompat;
1113

1214
import com.google.android.exoplayer2.ExoPlayer;
@@ -16,25 +18,48 @@ public class AudioReactor implements AnalyticsListener {
1618

1719
private static final String TAG = "AudioFocusReactor";
1820

21+
private static final int FOCUS_GAIN_TYPE = AudioManagerCompat.AUDIOFOCUS_GAIN;
1922
private static final int STREAM_TYPE = AudioManager.STREAM_MUSIC;
2023

2124
private final ExoPlayer player;
2225
private final Context context;
2326
private final AudioManager audioManager;
27+
private final AudioFocusRequestCompat request;
2428

2529
public AudioReactor(@NonNull final Context context,
2630
@NonNull final ExoPlayer player) {
2731
this.player = player;
2832
this.context = context;
2933
this.audioManager = ContextCompat.getSystemService(context, AudioManager.class);
3034
player.addAnalyticsListener(this);
35+
36+
request = new AudioFocusRequestCompat.Builder(FOCUS_GAIN_TYPE)
37+
.setWillPauseWhenDucked(true)
38+
.setOnAudioFocusChangeListener(focusChange -> {
39+
})
40+
.build();
3141
}
3242

3343
public void dispose() {
44+
abandonAudioFocus();
3445
player.removeAnalyticsListener(this);
3546
notifyAudioSessionUpdate(false, player.getAudioSessionId());
3647
}
3748

49+
/*//////////////////////////////////////////////////////////////////////////
50+
// Audio Focus
51+
//////////////////////////////////////////////////////////////////////////*/
52+
53+
public void requestAudioFocus() {
54+
Log.d(TAG, "requestAudioFocus() called");
55+
AudioManagerCompat.requestAudioFocus(audioManager, request);
56+
}
57+
58+
public void abandonAudioFocus() {
59+
Log.d(TAG, "abandonAudioFocus() called");
60+
AudioManagerCompat.abandonAudioFocusRequest(audioManager, request);
61+
}
62+
3863
/*//////////////////////////////////////////////////////////////////////////
3964
// Audio Manager
4065
//////////////////////////////////////////////////////////////////////////*/

0 commit comments

Comments
 (0)