diff --git a/NEWS b/NEWS
index 4dea05c48..a59e4da28 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,7 @@ ver 0.17 (2011/??/??)
* protocol:
- support client-to-client communication
- "update" and "rescan" need only "CONTROL" permission
+ - new command "seekcur" for simpler seeking within current song
* input:
- cdio_paranoia: new input plugin to play audio CDs
- curl: enable CURLOPT_NETRC
diff --git a/doc/protocol.xml b/doc/protocol.xml
index d99a00b24..f665c583c 100644
--- a/doc/protocol.xml
+++ b/doc/protocol.xml
@@ -878,6 +878,23 @@
+
+
+
+
+ seekcur
+ TIME
+
+
+
+
+ Seeks to the position TIME within the
+ current song. If prefixed by '+' or '-', then the time
+ is relative to the current playing position.
+
+
+
+
diff --git a/src/command.c b/src/command.c
index eb2b9ae4f..e6bf36ac9 100644
--- a/src/command.c
+++ b/src/command.c
@@ -1531,6 +1531,21 @@ handle_seekid(struct client *client, G_GNUC_UNUSED int argc, char *argv[])
return print_playlist_result(client, result);
}
+static enum command_return
+handle_seekcur(struct client *client, G_GNUC_UNUSED int argc, char *argv[])
+{
+ const char *p = argv[1];
+ bool relative = *p == '+' || *p == '-';
+ int seek_time;
+ if (!check_int(client, &seek_time, p, check_integer, p))
+ return COMMAND_RETURN_ERROR;
+
+ enum playlist_result result =
+ playlist_seek_current(&g_playlist, client->player_control,
+ seek_time, relative);
+ return print_playlist_result(client, result);
+}
+
static enum command_return
handle_listallinfo(struct client *client, G_GNUC_UNUSED int argc, char *argv[])
{
@@ -2159,6 +2174,7 @@ static const struct command commands[] = {
{ "save", PERMISSION_CONTROL, 1, 1, handle_save },
{ "search", PERMISSION_READ, 2, -1, handle_search },
{ "seek", PERMISSION_CONTROL, 2, 2, handle_seek },
+ { "seekcur", PERMISSION_CONTROL, 1, 1, handle_seekcur },
{ "seekid", PERMISSION_CONTROL, 2, 2, handle_seekid },
{ "sendmessage", PERMISSION_CONTROL, 2, 2, handle_send_message },
{ "setvol", PERMISSION_CONTROL, 1, 1, handle_setvol },
diff --git a/src/decoder/ffmpeg_decoder_plugin.c b/src/decoder/ffmpeg_decoder_plugin.c
index 14727715b..5dc95ccf8 100644
--- a/src/decoder/ffmpeg_decoder_plugin.c
+++ b/src/decoder/ffmpeg_decoder_plugin.c
@@ -432,6 +432,11 @@ ffmpeg_decode(struct decoder *decoder, struct input_stream *input)
decoder_initialized(decoder, &audio_format,
input->seekable, total_time);
+ AVDictionaryEntry *entry =
+ av_dict_get(format_context->metadata, "replaygain_track_gain", NULL, 0);
+ if (entry != NULL)
+ g_printerr("replaygain_track_gain=%s\n", entry->value);
+
enum decoder_command cmd;
do {
AVPacket packet;
diff --git a/src/playlist.h b/src/playlist.h
index 4c5f29e5d..caed0a220 100644
--- a/src/playlist.h
+++ b/src/playlist.h
@@ -239,6 +239,18 @@ enum playlist_result
playlist_seek_song_id(struct playlist *playlist, struct player_control *pc,
unsigned id, float seek_time);
+/**
+ * Seek within the current song. Fails if MPD is not currently
+ * playing.
+ *
+ * @param time the time in seconds
+ * @param relative if true, then the specified time is relative to the
+ * current position
+ */
+enum playlist_result
+playlist_seek_current(struct playlist *playlist, struct player_control *pc,
+ float seek_time, bool relative);
+
void
playlist_increment_version_all(struct playlist *playlist);
diff --git a/src/playlist_control.c b/src/playlist_control.c
index 998294845..0dea7676a 100644
--- a/src/playlist_control.c
+++ b/src/playlist_control.c
@@ -262,3 +262,27 @@ playlist_seek_song_id(struct playlist *playlist, struct player_control *pc,
return playlist_seek_song(playlist, pc, song, seek_time);
}
+
+enum playlist_result
+playlist_seek_current(struct playlist *playlist, struct player_control *pc,
+ float seek_time, bool relative)
+{
+ if (!playlist->playing)
+ return PLAYLIST_RESULT_NOT_PLAYING;
+
+ if (relative) {
+ struct player_status status;
+ pc_get_status(pc, &status);
+
+ if (status.state != PLAYER_STATE_PLAY &&
+ status.state != PLAYER_STATE_PAUSE)
+ return PLAYLIST_RESULT_NOT_PLAYING;
+
+ seek_time += (int)status.elapsed_time;
+ }
+
+ if (seek_time < 0)
+ seek_time = 0;
+
+ return playlist_seek_song(playlist, pc, playlist->current, seek_time);
+}