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); }
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); } }
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 *)δ 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; }
MSFunctionType(void) MSFreeFilter (MidiFilterPtr filter) { FreeFilter (filter); }
/*____________________________________________________________________*/ void Close (void) { if (myFilterPtr) FreeFilter (myFilterPtr); MidiClose( refNum); }