示例#1
0
AL_API ALvoid AL_APIENTRY alDeleteFilters(ALsizei n, const ALuint *filters)
{
    ALCdevice *device;
    ALCcontext *context;
    ALfilter *filter;
    ALsizei i;

    context = GetContextRef();
    if(!context) return;

    device = context->Device;
    LockFilterList(device);
    if(!(n >= 0))
        SETERR_GOTO(context, AL_INVALID_VALUE, done, "Deleting %d filters", n);
    for(i = 0;i < n;i++)
    {
        if(filters[i] && LookupFilter(device, filters[i]) == NULL)
            SETERR_GOTO(context, AL_INVALID_NAME, done, "Invalid filter ID %u", filters[i]);
    }
    for(i = 0;i < n;i++)
    {
        if((filter=LookupFilter(device, filters[i])) != NULL)
            FreeFilter(device, filter);
    }

done:
    UnlockFilterList(device);
    ALCcontext_DecRef(context);
}
示例#2
0
void test(const char* exp, const char* dev)
{
    int sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP));
    if (sock<=0)
    {
        P("socket error");
        return;
    }
    //设置缓冲区
    #define PER_PACKET_SIZE 2048
    const int BUFFER_SIZE = 1024*1024*16; //16MB的缓冲区
    struct tpacket_req req;
    req.tp_block_size = 4096;
    req.tp_block_nr = BUFFER_SIZE/req.tp_block_size;
    req.tp_frame_size = PER_PACKET_SIZE;
    req.tp_frame_nr = BUFFER_SIZE/req.tp_frame_size;
    if (-1==setsockopt(sock, SOL_PACKET, PACKET_RX_RING, &req, sizeof(struct tpacket_req)))
    {
        perror("setsockopt");
        P("set PACKET_RX_RING error");
        close(sock);
        return;
    }
    //映射缓冲区
    char* pBuffer = (char*)mmap(0, BUFFER_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, sock, 0);
    if (MAP_FAILED==pBuffer)
    {
        P("mmap error");
        close(sock);
        return;
    }
    //注意:一定要先映射后再绑定,否则会有问题
    // 问题的详细描述可参考:https://lists.linux-foundation.org/pipermail/bugme-new/2003-October/009110.html
    if (!SetPromisc(sock, dev))
    {
        P("SetPromisc [%s] error", dev);
        memset(&req, 0, sizeof(req));
        if (-1==setsockopt(sock, SOL_PACKET, PACKET_RX_RING, &req, sizeof(req)))
        {
            P("set map buffer to 0 error!");
        }
        close(sock);
        return;
    }
    if (!BindDevice(sock, dev))
    {
        P("bind [%s] error", dev);
        memset(&req, 0, sizeof(req));
        if (-1==setsockopt(sock, SOL_PACKET, PACKET_RX_RING, &req, sizeof(req)))
        {
            P("set map buffer to 0 error!");
        }
        close(sock);
        return;
    }
    //设置过滤器
    int nExpLen = strlen(exp);
    struct sock_fprog Filter;
    memset(&Filter, 0, sizeof(struct sock_fprog));
    if (nExpLen>0)
    {
        if (ExpressionToFilter(exp, &Filter))
        {
            if (setsockopt(sock, SOL_SOCKET, SO_ATTACH_FILTER,
                    &Filter, sizeof(Filter))<0)
            {
                perror("setsockopt");
            }
        }
    }
    //
    struct pollfd pfd;
    int nIndex = 0;
    for (; ; )
    {
        for (; ; )
        {
            struct tpacket_hdr* pHead = (struct tpacket_hdr*)(pBuffer + nIndex*PER_PACKET_SIZE);
            if (pHead->tp_len<34 || pHead->tp_len>1614)
            {
                break;
            }
            PrintPacket((char*)pHead+pHead->tp_net);
            pHead->tp_len = 0;
            pHead->tp_status = TP_STATUS_KERNEL;
            //注意:pHead->tp_status这个变量并不能真正反应出包的处理状态,
            //在有的服务器上 TP_STATUS_USER(1)代表包可用, TP_STATUS_KERNEL(0)代表包不可用
            //但是在有的服务器上,这个标志变量无效
            //对于这个问题我还没找到原因
            nIndex++;
            if (nIndex>=BUFFER_SIZE/PER_PACKET_SIZE)
            {
                nIndex = 0;
            }
        }
        //
        pfd.fd = sock;
        pfd.events = POLLIN | POLLERR;
        pfd.revents = 0;
        switch (poll(&pfd, 1, 1000))
        {
        case -1:
            perror("poll");
            P("poll error");
            goto EndWhile;
            break;
        case 0:
            P("time out");
            continue;
            break;
        }
    }
EndWhile:
    if (-1==munmap(pBuffer, BUFFER_SIZE))
    {
        P("unmap error!");
    }
    memset(&req, 0, sizeof(req));
    if (-1==setsockopt(sock, SOL_PACKET, PACKET_RX_RING, &req, sizeof(req)))
    {
        P("set map buffer to 0 error!");
    }
    close(sock);
    sock = -1;
    //
    if (nExpLen>0)
    {
        FreeFilter(&Filter);
    }
}
示例#3
0
struct descriptor_xd *MdsFilter(float *in_data, float *in_dim, int *size, float *cut_off, int *num_in_poles)
{ 
    static struct descriptor_xd out_xd = {0, DTYPE_DSC, CLASS_XD, 0, 0};

    DESCRIPTOR_A(data_d, sizeof(float), DTYPE_FLOAT, 0, 0);
    DESCRIPTOR_SIGNAL(signal_d, 1, 0, 0);
    DESCRIPTOR_DIMENSION(dimension_d, 0, 0);
    DESCRIPTOR_WINDOW(window_d, 0, 0, 0);
    DESCRIPTOR_RANGE(range_d, 0, 0, 0);

    struct descriptor
	start_d = {sizeof(float), DTYPE_FLOAT, CLASS_S, 0},
	end_d = {sizeof(float), DTYPE_FLOAT, CLASS_S, 0},
	delta_d = {sizeof(float), DTYPE_FLOAT, CLASS_S, 0},
	start_idx_d = {sizeof(int), DTYPE_L, CLASS_S, 0},
	end_idx_d = {sizeof(int), DTYPE_L, CLASS_S, 0},
	time_at_0_d = {sizeof(float), DTYPE_FLOAT, CLASS_S, 0};

	
    int num_samples, num_poles, start_idx, end_idx, i;
    float fc, delta, dummy, *filtered_data, start, end, time_at_0;
    float phs_steep, delay;
    float *mod, *phs;
    static Filter *filter;

    if(*num_in_poles > 0)
    	num_poles = *num_in_poles;
    else
    	num_poles = 10;

    signal_d.data = (struct descriptor *)&data_d;
    signal_d.dimensions[0] = (struct descriptor *)&dimension_d;
    dimension_d.window = (struct descriptor *)&window_d;
    dimension_d.axis = (struct descriptor *)&range_d;
    window_d.startidx = (struct descriptor *)&start_idx_d;
    window_d.endingidx = (struct descriptor *)&end_idx_d;
    window_d.value_at_idx0 = (struct descriptor *)&time_at_0_d;
    start_idx_d.pointer = (char*)&start_idx;
    end_idx_d.pointer = (char *)&end_idx;
    time_at_0_d.pointer = (char *)&time_at_0;
    range_d.begin = (struct descriptor *)&start_d;
    range_d.ending = (struct descriptor *)&end_d;
    range_d.deltaval = (struct descriptor *)&delta_d;
    start_d.pointer = (char *)&start;
    end_d.pointer = (char *)&end;
    delta_d.pointer = (char *)&delta;
    

    num_samples = *size;

    fc = 1/ (in_dim[1] - in_dim[0]);
    filter = ButtwInvar(cut_off, &dummy, &dummy, &dummy, &fc, &num_poles);
    
    filtered_data = (float *)malloc(num_samples * sizeof(float));
    mod = (float *)malloc(sizeof(float) * 1000);
    phs = (float *)malloc(sizeof(float) * 1000);
    TestFilter(filter, fc, 1000, mod, phs);

    for(i = 1; i < 1000 - 1  && !isnan(phs[i]) && !isnan(phs[i+1]) && phs[i] > phs[i+1]; i++);


    if(i > 1 && i < 1000)
    {
    	phs_steep = (phs[1] - phs[i])/((i/1000.) * fc/2.);
       	delay = phs_steep/(2*PI);
	
    }


    free((char *)mod);
    free((char *)phs);
    
    
    DoFilter(filter, in_data, filtered_data, &num_samples);
    FreeFilter(filter);
    data_d.pointer = (char *)filtered_data;
    data_d.arsize = num_samples * sizeof(float);
    start = in_dim[0]-delay;
    end = in_dim[num_samples - 1]-delay;
    delta = in_dim[1] - in_dim[0];
    start_idx = 0;
    end_idx = num_samples - 1;
    time_at_0 = in_dim[0] - delay;

    MdsCopyDxXd((struct descriptor *)&signal_d, &out_xd);
    free((char *)filtered_data);
    
    
    
    
    return &out_xd;
}
示例#4
0
MSFunctionType(void) MSFreeFilter (MidiFilterPtr filter) {
	FreeFilter (filter);
}
示例#5
0
/*____________________________________________________________________*/
void Close (void)
{
	if (myFilterPtr) FreeFilter (myFilterPtr);
	MidiClose( refNum);
}