diff options
author | Alfred E. Heggestad <aeh@db.org> | 2014-09-15 23:33:39 +0300 |
---|---|---|
committer | Alfred E. Heggestad <aeh@db.org> | 2014-09-15 23:33:39 +0300 |
commit | fd2415e04189f762a9c530c933966f8892453041 (patch) | |
tree | f8696505c12814aeaaab5a392be57be6c6f74c8a | |
parent | 5dfde5447ba14edfee70dce7fa0f8f5f3d3aa3d9 (diff) |
vumeter: call tmr_start() from re_main thread
- tmr_start() should not be called from a thread that is not running
the re_main() loop. i.e. tmr_start() MUST be called from the re_main()
loop thread, unless the call is wrapped by re_thread_enter/leave().
- the audio-processing handlers encode/decode are handling real-time
audio samples, and should not be blocked.
-rw-r--r-- | modules/vumeter/vumeter.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/modules/vumeter/vumeter.c b/modules/vumeter/vumeter.c index 1a17fa8..4a29295 100644 --- a/modules/vumeter/vumeter.c +++ b/modules/vumeter/vumeter.c @@ -13,12 +13,14 @@ struct vumeter_enc { struct aufilt_enc_st af; /* inheritance */ struct tmr tmr; int16_t avg_rec; + volatile bool started; }; struct vumeter_dec { struct aufilt_dec_st af; /* inheritance */ struct tmr tmr; int16_t avg_play; + volatile bool started; }; @@ -86,7 +88,9 @@ static void enc_tmr_handler(void *arg) struct vumeter_enc *st = arg; tmr_start(&st->tmr, 100, enc_tmr_handler, st); - print_vumeter(60, 31, st->avg_rec); + + if (st->started) + print_vumeter(60, 31, st->avg_rec); } @@ -95,7 +99,9 @@ static void dec_tmr_handler(void *arg) struct vumeter_dec *st = arg; tmr_start(&st->tmr, 100, dec_tmr_handler, st); - print_vumeter(80, 32, st->avg_play); + + if (st->started) + print_vumeter(80, 32, st->avg_play); } @@ -116,6 +122,8 @@ static int encode_update(struct aufilt_enc_st **stp, void **ctx, if (!st) return ENOMEM; + tmr_start(&st->tmr, 100, enc_tmr_handler, st); + *stp = (struct aufilt_enc_st *)st; return 0; @@ -139,6 +147,8 @@ static int decode_update(struct aufilt_dec_st **stp, void **ctx, if (!st) return ENOMEM; + tmr_start(&st->tmr, 100, dec_tmr_handler, st); + *stp = (struct aufilt_dec_st *)st; return 0; @@ -150,9 +160,7 @@ static int encode(struct aufilt_enc_st *st, int16_t *sampv, size_t *sampc) struct vumeter_enc *vu = (struct vumeter_enc *)st; vu->avg_rec = calc_avg_s16(sampv, *sampc); - - if (!tmr_isrunning(&vu->tmr)) - tmr_start(&vu->tmr, 1, enc_tmr_handler, vu); + vu->started = true; return 0; } @@ -163,9 +171,7 @@ static int decode(struct aufilt_dec_st *st, int16_t *sampv, size_t *sampc) struct vumeter_dec *vu = (struct vumeter_dec *)st; vu->avg_play = calc_avg_s16(sampv, *sampc); - - if (!tmr_isrunning(&vu->tmr)) - tmr_start(&vu->tmr, 1, dec_tmr_handler, vu); + vu->started = true; return 0; } |