Teach MediaSessionManager to manage interruptions
[WebKit-https.git] / Source / WebCore / platform / audio / MediaSessionManager.cpp
1 /*
2  * Copyright (C) 2013 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 #include "config.h"
27 #include "MediaSessionManager.h"
28
29 #include "MediaSession.h"
30
31 namespace WebCore {
32
33 MediaSessionManager& MediaSessionManager::sharedManager()
34 {
35     DEFINE_STATIC_LOCAL(MediaSessionManager, manager, ());
36     return manager;
37 }
38
39 MediaSessionManager::MediaSessionManager()
40     : m_interruptions(0)
41 {
42 }
43
44 bool MediaSessionManager::has(MediaSession::MediaType type) const
45 {
46     ASSERT(type >= MediaSession::None && type <= MediaSession::WebAudio);
47
48     for (auto* session : m_sessions) {
49         if (session->mediaType() == type)
50             return true;
51     }
52
53     return false;
54 }
55
56 int MediaSessionManager::count(MediaSession::MediaType type) const
57 {
58     ASSERT(type >= MediaSession::None && type <= MediaSession::WebAudio);
59     
60     int count = 0;
61     for (auto* session : m_sessions) {
62         if (session->mediaType() == type)
63             ++count;
64     }
65
66     return count;
67 }
68
69 void MediaSessionManager::beginInterruption()
70 {
71     if (++m_interruptions > 1)
72         return;
73
74     for (auto* session : m_sessions)
75         session->beginInterruption();
76 }
77
78 void MediaSessionManager::endInterruption(MediaSession::EndInterruptionFlags flags)
79 {
80     ASSERT(m_interruptions > 0);
81     if (--m_interruptions)
82         return;
83     
84     for (auto* session : m_sessions)
85         session->endInterruption(flags);
86 }
87
88 void MediaSessionManager::addSession(MediaSession& session)
89 {
90     m_sessions.append(&session);
91     session.setState(m_interruptions ? MediaSession::Interrupted : MediaSession::Running);
92     updateSessionState();
93 }
94
95 void MediaSessionManager::removeSession(MediaSession& session)
96 {
97     size_t index = m_sessions.find(&session);
98     ASSERT(index != notFound);
99     if (index == notFound)
100         return;
101
102     m_sessions.remove(index);
103     updateSessionState();
104 }
105
106 #if !PLATFORM(MAC)
107 void MediaSessionManager::updateSessionState()
108 {
109 }
110 #endif
111
112 }