summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <waker@users.sourceforge.net>2014-07-23 20:17:45 +0200
committerGravatar Alexey Yakovenko <waker@users.sourceforge.net>2014-07-23 20:17:45 +0200
commit7c4f6865f61e3da3cad3acf9c28b7d586db7af84 (patch)
treed9cd1f177e3e5350f752b7f986ff66e5f0bda6c3
parent19d65a54cb7bd292d4181e65578c36f2257592f6 (diff)
fixed few streamer responsiveness issues; fixed invalid track skipping code
-rw-r--r--main.c4
-rw-r--r--streamer.c58
-rw-r--r--streamer.h8
3 files changed, 41 insertions, 29 deletions
diff --git a/main.c b/main.c
index 5500b728..5546e5a3 100644
--- a/main.c
+++ b/main.c
@@ -584,7 +584,7 @@ player_mainloop (void) {
streamer_move_to_nextsong (1);
break;
case DB_EV_PREV:
- streamer_move_to_prevsong ();
+ streamer_move_to_prevsong (1);
break;
case DB_EV_PAUSE:
if (output->state () != OUTPUT_STATE_PAUSED) {
@@ -602,7 +602,7 @@ player_mainloop (void) {
}
break;
case DB_EV_PLAY_RANDOM:
- streamer_move_to_randomsong ();
+ streamer_move_to_randomsong (1);
break;
case DB_EV_PLAYLIST_REFRESH:
pl_save_current ();
diff --git a/streamer.c b/streamer.c
index d3e2579f..bb819b78 100644
--- a/streamer.c
+++ b/streamer.c
@@ -189,13 +189,13 @@ static void
streamer_set_nextsong_real (int song, int pstate);
static int
-streamer_move_to_nextsong_real (int reason);
+streamer_move_to_nextsong_real (int r);
static int
-streamer_move_to_prevsong_real (void);
+streamer_move_to_prevsong_real (int r);
static int
-streamer_move_to_randomsong_real (void);
+streamer_move_to_randomsong_real (int r);
static void
streamer_play_current_track_real (void);
@@ -646,7 +646,7 @@ streamer_move_to_nextsong_real (int reason) {
}
else if (pl_order == PLAYBACK_ORDER_RANDOM) { // random
pl_unlock ();
- int res = streamer_move_to_randomsong ();
+ int res = streamer_move_to_randomsong (1);
if (res == -1) {
trace ("streamer_move_to_randomsong error\n");
streamer_set_nextsong_real (-2, 1);
@@ -659,8 +659,10 @@ streamer_move_to_nextsong_real (int reason) {
}
static int
-streamer_move_to_prevsong_real (void) {
- plug_get_output ()->stop ();
+streamer_move_to_prevsong_real (int r) {
+ if (r) {
+ plug_get_output ()->stop ();
+ }
pl_lock ();
if (streamer_playlist) {
plt_unref (streamer_playlist);
@@ -760,7 +762,7 @@ streamer_move_to_prevsong_real (void) {
}
else if (pl_order == PLAYBACK_ORDER_RANDOM) { // random
pl_unlock ();
- int res = streamer_move_to_randomsong ();
+ int res = streamer_move_to_randomsong (1);
if (res == -1) {
streamer_set_nextsong_real (-2, 1);
trace ("streamer_move_to_randomsong error\n");
@@ -773,8 +775,10 @@ streamer_move_to_prevsong_real (void) {
}
static int
-streamer_move_to_randomsong_real (void) {
- plug_get_output ()->stop ();
+streamer_move_to_randomsong_real (int reason) {
+ if (reason) {
+ plug_get_output ()->stop ();
+ }
if (!streamer_playlist) {
streamer_playlist = plt_get_curr ();
}
@@ -798,18 +802,27 @@ streamer_move_to_randomsong_real (void) {
}
int
-streamer_move_to_nextsong (int reason) {
- handler_push (handler, STR_EV_NEXT, 0, reason, 0);
+streamer_move_to_nextsong (int r) {
+ if (r) {
+ streamer_abort_files ();
+ }
+ handler_push (handler, STR_EV_NEXT, 0, r, 0);
}
int
-streamer_move_to_prevsong (void) {
- handler_push (handler, STR_EV_PREV, 0, 0, 0);
+streamer_move_to_prevsong (int r) {
+ if (r) {
+ streamer_abort_files ();
+ }
+ handler_push (handler, STR_EV_PREV, 0, r, 0);
}
int
-streamer_move_to_randomsong (void) {
- handler_push (handler, STR_EV_RAND, 0, 0, 0);
+streamer_move_to_randomsong (int r) {
+ if (r) {
+ streamer_abort_files ();
+ }
+ handler_push (handler, STR_EV_RAND, 0, r, 0);
}
// playlist must call that whenever item was removed
@@ -961,6 +974,7 @@ streamer_set_current (playItem_t *it) {
pl_item_ref (to);
}
trace ("\033[0;35mstreamer_set_current from %p to %p\033[37;0m\n", from, it);
+ trace ("\033[0;35moutput state: %d\033[37;0m\n", output->state ());
if (!playing_track || output->state () == OUTPUT_STATE_STOPPED) {
streamer_buffering = 1;
trace ("\033[0;35mstreamer_start_playback[1] from %p to %p\033[37;0m\n", from, it);
@@ -968,9 +982,6 @@ streamer_set_current (playItem_t *it) {
streamer_start_playback (from, it);
bytes_until_next_song = -1;
}
-// else if (output->state () == OUTPUT_STATE_PLAYING) {
-// assert (0);
-// }
trace ("streamer_set_current %p, buns=%d\n", it, bytes_until_next_song);
mutex_lock (decodemutex);
@@ -1450,8 +1461,8 @@ streamer_start_new_song (void) {
trace ("\033[0;34mbadsong=%d\033[37;0m\n", badsong);
// try jump to next song
if (nextsong == -1) {
- streamer_move_to_nextsong (0);
- trace ("streamer_move_to_nextsong switched to track %d\n", nextsong);
+ trace ("streamer_move_to_nextsong after skip\n");
+ streamer_move_to_nextsong (1);
usleep (50000);
}
else {
@@ -1526,6 +1537,7 @@ streamer_next (int bytesread) {
}
}
else {
+ trace ("streamer_move_to_nextsong (0) called from streamer_next\n");
streamer_move_to_nextsong (0);
}
}
@@ -1558,10 +1570,10 @@ streamer_thread (void *ctx) {
streamer_move_to_nextsong_real (p1);
break;
case STR_EV_PREV:
- streamer_move_to_prevsong_real ();
+ streamer_move_to_prevsong_real (p1);
break;
case STR_EV_RAND:
- streamer_move_to_randomsong_real ();
+ streamer_move_to_randomsong_real (p1);
break;
case STR_EV_SEEK:
seekpos = *((float *)&p1);
@@ -1725,8 +1737,8 @@ streamer_thread (void *ctx) {
send_trackinfochanged (streaming_track);
}
trace ("failed to restart prev track on seek, trying to jump to next track\n");
+ trace ("streamer_move_to_nextsong from seek\n");
streamer_move_to_nextsong (0);
- trace ("streamer_move_to_nextsong switched to track %d\n", nextsong);
usleep (50000);
continue;
}
diff --git a/streamer.h b/streamer.h
index 7c3f00bb..65264464 100644
--- a/streamer.h
+++ b/streamer.h
@@ -104,15 +104,15 @@ int
streamer_get_apx_bitrate (void);
// returns -1 if theres no next song, or playlist finished
-// reason 0 means "song finished", 1 means "user clicked next"
+// reason 0 means "prev song finished", 1 means "interrupt"
int
-streamer_move_to_nextsong (int reason);
+streamer_move_to_nextsong (int r);
int
-streamer_move_to_prevsong (void);
+streamer_move_to_prevsong (int r);
int
-streamer_move_to_randomsong (void);
+streamer_move_to_randomsong (int r);
struct DB_fileinfo_s *
streamer_get_current_fileinfo (void);