diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/playback.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/apps/playback.c b/apps/playback.c index e6cc68af6b..dccf632dc9 100644 --- a/apps/playback.c +++ b/apps/playback.c | |||
@@ -61,6 +61,7 @@ | |||
61 | #include "sound.h" | 61 | #include "sound.h" |
62 | #include "metadata.h" | 62 | #include "metadata.h" |
63 | 63 | ||
64 | static volatile bool codec_loaded; | ||
64 | static volatile bool playing; | 65 | static volatile bool playing; |
65 | static volatile bool paused; | 66 | static volatile bool paused; |
66 | 67 | ||
@@ -213,11 +214,20 @@ bool pcm_is_playing(void) | |||
213 | return false; | 214 | return false; |
214 | } | 215 | } |
215 | 216 | ||
217 | bool pcm_is_crossfade_active(void) | ||
218 | { | ||
219 | return false; | ||
220 | } | ||
221 | |||
216 | bool pcm_is_lowdata(void) | 222 | bool pcm_is_lowdata(void) |
217 | { | 223 | { |
218 | return false; | 224 | return false; |
219 | } | 225 | } |
220 | 226 | ||
227 | void pcm_flush_audio(void) | ||
228 | { | ||
229 | } | ||
230 | |||
221 | bool pcm_crossfade_init(void) | 231 | bool pcm_crossfade_init(void) |
222 | { | 232 | { |
223 | return false; | 233 | return false; |
@@ -487,7 +497,8 @@ bool codec_seek_buffer_callback(off_t newpos) | |||
487 | if (difference >= 0) { | 497 | if (difference >= 0) { |
488 | logf("seek: +%d", difference); | 498 | logf("seek: +%d", difference); |
489 | codec_advance_buffer_callback(difference); | 499 | codec_advance_buffer_callback(difference); |
490 | pcm_play_stop(); | 500 | if (!pcm_is_crossfade_active()) |
501 | pcm_play_stop(); | ||
491 | return true; | 502 | return true; |
492 | } | 503 | } |
493 | 504 | ||
@@ -508,6 +519,7 @@ bool codec_seek_buffer_callback(off_t newpos) | |||
508 | if (buf_ridx < 0) | 519 | if (buf_ridx < 0) |
509 | buf_ridx = codecbuflen + buf_ridx; | 520 | buf_ridx = codecbuflen + buf_ridx; |
510 | ci.curpos -= difference; | 521 | ci.curpos -= difference; |
522 | if (!pcm_is_crossfade_active()) | ||
511 | pcm_play_stop(); | 523 | pcm_play_stop(); |
512 | 524 | ||
513 | return true; | 525 | return true; |
@@ -554,7 +566,7 @@ void yield_codecs(void) | |||
554 | if (!pcm_is_playing()) | 566 | if (!pcm_is_playing()) |
555 | sleep(5); | 567 | sleep(5); |
556 | while (pcm_is_lowdata() && !ci.stop_codec && | 568 | while (pcm_is_lowdata() && !ci.stop_codec && |
557 | playing && queue_empty(&audio_queue)) | 569 | playing && queue_empty(&audio_queue) && codecbufused > (128*1024)) |
558 | yield(); | 570 | yield(); |
559 | } | 571 | } |
560 | 572 | ||
@@ -937,8 +949,7 @@ void audio_check_buffer(void) | |||
937 | 949 | ||
938 | /* Limit buffering size at first run. */ | 950 | /* Limit buffering size at first run. */ |
939 | if (conf_bufferlimit && (int)fill_bytesleft >= conf_bufferlimit) { | 951 | if (conf_bufferlimit && (int)fill_bytesleft >= conf_bufferlimit) { |
940 | fill_bytesleft = conf_bufferlimit; | 952 | fill_bytesleft = conf_bufferlimit - codecbufused; |
941 | conf_bufferlimit = 0; | ||
942 | } | 953 | } |
943 | 954 | ||
944 | /* Try to load remainings of the file. */ | 955 | /* Try to load remainings of the file. */ |
@@ -956,6 +967,7 @@ void audio_check_buffer(void) | |||
956 | last_peek_offset++; | 967 | last_peek_offset++; |
957 | } else if (tracks[track_widx].filerem == 0 || fill_bytesleft == 0) { | 968 | } else if (tracks[track_widx].filerem == 0 || fill_bytesleft == 0) { |
958 | filling = false; | 969 | filling = false; |
970 | conf_bufferlimit = 0; | ||
959 | pcm_set_boost_mode(false); | 971 | pcm_set_boost_mode(false); |
960 | if (playing) | 972 | if (playing) |
961 | ata_sleep(); | 973 | ata_sleep(); |
@@ -1128,7 +1140,7 @@ void audio_thread(void) | |||
1128 | ci.stop_codec = true; | 1140 | ci.stop_codec = true; |
1129 | ci.reload_codec = false; | 1141 | ci.reload_codec = false; |
1130 | ci.seek_time = 0; | 1142 | ci.seek_time = 0; |
1131 | //pcm_play_stop(); | 1143 | pcm_flush_audio(); |
1132 | audio_play_start((int)ev.data); | 1144 | audio_play_start((int)ev.data); |
1133 | break ; | 1145 | break ; |
1134 | 1146 | ||
@@ -1195,6 +1207,7 @@ void codec_thread(void) | |||
1195 | switch (ev.id) { | 1207 | switch (ev.id) { |
1196 | case CODEC_LOAD_DISK: | 1208 | case CODEC_LOAD_DISK: |
1197 | ci.stop_codec = false; | 1209 | ci.stop_codec = false; |
1210 | codec_loaded = true; | ||
1198 | status = codec_load_file((char *)ev.data); | 1211 | status = codec_load_file((char *)ev.data); |
1199 | break ; | 1212 | break ; |
1200 | 1213 | ||
@@ -1209,6 +1222,7 @@ void codec_thread(void) | |||
1209 | 1222 | ||
1210 | ci.stop_codec = false; | 1223 | ci.stop_codec = false; |
1211 | wrap = (int)&codecbuf[codecbuflen] - (int)cur_ti->codecbuf; | 1224 | wrap = (int)&codecbuf[codecbuflen] - (int)cur_ti->codecbuf; |
1225 | codec_loaded = true; | ||
1212 | status = codec_load_ram(cur_ti->codecbuf, codecsize, | 1226 | status = codec_load_ram(cur_ti->codecbuf, codecsize, |
1213 | &codecbuf[0], wrap); | 1227 | &codecbuf[0], wrap); |
1214 | break ; | 1228 | break ; |
@@ -1220,6 +1234,8 @@ void codec_thread(void) | |||
1220 | break ; | 1234 | break ; |
1221 | #endif | 1235 | #endif |
1222 | } | 1236 | } |
1237 | |||
1238 | codec_loaded = false; | ||
1223 | 1239 | ||
1224 | switch (ev.id) { | 1240 | switch (ev.id) { |
1225 | case CODEC_LOAD_DISK: | 1241 | case CODEC_LOAD_DISK: |
@@ -1297,6 +1313,8 @@ void audio_stop(void) | |||
1297 | { | 1313 | { |
1298 | logf("audio_stop"); | 1314 | logf("audio_stop"); |
1299 | queue_post(&audio_queue, AUDIO_STOP, 0); | 1315 | queue_post(&audio_queue, AUDIO_STOP, 0); |
1316 | while (playing || codec_loaded) | ||
1317 | yield(); | ||
1300 | } | 1318 | } |
1301 | 1319 | ||
1302 | void audio_pause(void) | 1320 | void audio_pause(void) |
@@ -1524,6 +1542,7 @@ void audio_init(void) | |||
1524 | filling = false; | 1542 | filling = false; |
1525 | codecbuf = &audiobuf[MALLOC_BUFSIZE]; | 1543 | codecbuf = &audiobuf[MALLOC_BUFSIZE]; |
1526 | playing = false; | 1544 | playing = false; |
1545 | codec_loaded = false; | ||
1527 | paused = false; | 1546 | paused = false; |
1528 | track_changed = false; | 1547 | track_changed = false; |
1529 | current_fd = -1; | 1548 | current_fd = -1; |