<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>Example Documentation</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> <!-- Generated by Doxygen 1.2.18 --> <center> <a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="modules.html">Modules</a> <a class="qindex" href="annotated.html">Data Structures</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Data Fields</a> <a class="qindex" href="globals.html">Globals</a> <a class="qindex" href="pages.html">Related Pages</a> <a class="qindex" href="examples.html">Examples</a> </center> <hr><h1>/test/timer.c</h1> <p> <a name="example_test_timer"></a> <p> <div class="fragment"><pre><span class="preprocessor">#include <stdio.h></span> <span class="preprocessor">#include <stdlib.h></span> <span class="preprocessor">#include <string.h></span> <span class="preprocessor">#include <sys/time.h></span> <span class="preprocessor">#include "../include/asoundlib.h"</span> <span class="keywordtype">void</span> show_status(<span class="keywordtype">void</span> *handle) { <span class="keywordtype">int</span> err; <a class="code" href="group___timer.html#a3">snd_timer_status_t</a> *status; <a name="a0"></a><a class="code" href="group___timer.html#a77">snd_timer_status_alloca</a>(&status); <span class="keywordflow">if</span> ((err = <a name="a1"></a><a class="code" href="group___timer.html#a22">snd_timer_status</a>(handle, status)) < 0) { fprintf(stderr, <span class="stringliteral">"timer status %i (%s)\n"</span>, err, <a name="a2"></a><a class="code" href="group___error.html#a2">snd_strerror</a>(err)); <span class="keywordflow">return</span>; } printf(<span class="stringliteral">"STATUS:\n"</span>); printf(<span class="stringliteral">" resolution = %li\n"</span>, <a name="a3"></a><a class="code" href="group___timer.html#a65">snd_timer_status_get_resolution</a>(status)); printf(<span class="stringliteral">" lost = %li\n"</span>, <a name="a4"></a><a class="code" href="group___timer.html#a66">snd_timer_status_get_lost</a>(status)); printf(<span class="stringliteral">" overrun = %li\n"</span>, <a name="a5"></a><a class="code" href="group___timer.html#a67">snd_timer_status_get_overrun</a>(status)); printf(<span class="stringliteral">" queue = %li\n"</span>, <a name="a6"></a><a class="code" href="group___timer.html#a68">snd_timer_status_get_queue</a>(status)); } <span class="keywordtype">void</span> read_loop(<span class="keywordtype">void</span> *handle, <span class="keywordtype">int</span> master_ticks, <span class="keywordtype">int</span> timeout) { <span class="keywordtype">int</span> count, err; <span class="keyword">struct </span>pollfd *fds; <a name="_a7"></a><a class="code" href="struct__snd__timer__read.html">snd_timer_read_t</a> tr; count = <a name="a8"></a><a class="code" href="group___timer.html#a17">snd_timer_poll_descriptors_count</a>(handle); fds = calloc(count, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> pollfd)); <span class="keywordflow">if</span> (fds == NULL) { fprintf(stderr, <span class="stringliteral">"malloc error\n"</span>); exit(EXIT_FAILURE); } <span class="keywordflow">while</span> (master_ticks-- > 0) { <span class="keywordflow">if</span> ((err = <a name="a9"></a><a class="code" href="group___timer.html#a18">snd_timer_poll_descriptors</a>(handle, fds, count)) < 0) { fprintf(stderr, <span class="stringliteral">"snd_timer_poll_descriptors error: %s\n"</span>, <a class="code" href="group___error.html#a2">snd_strerror</a>(err)); exit(EXIT_FAILURE); } <span class="keywordflow">if</span> ((err = poll(fds, count, timeout)) < 0) { fprintf(stderr, <span class="stringliteral">"poll error %i (%s)\n"</span>, err, strerror(err)); exit(EXIT_FAILURE); } <span class="keywordflow">if</span> (err == 0) { fprintf(stderr, <span class="stringliteral">"timer time out!!\n"</span>); exit(EXIT_FAILURE); } <span class="keywordflow">while</span> (<a name="a10"></a><a class="code" href="group___timer.html#a26">snd_timer_read</a>(handle, &tr, <span class="keyword">sizeof</span>(tr)) == <span class="keyword">sizeof</span>(tr)) { printf(<span class="stringliteral">"TIMER: resolution = %u, ticks = %u\n"</span>, tr.resolution, tr.ticks); } } free(fds); } <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[]) { <span class="keywordtype">int</span> idx, err; <span class="keywordtype">int</span> <span class="keyword">class </span>= <a class="code" href="group___timer.html#a78a21">SND_TIMER_CLASS_GLOBAL</a>; <span class="keywordtype">int</span> sclass = <a class="code" href="group___timer.html#a78a19">SND_TIMER_CLASS_NONE</a>; <span class="keywordtype">int</span> card = 0; <span class="keywordtype">int</span> device = <a class="code" href="group___timer.html#a71">SND_TIMER_GLOBAL_SYSTEM</a>; <span class="keywordtype">int</span> subdevice = 0; <span class="keywordtype">int</span> list = 0; snd_timer_t *handle; <a class="code" href="group___timer.html#a0">snd_timer_id_t</a> *id; <a class="code" href="group___timer.html#a1">snd_timer_info_t</a> *info; <a class="code" href="group___timer.html#a2">snd_timer_params_t</a> *params; <span class="keywordtype">char</span> timername[64]; <a name="a11"></a><a class="code" href="group___timer.html#a74">snd_timer_id_alloca</a>(&id); <a name="a12"></a><a class="code" href="group___timer.html#a75">snd_timer_info_alloca</a>(&info); <a name="a13"></a><a class="code" href="group___timer.html#a76">snd_timer_params_alloca</a>(&params); idx = 1; <span class="keywordflow">while</span> (idx < argc) { <span class="keywordflow">if</span> (!strncmp(argv[idx], <span class="stringliteral">"class="</span>, 5)) { <span class="keyword">class </span>= atoi(argv[idx]+6); } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!strncmp(argv[idx], <span class="stringliteral">"sclass="</span>, 6)) { sclass = atoi(argv[idx]+7); } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!strncmp(argv[idx], <span class="stringliteral">"card="</span>, 5)) { card = atoi(argv[idx]+5); } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!strncmp(argv[idx], <span class="stringliteral">"device="</span>, 7)) { device = atoi(argv[idx]+7); } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!strncmp(argv[idx], <span class="stringliteral">"subdevice="</span>, 10)) { subdevice = atoi(argv[idx]+10); } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!strcmp(argv[idx], <span class="stringliteral">"list"</span>)) { list = 1; } idx++; } <span class="keywordflow">if</span> (<span class="keyword">class </span>== <a class="code" href="group___timer.html#a78a20">SND_TIMER_CLASS_SLAVE</a> && sclass == <a class="code" href="group___timer.html#a79a25">SND_TIMER_SCLASS_NONE</a>) { fprintf(stderr, <span class="stringliteral">"slave class is not set\n"</span>); exit(EXIT_FAILURE); } <span class="keywordflow">if</span> (list) { snd_timer_query_t *qhandle; <span class="keywordflow">if</span> ((err = <a name="a14"></a><a class="code" href="group___timer.html#a10">snd_timer_query_open</a>(&qhandle, <span class="stringliteral">"hw"</span>, 0)) < 0) { fprintf(stderr, <span class="stringliteral">"snd_timer_query_open error: %s\n"</span>, <a class="code" href="group___error.html#a2">snd_strerror</a>(err)); exit(EXIT_FAILURE); } <a name="a15"></a><a class="code" href="group___timer.html#a31">snd_timer_id_set_class</a>(id, <a class="code" href="group___timer.html#a78a19">SND_TIMER_CLASS_NONE</a>); <span class="keywordflow">while</span> (1) { <span class="keywordflow">if</span> ((err = <a name="a16"></a><a class="code" href="group___timer.html#a13">snd_timer_query_next_device</a>(qhandle, id)) < 0) { fprintf(stderr, <span class="stringliteral">"timer next device error: %s\n"</span>, <a class="code" href="group___error.html#a2">snd_strerror</a>(err)); <span class="keywordflow">break</span>; } <span class="keywordflow">if</span> (<a name="a17"></a><a class="code" href="group___timer.html#a32">snd_timer_id_get_class</a>(id) < 0) <span class="keywordflow">break</span>; printf(<span class="stringliteral">"Timer device: class %i, sclass %i, card %i, device %i, subdevice %i\n"</span>, <a class="code" href="group___timer.html#a32">snd_timer_id_get_class</a>(id), <a name="a18"></a><a class="code" href="group___timer.html#a34">snd_timer_id_get_sclass</a>(id), <a name="a19"></a><a class="code" href="group___timer.html#a36">snd_timer_id_get_card</a>(id), <a name="a20"></a><a class="code" href="group___timer.html#a38">snd_timer_id_get_device</a>(id), <a name="a21"></a><a class="code" href="group___timer.html#a40">snd_timer_id_get_subdevice</a>(id)); } <a name="a22"></a><a class="code" href="group___timer.html#a12">snd_timer_query_close</a>(qhandle); exit(EXIT_SUCCESS); } sprintf(timername, <span class="stringliteral">"hw:CLASS=%i,SCLASS=%i,CARD=%i,DEV=%i,SUBDEV=%i"</span>, <span class="keyword">class</span>, sclass, card, device, subdevice); <span class="keywordflow">if</span> ((err = <a name="a23"></a><a class="code" href="group___timer.html#a14">snd_timer_open</a>(&handle, timername, <a class="code" href="group___timer.html#a73">SND_TIMER_OPEN_NONBLOCK</a>))<0) { fprintf(stderr, <span class="stringliteral">"timer open %i (%s)\n"</span>, err, <a class="code" href="group___error.html#a2">snd_strerror</a>(err)); exit(EXIT_FAILURE); } printf(<span class="stringliteral">"Using timer class %i, slave class %i, card %i, device %i, subdevice %i\n"</span>, <span class="keyword">class</span>, sclass, card, device, subdevice); <span class="keywordflow">if</span> ((err = <a name="a24"></a><a class="code" href="group___timer.html#a20">snd_timer_info</a>(handle, info)) < 0) { fprintf(stderr, <span class="stringliteral">"timer info %i (%s)\n"</span>, err, <a class="code" href="group___error.html#a2">snd_strerror</a>(err)); exit(0); } printf(<span class="stringliteral">"Timer info:\n"</span>); printf(<span class="stringliteral">" slave = %s\n"</span>, <a name="a25"></a><a class="code" href="group___timer.html#a45">snd_timer_info_is_slave</a>(info) ? <span class="stringliteral">"yes"</span> : <span class="stringliteral">"no"</span>); printf(<span class="stringliteral">" card = %i\n"</span>, <a name="a26"></a><a class="code" href="group___timer.html#a46">snd_timer_info_get_card</a>(info)); printf(<span class="stringliteral">" id = '%s'\n"</span>, <a name="a27"></a><a class="code" href="group___timer.html#a47">snd_timer_info_get_id</a>(info)); printf(<span class="stringliteral">" name = '%s'\n"</span>, <a name="a28"></a><a class="code" href="group___timer.html#a48">snd_timer_info_get_name</a>(info)); printf(<span class="stringliteral">" max ticks = %li\n"</span>, <a name="a29"></a><a class="code" href="group___timer.html#a49">snd_timer_info_get_ticks</a>(info)); printf(<span class="stringliteral">" average resolution = %li\n"</span>, <a name="a30"></a><a class="code" href="group___timer.html#a50">snd_timer_info_get_resolution</a>(info)); <a name="a31"></a><a class="code" href="group___timer.html#a55">snd_timer_params_set_auto_start</a>(params, 1); <span class="keywordflow">if</span> (!<a class="code" href="group___timer.html#a45">snd_timer_info_is_slave</a>(info)) { <a name="a32"></a><a class="code" href="group___timer.html#a56">snd_timer_params_set_ticks</a>(params, (1000000000 / <a class="code" href="group___timer.html#a50">snd_timer_info_get_resolution</a>(info)) / 50); <span class="comment">/* 50Hz */</span> <span class="keywordflow">if</span> (<a name="a33"></a><a class="code" href="group___timer.html#a57">snd_timer_params_get_ticks</a>(params) < 1) <a class="code" href="group___timer.html#a56">snd_timer_params_set_ticks</a>(params, 1); printf(<span class="stringliteral">"Using %li tick(s)\n"</span>, <a class="code" href="group___timer.html#a57">snd_timer_params_get_ticks</a>(params)); } <span class="keywordflow">else</span> { <a class="code" href="group___timer.html#a56">snd_timer_params_set_ticks</a>(params, 1); } <span class="keywordflow">if</span> ((err = <a name="a34"></a><a class="code" href="group___timer.html#a21">snd_timer_params</a>(handle, params)) < 0) { fprintf(stderr, <span class="stringliteral">"timer params %i (%s)\n"</span>, err, <a class="code" href="group___error.html#a2">snd_strerror</a>(err)); exit(0); } show_status(handle); <span class="keywordflow">if</span> ((err = <a name="a35"></a><a class="code" href="group___timer.html#a23">snd_timer_start</a>(handle)) < 0) { fprintf(stderr, <span class="stringliteral">"timer start %i (%s)\n"</span>, err, <a class="code" href="group___error.html#a2">snd_strerror</a>(err)); exit(EXIT_FAILURE); } read_loop(handle, 25, <a class="code" href="group___timer.html#a45">snd_timer_info_is_slave</a>(info) ? 10000 : 25); show_status(handle); <a name="a36"></a><a class="code" href="group___timer.html#a16">snd_timer_close</a>(handle); printf(<span class="stringliteral">"Done\n"</span>); <span class="keywordflow">return</span> EXIT_SUCCESS; } </pre></div><hr><address style="align: right;"><small>Generated on Wed Apr 2 16:06:31 2003 for ALSA project - the C library reference by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0 width=110 height=53></a>1.2.18 </small></address> </body> </html>