1c8ccf9fa1efcfc4683b0dbb131b3a9448feba8d
[WebKit-https.git] / Source / WebCore / PAL / pal / system / ClockGeneric.cpp
1 /*
2  * Copyright (C) 2011 Apple Inc.  All rights reserved.
3  * Copyright (C) 2017 Sony Interactive Entertainment Inc.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
18  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
24  * THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #include "config.h"
28 #include "ClockGeneric.h"
29
30 #include <wtf/CurrentTime.h>
31
32 namespace PAL {
33
34 std::unique_ptr<Clock> Clock::create()
35 {
36     return std::make_unique<ClockGeneric>();
37 }
38
39 ClockGeneric::ClockGeneric()
40     : m_running(false)
41     , m_rate(1)
42     , m_offset(0)
43 {
44     m_startTime = m_lastTime = now();
45 }
46
47 void ClockGeneric::setCurrentTime(double time)
48 {
49     m_startTime = m_lastTime = now();
50     m_offset = time;
51 }
52
53 double ClockGeneric::currentTime() const
54 {
55     if (m_running)
56         m_lastTime = now();
57     return ((m_lastTime - m_startTime).seconds() * m_rate) + m_offset;
58 }
59
60 void ClockGeneric::setPlayRate(double rate)
61 {
62     m_offset = currentTime();
63     m_lastTime = m_startTime = now();
64     m_rate = rate;
65 }
66
67 void ClockGeneric::start()
68 {
69     if (m_running)
70         return;
71
72     m_lastTime = m_startTime = now();
73     m_running = true;
74 }
75
76 void ClockGeneric::stop()
77 {
78     if (!m_running)
79         return;
80
81     m_offset = currentTime();
82     m_lastTime = m_startTime = now();
83     m_running = false;
84 }
85
86 MonotonicTime ClockGeneric::now() const
87 {
88     return MonotonicTime::now();
89 }
90
91 }