summaryrefslogtreecommitdiff
path: root/firmware/export/pcm-internal.h
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2011-06-29 06:37:04 +0000
committerMichael Sevakis <jethead71@rockbox.org>2011-06-29 06:37:04 +0000
commita2b6703a369f6cdbfec1f150c408dadc877631fb (patch)
tree3145a8c1372c44711d38feefeba39c7d4098f139 /firmware/export/pcm-internal.h
parent8411614b8a068a4f274c3841aa55aab1df1bc246 (diff)
downloadrockbox-a2b6703a369f6cdbfec1f150c408dadc877631fb.tar.gz
rockbox-a2b6703a369f6cdbfec1f150c408dadc877631fb.zip
Commit FS#12150 - Fully-functional audio mixer - and finally whip old limitations about playback of voice and other sounds when paused. Channels are independent in state and amplitude. Fade on stop/pause is handled by the channel's volume control rather than global volume which means it now works from anywhere. Opens up the possibility of plugin sounds during music playback by merely adding an additional channel enum. If any PCM drivers were not properly modified, see one of the last comments in the task for a description of the simple change that is expected. Some params are tunable in firmware/export/pcm-mixer.h as well.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30097 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/export/pcm-internal.h')
-rw-r--r--firmware/export/pcm-internal.h81
1 files changed, 81 insertions, 0 deletions
diff --git a/firmware/export/pcm-internal.h b/firmware/export/pcm-internal.h
new file mode 100644
index 0000000000..d69138f534
--- /dev/null
+++ b/firmware/export/pcm-internal.h
@@ -0,0 +1,81 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2005 by Linus Nielsen Feltzing
11 * Copyright (C) 2011 by Michael Sevakis
12 *
13 * This program is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU General Public License
15 * as published by the Free Software Foundation; either version 2
16 * of the License, or (at your option) any later version.
17 *
18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19 * KIND, either express or implied.
20 *
21 ****************************************************************************/
22#ifndef PCM_INTERNAL_H
23#define PCM_INTERNAL_H
24
25/** The following are for internal use between pcm.c and target-
26 specific portion **/
27
28/* Called by the bottom layer ISR when more data is needed. Returns non-
29 * zero size if more data is to be played. Setting start to NULL
30 * forces stop. */
31void pcm_play_get_more_callback(void **start, size_t *size);
32
33/* Called by the bottom layer ISR after next transfer has begun in order
34 to fill more data for next "get more" callback to implement double-buffered
35 callbacks - except for a couple ASM handlers, help drivers to implement
36 this functionality with minimal overhead */
37static FORCE_INLINE void pcm_play_dma_started_callback(void)
38{
39 extern void (* pcm_play_dma_started)(void);
40 void (* callback)(void) = pcm_play_dma_started;
41 if (callback)
42 callback();
43}
44
45extern unsigned long pcm_curr_sampr;
46extern unsigned long pcm_sampr;
47extern int pcm_fsel;
48
49#ifdef HAVE_PCM_DMA_ADDRESS
50void * pcm_dma_addr(void *addr);
51#endif
52
53extern volatile bool pcm_playing;
54extern volatile bool pcm_paused;
55
56void pcm_play_dma_lock(void);
57void pcm_play_dma_unlock(void);
58void pcm_play_dma_init(void) INIT_ATTR;
59void pcm_play_dma_start(const void *addr, size_t size);
60void pcm_play_dma_stop(void);
61void pcm_play_dma_pause(bool pause);
62const void * pcm_play_dma_get_peak_buffer(int *count);
63
64void pcm_dma_apply_settings(void);
65
66#ifdef HAVE_RECORDING
67
68/* DMA transfer in is currently active */
69extern volatile bool pcm_recording;
70
71/* APIs implemented in the target-specific portion */
72void pcm_rec_dma_init(void);
73void pcm_rec_dma_close(void);
74void pcm_rec_dma_start(void *addr, size_t size);
75void pcm_rec_dma_record_more(void *start, size_t size);
76void pcm_rec_dma_stop(void);
77const void * pcm_rec_dma_get_peak_buffer(void);
78
79#endif /* HAVE_RECORDING */
80
81#endif /* PCM_INTERNAL_H */