diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/drivers/uda1380.c | 23 | ||||
-rw-r--r-- | firmware/export/uda1380.h | 1 | ||||
-rw-r--r-- | firmware/pcm_playback.c | 23 |
3 files changed, 27 insertions, 20 deletions
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) | |||
128 | return 0; | 128 | return 0; |
129 | } | 129 | } |
130 | 130 | ||
131 | /* Silently enable / disable audio output */ | ||
132 | void uda1380_enable_output(bool enable) | ||
133 | { | ||
134 | if (enable) { | ||
135 | uda1380_write_reg(REG_PWR, uda1380_regs[REG_PWR] | PON_HP); | ||
136 | |||
137 | /* Sleep a while, then disable the master mute */ | ||
138 | sleep(HZ/8); | ||
139 | uda1380_write_reg(REG_MUTE, MUTE_CH2); | ||
140 | } else { | ||
141 | uda1380_write_reg(REG_MUTE, MUTE_MASTER); | ||
142 | uda1380_write_reg(REG_PWR, uda1380_regs[REG_PWR] & ~PON_HP); | ||
143 | } | ||
144 | } | ||
145 | |||
131 | /* Initialize UDA1380 codec with default register values (uda1380_defaults) */ | 146 | /* Initialize UDA1380 codec with default register values (uda1380_defaults) */ |
132 | int uda1380_init(void) | 147 | int uda1380_init(void) |
133 | { | 148 | { |
134 | if (uda1380_set_regs() == -1) | 149 | if (uda1380_set_regs() == -1) |
135 | return -1; | 150 | return -1; |
136 | 151 | ||
137 | /* Sleep a while, then power on headphone amp */ | ||
138 | sleep(HZ/8); | ||
139 | uda1380_write_reg(REG_PWR, uda1380_regs[REG_PWR] | PON_HP); | ||
140 | |||
141 | /* Sleep a little more, then disable the master mute */ | ||
142 | sleep(HZ/8); | ||
143 | uda1380_write_reg(REG_MUTE, MUTE_CH2); | ||
144 | |||
145 | return 0; | 152 | return 0; |
146 | } | 153 | } |
147 | 154 | ||
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 @@ | |||
27 | #define _UDA1380_H | 27 | #define _UDA1380_H |
28 | 28 | ||
29 | extern int uda1380_init(void); | 29 | extern int uda1380_init(void); |
30 | extern void uda1380_enable_output(bool enable); | ||
30 | extern int uda1380_setvol(int vol); | 31 | extern int uda1380_setvol(int vol); |
31 | extern int uda1380_mute(int mute); | 32 | extern int uda1380_mute(int mute); |
32 | extern void uda1380_close(void); | 33 | 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) | |||
116 | static void dma_stop(void) | 116 | static void dma_stop(void) |
117 | { | 117 | { |
118 | pcm_playing = false; | 118 | pcm_playing = false; |
119 | uda1380_enable_output(false); | ||
120 | pcm_boost(false); | ||
119 | 121 | ||
120 | /* Reset the FIFO */ | 122 | /* Reset the FIFO */ |
121 | IIS2CONFIG = 0x800; | 123 | IIS2CONFIG = 0x800; |
122 | pcm_boost(false); | ||
123 | } | 124 | } |
124 | 125 | ||
125 | /* set volume of the main channel */ | 126 | /* set volume of the main channel */ |
@@ -222,17 +223,23 @@ void pcm_play_data(const unsigned char* start, int size, | |||
222 | dma_start(start, size); | 223 | dma_start(start, size); |
223 | 224 | ||
224 | get_more(&next_start, &next_size); | 225 | get_more(&next_start, &next_size); |
226 | |||
227 | /* Sleep a while, then power on audio output */ | ||
228 | sleep(HZ/16); | ||
229 | uda1380_enable_output(true); | ||
225 | } | 230 | } |
226 | 231 | ||
227 | void pcm_play_stop(void) | 232 | void pcm_play_stop(void) |
228 | { | 233 | { |
229 | dma_stop(); | 234 | if (pcm_playing) |
235 | dma_stop(); | ||
236 | pcmbuf_unplayed_bytes = 0; | ||
237 | last_chunksize = 0; | ||
230 | audiobuffer_pos = 0; | 238 | audiobuffer_pos = 0; |
231 | audiobuffer_fillpos = 0; | 239 | audiobuffer_fillpos = 0; |
232 | audiobuffer_free = PCMBUF_SIZE; | 240 | audiobuffer_free = PCMBUF_SIZE; |
233 | pcmbuf_read_index = 0; | 241 | pcmbuf_read_index = 0; |
234 | pcmbuf_write_index = 0; | 242 | pcmbuf_write_index = 0; |
235 | pcmbuf_unplayed_bytes = 0; | ||
236 | next_start = NULL; | 243 | next_start = NULL; |
237 | next_size = 0; | 244 | next_size = 0; |
238 | pcm_set_boost_mode(false); | 245 | pcm_set_boost_mode(false); |
@@ -431,7 +438,7 @@ bool audiobuffer_insert(char *buf, size_t length) | |||
431 | if (!pcm_is_playing() && !pcm_paused) { | 438 | if (!pcm_is_playing() && !pcm_paused) { |
432 | pcm_boost(true); | 439 | pcm_boost(true); |
433 | crossfade_active = false; | 440 | crossfade_active = false; |
434 | if (audiobuffer_free < PCMBUF_SIZE - CHUNK_SIZE*2) | 441 | if (audiobuffer_free < PCMBUF_SIZE - CHUNK_SIZE*4) |
435 | pcm_play_start(); | 442 | pcm_play_start(); |
436 | } | 443 | } |
437 | 444 | ||
@@ -497,14 +504,6 @@ void pcm_play_init(void) | |||
497 | pcmbuf_unplayed_bytes = 0; | 504 | pcmbuf_unplayed_bytes = 0; |
498 | crossfade_enabled = false; | 505 | crossfade_enabled = false; |
499 | pcm_play_set_watermark(PCM_WATERMARK, pcm_watermark_callback); | 506 | pcm_play_set_watermark(PCM_WATERMARK, pcm_watermark_callback); |
500 | |||
501 | /* Play a small chunk of zeroes to initialize the playback system. */ | ||
502 | audiobuffer_pos = 32000; | ||
503 | audiobuffer_free -= audiobuffer_pos; | ||
504 | memset(&audiobuffer[0], 0, audiobuffer_pos); | ||
505 | pcm_play_add_chunk(&audiobuffer[0], audiobuffer_pos, NULL); | ||
506 | pcm_play_start(); | ||
507 | |||
508 | } | 507 | } |
509 | 508 | ||
510 | void pcm_crossfade_enable(bool on_off) | 509 | void pcm_crossfade_enable(bool on_off) |