summaryrefslogtreecommitdiff
path: root/firmware/export/pcm-internal.h
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/export/pcm-internal.h')
-rw-r--r--firmware/export/pcm-internal.h51
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 **/
44static 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. */
48void 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 53static FORCE_INLINE enum pcm_dma_status
51 to fill more data for next "get more" callback to implement double-buffered 54pcm_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 */
54static 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. */
63bool pcm_play_dma_complete_callback(enum pcm_dma_status status,
64 const void **addr, size_t *size);
65
62extern unsigned long pcm_curr_sampr; 66extern unsigned long pcm_curr_sampr;
63extern unsigned long pcm_sampr; 67extern unsigned long pcm_sampr;
64extern int pcm_fsel; 68extern int pcm_fsel;
@@ -90,10 +94,29 @@ extern volatile bool pcm_recording;
90void pcm_rec_dma_init(void); 94void pcm_rec_dma_init(void);
91void pcm_rec_dma_close(void); 95void pcm_rec_dma_close(void);
92void pcm_rec_dma_start(void *addr, size_t size); 96void pcm_rec_dma_start(void *addr, size_t size);
93void pcm_rec_dma_record_more(void *start, size_t size);
94void pcm_rec_dma_stop(void); 97void pcm_rec_dma_stop(void);
95const void * pcm_rec_dma_get_peak_buffer(void); 98const void * pcm_rec_dma_get_peak_buffer(void);
96 99
100static FORCE_INLINE enum pcm_dma_status
101pcm_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. */
111bool 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 */