summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlfred E. Heggestad <aeh@db.org>2014-09-15 23:33:39 +0300
committerAlfred E. Heggestad <aeh@db.org>2014-09-15 23:33:39 +0300
commitfd2415e04189f762a9c530c933966f8892453041 (patch)
treef8696505c12814aeaaab5a392be57be6c6f74c8a
parent5dfde5447ba14edfee70dce7fa0f8f5f3d3aa3d9 (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.c22
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;
}