示例#1
0
void PhotonLTEIntegrator::ShootPhotons(size_t i_photons, bool i_low_thread_priority)
  {
  mp_photon_maps.reset(new PhotonMaps());

  const LightSources &lights = mp_scene->GetLightSources();
  if (lights.m_delta_light_sources.size() + lights.m_area_light_sources.size() + lights.m_infinite_light_sources.size() == 0 || i_photons == 0)
    return;

  std::vector<double> lights_CDF;
  _GetLightsPowerCDF(lights, lights_CDF);

  PhotonsInputFilter input_filter(mp_photon_maps, i_photons, m_params.m_max_caustic_photons, m_params.m_max_direct_photons, m_params.m_max_indirect_photons, MAX_PIPELINE_TOKENS_NUM, 4096);
  PhotonsShootingFilter shooting_filter(this, mp_scene, lights_CDF, i_low_thread_priority);
  PhotonsMergingFilter merging_filter(mp_photon_maps);

  tbb::pipeline pipeline;
  pipeline.add_filter(input_filter);
  pipeline.add_filter(shooting_filter);
  pipeline.add_filter(merging_filter);

  pipeline.run(MAX_PIPELINE_TOKENS_NUM);
  pipeline.clear();

  // Construct the KD trees. We explicitly do this now while we are still in a single thread to avoid concurrency issues later.
  tbb::parallel_invoke([&]{mp_photon_maps->GetCausticMap(); },
                       [&]{mp_photon_maps->GetDirectMap(); },
                       [&]{mp_photon_maps->GetIndirectMap(); });

  _ConstructIrradiancePhotonMap();
  }
示例#2
0
文件: axGain.cpp 项目: EQ4/axLib
void PolyPhonicChannel::ProcessChannel(VstInt32 sampleFrames)
{
    double* out1 = _processBuffer[0];
    double* out2 = _processBuffer[1];
    
    while (--sampleFrames >= 0)
    {
        double value = 0.0;
        _waveTable->ProcessSample(&value);
        
        if(value != value)
        {
            std::cout << "Wavetable IS NAN" << std::endl;
        }
        
        t_out input_filter(value, value);
        t_out filter_processed = _filter->ProcessStereo(input_filter);
        
        double env = _env->Process();
        
//        if(env != env)
//        {
//            std::cout << "ENV IS NAN" << std::endl;
//        }
        
        if(filter_processed.l != filter_processed.l)
        {
            std::cout << "FILTER IS NAN" << std::endl;
        }
        
        *out1++ = filter_processed.l * env;
        *out2++ = filter_processed.r * env;
    }
}
示例#3
0
文件: resend.c 项目: boutier/babeld
int
record_resend(int kind, const unsigned char *prefix, unsigned char plen,
              const unsigned char *src_prefix, unsigned char src_plen,
              unsigned short seqno, const unsigned char *id,
              struct interface *ifp, int delay)
{
    struct resend *resend;
    unsigned int ifindex = ifp ? ifp->ifindex : 0;

    if((kind == RESEND_REQUEST &&
        input_filter(NULL, prefix, plen, src_prefix, src_plen, NULL,
                     ifindex) >=
        INFINITY) ||
       (kind == RESEND_UPDATE &&
        output_filter(NULL, prefix, plen, src_prefix, src_plen, ifindex) >=
        INFINITY))
        return 0;

    if(delay >= 0xFFFF)
        delay = 0xFFFF;

    resend = find_resend(kind, prefix, plen, src_prefix, src_plen, NULL);
    if(resend) {
        if(resend->delay && delay)
            resend->delay = MIN(resend->delay, delay);
        else if(delay)
            resend->delay = delay;
        resend->time = now;
        resend->max = RESEND_MAX;
        if(id && memcmp(resend->id, id, 8) == 0 &&
           seqno_compare(resend->seqno, seqno) > 0) {
            return 0;
        }
        if(id)
            memcpy(resend->id, id, 8);
        else
            memset(resend->id, 0, 8);
        resend->seqno = seqno;
        if(resend->ifp != ifp)
            resend->ifp = NULL;
    } else {
        resend = calloc(1, sizeof(struct resend));
        if(resend == NULL)
            return -1;
        resend->kind = kind;
        resend->max = RESEND_MAX;
        resend->delay = delay;
        memcpy(resend->prefix, prefix, 16);
        resend->plen = plen;
        memcpy(resend->src_prefix, src_prefix, 16);
        resend->src_plen = src_plen;
        resend->seqno = seqno;
        if(id)
            memcpy(resend->id, id, 8);
        resend->ifp = ifp;
        resend->time = now;
        resend->next = to_resend;
        to_resend = resend;
    }

    if(resend->delay) {
        struct timeval timeout;
        timeval_add_msec(&timeout, &resend->time, resend->delay);
        timeval_min(&resend_time, &timeout);
    }
    return 1;
}
示例#4
0
int input_pcm ( char* pdata, int datasize, int rate, int channelnum)
{


    if (channelnum == 0 || pdata == NULL)
    {
        return -1;
    }


    double k = (double) rate / 8000; //下变换因子
    int i = 0;
    int samplenum = datasize / 2 / channelnum;
    for (i = 0; i < samplenum; i++)
    {
        pgetter->input_sample_num++;
        int64_t temp = pgetter->input_sample_num / k;
        if (temp > pgetter->sample_8k_num) //下采样
        {
            pgetter->sample_8k_num = temp;
            int n;
            double valsum = 0;
            short *pval = pdata + i * 2 * channelnum;
            for (n = 0; n < channelnum; n++)
            {
                valsum += *pval;
            }
            valsum = valsum / channelnum / 32768; //声道采样混合,-1~1归一化


            //过5组滤波器
            for (n = 0; n < FILTER_NUM; n++)
            {
                double y = input_filter(&pgetter->filter[n], valsum);
                pgetter->feat_win[n][pgetter->feat_win_pos] = y;
            }



            if (pgetter->feat_win_pos + 1 == WIN_SIZE)
            {

                for (n = 0; n < FILTER_NUM; n++)
                {
                    int num = 0;
                    double sum = 0;
                    for (num = 0; num < WIN_SIZE; num++)
                    {
                        if (pgetter->feat_win[n][num] < 0)
                        {
                            sum = sum - pgetter->feat_win[n][num];
                        }
                        else
                        {
                            sum = sum + pgetter->feat_win[n][num];
                        }
                    }

                    //psample->pfeat_obj->val[n][pos] = sum;

                    if (n == 0)
                    {
                        //printf("hererere %f\n", sum);
                        //fprintf(pfilet,"%f\n",sum);
                        //fflush(pfilet);
                    }
                    //sum = sum * loudpara[n];
                    pgetter->diffval[n] = sum - pgetter->currval[n];
                    pgetter->currval[n] = sum;

                    memmove(pgetter->feat_win[n], pgetter->feat_win[n] + WIN_STEP, sizeof (double)*(WIN_SIZE - WIN_STEP));

                }
                //printf("hererere %f %f %f %f %f \n",pgetter->diffval[0],pgetter->diffval[1],pgetter->diffval[2],pgetter->diffval[3],pgetter->diffval[4]);
                
                    input_feature(pgetter);
                
                

                pgetter->feat_win_pos = WIN_SIZE - WIN_STEP; //窗内数据满后计算意思,然后步进

            }
            else
            {
                pgetter->feat_win_pos++;
            }

        }
    }

    //fflush(pfile);
    return 0;
}
示例#5
0
文件: main.c 项目: noktoborus/Norkkie
void
subkey (struct input_cmds_t *ins, struct select_t *sel, unsigned char key)
{
	char *tmp;
	struct cmdNode_t *cmd;
	size_t x;

	/* test control symbols */
	if (key == 127)
	{
		/* its <DEL> */
		if (ins->failch)
		{
			ins->failch = '\0';
		}
		else
		if (ins->strlen > ins->offset)
		{
			ins->strlen--;
		}
		else
		if (ins->c)
		{
			/* TODO: raise from args last line before remove call ptr */
			/* remove current call pointer */
			ins->c->argn = 0;
			ins->c->cmd = NULL;
			ins->type = FINPUT_TSTRING;
			ins->strlen = 0;
			ins->offset = 0;
			/* TODO: call split */
		}
		return;
	}
	else
	/* remove all data in input */
	if (key == 8)
	{
		ins->strlen = ins->offset;
		ins->failch = '\0';
		return;
	}

	/* ignore ',' in start of line and over characters */
	if ((!ins->strlen && key == ',') ||
			(key != ',' && input_filter (ins->type, key)))
	{
		ins->failch = key;
		return;
	}

	/* test struct input_cmds_t */
	if (!ins->c)
	{
		if (!ins->i)
		{
			ins->i = calloc (1, sizeof (struct input_node_t));
			if (!ins->i)
				return;
			ins->c = ins->i;
		}
		else
		{
			ins->c = calloc (1, sizeof (struct input_node_t));
			if (!ins->c)
				return;
			if (ins->i->prev)
				ins->i->prev->next = ins->c;
			ins->c->prev = ins->i->prev;
			ins->i->prev = ins->c;
		}
	}

	/* alloc input string */
	if (!ins->input)
	{
		ins->input = calloc (INPUT_SZ, sizeof (char));
		if (!ins->input)
			return;
		ins->strlen = 0;
	}
	else
	/* resize string */
	if ((ins->strlen + 2) % INPUT_SZ < ins->strlen % INPUT_SZ)
	{
		tmp = calloc (ins->strlen + INPUT_SZ, sizeof (char));
		if (!tmp)
			return;
		memcpy (tmp, (const void*)ins->input, ins->strlen);
		free (ins->input);
		ins->input = tmp;
	}

	/* add new char */
	ins->input[ins->strlen] = key;
	ins->strlen++;
	ins->input[ins->strlen] = '\0';
	/* free error */
	ins->failch = '\0';

	/** current command not set **/
	if (!(cmd = ins->c->cmd))
	{
		/* try find in layer space */
		if ((cmd = sel->sel[sel->cursel].cmds))
		{
			do
			{
				/* skip smallest or biggest tags */
				if (cmd->taglen != ins->strlen)
					continue;
				/* set current tag to find :3 */
				if (!strncmp (cmd->tag, ins->input, ins->strlen))
					break;
			}
			while ((++cmd)->tag);
		}
		/* try find in global space */
		if (cmd && !(cmd->tag) && (cmd = sel->cmds))
		{
			do
			{
				if (cmd->taglen != ins->strlen)
					continue;
				if (!strncmp (cmd->tag, ins->input, ins->strlen))
					break;
			}
			while ((++cmd)->tag);
		}

		/* continues input */
		if (cmd && cmd->tag)
		{
			if (!cmd->call)
				cmd->call = msel_func_NULL;
			else
			{
				if (!cmd->call->merge)
					cmd->call->merge = msel_func_NULL->merge;
				if (!cmd->call->split)
					cmd->call->split = msel_func_NULL->split;
				if (!cmd->call->wargk)
					cmd->call->wargk = msel_func_NULL->wargk;
			}


			ins->input[ins->strlen] = '\0';
			ins->offset = ++ins->strlen;
			ins->c->cmd = cmd;
			ins->c->argn = 0;
		}
	}

	/* test current command */
	if (ins->c->cmd)
	{
		if (ins->input[ins->strlen - 1] == ',')
		{
			ins->offset = ins->strlen;
			ins->input[ins->strlen - 1] = '\0';
			ins->c->argn++;
		}

		/* test for call */
		if (ins->c->cmd->call->wargk[ins->c->argn] == FINPUT_TVOID)
		{
			/* alloc:
			 *	len of input string
			 *	+ nums of arguments
			 */
			ins->c->argv = calloc (1,
					sizeof (char) * ins->strlen +
					sizeof (char*) * (ins->c->argn + 1));
			if (!ins->c->argv)
			{
				ins->c = NULL;
				return;
			}

			/* copy tag to argv */
			ins->c->argv[0] = (char*)(ins->c->argv + ins->c->argn + 1);
			memcpy (ins->c->argv[0], ins->input, ins->strlen);

			/* ptr to over data */
			if (ins->c->argn)
			{
				ins->c->argv[1] = ins->c->argv[0] + ins->c->cmd->taglen + 1;
				x = ins->c->argn;
				/* fix offset (remove last 2zero) */
				ins->offset--;
				/* update links */
				do
				{
					/* find last \0 */
					while (--ins->offset && ins->c->argv[0][ins->offset - 1]);
					/* set arg point */
					ins->c->argv[x] = &(ins->c->argv[0][ins->offset]);
				}
				while (--x);
			}
			ins->c->cmd->call->merge (sel->cursel, sel,
					ins->c->argn + 1, ins->c->argv);
			ins->c = NULL;
			ins->strlen = 0;
			ins->offset = 0;
			ins->type = FINPUT_TSTRING;
		}
		else
		{
			/* set input type */
			ins->type = ins->c->cmd->call->wargk[ins->c->argn];
		}
	}
}