Commit 693dc378 authored by J. Alexander Treuman's avatar J. Alexander Treuman

Move the timing code from the null plugin to timer.c, so it can be easily

used in other plugins (fifo, shout, etc.). git-svn-id: https://svn.musicpd.org/mpd/trunk@6397 09075e82-0dd4-0310-85a5-a0d7c8717e4f
parent 41d65da4
......@@ -77,7 +77,8 @@ mpd_headers = \
ioops.h \
zeroconf.h \
locate.h \
storedPlaylist.h
storedPlaylist.h \
timer.h
mpd_SOURCES = \
......@@ -129,7 +130,8 @@ mpd_SOURCES = \
utf8.c \
zeroconf.c \
locate.c \
storedPlaylist.c
storedPlaylist.c \
timer.c
mpd_CFLAGS = $(MPD_CFLAGS)
......
......@@ -17,110 +17,55 @@
*/
#include "../audioOutput.h"
#include <stdlib.h>
#include <limits.h>
#include <sys/time.h>
typedef struct _NullData {
uint64_t nextPlay;
int rate;
} NullData;
static NullData *newNullData(void)
{
NullData *ret;
ret = xmalloc(sizeof(NullData));
ret->nextPlay = 0;
ret->rate = 0;
return ret;
}
static void freeNullData(NullData *nd)
{
free(nd);
}
static uint64_t null_getTime(void)
{
struct timeval tv;
gettimeofday(&tv, NULL);
return ((uint64_t)tv.tv_sec * 1000000) + tv.tv_usec;
}
#include "../timer.h"
static int null_initDriver(AudioOutput *audioOutput, ConfigParam *param)
{
NullData *nd;
nd = newNullData();
audioOutput->data = nd;
audioOutput->data = NULL;
return 0;
}
static void null_finishDriver(AudioOutput *audioOutput)
{
freeNullData((NullData *)audioOutput->data);
}
static int null_openDevice(AudioOutput *audioOutput)
{
NullData *nd;
AudioFormat *af;
nd = audioOutput->data;
af = &audioOutput->outAudioFormat;
nd->rate = af->sampleRate * (af->bits / CHAR_BIT) * af->channels;
audioOutput->data = timer_new(&audioOutput->outAudioFormat);
audioOutput->open = 1;
return 0;
}
static void null_dropBufferedAudio(AudioOutput *audioOutput)
{
NullData *nd;
nd = audioOutput->data;
nd->nextPlay = 0;
}
static void null_closeDevice(AudioOutput *audioOutput)
{
NullData *nd;
if (audioOutput->data) {
timer_free(audioOutput->data);
audioOutput->data = NULL;
}
nd = audioOutput->data;
nd->nextPlay = 0;
nd->rate = 0;
audioOutput->open = 0;
}
static int null_playAudio(AudioOutput *audioOutput, char *playChunk, int size)
{
NullData *nd;
uint64_t now;
Timer *timer = audioOutput->data;
nd = audioOutput->data;
now = null_getTime();
if (!timer->started)
timer_start(timer);
else
timer_sync(timer);
if (nd->nextPlay == 0)
nd->nextPlay = now;
else if (nd->nextPlay > now)
my_usleep(nd->nextPlay - now);
nd->nextPlay += ((uint64_t)size * 1000000) / nd->rate;
timer_add(timer, size);
return 0;
}
static void null_dropBufferedAudio(AudioOutput *audioOutput)
{
timer_reset(audioOutput->data);
}
AudioOutputPlugin nullPlugin = {
"null",
NULL,
null_initDriver,
null_finishDriver,
NULL,
null_openDevice,
null_playAudio,
null_dropBufferedAudio,
......
/* the Music Player Daemon (MPD)
* Copyright (C) 2007 by Warren Dukes (warren.dukes@gmail.com)
* This project's homepage is: 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "timer.h"
#include "utils.h"
#include <assert.h>
#include <limits.h>
#include <sys/time.h>
static uint64_t now(void)
{
struct timeval tv;
gettimeofday(&tv, NULL);
return ((uint64_t)tv.tv_sec * 1000000) + tv.tv_usec;
}
Timer *timer_new(AudioFormat *af)
{
Timer *timer;
timer = xmalloc(sizeof(Timer));
timer->time = 0;
timer->started = 0;
timer->rate = af->sampleRate * (af->bits / CHAR_BIT) * af->channels;
return timer;
}
void timer_free(Timer *timer)
{
free(timer);
}
void timer_start(Timer *timer)
{
timer->time = now();
timer->started = 1;
}
void timer_reset(Timer *timer)
{
timer->time = 0;
timer->started = 0;
}
void timer_add(Timer *timer, int size)
{
assert(timer->started);
timer->time += ((uint64_t)size * 1000000) / timer->rate;
}
void timer_sync(Timer *timer)
{
int64_t sleep;
assert(timer->started);
sleep = timer->time - now();
if (sleep > 0)
my_usleep(sleep);
}
/* the Music Player Daemon (MPD)
* Copyright (C) 2007 by Warren Dukes (warren.dukes@gmail.com)
* This project's homepage is: 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef MPD_TIMER_H
#define MPD_TIMER_H
#include "audio.h"
#include "mpd_types.h"
typedef struct _Timer {
uint64_t time;
int started;
int rate;
} Timer;
Timer *timer_new(AudioFormat *af);
void timer_free(Timer *timer);
void timer_start(Timer *timer);
void timer_reset(Timer *timer);
void timer_add(Timer *timer, int size);
void timer_sync(Timer *timer);
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment