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:
|
* 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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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 },
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue