1d5ac70f0Sopenharmony_ci/* 2d5ac70f0Sopenharmony_ci * Mixer Interface - simple abstact module - base library 3d5ac70f0Sopenharmony_ci * Copyright (c) 2005 by Jaroslav Kysela <perex@perex.cz> 4d5ac70f0Sopenharmony_ci * 5d5ac70f0Sopenharmony_ci * 6d5ac70f0Sopenharmony_ci * This library is free software; you can redistribute it and/or modify 7d5ac70f0Sopenharmony_ci * it under the terms of the GNU Lesser General Public License as 8d5ac70f0Sopenharmony_ci * published by the Free Software Foundation; either version 2.1 of 9d5ac70f0Sopenharmony_ci * the License, or (at your option) any later version. 10d5ac70f0Sopenharmony_ci * 11d5ac70f0Sopenharmony_ci * This program is distributed in the hope that it will be useful, 12d5ac70f0Sopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 13d5ac70f0Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14d5ac70f0Sopenharmony_ci * GNU Lesser General Public License for more details. 15d5ac70f0Sopenharmony_ci * 16d5ac70f0Sopenharmony_ci * You should have received a copy of the GNU Lesser General Public 17d5ac70f0Sopenharmony_ci * License along with this library; if not, write to the Free Software 18d5ac70f0Sopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19d5ac70f0Sopenharmony_ci * 20d5ac70f0Sopenharmony_ci */ 21d5ac70f0Sopenharmony_ci 22d5ac70f0Sopenharmony_ci#ifndef __SMIXER_BASE_H 23d5ac70f0Sopenharmony_ci 24d5ac70f0Sopenharmony_ci#include "list.h" 25d5ac70f0Sopenharmony_ci 26d5ac70f0Sopenharmony_ci#define MAX_CHANNEL 6 27d5ac70f0Sopenharmony_ci 28d5ac70f0Sopenharmony_ci#define SID_MASTER 0 29d5ac70f0Sopenharmony_ci#define SID_HEADPHONE 1 30d5ac70f0Sopenharmony_ci#define SID_FRONT 2 31d5ac70f0Sopenharmony_ci#define SID_PCM 3 32d5ac70f0Sopenharmony_ci#define SID_CD 4 33d5ac70f0Sopenharmony_ci 34d5ac70f0Sopenharmony_cistruct melem_sids { 35d5ac70f0Sopenharmony_ci unsigned short sid; 36d5ac70f0Sopenharmony_ci const char *sname; 37d5ac70f0Sopenharmony_ci unsigned short sindex; 38d5ac70f0Sopenharmony_ci unsigned short weight; 39d5ac70f0Sopenharmony_ci unsigned int chanmap[2]; 40d5ac70f0Sopenharmony_ci struct sm_elem_ops *sops; 41d5ac70f0Sopenharmony_ci}; 42d5ac70f0Sopenharmony_ci 43d5ac70f0Sopenharmony_ci#define PURPOSE_VOLUME 0 44d5ac70f0Sopenharmony_ci#define PURPOSE_SWITCH 1 45d5ac70f0Sopenharmony_ci#define PURPOSE_ENUMLIST 2 46d5ac70f0Sopenharmony_ci 47d5ac70f0Sopenharmony_cistruct helem_selector { 48d5ac70f0Sopenharmony_ci snd_ctl_elem_iface_t iface; 49d5ac70f0Sopenharmony_ci const char *name; 50d5ac70f0Sopenharmony_ci unsigned short index; 51d5ac70f0Sopenharmony_ci unsigned short sid; 52d5ac70f0Sopenharmony_ci unsigned short purpose; 53d5ac70f0Sopenharmony_ci unsigned short caps; 54d5ac70f0Sopenharmony_ci}; 55d5ac70f0Sopenharmony_ci 56d5ac70f0Sopenharmony_cistruct helem_base { 57d5ac70f0Sopenharmony_ci struct list_head list; 58d5ac70f0Sopenharmony_ci snd_hctl_elem_t *helem; 59d5ac70f0Sopenharmony_ci unsigned short purpose; 60d5ac70f0Sopenharmony_ci unsigned int caps; 61d5ac70f0Sopenharmony_ci unsigned int inactive: 1; 62d5ac70f0Sopenharmony_ci long min, max; 63d5ac70f0Sopenharmony_ci unsigned int count; 64d5ac70f0Sopenharmony_ci}; 65d5ac70f0Sopenharmony_ci 66d5ac70f0Sopenharmony_cistruct selem_base { 67d5ac70f0Sopenharmony_ci sm_selem_t selem; 68d5ac70f0Sopenharmony_ci struct list_head helems; 69d5ac70f0Sopenharmony_ci unsigned short sid; 70d5ac70f0Sopenharmony_ci struct { 71d5ac70f0Sopenharmony_ci unsigned int chanmap; 72d5ac70f0Sopenharmony_ci unsigned int forced_range: 1; 73d5ac70f0Sopenharmony_ci long min, max; 74d5ac70f0Sopenharmony_ci long vol[MAX_CHANNEL]; 75d5ac70f0Sopenharmony_ci } dir[2]; 76d5ac70f0Sopenharmony_ci}; 77d5ac70f0Sopenharmony_ci 78d5ac70f0Sopenharmony_cistruct bclass_selector { 79d5ac70f0Sopenharmony_ci struct list_head list; 80d5ac70f0Sopenharmony_ci struct helem_selector *selectors; 81d5ac70f0Sopenharmony_ci unsigned int count; 82d5ac70f0Sopenharmony_ci}; 83d5ac70f0Sopenharmony_ci 84d5ac70f0Sopenharmony_cistruct bclass_sid { 85d5ac70f0Sopenharmony_ci struct list_head list; 86d5ac70f0Sopenharmony_ci struct melem_sids *sids; 87d5ac70f0Sopenharmony_ci unsigned int count; 88d5ac70f0Sopenharmony_ci}; 89d5ac70f0Sopenharmony_ci 90d5ac70f0Sopenharmony_citypedef struct bclass_base_ops { 91d5ac70f0Sopenharmony_ci int (*event)(snd_mixer_class_t *class, unsigned int mask, 92d5ac70f0Sopenharmony_ci snd_hctl_elem_t *helem, snd_mixer_elem_t *melem); 93d5ac70f0Sopenharmony_ci int (*selreg)(snd_mixer_class_t *class, 94d5ac70f0Sopenharmony_ci struct helem_selector *selectors, 95d5ac70f0Sopenharmony_ci unsigned int count); 96d5ac70f0Sopenharmony_ci int (*sidreg)(snd_mixer_class_t *class, 97d5ac70f0Sopenharmony_ci struct melem_sids *sids, 98d5ac70f0Sopenharmony_ci unsigned int count); 99d5ac70f0Sopenharmony_ci} bclass_base_ops_t; 100d5ac70f0Sopenharmony_ci 101d5ac70f0Sopenharmony_cistruct bclass_private { 102d5ac70f0Sopenharmony_ci struct list_head selectors; 103d5ac70f0Sopenharmony_ci struct list_head sids; 104d5ac70f0Sopenharmony_ci void *dl_sbase; 105d5ac70f0Sopenharmony_ci bclass_base_ops_t ops; 106d5ac70f0Sopenharmony_ci}; 107d5ac70f0Sopenharmony_ci 108d5ac70f0Sopenharmony_ciint mixer_simple_basic_dlopen(snd_mixer_class_t *class, 109d5ac70f0Sopenharmony_ci bclass_base_ops_t **ops); 110d5ac70f0Sopenharmony_ci 111d5ac70f0Sopenharmony_ci#endif /* __SMIXER_BASE_H */ 112