Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(953)

Unified Diff: content/browser/media/android/media_session.h

Issue 1110833004: Move audio focus control from media/ to content/ and make it per WebContents. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/media/android/media_session.h
diff --git a/content/browser/media/android/media_session.h b/content/browser/media/android/media_session.h
new file mode 100644
index 0000000000000000000000000000000000000000..82370a16575175451ef9cfc90b0765fd48729198
--- /dev/null
+++ b/content/browser/media/android/media_session.h
@@ -0,0 +1,80 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_MEDIA_ANDROID_MEDIA_SESSION_H_
+#define CONTENT_BROWSER_MEDIA_ANDROID_MEDIA_SESSION_H_
+
+#include <jni.h>
+
+#include "base/android/scoped_java_ref.h"
+#include "base/id_map.h"
+#include "content/public/browser/web_contents_observer.h"
+#include "content/public/browser/web_contents_user_data.h"
+
+namespace content {
+
+class MediaSessionDelegate;
+
+// MediaSession manages the Android AudioFocus for a given WebContents. It is
whywhat 2015/05/12 12:50:45 I believe a more expanded comment would be welcome
mlamouri (slow - plz ping) 2015/05/19 21:56:16 Done.
+// requesting the audio focus, pausing when requested by the system and dropping
+// it on demand.
+class MediaSession : public content::WebContentsObserver,
qinmin 2015/05/15 18:06:19 Can we merge this class with MediaWebContentsObser
mlamouri (slow - plz ping) 2015/05/19 21:56:16 They are not quite doing the same thing. MediaSess
+ protected content::WebContentsUserData<MediaSession> {
+ public:
+ enum class Type {
+ Content,
+ Transient
+ };
+
+ static bool RegisterMediaSession(JNIEnv* env);
+ static MediaSession* Get(WebContents* web_contents);
+
+ ~MediaSession() override;
+
+ bool RequestAudioFocus(MediaSessionDelegate* delegate,
whywhat 2015/05/12 12:50:45 Document the public methods.
mlamouri (slow - plz ping) 2015/05/19 21:56:16 Done.
+ int player_id,
whywhat 2015/05/12 12:50:45 This sounds more like "EnsureSufficientAudioFocus"
mlamouri (slow - plz ping) 2015/05/19 21:56:16 Renamed AddPlayer(). I changed how things behave t
+ Type type);
+ void AbandonAudioFocus(MediaSessionDelegate* delegate,
whywhat 2015/05/12 12:50:46 Could be OnPlayerStopped then if you accept the su
mlamouri (slow - plz ping) 2015/05/19 21:56:16 Renamed RemovePlayer(). OnPlayerStopped() is confu
+ int player_id);
+ void AbandonAudioFocus(MediaSessionDelegate* delegate);
whywhat 2015/05/12 12:50:46 Ditto. OnAllPlayersStopped() maybe?
mlamouri (slow - plz ping) 2015/05/19 21:56:16 RemovePlayers()
mlamouri (slow - plz ping) 2015/05/19 21:56:16 RemovePlayers()
+
+ // Called by Java trough JNI.
+ void OnSuspend(JNIEnv* env, jobject obj);
+ void OnResume(JNIEnv* env, jobject obj);
+
+ private:
+ friend class content::WebContentsUserData<MediaSession>;
+
+ struct PlayerIdentifier {
+ PlayerIdentifier(MediaSessionDelegate* delegate, int id)
+ : delegate_(delegate),
+ id_(id) {};
+ MediaSessionDelegate* delegate_;
+ int id_;
+
+ DISALLOW_COPY_AND_ASSIGN(PlayerIdentifier);
whywhat 2015/05/12 12:50:46 nit: is it common for structs? not sure if this is
mlamouri (slow - plz ping) 2015/05/19 21:56:16 AFAIK, it is recommended if not required.
+ };
+ using PlayersMap = IDMap<PlayerIdentifier, IDMapOwnPointer>;
+
+ explicit MediaSession(WebContents* web_contents);
+
+ // Setup the JNI.
+ void Initialize();
+
+ // To be called after a call to AbandonAudioFocus() in order to call the Java
+ // MediaSession if the audio focus really need to be abandoned.
+ void AbandonAudioFocusIfNeeded();
whywhat 2015/05/12 12:50:45 s/AbandonAudioFocus/AbandonSystemAudioFocus?
mlamouri (slow - plz ping) 2015/05/19 21:56:16 Done.
+
+ base::android::ScopedJavaGlobalRef<jobject> j_media_session_;
+ PlayersMap players_;
+
+ bool has_audio_focus_;
whywhat 2015/05/12 12:50:46 Add None to Type and just have one three-state mem
mlamouri (slow - plz ping) 2015/05/19 21:56:16 When ::OnResume() is called, the boolean is toggle
+ Type audio_focus_type_;
+
+ DISALLOW_COPY_AND_ASSIGN(MediaSession);
+};
+
+} // namespace content
+
+#endif // CONTENT_BROWSER_MEDIA_ANDROID_MEDIA_SESSION_H_

Powered by Google App Engine
This is Rietveld 408576698