1d5ac70f0Sopenharmony_ci/* 2d5ac70f0Sopenharmony_ci * Mixer Interface - HDA simple abstact module 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 14d5ac70f0Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15d5ac70f0Sopenharmony_ci * GNU Lesser General Public License for more details. 16d5ac70f0Sopenharmony_ci * 17d5ac70f0Sopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18d5ac70f0Sopenharmony_ci * License along with this library; if not, write to the Free Software 19d5ac70f0Sopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20d5ac70f0Sopenharmony_ci * 21d5ac70f0Sopenharmony_ci */ 22d5ac70f0Sopenharmony_ci 23d5ac70f0Sopenharmony_ci#include <stdio.h> 24d5ac70f0Sopenharmony_ci#include <stdlib.h> 25d5ac70f0Sopenharmony_ci#include <unistd.h> 26d5ac70f0Sopenharmony_ci#include <string.h> 27d5ac70f0Sopenharmony_ci#include <fcntl.h> 28d5ac70f0Sopenharmony_ci#include <sys/ioctl.h> 29d5ac70f0Sopenharmony_ci#include <math.h> 30d5ac70f0Sopenharmony_ci#include "asoundlib.h" 31d5ac70f0Sopenharmony_ci#include "mixer_abst.h" 32d5ac70f0Sopenharmony_ci#include "sbase.h" 33d5ac70f0Sopenharmony_ci 34d5ac70f0Sopenharmony_cistatic struct sm_elem_ops simple_hda_ops; 35d5ac70f0Sopenharmony_ci 36d5ac70f0Sopenharmony_cistruct melem_sids sids[] = { 37d5ac70f0Sopenharmony_ci { 38d5ac70f0Sopenharmony_ci .sid = SID_FRONT, 39d5ac70f0Sopenharmony_ci .sname = "Front", 40d5ac70f0Sopenharmony_ci .sindex = 0, 41d5ac70f0Sopenharmony_ci .weight = 1, 42d5ac70f0Sopenharmony_ci .chanmap = { 3, 0 }, 43d5ac70f0Sopenharmony_ci .sops = &simple_hda_ops, 44d5ac70f0Sopenharmony_ci } 45d5ac70f0Sopenharmony_ci}; 46d5ac70f0Sopenharmony_ci 47d5ac70f0Sopenharmony_ci#define SELECTORS (sizeof(selectors)/sizeof(selectors[0])) 48d5ac70f0Sopenharmony_ci 49d5ac70f0Sopenharmony_cistruct helem_selector selectors[] = { 50d5ac70f0Sopenharmony_ci { 51d5ac70f0Sopenharmony_ci .iface = SND_CTL_ELEM_IFACE_MIXER, 52d5ac70f0Sopenharmony_ci .name = "Front Playback Volume", 53d5ac70f0Sopenharmony_ci .index = 0, 54d5ac70f0Sopenharmony_ci .sid = SID_FRONT, 55d5ac70f0Sopenharmony_ci .purpose = PURPOSE_VOLUME, 56d5ac70f0Sopenharmony_ci .caps = SM_CAP_PVOLUME, 57d5ac70f0Sopenharmony_ci }, 58d5ac70f0Sopenharmony_ci { 59d5ac70f0Sopenharmony_ci .iface = SND_CTL_ELEM_IFACE_MIXER, 60d5ac70f0Sopenharmony_ci .name = "Front Playback Switch", 61d5ac70f0Sopenharmony_ci .index = 0, 62d5ac70f0Sopenharmony_ci .sid = SID_FRONT, 63d5ac70f0Sopenharmony_ci .purpose = PURPOSE_SWITCH, 64d5ac70f0Sopenharmony_ci .caps = SM_CAP_PSWITCH, 65d5ac70f0Sopenharmony_ci } 66d5ac70f0Sopenharmony_ci}; 67d5ac70f0Sopenharmony_ci 68d5ac70f0Sopenharmony_ciint alsa_mixer_simple_event(snd_mixer_class_t *class, unsigned int mask, 69d5ac70f0Sopenharmony_ci snd_hctl_elem_t *helem, snd_mixer_elem_t *melem) 70d5ac70f0Sopenharmony_ci{ 71d5ac70f0Sopenharmony_ci struct bclass_private *priv = snd_mixer_sbasic_get_private(class); 72d5ac70f0Sopenharmony_ci return priv->ops.event(class, mask, helem, melem); 73d5ac70f0Sopenharmony_ci} 74d5ac70f0Sopenharmony_ci 75d5ac70f0Sopenharmony_ciint alsa_mixer_simple_init(snd_mixer_class_t *class) 76d5ac70f0Sopenharmony_ci{ 77d5ac70f0Sopenharmony_ci struct bclass_base_ops *ops; 78d5ac70f0Sopenharmony_ci int err; 79d5ac70f0Sopenharmony_ci 80d5ac70f0Sopenharmony_ci err = mixer_simple_basic_dlopen(class, &ops); 81d5ac70f0Sopenharmony_ci if (err < 0) 82d5ac70f0Sopenharmony_ci return 0; 83d5ac70f0Sopenharmony_ci err = ops->selreg(class, selectors, SELECTORS); 84d5ac70f0Sopenharmony_ci if (err < 0) 85d5ac70f0Sopenharmony_ci return err; 86d5ac70f0Sopenharmony_ci err = ops->sidreg(class, sids, SELECTORS); 87d5ac70f0Sopenharmony_ci if (err < 0) 88d5ac70f0Sopenharmony_ci return err; 89d5ac70f0Sopenharmony_ci return 0; 90d5ac70f0Sopenharmony_ci} 91