summaryrefslogtreecommitdiffstats
path: root/third_party/rust/audio_thread_priority/audio_thread_priority.h
blob: b883728b6dc35446acc9296fae8793d9ded91316 (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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef AUDIO_THREAD_PRIORITY_H
#define AUDIO_THREAD_PRIORITY_H

#include <stdint.h>
#include <stdlib.h>

/**
 * An opaque structure containing information about a thread that was promoted
 * to real-time priority.
 */
struct atp_handle;
struct atp_thread_info;
extern size_t ATP_THREAD_INFO_SIZE;

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

/**
 * Promotes the current thread to real-time priority.
 *
 * audio_buffer_frames: number of frames per audio buffer. If unknown, passing 0
 * will choose an appropriate number, conservatively. If variable, either pass 0
 * or an upper bound.
 * audio_samplerate_hz: sample-rate for this audio stream, in Hz
 *
 * Returns an opaque handle in case of success, NULL otherwise.
 */
atp_handle *atp_promote_current_thread_to_real_time(uint32_t audio_buffer_frames,
                                                    uint32_t audio_samplerate_hz);


/**
 * Demotes the current thread promoted to real-time priority via
 * `atp_demote_current_thread_from_real_time` to its previous priority.
 *
 * Returns 0 in case of success, non-zero otherwise.
 */
int32_t atp_demote_current_thread_from_real_time(atp_handle *handle);

/**
 * Frees an atp_handle. This is useful when it impractical to call
 *`atp_demote_current_thread_from_real_time` on the right thread. Access to the
 * handle must be synchronized externaly (or the related thread must have
 * exited).
 *
 * Returns 0 in case of success, non-zero otherwise.
 */
int32_t atp_free_handle(atp_handle *handle);

/*
 * Linux-only API.
 *
 * The Linux backend uses DBUS to promote a thread to real-time priority. In
 * environment where this is not possible (due to sandboxing), this set of
 * functions allow remoting the call to a process that can make DBUS calls.
 *
 * To do so:
 * - Set the real-time limit from within the process where a
 *   thread will be promoted. This is a `setrlimit` call, that can be done
 *   before the sandbox lockdown.
 * - Then, gather information on the thread that will be promoted.
 * - Serialize this info.
 * - Send over the serialized data via an IPC mechanism
 * - Deserialize the inf
 * - Call `atp_promote_thread_to_real_time`
 */

#ifdef __linux__
/**
 * Promotes a thread, possibly in another process, to real-time priority.
 *
 * thread_info: info on the thread to promote, gathered with
 * `atp_get_current_thread_info()`, called on the thread itself.
 * audio_buffer_frames: number of frames per audio buffer. If unknown, passing 0
 * will choose an appropriate number, conservatively. If variable, either pass 0
 * or an upper bound.
 * audio_samplerate_hz: sample-rate for this audio stream, in Hz
 *
 * Returns an opaque handle in case of success, NULL otherwise.
 *
 * This call is useful on Linux desktop only, when the process is sandboxed and
 * cannot promote itself directly.
 */
atp_handle *atp_promote_thread_to_real_time(atp_thread_info *thread_info);

/**
 * Demotes a thread promoted to real-time priority via
 * `atp_demote_thread_from_real_time` to its previous priority.
 *
 * Returns 0 in case of success, non-zero otherwise.
 *
 * This call is useful on Linux desktop only, when the process is sandboxed and
 * cannot promote itself directly.
 */
int32_t atp_demote_thread_from_real_time(atp_thread_info* thread_info);

/**
 * Gather informations from the calling thread, to be able to promote it from
 * another thread and/or process.
 *
 * Returns a non-null pointer to an `atp_thread_info` structure in case of
 * sucess, to be freed later with `atp_free_thread_info`, and NULL otherwise.
 *
 * This call is useful on Linux desktop only, when the process is sandboxed and
 * cannot promote itself directly.
 */
atp_thread_info *atp_get_current_thread_info();

/**
 * Free an `atp_thread_info` structure.
 *
 * Returns 0 in case of success, non-zero in case of error (because thread_info
 * was NULL).
 */
int32_t atp_free_thread_info(atp_thread_info *thread_info);

/**
 * Serialize an `atp_thread_info` to a byte buffer that is
 * sizeof(atp_thread_info) long.
 */
void atp_serialize_thread_info(atp_thread_info *thread_info, uint8_t *bytes);

/**
 * Deserialize a byte buffer of sizeof(atp_thread_info) to an `atp_thread_info`
 * pointer. It can be then freed using atp_free_thread_info.
 * */
atp_thread_info* atp_deserialize_thread_info(uint8_t *bytes);

/**
 * Set real-time limit for the calling process.
 *
 * This is useful only on Linux desktop, and allows remoting the rtkit DBUS call
 * to a process that has access to DBUS. This function has to be called before
 * attempting to promote threads from another process.
 *
 * This sets the real-time computation limit. For actually promoting the thread
 * to a real-time scheduling class, see `atp_promote_thread_to_real_time`.
 */
int32_t atp_set_real_time_limit(uint32_t audio_buffer_frames,
                                uint32_t audio_samplerate_hz);

#endif // __linux__

#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus

#endif // AUDIO_THREAD_PRIORITY_H