audiosilencedet.c 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include "precompile.h"
  2. #include "audiosilencedet.h"
  3. #include "other/silencedet.h"
  4. static apr_status_t read_frame(void *self, audioframe_t *frame)
  5. {
  6. audiosilencedet_t *det = CONTAINING_RECORD(self, audiosilencedet_t, base);
  7. apr_status_t status;
  8. status = det->base.downstream->vtbl->read_frame(det->base.downstream, frame);
  9. if (det->opt & AUDIO_SILENCEDET_OPT_APPLY_READ) {
  10. if (status == APR_SUCCESS && frame->size) {
  11. int silence = silence_det_detect(det->det_read, (short*)frame->buffer, frame->size>>1, NULL);
  12. if (silence) {
  13. frame->size = 0;
  14. }
  15. }
  16. }
  17. return status;
  18. }
  19. static apr_status_t write_frame(void *self, const audioframe_t *frame)
  20. {
  21. audiosilencedet_t *det = CONTAINING_RECORD(self, audiosilencedet_t, base);
  22. if (det->opt & AUDIO_SILENCEDET_OPT_APPLY_WRITE) {
  23. int silence = silence_det_detect(det->det_write, (const short*)frame->buffer, frame->size>>1, NULL);
  24. if (silence) {
  25. audioframe_t frm = {0, 0, 0};
  26. OutputDebugStringA("silence frm!\n");
  27. return det->base.downstream->vtbl->write_frame(det->base.downstream, &frm);
  28. } else {
  29. return det->base.downstream->vtbl->write_frame(det->base.downstream, frame);
  30. }
  31. } else {
  32. return det->base.downstream->vtbl->write_frame(det->base.downstream, frame);
  33. }
  34. }
  35. static audiostream_vtbl_t g_stream_vtbl = {
  36. &read_frame,
  37. &write_frame,
  38. };
  39. apr_status_t audiosilencedet_create(apr_pool_t *pool,
  40. audioengine_t *engine,
  41. int clock,
  42. int ptime,
  43. int opt,
  44. audiosilencedet_t **p_det)
  45. {
  46. audiosilencedet_t *det;
  47. det = apr_palloc(pool, sizeof(audiosilencedet_t));
  48. memset(det, 0, sizeof(audiosilencedet_t));
  49. audiostream_init(engine, &g_stream_vtbl, &det->base);
  50. det->opt = opt;
  51. det->clock = clock;
  52. det->ptime = ptime;
  53. det->psize = ptime * clock / 1000 * 2;
  54. if (opt & AUDIO_SILENCEDET_OPT_APPLY_READ) {
  55. silence_det_create(clock, det->psize>>1, (silence_det_t **)&det->det_read);
  56. }
  57. if (opt & AUDIO_SILENCEDET_OPT_APPLY_WRITE) {
  58. silence_det_create(clock, det->psize>>1, (silence_det_t **)&det->det_write);
  59. }
  60. *p_det = det;
  61. return APR_SUCCESS;
  62. }
  63. void audiosilencedet_destroy(audiosilencedet_t *det)
  64. {
  65. if (det->opt & AUDIO_SILENCEDET_OPT_APPLY_READ) {
  66. silence_det_destory(det->det_read);
  67. det->det_read = NULL;
  68. }
  69. if (det->opt & AUDIO_SILENCEDET_OPT_APPLY_WRITE) {
  70. silence_det_destory(det->det_write);
  71. det->det_write = NULL;
  72. }
  73. }