From 6ab53ba458164921361cf6579069b4ebb691f6a7 Mon Sep 17 00:00:00 2001 From: Miika Pekkarinen Date: Tue, 14 Jun 2005 07:54:09 +0000 Subject: Even more quiet audio initialization. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6705 a1c6a512-1295-4272-9138-f99709370657 --- firmware/drivers/uda1380.c | 23 +++++++++++++++-------- firmware/export/uda1380.h | 1 + firmware/pcm_playback.c | 23 +++++++++++------------ 3 files changed, 27 insertions(+), 20 deletions(-) (limited to 'firmware') diff --git a/firmware/drivers/uda1380.c b/firmware/drivers/uda1380.c index 67479fd92e..4b63ccd744 100644 --- a/firmware/drivers/uda1380.c +++ b/firmware/drivers/uda1380.c @@ -128,20 +128,27 @@ int uda1380_set_regs(void) return 0; } +/* Silently enable / disable audio output */ +void uda1380_enable_output(bool enable) +{ + if (enable) { + uda1380_write_reg(REG_PWR, uda1380_regs[REG_PWR] | PON_HP); + + /* Sleep a while, then disable the master mute */ + sleep(HZ/8); + uda1380_write_reg(REG_MUTE, MUTE_CH2); + } else { + uda1380_write_reg(REG_MUTE, MUTE_MASTER); + uda1380_write_reg(REG_PWR, uda1380_regs[REG_PWR] & ~PON_HP); + } +} + /* Initialize UDA1380 codec with default register values (uda1380_defaults) */ int uda1380_init(void) { if (uda1380_set_regs() == -1) return -1; - /* Sleep a while, then power on headphone amp */ - sleep(HZ/8); - uda1380_write_reg(REG_PWR, uda1380_regs[REG_PWR] | PON_HP); - - /* Sleep a little more, then disable the master mute */ - sleep(HZ/8); - uda1380_write_reg(REG_MUTE, MUTE_CH2); - return 0; } diff --git a/firmware/export/uda1380.h b/firmware/export/uda1380.h index c92a6fe30c..c6993ef84c 100644 --- a/firmware/export/uda1380.h +++ b/firmware/export/uda1380.h @@ -27,6 +27,7 @@ #define _UDA1380_H extern int uda1380_init(void); +extern void uda1380_enable_output(bool enable); extern int uda1380_setvol(int vol); extern int uda1380_mute(int mute); extern void uda1380_close(void); diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c index 582f04cd72..3548caded5 100644 --- a/firmware/pcm_playback.c +++ b/firmware/pcm_playback.c @@ -116,10 +116,11 @@ void pcm_boost(bool state) static void dma_stop(void) { pcm_playing = false; + uda1380_enable_output(false); + pcm_boost(false); /* Reset the FIFO */ IIS2CONFIG = 0x800; - pcm_boost(false); } /* set volume of the main channel */ @@ -222,17 +223,23 @@ void pcm_play_data(const unsigned char* start, int size, dma_start(start, size); get_more(&next_start, &next_size); + + /* Sleep a while, then power on audio output */ + sleep(HZ/16); + uda1380_enable_output(true); } void pcm_play_stop(void) { - dma_stop(); + if (pcm_playing) + dma_stop(); + pcmbuf_unplayed_bytes = 0; + last_chunksize = 0; audiobuffer_pos = 0; audiobuffer_fillpos = 0; audiobuffer_free = PCMBUF_SIZE; pcmbuf_read_index = 0; pcmbuf_write_index = 0; - pcmbuf_unplayed_bytes = 0; next_start = NULL; next_size = 0; pcm_set_boost_mode(false); @@ -431,7 +438,7 @@ bool audiobuffer_insert(char *buf, size_t length) if (!pcm_is_playing() && !pcm_paused) { pcm_boost(true); crossfade_active = false; - if (audiobuffer_free < PCMBUF_SIZE - CHUNK_SIZE*2) + if (audiobuffer_free < PCMBUF_SIZE - CHUNK_SIZE*4) pcm_play_start(); } @@ -497,14 +504,6 @@ void pcm_play_init(void) 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. */ - audiobuffer_pos = 32000; - audiobuffer_free -= audiobuffer_pos; - memset(&audiobuffer[0], 0, audiobuffer_pos); - pcm_play_add_chunk(&audiobuffer[0], audiobuffer_pos, NULL); - pcm_play_start(); - } void pcm_crossfade_enable(bool on_off) -- cgit v1.2.3