summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/drivers/audio/rocker_codec.c2
-rw-r--r--firmware/export/fiiolinux_codec.h2
-rw-r--r--firmware/export/pcm-internal.h3
-rw-r--r--firmware/export/pcm.h2
-rw-r--r--firmware/export/rocker_codec.h2
-rw-r--r--firmware/export/xduoolinux_codec.h2
-rw-r--r--firmware/pcm.c53
-rw-r--r--firmware/pcm_sw_volume.c10
-rw-r--r--firmware/target/arm/as3525/pcm-as3525.c20
-rw-r--r--firmware/target/arm/imx233/pcm-imx233.c6
-rw-r--r--firmware/target/arm/imx31/gigabeat-s/pcm-gigabeat-s.c14
-rw-r--r--firmware/target/arm/pcm-telechips.c9
-rw-r--r--firmware/target/arm/pnx0101/pcm-pnx0101.c7
-rw-r--r--firmware/target/arm/pp/pcm-pp.c9
-rw-r--r--firmware/target/arm/rk27xx/pcm-rk27xx.c15
-rw-r--r--firmware/target/arm/s3c2440/gigabeat-fx/pcm-meg-fx.c18
-rw-r--r--firmware/target/arm/s3c2440/mini2440/pcm-mini2440.c18
-rw-r--r--firmware/target/arm/s5l8700/pcm-s5l8700.c12
-rw-r--r--firmware/target/arm/s5l8702/pcm-s5l8702.c7
-rw-r--r--firmware/target/arm/tms320dm320/creative-zvm/pcm-creativezvm.c5
-rw-r--r--firmware/target/arm/tms320dm320/mrobe-500/pcm-mr500.c14
-rw-r--r--firmware/target/arm/tms320dm320/sansa-connect/pcm-sansaconnect.c14
-rw-r--r--firmware/target/coldfire/pcm-coldfire.c19
-rw-r--r--firmware/target/hosted/android/pcm-android.c15
-rw-r--r--firmware/target/hosted/ibasso/pcm-ibasso.c16
-rw-r--r--firmware/target/hosted/maemo/pcm-gstreamer.c17
-rw-r--r--firmware/target/hosted/pcm-alsa.c32
-rw-r--r--firmware/target/hosted/sdl/pcm-sdl.c8
-rw-r--r--firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c12
-rw-r--r--firmware/target/mips/ingenic_jz47xx/pcm-jz4760.c12
30 files changed, 15 insertions, 360 deletions
diff --git a/firmware/drivers/audio/rocker_codec.c b/firmware/drivers/audio/rocker_codec.c
index 4beda4b572..b4ebdd7816 100644
--- a/firmware/drivers/audio/rocker_codec.c
+++ b/firmware/drivers/audio/rocker_codec.c
@@ -71,7 +71,7 @@ void audiohw_preinit(void)
71{ 71{
72 alsa_controls_init(); 72 alsa_controls_init();
73 hw_open(); 73 hw_open();
74#if defined(AUDIOHW_MUTE_ON_PAUSE) || defined (AUDIOHW_NEEDS_INITIAL_UNMUTE) 74#if defined(AUDIOHW_MUTE_ON_STOP) || defined(AUDIOHW_NEEDS_INITIAL_UNMUTE)
75 audiohw_mute(true); /* Start muted to avoid the POP */ 75 audiohw_mute(true); /* Start muted to avoid the POP */
76#else 76#else
77 audiohw_mute(false); 77 audiohw_mute(false);
diff --git a/firmware/export/fiiolinux_codec.h b/firmware/export/fiiolinux_codec.h
index 118a0928d7..5fa7ae2b10 100644
--- a/firmware/export/fiiolinux_codec.h
+++ b/firmware/export/fiiolinux_codec.h
@@ -7,6 +7,6 @@ AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -100, 0, -30)
7AUDIOHW_SETTING(FILTER_ROLL_OFF, "", 0, 1, 0, 4, 0) 7AUDIOHW_SETTING(FILTER_ROLL_OFF, "", 0, 1, 0, 4, 0)
8#endif 8#endif
9 9
10#define AUDIOHW_MUTE_ON_PAUSE 10#define AUDIOHW_MUTE_ON_STOP
11 11
12void audiohw_mute(int mute); 12void audiohw_mute(int mute);
diff --git a/firmware/export/pcm-internal.h b/firmware/export/pcm-internal.h
index 7670f99f04..d5d46c33e1 100644
--- a/firmware/export/pcm-internal.h
+++ b/firmware/export/pcm-internal.h
@@ -119,7 +119,6 @@ pcm_play_dma_status_callback(enum pcm_dma_status status)
119 119
120#if defined(HAVE_SW_VOLUME_CONTROL) && !defined(PCM_SW_VOLUME_UNBUFFERED) 120#if defined(HAVE_SW_VOLUME_CONTROL) && !defined(PCM_SW_VOLUME_UNBUFFERED)
121void pcm_play_dma_start_int(const void *addr, size_t size); 121void pcm_play_dma_start_int(const void *addr, size_t size);
122void pcm_play_dma_pause_int(bool pause);
123void pcm_play_dma_stop_int(void); 122void pcm_play_dma_stop_int(void);
124void pcm_play_stop_int(void); 123void pcm_play_stop_int(void);
125const void *pcm_play_dma_get_peak_buffer_int(int *count); 124const void *pcm_play_dma_get_peak_buffer_int(int *count);
@@ -139,7 +138,6 @@ void * pcm_dma_addr(void *addr);
139#endif 138#endif
140 139
141extern volatile bool pcm_playing; 140extern volatile bool pcm_playing;
142extern volatile bool pcm_paused;
143 141
144void pcm_play_dma_lock(void); 142void pcm_play_dma_lock(void);
145void pcm_play_dma_unlock(void); 143void pcm_play_dma_unlock(void);
@@ -147,7 +145,6 @@ void pcm_play_dma_init(void) INIT_ATTR;
147void pcm_play_dma_postinit(void); 145void pcm_play_dma_postinit(void);
148void pcm_play_dma_start(const void *addr, size_t size); 146void pcm_play_dma_start(const void *addr, size_t size);
149void pcm_play_dma_stop(void); 147void pcm_play_dma_stop(void);
150void pcm_play_dma_pause(bool pause);
151const void * pcm_play_dma_get_peak_buffer(int *count); 148const void * pcm_play_dma_get_peak_buffer(int *count);
152 149
153void pcm_dma_apply_settings(void); 150void pcm_dma_apply_settings(void);
diff --git a/firmware/export/pcm.h b/firmware/export/pcm.h
index 23c0bd4a0b..61e11ef801 100644
--- a/firmware/export/pcm.h
+++ b/firmware/export/pcm.h
@@ -90,8 +90,6 @@ const void* pcm_get_peak_buffer(int* count);
90size_t pcm_get_bytes_waiting(void); 90size_t pcm_get_bytes_waiting(void);
91 91
92void pcm_play_stop(void); 92void pcm_play_stop(void);
93void pcm_play_pause(bool play);
94bool pcm_is_paused(void);
95bool pcm_is_playing(void); 93bool pcm_is_playing(void);
96 94
97#ifdef HAVE_RECORDING 95#ifdef HAVE_RECORDING
diff --git a/firmware/export/rocker_codec.h b/firmware/export/rocker_codec.h
index c1ee7b87bc..9eb4954f0b 100644
--- a/firmware/export/rocker_codec.h
+++ b/firmware/export/rocker_codec.h
@@ -5,7 +5,7 @@
5AUDIOHW_SETTING(VOLUME, "dB", 1, 5, -115*10, 0, -30*10) 5AUDIOHW_SETTING(VOLUME, "dB", 1, 5, -115*10, 0, -30*10)
6#endif 6#endif
7 7
8//#define AUDIOHW_MUTE_ON_PAUSE 8//#define AUDIOHW_MUTE_ON_STOP
9//#define AUDIOHW_NEEDS_INITIAL_UNMUTE 9//#define AUDIOHW_NEEDS_INITIAL_UNMUTE
10 10
11/* Note: Due to Kernel bug, we can't use MUTE_ON_PAUSE with backlight fading */ 11/* Note: Due to Kernel bug, we can't use MUTE_ON_PAUSE with backlight fading */
diff --git a/firmware/export/xduoolinux_codec.h b/firmware/export/xduoolinux_codec.h
index 744be58e30..301a341f15 100644
--- a/firmware/export/xduoolinux_codec.h
+++ b/firmware/export/xduoolinux_codec.h
@@ -7,7 +7,7 @@ AUDIOHW_SETTING(FILTER_ROLL_OFF, "", 0, 1, 0, 4, 0)
7#endif 7#endif
8 8
9// We want this, but the codec takes over a second to unmute! 9// We want this, but the codec takes over a second to unmute!
10//#define AUDIOHW_MUTE_ON_PAUSE 10//#define AUDIOHW_MUTE_ON_STOP
11 11
12#if defined(XDUOO_X3II) 12#if defined(XDUOO_X3II)
13/* The AK4490 glitches when switching sample rates */ 13/* The AK4490 glitches when switching sample rates */
diff --git a/firmware/pcm.c b/firmware/pcm.c
index 640bb7830f..7a7043bef8 100644
--- a/firmware/pcm.c
+++ b/firmware/pcm.c
@@ -47,14 +47,12 @@
47 * pcm_play_dma_postinit 47 * pcm_play_dma_postinit
48 * pcm_play_dma_start 48 * pcm_play_dma_start
49 * pcm_play_dma_stop 49 * pcm_play_dma_stop
50 * pcm_play_dma_pause
51 * pcm_play_dma_get_peak_buffer 50 * pcm_play_dma_get_peak_buffer
52 * Data Read/Written within TSP - 51 * Data Read/Written within TSP -
53 * pcm_sampr (R) 52 * pcm_sampr (R)
54 * pcm_fsel (R) 53 * pcm_fsel (R)
55 * pcm_curr_sampr (R) 54 * pcm_curr_sampr (R)
56 * pcm_playing (R) 55 * pcm_playing (R)
57 * pcm_paused (R)
58 * 56 *
59 * ==Playback/Recording== 57 * ==Playback/Recording==
60 * Public - 58 * Public -
@@ -93,8 +91,6 @@ volatile pcm_status_callback_type
93 pcm_play_status_callback SHAREDBSS_ATTR = NULL; 91 pcm_play_status_callback SHAREDBSS_ATTR = NULL;
94/* PCM playback state */ 92/* PCM playback state */
95volatile bool pcm_playing SHAREDBSS_ATTR = false; 93volatile bool pcm_playing SHAREDBSS_ATTR = false;
96/* PCM paused state. paused implies playing */
97volatile bool pcm_paused SHAREDBSS_ATTR = false;
98/* samplerate of currently playing audio - undefined if stopped */ 94/* samplerate of currently playing audio - undefined if stopped */
99unsigned long pcm_curr_sampr SHAREDBSS_ATTR = 0; 95unsigned long pcm_curr_sampr SHAREDBSS_ATTR = 0;
100/* samplerate waiting to be set */ 96/* samplerate waiting to be set */
@@ -103,7 +99,6 @@ unsigned long pcm_sampr SHAREDBSS_ATTR = HW_SAMPR_DEFAULT;
103int pcm_fsel SHAREDBSS_ATTR = HW_FREQ_DEFAULT; 99int pcm_fsel SHAREDBSS_ATTR = HW_FREQ_DEFAULT;
104 100
105static void pcm_play_data_start_int(const void *addr, size_t size); 101static void pcm_play_data_start_int(const void *addr, size_t size);
106static void pcm_play_pause_int(bool play);
107void pcm_play_stop_int(void); 102void pcm_play_stop_int(void);
108 103
109#if !defined(HAVE_SW_VOLUME_CONTROL) || defined(PCM_SW_VOLUME_UNBUFFERED) 104#if !defined(HAVE_SW_VOLUME_CONTROL) || defined(PCM_SW_VOLUME_UNBUFFERED)
@@ -118,19 +113,6 @@ static inline void pcm_play_dma_start_int(const void *addr, size_t size)
118 pcm_play_dma_start(addr, size); 113 pcm_play_dma_start(addr, size);
119} 114}
120 115
121static inline void pcm_play_dma_pause_int(bool pause)
122{
123 if (pause || pcm_get_bytes_waiting() > 0)
124 {
125 pcm_play_dma_pause(pause);
126 }
127 else
128 {
129 logf(" no data");
130 pcm_play_data_start_int(NULL, 0);
131 }
132}
133
134static inline void pcm_play_dma_stop_int(void) 116static inline void pcm_play_dma_stop_int(void)
135{ 117{
136 pcm_play_dma_stop(); 118 pcm_play_dma_stop();
@@ -167,7 +149,6 @@ static void pcm_play_data_start_int(const void *addr, size_t size)
167 logf(" pcm_play_dma_start_int"); 149 logf(" pcm_play_dma_start_int");
168 pcm_play_dma_start_int(addr, size); 150 pcm_play_dma_start_int(addr, size);
169 pcm_playing = true; 151 pcm_playing = true;
170 pcm_paused = false;
171 } 152 }
172 else 153 else
173 { 154 {
@@ -177,22 +158,11 @@ static void pcm_play_data_start_int(const void *addr, size_t size)
177 } 158 }
178} 159}
179 160
180static void pcm_play_pause_int(bool play)
181{
182 if (play)
183 pcm_apply_settings();
184
185 logf(" pcm_play_dma_pause_int");
186 pcm_play_dma_pause_int(!play);
187 pcm_paused = !play && pcm_playing;
188}
189
190void pcm_play_stop_int(void) 161void pcm_play_stop_int(void)
191{ 162{
192 pcm_play_dma_stop_int(); 163 pcm_play_dma_stop_int();
193 pcm_callback_for_more = NULL; 164 pcm_callback_for_more = NULL;
194 pcm_play_status_callback = NULL; 165 pcm_play_status_callback = NULL;
195 pcm_paused = false;
196 pcm_playing = false; 166 pcm_playing = false;
197} 167}
198 168
@@ -282,8 +252,7 @@ void pcm_calculate_peaks(int *left, int *right)
282 int count; 252 int count;
283 const void *addr = pcm_play_dma_get_peak_buffer_int(&count); 253 const void *addr = pcm_play_dma_get_peak_buffer_int(&count);
284 254
285 pcm_do_peak_calculation(&peaks, pcm_playing && !pcm_paused, 255 pcm_do_peak_calculation(&peaks, pcm_playing, addr, count);
286 addr, count);
287 256
288 if (left) 257 if (left)
289 *left = peaks.left; 258 *left = peaks.left;
@@ -302,11 +271,6 @@ bool pcm_is_playing(void)
302 return pcm_playing; 271 return pcm_playing;
303} 272}
304 273
305bool pcm_is_paused(void)
306{
307 return pcm_paused;
308}
309
310/**************************************************************************** 274/****************************************************************************
311 * Functions that do not require targeted implementation but only a targeted 275 * Functions that do not require targeted implementation but only a targeted
312 * interface 276 * interface
@@ -358,21 +322,6 @@ void pcm_play_data(pcm_play_callback_type get_more,
358 pcm_play_unlock(); 322 pcm_play_unlock();
359} 323}
360 324
361void pcm_play_pause(bool play)
362{
363 logf("pcm_play_pause: %s", play ? "play" : "pause");
364
365 pcm_play_lock();
366
367 if (play == pcm_paused && pcm_playing)
368 {
369 logf(" pcm_play_pause_int");
370 pcm_play_pause_int(play);
371 }
372
373 pcm_play_unlock();
374}
375
376void pcm_play_stop(void) 325void pcm_play_stop(void)
377{ 326{
378 logf("pcm_play_stop"); 327 logf("pcm_play_stop");
diff --git a/firmware/pcm_sw_volume.c b/firmware/pcm_sw_volume.c
index 8b6c9220fd..e972896321 100644
--- a/firmware/pcm_sw_volume.c
+++ b/firmware/pcm_sw_volume.c
@@ -278,16 +278,6 @@ void pcm_play_dma_start_int(const void *addr, size_t size)
278 start_pcm(true); 278 start_pcm(true);
279} 279}
280 280
281void pcm_play_dma_pause_int(bool pause)
282{
283 if (pause)
284 pcm_play_dma_pause(true);
285 else if (src_buf_rem)
286 start_pcm(false); /* Reprocess in case volume level changed */
287 else
288 pcm_play_stop_int(); /* Playing frame was last frame */
289}
290
291void pcm_play_dma_stop_int(void) 281void pcm_play_dma_stop_int(void)
292{ 282{
293 pcm_play_dma_stop(); 283 pcm_play_dma_stop();
diff --git a/firmware/target/arm/as3525/pcm-as3525.c b/firmware/target/arm/as3525/pcm-as3525.c
index ddb4d86bd4..90b6aabd7c 100644
--- a/firmware/target/arm/as3525/pcm-as3525.c
+++ b/firmware/target/arm/as3525/pcm-as3525.c
@@ -152,26 +152,6 @@ void pcm_play_dma_stop(void)
152 play_callback_pending = false; 152 play_callback_pending = false;
153} 153}
154 154
155void pcm_play_dma_pause(bool pause)
156{
157 is_playing = !pause;
158
159 if(pause)
160 {
161 dma_pause_channel(0);
162
163 /* if producer's buffer finished, upper layer starts anew */
164 if (dma_rem_size == 0)
165 play_callback_pending = false;
166 }
167 else
168 {
169 if (play_sub_size != 0)
170 dma_resume_channel(0);
171 /* else unlock calls the callback if sub buffers remain */
172 }
173}
174
175void pcm_play_dma_init(void) 155void pcm_play_dma_init(void)
176{ 156{
177 bitset32(&CGU_PERI, CGU_I2SOUT_APB_CLOCK_ENABLE); 157 bitset32(&CGU_PERI, CGU_I2SOUT_APB_CLOCK_ENABLE);
diff --git a/firmware/target/arm/imx233/pcm-imx233.c b/firmware/target/arm/imx233/pcm-imx233.c
index de0e1aabf5..7e20a7ce68 100644
--- a/firmware/target/arm/imx233/pcm-imx233.c
+++ b/firmware/target/arm/imx233/pcm-imx233.c
@@ -149,12 +149,6 @@ void pcm_play_dma_start(const void *addr, size_t size)
149 pcm_play_unlock(); 149 pcm_play_unlock();
150} 150}
151 151
152void pcm_play_dma_pause(bool pause)
153{
154 imx233_dma_freeze_channel(APB_AUDIO_DAC, pause);
155 dac_freezed = pause;
156}
157
158void pcm_play_dma_init(void) 152void pcm_play_dma_init(void)
159{ 153{
160 audiohw_preinit(); 154 audiohw_preinit();
diff --git a/firmware/target/arm/imx31/gigabeat-s/pcm-gigabeat-s.c b/firmware/target/arm/imx31/gigabeat-s/pcm-gigabeat-s.c
index 7304bdcff3..72d8e4a021 100644
--- a/firmware/target/arm/imx31/gigabeat-s/pcm-gigabeat-s.c
+++ b/firmware/target/arm/imx31/gigabeat-s/pcm-gigabeat-s.c
@@ -224,20 +224,6 @@ void pcm_play_dma_stop(void)
224 play_stop_pcm(); 224 play_stop_pcm();
225} 225}
226 226
227void pcm_play_dma_pause(bool pause)
228{
229 if (pause)
230 {
231 sdma_channel_pause(DMA_PLAY_CH_NUM);
232 play_stop_pcm();
233 }
234 else
235 {
236 play_start_pcm();
237 sdma_channel_run(DMA_PLAY_CH_NUM);
238 }
239}
240
241/* Return the number of bytes waiting - full L-R sample pairs only */ 227/* Return the number of bytes waiting - full L-R sample pairs only */
242size_t pcm_get_bytes_waiting(void) 228size_t pcm_get_bytes_waiting(void)
243{ 229{
diff --git a/firmware/target/arm/pcm-telechips.c b/firmware/target/arm/pcm-telechips.c
index ddd69088cf..9c64b58594 100644
--- a/firmware/target/arm/pcm-telechips.c
+++ b/firmware/target/arm/pcm-telechips.c
@@ -194,15 +194,6 @@ void pcm_play_unlock(void)
194 restore_fiq(status); 194 restore_fiq(status);
195} 195}
196 196
197void pcm_play_dma_pause(bool pause)
198{
199 if (pause) {
200 play_stop_pcm();
201 } else {
202 play_start_pcm();
203 }
204}
205
206size_t pcm_get_bytes_waiting(void) 197size_t pcm_get_bytes_waiting(void)
207{ 198{
208 return dma_play_data.size & ~3; 199 return dma_play_data.size & ~3;
diff --git a/firmware/target/arm/pnx0101/pcm-pnx0101.c b/firmware/target/arm/pnx0101/pcm-pnx0101.c
index a2394bc355..01ead4723b 100644
--- a/firmware/target/arm/pnx0101/pcm-pnx0101.c
+++ b/firmware/target/arm/pnx0101/pcm-pnx0101.c
@@ -49,11 +49,6 @@ void pcm_play_dma_stop(void)
49{ 49{
50} 50}
51 51
52void pcm_play_dma_pause(bool pause)
53{
54 (void)pause;
55}
56
57static inline void fill_dma_buf(int offset) 52static inline void fill_dma_buf(int offset)
58{ 53{
59 short *l, *r, *lend; 54 short *l, *r, *lend;
@@ -62,7 +57,7 @@ static inline void fill_dma_buf(int offset)
62 lend = l + DMA_BUF_SAMPLES / 2; 57 lend = l + DMA_BUF_SAMPLES / 2;
63 r = dma_buf_right + offset; 58 r = dma_buf_right + offset;
64 59
65 if (pcm_playing && !pcm_paused) 60 if (pcm_playing)
66 { 61 {
67 bool new_buffer =false; 62 bool new_buffer =false;
68 63
diff --git a/firmware/target/arm/pp/pcm-pp.c b/firmware/target/arm/pp/pcm-pp.c
index 99d46a6096..91d567ee83 100644
--- a/firmware/target/arm/pp/pcm-pp.c
+++ b/firmware/target/arm/pp/pcm-pp.c
@@ -497,15 +497,6 @@ void pcm_play_dma_stop(void)
497#endif 497#endif
498} 498}
499 499
500void pcm_play_dma_pause(bool pause)
501{
502 if (pause) {
503 play_stop_pcm();
504 } else {
505 play_start_pcm();
506 }
507}
508
509size_t pcm_get_bytes_waiting(void) 500size_t pcm_get_bytes_waiting(void)
510{ 501{
511 return dma_play_data.size & ~3; 502 return dma_play_data.size & ~3;
diff --git a/firmware/target/arm/rk27xx/pcm-rk27xx.c b/firmware/target/arm/rk27xx/pcm-rk27xx.c
index 21feaf6cc4..5cfe54f9de 100644
--- a/firmware/target/arm/rk27xx/pcm-rk27xx.c
+++ b/firmware/target/arm/rk27xx/pcm-rk27xx.c
@@ -114,21 +114,6 @@ void pcm_play_dma_start(const void *addr, size_t size)
114 hdma_i2s_transfer(addr, size); 114 hdma_i2s_transfer(addr, size);
115} 115}
116 116
117/* pause DMA transfer by disabling clock to DMA module */
118void pcm_play_dma_pause(bool pause)
119{
120 if(pause)
121 {
122 SCU_CLKCFG |= CLKCFG_HDMA;
123 locked = 1;
124 }
125 else
126 {
127 SCU_CLKCFG &= ~CLKCFG_HDMA;
128 locked = 0;
129 }
130}
131
132static void i2s_init(void) 117static void i2s_init(void)
133{ 118{
134#if defined(HAVE_RK27XX_CODEC) 119#if defined(HAVE_RK27XX_CODEC)
diff --git a/firmware/target/arm/s3c2440/gigabeat-fx/pcm-meg-fx.c b/firmware/target/arm/s3c2440/gigabeat-fx/pcm-meg-fx.c
index a1c854a0df..da5dc9cdd5 100644
--- a/firmware/target/arm/s3c2440/gigabeat-fx/pcm-meg-fx.c
+++ b/firmware/target/arm/s3c2440/gigabeat-fx/pcm-meg-fx.c
@@ -195,24 +195,6 @@ void pcm_play_dma_stop(void)
195 bitclr32(&CLKCON, 1<<17); 195 bitclr32(&CLKCON, 1<<17);
196} 196}
197 197
198void pcm_play_dma_pause(bool pause)
199{
200 if (pause)
201 {
202 /* pause playback on current buffer */
203 play_stop_pcm();
204 }
205 else
206 {
207 /* restart playback on current buffer */
208 /* make sure we're aligned on left channel - skip any right
209 channel sample left waiting */
210 DISRC2 = (DCSRC2 + 2) & ~0x3;
211 DCON2 = DMA_CONTROL_SETUP | (DSTAT2 & 0xFFFFE);
212 play_start_pcm();
213 }
214}
215
216void fiq_handler(void) 198void fiq_handler(void)
217{ 199{
218 static const void *start; 200 static const void *start;
diff --git a/firmware/target/arm/s3c2440/mini2440/pcm-mini2440.c b/firmware/target/arm/s3c2440/mini2440/pcm-mini2440.c
index 943cbb2ade..dbb1a06809 100644
--- a/firmware/target/arm/s3c2440/mini2440/pcm-mini2440.c
+++ b/firmware/target/arm/s3c2440/mini2440/pcm-mini2440.c
@@ -235,24 +235,6 @@ void pcm_play_dma_stop(void)
235 bitclr32(&CLKCON, 1<<17); 235 bitclr32(&CLKCON, 1<<17);
236} 236}
237 237
238void pcm_play_dma_pause(bool pause)
239{
240 if (pause)
241 {
242 /* pause playback on current buffer */
243 play_stop_pcm();
244 }
245 else
246 {
247 /* restart playback on current buffer */
248 /* make sure we're aligned on left channel - skip any right
249 channel sample left waiting */
250 DISRC2 = (DCSRC2 + 2) & ~0x3;
251 DCON2 = DMA_CONTROL_SETUP | (DSTAT2 & 0xFFFFE);
252 play_start_pcm();
253 }
254}
255
256void fiq_handler(void) 238void fiq_handler(void)
257{ 239{
258 static const void *start; 240 static const void *start;
diff --git a/firmware/target/arm/s5l8700/pcm-s5l8700.c b/firmware/target/arm/s5l8700/pcm-s5l8700.c
index d8387c2aa5..47525611ee 100644
--- a/firmware/target/arm/s5l8700/pcm-s5l8700.c
+++ b/firmware/target/arm/s5l8700/pcm-s5l8700.c
@@ -35,7 +35,6 @@
35/* Driver for the IIS/PCM part of the s5l8700 using DMA 35/* Driver for the IIS/PCM part of the s5l8700 using DMA
36 36
37 Notes: 37 Notes:
38 - pcm_play_dma_pause is untested, not sure if implemented the right way
39 - pcm_play_dma_stop is untested, not sure if implemented the right way 38 - pcm_play_dma_stop is untested, not sure if implemented the right way
40 - recording is not implemented 39 - recording is not implemented
41*/ 40*/
@@ -173,17 +172,6 @@ void pcm_play_dma_stop(void)
173 (0 << 0); /* 0 = LRCK on */ 172 (0 << 0); /* 0 = LRCK on */
174} 173}
175 174
176/* pause playback by disabling the I2S interface */
177void pcm_play_dma_pause(bool pause)
178{
179 if (pause) {
180 I2STXCOM |= (1 << 0); /* LRCK off */
181 }
182 else {
183 I2STXCOM &= ~(1 << 0); /* LRCK on */
184 }
185}
186
187static void pcm_dma_set_freq(enum hw_freq_indexes idx) 175static void pcm_dma_set_freq(enum hw_freq_indexes idx)
188{ 176{
189 struct div_entry div = div_table[idx]; 177 struct div_entry div = div_table[idx];
diff --git a/firmware/target/arm/s5l8702/pcm-s5l8702.c b/firmware/target/arm/s5l8702/pcm-s5l8702.c
index 86a0edd54a..a62a7243a2 100644
--- a/firmware/target/arm/s5l8702/pcm-s5l8702.c
+++ b/firmware/target/arm/s5l8702/pcm-s5l8702.c
@@ -157,13 +157,6 @@ void pcm_play_dma_stop(void)
157 I2STXCOM = 0xa; 157 I2STXCOM = 0xa;
158} 158}
159 159
160/* pause playback by disabling LRCK */
161void pcm_play_dma_pause(bool pause)
162{
163 if (pause) I2STXCOM |= 1;
164 else I2STXCOM &= ~1;
165}
166
167/* MCLK = 12MHz (MCLKDIV2=1), [CS42L55 DS, s4.8] */ 160/* MCLK = 12MHz (MCLKDIV2=1), [CS42L55 DS, s4.8] */
168#define MCLK_FREQ 12000000 161#define MCLK_FREQ 12000000
169 162
diff --git a/firmware/target/arm/tms320dm320/creative-zvm/pcm-creativezvm.c b/firmware/target/arm/tms320dm320/creative-zvm/pcm-creativezvm.c
index 1fda5fe045..f31185c2ea 100644
--- a/firmware/target/arm/tms320dm320/creative-zvm/pcm-creativezvm.c
+++ b/firmware/target/arm/tms320dm320/creative-zvm/pcm-creativezvm.c
@@ -85,11 +85,6 @@ void pcm_play_unlock(void)
85 85
86} 86}
87 87
88void pcm_play_dma_pause(bool pause)
89{
90 (void) pause;
91}
92
93size_t pcm_get_bytes_waiting(void) 88size_t pcm_get_bytes_waiting(void)
94{ 89{
95 return 0; 90 return 0;
diff --git a/firmware/target/arm/tms320dm320/mrobe-500/pcm-mr500.c b/firmware/target/arm/tms320dm320/mrobe-500/pcm-mr500.c
index d23c93de39..0d7bcbab37 100644
--- a/firmware/target/arm/tms320dm320/mrobe-500/pcm-mr500.c
+++ b/firmware/target/arm/tms320dm320/mrobe-500/pcm-mr500.c
@@ -120,20 +120,6 @@ void pcm_play_unlock(void)
120 120
121} 121}
122 122
123void pcm_play_dma_pause(bool pause)
124{
125 if (pause)
126 {
127 DSP_(_dma0_stopped)=2;
128 dsp_wake();
129 }
130 else
131 {
132 DSP_(_dma0_stopped)=0;
133 dsp_wake();
134 }
135}
136
137size_t pcm_get_bytes_waiting(void) 123size_t pcm_get_bytes_waiting(void)
138{ 124{
139 return DSP_(_sdem_dsp_size)-DSP_(_sdem_level); 125 return DSP_(_sdem_dsp_size)-DSP_(_sdem_level);
diff --git a/firmware/target/arm/tms320dm320/sansa-connect/pcm-sansaconnect.c b/firmware/target/arm/tms320dm320/sansa-connect/pcm-sansaconnect.c
index 6e640bdf12..c2932fd762 100644
--- a/firmware/target/arm/tms320dm320/sansa-connect/pcm-sansaconnect.c
+++ b/firmware/target/arm/tms320dm320/sansa-connect/pcm-sansaconnect.c
@@ -127,20 +127,6 @@ void pcm_play_unlock(void)
127 127
128} 128}
129 129
130void pcm_play_dma_pause(bool pause)
131{
132 if (pause)
133 {
134 DSP_(_dma0_stopped)=2;
135 dsp_wake();
136 }
137 else
138 {
139 DSP_(_dma0_stopped)=0;
140 dsp_wake();
141 }
142}
143
144size_t pcm_get_bytes_waiting(void) 130size_t pcm_get_bytes_waiting(void)
145{ 131{
146 return DSP_(_sdem_dsp_size)-DSP_(_sdem_level); 132 return DSP_(_sdem_dsp_size)-DSP_(_sdem_level);
diff --git a/firmware/target/coldfire/pcm-coldfire.c b/firmware/target/coldfire/pcm-coldfire.c
index 8162f521f9..10f9ea931f 100644
--- a/firmware/target/coldfire/pcm-coldfire.c
+++ b/firmware/target/coldfire/pcm-coldfire.c
@@ -264,25 +264,6 @@ void pcm_play_dma_stop(void)
264 dma_play_lock.state = (1 << 14); 264 dma_play_lock.state = (1 << 14);
265} /* pcm_play_dma_stop */ 265} /* pcm_play_dma_stop */
266 266
267void pcm_play_dma_pause(bool pause)
268{
269 if (pause)
270 {
271 /* pause playback on current buffer */
272 and_l(~(DMA_EEXT | DMA_INT), &DCR0); /* per request and int OFF */
273 DSR0 = 1; /* stop channel */
274 iis_play_reset_if_playback(true);
275 dma_play_lock.state = (1 << 14);
276 }
277 else
278 {
279 /* restart playback on current buffer */
280 iis_play_reset_if_playback(true);
281 or_l(DMA_INT | DMA_EEXT | DMA_START, &DCR0); /* everything ON */
282 dma_play_lock.state = (0 << 14);
283 }
284} /* pcm_play_dma_pause */
285
286size_t pcm_get_bytes_waiting(void) 267size_t pcm_get_bytes_waiting(void)
287{ 268{
288 return BCR0 & 0xffffff; 269 return BCR0 & 0xffffff;
diff --git a/firmware/target/hosted/android/pcm-android.c b/firmware/target/hosted/android/pcm-android.c
index 23a003ff73..69fd06c6f7 100644
--- a/firmware/target/hosted/android/pcm-android.c
+++ b/firmware/target/hosted/android/pcm-android.c
@@ -153,8 +153,11 @@ void pcm_play_dma_start(const void *addr, size_t size)
153{ 153{
154 pcm_data_start = addr; 154 pcm_data_start = addr;
155 pcm_data_size = size; 155 pcm_data_size = size;
156 156
157 pcm_play_dma_pause(false); 157 (*env_ptr)->CallVoidMethod(env_ptr,
158 RockboxPCM_instance,
159 play_pause_method,
160 (int)pause);
158} 161}
159 162
160void pcm_play_dma_stop(void) 163void pcm_play_dma_stop(void)
@@ -168,14 +171,6 @@ void pcm_play_dma_stop(void)
168 stop_method); 171 stop_method);
169} 172}
170 173
171void pcm_play_dma_pause(bool pause)
172{
173 (*env_ptr)->CallVoidMethod(env_ptr,
174 RockboxPCM_instance,
175 play_pause_method,
176 (int)pause);
177}
178
179size_t pcm_get_bytes_waiting(void) 174size_t pcm_get_bytes_waiting(void)
180{ 175{
181 return pcm_data_size; 176 return pcm_data_size;
diff --git a/firmware/target/hosted/ibasso/pcm-ibasso.c b/firmware/target/hosted/ibasso/pcm-ibasso.c
index 4721501d25..edfdc6d592 100644
--- a/firmware/target/hosted/ibasso/pcm-ibasso.c
+++ b/firmware/target/hosted/ibasso/pcm-ibasso.c
@@ -364,22 +364,6 @@ void pcm_play_dma_start(const void *addr, size_t size)
364 pthread_mutex_unlock(&_dma_suspended_mtx); 364 pthread_mutex_unlock(&_dma_suspended_mtx);
365} 365}
366 366
367
368/* TODO: Why is this in the API if it gets never called? */
369void pcm_play_dma_pause(bool pause)
370{
371 TRACE;
372
373 pthread_mutex_lock(&_dma_suspended_mtx);
374 _dma_stopped = pause ? 1 : 0;
375 if(_dma_stopped == 0)
376 {
377 pthread_cond_signal(&_dma_suspended_cond);
378 }
379 pthread_mutex_unlock(&_dma_suspended_mtx);
380}
381
382
383void pcm_play_dma_stop(void) 367void pcm_play_dma_stop(void)
384{ 368{
385 TRACE; 369 TRACE;
diff --git a/firmware/target/hosted/maemo/pcm-gstreamer.c b/firmware/target/hosted/maemo/pcm-gstreamer.c
index bd264fe5d3..7c864738ef 100644
--- a/firmware/target/hosted/maemo/pcm-gstreamer.c
+++ b/firmware/target/hosted/maemo/pcm-gstreamer.c
@@ -154,23 +154,6 @@ void pcm_play_dma_stop(void)
154 gst_element_set_state (GST_ELEMENT(gst_pipeline), GST_STATE_NULL); 154 gst_element_set_state (GST_ELEMENT(gst_pipeline), GST_STATE_NULL);
155} 155}
156 156
157void pcm_play_dma_pause(bool pause)
158{
159 if (inside_feed_data)
160 {
161 if (pause)
162 g_signal_emit_by_name (gst_appsrc, "end-of-stream", NULL);
163 else
164 DEBUGF("ERROR: Called dma_pause(0) while inside feed_data\n");
165 } else
166 {
167 if (pause)
168 gst_element_set_state (GST_ELEMENT(gst_pipeline), GST_STATE_NULL);
169 else
170 gst_element_set_state (GST_ELEMENT(gst_pipeline), GST_STATE_PLAYING);
171 }
172}
173
174size_t pcm_get_bytes_waiting(void) 157size_t pcm_get_bytes_waiting(void)
175{ 158{
176 return pcm_data_size; 159 return pcm_data_size;
diff --git a/firmware/target/hosted/pcm-alsa.c b/firmware/target/hosted/pcm-alsa.c
index eb1f764791..939a0cabb5 100644
--- a/firmware/target/hosted/pcm-alsa.c
+++ b/firmware/target/hosted/pcm-alsa.c
@@ -489,7 +489,7 @@ static void close_hwdev(void)
489 489
490 if (handle) { 490 if (handle) {
491 snd_pcm_drain(handle); 491 snd_pcm_drain(handle);
492#ifdef AUDIOHW_MUTE_ON_PAUSE 492#ifdef AUDIOHW_MUTE_ON_STOP
493 audiohw_mute(true); 493 audiohw_mute(true);
494#endif 494#endif
495 if (ahandler) { 495 if (ahandler) {
@@ -634,20 +634,6 @@ void pcm_dma_apply_settings(void)
634 pcm_play_unlock(); 634 pcm_play_unlock();
635} 635}
636 636
637void pcm_play_dma_pause(bool pause)
638{
639 logf("PCM DMA pause %d", pause);
640 if (!handle) return;
641
642#ifdef AUDIOHW_MUTE_ON_PAUSE
643 if (pause) audiohw_mute(true);
644#endif
645 snd_pcm_pause(handle, pause);
646#ifdef AUDIOHW_MUTE_ON_PAUSE
647 if (!pause) audiohw_mute(false);
648#endif
649}
650
651void pcm_play_dma_stop(void) 637void pcm_play_dma_stop(void)
652{ 638{
653 logf("PCM DMA stop (%d)", snd_pcm_state(handle)); 639 logf("PCM DMA stop (%d)", snd_pcm_state(handle));
@@ -656,7 +642,7 @@ void pcm_play_dma_stop(void)
656 if (err < 0) 642 if (err < 0)
657 if (err < 0) 643 if (err < 0)
658 logf("Drain failed: %s", snd_strerror(err)); 644 logf("Drain failed: %s", snd_strerror(err));
659#ifdef AUDIOHW_MUTE_ON_PAUSE 645#ifdef AUDIOHW_MUTE_ON_STOP
660 audiohw_mute(true); 646 audiohw_mute(true);
661#endif 647#endif
662} 648}
@@ -669,7 +655,7 @@ void pcm_play_dma_start(const void *addr, size_t size)
669 pcm_data = addr; 655 pcm_data = addr;
670 pcm_size = size; 656 pcm_size = size;
671 657
672#if !defined(AUDIOHW_MUTE_ON_PAUSE) && defined(AUDIOHW_MUTE_ON_SRATE_CHANGE) 658#if !defined(AUDIOHW_MUTE_ON_STOP) && defined(AUDIOHW_MUTE_ON_SRATE_CHANGE)
673 audiohw_mute(false); 659 audiohw_mute(false);
674#endif 660#endif
675 661
@@ -681,7 +667,7 @@ void pcm_play_dma_start(const void *addr, size_t size)
681 switch (state) 667 switch (state)
682 { 668 {
683 case SND_PCM_STATE_RUNNING: 669 case SND_PCM_STATE_RUNNING:
684#if defined(AUDIOHW_MUTE_ON_PAUSE) 670#if defined(AUDIOHW_MUTE_ON_STOP)
685 audiohw_mute(false); 671 audiohw_mute(false);
686#endif 672#endif
687 return; 673 return;
@@ -740,11 +726,6 @@ void pcm_play_dma_start(const void *addr, size_t size)
740 726
741 break; 727 break;
742 } 728 }
743 case SND_PCM_STATE_PAUSED:
744 { /* paused, simply resume */
745 pcm_play_dma_pause(0);
746 return;
747 }
748 case SND_PCM_STATE_DRAINING: 729 case SND_PCM_STATE_DRAINING:
749 /* run until drained */ 730 /* run until drained */
750 continue; 731 continue;
@@ -850,11 +831,6 @@ void pcm_rec_dma_start(void *start, size_t size)
850 panicf("Start error: %s", snd_strerror(err)); 831 panicf("Start error: %s", snd_strerror(err));
851 return; 832 return;
852 } 833 }
853 case SND_PCM_STATE_PAUSED:
854 { /* paused, simply resume */
855 pcm_play_dma_pause(0);
856 return;
857 }
858 case SND_PCM_STATE_DRAINING: 834 case SND_PCM_STATE_DRAINING:
859 /* run until drained */ 835 /* run until drained */
860 continue; 836 continue;
diff --git a/firmware/target/hosted/sdl/pcm-sdl.c b/firmware/target/hosted/sdl/pcm-sdl.c
index 877ca5a482..ba43ece543 100644
--- a/firmware/target/hosted/sdl/pcm-sdl.c
+++ b/firmware/target/hosted/sdl/pcm-sdl.c
@@ -124,14 +124,6 @@ void pcm_play_dma_stop(void)
124#endif 124#endif
125} 125}
126 126
127void pcm_play_dma_pause(bool pause)
128{
129 if (pause)
130 SDL_PauseAudio(1);
131 else
132 SDL_PauseAudio(0);
133}
134
135size_t pcm_get_bytes_waiting(void) 127size_t pcm_get_bytes_waiting(void)
136{ 128{
137 return pcm_data_size; 129 return pcm_data_size;
diff --git a/firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c b/firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c
index ef2597ae69..1ce0b5ad5f 100644
--- a/firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c
+++ b/firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c
@@ -184,18 +184,6 @@ void pcm_play_unlock(void)
184 restore_irq(flags); 184 restore_irq(flags);
185} 185}
186 186
187void pcm_play_dma_pause(bool pause)
188{
189 int flags = disable_irq_save();
190
191 if(pause)
192 REG_DMAC_DCCSR(DMA_AIC_TX_CHANNEL) &= ~DMAC_DCCSR_EN;
193 else
194 REG_DMAC_DCCSR(DMA_AIC_TX_CHANNEL) |= DMAC_DCCSR_EN;
195
196 restore_irq(flags);
197}
198
199static int get_dma_count(void) 187static int get_dma_count(void)
200{ 188{
201 int count = REG_DMAC_DTCR(DMA_AIC_TX_CHANNEL); 189 int count = REG_DMAC_DTCR(DMA_AIC_TX_CHANNEL);
diff --git a/firmware/target/mips/ingenic_jz47xx/pcm-jz4760.c b/firmware/target/mips/ingenic_jz47xx/pcm-jz4760.c
index 098c28ecf5..4a4f3020bb 100644
--- a/firmware/target/mips/ingenic_jz47xx/pcm-jz4760.c
+++ b/firmware/target/mips/ingenic_jz47xx/pcm-jz4760.c
@@ -173,18 +173,6 @@ void pcm_play_unlock(void)
173 restore_irq(flags); 173 restore_irq(flags);
174} 174}
175 175
176void pcm_play_dma_pause(bool pause)
177{
178 int flags = disable_irq_save();
179
180 if(pause)
181 REG_DMAC_DCCSR(DMA_AIC_TX_CHANNEL) &= ~DMAC_DCCSR_EN;
182 else
183 REG_DMAC_DCCSR(DMA_AIC_TX_CHANNEL) |= DMAC_DCCSR_EN;
184
185 restore_irq(flags);
186}
187
188static int get_dma_count(void) 176static int get_dma_count(void)
189{ 177{
190 int count = REG_DMAC_DTCR(DMA_AIC_TX_CHANNEL); 178 int count = REG_DMAC_DTCR(DMA_AIC_TX_CHANNEL);