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 #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 #include "dev_io.h"
     15 
     16 struct buffer_share;
     17 struct cras_fmt_conv;
     18 struct cras_iodev;
     19 struct cras_rstream;
     20 struct dev_stream;
     21 
     22 /* Hold communication pipes and pthread info for the thread used to play or
     23  * record audio.
     24  *    to_thread_fds - Send a message from main to running thread.
     25  *    to_main_fds - Send a synchronous response to main from running thread.
     26  *    tid - Thread ID of the running playback/capture thread.
     27  *    started - Non-zero if the thread has started successfully.
     28  *    suspended - Non-zero if the thread is suspended.
     29  *    open_devs - Lists of open input and output devices.
     30  *    pollfds - What FDs wake up this thread.
     31  *    pollfds_size - Number of available poll fds.
     32  *    num_pollfds - Number of currently registered poll fds.
     33  *    remix_converter - Format converter used to remix output channels.
     34  */
     35 struct audio_thread {
     36 	int to_thread_fds[2];
     37 	int to_main_fds[2];
     38 	pthread_t tid;
     39 	int started;
     40 	int suspended;
     41 	struct open_dev *open_devs[CRAS_NUM_DIRECTIONS];
     42 	struct pollfd *pollfds;
     43 	size_t pollfds_size;
     44 	size_t num_pollfds;
     45 	struct cras_fmt_conv *remix_converter;
     46 };
     47 
     48 /* Callback function to be handled in main loop in audio thread.
     49  * Args:
     50  *    data - The data for callback function.
     51  */
     52 typedef int (*thread_callback)(void *data);
     53 
     54 /* Creates an audio thread.
     55  * Returns:
     56  *    A pointer to the newly created audio thread.  It must be freed by calling
     57  *    audio_thread_destroy().  Returns NULL on error.
     58  */
     59 struct audio_thread *audio_thread_create();
     60 
     61 /* Adds an open device.
     62  * Args:
     63  *    thread - The thread to add open device to.
     64  *    dev - The open device to add.
     65  */
     66 int audio_thread_add_open_dev(struct audio_thread *thread,
     67 			      struct cras_iodev *dev);
     68 
     69 /* Removes an open device.
     70  * Args:
     71  *    thread - The thread to remove open device from.
     72  *    dev - The open device to remove.
     73  */
     74 int audio_thread_rm_open_dev(struct audio_thread *thread,
     75 			     struct cras_iodev *dev);
     76 
     77 /* Checks if dev is open and used by audio thread.
     78  * Args:
     79  *    thread - The thread accessing open devs.
     80  *    dev - The device to check if it has already been open.
     81  */
     82 int audio_thread_is_dev_open(struct audio_thread *thread,
     83 			     struct cras_iodev *dev);
     84 
     85 /* Adds an thread_callback to audio thread.
     86  * Args:
     87  *    fd - The file descriptor to be polled for the callback.
     88  *      The callback will be called when fd is readable.
     89  *    cb - The callback function.
     90  *    data - The data for the callback function.
     91  */
     92 void audio_thread_add_callback(int fd, thread_callback cb,
     93                                void *data);
     94 
     95 /* Adds an thread_callback to audio thread.
     96  * Args:
     97  *    fd - The file descriptor to be polled for the callback.
     98  *      The callback will be called when fd is writeable.
     99  *    cb - The callback function.
    100  *    data - The data for the callback function.
    101  */
    102 void audio_thread_add_write_callback(int fd, thread_callback cb,
    103 				     void *data);
    104 
    105 /* Removes an thread_callback from audio thread.
    106  * Args:
    107  *    fd - The file descriptor of the previous added callback.
    108  */
    109 void audio_thread_rm_callback(int fd);
    110 
    111 /* Removes a thread_callback from main thread.
    112  * Args:
    113  *     thread - The thread to remove callback from.
    114  *     fd - The file descriptor of the previous added callback.
    115  */
    116 int audio_thread_rm_callback_sync(struct audio_thread *thread, int fd);
    117 
    118 
    119 /* Enables or Disabled the callback associated with fd. */
    120 void audio_thread_enable_callback(int fd, int enabled);
    121 
    122 /* Starts a thread created with audio_thread_create.
    123  * Args:
    124  *    thread - The thread to start.
    125  * Returns:
    126  *    0 on success, return code from pthread_crate on failure.
    127  */
    128 int audio_thread_start(struct audio_thread *thread);
    129 
    130 /* Frees an audio thread created with audio_thread_create(). */
    131 void audio_thread_destroy(struct audio_thread *thread);
    132 
    133 /* Add a stream to the thread. After this call, the ownership of the stream will
    134  * be passed to the audio thread. Audio thread is responsible to release the
    135  * stream's resources.
    136  * Args:
    137  *    thread - a pointer to the audio thread.
    138  *    stream - the new stream to add.
    139  *    devs - an array of devices to attach stream.
    140  *    num_devs - number of devices in the array pointed by devs
    141  * Returns:
    142  *    zero on success, negative error from the AUDIO_THREAD enum above when an
    143  *    the thread can't be added.
    144  */
    145 int audio_thread_add_stream(struct audio_thread *thread,
    146 			    struct cras_rstream *stream,
    147 			    struct cras_iodev **devs,
    148 			    unsigned int num_devs);
    149 
    150 /* Begin draining a stream and check the draining status.
    151  * Args:
    152  *    thread - a pointer to the audio thread.
    153  *    stream - the stream to drain/remove.
    154  * Returns:
    155  *    zero if the stream is drained and can be deleted.  If the stream is not
    156  *    completely drained, then the number of milliseconds until is is drained
    157  *    are returned.
    158  */
    159 int audio_thread_drain_stream(struct audio_thread *thread,
    160 			      struct cras_rstream *stream);
    161 
    162 /* Disconnect a stream from the client.
    163  * Args:
    164  *    thread - a pointer to the audio thread.
    165  *    stream - the stream to be disconnected.
    166  *    iodev - the device to disconnect from.
    167  * Returns:
    168  *    0 on success, negative if error.
    169  */
    170 int audio_thread_disconnect_stream(struct audio_thread *thread,
    171 				   struct cras_rstream *stream,
    172 				   struct cras_iodev *iodev);
    173 
    174 /* Dumps information about all active streams to syslog. */
    175 int audio_thread_dump_thread_info(struct audio_thread *thread,
    176 				  struct audio_debug_info *info);
    177 
    178 /* Starts or stops the aec dump task.
    179  * Args:
    180  *    thread - pointer to the audio thread.
    181  *    stream_id - id of the target stream for aec dump.
    182  *    start - True to start the aec dump, false to stop.
    183  *    fd - File to store aec dump result.
    184  */
    185 int audio_thread_set_aec_dump(struct audio_thread *thread,
    186 			      cras_stream_id_t stream_id,
    187 			      unsigned int start,
    188 			      int fd);
    189 
    190 /* Configures the global converter for output remixing. Called by main
    191  * thread. */
    192 int audio_thread_config_global_remix(struct audio_thread *thread,
    193 				     unsigned int num_channels,
    194 				     const float *coefficient);
    195 
    196 /* Start ramping on a device.
    197  *
    198  * Ramping is started/updated in audio thread. This function lets the main
    199  * thread request that the audio thread start ramping.
    200  *
    201  * Args:
    202  *   thread - a pointer to the audio thread.
    203  *   dev - the device to start ramping.
    204  *   request - Check the docstrings of CRAS_IODEV_RAMP_REQUEST.
    205  * Returns:
    206  *    0 on success, negative if error.
    207  */
    208 int audio_thread_dev_start_ramp(struct audio_thread *thread,
    209 				struct cras_iodev *dev,
    210 				enum CRAS_IODEV_RAMP_REQUEST request);
    211 #endif /* AUDIO_THREAD_H_ */
    212