1 /* ALSAControl.cpp
2  **
3  ** Copyright 2008-2009 Wind River Systems
4  ** Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
5  **
6  ** Licensed under the Apache License, Version 2.0 (the "License");
7  ** you may not use this file except in compliance with the License.
8  ** You may obtain a copy of the License at
9  **
10  **     http://www.apache.org/licenses/LICENSE-2.0
11  **
12  ** Unless required by applicable law or agreed to in writing, software
13  ** distributed under the License is distributed on an "AS IS" BASIS,
14  ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  ** See the License for the specific language governing permissions and
16  ** limitations under the License.
17  */
18 
19 #include <errno.h>
20 #include <stdarg.h>
21 #include <sys/stat.h>
22 #include <fcntl.h>
23 #include <stdlib.h>
24 #include <unistd.h>
25 #include <dlfcn.h>
26 
27 #define LOG_TAG "ALSAControl"
28 //#define LOG_NDEBUG 0
29 #define LOG_NDDEBUG 0
30 #include <utils/Log.h>
31 #include <utils/String8.h>
32 
33 #include <cutils/properties.h>
34 #include <media/AudioRecord.h>
35 #include <hardware_legacy/power.h>
36 
37 #include "AudioHardwareALSA.h"
38 
39 namespace android_audio_legacy
40 {
41 
ALSAControl(const char * device)42 ALSAControl::ALSAControl(const char *device)
43 {
44     ALOGD("ALSAControl: ctor device %s", device);
45     mHandle = mixer_open(device);
46     ALOGV("ALSAControl: ctor mixer %p", mHandle);
47 }
48 
~ALSAControl()49 ALSAControl::~ALSAControl()
50 {
51     if (mHandle) mixer_close(mHandle);
52 }
53 
get(const char * name,unsigned int & value,int index)54 status_t ALSAControl::get(const char *name, unsigned int &value, int index)
55 {
56     struct mixer_ctl *ctl;
57 
58     if (!mHandle) {
59         ALOGE("Control not initialized");
60         return NO_INIT;
61     }
62 
63     ctl =  mixer_get_control(mHandle, name, index);
64     if (!ctl)
65         return BAD_VALUE;
66 
67     mixer_ctl_get(ctl, &value);
68     return NO_ERROR;
69 }
70 
set(const char * name,unsigned int value,int index)71 status_t ALSAControl::set(const char *name, unsigned int value, int index)
72 {
73     struct mixer_ctl *ctl;
74     int ret = 0;
75     ALOGD("set:: name %s value %d index %d", name, value, index);
76     if (!mHandle) {
77         ALOGE("Control not initialized");
78         return NO_INIT;
79     }
80 
81     // ToDo: Do we need to send index here? Right now it works with 0
82     ctl = mixer_get_control(mHandle, name, 0);
83     if(ctl == NULL) {
84         ALOGE("Could not get the mixer control");
85         return BAD_VALUE;
86     }
87     ret = mixer_ctl_set(ctl, value);
88     return (ret < 0) ? BAD_VALUE : NO_ERROR;
89 }
90 
set(const char * name,const char * value)91 status_t ALSAControl::set(const char *name, const char *value)
92 {
93     struct mixer_ctl *ctl;
94     int ret = 0;
95     ALOGD("set:: name %s value %s", name, value);
96 
97     if (!mHandle) {
98         ALOGE("Control not initialized");
99         return NO_INIT;
100     }
101 
102     ctl = mixer_get_control(mHandle, name, 0);
103     if(ctl == NULL) {
104         ALOGE("Could not get the mixer control");
105         return BAD_VALUE;
106     }
107     ret = mixer_ctl_select(ctl, value);
108     return (ret < 0) ? BAD_VALUE : NO_ERROR;
109 }
110 
setext(const char * name,int count,char ** setValues)111 status_t ALSAControl::setext(const char *name, int count, char **setValues)
112 {
113     struct mixer_ctl *ctl;
114     int ret = 0;
115     ALOGD("setext:: name %s count %d", name, count);
116     if (!mHandle) {
117         ALOGE("Control not initialized");
118         return NO_INIT;
119     }
120 
121     // ToDo: Do we need to send index here? Right now it works with 0
122     ctl = mixer_get_control(mHandle, name, 0);
123     if(ctl == NULL) {
124         ALOGE("Could not get the mixer control");
125         return BAD_VALUE;
126     }
127     ret = mixer_ctl_set_value(ctl, count, setValues);
128     return (ret < 0) ? BAD_VALUE : NO_ERROR;
129 }
130 
131 };        // namespace android
132