From 49a3845135142ada6d581d5a6f4a5192aaed49be Mon Sep 17 00:00:00 2001 From: Denis Krjuchkov Date: Sun, 12 May 2013 19:03:42 +0600 Subject: [PATCH] timer: convert to class --- Makefile.am | 6 ++-- src/{timer.c => Timer.cxx} | 47 ++++++++++++----------------- src/{timer.h => Timer.hxx} | 52 +++++++++++++------------------- src/clock.h | 8 +++++ src/output/FifoOutputPlugin.cxx | 20 ++++++------ src/output/HttpdInternal.hxx | 6 ++-- src/output/HttpdOutputPlugin.cxx | 16 +++++----- src/output/NullOutputPlugin.cxx | 22 +++++++------- 8 files changed, 83 insertions(+), 94 deletions(-) rename src/{timer.c => Timer.cxx} (59%) rename src/{timer.h => Timer.hxx} (62%) diff --git a/Makefile.am b/Makefile.am index 695b43a5e..a8d077bdd 100644 --- a/Makefile.am +++ b/Makefile.am @@ -94,7 +94,7 @@ mpd_headers = \ src/tag_ape.h \ src/tag_id3.h \ src/tag_rva2.h \ - src/timer.h \ + src/Timer.hxx \ src/mpd_error.h src_mpd_SOURCES = \ @@ -243,7 +243,7 @@ src_mpd_SOURCES = \ src/SongFilter.cxx src/SongFilter.hxx \ src/SongPointer.hxx \ src/PlaylistFile.cxx src/PlaylistFile.hxx \ - src/timer.c + src/Timer.cxx # # Windows resource file @@ -1299,7 +1299,7 @@ test_run_output_SOURCES = test/run_output.cxx \ src/audio_check.c \ src/audio_format.c \ src/AudioParser.cxx \ - src/timer.c src/clock.c \ + src/Timer.cxx src/clock.c \ src/Tag.cxx src/TagNames.c src/TagPool.cxx \ src/Page.cxx \ src/SocketUtil.cxx \ diff --git a/src/timer.c b/src/Timer.cxx similarity index 59% rename from src/timer.c rename to src/Timer.cxx index 9a3228465..7ddbda3da 100644 --- a/src/timer.c +++ b/src/Timer.cxx @@ -18,7 +18,7 @@ */ #include "config.h" -#include "timer.h" +#include "Timer.hxx" #include "audio_format.h" #include "clock.h" @@ -28,46 +28,37 @@ #include #include -struct timer *timer_new(const struct audio_format *af) +Timer::Timer(const struct audio_format &af) + : time(0), + started(false), + rate(af.sample_rate * audio_format_frame_size(&af)) { - struct timer *timer = g_new(struct timer, 1); - timer->time = 0; // us - timer->started = 0; // false - timer->rate = af->sample_rate * audio_format_frame_size(af); // samples per second - - return timer; } -void timer_free(struct timer *timer) +void Timer::Start() { - g_free(timer); + time = monotonic_clock_us(); + started = true; } -void timer_start(struct timer *timer) +void Timer::Reset() { - timer->time = monotonic_clock_us(); - timer->started = 1; + time = 0; + started = false; } -void timer_reset(struct timer *timer) +void Timer::Add(int size) { - timer->time = 0; - timer->started = 0; -} - -void timer_add(struct timer *timer, int size) -{ - assert(timer->started); + assert(started); // (size samples) / (rate samples per second) = duration seconds // duration seconds * 1000000 = duration us - timer->time += ((uint64_t)size * 1000000) / timer->rate; + time += ((uint64_t)size * 1000000) / rate; } -unsigned -timer_delay(const struct timer *timer) +unsigned Timer::GetDelay() const { - int64_t delay = (int64_t)(timer->time - monotonic_clock_us()) / 1000; + int64_t delay = (int64_t)(time - monotonic_clock_us()) / 1000; if (delay < 0) return 0; @@ -77,13 +68,13 @@ timer_delay(const struct timer *timer) return delay; } -void timer_sync(struct timer *timer) +void Timer::Synchronize() const { int64_t sleep_duration; - assert(timer->started); + assert(started); - sleep_duration = timer->time - monotonic_clock_us(); + sleep_duration = time - monotonic_clock_us(); if (sleep_duration > 0) g_usleep(sleep_duration); } diff --git a/src/timer.h b/src/Timer.hxx similarity index 62% rename from src/timer.h rename to src/Timer.hxx index 1506c9173..96446a988 100644 --- a/src/timer.h +++ b/src/Timer.hxx @@ -17,43 +17,33 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef MPD_TIMER_H -#define MPD_TIMER_H +#ifndef MPD_TIMER_HXX +#define MPD_TIMER_HXX #include struct audio_format; -struct timer { +class Timer { uint64_t time; - int started; - int rate; + bool started; + const int rate; +public: + explicit Timer(const struct audio_format& 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; + + void Synchronize() const; }; -#ifdef __cplusplus -extern "C" { -#endif - -struct timer *timer_new(const struct audio_format *af); - -void timer_free(struct timer *timer); - -void timer_start(struct timer *timer); - -void timer_reset(struct timer *timer); - -void timer_add(struct timer *timer, int size); - -/** - * Returns the number of milliseconds to sleep to get back to sync. - */ -unsigned -timer_delay(const struct timer *timer); - -void timer_sync(struct timer *timer); - -#ifdef __cplusplus -} -#endif - #endif diff --git a/src/clock.h b/src/clock.h index f1338938f..c98b9a652 100644 --- a/src/clock.h +++ b/src/clock.h @@ -24,6 +24,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + /** * Returns the value of a monotonic clock in milliseconds. */ @@ -38,4 +42,8 @@ gcc_pure uint64_t monotonic_clock_us(void); +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/output/FifoOutputPlugin.cxx b/src/output/FifoOutputPlugin.cxx index ebebc254f..15b107c45 100644 --- a/src/output/FifoOutputPlugin.cxx +++ b/src/output/FifoOutputPlugin.cxx @@ -20,7 +20,7 @@ #include "config.h" #include "FifoOutputPlugin.hxx" #include "output_api.h" -#include "timer.h" +#include "Timer.hxx" #include "fd_util.h" #include "open.h" @@ -44,7 +44,7 @@ struct FifoOutput { int input; int output; bool created; - struct timer *timer; + Timer *timer; FifoOutput() :path(nullptr), input(-1), output(-1), created(false) {} @@ -232,7 +232,7 @@ fifo_output_open(struct audio_output *ao, struct audio_format *audio_format, { FifoOutput *fd = (FifoOutput *)ao; - fd->timer = timer_new(audio_format); + fd->timer = new Timer(*audio_format); return true; } @@ -242,7 +242,7 @@ fifo_output_close(struct audio_output *ao) { FifoOutput *fd = (FifoOutput *)ao; - timer_free(fd->timer); + delete fd->timer; } static void @@ -252,7 +252,7 @@ fifo_output_cancel(struct audio_output *ao) char buf[FIFO_BUFFER_SIZE]; int bytes = 1; - timer_reset(fd->timer); + fd->timer->Reset(); while (bytes > 0 && errno != EINTR) bytes = read(fd->input, buf, FIFO_BUFFER_SIZE); @@ -268,8 +268,8 @@ fifo_output_delay(struct audio_output *ao) { FifoOutput *fd = (FifoOutput *)ao; - return fd->timer->started - ? timer_delay(fd->timer) + return fd->timer->IsStarted() + ? fd->timer->GetDelay() : 0; } @@ -280,9 +280,9 @@ fifo_output_play(struct audio_output *ao, const void *chunk, size_t size, FifoOutput *fd = (FifoOutput *)ao; ssize_t bytes; - if (!fd->timer->started) - timer_start(fd->timer); - timer_add(fd->timer, size); + if (!fd->timer->IsStarted()) + fd->timer->Start(); + fd->timer->Add(size); while (true) { bytes = write(fd->output, chunk, size); diff --git a/src/output/HttpdInternal.hxx b/src/output/HttpdInternal.hxx index e79b9a224..b79a22905 100644 --- a/src/output/HttpdInternal.hxx +++ b/src/output/HttpdInternal.hxx @@ -26,7 +26,7 @@ #define MPD_OUTPUT_HTTPD_INTERNAL_H #include "OutputInternal.hxx" -#include "timer.h" +#include "Timer.hxx" #include "thread/Mutex.hxx" #include "event/ServerSocket.hxx" @@ -72,10 +72,10 @@ struct HttpdOutput final : private ServerSocket { mutable Mutex mutex; /** - * A #timer object to synchronize this output with the + * A #Timer object to synchronize this output with the * wallclock. */ - struct timer *timer; + Timer *timer; /** * The header page, which is sent to every client on connect. diff --git a/src/output/HttpdOutputPlugin.cxx b/src/output/HttpdOutputPlugin.cxx index bb644c318..2c4884827 100644 --- a/src/output/HttpdOutputPlugin.cxx +++ b/src/output/HttpdOutputPlugin.cxx @@ -320,7 +320,7 @@ HttpdOutput::Open(struct audio_format *audio_format, GError **error_r) /* initialize other attributes */ clients_cnt = 0; - timer = timer_new(audio_format); + timer = new Timer(*audio_format); open = true; @@ -346,7 +346,7 @@ HttpdOutput::Close() open = false; - timer_free(timer); + delete timer; clients.clear(); @@ -398,7 +398,7 @@ httpd_output_delay(struct audio_output *ao) then httpd_output_pause() will not do anything, it will not fill the buffer and it will not update the timer; therefore, we reset the timer here */ - timer_reset(httpd->timer); + httpd->timer->Reset(); /* some arbitrary delay that is long enough to avoid consuming too much CPU, and short enough to notice @@ -406,8 +406,8 @@ httpd_output_delay(struct audio_output *ao) return 1000; } - return httpd->timer->started - ? timer_delay(httpd->timer) + return httpd->timer->IsStarted() + ? httpd->timer->GetDelay() : 0; } @@ -463,9 +463,9 @@ httpd_output_play(struct audio_output *ao, const void *chunk, size_t size, return 0; } - if (!httpd->timer->started) - timer_start(httpd->timer); - timer_add(httpd->timer, size); + if (!httpd->timer->IsStarted()) + httpd->timer->Start(); + httpd->timer->Add(size); return size; } diff --git a/src/output/NullOutputPlugin.cxx b/src/output/NullOutputPlugin.cxx index bbcf26c00..b167032b6 100644 --- a/src/output/NullOutputPlugin.cxx +++ b/src/output/NullOutputPlugin.cxx @@ -20,7 +20,7 @@ #include "config.h" #include "NullOutputPlugin.hxx" #include "output_api.h" -#include "timer.h" +#include "Timer.hxx" #include @@ -29,7 +29,7 @@ struct NullOutput { bool sync; - struct timer *timer; + Timer *timer; bool Initialize(const config_param *param, GError **error_r) { return ao_base_init(&base, &null_output_plugin, param, @@ -72,7 +72,7 @@ null_open(struct audio_output *ao, struct audio_format *audio_format, NullOutput *nd = (NullOutput *)ao; if (nd->sync) - nd->timer = timer_new(audio_format); + nd->timer = new Timer(*audio_format); return true; } @@ -83,7 +83,7 @@ null_close(struct audio_output *ao) NullOutput *nd = (NullOutput *)ao; if (nd->sync) - timer_free(nd->timer); + delete nd->timer; } static unsigned @@ -91,8 +91,8 @@ null_delay(struct audio_output *ao) { NullOutput *nd = (NullOutput *)ao; - return nd->sync && nd->timer->started - ? timer_delay(nd->timer) + return nd->sync && nd->timer->IsStarted() + ? nd->timer->GetDelay() : 0; } @@ -101,14 +101,14 @@ null_play(struct audio_output *ao, gcc_unused const void *chunk, size_t size, gcc_unused GError **error) { NullOutput *nd = (NullOutput *)ao; - struct timer *timer = nd->timer; + Timer *timer = nd->timer; if (!nd->sync) return size; - if (!timer->started) - timer_start(timer); - timer_add(timer, size); + if (!timer->IsStarted()) + timer->Start(); + timer->Add(size); return size; } @@ -121,7 +121,7 @@ null_cancel(struct audio_output *ao) if (!nd->sync) return; - timer_reset(nd->timer); + nd->timer->Reset(); } const struct audio_output_plugin null_output_plugin = {