audiodrivergroup.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #include "precompile.h"
  2. #include "audiodrivergroup.h"
  3. #include "audioengine.h"
  4. static void process_frame(void *self)
  5. {
  6. int i;
  7. audiodrivergroup_t *group = CONTAINING_RECORD(self, audiodrivergroup_t, base);
  8. for (i = 0; i < group->arr_member->nelts; ++i) {
  9. audiodriver_t *drv = APR_ARRAY_IDX(group->arr_member, i, audiodriver_t*);
  10. (*drv->vtbl->process_frame)(drv);
  11. }
  12. }
  13. static audiodriver_vtbl_t g_driver_vtbl = {
  14. &process_frame,
  15. };
  16. apr_status_t audiodrivergroup_create(apr_pool_t *pool, audioengine_t *engine, audiodrivergroup_t **p_group)
  17. {
  18. audiodrivergroup_t *group;
  19. group = apr_palloc(pool, sizeof(audiodrivergroup_t));
  20. memset(group, 0, sizeof(audiodrivergroup_t));
  21. group->arr_member = apr_array_make(pool, 3, sizeof(audiodriver_t*));
  22. audiodriver_init(engine, &g_driver_vtbl, &group->base);
  23. *p_group = group;
  24. return APR_SUCCESS;
  25. }
  26. apr_status_t audiodrivergroup_destroy(audiodrivergroup_t *group)
  27. {
  28. return APR_SUCCESS;
  29. }
  30. apr_status_t audiodrivergroup_add_member(audiodrivergroup_t *group, audiodriver_t *member)
  31. {
  32. if (!member)
  33. return APR_EINVAL;
  34. APR_ARRAY_PUSH(group->arr_member, audiodriver_t*) = member;
  35. return APR_SUCCESS;
  36. }
  37. apr_status_t audiodrivergroup_remove_member(audiodrivergroup_t *group, audiodriver_t *member)
  38. {
  39. int i;
  40. if (!member)
  41. return APR_EINVAL;
  42. for (i = 0; i < group->arr_member->nelts; ++i) {
  43. audiodriver_t *t = APR_ARRAY_IDX(group->arr_member, i, audiodriver_t*);
  44. if (t == member) {
  45. if (i != group->arr_member->nelts-1) {
  46. APR_ARRAY_IDX(group->arr_member, i, audiodriver_t*) = APR_ARRAY_IDX(group->arr_member, i, audiodriver_t*);
  47. APR_ARRAY_IDX(group->arr_member, group->arr_member->nelts-1, audiodriver_t*) = t;
  48. }
  49. apr_array_pop(group->arr_member);
  50. return APR_SUCCESS;
  51. }
  52. }
  53. return APR_NOTFOUND;
  54. }