[Android] [PATCH 3/5] VideoPlayer: fix AudioFocus

Thomas Guillem thomas at gllm.fr
Tue Mar 17 17:41:41 CET 2015


Don't request twice the audioFocus.
---
 .../vlc/gui/video/VideoPlayerActivity.java         | 87 ++++++++++++----------
 1 file changed, 47 insertions(+), 40 deletions(-)

diff --git a/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java b/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java
index df38e84..8dc36ce 100644
--- a/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java
+++ b/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.java
@@ -233,7 +233,6 @@ public class VideoPlayerActivity extends ActionBarActivity implements IVideoPlay
     //Volume
     private AudioManager mAudioManager;
     private int mAudioMax;
-    private OnAudioFocusChangeListener mAudioFocusListener;
     private boolean mMute = false;
     private int mVolSave;
     private float mVol;
@@ -274,9 +273,14 @@ public class VideoPlayerActivity extends ActionBarActivity implements IVideoPlay
      * (e.g. lock screen, or to restore the pause state)
      */
     private boolean mPauseOnLoaded = false;
-    private boolean mLostFocus = false;
     private boolean mPlaybackStarted = false;
 
+    /**
+     * Flag used by changeAudioFocus and mAudioFocusListener
+     */
+    private boolean mLostFocus = false;
+    private boolean mHasAudioFocus = false;
+
     // Tips
     private View mOverlayTips;
     private static final String PREF_TIPS_SHOWN = "video_player_tips_shown";
@@ -1213,55 +1217,58 @@ public class VideoPlayerActivity extends ActionBarActivity implements IVideoPlay
         mInfo.setVisibility(View.INVISIBLE);
     }
 
+    private OnAudioFocusChangeListener mAudioFocusListener = !LibVlcUtil.isFroyoOrLater() ? null :
+            new OnAudioFocusChangeListener() {
+        @Override
+        public void onAudioFocusChange(int focusChange) {
+            /*
+             * Pause playback during alerts and notifications
+             */
+            switch (focusChange) {
+                case AudioManager.AUDIOFOCUS_LOSS:
+                    changeAudioFocus(false);
+                case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
+                case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
+                    if (mLibVLC.isPlaying()) {
+                        mLostFocus = true;
+                        mLibVLC.pause();
+                    }
+                    break;
+                case AudioManager.AUDIOFOCUS_GAIN:
+                case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT:
+                case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:
+                    if (!mLibVLC.isPlaying() && mLostFocus) {
+                        mLibVLC.play();
+                        mLostFocus = false;
+                    }
+                    break;
+            }
+        }
+    };
+
     @TargetApi(Build.VERSION_CODES.FROYO)
     private int changeAudioFocus(boolean acquire) {
         if(!LibVlcUtil.isFroyoOrLater()) // NOP if not supported
             return AudioManager.AUDIOFOCUS_REQUEST_GRANTED;
 
-        if (mAudioFocusListener == null) {
-            mAudioFocusListener = new OnAudioFocusChangeListener() {
-                @Override
-                public void onAudioFocusChange(int focusChange) {
-                    /*
-                     * Pause playback during alerts and notifications
-                     */
-                    switch (focusChange)
-                    {
-                        case AudioManager.AUDIOFOCUS_LOSS:
-                        case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
-                        case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
-                            if (mLibVLC.isPlaying()) {
-                                mLibVLC.pause();
-                                mLostFocus = true;
-                            }
-                            break;
-                        case AudioManager.AUDIOFOCUS_GAIN:
-                        case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT:
-                        case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:
-                            if (!mLibVLC.isPlaying() && mLostFocus)
-                                mLibVLC.play();
-                            mLostFocus = false;
-                            break;
-                    }
-                }
-            };
-        }
+        if (mAudioManager == null)
+            return AudioManager.AUDIOFOCUS_REQUEST_FAILED;
 
-        mLostFocus = false;
-        int result;
-        if(acquire) {
-            result = mAudioManager.requestAudioFocus(mAudioFocusListener,
-                    AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
-            mAudioManager.setParameters("bgm_state=true");
+        int result = AudioManager.AUDIOFOCUS_REQUEST_GRANTED;
+        if (acquire) {
+            if (!mHasAudioFocus) {
+                result = mAudioManager.requestAudioFocus(mAudioFocusListener,
+                        AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
+                mAudioManager.setParameters("bgm_state=true");
+                mHasAudioFocus = true;
+            }
         }
         else {
-            if (mAudioManager != null && mAudioFocusListener != null) {
+            if (mHasAudioFocus) {
                 result = mAudioManager.abandonAudioFocus(mAudioFocusListener);
                 mAudioManager.setParameters("bgm_state=false");
-                mAudioFocusListener = null;
+                mHasAudioFocus = true;
             }
-            else
-                result = AudioManager.AUDIOFOCUS_REQUEST_FAILED;
         }
 
         return result;
-- 
2.1.3



More information about the Android mailing list