sof/tools/plugin/pipe/pipe.h

127 lines
3.2 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
*
* Copyright(c) 2022-2023 Intel Corporation. All rights reserved.
*
* Author: Liam Girdwood <liam.r.girdwood@linux.intel.com>
*/
#ifndef __SOF_PLUGIN_PIPE_H__
#define __SOF_PLUGIN_PIPE_H__
#include <stdatomic.h>
#include <stdint.h>
#include <mqueue.h>
#include <pthread.h>
#include <signal.h>
#include <alsa/asoundlib.h>
#include <tplg_parser/topology.h>
#include <tplg_parser/tokens.h>
#include "common.h"
struct sof_pipe;
#define MAX_MODULE_ID 256
#define MAX_PIPE_THREADS 128
#define MAX_PIPELINES 32
struct pipethread_data {
pthread_t pcm_thread;
pthread_t ipc_thread;
struct sof_pipe *sp;
struct plug_mq_desc ipc_tx_mq;
struct plug_mq_desc ipc_rx_mq;
struct pipeline *pcm_pipeline;
/* PCM flow control */
struct plug_sem_desc ready;
struct plug_sem_desc done;
atomic_int pipe_users;
};
struct sof_pipe_module {
void *handle;
char uuid[SOF_UUID_SIZE];
int module_id;
};
struct sof_pipe {
const char *alsa_name;
char topology_name[NAME_SIZE];
int realtime;
int use_P_core;
int use_E_core;
int capture;
int file_mode;
int pipe_thread_count;
struct sigaction action;
/* SHM for stream context sync */
struct plug_shm_desc shm_context;
struct plug_shm_glb_state *glb;
FILE *log;
pthread_mutex_t ipc_lock;
struct tplg_context tplg;
struct tplg_comp_info *comp_list;
struct list_item widget_list; /* list of widgets */
struct list_item route_list; /* list of widget connections */
struct list_item pcm_list; /* list of PCMs */
int info_elems;
int info_index;
/* IPC */
pthread_t ipc_pcm_thread;
struct plug_mq_desc ipc_tx_mq; /* queue used by plugin to send IPCs */
struct plug_mq_desc ipc_rx_mq; /* queue used by plugin to receive the IPC response */
/* module SO handles */
struct sof_pipe_module module[MAX_MODULE_ID];
int mod_idx;
/* pipeline context */
struct pipethread_data pipeline_ctx[MAX_PIPELINES];
};
/* global needed for signal handler */
extern struct sof_pipe *_sp;
int pipe_thread_new(struct sof_pipe *sp, struct pipeline *p);
int pipe_thread_free(struct sof_pipe *sp, int pipeline_id);
int pipe_thread_start(struct sof_pipe *sp, struct pipeline *p);
int pipe_thread_stop(struct sof_pipe *sp, struct pipeline *p);
int pipe_sof_setup(struct sof *sof);
int pipe_kcontrol_cb_new(struct snd_soc_tplg_ctl_hdr *tplg_ctl,
void *comp, void *arg);
/* set pipeline to realtime priority */
int pipe_set_rt(struct sof_pipe *sp);
/* set ipc thread to low priority */
int pipe_set_ipc_lowpri(struct sof_pipe *sp);
int pipe_ipc_process(struct sof_pipe *sp, struct plug_mq_desc *tx_mq, struct plug_mq_desc *rx_mq);
int pipe_ipc_new(struct sof_pipe *sp, int pri, int core);
void pipe_ipc_free(struct sof_pipe *sp);
int pipe_set_affinity(struct sof_pipe *sp);
int pipe_ipc_message(struct sof_pipe *sp, void *mailbox, size_t bytes);
int pipe_ipc_do(struct sof_pipe *sp, void *mailbox, size_t bytes);
/*
* Topology
*/
int plug_parse_topology(struct sof_pipe *sp, struct tplg_context *ctx);
int plug_load_widget(struct sof_pipe *sp, struct tplg_context *ctx);
int plug_register_graph(struct sof_pipe *sp, struct tplg_context *ctx,
struct tplg_comp_info *temp_comp_list,
char *pipeline_string,
int count, int num_comps, int pipeline_id);
#endif