7c6eafa7a6cef7cbb9ca3023440dac8f44e9be79
[WebKit-https.git] / Source / WebCore / platform / audio / MediaSessionManager.h
1 /*
2  * Copyright (C) 2013-2014 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef MediaSessionManager_h
27 #define MediaSessionManager_h
28
29 #include "MediaSession.h"
30 #include "RemoteCommandListener.h"
31 #include "Settings.h"
32 #include <map>
33 #include <wtf/Vector.h>
34
35 namespace WebCore {
36
37 class HTMLMediaElement;
38 class MediaSession;
39 class RemoteCommandListener;
40
41 class MediaSessionManagerClient {
42 public:
43     virtual ~MediaSessionManagerClient() { }
44
45     virtual bool isListeningForRemoteControlCommands() = 0;
46     virtual void startListeningForRemoteControlCommands() = 0;
47     virtual void stopListeningForRemoteControlCommands() = 0;
48     virtual void didBeginPlayback() = 0;
49
50 protected:
51     MediaSessionManagerClient() { }
52 };
53
54 class MediaSessionManager : RemoteCommandListenerClient {
55 public:
56     static MediaSessionManager& sharedManager();
57     virtual ~MediaSessionManager() { }
58
59     bool has(MediaSession::MediaType) const;
60     int count(MediaSession::MediaType) const;
61
62     void beginInterruption();
63     void endInterruption(MediaSession::EndInterruptionFlags);
64
65     void applicationWillEnterForeground() const;
66     void applicationWillEnterBackground() const;
67
68     enum SessionRestrictionFlags {
69         NoRestrictions = 0,
70         ConcurrentPlaybackNotPermitted = 1 << 0,
71         InlineVideoPlaybackRestricted = 1 << 1,
72         MetadataPreloadingNotPermitted = 1 << 2,
73         AutoPreloadingNotPermitted = 1 << 3,
74         BackgroundPlaybackNotPermitted = 1 << 4,
75     };
76     typedef unsigned SessionRestrictions;
77     
78     void addRestriction(MediaSession::MediaType, SessionRestrictions);
79     void removeRestriction(MediaSession::MediaType, SessionRestrictions);
80     SessionRestrictions restrictions(MediaSession::MediaType);
81     virtual void resetRestrictions();
82
83     virtual void sessionWillBeginPlayback(MediaSession&);
84     virtual void sessionWillEndPlayback(MediaSession&);
85     
86     bool sessionRestrictsInlineVideoPlayback(const MediaSession&) const;
87
88 #if ENABLE(IOS_AIRPLAY)
89     virtual void showPlaybackTargetPicker() { }
90 #endif
91
92     virtual void didReceiveRemoteControlCommand(MediaSession::RemoteControlCommandType) override;
93
94     void addClient(MediaSessionManagerClient*);
95     void removeClient(MediaSessionManagerClient*);
96
97 protected:
98     friend class MediaSession;
99     explicit MediaSessionManager();
100
101     void addSession(MediaSession&);
102     void removeSession(MediaSession&);
103     
104     void setCurrentSession(MediaSession&);
105     MediaSession* currentSession();
106     
107 private:
108     void updateSessionState();
109
110     SessionRestrictions m_restrictions[MediaSession::WebAudio + 1];
111
112     Vector<MediaSession*> m_sessions;
113     Vector<MediaSessionManagerClient*> m_clients;
114     std::unique_ptr<RemoteCommandListener> m_remoteCommandListener;
115     bool m_interrupted;
116 };
117
118 }
119
120 #endif // MediaSessionManager_h