diff options
author | Benny Prijono <bennylp@teluu.com> | 2007-10-20 23:58:23 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2007-10-20 23:58:23 +0000 |
commit | 829e109b794b058c0808603080695acdce8bd88e (patch) | |
tree | da825936f81ae9731447e5d1a5797ca5f163e037 /pjmedia | |
parent | 0017ca8ca74d82987fc0d400ccd50b9db6598e5f (diff) |
Fixed bug in pjmedia clock_thread.c: busy loop when clock thread is stopped
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1509 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia')
-rw-r--r-- | pjmedia/src/pjmedia/clock_thread.c | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/pjmedia/src/pjmedia/clock_thread.c b/pjmedia/src/pjmedia/clock_thread.c index 8ce30eb8..e77df8fa 100644 --- a/pjmedia/src/pjmedia/clock_thread.c +++ b/pjmedia/src/pjmedia/clock_thread.c @@ -27,7 +27,6 @@ /* * Implementation of media clock with OS thread. */ -#define MAX_JUMP 500 struct pjmedia_clock { @@ -37,6 +36,7 @@ struct pjmedia_clock pj_timestamp timestamp; unsigned samples_per_frame; unsigned options; + pj_uint64_t max_jump; pjmedia_clock_callback *cb; void *user_data; pj_thread_t *thread; @@ -48,6 +48,7 @@ struct pjmedia_clock static int clock_thread(void *arg); +#define MAX_JUMP_MSEC 500 /* * Create media clock. @@ -76,6 +77,7 @@ PJ_DEF(pj_status_t) pjmedia_clock_create( pj_pool_t *pool, clock->interval.u64 = samples_per_frame * clock->freq.u64 / clock_rate; clock->next_tick.u64 = 0; clock->timestamp.u64 = 0; + clock->max_jump = MAX_JUMP_MSEC * clock->freq.u64 / 1000; clock->samples_per_frame = samples_per_frame; clock->options = options; clock->cb = cb; @@ -142,6 +144,18 @@ PJ_DEF(pj_status_t) pjmedia_clock_stop(pjmedia_clock *clock) } +/* Calculate next tick */ +PJ_INLINE(void) clock_calc_next_tick(pjmedia_clock *clock, + pj_timestamp *now) +{ + if (clock->next_tick.u64+clock->max_jump < now->u64) { + /* Timestamp has made large jump, adjust next_tick */ + clock->next_tick.u64 = now->u64; + } + clock->next_tick.u64 += clock->interval.u64; + +} + /* * Poll the clock. */ @@ -184,11 +198,7 @@ PJ_DEF(pj_bool_t) pjmedia_clock_wait( pjmedia_clock *clock, clock->timestamp.u64 += clock->samples_per_frame; /* Calculate next tick */ - if (clock->next_tick.u64+MAX_JUMP < now.u64) { - /* Timestamp has made large jump, adjust next_tick */ - clock->next_tick.u64 = now.u64; - } - clock->next_tick.u64 += clock->interval.u64; + clock_calc_next_tick(clock, &now); /* Done */ return PJ_TRUE; @@ -220,8 +230,11 @@ static int clock_thread(void *arg) } /* Skip if not running */ - if (!clock->running) + if (!clock->running) { + /* Calculate next tick */ + clock_calc_next_tick(clock, &now); continue; + } pj_lock_acquire(clock->lock); @@ -233,11 +246,7 @@ static int clock_thread(void *arg) clock->timestamp.u64 += clock->samples_per_frame; /* Calculate next tick */ - if (clock->next_tick.u64+MAX_JUMP < now.u64) { - /* Timestamp has made large jump, adjust next_tick */ - clock->next_tick.u64 = now.u64; - } - clock->next_tick.u64 += clock->interval.u64; + clock_calc_next_tick(clock, &now); pj_lock_release(clock->lock); } |