aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS11
-rw-r--r--configure.ac12
-rw-r--r--doc/mpd.conf.54
-rw-r--r--doc/protocol.xml2
-rw-r--r--doc/user.xml215
-rw-r--r--src/database.c9
-rw-r--r--src/decoder/flac_plugin.c3
-rw-r--r--src/log.c8
-rw-r--r--src/output/httpd_output_plugin.c5
-rw-r--r--src/output_all.c2
-rw-r--r--src/output_thread.c6
11 files changed, 245 insertions, 32 deletions
diff --git a/NEWS b/NEWS
index a1fa4eef5..dd6b15395 100644
--- a/NEWS
+++ b/NEWS
@@ -23,6 +23,17 @@ ver 0.16 (20??/??/??)
* renamed option "--stdout" to "--stderr"
+ver 0.15.1 (2009/07/15)
+* decoders:
+ - flac: fix assertion failure in tag_free() call
+* output:
+ - httpd: include sys/types.h (fixes Mac OS X)
+* commands:
+ - don't resume playback when stopping during pause
+* database: fixed NULL pointer dereference after charset change
+* log: fix double free() bug during shutdown
+
+
ver 0.15 (2009/06/23)
* input:
- parse Icy-Metadata
diff --git a/configure.ac b/configure.ac
index c3a780dc2..e828f4201 100644
--- a/configure.ac
+++ b/configure.ac
@@ -402,9 +402,9 @@ if test x$enable_audiofile = xyes; then
fi
AC_ARG_ENABLE(ffmpeg,
- AS_HELP_STRING([--disable-ffmpeg],
- [enable FFMPEG support (default: enable)]),,
- enable_ffmpeg=yes)
+ AS_HELP_STRING([--enable-ffmpeg],
+ [enable FFMPEG support]),,
+ enable_ffmpeg=auto)
AC_ARG_ENABLE(flac,
AS_HELP_STRING([--disable-flac],
@@ -932,10 +932,8 @@ AM_CONDITIONAL(HAVE_FLAC_COMMON,
AM_CONDITIONAL(HAVE_OGG_COMMON,
test x$enable_vorbis = xyes || test x$enable_oggflac = xyes || test x$enable_flac = xyes)
-if test x$enable_ffmpeg = xyes; then
- PKG_CHECK_MODULES(FFMPEG, [libavformat libavcodec libavutil],,
- enable_ffmpeg=no)
-fi
+MPD_AUTO_PKG(ffmpeg, FFMPEG, [libavformat libavcodec libavutil],
+ [ffmpeg decoder library], [libavformat+libavcodec+libavutil not found])
if test x$enable_ffmpeg = xyes; then
old_LIBS=$LIBS
diff --git a/doc/mpd.conf.5 b/doc/mpd.conf.5
index c8e632478..61ee87955 100644
--- a/doc/mpd.conf.5
+++ b/doc/mpd.conf.5
@@ -35,8 +35,8 @@ You must recreate the database after changing this option.
The default is "yes".
.TP
.B follow_inside_symlinks <yes or no>
-Control if MPD will follow symbolic links pointing outside the music dir, potentially
-adding duplicates to the database.
+Control if MPD will follow symbolic links pointing inside the music dir,
+potentially adding duplicates to the database.
You must recreate the database after changing this option.
The default is "yes".
.TP
diff --git a/doc/protocol.xml b/doc/protocol.xml
index 35ea39d8e..7c93df50f 100644
--- a/doc/protocol.xml
+++ b/doc/protocol.xml
@@ -134,7 +134,7 @@
<listitem>
<para>
<returnvalue>database</returnvalue>: the song database
- has been modified
+ has been modified after <command>update</command>.
</para>
</listitem>
<listitem>
diff --git a/doc/user.xml b/doc/user.xml
index 22da500b1..6e039ebde 100644
--- a/doc/user.xml
+++ b/doc/user.xml
@@ -11,6 +11,30 @@
This document is work in progress. Most of it may be incomplete
yet. Please help!
</para>
+
+ <para>
+ MPD (Music Player Daemon) is, as the name suggests, a server
+ software allowing you to remotely play your music, handle
+ playlists, deliver music (HTTP STREAMS with various
+ sub-protocols) and organizze playlists.
+ </para>
+
+ <para>
+ It has been written with minimal resource usage and stability in
+ mind! Infact, it runs fine on a Pentium 75, allowing you to use
+ your cheap old PC to create a stereo system!
+ </para>
+
+ <para>
+ MPD supports also Gapless playback, buffered audio output, and
+ crossfading!
+ </para>
+
+ <para>
+ The separate client and server design allows users to choose a
+ user interface that best suites their tastes independently of
+ the underlying daemon, which actually plays music!
+ </para>
</chapter>
<chapter>
@@ -26,10 +50,16 @@
<title>Installing on Debian/Ubuntu</title>
<para>
- Install the package <filename>mpd</filename>:
+ Install the package <filename>mpd</filename> via APT:
</para>
<programlisting>apt-get install mpd</programlisting>
+
+ <para>
+ When installed this way, MPD by default looks for music in
+ /var/lib/mpd/music/; this may not be correct. Look at your
+ /etc/mpd.conf file...
+ </para>
</section>
<section>
@@ -41,8 +71,8 @@
page</ulink> and unpack it:
</para>
- <programlisting>tar xjf mpd-0.14.2.tar.bz
-cd mpd-0.14.2</programlisting>
+ <programlisting>tar xjf mpd-version.tar.bz
+cd mpd-version</programlisting>
<para>
Make sure that all the required libraries and build tools are
@@ -737,6 +767,28 @@ cd mpd-0.14.2</programlisting>
The <varname>pipe</varname> plugin starts a program and
writes raw PCM data into its standard input.
</para>
+
+ <informaltable>
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Setting</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ <varname>command</varname>
+ <parameter>CMD</parameter>
+ </entry>
+ <entry>
+ This command is invoked with the shell.
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
</section>
<section>
@@ -746,6 +798,40 @@ cd mpd-0.14.2</programlisting>
The <varname>pulse</varname> plugin connects to a PulseAudio
server.
</para>
+
+ <informaltable>
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Setting</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ <varname>server</varname>
+ <parameter>HOSTNAME</parameter>
+ </entry>
+ <entry>
+ Sets the host name of the PulseAudio server. By
+ default, MPD connects to the local PulseAudio
+ server.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <varname>sink</varname>
+ <parameter>NAME</parameter>
+ </entry>
+ <entry>
+ Specifies the name of the PulseAudio sink MPD should
+ play on.
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
</section>
<section>
@@ -755,6 +841,129 @@ cd mpd-0.14.2</programlisting>
The <varname>shout</varname> plugin connects to a ShoutCast
or IceCast server. It forwards tags to this server.
</para>
+
+ <para>
+ You must set a <varname>format</varname>.
+ </para>
+
+ <informaltable>
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Setting</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ <varname>host</varname>
+ <parameter>HOSTNAME</parameter>
+ </entry>
+ <entry>
+ Sets the host name of the Shoutcast/Icecast server.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <varname>port</varname>
+ <parameter>PORTNUMBER</parameter>
+ </entry>
+ <entry>
+ Connect to this port number on the specified host.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <varname>timeout</varname>
+ <parameter>SECONDS</parameter>
+ </entry>
+ <entry>
+ Set the timeout for the shout connection in seconds.
+ Defaults to 2 seconds.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <varname>mount</varname>
+ <parameter>URI</parameter>
+ </entry>
+ <entry>
+ Mounts the MPD stream in the specified URI.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <varname>user</varname>
+ <parameter>USERNAME</parameter>
+ </entry>
+ <entry>
+ Sets the user name for submitting the stream to the
+ server. Default is "source".
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <varname>password</varname>
+ <parameter>PWD</parameter>
+ </entry>
+ <entry>
+ Sets the password for submitting the stream to the
+ server.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <varname>name</varname>
+ <parameter>NAME</parameter>
+ </entry>
+ <entry>
+ Sets the name of the stream.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <varname>genre</varname>
+ <parameter>GENRE</parameter>
+ </entry>
+ <entry>
+ Sets the genre of the stream (optional).
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <varname>description</varname>
+ <parameter>DESCRIPTION</parameter>
+ </entry>
+ <entry>
+ Sets a short description of the stream (optional).
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <varname>public</varname>
+ <parameter>yes|no</parameter>
+ </entry>
+ <entry>
+ Specifies whether the stream should be "public".
+ Default is "no".
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <varname>encoder</varname>
+ <parameter>PLUGIN</parameter>
+ </entry>
+ <entry>
+ Sets the name of the encoder plugin. Default is
+ "vorbis". "vorbis" and "lame" are valid encoder
+ plugins (provided that you enabled them at compile
+ time).
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
</section>
<section>
diff --git a/src/database.c b/src/database.c
index 7257930bc..5a06dda98 100644
--- a/src/database.c
+++ b/src/database.c
@@ -318,10 +318,11 @@ db_load(GError **error)
if (old_charset != NULL
&& strcmp(new_charset, old_charset)) {
fclose(fp);
- g_message("Existing database has charset \"%s\" "
- "instead of \"%s\"; "
- "discarding database file",
- new_charset, old_charset);
+ g_set_error(error, db_quark(), 0,
+ "Existing database has charset "
+ "\"%s\" instead of \"%s\"; "
+ "discarding database file",
+ new_charset, old_charset);
return false;
}
} else {
diff --git a/src/decoder/flac_plugin.c b/src/decoder/flac_plugin.c
index b235469f2..89a812f52 100644
--- a/src/decoder/flac_plugin.c
+++ b/src/decoder/flac_plugin.c
@@ -408,6 +408,7 @@ flac_decode_internal(struct decoder * decoder,
if (!(flac_dec = flac_new()))
return;
flac_data_init(&data, decoder, input_stream);
+ data.tag = tag_new();
#if defined(FLAC_API_VERSION_CURRENT) && FLAC_API_VERSION_CURRENT > 7
if(!FLAC__stream_decoder_set_metadata_respond(flac_dec, FLAC__METADATA_TYPE_VORBIS_COMMENT))
@@ -436,8 +437,6 @@ flac_decode_internal(struct decoder * decoder,
}
}
- data.tag = tag_new();
-
if (!flac_process_metadata(flac_dec)) {
err = "problem reading metadata";
goto fail;
diff --git a/src/log.c b/src/log.c
index b7c6b9bb0..94691ab64 100644
--- a/src/log.c
+++ b/src/log.c
@@ -259,12 +259,8 @@ void log_init(bool verbose, bool use_stdout)
log_init_syslog();
#endif
} else {
- char *path = parsePath(param->value);
- g_free(param->value);
-
- if (path == NULL)
- g_error("error parsing \"%s\" at line %i\n",
- CONF_LOG_FILE, param->line);
+ const char *path = config_get_path(CONF_LOG_FILE);
+ assert(path != NULL);
log_init_file(path, param->line);
}
diff --git a/src/output/httpd_output_plugin.c b/src/output/httpd_output_plugin.c
index 02fa1cf17..9fdf46456 100644
--- a/src/output/httpd_output_plugin.c
+++ b/src/output/httpd_output_plugin.c
@@ -28,15 +28,12 @@
#include <assert.h>
+#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <errno.h>
-#ifdef HAVE_OSX
-#include <sys/types.h>
-#endif
-
#undef G_LOG_DOMAIN
#define G_LOG_DOMAIN "httpd_output"
diff --git a/src/output_all.c b/src/output_all.c
index c6fb0f481..4b5ba3a6f 100644
--- a/src/output_all.c
+++ b/src/output_all.c
@@ -439,8 +439,6 @@ audio_output_all_cancel(void)
{
unsigned int i;
- audio_output_all_update();
-
/* send the cancel() command to all audio outputs */
for (i = 0; i < num_audio_outputs; ++i) {
diff --git a/src/output_thread.c b/src/output_thread.c
index 4b60d9d60..2592b2456 100644
--- a/src/output_thread.c
+++ b/src/output_thread.c
@@ -338,7 +338,11 @@ static gpointer audio_output_task(gpointer arg)
case AO_COMMAND_PAUSE:
ao_pause(ao);
- break;
+ /* don't "break" here: this might cause
+ ao_play() to be called when command==CLOSE
+ ends the paused state - "continue" checks
+ the new command first */
+ continue;
case AO_COMMAND_CANCEL:
ao->chunk = NULL;