summaryrefslogtreecommitdiffstats
path: root/src/bufferq.h
blob: 2d53a45a7f98ec9cfb6ea19fb0bfe429149e5ac3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#ifndef foosydneybufferqhfoo
#define foosydneybufferqhfoo

#include <inttypes.h>

#include "macro.h"
#include "llist.h"
#include "sydney.h"

typedef enum sa_bufferq_item_type {
    SA_BUFFERQ_ITEM_CONCATENATED,
    SA_BUFFERQ_ITEM_DYNAMIC,
    SA_BUFFERQ_ITEM_STATIC
} sa_bufferq_item_type_t;

typedef struct sa_bufferq_item {
    void *data;
    int64_t idx;
    size_t size;
    sa_bufferq_item_type_t type;
    SA_LLIST_ITEM(struct sa_bufferq_item, bufferq);
} sa_bufferq_item_t;

typedef struct sa_bufferq {
    SA_LLIST_HEAD(sa_bufferq_item_t, *items);
    sa_bufferq_item_t **last;
    int64_t read_index, write_index, end_index;
    size_t sample_size;
    unsigned nchannels;
} sa_bufferq_t;

int sa_bufferq_init(sa_bufferq_t *q, unsigned nchannels, size_t sample_size);

void sa_bufferq_done(sa_bufferq_t *q);

int sa_bufferq_push(sa_bufferq_t *q, unsigned channel, const void *data, size_t nbytes, int64_t offset, sa_seek_t whence, sa_bufferq_item_type_t type);
int sa_bufferq_realloc(sa_bufferq_t *q);

void sa_bufferq_get(sa_bufferq_t *q, void *i[], size_t *bytes);
void sa_bufferq_drop(sa_bufferq_t *q, int64_t bytes);

#endif