3d54c465aa4093c34c07699b3bb5e538a85eff9f
[WebKit-https.git] / Source / WebCore / platform / audio / MediaSession.h
1 /*
2  * Copyright (C) 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 MediaSession_h
27 #define MediaSession_h
28
29 #include "Timer.h"
30 #include <wtf/Noncopyable.h>
31 #include <wtf/text/WTFString.h>
32
33 namespace WebCore {
34
35 class MediaSessionClient;
36
37 class MediaSession {
38 public:
39     static std::unique_ptr<MediaSession> create(MediaSessionClient&);
40
41     MediaSession(MediaSessionClient&);
42     virtual ~MediaSession();
43
44     enum MediaType {
45         None = 0,
46         Video,
47         Audio,
48         WebAudio,
49     };
50     MediaType mediaType() const;
51     MediaType presentationType() const;
52
53     enum State {
54         Idle,
55         Playing,
56         Paused,
57         Interrupted,
58     };
59     State state() const { return m_state; }
60     void setState(State);
61
62     enum InterruptionType {
63         SystemSleep,
64         EnteringBackground,
65         SystemInterruption,
66     };
67     enum EndInterruptionFlags {
68         NoFlags = 0,
69         MayResumePlaying = 1 << 0,
70     };
71     void beginInterruption(InterruptionType);
72     void endInterruption(EndInterruptionFlags);
73
74     void applicationWillEnterForeground() const;
75     void applicationWillEnterBackground() const;
76
77     bool clientWillBeginPlayback();
78     bool clientWillPausePlayback();
79
80     void pauseSession();
81     
82     void visibilityChanged();
83
84     String title() const;
85     double duration() const;
86     double currentTime() const;
87
88     enum RemoteControlCommandType {
89         NoCommand,
90         PlayCommand,
91         PauseCommand,
92         StopCommand,
93         TogglePlayPauseCommand,
94         BeginSeekingBackwardCommand,
95         EndSeekingBackwardCommand,
96         BeginSeekingForwardCommand,
97         EndSeekingForwardCommand,
98     };
99     bool canReceiveRemoteControlCommands() const;
100     void didReceiveRemoteControlCommand(RemoteControlCommandType);
101
102     virtual bool requiresPlaybackTargetRouteMonitoring() const { return false; }
103     void wirelessRoutesAvailableDidChange() const;
104
105     enum DisplayType {
106         Normal,
107         Fullscreen,
108         Optimized,
109     };
110     DisplayType displayType() const;
111
112     bool isHidden() const;
113
114 protected:
115     MediaSessionClient& client() const { return m_client; }
116
117 private:
118     void clientDataBufferingTimerFired();
119     void updateClientDataBuffering();
120
121     MediaSessionClient& m_client;
122     Timer m_clientDataBufferingTimer;
123     State m_state;
124     State m_stateToRestore;
125     int m_interruptionCount { 0 };
126     bool m_notifyingClient;
127 };
128
129 class MediaSessionClient {
130     WTF_MAKE_NONCOPYABLE(MediaSessionClient);
131 public:
132     MediaSessionClient() { }
133     
134     virtual MediaSession::MediaType mediaType() const = 0;
135     virtual MediaSession::MediaType presentationType() const = 0;
136     virtual MediaSession::DisplayType displayType() const { return MediaSession::Normal; }
137
138     virtual void resumePlayback() = 0;
139     virtual void pausePlayback() = 0;
140
141     virtual String mediaSessionTitle() const;
142     virtual double mediaSessionDuration() const;
143     virtual double mediaSessionCurrentTime() const;
144     
145     virtual bool canReceiveRemoteControlCommands() const = 0;
146     virtual void didReceiveRemoteControlCommand(MediaSession::RemoteControlCommandType) = 0;
147
148     virtual void setShouldBufferData(bool) { }
149     virtual bool elementIsHidden() const { return false; }
150
151     virtual bool overrideBackgroundPlaybackRestriction() const = 0;
152
153     virtual void wirelessRoutesAvailableDidChange() { }
154
155 protected:
156     virtual ~MediaSessionClient() { }
157 };
158
159 }
160
161 #endif // MediaSession_h