diff options
author | Miika Pekkarinen <miipekk@ihme.org> | 2005-06-11 20:14:10 +0000 |
---|---|---|
committer | Miika Pekkarinen <miipekk@ihme.org> | 2005-06-11 20:14:10 +0000 |
commit | 5f570694522225758df3f638da077a06683e9668 (patch) | |
tree | 5c552e2ba5512f17c1741eb21fb441f728513f13 | |
parent | 8f0a0fed4e40c1fb831744ca1cc34f20a93d85b4 (diff) | |
download | rockbox-5f570694522225758df3f638da077a06683e9668.tar.gz rockbox-5f570694522225758df3f638da077a06683e9668.zip |
Fixed buffering problem with some files.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6682 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | apps/playback.c | 7 | ||||
-rw-r--r-- | firmware/pcm_playback.c | 16 |
2 files changed, 10 insertions, 13 deletions
diff --git a/apps/playback.c b/apps/playback.c index 739496ec73..b81ee986cb 100644 --- a/apps/playback.c +++ b/apps/playback.c | |||
@@ -431,8 +431,6 @@ void yield_codecs(void) | |||
431 | while (pcm_is_lowdata() && !ci.stop_codec && | 431 | while (pcm_is_lowdata() && !ci.stop_codec && |
432 | playing && queue_empty(&audio_queue)) | 432 | playing && queue_empty(&audio_queue)) |
433 | yield(); | 433 | yield(); |
434 | #else | ||
435 | yield(); | ||
436 | #endif | 434 | #endif |
437 | } | 435 | } |
438 | 436 | ||
@@ -658,7 +656,7 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
658 | close(fd); | 656 | close(fd); |
659 | return false; | 657 | return false; |
660 | } | 658 | } |
661 | 659 | ||
662 | /* Load codec specific track tag information. */ | 660 | /* Load codec specific track tag information. */ |
663 | switch (tracks[track_widx].codectype) { | 661 | switch (tracks[track_widx].codectype) { |
664 | case AFMT_MPA_L2: | 662 | case AFMT_MPA_L2: |
@@ -666,7 +664,8 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
666 | /* Should check the return value. */ | 664 | /* Should check the return value. */ |
667 | mp3info(&tracks[track_widx].id3, trackname, v1first); | 665 | mp3info(&tracks[track_widx].id3, trackname, v1first); |
668 | lseek(fd, 0, SEEK_SET); | 666 | lseek(fd, 0, SEEK_SET); |
669 | get_mp3file_info(fd, &tracks[track_widx].mp3data); | 667 | /* This is too slow to execute on some files. */ |
668 | // get_mp3file_info(fd, &tracks[track_widx].mp3data); | ||
670 | if (offset) { | 669 | if (offset) { |
671 | lseek(fd, offset, SEEK_SET); | 670 | lseek(fd, offset, SEEK_SET); |
672 | tracks[track_widx].id3.offset = offset; | 671 | tracks[track_widx].id3.offset = offset; |
diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c index 12f6e08bd0..b024d7c69c 100644 --- a/firmware/pcm_playback.c +++ b/firmware/pcm_playback.c | |||
@@ -44,7 +44,7 @@ | |||
44 | /* Must be a power of 2 */ | 44 | /* Must be a power of 2 */ |
45 | #define NUM_PCM_BUFFERS (PCMBUF_SIZE / CHUNK_SIZE) | 45 | #define NUM_PCM_BUFFERS (PCMBUF_SIZE / CHUNK_SIZE) |
46 | #define NUM_PCM_BUFFERS_MASK (NUM_PCM_BUFFERS - 1) | 46 | #define NUM_PCM_BUFFERS_MASK (NUM_PCM_BUFFERS - 1) |
47 | #define PCM_WATERMARK 0x10000 | 47 | #define PCM_WATERMARK (CHUNK_SIZE * 3) |
48 | 48 | ||
49 | static bool pcm_playing; | 49 | static bool pcm_playing; |
50 | static bool pcm_paused; | 50 | static bool pcm_paused; |
@@ -103,7 +103,7 @@ void pcm_boost(bool state) | |||
103 | { | 103 | { |
104 | static bool boost_state = false; | 104 | static bool boost_state = false; |
105 | 105 | ||
106 | if (crossfade_active) | 106 | if (crossfade_active || boost_mode) |
107 | return ; | 107 | return ; |
108 | 108 | ||
109 | if (state != boost_state) { | 109 | if (state != boost_state) { |
@@ -348,9 +348,9 @@ void pcm_watermark_callback(int bytes_left) | |||
348 | 348 | ||
349 | void pcm_set_boost_mode(bool state) | 349 | void pcm_set_boost_mode(bool state) |
350 | { | 350 | { |
351 | boost_mode = state; | ||
352 | if (state) | 351 | if (state) |
353 | pcm_boost(true); | 352 | pcm_boost(true); |
353 | boost_mode = state; | ||
354 | } | 354 | } |
355 | 355 | ||
356 | void audiobuffer_add_event(void (*event_handler)(void)) | 356 | void audiobuffer_add_event(void (*event_handler)(void)) |
@@ -377,7 +377,7 @@ bool pcm_is_lowdata(void) | |||
377 | if (!pcm_is_playing()) | 377 | if (!pcm_is_playing()) |
378 | return false; | 378 | return false; |
379 | 379 | ||
380 | if (PCMBUF_SIZE - audiobuffer_free <= PCM_WATERMARK) | 380 | if (pcmbuf_unplayed_bytes < PCM_WATERMARK) |
381 | return true; | 381 | return true; |
382 | 382 | ||
383 | return false; | 383 | return false; |
@@ -421,8 +421,7 @@ bool audiobuffer_insert(char *buf, size_t length) | |||
421 | size_t copy_n = 0; | 421 | size_t copy_n = 0; |
422 | 422 | ||
423 | if (audiobuffer_free < length + CHUNK_SIZE && !crossfade_active) { | 423 | if (audiobuffer_free < length + CHUNK_SIZE && !crossfade_active) { |
424 | if (!boost_mode) | 424 | pcm_boost(false); |
425 | pcm_boost(false); | ||
426 | return false; | 425 | return false; |
427 | } | 426 | } |
428 | 427 | ||
@@ -448,7 +447,7 @@ bool audiobuffer_insert(char *buf, size_t length) | |||
448 | } else { | 447 | } else { |
449 | copy_n = MIN(length, PCMBUF_SIZE - audiobuffer_pos - | 448 | copy_n = MIN(length, PCMBUF_SIZE - audiobuffer_pos - |
450 | audiobuffer_fillpos); | 449 | audiobuffer_fillpos); |
451 | copy_n = MIN(CHUNK_SIZE, copy_n); | 450 | copy_n = MIN(CHUNK_SIZE - audiobuffer_fillpos, copy_n); |
452 | 451 | ||
453 | memcpy(&audiobuffer[audiobuffer_pos+audiobuffer_fillpos], | 452 | memcpy(&audiobuffer[audiobuffer_pos+audiobuffer_fillpos], |
454 | buf, copy_n); | 453 | buf, copy_n); |
@@ -467,8 +466,7 @@ bool audiobuffer_insert(char *buf, size_t length) | |||
467 | 466 | ||
468 | while (!pcm_play_add_chunk(&audiobuffer[audiobuffer_pos], | 467 | while (!pcm_play_add_chunk(&audiobuffer[audiobuffer_pos], |
469 | copy_n, NULL)) { | 468 | copy_n, NULL)) { |
470 | if (!boost_mode) | 469 | pcm_boost(false); |
471 | pcm_boost(false); | ||
472 | yield(); | 470 | yield(); |
473 | } | 471 | } |
474 | 472 | ||