Skip to content

Commit c694c09

Browse files
tlaudalgirdwood
authored andcommitted
buffer: add buffer callback
Adds buffer callbacks, which can be called after produce or consume. Signed-off-by: Tomasz Lauda <tomasz.lauda@linux.intel.com>
1 parent ad64629 commit c694c09

3 files changed

Lines changed: 25 additions & 0 deletions

File tree

src/audio/buffer.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,9 @@ void comp_update_buffer_produce(struct comp_buffer *buffer, uint32_t bytes)
158158
/* calculate free bytes */
159159
buffer->free = buffer->size - buffer->avail;
160160

161+
if (buffer->cb && buffer->cb_type & BUFF_CB_TYPE_PRODUCE)
162+
buffer->cb(buffer->cb_data, bytes);
163+
161164
spin_unlock_irq(&buffer->lock, flags);
162165

163166
tracev_buffer("comp_update_buffer_produce(), ((buffer->avail << 16) | "
@@ -199,6 +202,9 @@ void comp_update_buffer_consume(struct comp_buffer *buffer, uint32_t bytes)
199202
!buffer->source->is_dma_connected)
200203
dcache_writeback_region(buffer->r_ptr, bytes);
201204

205+
if (buffer->cb && buffer->cb_type & BUFF_CB_TYPE_CONSUME)
206+
buffer->cb(buffer->cb_data, bytes);
207+
202208
spin_unlock_irq(&buffer->lock, flags);
203209

204210
tracev_buffer("comp_update_buffer_consume(), %u, %u, %u",

src/include/sof/audio/buffer.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@
4848
#define trace_buffer_error(__e, ...) trace_error(TRACE_CLASS_BUFFER, __e, ##__VA_ARGS__)
4949
#define tracev_buffer(__e, ...) tracev_event(TRACE_CLASS_BUFFER, __e, ##__VA_ARGS__)
5050

51+
/* buffer callback types */
52+
#define BUFF_CB_TYPE_PRODUCE BIT(0)
53+
#define BUFF_CB_TYPE_CONSUME BIT(1)
54+
5155
/* audio component buffer - connects 2 audio components together in pipeline */
5256
struct comp_buffer {
5357

@@ -72,6 +76,11 @@ struct comp_buffer {
7276
struct list_item source_list; /* list in comp buffers */
7377
struct list_item sink_list; /* list in comp buffers */
7478

79+
/* callbacks */
80+
void (*cb)(void *data, uint32_t bytes);
81+
void *cb_data;
82+
int cb_type;
83+
7584
spinlock_t lock; /* component buffer spinlock */
7685
};
7786

@@ -96,6 +105,13 @@ struct comp_buffer {
96105
buffer->sink = comp; \
97106
} while (0) \
98107

108+
#define buffer_set_cb(buffer, func, data, type) \
109+
do { \
110+
buffer->cb = func; \
111+
buffer->cb_data = data; \
112+
buffer->cb_type = type; \
113+
} while (0)
114+
99115
#define buffer_read_frag(buffer, idx, size) \
100116
buffer_get_frag(buffer, buffer->r_ptr, idx, size)
101117

test/cmocka/src/audio/kpb/kpb_buffer.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,9 @@ static struct comp_buffer *mock_comp_buffer(void **state,
215215
buffer->end_addr = buffer->w_ptr + buffer->size;
216216
break;
217217
}
218+
219+
buffer->cb = NULL;
220+
218221
return buffer;
219222
}
220223

0 commit comments

Comments
 (0)