command: new command "seekcur"

For simpler seeking within current song.
This commit is contained in:
Max Kellermann 2011-12-24 11:20:02 +01:00
parent 78c4351e04
commit 99949c8f6f
6 changed files with 75 additions and 0 deletions

1
NEWS
View File

@ -2,6 +2,7 @@ ver 0.17 (2011/??/??)
* protocol: * protocol:
- support client-to-client communication - support client-to-client communication
- "update" and "rescan" need only "CONTROL" permission - "update" and "rescan" need only "CONTROL" permission
- new command "seekcur" for simpler seeking within current song
* input: * input:
- cdio_paranoia: new input plugin to play audio CDs - cdio_paranoia: new input plugin to play audio CDs
- curl: enable CURLOPT_NETRC - curl: enable CURLOPT_NETRC

View File

@ -878,6 +878,23 @@
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry id="command_seekcur">
<term>
<cmdsynopsis>
<command>seekcur</command>
<arg choice="req"><replaceable>TIME</replaceable></arg>
</cmdsynopsis>
</term>
<listitem>
<para>
Seeks to the position <varname>TIME</varname> within the
current song. If prefixed by '+' or '-', then the time
is relative to the current playing position.
</para>
</listitem>
</varlistentry>
<varlistentry id="command_stop"> <varlistentry id="command_stop">
<term> <term>
<cmdsynopsis> <cmdsynopsis>

View File

@ -1531,6 +1531,21 @@ handle_seekid(struct client *client, G_GNUC_UNUSED int argc, char *argv[])
return print_playlist_result(client, result); 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 static enum command_return
handle_listallinfo(struct client *client, G_GNUC_UNUSED int argc, char *argv[]) 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 }, { "save", PERMISSION_CONTROL, 1, 1, handle_save },
{ "search", PERMISSION_READ, 2, -1, handle_search }, { "search", PERMISSION_READ, 2, -1, handle_search },
{ "seek", PERMISSION_CONTROL, 2, 2, handle_seek }, { "seek", PERMISSION_CONTROL, 2, 2, handle_seek },
{ "seekcur", PERMISSION_CONTROL, 1, 1, handle_seekcur },
{ "seekid", PERMISSION_CONTROL, 2, 2, handle_seekid }, { "seekid", PERMISSION_CONTROL, 2, 2, handle_seekid },
{ "sendmessage", PERMISSION_CONTROL, 2, 2, handle_send_message }, { "sendmessage", PERMISSION_CONTROL, 2, 2, handle_send_message },
{ "setvol", PERMISSION_CONTROL, 1, 1, handle_setvol }, { "setvol", PERMISSION_CONTROL, 1, 1, handle_setvol },

View File

@ -432,6 +432,11 @@ ffmpeg_decode(struct decoder *decoder, struct input_stream *input)
decoder_initialized(decoder, &audio_format, decoder_initialized(decoder, &audio_format,
input->seekable, total_time); 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; enum decoder_command cmd;
do { do {
AVPacket packet; AVPacket packet;

View File

@ -239,6 +239,18 @@ enum playlist_result
playlist_seek_song_id(struct playlist *playlist, struct player_control *pc, playlist_seek_song_id(struct playlist *playlist, struct player_control *pc,
unsigned id, float seek_time); 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 void
playlist_increment_version_all(struct playlist *playlist); playlist_increment_version_all(struct playlist *playlist);

View File

@ -262,3 +262,27 @@ playlist_seek_song_id(struct playlist *playlist, struct player_control *pc,
return playlist_seek_song(playlist, pc, song, seek_time); 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);
}