a03c5f31316941cf1d0ad7b09b3362cec7dc37e7
[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 "AudioHardwareListener.h"
30 #include "MediaSession.h"
31 #include "RemoteCommandListener.h"
32 #include "Settings.h"
33 #include "SystemSleepListener.h"
34 #include <map>
35 #include <wtf/Vector.h>
36
37 namespace WebCore {
38
39 class HTMLMediaElement;
40 class MediaSession;
41 class RemoteCommandListener;
42
43 class MediaSessionManager : private RemoteCommandListenerClient, private SystemSleepListener::Client, private AudioHardwareListener::Client {
44 public:
45     WEBCORE_EXPORT static MediaSessionManager& sharedManager();
46     virtual ~MediaSessionManager() { }
47
48     bool has(MediaSession::MediaType) const;
49     int count(MediaSession::MediaType) const;
50     bool activeAudioSessionRequired() const;
51
52     WEBCORE_EXPORT void beginInterruption(MediaSession::InterruptionType);
53     WEBCORE_EXPORT void endInterruption(MediaSession::EndInterruptionFlags);
54
55     WEBCORE_EXPORT void applicationWillEnterForeground() const;
56     WEBCORE_EXPORT void applicationWillEnterBackground() const;
57     void wirelessRoutesAvailableChanged();
58
59     enum SessionRestrictionFlags {
60         NoRestrictions = 0,
61         ConcurrentPlaybackNotPermitted = 1 << 0,
62         InlineVideoPlaybackRestricted = 1 << 1,
63         MetadataPreloadingNotPermitted = 1 << 2,
64         AutoPreloadingNotPermitted = 1 << 3,
65         BackgroundProcessPlaybackRestricted = 1 << 4,
66         BackgroundTabPlaybackRestricted = 1 << 5,
67     };
68     typedef unsigned SessionRestrictions;
69
70     WEBCORE_EXPORT void addRestriction(MediaSession::MediaType, SessionRestrictions);
71     WEBCORE_EXPORT void removeRestriction(MediaSession::MediaType, SessionRestrictions);
72     WEBCORE_EXPORT SessionRestrictions restrictions(MediaSession::MediaType);
73     virtual void resetRestrictions();
74
75     virtual void sessionWillBeginPlayback(MediaSession&);
76     virtual void sessionWillEndPlayback(MediaSession&);
77
78     bool sessionRestrictsInlineVideoPlayback(const MediaSession&) const;
79
80     virtual bool sessionCanLoadMedia(const MediaSession&) const;
81
82     virtual void configureWireLessTargetMonitoring() { }
83
84 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
85     virtual bool hasWirelessTargetsAvailable() { return false; }
86 #endif
87
88 protected:
89     friend class MediaSession;
90     explicit MediaSessionManager();
91
92     void addSession(MediaSession&);
93     void removeSession(MediaSession&);
94
95     void setCurrentSession(MediaSession&);
96     MediaSession* currentSession();
97
98     Vector<MediaSession*> sessions() { return m_sessions; }
99
100 private:
101     friend class Internals;
102
103     void updateSessionState();
104
105     // RemoteCommandListenerClient
106     WEBCORE_EXPORT virtual void didReceiveRemoteControlCommand(MediaSession::RemoteControlCommandType) override;
107
108     // AudioHardwareListenerClient
109     virtual void audioHardwareDidBecomeActive() override { }
110     virtual void audioHardwareDidBecomeInactive() override { }
111     virtual void audioOutputDeviceChanged() override;
112
113     // SystemSleepListener
114     virtual void systemWillSleep() override;
115     virtual void systemDidWake() override;
116
117     SessionRestrictions m_restrictions[MediaSession::WebAudio + 1];
118
119     Vector<MediaSession*> m_sessions;
120     std::unique_ptr<RemoteCommandListener> m_remoteCommandListener;
121     std::unique_ptr<SystemSleepListener> m_systemSleepListener;
122     RefPtr<AudioHardwareListener> m_audioHardwareListener;
123     bool m_interrupted;
124 };
125
126 }
127
128 #endif // MediaSessionManager_h