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 * Handles various system-level settings. 6 * 7 * Volume: The system volume is represented as a value from 0 to 100. This 8 * number will be interpreted by the output device and applied to the hardware. 9 * The value will be mapped to dB by the active device as it will know its curve 10 * the best. 11 */ 12 13 #ifndef CRAS_SYSTEM_STATE_H_ 14 #define CRAS_SYSTEM_STATE_H_ 15 16 #include <stddef.h> 17 18 #include "cras_types.h" 19 20 #define CRAS_MAX_SYSTEM_VOLUME 100 21 #define DEFAULT_CAPTURE_GAIN 2000 /* 20dB of gain. */ 22 /* Default to 1--dB of range for palyback and capture. */ 23 #define DEFAULT_MIN_VOLUME_DBFS -10000 24 #define DEFAULT_MAX_VOLUME_DBFS 0 25 #define DEFAULT_MIN_CAPTURE_GAIN -5000 26 #define DEFAULT_MAX_CAPTURE_GAIN 5000 27 28 struct cras_tm; 29 30 /* Initialize system settings. 31 * 32 * Args: 33 * device_config_dir - Directory for device configs where volume curves live. 34 */ 35 void cras_system_state_init(const char *device_config_dir); 36 void cras_system_state_deinit(); 37 38 /* Sets the suffix string to control which UCM config fo load. */ 39 void cras_system_state_set_internal_ucm_suffix(const char *internal_ucm_suffix); 40 41 /* Sets the system volume. Will be applied by the active device. */ 42 void cras_system_set_volume(size_t volume); 43 /* Gets the current system volume. */ 44 size_t cras_system_get_volume(); 45 46 /* Sets the system capture volume. Will be applied by the active device. */ 47 void cras_system_set_capture_gain(long gain); 48 /* Gets the current system capture volume. */ 49 long cras_system_get_capture_gain(); 50 51 /* Sets if the system is muted by the user. */ 52 void cras_system_set_user_mute(int muted); 53 /* Sets if the system is muted for . */ 54 void cras_system_set_mute(int muted); 55 /* Sets if the system muting is locked or not. */ 56 void cras_system_set_mute_locked(int locked); 57 /* Gets the current mute state of the system. */ 58 int cras_system_get_mute(); 59 /* Gets the current user mute state. */ 60 int cras_system_get_user_mute(); 61 /* Gets the current system mute state. */ 62 int cras_system_get_system_mute(); 63 /* Gets if the system muting is locked or not. */ 64 int cras_system_get_mute_locked(); 65 66 /* Gets the suspend state of audio. */ 67 int cras_system_get_suspended(); 68 69 /* Sets the suspend state of audio. 70 * Args: 71 * suspend - True for suspend, false for resume. 72 */ 73 void cras_system_set_suspended(int suspend); 74 75 /* Sets if the system capture path is muted or not. */ 76 void cras_system_set_capture_mute(int muted); 77 /* Sets if the system capture path muting is locked or not. */ 78 void cras_system_set_capture_mute_locked(int locked); 79 /* Gets the current mute state of the system capture path. */ 80 int cras_system_get_capture_mute(); 81 /* Gets if the system capture path muting is locked or not. */ 82 int cras_system_get_capture_mute_locked(); 83 84 /* Sets the value in dB of the MAX and MIN volume settings. This will allow 85 * clients to query what range of control is available. Both arguments are 86 * specified as dB * 100. 87 * Args: 88 * min - dB value when volume = 1 (0 mutes). 89 * max - dB value when volume = CRAS_MAX_SYSTEM_VOLUME 90 */ 91 void cras_system_set_volume_limits(long min, long max); 92 /* Returns the dB value when volume = 1, in dB * 100. */ 93 long cras_system_get_min_volume(); 94 /* Returns the dB value when volume = CRAS_MAX_SYSTEM_VOLUME, in dB * 100. */ 95 long cras_system_get_max_volume(); 96 97 /* Sets the limits in dB * 100 of the MAX and MIN capture gain. This will allow 98 * clients to query what range of control is available. Both arguments are 99 * specified as dB * 100. 100 * Args: 101 * min - minimum allowed capture gain. 102 * max - maximum allowed capture gaax. 103 */ 104 void cras_system_set_capture_gain_limits(long min, long max); 105 /* Returns the max value allowed for capture gain in dB * 100. */ 106 long cras_system_get_min_capture_gain(); 107 /* Returns the min value allowed for capture gain in dB * 100. */ 108 long cras_system_get_max_capture_gain(); 109 110 /* Adds a card at the given index to the system. When a new card is found 111 * (through a udev event notification) this will add the card to the system, 112 * causing its devices to become available for playback/capture. 113 * Args: 114 * alsa_card_info - Info about the alsa card (Index, type, etc.). 115 * Returns: 116 * 0 on success, negative error on failure (Can't create or card already 117 * exists). 118 */ 119 int cras_system_add_alsa_card(struct cras_alsa_card_info *alsa_card_info); 120 121 /* Removes a card. When a device is removed this will do the cleanup. Device 122 * at index must have been added using cras_system_add_alsa_card(). 123 * Args: 124 * alsa_card_index - Index ALSA uses to refer to the card. The X in "hw:X". 125 * Returns: 126 * 0 on success, negative error on failure (Can't destroy or card doesn't 127 * exist). 128 */ 129 int cras_system_remove_alsa_card(size_t alsa_card_index); 130 131 /* Checks if an alsa card has been added to the system. 132 * Args: 133 * alsa_card_index - Index ALSA uses to refer to the card. The X in "hw:X". 134 * Returns: 135 * 1 if the card has already been added, 0 if not. 136 */ 137 int cras_system_alsa_card_exists(unsigned alsa_card_index); 138 139 /* Poll interface provides a way of getting a callback when 'select' 140 * returns for a given file descriptor. 141 */ 142 143 /* Register the function to use to inform the select loop about new 144 * file descriptors and callbacks. 145 * Args: 146 * add - The function to call when a new fd is added. 147 * rm - The function to call when a new fd is removed. 148 * select_data - Additional value passed back to add and remove. 149 * Returns: 150 * 0 on success, or -EBUSY if there is already a registered handler. 151 */ 152 int cras_system_set_select_handler(int (*add)(int fd, 153 void (*callback)(void *data), 154 void *callback_data, 155 void *select_data), 156 void (*rm)(int fd, void *select_data), 157 void *select_data); 158 159 /* Adds the fd and callback pair. When select indicates that fd is readable, 160 * the callback will be called. 161 * Args: 162 * fd - The file descriptor to pass to select(2). 163 * callback - The callback to call when fd is ready. 164 * callback_data - Value passed back to the callback. 165 * Returns: 166 * 0 on success or a negative error code on failure. 167 */ 168 int cras_system_add_select_fd(int fd, 169 void (*callback)(void *data), 170 void *callback_data); 171 172 /* Removes the fd from the list of fds that are passed to select. 173 * Args: 174 * fd - The file descriptor to remove from the list. 175 */ 176 void cras_system_rm_select_fd(int fd); 177 178 /* Signals that an audio input or output stream has been added to the system. 179 * This allows the count of active streams can be used to notice when the audio 180 * subsystem is idle. 181 * Args: 182 * direction - Directions of audio streams. 183 */ 184 void cras_system_state_stream_added(enum CRAS_STREAM_DIRECTION direction); 185 186 /* Signals that an audio input or output stream has been removed from the 187 * system. This allows the count of active streams can be used to notice when 188 * the audio subsystem is idle. 189 * Args: 190 * direction - Directions of audio stream. 191 */ 192 void cras_system_state_stream_removed(enum CRAS_STREAM_DIRECTION direction); 193 194 /* Returns the number of active playback and capture streams. */ 195 unsigned cras_system_state_get_active_streams(); 196 197 /* Returns the number of active streams with given direction. 198 * Args: 199 * direction - Directions of audio stream. 200 */ 201 unsigned cras_system_state_get_active_streams_by_direction( 202 enum CRAS_STREAM_DIRECTION direction); 203 204 /* Fills ts with the time the last stream was removed from the system, the time 205 * the stream count went to zero. 206 */ 207 void cras_system_state_get_last_stream_active_time(struct cras_timespec *ts); 208 209 /* Returns output devices information. 210 * Args: 211 * devs - returns the array of output devices information. 212 * Returns: 213 * number of output devices. 214 */ 215 int cras_system_state_get_output_devs(const struct cras_iodev_info **devs); 216 217 /* Returns input devices information. 218 * Args: 219 * devs - returns the array of input devices information. 220 * Returns: 221 * number of input devices. 222 */ 223 int cras_system_state_get_input_devs(const struct cras_iodev_info **devs); 224 225 /* Returns output nodes information. 226 * Args: 227 * nodes - returns the array of output nodes information. 228 * Returns: 229 * number of output nodes. 230 */ 231 int cras_system_state_get_output_nodes(const struct cras_ionode_info **nodes); 232 233 /* Returns input nodes information. 234 * Args: 235 * nodes - returns the array of input nodes information. 236 * Returns: 237 * number of input nodes. 238 */ 239 int cras_system_state_get_input_nodes(const struct cras_ionode_info **nodes); 240 241 /* Returns a pointer to the current system state that is shared with clients. 242 * This also 'locks' the structure by incrementing the update count to an odd 243 * value. 244 */ 245 struct cras_server_state *cras_system_state_update_begin(); 246 247 /* Unlocks the system state structure that was updated after calling 248 * cras_system_state_update_begin by again incrementing the update count. 249 */ 250 void cras_system_state_update_complete(); 251 252 /* Gets a pointer to the system state without locking it. Only used for debug 253 * log. Don't add calls to this function. */ 254 struct cras_server_state *cras_system_state_get_no_lock(); 255 256 /* Returns the shm fd for the server_state structure. */ 257 key_t cras_sys_state_shm_fd(); 258 259 /* Returns the timer manager. */ 260 struct cras_tm *cras_system_state_get_tm(); 261 262 #endif /* CRAS_SYSTEM_STATE_H_ */ 263