summaryrefslogtreecommitdiff
path: root/portmidi/porttime/porttime.h
blob: 0a61c5c12d3308534042247c394cb552d7d9286e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/** @file porttime.h portable interface to millisecond timer. */

/* CHANGE LOG FOR PORTTIME
  10-Jun-03 Mark Nelson & RBD
    boost priority of timer thread in ptlinux.c implementation
 */

#ifndef PORTMIDI_PORTTIME_H
#define PORTMIDI_PORTTIME_H

/* Should there be a way to choose the source of time here? */

#ifdef WIN32
#ifndef INT32_DEFINED
// rather than having users install a special .h file for windows, 
// just put the required definitions inline here. portmidi.h uses
// these too, so the definitions are (unfortunately) duplicated there
typedef int int32_t;
typedef unsigned int uint32_t;
#define INT32_DEFINED
#endif
#else
#include <stdint.h> // needed for int32_t
#endif

#ifdef __cplusplus
extern "C" {
#endif

#ifndef PMEXPORT
#ifdef _WINDLL
#define PMEXPORT __declspec(dllexport)
#else
#define PMEXPORT 
#endif
#endif

/** @defgroup grp_porttime PortTime: Millisecond Timer
    @{
*/

typedef enum {
    ptNoError = 0,         /* success */
    ptHostError = -10000,  /* a system-specific error occurred */
    ptAlreadyStarted,      /* cannot start timer because it is already started */
    ptAlreadyStopped,      /* cannot stop timer because it is already stopped */
    ptInsufficientMemory   /* memory could not be allocated */
} PtError; /**< @brief @enum  PtError PortTime error code; a common return type.
            * No error is indicated by zero; errors are indicated by < 0.
            */

/** real time or time offset in milliseconds. */
typedef int32_t PtTimestamp;

/** a function that gets a current time */
typedef void (PtCallback)(PtTimestamp timestamp, void *userData);

/** start a real-time clock service.

    @param resolution the timer resolution in ms. The time will advance every
    \p resolution ms.

    @param callback a function pointer to be called every resolution ms.

    @param userData is passed to \p callback as a parameter.

    @return #ptNoError on success. See #PtError for other values.
*/
PMEXPORT PtError Pt_Start(int resolution, PtCallback *callback, void *userData);

/** stop the timer.

    @return #ptNoError on success. See #PtError for other values.
*/
PMEXPORT PtError Pt_Stop(void);

/** test if the timer is running.
 
    @return TRUE or FALSE
*/
PMEXPORT int Pt_Started(void);

/** get the current time in ms.

    @return the current time
*/
PMEXPORT PtTimestamp Pt_Time(void);

/** pauses the current thread, allowing other threads to run.

    @param duration the length of the pause in ms. The true duration 
    of the pause may be rounded to the nearest or next clock tick
    as determined by resolution in #Pt_Start().
*/
PMEXPORT void Pt_Sleep(int32_t duration);

/** @} */

#ifdef __cplusplus
}
#endif

#endif // PORTMIDI_PORTTIME_H