blob: 34b47863007e40c548bea839b06fbdc927c8b4a0 [file] [log] [blame]
/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef AUDIO_THREAD_H_
#define AUDIO_THREAD_H_
#include <pthread.h>
#include <stdint.h>
#include "cras_iodev.h"
#include "cras_types.h"
#include "dev_io.h"
struct buffer_share;
struct cras_fmt_conv;
struct cras_iodev;
struct cras_rstream;
struct dev_stream;
/* Hold communication pipes and pthread info for the thread used to play or
* record audio.
* to_thread_fds - Send a message from main to running thread.
* to_main_fds - Send a synchronous response to main from running thread.
* tid - Thread ID of the running playback/capture thread.
* started - Non-zero if the thread has started successfully.
* suspended - Non-zero if the thread is suspended.
* open_devs - Lists of open input and output devices.
* pollfds - What FDs wake up this thread.
* pollfds_size - Number of available poll fds.
* num_pollfds - Number of currently registered poll fds.
* remix_converter - Format converter used to remix output channels.
*/
struct audio_thread {
int to_thread_fds[2];
int to_main_fds[2];
pthread_t tid;
int started;
int suspended;
struct open_dev *open_devs[CRAS_NUM_DIRECTIONS];
struct pollfd *pollfds;
size_t pollfds_size;
size_t num_pollfds;
struct cras_fmt_conv *remix_converter;
};
/*
* Enum to specify how a registered event callback be triggered.
* TRIGGER_NONE - Callback will not be triggered.
* TRIGGER_POLL - Triggered by poll given fd and revent.
* TRIGGER_WAKEUP - Triggered everytime when audio thread wakes up.
*/
enum AUDIO_THREAD_EVENTS_CB_TRIGGER {
TRIGGER_NONE,
TRIGGER_POLL,
TRIGGER_WAKEUP,
};
/* Callback function to be handled in main loop in audio thread.
* Args:
* data - The data for callback function.
* revent - The returned event from ppoll().
*/
typedef int (*thread_callback)(void *data, int revent);
/* Creates an audio thread.
* Returns:
* A pointer to the newly created audio thread. It must be freed by calling
* audio_thread_destroy(). Returns NULL on error.
*/
struct audio_thread *audio_thread_create();
/* Adds an open device.
* Args:
* thread - The thread to add open device to.
* dev - The open device to add.
*/
int audio_thread_add_open_dev(struct audio_thread *thread,
struct cras_iodev *dev);
/* Removes an open device.
* Args:
* thread - The thread to remove open device from.
* dev - The open device to remove.
*/
int audio_thread_rm_open_dev(struct audio_thread *thread,
enum CRAS_STREAM_DIRECTION dir,
unsigned int dev_idx);
/* Checks if dev is open and used by audio thread.
* Args:
* thread - The thread accessing open devs.
* dev - The device to check if it has already been open.
*/
int audio_thread_is_dev_open(struct audio_thread *thread,
struct cras_iodev *dev);
/* Adds a thread_callback to audio thread for requested events. By default
* the callback trigger is set to TRIGGER_POLL.
* Args:
* fd - The file descriptor to be polled for the callback.
* The callback will be called when any of requested events matched.
* cb - The callback function.
* data - The data for the callback function.
* events - The requested events to ppoll().
*/
void audio_thread_add_events_callback(int fd, thread_callback cb, void *data,
int events);
/* Removes an thread_callback from audio thread.
* Args:
* fd - The file descriptor of the previous added callback.
*/
void audio_thread_rm_callback(int fd);
/* Removes a thread_callback from main thread.
* Args:
* thread - The thread to remove callback from.
* fd - The file descriptor of the previous added callback.
*/
int audio_thread_rm_callback_sync(struct audio_thread *thread, int fd);
/* Configures the callback associated with fd when it should be triggerred.
* Args:
* fd - The file descriptor associate to the callback.
* trigger - Specifies how the callback should be triggered.
*/
void audio_thread_config_events_callback(
int fd, enum AUDIO_THREAD_EVENTS_CB_TRIGGER trigger);
/* Starts a thread created with audio_thread_create.
* Args:
* thread - The thread to start.
* Returns:
* 0 on success, return code from pthread_crate on failure.
*/
int audio_thread_start(struct audio_thread *thread);
/* Frees an audio thread created with audio_thread_create(). */
void audio_thread_destroy(struct audio_thread *thread);
/* Returns the shm fd for the ATlog. */
int audio_thread_event_log_shm_fd();
/* Add a stream to the thread. After this call, the ownership of the stream will
* be passed to the audio thread. Audio thread is responsible to release the
* stream's resources.
* Args:
* thread - a pointer to the audio thread.
* stream - the new stream to add.
* devs - an array of devices to attach stream.
* num_devs - number of devices in the array pointed by devs
* Returns:
* zero on success, negative error from the AUDIO_THREAD enum above when an
* the thread can't be added.
*/
int audio_thread_add_stream(struct audio_thread *thread,
struct cras_rstream *stream,
struct cras_iodev **devs, unsigned int num_devs);
/* Begin draining a stream and check the draining status.
* Args:
* thread - a pointer to the audio thread.
* stream - the stream to drain/remove.
* Returns:
* zero if the stream is drained and can be deleted. If the stream is not
* completely drained, then the number of milliseconds until is is drained
* are returned.
*/
int audio_thread_drain_stream(struct audio_thread *thread,
struct cras_rstream *stream);
/* Disconnect a stream from the client.
* Args:
* thread - a pointer to the audio thread.
* stream - the stream to be disconnected.
* iodev - the device to disconnect from.
* Returns:
* 0 on success, negative if error.
*/
int audio_thread_disconnect_stream(struct audio_thread *thread,
struct cras_rstream *stream,
struct cras_iodev *iodev);
/* Dumps information about all active streams to syslog. */
int audio_thread_dump_thread_info(struct audio_thread *thread,
struct audio_debug_info *info);
/* Starts or stops the aec dump task.
* Args:
* thread - pointer to the audio thread.
* stream_id - id of the target stream for aec dump.
* start - True to start the aec dump, false to stop.
* fd - File to store aec dump result.
*/
int audio_thread_set_aec_dump(struct audio_thread *thread,
cras_stream_id_t stream_id, unsigned int start,
int fd);
/* Configures the global converter for output remixing. Called by main
* thread. */
int audio_thread_config_global_remix(struct audio_thread *thread,
unsigned int num_channels,
const float *coefficient);
/* Start ramping on a device.
*
* Ramping is started/updated in audio thread. This function lets the main
* thread request that the audio thread start ramping.
*
* Args:
* thread - a pointer to the audio thread.
* dev_idx - Index of the the device to start ramping.
* request - Check the docstrings of CRAS_IODEV_RAMP_REQUEST.
* Returns:
* 0 on success, negative if error.
*/
int audio_thread_dev_start_ramp(struct audio_thread *thread,
unsigned int dev_idx,
enum CRAS_IODEV_RAMP_REQUEST request);
#endif /* AUDIO_THREAD_H_ */