diff options
author | Nanang Izzuddin <nanang@teluu.com> | 2009-03-27 15:15:46 +0000 |
---|---|---|
committer | Nanang Izzuddin <nanang@teluu.com> | 2009-03-27 15:15:46 +0000 |
commit | 719e60cc3290dce849349bcd305f77dc5b545fa1 (patch) | |
tree | 9406c48e056f06c5a26f04af8037c3a74d40e2d2 | |
parent | 1f28fd97cb1f090464e23addd0e8e415d67cf92f (diff) |
Ticket #771 (auddev-misc):
Updated audio test tool:
- Fixed playback report on avg interval.
- Added feature to set/get capture & playback latecies setting.
- Minor update on drift calculation, improve a bit readibility for debugging.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2555 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r-- | pjmedia/src/pjmedia-audiodev/audiotest.c | 18 | ||||
-rw-r--r-- | pjsip-apps/src/samples/auddemo.c | 32 |
2 files changed, 41 insertions, 9 deletions
diff --git a/pjmedia/src/pjmedia-audiodev/audiotest.c b/pjmedia/src/pjmedia-audiodev/audiotest.c index bf0ac1f2..77704306 100644 --- a/pjmedia/src/pjmedia-audiodev/audiotest.c +++ b/pjmedia/src/pjmedia-audiodev/audiotest.c @@ -234,20 +234,20 @@ PJ_DEF(pj_status_t) pjmedia_aud_test( const pjmedia_aud_param *param, result->play.frame_cnt = test_data.playback_data.delay.n; result->play.min_interval = DIV_ROUND(test_data.playback_data.delay.min, 1000); result->play.max_interval = DIV_ROUND(test_data.playback_data.delay.max, 1000); - result->play.avg_interval = DIV_ROUND(test_data.capture_data.delay.mean, 1000); + result->play.avg_interval = DIV_ROUND(test_data.playback_data.delay.mean, 1000); result->play.dev_interval = DIV_ROUND(tmp, 1000); result->play.max_burst = DIV_ROUND_UP(result->play.max_interval, ptime); /* Check drifting */ if (param->dir == PJMEDIA_DIR_CAPTURE_PLAYBACK) { - int end_diff, start_diff, drift; - - end_diff = test_data.capture_data.last_timestamp - - test_data.playback_data.last_timestamp; - start_diff = test_data.capture_data.first_timestamp- - test_data.playback_data.first_timestamp; - drift = end_diff > start_diff? end_diff - start_diff : - start_diff - end_diff; + int play_diff, cap_diff, drift; + + play_diff = test_data.playback_data.last_timestamp - + test_data.playback_data.first_timestamp; + cap_diff = test_data.capture_data.last_timestamp - + test_data.capture_data.first_timestamp; + drift = play_diff > cap_diff? play_diff - cap_diff : + cap_diff - play_diff; /* Allow one frame tolerance for clock drift detection */ if (drift < (int)param->samples_per_frame) { diff --git a/pjsip-apps/src/samples/auddemo.c b/pjsip-apps/src/samples/auddemo.c index d3301fed..a6d8f920 100644 --- a/pjsip-apps/src/samples/auddemo.c +++ b/pjsip-apps/src/samples/auddemo.c @@ -29,6 +29,8 @@ static unsigned dev_count; +static unsigned playback_lat = PJMEDIA_SND_DEFAULT_PLAY_LATENCY; +static unsigned capture_lat = PJMEDIA_SND_DEFAULT_REC_LATENCY; static void app_perror(const char *title, pj_status_t status) { @@ -178,6 +180,12 @@ static void test_device(pjmedia_dir dir, unsigned rec_id, unsigned play_id, param.channel_count = chnum; param.samples_per_frame = clock_rate * chnum * ptime / 1000; + /* Latency settings */ + param.flags |= (PJMEDIA_AUD_DEV_CAP_INPUT_LATENCY | + PJMEDIA_AUD_DEV_CAP_OUTPUT_LATENCY); + param.input_latency_ms = capture_lat; + param.output_latency_ms = playback_lat; + PJ_LOG(3,(THIS_FILE, "Performing test..")); status = pjmedia_aud_test(¶m, &result); @@ -383,6 +391,10 @@ static void print_menu(void) puts(" CH: # of channels"); puts(" r RID [FILE] Record capture device RID to WAV file"); puts(" p PID [FILE] Playback WAV file to device ID PID"); + puts(" d [RLAT [PLAT]] Get/set sound device latencies (in ms):"); + puts(" Specify no param to get current latencies setting"); + puts(" RLAT : record latency (-1 for default)"); + puts(" PLAT : playback latency (-1 for default)"); puts(" v Toggle log verbosity"); puts(" q Quit"); puts(""); @@ -520,6 +532,26 @@ int main() } break; + case 'd': + /* latencies */ + { + int rec_lat, play_lat; + + if (sscanf(line+2, "%d %d", &rec_lat, &play_lat) == 2) { + capture_lat = (unsigned) + (rec_lat>=0? rec_lat:PJMEDIA_SND_DEFAULT_REC_LATENCY); + playback_lat = (unsigned) + (play_lat >= 0? play_lat : PJMEDIA_SND_DEFAULT_PLAY_LATENCY); + printf("Recording latency=%ums, playback latency=%ums", + capture_lat, playback_lat); + } else { + printf("Current latencies: record=%ums, playback=%ums", + capture_lat, playback_lat); + } + puts(""); + } + break; + case 'v': if (pj_log_get_level() <= 3) { pj_log_set_level(5); |