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