diff --git a/src/laudio_alsa.c b/src/laudio_alsa.c index e401898b..51d07da8 100644 --- a/src/laudio_alsa.c +++ b/src/laudio_alsa.c @@ -362,7 +362,7 @@ laudio_start(uint64_t cur_pos, uint64_t next_pkt) pcm_start_pos = next_pkt + pcm_buf_threshold; /* Compensate threshold, as it's taken into account by snd_pcm_delay() */ - pcm_pos += pcm_buf_threshold; + //pcm_pos += pcm_buf_threshold; DPRINTF(E_DBG, L_LAUDIO, "PCM pos %" PRIu64 ", start pos %" PRIu64 "\n", pcm_pos, pcm_start_pos); diff --git a/src/player.c b/src/player.c index e1d58b7e..7c5603b5 100644 --- a/src/player.c +++ b/src/player.c @@ -2684,6 +2684,7 @@ static int playback_prev_bh(struct player_command *cmd) { int ret; + int pos_sec; if (!cur_streaming) { @@ -2697,12 +2698,34 @@ playback_prev_bh(struct player_command *cmd) source_stop(cur_streaming); - ret = source_prev(); - if (ret < 0) - { - playback_abort(); + /* Compute the playing time in seconds for the current song. */ + if (cur_streaming->end > cur_streaming->stream_start) + pos_sec = (cur_streaming->end - cur_streaming->stream_start) / 44100; + else + pos_sec = 0; - return -1; + /* Only skip to the previous song if the playing time is less than 3 seconds, + otherwise restart the current song. */ + DPRINTF(E_DBG, L_PLAYER, "Skipping song played %d sec\n", pos_sec); + if (pos_sec < 3) + { + ret = source_prev(); + if (ret < 0) + { + playback_abort(); + + return -1; + } + } + else + { + ret = source_open(cur_streaming, 1); + if (ret < 0) + { + playback_abort(); + + return -1; + } } if (player_state == PLAY_STOPPED) @@ -2719,6 +2742,7 @@ playback_prev_bh(struct player_command *cmd) return 0; } + static int playback_next_bh(struct player_command *cmd) {