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 -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 @@ database: the song database - has been modified + has been modified after update. 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! + + + 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. + + + + 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! + + + + MPD supports also Gapless playback, buffered audio output, and + crossfading! + + + + 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! + @@ -26,10 +50,16 @@ Installing on Debian/Ubuntu - Install the package mpd: + Install the package mpd via APT: apt-get install mpd + + + 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... +
@@ -41,8 +71,8 @@ page and unpack it: - tar xjf mpd-0.14.2.tar.bz -cd mpd-0.14.2 + tar xjf mpd-version.tar.bz +cd mpd-version Make sure that all the required libraries and build tools are @@ -737,6 +767,28 @@ cd mpd-0.14.2 The pipe plugin starts a program and writes raw PCM data into its standard input. + + + + + + Setting + Description + + + + + + command + CMD + + + This command is invoked with the shell. + + + + +
@@ -746,6 +798,40 @@ cd mpd-0.14.2 The pulse plugin connects to a PulseAudio server. + + + + + + Setting + Description + + + + + + server + HOSTNAME + + + Sets the host name of the PulseAudio server. By + default, MPD connects to the local PulseAudio + server. + + + + + sink + NAME + + + Specifies the name of the PulseAudio sink MPD should + play on. + + + + +
@@ -755,6 +841,129 @@ cd mpd-0.14.2 The shout plugin connects to a ShoutCast or IceCast server. It forwards tags to this server. + + + You must set a format. + + + + + + + Setting + Description + + + + + + host + HOSTNAME + + + Sets the host name of the Shoutcast/Icecast server. + + + + + port + PORTNUMBER + + + Connect to this port number on the specified host. + + + + + timeout + SECONDS + + + Set the timeout for the shout connection in seconds. + Defaults to 2 seconds. + + + + + mount + URI + + + Mounts the MPD stream in the specified URI. + + + + + user + USERNAME + + + Sets the user name for submitting the stream to the + server. Default is "source". + + + + + password + PWD + + + Sets the password for submitting the stream to the + server. + + + + + name + NAME + + + Sets the name of the stream. + + + + + genre + GENRE + + + Sets the genre of the stream (optional). + + + + + description + DESCRIPTION + + + Sets a short description of the stream (optional). + + + + + public + yes|no + + + Specifies whether the stream should be "public". + Default is "no". + + + + + encoder + PLUGIN + + + 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). + + + + +
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 +#include #include #include #include #include -#ifdef HAVE_OSX -#include -#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;