.. | .. |
---|
12 | 12 | |
---|
13 | 13 | #include <linux/types.h> |
---|
14 | 14 | #include <linux/sched.h> |
---|
| 15 | +#include <linux/android_kabi.h> |
---|
15 | 16 | #include <sound/core.h> |
---|
16 | 17 | #include <sound/compress_offload.h> |
---|
17 | 18 | #include <sound/asound.h> |
---|
.. | .. |
---|
33 | 34 | * @total_bytes_transferred: cumulative bytes transferred by offload DSP |
---|
34 | 35 | * @sleep: poll sleep |
---|
35 | 36 | * @private_data: driver private data pointer |
---|
| 37 | + * @dma_area: virtual buffer address |
---|
| 38 | + * @dma_addr: physical buffer address (not accessible from main CPU) |
---|
| 39 | + * @dma_bytes: size of DMA area |
---|
| 40 | + * @dma_buffer_p: runtime dma buffer pointer |
---|
36 | 41 | */ |
---|
37 | 42 | struct snd_compr_runtime { |
---|
38 | 43 | snd_pcm_state_t state; |
---|
.. | .. |
---|
45 | 50 | u64 total_bytes_transferred; |
---|
46 | 51 | wait_queue_head_t sleep; |
---|
47 | 52 | void *private_data; |
---|
| 53 | + |
---|
| 54 | + unsigned char *dma_area; |
---|
| 55 | + dma_addr_t dma_addr; |
---|
| 56 | + size_t dma_bytes; |
---|
| 57 | + struct snd_dma_buffer *dma_buffer_p; |
---|
| 58 | + |
---|
| 59 | + ANDROID_KABI_RESERVE(1); |
---|
48 | 60 | }; |
---|
49 | 61 | |
---|
50 | 62 | /** |
---|
.. | .. |
---|
57 | 69 | * @direction: stream direction, playback/recording |
---|
58 | 70 | * @metadata_set: metadata set flag, true when set |
---|
59 | 71 | * @next_track: has userspace signal next track transition, true when set |
---|
| 72 | + * @partial_drain: undergoing partial_drain for stream, true when set |
---|
60 | 73 | * @private_data: pointer to DSP private data |
---|
| 74 | + * @dma_buffer: allocated buffer if any |
---|
61 | 75 | */ |
---|
62 | 76 | struct snd_compr_stream { |
---|
63 | 77 | const char *name; |
---|
.. | .. |
---|
68 | 82 | enum snd_compr_direction direction; |
---|
69 | 83 | bool metadata_set; |
---|
70 | 84 | bool next_track; |
---|
| 85 | + bool partial_drain; |
---|
71 | 86 | void *private_data; |
---|
72 | | - struct snd_soc_pcm_runtime *be; |
---|
| 87 | + struct snd_dma_buffer dma_buffer; |
---|
| 88 | + |
---|
| 89 | + ANDROID_KABI_RESERVE(1); |
---|
73 | 90 | }; |
---|
74 | 91 | |
---|
75 | 92 | /** |
---|
.. | .. |
---|
84 | 101 | * @get_params: retrieve the codec parameters, mandatory |
---|
85 | 102 | * @set_metadata: Set the metadata values for a stream |
---|
86 | 103 | * @get_metadata: retrieves the requested metadata values from stream |
---|
87 | | - * @set_next_track_param: send codec specific data of subsequent track |
---|
88 | | - * in gapless |
---|
89 | 104 | * @trigger: Trigger operations like start, pause, resume, drain, stop. |
---|
90 | 105 | * This callback is mandatory |
---|
91 | 106 | * @pointer: Retrieve current h/w pointer information. Mandatory |
---|
.. | .. |
---|
108 | 123 | struct snd_compr_metadata *metadata); |
---|
109 | 124 | int (*get_metadata)(struct snd_compr_stream *stream, |
---|
110 | 125 | struct snd_compr_metadata *metadata); |
---|
111 | | - int (*set_next_track_param)(struct snd_compr_stream *stream, |
---|
112 | | - union snd_codec_options *codec_options); |
---|
113 | 126 | int (*trigger)(struct snd_compr_stream *stream, int cmd); |
---|
114 | 127 | int (*pointer)(struct snd_compr_stream *stream, |
---|
115 | 128 | struct snd_compr_tstamp *tstamp); |
---|
.. | .. |
---|
122 | 135 | struct snd_compr_caps *caps); |
---|
123 | 136 | int (*get_codec_caps) (struct snd_compr_stream *stream, |
---|
124 | 137 | struct snd_compr_codec_caps *codec); |
---|
| 138 | + |
---|
| 139 | + ANDROID_KABI_RESERVE(1); |
---|
125 | 140 | }; |
---|
126 | 141 | |
---|
127 | 142 | /** |
---|
.. | .. |
---|
150 | 165 | struct snd_info_entry *proc_root; |
---|
151 | 166 | struct snd_info_entry *proc_info_entry; |
---|
152 | 167 | #endif |
---|
| 168 | + ANDROID_KABI_RESERVE(1); |
---|
153 | 169 | }; |
---|
154 | 170 | |
---|
155 | 171 | /* compress device register APIs */ |
---|
.. | .. |
---|
176 | 192 | if (snd_BUG_ON(!stream)) |
---|
177 | 193 | return; |
---|
178 | 194 | |
---|
179 | | - stream->runtime->state = SNDRV_PCM_STATE_SETUP; |
---|
| 195 | + /* for partial_drain case we are back to running state on success */ |
---|
| 196 | + if (stream->partial_drain) { |
---|
| 197 | + stream->runtime->state = SNDRV_PCM_STATE_RUNNING; |
---|
| 198 | + stream->partial_drain = false; /* clear this flag as well */ |
---|
| 199 | + } else { |
---|
| 200 | + stream->runtime->state = SNDRV_PCM_STATE_SETUP; |
---|
| 201 | + } |
---|
180 | 202 | |
---|
181 | 203 | wake_up(&stream->runtime->sleep); |
---|
182 | 204 | } |
---|
183 | 205 | |
---|
| 206 | +/** |
---|
| 207 | + * snd_compr_set_runtime_buffer - Set the Compress runtime buffer |
---|
| 208 | + * @stream: compress stream to set |
---|
| 209 | + * @bufp: the buffer information, NULL to clear |
---|
| 210 | + * |
---|
| 211 | + * Copy the buffer information to runtime buffer when @bufp is non-NULL. |
---|
| 212 | + * Otherwise it clears the current buffer information. |
---|
| 213 | + */ |
---|
| 214 | +static inline void |
---|
| 215 | +snd_compr_set_runtime_buffer(struct snd_compr_stream *stream, |
---|
| 216 | + struct snd_dma_buffer *bufp) |
---|
| 217 | +{ |
---|
| 218 | + struct snd_compr_runtime *runtime = stream->runtime; |
---|
| 219 | + |
---|
| 220 | + if (bufp) { |
---|
| 221 | + runtime->dma_buffer_p = bufp; |
---|
| 222 | + runtime->dma_area = bufp->area; |
---|
| 223 | + runtime->dma_addr = bufp->addr; |
---|
| 224 | + runtime->dma_bytes = bufp->bytes; |
---|
| 225 | + } else { |
---|
| 226 | + runtime->dma_buffer_p = NULL; |
---|
| 227 | + runtime->dma_area = NULL; |
---|
| 228 | + runtime->dma_addr = 0; |
---|
| 229 | + runtime->dma_bytes = 0; |
---|
| 230 | + } |
---|
| 231 | +} |
---|
| 232 | + |
---|
| 233 | +int snd_compr_malloc_pages(struct snd_compr_stream *stream, size_t size); |
---|
| 234 | +int snd_compr_free_pages(struct snd_compr_stream *stream); |
---|
| 235 | + |
---|
184 | 236 | int snd_compr_stop_error(struct snd_compr_stream *stream, |
---|
185 | 237 | snd_pcm_state_t state); |
---|
186 | 238 | |
---|