123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- #include "precompile.h"
- #include "audiodrivergroup.h"
- #include "audioengine.h"
- static void process_frame(void *self)
- {
- int i;
- audiodrivergroup_t *group = CONTAINING_RECORD(self, audiodrivergroup_t, base);
- for (i = 0; i < group->arr_member->nelts; ++i) {
- audiodriver_t *drv = APR_ARRAY_IDX(group->arr_member, i, audiodriver_t*);
- (*drv->vtbl->process_frame)(drv);
- }
- }
- static audiodriver_vtbl_t g_driver_vtbl = {
- &process_frame,
- };
- apr_status_t audiodrivergroup_create(apr_pool_t *pool, audioengine_t *engine, audiodrivergroup_t **p_group)
- {
- audiodrivergroup_t *group;
- group = apr_palloc(pool, sizeof(audiodrivergroup_t));
- memset(group, 0, sizeof(audiodrivergroup_t));
- group->arr_member = apr_array_make(pool, 3, sizeof(audiodriver_t*));
- audiodriver_init(engine, &g_driver_vtbl, &group->base);
- *p_group = group;
- return APR_SUCCESS;
- }
- apr_status_t audiodrivergroup_destroy(audiodrivergroup_t *group)
- {
- return APR_SUCCESS;
- }
- apr_status_t audiodrivergroup_add_member(audiodrivergroup_t *group, audiodriver_t *member)
- {
- if (!member)
- return APR_EINVAL;
- APR_ARRAY_PUSH(group->arr_member, audiodriver_t*) = member;
- return APR_SUCCESS;
- }
- apr_status_t audiodrivergroup_remove_member(audiodrivergroup_t *group, audiodriver_t *member)
- {
- int i;
- if (!member)
- return APR_EINVAL;
- for (i = 0; i < group->arr_member->nelts; ++i) {
- audiodriver_t *t = APR_ARRAY_IDX(group->arr_member, i, audiodriver_t*);
- if (t == member) {
- if (i != group->arr_member->nelts-1) {
- APR_ARRAY_IDX(group->arr_member, i, audiodriver_t*) = APR_ARRAY_IDX(group->arr_member, i, audiodriver_t*);
- APR_ARRAY_IDX(group->arr_member, group->arr_member->nelts-1, audiodriver_t*) = t;
- }
- apr_array_pop(group->arr_member);
- return APR_SUCCESS;
- }
- }
- return APR_NOTFOUND;
- }
|