diff options
-rw-r--r-- | NEWS | 11 | ||||
-rw-r--r-- | configure.ac | 12 | ||||
-rw-r--r-- | doc/mpd.conf.5 | 4 | ||||
-rw-r--r-- | doc/protocol.xml | 2 | ||||
-rw-r--r-- | doc/user.xml | 215 | ||||
-rw-r--r-- | src/database.c | 9 | ||||
-rw-r--r-- | src/decoder/flac_plugin.c | 3 | ||||
-rw-r--r-- | src/log.c | 8 | ||||
-rw-r--r-- | src/output/httpd_output_plugin.c | 5 | ||||
-rw-r--r-- | src/output_all.c | 2 | ||||
-rw-r--r-- | src/output_thread.c | 6 |
11 files changed, 245 insertions, 32 deletions
@@ -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; @@ -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; |