summaryrefslogtreecommitdiffstats
path: root/alsa.h
diff options
context:
space:
mode:
authorJames O'Shannessy <james.oshannessy@fiberdyne.com.au>2018-08-27 15:08:14 +1000
committerMark Farrugia <mark.farrugia@fiberdyne.com.au>2018-10-26 17:27:24 +1100
commitbc8c3a602bceaba0e6d34a1ba8b776b56b00d766 (patch)
treeae8cec69c910144611e06f272033cc8c2aee7032 /alsa.h
parent416c9b0f9b816a6b2eb5c544f21567ad286dd4be (diff)
Public push of AVIRT.
Follow readme for building in/out of tree for Ubuntu/AGL/etc. Signed-off-by: James O'Shannessy <james.oshannessy@fiberdyne.com.au>
Diffstat (limited to 'alsa.h')
-rwxr-xr-xalsa.h131
1 files changed, 131 insertions, 0 deletions
diff --git a/alsa.h b/alsa.h
new file mode 100755
index 0000000..29fc64d
--- /dev/null
+++ b/alsa.h
@@ -0,0 +1,131 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * ALSA Virtual Soundcard
+ *
+ * alsa.h - Top level ALSA interface
+ *
+ * Copyright (C) 2010-2018 Fiberdyne Systems Pty Ltd
+ */
+
+#ifndef __AVIRT_ALSA_H__
+#define __AVIRT_ALSA_H__
+
+#include <linux/platform_device.h>
+
+#define MAX_NAME_LEN 32
+
+#define PRINT_ERR(errno, errmsg, ...) \
+ pr_err("[%s()] %s [ERRNO:%d]", __func__, errmsg, ##__VA_ARGS__, errno);
+
+#define CHK_ERR(errno) \
+ do { \
+ if (errno < 0) \
+ return errno; \
+ } while (0)
+
+#define CHK_ERR_V(errno, errmsg, ...) \
+ do { \
+ if (errno < 0) { \
+ PRINT_ERR(errno, errmsg, ##__VA_ARGS__) \
+ return errno; \
+ } \
+ } while (0)
+
+#define CHK_NULL(x) \
+ do { \
+ if (!x) \
+ return -EFAULT; \
+ } while (0)
+
+#define CHK_NULL_V(x, errmsg, ...) \
+ do { \
+ if (!x) { \
+ PRINT_ERR(EFAULT, errmsg, ##__VA_ARGS__) \
+ return -EFAULT; \
+ } \
+ } while (0)
+
+/*
+ * Substream device configuration
+ */
+struct avirt_alsa_dev_config {
+ const char devicename[MAX_NAME_LEN];
+ int channels;
+};
+
+/**
+ * Stream maintainance
+ */
+struct avirt_alsa_stream {
+ int hw_frame_idx;
+ struct snd_pcm_substream *substream;
+};
+
+/**
+ * Collection of devices
+ */
+struct avirt_alsa_dev_group {
+ struct avirt_alsa_dev_config *config;
+ struct avirt_alsa_stream *streams;
+ int devices;
+ int buffersize;
+};
+
+/**
+ * ALSA driver data
+ */
+struct avirt_alsa_driver {
+ struct snd_card *card;
+ struct avirt_alsa_dev_group playback;
+ struct avirt_alsa_dev_group capture;
+};
+
+/**
+ * avirt_alsa_init - Initializes the ALSA driver
+ * @return: 0 on success or error code otherwise
+ */
+int avirt_alsa_init(void);
+
+/**
+ * avirt_alsa_configure_pcm- Configure the PCM device
+ * @config: Device configuration structure array
+ * @direction: Direction of PCM (SNDRV_PCM_STREAM_XXX)
+ * @numdevices: Number of devices (array length)
+ * @return: 0 on success or error code otherwise
+ */
+int avirt_alsa_configure_pcm(struct avirt_alsa_dev_config *config,
+ int direction, unsigned numdevices);
+
+/**
+ * avirt_alsa_register - Registers the ALSA driver
+ * @devptr: Platform driver device
+ * @return: 0 on success or error code otherwise
+ */
+int avirt_alsa_register(struct platform_device *devptr);
+
+/**
+ * avirt_alsa_deregister - Deregisters the ALSA driver
+ * @devptr: Platform driver device
+ * @return: 0 on success or error code otherwise
+ */
+int avirt_alsa_deregister(void);
+
+/**
+ * avirt_alsa_get_dev_group - Gets the device group for the specified direction
+ * @direction: SNDRV_PCM_STREAM_PLAYBACK or SNDRV_PCM_STREAM_CAPTURE
+ * @return: Either the playback or capture device group on success,
+ * or NULL otherwise
+ */
+struct avirt_alsa_dev_group *avirt_alsa_get_dev_group(int direction);
+
+/**
+ * pcm_buff_complete_cb - PCM buffer complete callback
+ * @substream: pointer to ALSA PCM substream
+ * @return 0 on success or error code otherwise
+ *
+ * This should be called from a child Audio Path once it has finished processing
+ * the PCM buffer
+ */
+int pcm_buff_complete_cb(struct snd_pcm_substream *substream);
+
+#endif // __AVIRT_ALSA_H__