summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/plugins/codecvorbis.c2
-rw-r--r--firmware/drivers/uda1380.c23
-rw-r--r--firmware/export/uda1380.h1
-rw-r--r--firmware/pcm_playback.c23
4 files changed, 28 insertions, 21 deletions
diff --git a/apps/plugins/codecvorbis.c b/apps/plugins/codecvorbis.c
index a1f39f0242..8e884714d0 100644
--- a/apps/plugins/codecvorbis.c
+++ b/apps/plugins/codecvorbis.c
@@ -105,7 +105,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parm)
105 #endif 105 #endif
106 106
107 ci->configure(CODEC_SET_FILEBUF_LIMIT, (int *)(1024*1024*2)); 107 ci->configure(CODEC_SET_FILEBUF_LIMIT, (int *)(1024*1024*2));
108 ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (int *)(1024*32)); 108 ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (int *)(1024*64));
109 109
110 /* We need to flush reserver memory every track load. */ 110 /* We need to flush reserver memory every track load. */
111 next_track: 111 next_track:
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 */
132void 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) */
132int uda1380_init(void) 147int 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
29extern int uda1380_init(void); 29extern int uda1380_init(void);
30extern void uda1380_enable_output(bool enable);
30extern int uda1380_setvol(int vol); 31extern int uda1380_setvol(int vol);
31extern int uda1380_mute(int mute); 32extern int uda1380_mute(int mute);
32extern void uda1380_close(void); 33extern 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)
116static void dma_stop(void) 116static 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
227void pcm_play_stop(void) 232void 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
510void pcm_crossfade_enable(bool on_off) 509void pcm_crossfade_enable(bool on_off)