diff options
author | Max Kellermann <max@duempel.org> | 2012-08-09 22:19:39 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2012-08-15 23:09:22 +0200 |
commit | e96779de48be1f1b0080a8e1cfa89756c40e562d (patch) | |
tree | 58a329d5e1719733019cef09bbbc6f6c0ae8f579 /src/player_thread.c | |
parent | eb54337c40cbedc79177b48d2feaea9d12e95c0f (diff) | |
download | mpd-e96779de48be1f1b0080a8e1cfa89756c40e562d.tar.gz mpd-e96779de48be1f1b0080a8e1cfa89756c40e562d.tar.xz mpd-e96779de48be1f1b0080a8e1cfa89756c40e562d.zip |
player_control: duplicate the song object
Make sure the player "owns" the next_song object, so nobody else can
free it.
Diffstat (limited to 'src/player_thread.c')
-rw-r--r-- | src/player_thread.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/src/player_thread.c b/src/player_thread.c index 1f48df66b..d410984f6 100644 --- a/src/player_thread.c +++ b/src/player_thread.c @@ -239,12 +239,18 @@ player_wait_for_decoder(struct player *player) if (error != NULL) { player_lock(pc); pc_set_error(pc, PLAYER_ERROR_DECODER, error); + + song_free(pc->next_song); pc->next_song = NULL; + player_unlock(pc); return false; } + if (player->song != NULL) + song_free(player->song); + player->song = pc->next_song; player->elapsed_time = 0.0; @@ -486,6 +492,7 @@ static bool player_seek_decoder(struct player *player) player->pipe = dc->pipe; } + song_free(pc->next_song); pc->next_song = NULL; player->queued = false; } @@ -606,6 +613,7 @@ static void player_process_command(struct player *player) player_lock(pc); } + song_free(pc->next_song); pc->next_song = NULL; player->queued = false; player_command_finished_locked(pc); @@ -886,6 +894,8 @@ static void do_play(struct player_control *pc, struct decoder_control *dc) player_dc_start(&player, player.pipe); if (!player_wait_for_decoder(&player)) { + assert(player.song == NULL); + player_dc_stop(&player); player_command_finished(pc); music_pipe_free(player.pipe); @@ -1048,10 +1058,14 @@ static void do_play(struct player_control *pc, struct decoder_control *dc) if (player.cross_fade_tag != NULL) tag_free(player.cross_fade_tag); + if (player.song != NULL) + song_free(player.song); + player_lock(pc); if (player.queued) { assert(pc->next_song != NULL); + song_free(pc->next_song); pc->next_song = NULL; } @@ -1093,7 +1107,11 @@ player_task(gpointer arg) /* fall through */ case PLAYER_COMMAND_PAUSE: - pc->next_song = NULL; + if (pc->next_song != NULL) { + song_free(pc->next_song); + pc->next_song = NULL; + } + player_command_finished_locked(pc); break; @@ -1134,7 +1152,11 @@ player_task(gpointer arg) return NULL; case PLAYER_COMMAND_CANCEL: - pc->next_song = NULL; + if (pc->next_song != NULL) { + song_free(pc->next_song); + pc->next_song = NULL; + } + player_command_finished_locked(pc); break; |