xref: /third_party/alsa-lib/src/hwdep/hwdep.c (revision d5ac70f0)
1d5ac70f0Sopenharmony_ci/**
2d5ac70f0Sopenharmony_ci * \file hwdep/hwdep.c
3d5ac70f0Sopenharmony_ci * \brief HwDep Interface (hardware dependent)
4d5ac70f0Sopenharmony_ci * \author Jaroslav Kysela <perex@perex.cz>
5d5ac70f0Sopenharmony_ci * \date 2000-2001
6d5ac70f0Sopenharmony_ci *
7d5ac70f0Sopenharmony_ci * HwDep (hardware dependent) Interface is designed for individual hardware
8d5ac70f0Sopenharmony_ci * access. This interface does not cover any API specification.
9d5ac70f0Sopenharmony_ci */
10d5ac70f0Sopenharmony_ci/*
11d5ac70f0Sopenharmony_ci *  Hardware dependent Interface - main file
12d5ac70f0Sopenharmony_ci *  Copyright (c) 2000 by Jaroslav Kysela <perex@perex.cz>
13d5ac70f0Sopenharmony_ci *
14d5ac70f0Sopenharmony_ci *
15d5ac70f0Sopenharmony_ci *   This library is free software; you can redistribute it and/or modify
16d5ac70f0Sopenharmony_ci *   it under the terms of the GNU Lesser General Public License as
17d5ac70f0Sopenharmony_ci *   published by the Free Software Foundation; either version 2.1 of
18d5ac70f0Sopenharmony_ci *   the License, or (at your option) any later version.
19d5ac70f0Sopenharmony_ci *
20d5ac70f0Sopenharmony_ci *   This program is distributed in the hope that it will be useful,
21d5ac70f0Sopenharmony_ci *   but WITHOUT ANY WARRANTY; without even the implied warranty of
22d5ac70f0Sopenharmony_ci *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23d5ac70f0Sopenharmony_ci *   GNU Lesser General Public License for more details.
24d5ac70f0Sopenharmony_ci *
25d5ac70f0Sopenharmony_ci *   You should have received a copy of the GNU Lesser General Public
26d5ac70f0Sopenharmony_ci *   License along with this library; if not, write to the Free Software
27d5ac70f0Sopenharmony_ci *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
28d5ac70f0Sopenharmony_ci *
29d5ac70f0Sopenharmony_ci */
30d5ac70f0Sopenharmony_ci
31d5ac70f0Sopenharmony_ci#include "hwdep_local.h"
32d5ac70f0Sopenharmony_ci#include <stdio.h>
33d5ac70f0Sopenharmony_ci#include <stdlib.h>
34d5ac70f0Sopenharmony_ci#include <unistd.h>
35d5ac70f0Sopenharmony_ci#include <string.h>
36d5ac70f0Sopenharmony_ci#include <fcntl.h>
37d5ac70f0Sopenharmony_ci#include <sys/ioctl.h>
38d5ac70f0Sopenharmony_ci
39d5ac70f0Sopenharmony_cistatic int snd_hwdep_open_conf(snd_hwdep_t **hwdep,
40d5ac70f0Sopenharmony_ci			       const char *name, snd_config_t *hwdep_root,
41d5ac70f0Sopenharmony_ci			       snd_config_t *hwdep_conf, int mode)
42d5ac70f0Sopenharmony_ci{
43d5ac70f0Sopenharmony_ci	const char *str;
44d5ac70f0Sopenharmony_ci	char buf[256], errbuf[256];
45d5ac70f0Sopenharmony_ci	int err;
46d5ac70f0Sopenharmony_ci	snd_config_t *conf, *type_conf = NULL;
47d5ac70f0Sopenharmony_ci	snd_config_iterator_t i, next;
48d5ac70f0Sopenharmony_ci	const char *id;
49d5ac70f0Sopenharmony_ci	const char *lib = NULL, *open_name = NULL;
50d5ac70f0Sopenharmony_ci	int (*open_func)(snd_hwdep_t **, const char *, snd_config_t *, snd_config_t *, int) = NULL;
51d5ac70f0Sopenharmony_ci#ifndef PIC
52d5ac70f0Sopenharmony_ci	extern void *snd_hwdep_open_symbols(void);
53d5ac70f0Sopenharmony_ci#endif
54d5ac70f0Sopenharmony_ci	void *h = NULL;
55d5ac70f0Sopenharmony_ci	if (snd_config_get_type(hwdep_conf) != SND_CONFIG_TYPE_COMPOUND) {
56d5ac70f0Sopenharmony_ci		if (name)
57d5ac70f0Sopenharmony_ci			SNDERR("Invalid type for HWDEP %s definition", name);
58d5ac70f0Sopenharmony_ci		else
59d5ac70f0Sopenharmony_ci			SNDERR("Invalid type for HWDEP definition");
60d5ac70f0Sopenharmony_ci		return -EINVAL;
61d5ac70f0Sopenharmony_ci	}
62d5ac70f0Sopenharmony_ci	err = snd_config_search(hwdep_conf, "type", &conf);
63d5ac70f0Sopenharmony_ci	if (err < 0) {
64d5ac70f0Sopenharmony_ci		SNDERR("type is not defined");
65d5ac70f0Sopenharmony_ci		return err;
66d5ac70f0Sopenharmony_ci	}
67d5ac70f0Sopenharmony_ci	err = snd_config_get_id(conf, &id);
68d5ac70f0Sopenharmony_ci	if (err < 0) {
69d5ac70f0Sopenharmony_ci		SNDERR("unable to get id");
70d5ac70f0Sopenharmony_ci		return err;
71d5ac70f0Sopenharmony_ci	}
72d5ac70f0Sopenharmony_ci	err = snd_config_get_string(conf, &str);
73d5ac70f0Sopenharmony_ci	if (err < 0) {
74d5ac70f0Sopenharmony_ci		SNDERR("Invalid type for %s", id);
75d5ac70f0Sopenharmony_ci		return err;
76d5ac70f0Sopenharmony_ci	}
77d5ac70f0Sopenharmony_ci	err = snd_config_search_definition(hwdep_root, "hwdep_type", str, &type_conf);
78d5ac70f0Sopenharmony_ci	if (err >= 0) {
79d5ac70f0Sopenharmony_ci		if (snd_config_get_type(type_conf) != SND_CONFIG_TYPE_COMPOUND) {
80d5ac70f0Sopenharmony_ci			SNDERR("Invalid type for HWDEP type %s definition", str);
81d5ac70f0Sopenharmony_ci			err = -EINVAL;
82d5ac70f0Sopenharmony_ci			goto _err;
83d5ac70f0Sopenharmony_ci		}
84d5ac70f0Sopenharmony_ci		snd_config_for_each(i, next, type_conf) {
85d5ac70f0Sopenharmony_ci			snd_config_t *n = snd_config_iterator_entry(i);
86d5ac70f0Sopenharmony_ci			const char *id;
87d5ac70f0Sopenharmony_ci			if (snd_config_get_id(n, &id) < 0)
88d5ac70f0Sopenharmony_ci				continue;
89d5ac70f0Sopenharmony_ci			if (strcmp(id, "comment") == 0)
90d5ac70f0Sopenharmony_ci				continue;
91d5ac70f0Sopenharmony_ci			if (strcmp(id, "lib") == 0) {
92d5ac70f0Sopenharmony_ci				err = snd_config_get_string(n, &lib);
93d5ac70f0Sopenharmony_ci				if (err < 0) {
94d5ac70f0Sopenharmony_ci					SNDERR("Invalid type for %s", id);
95d5ac70f0Sopenharmony_ci					goto _err;
96d5ac70f0Sopenharmony_ci				}
97d5ac70f0Sopenharmony_ci				continue;
98d5ac70f0Sopenharmony_ci			}
99d5ac70f0Sopenharmony_ci			if (strcmp(id, "open") == 0) {
100d5ac70f0Sopenharmony_ci				err = snd_config_get_string(n, &open_name);
101d5ac70f0Sopenharmony_ci				if (err < 0) {
102d5ac70f0Sopenharmony_ci					SNDERR("Invalid type for %s", id);
103d5ac70f0Sopenharmony_ci					goto _err;
104d5ac70f0Sopenharmony_ci				}
105d5ac70f0Sopenharmony_ci				continue;
106d5ac70f0Sopenharmony_ci			}
107d5ac70f0Sopenharmony_ci			SNDERR("Unknown field %s", id);
108d5ac70f0Sopenharmony_ci			err = -EINVAL;
109d5ac70f0Sopenharmony_ci			goto _err;
110d5ac70f0Sopenharmony_ci		}
111d5ac70f0Sopenharmony_ci	}
112d5ac70f0Sopenharmony_ci	if (!open_name) {
113d5ac70f0Sopenharmony_ci		open_name = buf;
114d5ac70f0Sopenharmony_ci		snprintf(buf, sizeof(buf), "_snd_hwdep_%s_open", str);
115d5ac70f0Sopenharmony_ci	}
116d5ac70f0Sopenharmony_ci#ifndef PIC
117d5ac70f0Sopenharmony_ci	snd_hwdep_open_symbols();
118d5ac70f0Sopenharmony_ci#endif
119d5ac70f0Sopenharmony_ci	h = INTERNAL(snd_dlopen)(lib, RTLD_NOW, errbuf, sizeof(errbuf));
120d5ac70f0Sopenharmony_ci	if (h)
121d5ac70f0Sopenharmony_ci		open_func = snd_dlsym(h, open_name, SND_DLSYM_VERSION(SND_HWDEP_DLSYM_VERSION));
122d5ac70f0Sopenharmony_ci	err = 0;
123d5ac70f0Sopenharmony_ci	if (!h) {
124d5ac70f0Sopenharmony_ci		SNDERR("Cannot open shared library %s (%s)", lib, errbuf);
125d5ac70f0Sopenharmony_ci		err = -ENOENT;
126d5ac70f0Sopenharmony_ci	} else if (!open_func) {
127d5ac70f0Sopenharmony_ci		SNDERR("symbol %s is not defined inside %s", open_name, lib);
128d5ac70f0Sopenharmony_ci		snd_dlclose(h);
129d5ac70f0Sopenharmony_ci		err = -ENXIO;
130d5ac70f0Sopenharmony_ci	}
131d5ac70f0Sopenharmony_ci       _err:
132d5ac70f0Sopenharmony_ci	if (type_conf)
133d5ac70f0Sopenharmony_ci		snd_config_delete(type_conf);
134d5ac70f0Sopenharmony_ci	if (err >= 0) {
135d5ac70f0Sopenharmony_ci		err = open_func(hwdep, name, hwdep_root, hwdep_conf, mode);
136d5ac70f0Sopenharmony_ci		if (err >= 0) {
137d5ac70f0Sopenharmony_ci			(*hwdep)->dl_handle = h;
138d5ac70f0Sopenharmony_ci		} else {
139d5ac70f0Sopenharmony_ci			snd_dlclose(h);
140d5ac70f0Sopenharmony_ci		}
141d5ac70f0Sopenharmony_ci	}
142d5ac70f0Sopenharmony_ci	return err;
143d5ac70f0Sopenharmony_ci}
144d5ac70f0Sopenharmony_ci
145d5ac70f0Sopenharmony_cistatic int snd_hwdep_open_noupdate(snd_hwdep_t **hwdep, snd_config_t *root, const char *name, int mode)
146d5ac70f0Sopenharmony_ci{
147d5ac70f0Sopenharmony_ci	int err;
148d5ac70f0Sopenharmony_ci	snd_config_t *hwdep_conf;
149d5ac70f0Sopenharmony_ci	err = snd_config_search_definition(root, "hwdep", name, &hwdep_conf);
150d5ac70f0Sopenharmony_ci	if (err < 0) {
151d5ac70f0Sopenharmony_ci		SNDERR("Unknown HwDep %s", name);
152d5ac70f0Sopenharmony_ci		return err;
153d5ac70f0Sopenharmony_ci	}
154d5ac70f0Sopenharmony_ci	err = snd_hwdep_open_conf(hwdep, name, root, hwdep_conf, mode);
155d5ac70f0Sopenharmony_ci	snd_config_delete(hwdep_conf);
156d5ac70f0Sopenharmony_ci	return err;
157d5ac70f0Sopenharmony_ci}
158d5ac70f0Sopenharmony_ci
159d5ac70f0Sopenharmony_ci/**
160d5ac70f0Sopenharmony_ci * \brief Opens a new connection to the HwDep interface.
161d5ac70f0Sopenharmony_ci * \param hwdep Returned handle (NULL if not wanted)
162d5ac70f0Sopenharmony_ci * \param name ASCII identifier of the HwDep handle
163d5ac70f0Sopenharmony_ci * \param mode Open mode
164d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code
165d5ac70f0Sopenharmony_ci *
166d5ac70f0Sopenharmony_ci * Opens a new connection to the HwDep interface specified with
167d5ac70f0Sopenharmony_ci * an ASCII identifier and mode.
168d5ac70f0Sopenharmony_ci */
169d5ac70f0Sopenharmony_ciint snd_hwdep_open(snd_hwdep_t **hwdep, const char *name, int mode)
170d5ac70f0Sopenharmony_ci{
171d5ac70f0Sopenharmony_ci	snd_config_t *top;
172d5ac70f0Sopenharmony_ci	int err;
173d5ac70f0Sopenharmony_ci
174d5ac70f0Sopenharmony_ci	assert(hwdep && name);
175d5ac70f0Sopenharmony_ci	err = snd_config_update_ref(&top);
176d5ac70f0Sopenharmony_ci	if (err < 0)
177d5ac70f0Sopenharmony_ci		return err;
178d5ac70f0Sopenharmony_ci	err = snd_hwdep_open_noupdate(hwdep, top, name, mode);
179d5ac70f0Sopenharmony_ci	snd_config_unref(top);
180d5ac70f0Sopenharmony_ci	return err;
181d5ac70f0Sopenharmony_ci}
182d5ac70f0Sopenharmony_ci
183d5ac70f0Sopenharmony_ci/**
184d5ac70f0Sopenharmony_ci * \brief Opens a new connection to the HwDep interface using local configuration
185d5ac70f0Sopenharmony_ci * \param hwdep Returned handle (NULL if not wanted)
186d5ac70f0Sopenharmony_ci * \param name ASCII identifier of the HwDep handle
187d5ac70f0Sopenharmony_ci * \param mode Open mode
188d5ac70f0Sopenharmony_ci * \param lconf The local configuration tree
189d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code
190d5ac70f0Sopenharmony_ci *
191d5ac70f0Sopenharmony_ci * Opens a new connection to the HwDep interface specified with
192d5ac70f0Sopenharmony_ci * an ASCII identifier and mode.
193d5ac70f0Sopenharmony_ci */
194d5ac70f0Sopenharmony_ciint snd_hwdep_open_lconf(snd_hwdep_t **hwdep, const char *name,
195d5ac70f0Sopenharmony_ci			 int mode, snd_config_t *lconf)
196d5ac70f0Sopenharmony_ci{
197d5ac70f0Sopenharmony_ci	assert(hwdep && name && lconf);
198d5ac70f0Sopenharmony_ci	return snd_hwdep_open_noupdate(hwdep, lconf, name, mode);
199d5ac70f0Sopenharmony_ci}
200d5ac70f0Sopenharmony_ci
201d5ac70f0Sopenharmony_ci/**
202d5ac70f0Sopenharmony_ci * \brief close HwDep handle
203d5ac70f0Sopenharmony_ci * \param hwdep HwDep handle
204d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code
205d5ac70f0Sopenharmony_ci *
206d5ac70f0Sopenharmony_ci * Closes the specified HwDep handle and frees all associated
207d5ac70f0Sopenharmony_ci * resources.
208d5ac70f0Sopenharmony_ci */
209d5ac70f0Sopenharmony_ciint snd_hwdep_close(snd_hwdep_t *hwdep)
210d5ac70f0Sopenharmony_ci{
211d5ac70f0Sopenharmony_ci	int err;
212d5ac70f0Sopenharmony_ci  	assert(hwdep);
213d5ac70f0Sopenharmony_ci	err = hwdep->ops->close(hwdep);
214d5ac70f0Sopenharmony_ci	if (hwdep->dl_handle)
215d5ac70f0Sopenharmony_ci		snd_dlclose(hwdep->dl_handle);
216d5ac70f0Sopenharmony_ci	free(hwdep->name);
217d5ac70f0Sopenharmony_ci	free(hwdep);
218d5ac70f0Sopenharmony_ci	return err;
219d5ac70f0Sopenharmony_ci}
220d5ac70f0Sopenharmony_ci
221d5ac70f0Sopenharmony_ci/**
222d5ac70f0Sopenharmony_ci * \brief get identifier of HwDep handle
223d5ac70f0Sopenharmony_ci * \param hwdep a Hwdep handle
224d5ac70f0Sopenharmony_ci * \return ascii identifier of HwDep handle
225d5ac70f0Sopenharmony_ci *
226d5ac70f0Sopenharmony_ci * Returns the ASCII identifier of given HwDep handle. It's the same
227d5ac70f0Sopenharmony_ci * identifier specified in snd_hwdep_open().
228d5ac70f0Sopenharmony_ci */
229d5ac70f0Sopenharmony_ciconst char *snd_hwdep_name(snd_hwdep_t *hwdep)
230d5ac70f0Sopenharmony_ci{
231d5ac70f0Sopenharmony_ci	assert(hwdep);
232d5ac70f0Sopenharmony_ci	return hwdep->name;
233d5ac70f0Sopenharmony_ci}
234d5ac70f0Sopenharmony_ci
235d5ac70f0Sopenharmony_ci/**
236d5ac70f0Sopenharmony_ci * \brief get type of HwDep handle
237d5ac70f0Sopenharmony_ci * \param hwdep a HwDep handle
238d5ac70f0Sopenharmony_ci * \return type of HwDep handle
239d5ac70f0Sopenharmony_ci *
240d5ac70f0Sopenharmony_ci * Returns the type #snd_hwdep_type_t of given HwDep handle.
241d5ac70f0Sopenharmony_ci */
242d5ac70f0Sopenharmony_cisnd_hwdep_type_t snd_hwdep_type(snd_hwdep_t *hwdep)
243d5ac70f0Sopenharmony_ci{
244d5ac70f0Sopenharmony_ci	assert(hwdep);
245d5ac70f0Sopenharmony_ci	return hwdep->type;
246d5ac70f0Sopenharmony_ci}
247d5ac70f0Sopenharmony_ci
248d5ac70f0Sopenharmony_ci/**
249d5ac70f0Sopenharmony_ci * \brief get count of poll descriptors for HwDep handle
250d5ac70f0Sopenharmony_ci * \param hwdep HwDep handle
251d5ac70f0Sopenharmony_ci * \return count of poll descriptors
252d5ac70f0Sopenharmony_ci */
253d5ac70f0Sopenharmony_ciint snd_hwdep_poll_descriptors_count(snd_hwdep_t *hwdep)
254d5ac70f0Sopenharmony_ci{
255d5ac70f0Sopenharmony_ci	assert(hwdep);
256d5ac70f0Sopenharmony_ci	return 1;
257d5ac70f0Sopenharmony_ci}
258d5ac70f0Sopenharmony_ci
259d5ac70f0Sopenharmony_ci/**
260d5ac70f0Sopenharmony_ci * \brief get poll descriptors
261d5ac70f0Sopenharmony_ci * \param hwdep HwDep handle
262d5ac70f0Sopenharmony_ci * \param pfds array of poll descriptors
263d5ac70f0Sopenharmony_ci * \param space space in the poll descriptor array
264d5ac70f0Sopenharmony_ci * \return count of filled descriptors
265d5ac70f0Sopenharmony_ci */
266d5ac70f0Sopenharmony_ciint snd_hwdep_poll_descriptors(snd_hwdep_t *hwdep, struct pollfd *pfds, unsigned int space)
267d5ac70f0Sopenharmony_ci{
268d5ac70f0Sopenharmony_ci	assert(hwdep);
269d5ac70f0Sopenharmony_ci	if (space >= 1) {
270d5ac70f0Sopenharmony_ci		pfds->fd = hwdep->poll_fd;
271d5ac70f0Sopenharmony_ci		switch (hwdep->mode & O_ACCMODE) {
272d5ac70f0Sopenharmony_ci		case O_WRONLY:
273d5ac70f0Sopenharmony_ci			pfds->events = POLLOUT|POLLERR|POLLNVAL;
274d5ac70f0Sopenharmony_ci			break;
275d5ac70f0Sopenharmony_ci		case O_RDONLY:
276d5ac70f0Sopenharmony_ci			pfds->events = POLLIN|POLLERR|POLLNVAL;
277d5ac70f0Sopenharmony_ci			break;
278d5ac70f0Sopenharmony_ci		case O_RDWR:
279d5ac70f0Sopenharmony_ci			pfds->events = POLLOUT|POLLIN|POLLERR|POLLNVAL;
280d5ac70f0Sopenharmony_ci			break;
281d5ac70f0Sopenharmony_ci		default:
282d5ac70f0Sopenharmony_ci			return -EIO;
283d5ac70f0Sopenharmony_ci		}
284d5ac70f0Sopenharmony_ci		return 1;
285d5ac70f0Sopenharmony_ci	}
286d5ac70f0Sopenharmony_ci	return 0;
287d5ac70f0Sopenharmony_ci}
288d5ac70f0Sopenharmony_ci
289d5ac70f0Sopenharmony_ci/**
290d5ac70f0Sopenharmony_ci * \brief get returned events from poll descriptors
291d5ac70f0Sopenharmony_ci * \param hwdep HwDep  handle
292d5ac70f0Sopenharmony_ci * \param pfds array of poll descriptors
293d5ac70f0Sopenharmony_ci * \param nfds count of poll descriptors
294d5ac70f0Sopenharmony_ci * \param revents returned events
295d5ac70f0Sopenharmony_ci * \return zero if success, otherwise a negative error code
296d5ac70f0Sopenharmony_ci */
297d5ac70f0Sopenharmony_ciint snd_hwdep_poll_descriptors_revents(snd_hwdep_t *hwdep, struct pollfd *pfds, unsigned int nfds, unsigned short *revents)
298d5ac70f0Sopenharmony_ci{
299d5ac70f0Sopenharmony_ci        assert(hwdep && pfds && revents);
300d5ac70f0Sopenharmony_ci        if (nfds == 1) {
301d5ac70f0Sopenharmony_ci                *revents = pfds->revents;
302d5ac70f0Sopenharmony_ci                return 0;
303d5ac70f0Sopenharmony_ci        }
304d5ac70f0Sopenharmony_ci        return -EINVAL;
305d5ac70f0Sopenharmony_ci}
306d5ac70f0Sopenharmony_ci
307d5ac70f0Sopenharmony_ci/**
308d5ac70f0Sopenharmony_ci * \brief set nonblock mode
309d5ac70f0Sopenharmony_ci * \param hwdep HwDep handle
310d5ac70f0Sopenharmony_ci * \param nonblock 0 = block, 1 = nonblock mode
311d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code
312d5ac70f0Sopenharmony_ci */
313d5ac70f0Sopenharmony_ciint snd_hwdep_nonblock(snd_hwdep_t *hwdep, int nonblock)
314d5ac70f0Sopenharmony_ci{
315d5ac70f0Sopenharmony_ci	int err;
316d5ac70f0Sopenharmony_ci	assert(hwdep);
317d5ac70f0Sopenharmony_ci	if ((err = hwdep->ops->nonblock(hwdep, nonblock)) < 0)
318d5ac70f0Sopenharmony_ci		return err;
319d5ac70f0Sopenharmony_ci	if (nonblock)
320d5ac70f0Sopenharmony_ci		hwdep->mode |= SND_HWDEP_OPEN_NONBLOCK;
321d5ac70f0Sopenharmony_ci	else
322d5ac70f0Sopenharmony_ci		hwdep->mode &= ~SND_HWDEP_OPEN_NONBLOCK;
323d5ac70f0Sopenharmony_ci	return 0;
324d5ac70f0Sopenharmony_ci}
325d5ac70f0Sopenharmony_ci
326d5ac70f0Sopenharmony_ci/**
327d5ac70f0Sopenharmony_ci * \brief get size of the snd_hwdep_info_t structure in bytes
328d5ac70f0Sopenharmony_ci * \return size of the snd_hwdep_info_t structure in bytes
329d5ac70f0Sopenharmony_ci */
330d5ac70f0Sopenharmony_cisize_t snd_hwdep_info_sizeof()
331d5ac70f0Sopenharmony_ci{
332d5ac70f0Sopenharmony_ci	return sizeof(snd_hwdep_info_t);
333d5ac70f0Sopenharmony_ci}
334d5ac70f0Sopenharmony_ci
335d5ac70f0Sopenharmony_ci/**
336d5ac70f0Sopenharmony_ci * \brief allocate a new snd_hwdep_info_t structure
337d5ac70f0Sopenharmony_ci * \param info returned pointer
338d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code if fails
339d5ac70f0Sopenharmony_ci *
340d5ac70f0Sopenharmony_ci * Allocates a new snd_hwdep_info_t structure using the standard
341d5ac70f0Sopenharmony_ci * malloc C library function.
342d5ac70f0Sopenharmony_ci */
343d5ac70f0Sopenharmony_ciint snd_hwdep_info_malloc(snd_hwdep_info_t **info)
344d5ac70f0Sopenharmony_ci{
345d5ac70f0Sopenharmony_ci	assert(info);
346d5ac70f0Sopenharmony_ci	*info = calloc(1, sizeof(snd_hwdep_info_t));
347d5ac70f0Sopenharmony_ci	if (!*info)
348d5ac70f0Sopenharmony_ci		return -ENOMEM;
349d5ac70f0Sopenharmony_ci	return 0;
350d5ac70f0Sopenharmony_ci}
351d5ac70f0Sopenharmony_ci
352d5ac70f0Sopenharmony_ci/**
353d5ac70f0Sopenharmony_ci * \brief frees the snd_hwdep_info_t structure
354d5ac70f0Sopenharmony_ci * \param info pointer to the snd_hwdep_info_t structure to free
355d5ac70f0Sopenharmony_ci *
356d5ac70f0Sopenharmony_ci * Frees the given snd_hwdep_info_t structure using the standard
357d5ac70f0Sopenharmony_ci * free C library function.
358d5ac70f0Sopenharmony_ci */
359d5ac70f0Sopenharmony_civoid snd_hwdep_info_free(snd_hwdep_info_t *info)
360d5ac70f0Sopenharmony_ci{
361d5ac70f0Sopenharmony_ci	assert(info);
362d5ac70f0Sopenharmony_ci	free(info);
363d5ac70f0Sopenharmony_ci}
364d5ac70f0Sopenharmony_ci
365d5ac70f0Sopenharmony_ci/**
366d5ac70f0Sopenharmony_ci * \brief copy one snd_hwdep_info_t structure to another
367d5ac70f0Sopenharmony_ci * \param dst destination snd_hwdep_info_t structure
368d5ac70f0Sopenharmony_ci * \param src source snd_hwdep_info_t structure
369d5ac70f0Sopenharmony_ci */
370d5ac70f0Sopenharmony_civoid snd_hwdep_info_copy(snd_hwdep_info_t *dst, const snd_hwdep_info_t *src)
371d5ac70f0Sopenharmony_ci{
372d5ac70f0Sopenharmony_ci	assert(dst && src);
373d5ac70f0Sopenharmony_ci	*dst = *src;
374d5ac70f0Sopenharmony_ci}
375d5ac70f0Sopenharmony_ci
376d5ac70f0Sopenharmony_ci/**
377d5ac70f0Sopenharmony_ci * \brief get hwdep card number
378d5ac70f0Sopenharmony_ci * \param obj pointer to a snd_hwdep_info_t structure
379d5ac70f0Sopenharmony_ci * \return hwdep card number
380d5ac70f0Sopenharmony_ci */
381d5ac70f0Sopenharmony_ciint snd_hwdep_info_get_card(const snd_hwdep_info_t *obj)
382d5ac70f0Sopenharmony_ci{
383d5ac70f0Sopenharmony_ci	assert(obj);
384d5ac70f0Sopenharmony_ci	return obj->card;
385d5ac70f0Sopenharmony_ci}
386d5ac70f0Sopenharmony_ci
387d5ac70f0Sopenharmony_ci/**
388d5ac70f0Sopenharmony_ci * \brief get hwdep device number
389d5ac70f0Sopenharmony_ci * \param info pointer to a snd_hwdep_info_t structure
390d5ac70f0Sopenharmony_ci * \return hwdep device number
391d5ac70f0Sopenharmony_ci */
392d5ac70f0Sopenharmony_ciunsigned int snd_hwdep_info_get_device(const snd_hwdep_info_t *info)
393d5ac70f0Sopenharmony_ci{
394d5ac70f0Sopenharmony_ci	assert(info);
395d5ac70f0Sopenharmony_ci	return info->device;
396d5ac70f0Sopenharmony_ci}
397d5ac70f0Sopenharmony_ci
398d5ac70f0Sopenharmony_ci/**
399d5ac70f0Sopenharmony_ci * \brief get hwdep driver identifier
400d5ac70f0Sopenharmony_ci * \param obj pointer to a snd_hwdep_info_t structure
401d5ac70f0Sopenharmony_ci * \return hwdep driver identifier
402d5ac70f0Sopenharmony_ci */
403d5ac70f0Sopenharmony_ciconst char *snd_hwdep_info_get_id(const snd_hwdep_info_t *obj)
404d5ac70f0Sopenharmony_ci{
405d5ac70f0Sopenharmony_ci	assert(obj);
406d5ac70f0Sopenharmony_ci	return (const char *)obj->id;
407d5ac70f0Sopenharmony_ci}
408d5ac70f0Sopenharmony_ci
409d5ac70f0Sopenharmony_ci/**
410d5ac70f0Sopenharmony_ci * \brief get hwdep driver name
411d5ac70f0Sopenharmony_ci * \param obj pointer to a snd_hwdep_info_t structure
412d5ac70f0Sopenharmony_ci * \return hwdep driver name
413d5ac70f0Sopenharmony_ci */
414d5ac70f0Sopenharmony_ciconst char *snd_hwdep_info_get_name(const snd_hwdep_info_t *obj)
415d5ac70f0Sopenharmony_ci{
416d5ac70f0Sopenharmony_ci	assert(obj);
417d5ac70f0Sopenharmony_ci	return (const char *)obj->name;
418d5ac70f0Sopenharmony_ci}
419d5ac70f0Sopenharmony_ci
420d5ac70f0Sopenharmony_ci/**
421d5ac70f0Sopenharmony_ci * \brief get hwdep protocol interface
422d5ac70f0Sopenharmony_ci * \param obj pointer to a snd_hwdep_info_t structure
423d5ac70f0Sopenharmony_ci * \return hwdep protocol interface
424d5ac70f0Sopenharmony_ci */
425d5ac70f0Sopenharmony_cisnd_hwdep_iface_t snd_hwdep_info_get_iface(const snd_hwdep_info_t *obj)
426d5ac70f0Sopenharmony_ci{
427d5ac70f0Sopenharmony_ci	assert(obj);
428d5ac70f0Sopenharmony_ci	return obj->iface;
429d5ac70f0Sopenharmony_ci}
430d5ac70f0Sopenharmony_ci
431d5ac70f0Sopenharmony_ci/**
432d5ac70f0Sopenharmony_ci * \brief set hwdep device number
433d5ac70f0Sopenharmony_ci * \param obj pointer to a snd_hwdep_info_t structure
434d5ac70f0Sopenharmony_ci * \param val hwdep device
435d5ac70f0Sopenharmony_ci */
436d5ac70f0Sopenharmony_civoid snd_hwdep_info_set_device(snd_hwdep_info_t *obj, unsigned int val)
437d5ac70f0Sopenharmony_ci{
438d5ac70f0Sopenharmony_ci	assert(obj);
439d5ac70f0Sopenharmony_ci	obj->device = val;
440d5ac70f0Sopenharmony_ci}
441d5ac70f0Sopenharmony_ci
442d5ac70f0Sopenharmony_ci/**
443d5ac70f0Sopenharmony_ci * \brief get information about HwDep handle
444d5ac70f0Sopenharmony_ci * \param hwdep HwDep handle
445d5ac70f0Sopenharmony_ci * \param info pointer to a snd_hwdep_info_t structure to be filled
446d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code
447d5ac70f0Sopenharmony_ci */
448d5ac70f0Sopenharmony_ciint snd_hwdep_info(snd_hwdep_t *hwdep, snd_hwdep_info_t * info)
449d5ac70f0Sopenharmony_ci{
450d5ac70f0Sopenharmony_ci	assert(hwdep);
451d5ac70f0Sopenharmony_ci	assert(info);
452d5ac70f0Sopenharmony_ci	return hwdep->ops->info(hwdep, info);
453d5ac70f0Sopenharmony_ci}
454d5ac70f0Sopenharmony_ci
455d5ac70f0Sopenharmony_ci/**
456d5ac70f0Sopenharmony_ci * \brief do hardware dependent ioctl
457d5ac70f0Sopenharmony_ci * \param hwdep HwDep handle
458d5ac70f0Sopenharmony_ci * \param request ioctl command
459d5ac70f0Sopenharmony_ci * \param arg ioctl argument
460d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code
461d5ac70f0Sopenharmony_ci */
462d5ac70f0Sopenharmony_ciint snd_hwdep_ioctl(snd_hwdep_t *hwdep, unsigned int request, void * arg)
463d5ac70f0Sopenharmony_ci{
464d5ac70f0Sopenharmony_ci	assert(hwdep);
465d5ac70f0Sopenharmony_ci	return hwdep->ops->ioctl(hwdep, request, arg);
466d5ac70f0Sopenharmony_ci}
467d5ac70f0Sopenharmony_ci
468d5ac70f0Sopenharmony_ci/**
469d5ac70f0Sopenharmony_ci * \brief write bytes using HwDep handle
470d5ac70f0Sopenharmony_ci * \param hwdep HwDep handle
471d5ac70f0Sopenharmony_ci * \param buffer buffer containing bytes to write
472d5ac70f0Sopenharmony_ci * \param size output buffer size in bytes
473d5ac70f0Sopenharmony_ci */
474d5ac70f0Sopenharmony_cissize_t snd_hwdep_write(snd_hwdep_t *hwdep, const void *buffer, size_t size)
475d5ac70f0Sopenharmony_ci{
476d5ac70f0Sopenharmony_ci	assert(hwdep);
477d5ac70f0Sopenharmony_ci	assert(((hwdep->mode & O_ACCMODE) == O_WRONLY) || ((hwdep->mode & O_ACCMODE) == O_RDWR));
478d5ac70f0Sopenharmony_ci	assert(buffer || size == 0);
479d5ac70f0Sopenharmony_ci	return hwdep->ops->write(hwdep, buffer, size);
480d5ac70f0Sopenharmony_ci}
481d5ac70f0Sopenharmony_ci
482d5ac70f0Sopenharmony_ci/**
483d5ac70f0Sopenharmony_ci * \brief read bytes using HwDep handle
484d5ac70f0Sopenharmony_ci * \param hwdep HwDep handle
485d5ac70f0Sopenharmony_ci * \param buffer buffer to store the input bytes
486d5ac70f0Sopenharmony_ci * \param size input buffer size in bytes
487d5ac70f0Sopenharmony_ci */
488d5ac70f0Sopenharmony_cissize_t snd_hwdep_read(snd_hwdep_t *hwdep, void *buffer, size_t size)
489d5ac70f0Sopenharmony_ci{
490d5ac70f0Sopenharmony_ci	assert(hwdep);
491d5ac70f0Sopenharmony_ci	assert(((hwdep->mode & O_ACCMODE) == O_RDONLY) || ((hwdep->mode & O_ACCMODE) == O_RDWR));
492d5ac70f0Sopenharmony_ci	assert(buffer || size == 0);
493d5ac70f0Sopenharmony_ci	return (hwdep->ops->read)(hwdep, buffer, size);
494d5ac70f0Sopenharmony_ci}
495d5ac70f0Sopenharmony_ci
496d5ac70f0Sopenharmony_ci/**
497d5ac70f0Sopenharmony_ci * \brief get the DSP status information
498d5ac70f0Sopenharmony_ci * \param hwdep HwDep handle
499d5ac70f0Sopenharmony_ci * \param info pointer to a snd_hwdep_dsp_status_t structure to be filled
500d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code
501d5ac70f0Sopenharmony_ci */
502d5ac70f0Sopenharmony_ciint snd_hwdep_dsp_status(snd_hwdep_t *hwdep, snd_hwdep_dsp_status_t *info)
503d5ac70f0Sopenharmony_ci{
504d5ac70f0Sopenharmony_ci	assert(hwdep);
505d5ac70f0Sopenharmony_ci	assert(info);
506d5ac70f0Sopenharmony_ci	return hwdep->ops->ioctl(hwdep, SNDRV_HWDEP_IOCTL_DSP_STATUS, (void*)info);
507d5ac70f0Sopenharmony_ci}
508d5ac70f0Sopenharmony_ci
509d5ac70f0Sopenharmony_ci/**
510d5ac70f0Sopenharmony_ci * \brief load the DSP block
511d5ac70f0Sopenharmony_ci * \param hwdep HwDep handle
512d5ac70f0Sopenharmony_ci * \param block pointer to a snd_hwdep_dsp_image_t structure to transfer
513d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code
514d5ac70f0Sopenharmony_ci */
515d5ac70f0Sopenharmony_ciint snd_hwdep_dsp_load(snd_hwdep_t *hwdep, snd_hwdep_dsp_image_t *block)
516d5ac70f0Sopenharmony_ci{
517d5ac70f0Sopenharmony_ci	assert(hwdep);
518d5ac70f0Sopenharmony_ci	assert(block);
519d5ac70f0Sopenharmony_ci	return hwdep->ops->ioctl(hwdep, SNDRV_HWDEP_IOCTL_DSP_LOAD, (void*)block);
520d5ac70f0Sopenharmony_ci}
521d5ac70f0Sopenharmony_ci
522d5ac70f0Sopenharmony_ci/**
523d5ac70f0Sopenharmony_ci * \brief get size of the snd_hwdep_dsp_status_t structure in bytes
524d5ac70f0Sopenharmony_ci * \return size of the snd_hwdep_dsp_status_t structure in bytes
525d5ac70f0Sopenharmony_ci */
526d5ac70f0Sopenharmony_cisize_t snd_hwdep_dsp_status_sizeof()
527d5ac70f0Sopenharmony_ci{
528d5ac70f0Sopenharmony_ci	return sizeof(snd_hwdep_dsp_status_t);
529d5ac70f0Sopenharmony_ci}
530d5ac70f0Sopenharmony_ci
531d5ac70f0Sopenharmony_ci/**
532d5ac70f0Sopenharmony_ci * \brief allocate a new snd_hwdep_dsp_status_t structure
533d5ac70f0Sopenharmony_ci * \param info returned pointer
534d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code if fails
535d5ac70f0Sopenharmony_ci *
536d5ac70f0Sopenharmony_ci * Allocates a new snd_hwdep_dsp_status_t structure using the standard
537d5ac70f0Sopenharmony_ci * malloc C library function.
538d5ac70f0Sopenharmony_ci */
539d5ac70f0Sopenharmony_ciint snd_hwdep_dsp_status_malloc(snd_hwdep_dsp_status_t **info)
540d5ac70f0Sopenharmony_ci{
541d5ac70f0Sopenharmony_ci	assert(info);
542d5ac70f0Sopenharmony_ci	*info = calloc(1, sizeof(snd_hwdep_dsp_status_t));
543d5ac70f0Sopenharmony_ci	if (!*info)
544d5ac70f0Sopenharmony_ci		return -ENOMEM;
545d5ac70f0Sopenharmony_ci	return 0;
546d5ac70f0Sopenharmony_ci}
547d5ac70f0Sopenharmony_ci
548d5ac70f0Sopenharmony_ci/**
549d5ac70f0Sopenharmony_ci * \brief frees the snd_hwdep_dsp_status_t structure
550d5ac70f0Sopenharmony_ci * \param info pointer to the snd_hwdep_dsp_status_t structure to free
551d5ac70f0Sopenharmony_ci *
552d5ac70f0Sopenharmony_ci * Frees the given snd_hwdep_dsp_status_t structure using the standard
553d5ac70f0Sopenharmony_ci * free C library function.
554d5ac70f0Sopenharmony_ci */
555d5ac70f0Sopenharmony_civoid snd_hwdep_dsp_status_free(snd_hwdep_dsp_status_t *info)
556d5ac70f0Sopenharmony_ci{
557d5ac70f0Sopenharmony_ci	assert(info);
558d5ac70f0Sopenharmony_ci	free(info);
559d5ac70f0Sopenharmony_ci}
560d5ac70f0Sopenharmony_ci
561d5ac70f0Sopenharmony_ci/**
562d5ac70f0Sopenharmony_ci * \brief copy one snd_hwdep_dsp_status_t structure to another
563d5ac70f0Sopenharmony_ci * \param dst destination snd_hwdep_dsp_status_t structure
564d5ac70f0Sopenharmony_ci * \param src source snd_hwdep_dsp_status_t structure
565d5ac70f0Sopenharmony_ci */
566d5ac70f0Sopenharmony_civoid snd_hwdep_dsp_status_copy(snd_hwdep_dsp_status_t *dst, const snd_hwdep_dsp_status_t *src)
567d5ac70f0Sopenharmony_ci{
568d5ac70f0Sopenharmony_ci	assert(dst && src);
569d5ac70f0Sopenharmony_ci	*dst = *src;
570d5ac70f0Sopenharmony_ci}
571d5ac70f0Sopenharmony_ci
572d5ac70f0Sopenharmony_ci/**
573d5ac70f0Sopenharmony_ci * \brief get the driver version of dsp loader
574d5ac70f0Sopenharmony_ci * \param obj pointer to a snd_hwdep_dsp_status_t structure
575d5ac70f0Sopenharmony_ci * \return the driver version
576d5ac70f0Sopenharmony_ci */
577d5ac70f0Sopenharmony_ciunsigned int snd_hwdep_dsp_status_get_version(const snd_hwdep_dsp_status_t *obj)
578d5ac70f0Sopenharmony_ci{
579d5ac70f0Sopenharmony_ci	assert(obj);
580d5ac70f0Sopenharmony_ci	return obj->version;
581d5ac70f0Sopenharmony_ci}
582d5ac70f0Sopenharmony_ci
583d5ac70f0Sopenharmony_ci/**
584d5ac70f0Sopenharmony_ci * \brief get the driver id of dsp loader
585d5ac70f0Sopenharmony_ci * \param obj pointer to a snd_hwdep_dsp_status_t structure
586d5ac70f0Sopenharmony_ci * \return the driver id string
587d5ac70f0Sopenharmony_ci */
588d5ac70f0Sopenharmony_ciconst char *snd_hwdep_dsp_status_get_id(const snd_hwdep_dsp_status_t *obj)
589d5ac70f0Sopenharmony_ci{
590d5ac70f0Sopenharmony_ci	assert(obj);
591d5ac70f0Sopenharmony_ci	return (const char *)obj->id;
592d5ac70f0Sopenharmony_ci}
593d5ac70f0Sopenharmony_ci
594d5ac70f0Sopenharmony_ci/**
595d5ac70f0Sopenharmony_ci * \brief get number of dsp blocks
596d5ac70f0Sopenharmony_ci * \param obj pointer to a snd_hwdep_dsp_status_t structure
597d5ac70f0Sopenharmony_ci * \return number of dsp blocks
598d5ac70f0Sopenharmony_ci */
599d5ac70f0Sopenharmony_ciunsigned int snd_hwdep_dsp_status_get_num_dsps(const snd_hwdep_dsp_status_t *obj)
600d5ac70f0Sopenharmony_ci{
601d5ac70f0Sopenharmony_ci	assert(obj);
602d5ac70f0Sopenharmony_ci	return obj->num_dsps;
603d5ac70f0Sopenharmony_ci}
604d5ac70f0Sopenharmony_ci
605d5ac70f0Sopenharmony_ci/**
606d5ac70f0Sopenharmony_ci * \brief get the bit flags of the loaded dsp blocks
607d5ac70f0Sopenharmony_ci * \param info pointer to a snd_hwdep_dsp_status_t structure
608d5ac70f0Sopenharmony_ci * \return the big flags of the loaded dsp blocks
609d5ac70f0Sopenharmony_ci */
610d5ac70f0Sopenharmony_ciunsigned int snd_hwdep_dsp_status_get_dsp_loaded(const snd_hwdep_dsp_status_t *info)
611d5ac70f0Sopenharmony_ci{
612d5ac70f0Sopenharmony_ci	assert(info);
613d5ac70f0Sopenharmony_ci	return info->dsp_loaded;
614d5ac70f0Sopenharmony_ci}
615d5ac70f0Sopenharmony_ci
616d5ac70f0Sopenharmony_ci/**
617d5ac70f0Sopenharmony_ci * \brief get the chip status of dsp loader
618d5ac70f0Sopenharmony_ci * \param obj pointer to a snd_hwdep_dsp_status_t structure
619d5ac70f0Sopenharmony_ci * \return non-zero if all DSP blocks are loaded and the chip is ready
620d5ac70f0Sopenharmony_ci */
621d5ac70f0Sopenharmony_ciunsigned int snd_hwdep_dsp_status_get_chip_ready(const snd_hwdep_dsp_status_t *obj)
622d5ac70f0Sopenharmony_ci{
623d5ac70f0Sopenharmony_ci	assert(obj);
624d5ac70f0Sopenharmony_ci	return obj->chip_ready;
625d5ac70f0Sopenharmony_ci}
626d5ac70f0Sopenharmony_ci
627d5ac70f0Sopenharmony_ci/**
628d5ac70f0Sopenharmony_ci * \brief get size of the snd_hwdep_dsp_image_t structure in bytes
629d5ac70f0Sopenharmony_ci * \return size of the snd_hwdep_dsp_image_t structure in bytes
630d5ac70f0Sopenharmony_ci */
631d5ac70f0Sopenharmony_cisize_t snd_hwdep_dsp_image_sizeof()
632d5ac70f0Sopenharmony_ci{
633d5ac70f0Sopenharmony_ci	return sizeof(snd_hwdep_dsp_image_t);
634d5ac70f0Sopenharmony_ci}
635d5ac70f0Sopenharmony_ci
636d5ac70f0Sopenharmony_ci/**
637d5ac70f0Sopenharmony_ci * \brief allocate a new snd_hwdep_dsp_image_t structure
638d5ac70f0Sopenharmony_ci * \param info returned pointer
639d5ac70f0Sopenharmony_ci * \return 0 on success otherwise a negative error code if fails
640d5ac70f0Sopenharmony_ci *
641d5ac70f0Sopenharmony_ci * Allocates a new snd_hwdep_dsp_image_t structure using the standard
642d5ac70f0Sopenharmony_ci * malloc C library function.
643d5ac70f0Sopenharmony_ci */
644d5ac70f0Sopenharmony_ciint snd_hwdep_dsp_image_malloc(snd_hwdep_dsp_image_t **info)
645d5ac70f0Sopenharmony_ci{
646d5ac70f0Sopenharmony_ci	assert(info);
647d5ac70f0Sopenharmony_ci	*info = calloc(1, sizeof(snd_hwdep_dsp_image_t));
648d5ac70f0Sopenharmony_ci	if (!*info)
649d5ac70f0Sopenharmony_ci		return -ENOMEM;
650d5ac70f0Sopenharmony_ci	return 0;
651d5ac70f0Sopenharmony_ci}
652d5ac70f0Sopenharmony_ci
653d5ac70f0Sopenharmony_ci/**
654d5ac70f0Sopenharmony_ci * \brief frees the snd_hwdep_dsp_image_t structure
655d5ac70f0Sopenharmony_ci * \param info pointer to the snd_hwdep_dsp_image_t structure to free
656d5ac70f0Sopenharmony_ci *
657d5ac70f0Sopenharmony_ci * Frees the given snd_hwdep_dsp_image_t structure using the standard
658d5ac70f0Sopenharmony_ci * free C library function.
659d5ac70f0Sopenharmony_ci */
660d5ac70f0Sopenharmony_civoid snd_hwdep_dsp_image_free(snd_hwdep_dsp_image_t *info)
661d5ac70f0Sopenharmony_ci{
662d5ac70f0Sopenharmony_ci	assert(info);
663d5ac70f0Sopenharmony_ci	free(info);
664d5ac70f0Sopenharmony_ci}
665d5ac70f0Sopenharmony_ci
666d5ac70f0Sopenharmony_ci/**
667d5ac70f0Sopenharmony_ci * \brief copy one snd_hwdep_dsp_image_t structure to another
668d5ac70f0Sopenharmony_ci * \param dst destination snd_hwdep_dsp_image_t structure
669d5ac70f0Sopenharmony_ci * \param src source snd_hwdep_dsp_image_t structure
670d5ac70f0Sopenharmony_ci */
671d5ac70f0Sopenharmony_civoid snd_hwdep_dsp_image_copy(snd_hwdep_dsp_image_t *dst, const snd_hwdep_dsp_image_t *src)
672d5ac70f0Sopenharmony_ci{
673d5ac70f0Sopenharmony_ci	assert(dst && src);
674d5ac70f0Sopenharmony_ci	*dst = *src;
675d5ac70f0Sopenharmony_ci}
676d5ac70f0Sopenharmony_ci
677d5ac70f0Sopenharmony_ci/**
678d5ac70f0Sopenharmony_ci * \brief get the DSP block index
679d5ac70f0Sopenharmony_ci * \param obj pointer to a snd_hwdep_dsp_image_t structure
680d5ac70f0Sopenharmony_ci * \return the index of the DSP block
681d5ac70f0Sopenharmony_ci */
682d5ac70f0Sopenharmony_ciunsigned int snd_hwdep_dsp_image_get_index(const snd_hwdep_dsp_image_t *obj)
683d5ac70f0Sopenharmony_ci{
684d5ac70f0Sopenharmony_ci	assert(obj);
685d5ac70f0Sopenharmony_ci	return obj->index;
686d5ac70f0Sopenharmony_ci}
687d5ac70f0Sopenharmony_ci
688d5ac70f0Sopenharmony_ci/**
689d5ac70f0Sopenharmony_ci * \brief get the name of the DSP block
690d5ac70f0Sopenharmony_ci * \param obj pointer to a snd_hwdep_dsp_image_t structure
691d5ac70f0Sopenharmony_ci * \return the name string of the DSP block
692d5ac70f0Sopenharmony_ci */
693d5ac70f0Sopenharmony_ciconst char *snd_hwdep_dsp_image_get_name(const snd_hwdep_dsp_image_t *obj)
694d5ac70f0Sopenharmony_ci{
695d5ac70f0Sopenharmony_ci	assert(obj);
696d5ac70f0Sopenharmony_ci	return (const char *)obj->name;
697d5ac70f0Sopenharmony_ci}
698d5ac70f0Sopenharmony_ci
699d5ac70f0Sopenharmony_ci/**
700d5ac70f0Sopenharmony_ci * \brief get the length of the DSP block
701d5ac70f0Sopenharmony_ci * \param obj pointer to a snd_hwdep_dsp_image_t structure
702d5ac70f0Sopenharmony_ci * \return the length of the DSP block in bytes
703d5ac70f0Sopenharmony_ci */
704d5ac70f0Sopenharmony_cisize_t snd_hwdep_dsp_image_get_length(const snd_hwdep_dsp_image_t *obj)
705d5ac70f0Sopenharmony_ci{
706d5ac70f0Sopenharmony_ci	assert(obj);
707d5ac70f0Sopenharmony_ci	return obj->length;
708d5ac70f0Sopenharmony_ci}
709d5ac70f0Sopenharmony_ci
710d5ac70f0Sopenharmony_ci/**
711d5ac70f0Sopenharmony_ci * \brief get the image pointer of the DSP block
712d5ac70f0Sopenharmony_ci * \param obj pointer to a snd_hwdep_dsp_image_t structure
713d5ac70f0Sopenharmony_ci * \return the image pointer of the DSP block
714d5ac70f0Sopenharmony_ci */
715d5ac70f0Sopenharmony_ciconst void *snd_hwdep_dsp_image_get_image(const snd_hwdep_dsp_image_t *obj)
716d5ac70f0Sopenharmony_ci{
717d5ac70f0Sopenharmony_ci	assert(obj);
718d5ac70f0Sopenharmony_ci	return obj->image;
719d5ac70f0Sopenharmony_ci}
720d5ac70f0Sopenharmony_ci
721d5ac70f0Sopenharmony_ci/**
722d5ac70f0Sopenharmony_ci * \brief set the DSP block index
723d5ac70f0Sopenharmony_ci * \param obj pointer to a snd_hwdep_dsp_image_t structure
724d5ac70f0Sopenharmony_ci * \param index the index value to set
725d5ac70f0Sopenharmony_ci */
726d5ac70f0Sopenharmony_civoid snd_hwdep_dsp_image_set_index(snd_hwdep_dsp_image_t *obj, unsigned int index)
727d5ac70f0Sopenharmony_ci{
728d5ac70f0Sopenharmony_ci	assert(obj);
729d5ac70f0Sopenharmony_ci	obj->index = index;
730d5ac70f0Sopenharmony_ci}
731d5ac70f0Sopenharmony_ci
732d5ac70f0Sopenharmony_ci/**
733d5ac70f0Sopenharmony_ci * \brief set the name of the DSP block
734d5ac70f0Sopenharmony_ci * \param obj pointer to a snd_hwdep_dsp_image_t structure
735d5ac70f0Sopenharmony_ci * \param name the name string
736d5ac70f0Sopenharmony_ci */
737d5ac70f0Sopenharmony_civoid snd_hwdep_dsp_image_set_name(snd_hwdep_dsp_image_t *obj, const char *name)
738d5ac70f0Sopenharmony_ci{
739d5ac70f0Sopenharmony_ci	assert(obj && name);
740d5ac70f0Sopenharmony_ci	strncpy((char *)obj->name, name, sizeof(obj->name));
741d5ac70f0Sopenharmony_ci	obj->name[sizeof(obj->name)-1] = 0;
742d5ac70f0Sopenharmony_ci}
743d5ac70f0Sopenharmony_ci
744d5ac70f0Sopenharmony_ci/**
745d5ac70f0Sopenharmony_ci * \brief set the DSP block length
746d5ac70f0Sopenharmony_ci * \param obj pointer to a snd_hwdep_dsp_image_t structure
747d5ac70f0Sopenharmony_ci * \param length the length of the DSP block
748d5ac70f0Sopenharmony_ci */
749d5ac70f0Sopenharmony_civoid snd_hwdep_dsp_image_set_length(snd_hwdep_dsp_image_t *obj, size_t length)
750d5ac70f0Sopenharmony_ci{
751d5ac70f0Sopenharmony_ci	assert(obj);
752d5ac70f0Sopenharmony_ci	obj->length = length;
753d5ac70f0Sopenharmony_ci}
754d5ac70f0Sopenharmony_ci
755d5ac70f0Sopenharmony_ci/**
756d5ac70f0Sopenharmony_ci * \brief set the DSP block image pointer
757d5ac70f0Sopenharmony_ci * \param obj pointer to a snd_hwdep_dsp_image_t structure
758d5ac70f0Sopenharmony_ci * \param image the DSP image pointer
759d5ac70f0Sopenharmony_ci */
760d5ac70f0Sopenharmony_civoid snd_hwdep_dsp_image_set_image(snd_hwdep_dsp_image_t *obj, void *image)
761d5ac70f0Sopenharmony_ci{
762d5ac70f0Sopenharmony_ci	assert(obj);
763d5ac70f0Sopenharmony_ci	obj->image = image;
764d5ac70f0Sopenharmony_ci}
765d5ac70f0Sopenharmony_ci
766