From 2ed0b195be62161df9fbeaa58abfe762f86959e6 Mon Sep 17 00:00:00 2001 From: Miika Pekkarinen Date: Fri, 10 Jun 2005 10:58:45 +0000 Subject: Better handling for cpu_boost(). Small buffering fix. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6647 a1c6a512-1295-4272-9138-f99709370657 --- apps/playback.c | 19 ++++++++++--------- firmware/export/pcm_playback.h | 1 + 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) } buf_widx += rc; - if (buf_widx == codecbuflen) - buf_widx = 0; + if (buf_widx >= codecbuflen) + buf_widx -= codecbuflen; i += rc; tracks[track_widx].available += rc; fill_bytesleft -= rc; @@ -552,7 +552,7 @@ bool loadcodec(const char *trackname, bool start_play) return false; buf_widx += rc; if (buf_widx >= codecbuflen) - buf_widx = 0; + buf_widx -= codecbuflen; i += rc; } close(fd); @@ -598,7 +598,7 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) /* Load the codec */ if (buf_widx >= codecbuflen) - buf_widx = 0; + buf_widx -= codecbuflen; tracks[track_widx].codecbuf = &codecbuf[buf_widx]; if (!loadcodec(trackname, start_play)) { @@ -742,15 +742,15 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) } buf_widx += rc; if (buf_widx >= codecbuflen) - buf_widx = 0; + buf_widx -= codecbuflen; i += rc; tracks[track_widx].available += rc; tracks[track_widx].filerem -= rc; + codecbufused += rc; fill_bytesleft -= rc; } tracks[track_widx].filepos = i; - codecbufused += i; /* Leave the file handle open for faster buffer refill. */ if (tracks[track_widx].filerem != 0) { @@ -809,8 +809,8 @@ void audio_check_buffer(void) /* Fill buffer as full as possible for cross-fader. */ #ifndef SIMULATOR - if (cur_ti->id3.length > 0 && - cur_ti->id3.length - cur_ti->id3.elapsed < 20000 && playing) + if (pcm_is_crossfade_enabled() && cur_ti->id3.length > 0 + && cur_ti->id3.length - cur_ti->id3.elapsed < 20000 && playing) pcm_set_boost_mode(true); #endif @@ -873,6 +873,7 @@ void audio_update_trackinfo(void) cur_ti = &tracks[track_ridx]; buf_ridx += cur_ti->codecsize; + codecbufused -= cur_ti->codecsize; if (buf_ridx >= codecbuflen) buf_ridx -= codecbuflen; #ifndef SIMULATOR @@ -989,7 +990,7 @@ void audio_thread(void) struct event ev; while (1) { - yield(); + sleep(50); audio_check_buffer(); 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); void pcm_crossfade_start(void); unsigned int audiobuffer_get_latency(void); bool audiobuffer_insert(char *buf, size_t length); +bool pcm_is_crossfade_enabled(void); void pcm_crossfade_enable(bool on_off); #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) DCR0 = DMA_INT | DMA_EEXT | DMA_CS | DMA_SINC | DMA_START; } -/* Stops the DMA transfer and interrupt */ -static void dma_stop(void) -{ - pcm_playing = false; - - /* Reset the FIFO */ - IIS2CONFIG = 0x800; -} - void pcm_boost(bool state) { static bool boost_state = false; @@ -121,6 +112,16 @@ void pcm_boost(bool state) } } +/* Stops the DMA transfer and interrupt */ +static void dma_stop(void) +{ + pcm_playing = false; + + /* Reset the FIFO */ + IIS2CONFIG = 0x800; + pcm_boost(false); +} + /* set volume of the main channel */ void pcm_set_volume(int volume) { @@ -385,6 +386,7 @@ bool pcm_is_lowdata(void) void pcm_crossfade_start(void) { + //logf("cf:%d", audiobuffer_free / CHUNK_SIZE); if (audiobuffer_free > CHUNK_SIZE * 4 || !crossfade_enabled) { return ; } @@ -493,6 +495,7 @@ void pcm_play_init(void) pcmbuf_read_index = 0; pcmbuf_write_index = 0; pcmbuf_unplayed_bytes = 0; + crossfade_enabled = false; pcm_play_set_watermark(PCM_WATERMARK, pcm_watermark_callback); /* Play a small chunk of zeroes to initialize the playback system. */ @@ -501,9 +504,7 @@ void pcm_play_init(void) memset(&audiobuffer[0], 0, audiobuffer_pos); pcm_play_add_chunk(&audiobuffer[0], audiobuffer_pos, NULL); pcm_play_start(); - cpu_boost(false); - crossfade_enabled = false; } void pcm_crossfade_enable(bool on_off) @@ -511,6 +512,11 @@ void pcm_crossfade_enable(bool on_off) crossfade_enabled = on_off; } +bool pcm_is_crossfade_enabled(void) +{ + return crossfade_enabled; +} + void pcm_play_start(void) { struct pcmbufdesc *desc = &pcmbuffers[pcmbuf_read_index]; -- cgit v1.2.3