1 /* Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 2 * Use of this source code is governed by a BSD-style license that can be 3 * found in the LICENSE file. 4 */ 5 6 #ifndef AUDIO_THREAD_H_ 7 #define AUDIO_THREAD_H_ 8 9 #include <pthread.h> 10 #include <stdint.h> 11 12 #include "cras_iodev.h" 13 #include "cras_types.h" 14 15 struct buffer_share; 16 struct cras_iodev; 17 struct cras_rstream; 18 struct dev_stream; 19 20 /* Open input/output devices. 21 * dev - The device. 22 * wake_ts - When callback is needed to avoid xrun. 23 * coarse_rate_adjust - Hack for when the sample rate needs heavy correction. 24 * input_streaming - For capture, has the input started? 25 */ 26 struct open_dev { 27 struct cras_iodev *dev; 28 struct timespec wake_ts; 29 int coarse_rate_adjust; 30 int input_streaming; 31 struct open_dev *prev, *next; 32 }; 33 34 /* Hold communication pipes and pthread info for the thread used to play or 35 * record audio. 36 * to_thread_fds - Send a message from main to running thread. 37 * to_main_fds - Send a synchronous response to main from running thread. 38 * tid - Thread ID of the running playback/capture thread. 39 * started - Non-zero if the thread has started successfully. 40 * suspended - Non-zero if the thread is suspended. 41 * open_devs - Lists of open input and output devices. 42 */ 43 struct audio_thread { 44 int to_thread_fds[2]; 45 int to_main_fds[2]; 46 pthread_t tid; 47 int started; 48 int suspended; 49 struct open_dev *open_devs[CRAS_NUM_DIRECTIONS]; 50 51 }; 52 53 /* Callback function to be handled in main loop in audio thread. 54 * Args: 55 * data - The data for callback function. 56 */ 57 typedef int (*thread_callback)(void *data); 58 59 /* Creates an audio thread. 60 * Returns: 61 * A pointer to the newly create audio thread. It must be freed by calling 62 * audio_thread_destroy(). Returns NULL on error. 63 */ 64 struct audio_thread *audio_thread_create(); 65 66 /* Adds an open device. 67 * Args: 68 * thread - The thread to add open device to. 69 * dev - The open device to add. 70 */ 71 int audio_thread_add_open_dev(struct audio_thread *thread, 72 struct cras_iodev *dev); 73 74 /* Removes an open device. 75 * Args: 76 * thread - The thread to remove open device from. 77 * dev - The open device to remove. 78 */ 79 int audio_thread_rm_open_dev(struct audio_thread *thread, 80 struct cras_iodev *dev); 81 82 /* Adds an thread_callback to audio thread. 83 * Args: 84 * fd - The file descriptor to be polled for the callback. 85 * The callback will be called when fd is readable. 86 * cb - The callback function. 87 * data - The data for the callback function. 88 */ 89 void audio_thread_add_callback(int fd, thread_callback cb, 90 void *data); 91 92 /* Adds an thread_callback to audio thread. 93 * Args: 94 * fd - The file descriptor to be polled for the callback. 95 * The callback will be called when fd is writeable. 96 * cb - The callback function. 97 * data - The data for the callback function. 98 */ 99 void audio_thread_add_write_callback(int fd, thread_callback cb, 100 void *data); 101 102 /* Removes an thread_callback from audio thread. 103 * Args: 104 * fd - The file descriptor of the previous added callback. 105 */ 106 void audio_thread_rm_callback(int fd); 107 108 /* Removes a thread_callback from main thread. 109 * Args: 110 * thread - The thread to remove callback from. 111 * fd - The file descriptor of the previous added callback. 112 */ 113 int audio_thread_rm_callback_sync(struct audio_thread *thread, int fd); 114 115 116 /* Enables or Disabled the callback associated with fd. */ 117 void audio_thread_enable_callback(int fd, int enabled); 118 119 /* Starts a thread created with audio_thread_create. 120 * Args: 121 * thread - The thread to start. 122 * Returns: 123 * 0 on success, return code from pthread_crate on failure. 124 */ 125 int audio_thread_start(struct audio_thread *thread); 126 127 /* Frees an audio thread created with audio_thread_create(). */ 128 void audio_thread_destroy(struct audio_thread *thread); 129 130 /* Add a stream to the thread. After this call, the ownership of the stream will 131 * be passed to the audio thread. Audio thread is responsible to release the 132 * stream's resources. 133 * Args: 134 * thread - a pointer to the audio thread. 135 * stream - the new stream to add. 136 * devs - an array of devices to attach stream. 137 * num_devs - number of devices in the array pointed by devs 138 * Returns: 139 * zero on success, negative error from the AUDIO_THREAD enum above when an 140 * the thread can't be added. 141 */ 142 int audio_thread_add_stream(struct audio_thread *thread, 143 struct cras_rstream *stream, 144 struct cras_iodev **devs, 145 unsigned int num_devs); 146 147 /* Begin draining a stream and check the draining status. 148 * Args: 149 * thread - a pointer to the audio thread. 150 * stream - the stream to drain/remove. 151 * Returns: 152 * zero if the stream is drained and can be deleted. If the stream is not 153 * completely drained, then the number of milliseconds until is is drained 154 * are returned. 155 */ 156 int audio_thread_drain_stream(struct audio_thread *thread, 157 struct cras_rstream *stream); 158 159 /* Disconnect a stream from the client. 160 * Args: 161 * thread - a pointer to the audio thread. 162 * stream - the stream to be disconnected. 163 * iodev - the device to disconnect from. 164 * Returns: 165 * 0 on success, negative if error. 166 */ 167 int audio_thread_disconnect_stream(struct audio_thread *thread, 168 struct cras_rstream *stream, 169 struct cras_iodev *iodev); 170 171 /* Dumps information about all active streams to syslog. */ 172 int audio_thread_dump_thread_info(struct audio_thread *thread, 173 struct audio_debug_info *info); 174 175 /* Configures the global converter for output remixing. Called by main 176 * thread. */ 177 int audio_thread_config_global_remix(struct audio_thread *thread, 178 unsigned int num_channels, 179 const float *coefficient); 180 181 /* Gets the global remix converter. */ 182 struct cras_fmt_conv *audio_thread_get_global_remix_converter(); 183 184 185 /* Start ramping on a device. 186 * 187 * Ramping is started/updated in audio thread. This function lets the main 188 * thread request that the audio thread start ramping. 189 * 190 * Args: 191 * thread - a pointer to the audio thread. 192 * dev - the device to start ramping. 193 * request - Check the docstrings of CRAS_IODEV_RAMP_REQUEST. 194 * Returns: 195 * 0 on success, negative if error. 196 */ 197 int audio_thread_dev_start_ramp(struct audio_thread *thread, 198 struct cras_iodev *dev, 199 enum CRAS_IODEV_RAMP_REQUEST request); 200 #endif /* AUDIO_THREAD_H_ */ 201