command: new command "seekcur"
For simpler seeking within current song.
This commit is contained in:
parent
78c4351e04
commit
99949c8f6f
1
NEWS
1
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
|
||||
|
|
|
@ -878,6 +878,23 @@
|
|||
</para>
|
||||
</listitem>
|
||||
</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">
|
||||
<term>
|
||||
<cmdsynopsis>
|
||||
|
|
|
@ -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 },
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue