diff options
author | Steve Bavin <pondlife@pondlife.me> | 2006-10-13 09:16:36 +0000 |
---|---|---|
committer | Steve Bavin <pondlife@pondlife.me> | 2006-10-13 09:16:36 +0000 |
commit | 3a8ad7fe7ea1f6b1ee72824b8c903c5e4f09e4f1 (patch) | |
tree | 24c93922f458688156bd2fa223c75d4f0f9f1f05 /apps/playback.c | |
parent | 6e46bc2c1942f1f65620a8382c9f958335e539a6 (diff) | |
download | rockbox-3a8ad7fe7ea1f6b1ee72824b8c903c5e4f09e4f1.tar.gz rockbox-3a8ad7fe7ea1f6b1ee72824b8c903c5e4f09e4f1.zip |
Minor simplification #3; use macros for ring buffer arithmetic. Also fixed unlikely problem where file close was missed on an error path.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11212 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/playback.c')
-rw-r--r-- | apps/playback.c | 76 |
1 files changed, 24 insertions, 52 deletions
diff --git a/apps/playback.c b/apps/playback.c index 5b811751db..e0358cfbac 100644 --- a/apps/playback.c +++ b/apps/playback.c | |||
@@ -197,7 +197,7 @@ static volatile size_t buf_ridx IDATA_ATTR; | |||
197 | static volatile size_t buf_widx IDATA_ATTR; | 197 | static volatile size_t buf_widx IDATA_ATTR; |
198 | 198 | ||
199 | /* Ring buffer arithmetic */ | 199 | /* Ring buffer arithmetic */ |
200 | #define RINGBUF_ADD(p,v) ((p+v)<=filebuflen ? p+v : p+v-filebuflen) | 200 | #define RINGBUF_ADD(p,v) ((p+v)<filebuflen ? p+v : p+v-filebuflen) |
201 | #define RINGBUF_SUB(p,v) ((p>=v) ? p-v : p+filebuflen-v) | 201 | #define RINGBUF_SUB(p,v) ((p>=v) ? p-v : p+filebuflen-v) |
202 | 202 | ||
203 | /* Bytes available in the buffer. */ | 203 | /* Bytes available in the buffer. */ |
@@ -1253,10 +1253,7 @@ static void codec_set_offset_callback(size_t value) | |||
1253 | 1253 | ||
1254 | static void codec_advance_buffer_counters(size_t amount) | 1254 | static void codec_advance_buffer_counters(size_t amount) |
1255 | { | 1255 | { |
1256 | buf_ridx += amount; | 1256 | buf_ridx = RINGBUF_ADD(buf_ridx, amount); |
1257 | |||
1258 | if (buf_ridx >= filebuflen) | ||
1259 | buf_ridx -= filebuflen; | ||
1260 | 1257 | ||
1261 | ci.curpos += amount; | 1258 | ci.curpos += amount; |
1262 | CUR_TI->available -= amount; | 1259 | CUR_TI->available -= amount; |
@@ -1565,9 +1562,7 @@ static bool codec_seek_buffer_callback(size_t newpos) | |||
1565 | /* Seeking inside buffer space. */ | 1562 | /* Seeking inside buffer space. */ |
1566 | logf("seek: -%d", difference); | 1563 | logf("seek: -%d", difference); |
1567 | CUR_TI->available += difference; | 1564 | CUR_TI->available += difference; |
1568 | if (buf_ridx < (unsigned)difference) | 1565 | buf_ridx = RINGBUF_SUB(buf_ridx, (unsigned)difference); |
1569 | buf_ridx += filebuflen; | ||
1570 | buf_ridx -= difference; | ||
1571 | ci.curpos -= difference; | 1566 | ci.curpos -= difference; |
1572 | 1567 | ||
1573 | return true; | 1568 | return true; |
@@ -1613,9 +1608,7 @@ static void codec_discard_codec_callback(void) | |||
1613 | if (CUR_TI->has_codec) | 1608 | if (CUR_TI->has_codec) |
1614 | { | 1609 | { |
1615 | CUR_TI->has_codec = false; | 1610 | CUR_TI->has_codec = false; |
1616 | buf_ridx += CUR_TI->codecsize; | 1611 | buf_ridx = RINGBUF_ADD(buf_ridx, CUR_TI->codecsize); |
1617 | if (buf_ridx >= filebuflen) | ||
1618 | buf_ridx -= filebuflen; | ||
1619 | } | 1612 | } |
1620 | 1613 | ||
1621 | #if 0 | 1614 | #if 0 |
@@ -1982,12 +1975,8 @@ static bool audio_buffer_wind_forward(int new_track_ridx, int old_track_ridx) | |||
1982 | logf("bwf:%ldB",amount); | 1975 | logf("bwf:%ldB",amount); |
1983 | 1976 | ||
1984 | /* Wind the buffer to the beginning of the target track or its codec */ | 1977 | /* Wind the buffer to the beginning of the target track or its codec */ |
1985 | buf_ridx += amount; | 1978 | buf_ridx = RINGBUF_ADD(buf_ridx, amount); |
1986 | 1979 | ||
1987 | /* Check and handle buffer wrapping */ | ||
1988 | if (buf_ridx >= filebuflen) | ||
1989 | buf_ridx -= filebuflen; | ||
1990 | |||
1991 | return true; | 1980 | return true; |
1992 | } | 1981 | } |
1993 | 1982 | ||
@@ -1998,11 +1987,8 @@ static bool audio_buffer_wind_backward(int new_track_ridx, int old_track_ridx) | |||
1998 | /* Start with the previously playing track's data and our data */ | 1987 | /* Start with the previously playing track's data and our data */ |
1999 | size_t amount; | 1988 | size_t amount; |
2000 | 1989 | ||
2001 | buf_back = buf_ridx; | ||
2002 | amount = ci.curpos; | 1990 | amount = ci.curpos; |
2003 | if (buf_ridx < buf_widx) | 1991 | buf_back = RINGBUF_SUB(buf_ridx, buf_widx); |
2004 | buf_back += filebuflen; | ||
2005 | buf_back -= buf_widx; | ||
2006 | 1992 | ||
2007 | /* If we're not just resetting the current track */ | 1993 | /* If we're not just resetting the current track */ |
2008 | if (new_track_ridx != old_track_ridx) | 1994 | if (new_track_ridx != old_track_ridx) |
@@ -2033,11 +2019,8 @@ static bool audio_buffer_wind_backward(int new_track_ridx, int old_track_ridx) | |||
2033 | 2019 | ||
2034 | logf("bwb:%ldB",amount); | 2020 | logf("bwb:%ldB",amount); |
2035 | 2021 | ||
2036 | /* Check and handle buffer wrapping */ | ||
2037 | if (amount > buf_ridx) | ||
2038 | buf_ridx += filebuflen; | ||
2039 | /* Rewind the buffer to the beginning of the target track or its codec */ | 2022 | /* Rewind the buffer to the beginning of the target track or its codec */ |
2040 | buf_ridx -= amount; | 2023 | buf_ridx = RINGBUF_SUB(buf_ridx, amount); |
2041 | 2024 | ||
2042 | /* Reset to the beginning of the new track */ | 2025 | /* Reset to the beginning of the new track */ |
2043 | tracks[new_track_ridx].available = tracks[new_track_ridx].filesize; | 2026 | tracks[new_track_ridx].available = tracks[new_track_ridx].filesize; |
@@ -2140,10 +2123,7 @@ static void audio_strip_id3v1_tag(void) | |||
2140 | size_t tag_idx; | 2123 | size_t tag_idx; |
2141 | size_t cur_idx; | 2124 | size_t cur_idx; |
2142 | 2125 | ||
2143 | tag_idx = buf_widx; | 2126 | tag_idx = RINGBUF_SUB(buf_widx, 128); |
2144 | if (tag_idx < 128) | ||
2145 | tag_idx += filebuflen; | ||
2146 | tag_idx -= 128; | ||
2147 | 2127 | ||
2148 | if (FILEBUFUSED > 128 && tag_idx > buf_ridx) | 2128 | if (FILEBUFUSED > 128 && tag_idx > buf_ridx) |
2149 | { | 2129 | { |
@@ -2153,8 +2133,7 @@ static void audio_strip_id3v1_tag(void) | |||
2153 | if(filebuf[cur_idx] != tag[i]) | 2133 | if(filebuf[cur_idx] != tag[i]) |
2154 | return; | 2134 | return; |
2155 | 2135 | ||
2156 | if(++cur_idx >= filebuflen) | 2136 | cur_idx = RINGBUF_ADD(cur_idx, 1); |
2157 | cur_idx -= filebuflen; | ||
2158 | } | 2137 | } |
2159 | 2138 | ||
2160 | /* Skip id3v1 tag */ | 2139 | /* Skip id3v1 tag */ |
@@ -2203,17 +2182,15 @@ static void audio_read_file(bool quick) | |||
2203 | break ; | 2182 | break ; |
2204 | } | 2183 | } |
2205 | 2184 | ||
2206 | buf_widx += rc; | 2185 | overlap = buf_widx + rc - CUR_TI->buf_idx; |
2186 | buf_widx = RINGBUF_ADD(buf_widx, rc); | ||
2207 | 2187 | ||
2208 | overlap = buf_widx - tracks[track_ridx].buf_idx; | ||
2209 | if (buf_widx >= filebuflen) | ||
2210 | buf_widx -= filebuflen; | ||
2211 | if (overlap > 0 && (unsigned) overlap >= filebuflen) | 2188 | if (overlap > 0 && (unsigned) overlap >= filebuflen) |
2212 | overlap -= filebuflen; | 2189 | overlap -= filebuflen; |
2213 | 2190 | ||
2214 | if (overlap > 0 && overlap <= rc && tracks[track_ridx].available != 0) { | 2191 | if (overlap > 0 && overlap <= rc && CUR_TI->available != 0) { |
2215 | tracks[track_ridx].buf_idx = buf_widx; | 2192 | CUR_TI->buf_idx = buf_widx; |
2216 | tracks[track_ridx].start_pos += overlap; | 2193 | CUR_TI->start_pos += overlap; |
2217 | } | 2194 | } |
2218 | 2195 | ||
2219 | tracks[track_widx].available += rc; | 2196 | tracks[track_widx].available += rc; |
@@ -2323,16 +2300,17 @@ static bool audio_loadcodec(bool start_play) | |||
2323 | copy_n = MIN(conf_filechunk, filebuflen - buf_widx); | 2300 | copy_n = MIN(conf_filechunk, filebuflen - buf_widx); |
2324 | rc = read(fd, &filebuf[buf_widx], copy_n); | 2301 | rc = read(fd, &filebuf[buf_widx], copy_n); |
2325 | if (rc < 0) | 2302 | if (rc < 0) |
2303 | { | ||
2304 | close(fd); | ||
2326 | return false; | 2305 | return false; |
2306 | } | ||
2327 | 2307 | ||
2328 | if (fill_bytesleft > (unsigned)rc) | 2308 | if (fill_bytesleft > (unsigned)rc) |
2329 | fill_bytesleft -= rc; | 2309 | fill_bytesleft -= rc; |
2330 | else | 2310 | else |
2331 | fill_bytesleft = 0; | 2311 | fill_bytesleft = 0; |
2332 | 2312 | ||
2333 | buf_widx += rc; | 2313 | buf_widx = RINGBUF_ADD(buf_widx, rc); |
2334 | if (buf_widx >= filebuflen) | ||
2335 | buf_widx -= filebuflen; | ||
2336 | 2314 | ||
2337 | tracks[track_widx].codecsize += rc; | 2315 | tracks[track_widx].codecsize += rc; |
2338 | } | 2316 | } |
@@ -2500,9 +2478,7 @@ static bool audio_load_track(int offset, bool start_play, bool rebuffer) | |||
2500 | /* Must undo the buffer write of the partial codec */ | 2478 | /* Must undo the buffer write of the partial codec */ |
2501 | logf("Partial codec loaded"); | 2479 | logf("Partial codec loaded"); |
2502 | fill_bytesleft += tracks[track_widx].codecsize; | 2480 | fill_bytesleft += tracks[track_widx].codecsize; |
2503 | if (buf_widx < tracks[track_widx].codecsize) | 2481 | buf_widx = RINGBUF_SUB(buf_widx, tracks[track_widx].codecsize); |
2504 | buf_widx += filebuflen; | ||
2505 | buf_widx -= tracks[track_widx].codecsize; | ||
2506 | tracks[track_widx].codecsize = 0; | 2482 | tracks[track_widx].codecsize = 0; |
2507 | } | 2483 | } |
2508 | 2484 | ||
@@ -2758,7 +2734,7 @@ static void audio_rebuffer(void) | |||
2758 | filling = false; | 2734 | filling = false; |
2759 | 2735 | ||
2760 | /* Reset buffer and track pointers */ | 2736 | /* Reset buffer and track pointers */ |
2761 | tracks[track_ridx].buf_idx = buf_ridx = buf_widx = 0; | 2737 | CUR_TI->buf_idx = buf_ridx = buf_widx = 0; |
2762 | track_widx = track_ridx; | 2738 | track_widx = track_ridx; |
2763 | audio_clear_track_entries(true, true, false); | 2739 | audio_clear_track_entries(true, true, false); |
2764 | CUR_TI->available = 0; | 2740 | CUR_TI->available = 0; |
@@ -2949,12 +2925,12 @@ static void audio_rebuffer_and_seek(size_t newpos) | |||
2949 | filling = true; | 2925 | filling = true; |
2950 | 2926 | ||
2951 | if (newpos > conf_preseek) { | 2927 | if (newpos > conf_preseek) { |
2952 | buf_ridx += conf_preseek; | 2928 | buf_ridx = RINGBUF_ADD(buf_ridx, conf_preseek); |
2953 | CUR_TI->start_pos = newpos - conf_preseek; | 2929 | CUR_TI->start_pos = newpos - conf_preseek; |
2954 | } | 2930 | } |
2955 | else | 2931 | else |
2956 | { | 2932 | { |
2957 | buf_ridx += newpos; | 2933 | buf_ridx = RINGBUF_ADD(buf_ridx, newpos); |
2958 | CUR_TI->start_pos = 0; | 2934 | CUR_TI->start_pos = 0; |
2959 | } | 2935 | } |
2960 | 2936 | ||
@@ -3075,9 +3051,7 @@ void audio_invalidate_tracks(void) | |||
3075 | track_widx = (track_widx + 1) & MAX_TRACK_MASK; | 3051 | track_widx = (track_widx + 1) & MAX_TRACK_MASK; |
3076 | 3052 | ||
3077 | /* Mark all other entries null (also buffered wrong metadata). */ | 3053 | /* Mark all other entries null (also buffered wrong metadata). */ |
3078 | buf_widx = buf_ridx + CUR_TI->available; | 3054 | buf_widx = RINGBUF_ADD(buf_ridx, CUR_TI->available); |
3079 | if (buf_widx >= filebuflen) | ||
3080 | buf_widx -= filebuflen; | ||
3081 | 3055 | ||
3082 | audio_read_next_metadata(); | 3056 | audio_read_next_metadata(); |
3083 | } | 3057 | } |
@@ -3104,9 +3078,7 @@ static void audio_new_playlist(void) | |||
3104 | CUR_TI->taginfo_ready = false; | 3078 | CUR_TI->taginfo_ready = false; |
3105 | 3079 | ||
3106 | /* Invalidate the buffer other than the playing track */ | 3080 | /* Invalidate the buffer other than the playing track */ |
3107 | buf_widx = buf_ridx + CUR_TI->available; | 3081 | buf_widx = RINGBUF_ADD(buf_ridx, CUR_TI->available); |
3108 | if (buf_widx >= filebuflen) | ||
3109 | buf_widx -= filebuflen; | ||
3110 | } | 3082 | } |
3111 | 3083 | ||
3112 | /* Signal the codec to initiate a track change forward */ | 3084 | /* Signal the codec to initiate a track change forward */ |