Sat Aug 6 00:39:32 2011

Asterisk developer's documentation


time.h

Go to the documentation of this file.
00001 /*
00002  * Asterisk -- An open source telephony toolkit.
00003  *
00004  * Copyright (C) 1999 - 2005, Digium, Inc.
00005  *
00006  * Mark Spencer <markster@digium.com>
00007  *
00008  * See http://www.asterisk.org for more information about
00009  * the Asterisk project. Please do not directly contact
00010  * any of the maintainers of this project for assistance;
00011  * the project provides a web site, mailing lists and IRC
00012  * channels for your use.
00013  *
00014  * This program is free software, distributed under the terms of
00015  * the GNU General Public License Version 2. See the LICENSE file
00016  * at the top of the source tree.
00017  */
00018 
00019 /*! \file
00020  * \brief Time-related functions and macros
00021  */
00022 
00023 #ifndef _ASTERISK_TIME_H
00024 #define _ASTERISK_TIME_H
00025 
00026 #include <sys/time.h>
00027 #include <stdlib.h>
00028 
00029 #include "asterisk/inline_api.h"
00030 
00031 /* We have to let the compiler learn what types to use for the elements of a
00032    struct timeval since on linux, it's time_t and suseconds_t, but on *BSD,
00033    they are just a long. */
00034 extern struct timeval tv;
00035 typedef typeof(tv.tv_sec) ast_time_t;
00036 typedef typeof(tv.tv_usec) ast_suseconds_t;
00037 
00038 /*!
00039  * \brief Computes the difference (in milliseconds) between two \c struct \c timeval instances.
00040  * \param end end of the time period
00041  * \param start beginning of the time period
00042  * \return the difference in milliseconds
00043  */
00044 AST_INLINE_API(
00045 int ast_tvdiff_ms(struct timeval end, struct timeval start),
00046 {
00047    /* the offset by 1,000,000 below is intentional...
00048       it avoids differences in the way that division
00049       is handled for positive and negative numbers, by ensuring
00050       that the divisor is always positive
00051    */
00052    return  ((end.tv_sec - start.tv_sec) * 1000) +
00053       (((1000000 + end.tv_usec - start.tv_usec) / 1000) - 1000);
00054 }
00055 )
00056 
00057 /*!
00058  * \brief Returns true if the argument is 0,0
00059  */
00060 AST_INLINE_API(
00061 int ast_tvzero(const struct timeval t),
00062 {
00063    return (t.tv_sec == 0 && t.tv_usec == 0);
00064 }
00065 )
00066 
00067 /*!
00068  * \brief Compres two \c struct \c timeval instances returning
00069  * -1, 0, 1 if the first arg is smaller, equal or greater to the second.
00070  */
00071 AST_INLINE_API(
00072 int ast_tvcmp(struct timeval _a, struct timeval _b),
00073 {
00074    if (_a.tv_sec < _b.tv_sec)
00075       return -1;
00076    if (_a.tv_sec > _b.tv_sec)
00077       return 1;
00078    /* now seconds are equal */
00079    if (_a.tv_usec < _b.tv_usec)
00080       return -1;
00081    if (_a.tv_usec > _b.tv_usec)
00082       return 1;
00083    return 0;
00084 }
00085 )
00086 
00087 /*!
00088  * \brief Returns true if the two \c struct \c timeval arguments are equal.
00089  */
00090 AST_INLINE_API(
00091 int ast_tveq(struct timeval _a, struct timeval _b),
00092 {
00093    return (_a.tv_sec == _b.tv_sec && _a.tv_usec == _b.tv_usec);
00094 }
00095 )
00096 
00097 /*!
00098  * \brief Returns current timeval. Meant to replace calls to gettimeofday().
00099  */
00100 AST_INLINE_API(
00101 struct timeval ast_tvnow(void),
00102 {
00103    struct timeval t;
00104    gettimeofday(&t, NULL);
00105    return t;
00106 }
00107 )
00108 
00109 /*!
00110  * \brief Returns the sum of two timevals a + b
00111  */
00112 struct timeval ast_tvadd(struct timeval a, struct timeval b);
00113 
00114 /*!
00115  * \brief Returns the difference of two timevals a - b
00116  */
00117 struct timeval ast_tvsub(struct timeval a, struct timeval b);
00118 
00119 /*!
00120  * \brief Returns a timeval from sec, usec
00121  */
00122 AST_INLINE_API(
00123 struct timeval ast_tv(ast_time_t sec, ast_suseconds_t usec),
00124 {
00125    struct timeval t;
00126    t.tv_sec = sec;
00127    t.tv_usec = usec;
00128    return t;
00129 }
00130 )
00131 
00132 /*!
00133  * \brief Returns a timeval corresponding to the duration of n samples at rate r.
00134  * Useful to convert samples to timevals, or even milliseconds to timevals
00135  * in the form ast_samp2tv(milliseconds, 1000)
00136  */
00137 AST_INLINE_API(
00138 struct timeval ast_samp2tv(unsigned int _nsamp, unsigned int _rate),
00139 {
00140    return ast_tv(_nsamp / _rate, ((_nsamp % _rate) * (4000000 / _rate)) / 4); /* this calculation is accurate up to 32000Hz. */
00141 }
00142 )
00143 
00144 #endif /* _ASTERISK_TIME_H */

Generated on Sat Aug 6 00:39:32 2011 for Asterisk - the Open Source PBX by  doxygen 1.4.7