summaryrefslogtreecommitdiffstats
path: root/sound/avirt.h
blob: 138d0ca8eb279231d7b6f576f51c6f663a29f503 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// SPDX-License-Identifier: GPL-2.0
/*
 * AVIRT - ALSA Virtual Soundcard
 *
 * Copyright (c) 2010-2018 Fiberdyne Systems Pty Ltd
 *
 * avirt.h - AVIRT system-level header
 */

#ifndef __SOUND_AVIRT_H
#define __SOUND_AVIRT_H

#include <sound/core.h>
#include <sound/pcm.h>
#include <linux/configfs.h>

#define MAX_STREAMS 16
#define MAX_NAME_LEN 80

#define DINFO(logname, fmt, args...)                                           \
	snd_printk(KERN_INFO "AVIRT: %s: " fmt "\n", logname, ##args)

#define DERROR(logname, fmt, args...)                                          \
	snd_printk(KERN_ERR "AVIRT: %s: " fmt "\n", logname, ##args)

#define DDEBUG(logname, fmt, args...)                                          \
	snd_printk(KERN_DEBUG "AVIRT: %s: " fmt "\n", logname, ##args)

struct snd_avirt_stream_array; /* Forward declaration */

/**
 * AVIRT Audio Path configure function type
 * Each Audio Path registers this at snd_avirt_audiopath_register time.
 * It is then called by the core once AVIRT has been configured
 */
typedef int (*snd_avirt_audiopath_configure)(
	struct snd_card *card, struct snd_avirt_stream_array *stream_array);

typedef void (*snd_avirt_pcm_exttrigger)(void);

/**
 * AVIRT Audio Path info
 */
typedef struct snd_avirt_audiopath snd_avirt_audiopath;
struct snd_avirt_audiopath {
	const char *uid; /* Unique identifier */
	const char *name; /* Pretty name */
	unsigned int version[3]; /* Version - Major.Minor.Ext */
	const struct snd_pcm_hardware *hw; /* ALSA PCM HW conf */
	const struct snd_pcm_ops *pcm_playback_ops; /* ALSA PCM playback ops */
	const struct snd_pcm_ops *pcm_capture_ops; /* ALSA PCM capture ops */
	snd_avirt_audiopath_configure configure; /* Config callback function */
	snd_avirt_pcm_exttrigger pcm_exttrigger;
	void *context;

	// MUST be at the end
	struct snd_avirt_audiopath *route_from_ap;
	struct snd_avirt_audiopath *route_to_ap;
};

/**
 * Audio routing
 */
struct snd_avirt_route {
	char name[MAX_NAME_LEN];
	unsigned int channels;
	unsigned int direction;
	struct snd_avirt_audiopath *from_ap;
	struct snd_avirt_audiopath *to_ap;
	struct config_item item;
};

/**
 * Audio stream configuration
 */
struct snd_avirt_stream {
	char name[MAX_NAME_LEN]; /* Stream name */
	char map[MAX_NAME_LEN]; /* Stream Audio Path mapping */
	unsigned int channels; /* Stream channel count */
	unsigned int device; /* Stream PCM device no. */
	unsigned int direction; /* Stream direction */
	struct snd_pcm *pcm; /* ALSA PCM  */
	struct snd_pcm_ops *pcm_ops; /* ALSA PCM ops */
	struct config_item item; /* configfs item reference */
};

/**
 * Audio stream group
 */
struct snd_avirt_stream_array {
	struct snd_avirt_stream *streams[MAX_STREAMS];
	int count;
};

/**
 * snd_avirt_private_free - free Audio Path private data from function prototype
 * @pcm: The PCM object
 */
typedef void (*snd_avirt_ap_private_free)(struct snd_pcm *pcm);
/**
 * Private Data Expansion
 */
struct snd_avirt_private_data {
	struct snd_avirt_audiopath *audiopath;
	void *ap_private_data;

	snd_avirt_ap_private_free ap_private_free;
};

/**
 * snd_avirt_audiopath_register - register Audio Path with AVIRT
 * @audiopath: Audio Path to be registered
 * @return: 0 on success or error code otherwise
 */
int snd_avirt_audiopath_register(struct snd_avirt_audiopath *audiopath);

/**
 * snd_avirt_audiopath_deregister - deregister Audio Path with AVIRT
 * @audiopath: Audio Path to be deregistered
 * @return: 0 on success or error code otherwise
 */
int snd_avirt_audiopath_deregister(struct snd_avirt_audiopath *audiopath);

/**
 * snd_avirt_audiopath_get - get Audio Path by it's UID
 * @uid: The Audio Path UID to get
 * @return: The Audio Path if it exists, NULL otherwise.
 */
struct snd_avirt_audiopath *snd_avirt_audiopath_get(const char *uid);

/**
 * snd_avirt_pcm_period_elapsed - PCM buffer complete callback
 * @substream: pointer to ALSA PCM substream
 *
 * This should be called from a child Audio Path once it has finished processing
 * the PCM buffer
 */
void snd_avirt_pcm_period_elapsed(struct snd_pcm_substream *substream);

#endif // __SOUND_AVIRT_H