diff options
Diffstat (limited to 'firmware/export/pcm-internal.h')
-rw-r--r-- | firmware/export/pcm-internal.h | 51 |
1 files changed, 37 insertions, 14 deletions
diff --git a/firmware/export/pcm-internal.h b/firmware/export/pcm-internal.h index 89d895fe4b..abe3fe08dc 100644 --- a/firmware/export/pcm-internal.h +++ b/firmware/export/pcm-internal.h | |||
@@ -41,24 +41,28 @@ void pcm_do_peak_calculation(struct pcm_peaks *peaks, bool active, | |||
41 | 41 | ||
42 | /** The following are for internal use between pcm.c and target- | 42 | /** The following are for internal use between pcm.c and target- |
43 | specific portion **/ | 43 | specific portion **/ |
44 | static FORCE_INLINE enum pcm_dma_status pcm_call_status_cb( | ||
45 | pcm_status_callback_type callback, enum pcm_dma_status status) | ||
46 | { | ||
47 | if (!callback) | ||
48 | return status; | ||
44 | 49 | ||
45 | /* Called by the bottom layer ISR when more data is needed. Returns non- | 50 | return callback(status); |
46 | * zero size if more data is to be played. Setting start to NULL | 51 | } |
47 | * forces stop. */ | ||
48 | void pcm_play_get_more_callback(void **start, size_t *size); | ||
49 | 52 | ||
50 | /* Called by the bottom layer ISR after next transfer has begun in order | 53 | static FORCE_INLINE enum pcm_dma_status |
51 | to fill more data for next "get more" callback to implement double-buffered | 54 | pcm_play_dma_status_callback(enum pcm_dma_status status) |
52 | callbacks - except for a couple ASM handlers, help drivers to implement | ||
53 | this functionality with minimal overhead */ | ||
54 | static FORCE_INLINE void pcm_play_dma_started_callback(void) | ||
55 | { | 55 | { |
56 | extern void (* pcm_play_dma_started)(void); | 56 | extern enum pcm_dma_status |
57 | void (* callback)(void) = pcm_play_dma_started; | 57 | (* volatile pcm_play_status_callback)(enum pcm_dma_status); |
58 | if (callback) | 58 | return pcm_call_status_cb(pcm_play_status_callback, status); |
59 | callback(); | ||
60 | } | 59 | } |
61 | 60 | ||
61 | /* Called by the bottom layer ISR when more data is needed. Returns true | ||
62 | * if a new buffer is available, false otherwise. */ | ||
63 | bool pcm_play_dma_complete_callback(enum pcm_dma_status status, | ||
64 | const void **addr, size_t *size); | ||
65 | |||
62 | extern unsigned long pcm_curr_sampr; | 66 | extern unsigned long pcm_curr_sampr; |
63 | extern unsigned long pcm_sampr; | 67 | extern unsigned long pcm_sampr; |
64 | extern int pcm_fsel; | 68 | extern int pcm_fsel; |
@@ -90,10 +94,29 @@ extern volatile bool pcm_recording; | |||
90 | void pcm_rec_dma_init(void); | 94 | void pcm_rec_dma_init(void); |
91 | void pcm_rec_dma_close(void); | 95 | void pcm_rec_dma_close(void); |
92 | void pcm_rec_dma_start(void *addr, size_t size); | 96 | void pcm_rec_dma_start(void *addr, size_t size); |
93 | void pcm_rec_dma_record_more(void *start, size_t size); | ||
94 | void pcm_rec_dma_stop(void); | 97 | void pcm_rec_dma_stop(void); |
95 | const void * pcm_rec_dma_get_peak_buffer(void); | 98 | const void * pcm_rec_dma_get_peak_buffer(void); |
96 | 99 | ||
100 | static FORCE_INLINE enum pcm_dma_status | ||
101 | pcm_rec_dma_status_callback(enum pcm_dma_status status) | ||
102 | { | ||
103 | extern enum pcm_dma_status | ||
104 | (* volatile pcm_rec_status_callback)(enum pcm_dma_status); | ||
105 | return pcm_call_status_cb(pcm_rec_status_callback, status); | ||
106 | } | ||
107 | |||
108 | |||
109 | /* Called by the bottom layer ISR when more data is needed. Returns true | ||
110 | * if a new buffer is available, false otherwise. */ | ||
111 | bool pcm_rec_dma_complete_callback(enum pcm_dma_status status, | ||
112 | void **addr, size_t *size); | ||
113 | |||
114 | #ifdef HAVE_PCM_REC_DMA_ADDRESS | ||
115 | #define pcm_rec_dma_addr(addr) pcm_dma_addr(addr) | ||
116 | #else | ||
117 | #define pcm_rec_dma_addr(addr) addr | ||
118 | #endif | ||
119 | |||
97 | #endif /* HAVE_RECORDING */ | 120 | #endif /* HAVE_RECORDING */ |
98 | 121 | ||
99 | #endif /* PCM_INTERNAL_H */ | 122 | #endif /* PCM_INTERNAL_H */ |