From ee7bd695fd31d164a8a3ade1c2fb7fe019744ceb Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 19 Feb 2014 09:00:29 +0100 Subject: Timer: move to output/ --- src/output/Timer.cxx | 67 +++++++++++++++++++++++++++++++++ src/output/Timer.hxx | 47 +++++++++++++++++++++++ src/output/plugins/FifoOutputPlugin.cxx | 2 +- src/output/plugins/HttpdInternal.hxx | 2 +- src/output/plugins/NullOutputPlugin.cxx | 2 +- 5 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 src/output/Timer.cxx create mode 100644 src/output/Timer.hxx (limited to 'src/output') diff --git a/src/output/Timer.cxx b/src/output/Timer.cxx new file mode 100644 index 000000000..d3dcc714d --- /dev/null +++ b/src/output/Timer.cxx @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2003-2014 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "config.h" +#include "Timer.hxx" +#include "AudioFormat.hxx" +#include "system/Clock.hxx" + +#include + +#include + +Timer::Timer(const AudioFormat af) + : time(0), + started(false), + rate(af.sample_rate * af.GetFrameSize()) +{ +} + +void Timer::Start() +{ + time = MonotonicClockUS(); + started = true; +} + +void Timer::Reset() +{ + time = 0; + started = false; +} + +void Timer::Add(int size) +{ + assert(started); + + // (size samples) / (rate samples per second) = duration seconds + // duration seconds * 1000000 = duration us + time += ((uint64_t)size * 1000000) / rate; +} + +unsigned Timer::GetDelay() const +{ + int64_t delay = (int64_t)(time - MonotonicClockUS()) / 1000; + if (delay < 0) + return 0; + + if (delay > std::numeric_limits::max()) + delay = std::numeric_limits::max(); + + return delay; +} diff --git a/src/output/Timer.hxx b/src/output/Timer.hxx new file mode 100644 index 000000000..3c935cfac --- /dev/null +++ b/src/output/Timer.hxx @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2003-2014 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef MPD_TIMER_HXX +#define MPD_TIMER_HXX + +#include + +struct AudioFormat; + +class Timer { + uint64_t time; + bool started; + const int rate; +public: + explicit Timer(AudioFormat af); + + bool IsStarted() const { return started; } + + void Start(); + void Reset(); + + void Add(int size); + + /** + * Returns the number of milliseconds to sleep to get back to sync. + */ + unsigned GetDelay() const; +}; + +#endif diff --git a/src/output/plugins/FifoOutputPlugin.cxx b/src/output/plugins/FifoOutputPlugin.cxx index 0c7fb421e..9df5a74dd 100644 --- a/src/output/plugins/FifoOutputPlugin.cxx +++ b/src/output/plugins/FifoOutputPlugin.cxx @@ -21,7 +21,7 @@ #include "FifoOutputPlugin.hxx" #include "config/ConfigError.hxx" #include "../OutputAPI.hxx" -#include "Timer.hxx" +#include "../Timer.hxx" #include "fs/AllocatedPath.hxx" #include "fs/FileSystem.hxx" #include "util/Error.hxx" diff --git a/src/output/plugins/HttpdInternal.hxx b/src/output/plugins/HttpdInternal.hxx index a4c0477f0..53029edc6 100644 --- a/src/output/plugins/HttpdInternal.hxx +++ b/src/output/plugins/HttpdInternal.hxx @@ -26,7 +26,7 @@ #define MPD_OUTPUT_HTTPD_INTERNAL_H #include "../Internal.hxx" -#include "Timer.hxx" +#include "../Timer.hxx" #include "thread/Mutex.hxx" #include "event/ServerSocket.hxx" #include "event/DeferredMonitor.hxx" diff --git a/src/output/plugins/NullOutputPlugin.cxx b/src/output/plugins/NullOutputPlugin.cxx index 53140a475..098f58926 100644 --- a/src/output/plugins/NullOutputPlugin.cxx +++ b/src/output/plugins/NullOutputPlugin.cxx @@ -20,7 +20,7 @@ #include "config.h" #include "NullOutputPlugin.hxx" #include "../OutputAPI.hxx" -#include "Timer.hxx" +#include "../Timer.hxx" struct NullOutput { AudioOutput base; -- cgit v1.2.3