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