summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/playback.c76
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;
197static volatile size_t buf_widx IDATA_ATTR; 197static 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
1254static void codec_advance_buffer_counters(size_t amount) 1254static 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 */