1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- #include "precompile.h"
- #include "audiosilencedet.h"
- #include "other/silencedet.h"
- static apr_status_t read_frame(void *self, audioframe_t *frame)
- {
- audiosilencedet_t *det = CONTAINING_RECORD(self, audiosilencedet_t, base);
- apr_status_t status;
- status = det->base.downstream->vtbl->read_frame(det->base.downstream, frame);
- if (det->opt & AUDIO_SILENCEDET_OPT_APPLY_READ) {
- if (status == APR_SUCCESS && frame->size) {
- int silence = silence_det_detect(det->det_read, (short*)frame->buffer, frame->size>>1, NULL);
- if (silence) {
- frame->size = 0;
- }
- }
- }
- return status;
- }
- static apr_status_t write_frame(void *self, const audioframe_t *frame)
- {
- audiosilencedet_t *det = CONTAINING_RECORD(self, audiosilencedet_t, base);
- if (det->opt & AUDIO_SILENCEDET_OPT_APPLY_WRITE) {
- int silence = silence_det_detect(det->det_write, (const short*)frame->buffer, frame->size>>1, NULL);
- if (silence) {
- audioframe_t frm = {0, 0, 0};
- OutputDebugStringA("silence frm!\n");
- return det->base.downstream->vtbl->write_frame(det->base.downstream, &frm);
- } else {
- return det->base.downstream->vtbl->write_frame(det->base.downstream, frame);
- }
- } else {
- return det->base.downstream->vtbl->write_frame(det->base.downstream, frame);
- }
- }
- static audiostream_vtbl_t g_stream_vtbl = {
- &read_frame,
- &write_frame,
- };
- apr_status_t audiosilencedet_create(apr_pool_t *pool,
- audioengine_t *engine,
- int clock,
- int ptime,
- int opt,
- audiosilencedet_t **p_det)
- {
- audiosilencedet_t *det;
- det = apr_palloc(pool, sizeof(audiosilencedet_t));
- memset(det, 0, sizeof(audiosilencedet_t));
- audiostream_init(engine, &g_stream_vtbl, &det->base);
- det->opt = opt;
- det->clock = clock;
- det->ptime = ptime;
- det->psize = ptime * clock / 1000 * 2;
- if (opt & AUDIO_SILENCEDET_OPT_APPLY_READ) {
- silence_det_create(clock, det->psize>>1, (silence_det_t **)&det->det_read);
- }
- if (opt & AUDIO_SILENCEDET_OPT_APPLY_WRITE) {
- silence_det_create(clock, det->psize>>1, (silence_det_t **)&det->det_write);
- }
- *p_det = det;
- return APR_SUCCESS;
- }
- void audiosilencedet_destroy(audiosilencedet_t *det)
- {
- if (det->opt & AUDIO_SILENCEDET_OPT_APPLY_READ) {
- silence_det_destory(det->det_read);
- det->det_read = NULL;
- }
- if (det->opt & AUDIO_SILENCEDET_OPT_APPLY_WRITE) {
- silence_det_destory(det->det_write);
- det->det_write = NULL;
- }
- }
|