Home | History | Annotate | Download | only in server
      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 /*
      7  * Remote Stream - An audio steam from/to a client.
      8  */
      9 #ifndef CRAS_RSTREAM_H_
     10 #define CRAS_RSTREAM_H_
     11 
     12 #include "cras_apm_list.h"
     13 #include "cras_shm.h"
     14 #include "cras_types.h"
     15 
     16 struct cras_rclient;
     17 struct dev_mix;
     18 
     19 /* Holds identifiers for an shm segment.
     20  *  shm_fd - File descriptor shared with client to access shm.
     21  *  shm_name - Name of the shm area.
     22  *  length - Size of the shm region.
     23  */
     24 struct rstream_shm_info {
     25 	int shm_fd;
     26 	char shm_name[NAME_MAX];
     27 	size_t length;
     28 };
     29 
     30 /* Holds informations about the master active device.
     31  * Members:
     32  *    dev_id - id of the master device.
     33  *    dev_ptr - pointer to the master device.
     34  */
     35 struct master_dev_info {
     36 	int dev_id;
     37 	void *dev_ptr;
     38 };
     39 
     40 /* cras_rstream is used to manage an active audio stream from
     41  * a client.  Each client can have any number of open streams for
     42  * playing or recording.
     43  * Members:
     44  *    stream_id - identifier for this stream.
     45  *    stream_type - not used.
     46  *    direction - input or output.
     47  *    flags - Indicative of what special handling is needed.
     48  *    fd - Socket for requesting and sending audio buffer events.
     49  *    buffer_frames - Buffer size in frames.
     50  *    cb_threshold - Callback client when this much is left.
     51  *    master_dev_info - The info of the master device this stream attaches to.
     52  *    is_draining - The stream is draining and waiting to be removed.
     53  *    client - The client who uses this stream.
     54  *    shm_info - Configuration data for shared memory
     55  *    shm - shared memory
     56  *    audio_area - space for playback/capture audio
     57  *    format - format of the stream
     58  *    next_cb_ts - Next callback time for this stream.
     59  *    sleep_interval_ts - Time between audio callbacks.
     60  *    last_fetch_ts - The time of the last stream fetch.
     61  *    longest_fetch_interval_ts - Longest interval between two fetches.
     62  *    buf_state - State of the buffer from all devices for this stream.
     63  *    apm_list - List of audio processing module instances.
     64  *    num_attached_devs - Number of iodevs this stream has attached to.
     65  *    queued_frames - Cached value of the number of queued frames in shm.
     66  *    is_pinned - True if the stream is a pinned stream, false otherwise.
     67  *    pinned_dev_idx - device the stream is pinned, 0 if none.
     68  *    triggered - True if already notified TRIGGER_ONLY stream, false otherwise.
     69  */
     70 struct cras_rstream {
     71 	cras_stream_id_t stream_id;
     72 	enum CRAS_STREAM_TYPE stream_type;
     73 	enum CRAS_STREAM_DIRECTION direction;
     74 	uint32_t flags;
     75 	int fd;
     76 	size_t buffer_frames;
     77 	size_t cb_threshold;
     78 	int is_draining;
     79 	struct master_dev_info master_dev;
     80 	struct cras_rclient *client;
     81 	struct rstream_shm_info shm_info;
     82 	struct cras_audio_shm shm;
     83 	struct cras_audio_area *audio_area;
     84 	struct cras_audio_format format;
     85 	struct timespec next_cb_ts;
     86 	struct timespec sleep_interval_ts;
     87 	struct timespec last_fetch_ts;
     88 	struct timespec longest_fetch_interval;
     89 	struct buffer_share *buf_state;
     90 	struct cras_apm_list *apm_list;
     91 	int num_attached_devs;
     92 	int queued_frames;
     93 	int is_pinned;
     94 	uint32_t pinned_dev_idx;
     95 	int triggered;
     96 	struct cras_rstream *prev, *next;
     97 };
     98 
     99 /* Config for creating an rstream.
    100  *    stream_type - CRAS_STREAM_TYPE.
    101  *    direction - CRAS_STREAM_OUTPUT or CRAS_STREAM_INPUT.
    102  *    dev_idx - Pin to this device if != NO_DEVICE.
    103  *    flags - Any special handling for this stream.
    104  *    effects - Bit map of effects to be enabled on this stream.
    105  *    format - The audio format the stream wishes to use.
    106  *    buffer_frames - Total number of audio frames to buffer.
    107  *    cb_threshold - # of frames when to request more from the client.
    108  *    audio_fd - The fd to read/write audio signals to.
    109  *    client - The client that owns this stream.
    110  */
    111 struct cras_rstream_config {
    112 	cras_stream_id_t stream_id;
    113 	enum CRAS_STREAM_TYPE stream_type;
    114 	enum CRAS_STREAM_DIRECTION direction;
    115 	uint32_t dev_idx;
    116 	uint32_t flags;
    117 	uint32_t effects;
    118 	const struct cras_audio_format *format;
    119 	size_t buffer_frames;
    120 	size_t cb_threshold;
    121 	int audio_fd;
    122 	struct cras_rclient *client;
    123 };
    124 
    125 /* Creates an rstream.
    126  * Args:
    127  *    config - Params for configuration of the new rstream.
    128  *    stream_out - Filled with the newly created stream pointer.
    129  * Returns:
    130  *    0 on success, EINVAL if an invalid argument is passed, or ENOMEM if out of
    131  *    memory.
    132  */
    133 int cras_rstream_create(struct cras_rstream_config *config,
    134 			struct cras_rstream **stream_out);
    135 
    136 /* Destroys an rstream. */
    137 void cras_rstream_destroy(struct cras_rstream *stream);
    138 
    139 /* Gets the id of the stream */
    140 static inline cras_stream_id_t cras_rstream_id(
    141 		const struct cras_rstream *stream)
    142 {
    143 	return stream->stream_id;
    144 }
    145 
    146 /* Gets the total buffer size in frames for the given client stream. */
    147 static inline size_t cras_rstream_get_buffer_frames(
    148 		const struct cras_rstream *stream)
    149 {
    150 	return stream->buffer_frames;
    151 }
    152 
    153 /* Gets the callback threshold in frames for the given client stream. */
    154 static inline size_t cras_rstream_get_cb_threshold(
    155 		const struct cras_rstream *stream)
    156 {
    157 	return stream->cb_threshold;
    158 }
    159 
    160 /* Gets the max write size for the stream. */
    161 static inline size_t cras_rstream_get_max_write_frames(
    162 		const struct cras_rstream *stream)
    163 {
    164 	if (stream->flags & BULK_AUDIO_OK)
    165 		return cras_rstream_get_buffer_frames(stream);
    166 	return cras_rstream_get_cb_threshold(stream);
    167 }
    168 
    169 /* Gets the stream type of this stream. */
    170 static inline enum CRAS_STREAM_TYPE cras_rstream_get_type(
    171 		const struct cras_rstream *stream)
    172 {
    173 	return stream->stream_type;
    174 }
    175 
    176 /* Gets the direction (input/output/loopback) of the stream. */
    177 static inline enum CRAS_STREAM_DIRECTION cras_rstream_get_direction(
    178 		const struct cras_rstream *stream)
    179 {
    180 	return stream->direction;
    181 }
    182 
    183 /* Gets the format for the stream. */
    184 static inline void cras_rstream_set_format(struct cras_rstream *stream,
    185 					   const struct cras_audio_format *fmt)
    186 {
    187 	stream->format = *fmt;
    188 }
    189 
    190 /* Sets the format for the stream. */
    191 static inline int cras_rstream_get_format(const struct cras_rstream *stream,
    192 					  struct cras_audio_format *fmt)
    193 {
    194 	*fmt = stream->format;
    195 	return 0;
    196 }
    197 
    198 /* Gets the fd to be used to poll this client for audio. */
    199 static inline int cras_rstream_get_audio_fd(const struct cras_rstream *stream)
    200 {
    201 	return stream->fd;
    202 }
    203 
    204 /* Gets the is_draning flag. */
    205 static inline
    206 int cras_rstream_get_is_draining(const struct cras_rstream *stream)
    207 {
    208 	return stream->is_draining;
    209 }
    210 
    211 /* Sets the is_draning flag. */
    212 static inline void cras_rstream_set_is_draining(struct cras_rstream *stream,
    213 					    int is_draining)
    214 {
    215 	stream->is_draining = is_draining;
    216 }
    217 
    218 /* Gets the shm key used to find the outputshm region. */
    219 static inline int cras_rstream_output_shm_fd(const struct cras_rstream *stream)
    220 {
    221 	return stream->shm_info.shm_fd;
    222 }
    223 
    224 /* Gets the shm key used to find the input shm region. */
    225 static inline int cras_rstream_input_shm_fd(const struct cras_rstream *stream)
    226 {
    227 	return stream->shm_info.shm_fd;
    228 }
    229 
    230 /* Gets the total size of shm memory allocated. */
    231 static inline size_t cras_rstream_get_total_shm_size(
    232 		const struct cras_rstream *stream)
    233 {
    234 	if (stream->direction == CRAS_STREAM_OUTPUT)
    235 		return cras_shm_total_size(&stream->shm);
    236 
    237 	/* Use the shm size for loopback streams. */
    238 	return cras_shm_total_size(&stream->shm);
    239 }
    240 
    241 /* Gets shared memory region for this stream. */
    242 static inline
    243 struct cras_audio_shm *cras_rstream_input_shm(struct cras_rstream *stream)
    244 {
    245 	return &stream->shm;
    246 }
    247 
    248 /* Gets shared memory region for this stream. */
    249 static inline
    250 struct cras_audio_shm *cras_rstream_output_shm(struct cras_rstream *stream)
    251 {
    252 	return &stream->shm;
    253 }
    254 
    255 /* Checks if the stream uses an output device. */
    256 static inline int stream_uses_output(const struct cras_rstream *s)
    257 {
    258 	return cras_stream_uses_output_hw(s->direction);
    259 }
    260 
    261 /* Checks if the stream uses an input device. */
    262 static inline int stream_uses_input(const struct cras_rstream *s)
    263 {
    264 	return cras_stream_uses_input_hw(s->direction);
    265 }
    266 
    267 static inline int stream_is_server_only(const struct cras_rstream *s)
    268 {
    269 	return s->flags & SERVER_ONLY;
    270 }
    271 
    272 /* Gets the enabled effects of this stream. */
    273 unsigned int cras_rstream_get_effects(const struct cras_rstream *stream);
    274 
    275 /* Gets the format of data after stream specific processing. */
    276 struct cras_audio_format *cras_rstream_post_processing_format(
    277 		const struct cras_rstream *stream, void *dev_ptr);
    278 
    279 /* Checks how much time has passed since last stream fetch and records
    280  * the longest fetch interval. */
    281 void cras_rstream_record_fetch_interval(struct cras_rstream *rstream,
    282 					const struct timespec *now);
    283 
    284 /* Requests min_req frames from the client. */
    285 int cras_rstream_request_audio(struct cras_rstream *stream,
    286 			       const struct timespec *now);
    287 
    288 /* Tells a capture client that count frames are ready. */
    289 int cras_rstream_audio_ready(struct cras_rstream *stream, size_t count);
    290 
    291 /* Let the rstream know when a device is added or removed. */
    292 void cras_rstream_dev_attach(struct cras_rstream *rstream,
    293 			     unsigned int dev_id,
    294 			     void *dev_ptr);
    295 void cras_rstream_dev_detach(struct cras_rstream *rstream, unsigned int dev_id);
    296 
    297 /* A device using this stream has read or written samples. */
    298 void cras_rstream_dev_offset_update(struct cras_rstream *rstream,
    299 				    unsigned int frames,
    300 				    unsigned int dev_id);
    301 
    302 void cras_rstream_update_input_write_pointer(struct cras_rstream *rstream);
    303 void cras_rstream_update_output_read_pointer(struct cras_rstream *rstream);
    304 
    305 unsigned int cras_rstream_dev_offset(const struct cras_rstream *rstream,
    306 				     unsigned int dev_id);
    307 
    308 static inline unsigned int cras_rstream_level(struct cras_rstream *rstream)
    309 {
    310 	const struct cras_audio_shm *shm = cras_rstream_input_shm(rstream);
    311 	return cras_shm_frames_written(shm);
    312 }
    313 
    314 static inline int cras_rstream_input_level_met(struct cras_rstream *rstream)
    315 {
    316 	const struct cras_audio_shm *shm = cras_rstream_input_shm(rstream);
    317 	return cras_shm_frames_written(shm) >= rstream->cb_threshold;
    318 }
    319 
    320 /* Updates the number of queued frames in shm. The queued frames should be
    321  * updated everytime before calling cras_rstream_playable_frames.
    322  */
    323 void cras_rstream_update_queued_frames(struct cras_rstream *rstream);
    324 
    325 /* Returns the number of playable samples in shm for the given device id. */
    326 unsigned int cras_rstream_playable_frames(struct cras_rstream *rstream,
    327 					  unsigned int dev_id);
    328 
    329 /* Returns the volume scaler for this stream. */
    330 float cras_rstream_get_volume_scaler(struct cras_rstream *rstream);
    331 
    332 /* Returns a pointer to readable frames, fills frames with the number of frames
    333  * available. */
    334 uint8_t *cras_rstream_get_readable_frames(struct cras_rstream *rstream,
    335 					  unsigned int offset,
    336 					  size_t *frames);
    337 
    338 /* Returns non-zero if the stream is muted. */
    339 int cras_rstream_get_mute(const struct cras_rstream *rstream);
    340 
    341 /*
    342  * Returns non-zero if the stream is pending a reply from client.
    343  * - For playback, stream is waiting for AUDIO_MESSAGE_DATA_READY message from
    344  *   client.
    345  * - For capture, stream is waiting for AUDIO_MESSAGE_DATA_CAPTURED message
    346  *   from client.
    347  */
    348 int cras_rstream_is_pending_reply(const struct cras_rstream *stream);
    349 
    350 /*
    351  * Reads any pending audio message from the socket.
    352  */
    353 int cras_rstream_flush_old_audio_messages(struct cras_rstream *stream);
    354 
    355 #endif /* CRAS_RSTREAM_H_ */
    356