From 4832368e5c3d3c5f0e692b6367c2f147daa6e37e Mon Sep 17 00:00:00 2001 From: Nicolas Pennequin Date: Thu, 4 Oct 2007 00:01:18 +0200 Subject: [PATCH] Add close_track_handles and reenable audio_clear_track_entries properly --- apps/playback.c | 55 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/apps/playback.c b/apps/playback.c index c378386b7..94814a49e 100644 --- a/apps/playback.c +++ b/apps/playback.c @@ -394,6 +394,27 @@ unsigned char *getptr(int handle_id) return ptr; } +void close_track_handles(struct track_info *track) +{ + if (!track) + return; + + if (track->audio_hid > 0) { + bufclose(track->audio_hid); + track->audio_hid = 0; + } + + if (track->id3_hid > 0) { + bufclose(track->id3_hid); + track->id3_hid = 0; + } + + if (track->codec_hid > 0) { + bufclose(track->codec_hid); + track->codec_hid = 0; + } +} + /* --- External interfaces --- */ void mp3_play_data(const unsigned char* start, int size, @@ -2342,11 +2363,10 @@ static bool audio_yield_codecs(void) static void audio_clear_track_entries(bool clear_unbuffered) { int cur_idx = track_widx; - //int last_idx = -1; + int last_idx = -1; logf("Clearing tracks:%d/%d, %d", track_ridx, track_widx, clear_unbuffered); -#if 0 /* Loop over all tracks from write-to-read */ while (1) { @@ -2365,14 +2385,18 @@ static void audio_clear_track_entries(bool clear_unbuffered) /* If there is an unbuffer callback, call it, otherwise, * just clear the track */ if (track_unbuffer_callback) - track_unbuffer_callback(&tracks[last_idx].id3, false); + track_unbuffer_callback(bufgetid3(tracks[last_idx].id3_hid), false); + close_track_handles(&tracks[last_idx]); memset(&tracks[last_idx], 0, sizeof(struct track_info)); } last_idx = cur_idx; } else if (clear_unbuffered) + { + close_track_handles(&tracks[cur_idx]); memset(&tracks[cur_idx], 0, sizeof(struct track_info)); + } } /* We clear the previous instance of a buffered track throughout @@ -2381,18 +2405,9 @@ static void audio_clear_track_entries(bool clear_unbuffered) if (last_idx >= 0) { if (track_unbuffer_callback) - track_unbuffer_callback(&tracks[last_idx].id3, true); + track_unbuffer_callback(bufgetid3(tracks[last_idx].id3_hid), true); memset(&tracks[last_idx], 0, sizeof(struct track_info)); } -#endif - - for (cur_idx = track_widx; cur_idx != track_ridx; - cur_idx++, cur_idx &= MAX_TRACK_MASK) - { - bufclose(tracks[cur_idx].audio_hid); - bufclose(tracks[cur_idx].id3_hid); - bufclose(tracks[cur_idx].codec_hid); - } } /* FIXME: This code should be made more generic and move to metadata.c */ @@ -3128,19 +3143,7 @@ static int audio_check_new_track(void) for (i = 0; i < ci.new_track; i++) { idx = (track_ridx + i) & MAX_TRACK_MASK; - - if (tracks[idx].id3_hid) { - bufclose(tracks[idx].id3_hid); - tracks[idx].id3_hid = 0; - } - if (tracks[idx].audio_hid) { - bufclose(tracks[idx].audio_hid); - tracks[idx].audio_hid = 0; - } - if (tracks[idx].codec_hid) { - bufclose(tracks[idx].codec_hid); - tracks[idx].codec_hid = 0; - } + close_track_handles(&tracks[idx]); } /* Move to the new track */ -- 2.11.4.GIT