aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--configure.ac2
-rw-r--r--src/Makefile.am1
-rw-r--r--src/audio.c1
-rw-r--r--src/audioOutput.h1
-rw-r--r--src/audioOutputs/audioOutput_null.c129
-rw-r--r--src/mpd_types.h10
6 files changed, 144 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac
index 5863bf2b1..f5db4f011 100644
--- a/configure.ac
+++ b/configure.ac
@@ -115,6 +115,8 @@ AC_CHECK_SIZEOF(long long)
AC_CHECK_HEADER(sys/inttypes.h,AC_DEFINE(HAVE_SYS_INTTYPES_H,1,[Define if sys/inttypes.h present]),)
+AC_TYPE_UINT64_T
+
AC_CHECK_LIB(socket,socket,MPD_LIBS="$MPD_LIBS -lsocket",)
AC_CHECK_LIB(nsl,gethostbyname,MPD_LIBS="$MPD_LIBS -lnsl",)
diff --git a/src/Makefile.am b/src/Makefile.am
index b9c6fa0c7..bd1e6877c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -2,6 +2,7 @@ bin_PROGRAMS = mpd
SUBDIRS = $(MP4FF_SUBDIR)
mpd_audioOutputs = \
+ audioOutputs/audioOutput_null.c \
audioOutputs/audioOutput_alsa.c \
audioOutputs/audioOutput_ao.c \
audioOutputs/audioOutput_oss.c \
diff --git a/src/audio.c b/src/audio.c
index 912e46ffa..027192793 100644
--- a/src/audio.c
+++ b/src/audio.c
@@ -92,6 +92,7 @@ int cmpAudioFormat(AudioFormat * f1, AudioFormat * f2)
void loadAudioDrivers(void)
{
initAudioOutputPlugins();
+ loadAudioOutputPlugin(&nullPlugin);
loadAudioOutputPlugin(&alsaPlugin);
loadAudioOutputPlugin(&aoPlugin);
loadAudioOutputPlugin(&ossPlugin);
diff --git a/src/audioOutput.h b/src/audioOutput.h
index bcbe7997d..21a9a57ba 100644
--- a/src/audioOutput.h
+++ b/src/audioOutput.h
@@ -105,6 +105,7 @@ void sendMetadataToAudioOutput(AudioOutput * audioOutput, MpdTag * tag);
void printAllOutputPluginTypes(FILE * fp);
+extern AudioOutputPlugin nullPlugin;
extern AudioOutputPlugin alsaPlugin;
extern AudioOutputPlugin aoPlugin;
extern AudioOutputPlugin ossPlugin;
diff --git a/src/audioOutputs/audioOutput_null.c b/src/audioOutputs/audioOutput_null.c
new file mode 100644
index 000000000..df58c7139
--- /dev/null
+++ b/src/audioOutputs/audioOutput_null.c
@@ -0,0 +1,129 @@
+/* the Music Player Daemon (MPD)
+ * Copyright (C) 2003-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 "../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;
+}
+
+static int null_initDriver(AudioOutput *audioOutput, ConfigParam *param)
+{
+ NullData *nd;
+
+ nd = newNullData();
+ audioOutput->data = nd;
+
+ 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->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;
+
+ 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;
+
+ nd = audioOutput->data;
+ now = null_getTime();
+
+ 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;
+
+ return 0;
+}
+
+AudioOutputPlugin nullPlugin = {
+ "null",
+ NULL,
+ null_initDriver,
+ null_finishDriver,
+ null_openDevice,
+ null_playAudio,
+ null_dropBufferedAudio,
+ null_closeDevice,
+ NULL,
+};
diff --git a/src/mpd_types.h b/src/mpd_types.h
index dbdfc6865..1b5e40b69 100644
--- a/src/mpd_types.h
+++ b/src/mpd_types.h
@@ -21,6 +21,16 @@
#include "../config.h"
+#if defined(HAVE_STDINT_H)
+#include <stdint.h>
+#elif defined(HAVE_INTTYPES_H)
+#include <inttypes.h>
+#elif defined(HAVE_SYS_INTTYPES_H)
+#include <sys/inttypes.h>
+#elif defined(HAVE_SYS_TYPES_H)
+#include <sys/types.h>
+#endif
+
typedef unsigned char mpd_uint8;
typedef signed char mpd_sint8;