diff options
author | Miika Pekkarinen <miipekk@ihme.org> | 2005-06-10 10:58:45 +0000 |
---|---|---|
committer | Miika Pekkarinen <miipekk@ihme.org> | 2005-06-10 10:58:45 +0000 |
commit | 2ed0b195be62161df9fbeaa58abfe762f86959e6 (patch) | |
tree | dcbb1f6c03fcc8c9e4de320450dd7de087a53a31 | |
parent | b945fe84aa80d47a7d160751de5a05953f1fcc83 (diff) | |
download | rockbox-2ed0b195be62161df9fbeaa58abfe762f86959e6.tar.gz rockbox-2ed0b195be62161df9fbeaa58abfe762f86959e6.zip |
Better handling for cpu_boost(). Small buffering fix.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6647 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | apps/playback.c | 19 | ||||
-rw-r--r-- | firmware/export/pcm_playback.h | 1 | ||||
-rw-r--r-- | firmware/pcm_playback.c | 28 |
3 files changed, 28 insertions, 20 deletions
diff --git a/apps/playback.c b/apps/playback.c index 9abc3e38a9..2f67b6c3ba 100644 --- a/apps/playback.c +++ b/apps/playback.c | |||
@@ -438,8 +438,8 @@ void audio_fill_file_buffer(void) | |||
438 | } | 438 | } |
439 | 439 | ||
440 | buf_widx += rc; | 440 | buf_widx += rc; |
441 | if (buf_widx == codecbuflen) | 441 | if (buf_widx >= codecbuflen) |
442 | buf_widx = 0; | 442 | buf_widx -= codecbuflen; |
443 | i += rc; | 443 | i += rc; |
444 | tracks[track_widx].available += rc; | 444 | tracks[track_widx].available += rc; |
445 | fill_bytesleft -= rc; | 445 | fill_bytesleft -= rc; |
@@ -552,7 +552,7 @@ bool loadcodec(const char *trackname, bool start_play) | |||
552 | return false; | 552 | return false; |
553 | buf_widx += rc; | 553 | buf_widx += rc; |
554 | if (buf_widx >= codecbuflen) | 554 | if (buf_widx >= codecbuflen) |
555 | buf_widx = 0; | 555 | buf_widx -= codecbuflen; |
556 | i += rc; | 556 | i += rc; |
557 | } | 557 | } |
558 | close(fd); | 558 | close(fd); |
@@ -598,7 +598,7 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
598 | 598 | ||
599 | /* Load the codec */ | 599 | /* Load the codec */ |
600 | if (buf_widx >= codecbuflen) | 600 | if (buf_widx >= codecbuflen) |
601 | buf_widx = 0; | 601 | buf_widx -= codecbuflen; |
602 | 602 | ||
603 | tracks[track_widx].codecbuf = &codecbuf[buf_widx]; | 603 | tracks[track_widx].codecbuf = &codecbuf[buf_widx]; |
604 | if (!loadcodec(trackname, start_play)) { | 604 | if (!loadcodec(trackname, start_play)) { |
@@ -742,15 +742,15 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
742 | } | 742 | } |
743 | buf_widx += rc; | 743 | buf_widx += rc; |
744 | if (buf_widx >= codecbuflen) | 744 | if (buf_widx >= codecbuflen) |
745 | buf_widx = 0; | 745 | buf_widx -= codecbuflen; |
746 | i += rc; | 746 | i += rc; |
747 | tracks[track_widx].available += rc; | 747 | tracks[track_widx].available += rc; |
748 | tracks[track_widx].filerem -= rc; | 748 | tracks[track_widx].filerem -= rc; |
749 | codecbufused += rc; | ||
749 | fill_bytesleft -= rc; | 750 | fill_bytesleft -= rc; |
750 | } | 751 | } |
751 | 752 | ||
752 | tracks[track_widx].filepos = i; | 753 | tracks[track_widx].filepos = i; |
753 | codecbufused += i; | ||
754 | 754 | ||
755 | /* Leave the file handle open for faster buffer refill. */ | 755 | /* Leave the file handle open for faster buffer refill. */ |
756 | if (tracks[track_widx].filerem != 0) { | 756 | if (tracks[track_widx].filerem != 0) { |
@@ -809,8 +809,8 @@ void audio_check_buffer(void) | |||
809 | 809 | ||
810 | /* Fill buffer as full as possible for cross-fader. */ | 810 | /* Fill buffer as full as possible for cross-fader. */ |
811 | #ifndef SIMULATOR | 811 | #ifndef SIMULATOR |
812 | if (cur_ti->id3.length > 0 && | 812 | if (pcm_is_crossfade_enabled() && cur_ti->id3.length > 0 |
813 | cur_ti->id3.length - cur_ti->id3.elapsed < 20000 && playing) | 813 | && cur_ti->id3.length - cur_ti->id3.elapsed < 20000 && playing) |
814 | pcm_set_boost_mode(true); | 814 | pcm_set_boost_mode(true); |
815 | #endif | 815 | #endif |
816 | 816 | ||
@@ -873,6 +873,7 @@ void audio_update_trackinfo(void) | |||
873 | 873 | ||
874 | cur_ti = &tracks[track_ridx]; | 874 | cur_ti = &tracks[track_ridx]; |
875 | buf_ridx += cur_ti->codecsize; | 875 | buf_ridx += cur_ti->codecsize; |
876 | codecbufused -= cur_ti->codecsize; | ||
876 | if (buf_ridx >= codecbuflen) | 877 | if (buf_ridx >= codecbuflen) |
877 | buf_ridx -= codecbuflen; | 878 | buf_ridx -= codecbuflen; |
878 | #ifndef SIMULATOR | 879 | #ifndef SIMULATOR |
@@ -989,7 +990,7 @@ void audio_thread(void) | |||
989 | struct event ev; | 990 | struct event ev; |
990 | 991 | ||
991 | while (1) { | 992 | while (1) { |
992 | yield(); | 993 | sleep(50); |
993 | audio_check_buffer(); | 994 | audio_check_buffer(); |
994 | 995 | ||
995 | queue_wait_w_tmo(&audio_queue, &ev, 10); | 996 | queue_wait_w_tmo(&audio_queue, &ev, 10); |
diff --git a/firmware/export/pcm_playback.h b/firmware/export/pcm_playback.h index 0f2de83224..32288d7d91 100644 --- a/firmware/export/pcm_playback.h +++ b/firmware/export/pcm_playback.h | |||
@@ -45,6 +45,7 @@ bool pcm_is_lowdata(void); | |||
45 | void pcm_crossfade_start(void); | 45 | void pcm_crossfade_start(void); |
46 | unsigned int audiobuffer_get_latency(void); | 46 | unsigned int audiobuffer_get_latency(void); |
47 | bool audiobuffer_insert(char *buf, size_t length); | 47 | bool audiobuffer_insert(char *buf, size_t length); |
48 | bool pcm_is_crossfade_enabled(void); | ||
48 | void pcm_crossfade_enable(bool on_off); | 49 | void pcm_crossfade_enable(bool on_off); |
49 | 50 | ||
50 | #endif | 51 | #endif |
diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c index 34310cf916..049978e381 100644 --- a/firmware/pcm_playback.c +++ b/firmware/pcm_playback.c | |||
@@ -99,15 +99,6 @@ static void dma_start(const void *addr, long size) | |||
99 | DCR0 = DMA_INT | DMA_EEXT | DMA_CS | DMA_SINC | DMA_START; | 99 | DCR0 = DMA_INT | DMA_EEXT | DMA_CS | DMA_SINC | DMA_START; |
100 | } | 100 | } |
101 | 101 | ||
102 | /* Stops the DMA transfer and interrupt */ | ||
103 | static void dma_stop(void) | ||
104 | { | ||
105 | pcm_playing = false; | ||
106 | |||
107 | /* Reset the FIFO */ | ||
108 | IIS2CONFIG = 0x800; | ||
109 | } | ||
110 | |||
111 | void pcm_boost(bool state) | 102 | void pcm_boost(bool state) |
112 | { | 103 | { |
113 | static bool boost_state = false; | 104 | static bool boost_state = false; |
@@ -121,6 +112,16 @@ void pcm_boost(bool state) | |||
121 | } | 112 | } |
122 | } | 113 | } |
123 | 114 | ||
115 | /* Stops the DMA transfer and interrupt */ | ||
116 | static void dma_stop(void) | ||
117 | { | ||
118 | pcm_playing = false; | ||
119 | |||
120 | /* Reset the FIFO */ | ||
121 | IIS2CONFIG = 0x800; | ||
122 | pcm_boost(false); | ||
123 | } | ||
124 | |||
124 | /* set volume of the main channel */ | 125 | /* set volume of the main channel */ |
125 | void pcm_set_volume(int volume) | 126 | void pcm_set_volume(int volume) |
126 | { | 127 | { |
@@ -385,6 +386,7 @@ bool pcm_is_lowdata(void) | |||
385 | 386 | ||
386 | void pcm_crossfade_start(void) | 387 | void pcm_crossfade_start(void) |
387 | { | 388 | { |
389 | //logf("cf:%d", audiobuffer_free / CHUNK_SIZE); | ||
388 | if (audiobuffer_free > CHUNK_SIZE * 4 || !crossfade_enabled) { | 390 | if (audiobuffer_free > CHUNK_SIZE * 4 || !crossfade_enabled) { |
389 | return ; | 391 | return ; |
390 | } | 392 | } |
@@ -493,6 +495,7 @@ void pcm_play_init(void) | |||
493 | pcmbuf_read_index = 0; | 495 | pcmbuf_read_index = 0; |
494 | pcmbuf_write_index = 0; | 496 | pcmbuf_write_index = 0; |
495 | pcmbuf_unplayed_bytes = 0; | 497 | pcmbuf_unplayed_bytes = 0; |
498 | crossfade_enabled = false; | ||
496 | pcm_play_set_watermark(PCM_WATERMARK, pcm_watermark_callback); | 499 | pcm_play_set_watermark(PCM_WATERMARK, pcm_watermark_callback); |
497 | 500 | ||
498 | /* Play a small chunk of zeroes to initialize the playback system. */ | 501 | /* Play a small chunk of zeroes to initialize the playback system. */ |
@@ -501,9 +504,7 @@ void pcm_play_init(void) | |||
501 | memset(&audiobuffer[0], 0, audiobuffer_pos); | 504 | memset(&audiobuffer[0], 0, audiobuffer_pos); |
502 | pcm_play_add_chunk(&audiobuffer[0], audiobuffer_pos, NULL); | 505 | pcm_play_add_chunk(&audiobuffer[0], audiobuffer_pos, NULL); |
503 | pcm_play_start(); | 506 | pcm_play_start(); |
504 | cpu_boost(false); | ||
505 | 507 | ||
506 | crossfade_enabled = false; | ||
507 | } | 508 | } |
508 | 509 | ||
509 | void pcm_crossfade_enable(bool on_off) | 510 | void pcm_crossfade_enable(bool on_off) |
@@ -511,6 +512,11 @@ void pcm_crossfade_enable(bool on_off) | |||
511 | crossfade_enabled = on_off; | 512 | crossfade_enabled = on_off; |
512 | } | 513 | } |
513 | 514 | ||
515 | bool pcm_is_crossfade_enabled(void) | ||
516 | { | ||
517 | return crossfade_enabled; | ||
518 | } | ||
519 | |||
514 | void pcm_play_start(void) | 520 | void pcm_play_start(void) |
515 | { | 521 | { |
516 | struct pcmbufdesc *desc = &pcmbuffers[pcmbuf_read_index]; | 522 | struct pcmbufdesc *desc = &pcmbuffers[pcmbuf_read_index]; |