Example #1
0
File: cec.c Project: avagin/linux
/*
 * Decrement decay value. We're using DECAY_BITS bits to denote decay of an
 * element in the array. On insertion and any access, it gets reset to max.
 */
static void do_spring_cleaning(struct ce_array *ca)
{
	int i;

	for (i = 0; i < ca->n; i++) {
		u8 decay = DECAY(ca->array[i]);

		if (!decay)
			continue;

		decay--;

		ca->array[i] &= ~(DECAY_MASK << COUNT_BITS);
		ca->array[i] |= (decay << COUNT_BITS);
	}
	ca->decay_count = 0;
	ca->decays_done++;
}
Example #2
0
static void tms36xx_sound_update(int param, INT16 *buffer, int length)
{
	struct TMS36XX *tms = tms36xx[param];
	int samplerate = tms->samplerate;

    /* no tune played? */
	if( !tunes[tms->tune_num] || tms->voices == 0 )
	{
		while (--length >= 0)
			buffer[length] = 0;
		return;
	}

	while( length-- > 0 )
	{
		int sum = 0;

		/* decay the twelve voices */
		DECAY( 0) DECAY( 1) DECAY( 2) DECAY( 3) DECAY( 4) DECAY( 5)
		DECAY( 6) DECAY( 7) DECAY( 8) DECAY( 9) DECAY(10) DECAY(11)

		/* musical note timing */
		tms->tune_counter -= tms->speed;
		if( tms->tune_counter <= 0 )
		{
			int n = (-tms->tune_counter / samplerate) + 1;
			tms->tune_counter += n * samplerate;

			if( (tms->note_counter -= n) <= 0 )
			{
				tms->note_counter += VMAX;
				if (tms->tune_ofs < tms->tune_max)
				{
					/* shift to the other 'bank' of voices */
                    tms->shift ^= 6;
					/* restart one 'bank' of voices */
					RESTART(0) RESTART(1) RESTART(2)
					RESTART(3) RESTART(4) RESTART(5)
					tms->tune_ofs++;
				}
			}
		}

		/* update the twelve voices */
		TONE( 0) TONE( 1) TONE( 2) TONE( 3) TONE( 4) TONE( 5)
		TONE( 6) TONE( 7) TONE( 8) TONE( 9) TONE(10) TONE(11)

        *buffer++ = sum / tms->voices;
	}
}
Example #3
0
static STREAM_UPDATE( tms36xx_sound_update )
{
	tms_state *tms = (tms_state *)param;
	int samplerate = tms->samplerate;
	stream_sample_t *buffer = outputs[0];

    /* no tune played? */
	if( !tunes[tms->tune_num] || tms->voices == 0 )
	{
		while (--samples >= 0)
			buffer[samples] = 0;
		return;
	}

	while( samples-- > 0 )
	{
		int sum = 0;

		/* decay the twelve voices */
		DECAY( 0) DECAY( 1) DECAY( 2) DECAY( 3) DECAY( 4) DECAY( 5)
		DECAY( 6) DECAY( 7) DECAY( 8) DECAY( 9) DECAY(10) DECAY(11)

		/* musical note timing */
		tms->tune_counter -= tms->speed;
		if( tms->tune_counter <= 0 )
		{
			int n = (-tms->tune_counter / samplerate) + 1;
			tms->tune_counter += n * samplerate;

			if( (tms->note_counter -= n) <= 0 )
			{
				tms->note_counter += VMAX;
				if (tms->tune_ofs < tms->tune_max)
				{
					/* shift to the other 'bank' of voices */
                    tms->shift ^= 6;
					/* restart one 'bank' of voices */
					RESTART(0) RESTART(1) RESTART(2)
					RESTART(3) RESTART(4) RESTART(5)
					tms->tune_ofs++;
				}
			}
		}

		/* update the twelve voices */
		TONE( 0) TONE( 1) TONE( 2) TONE( 3) TONE( 4) TONE( 5)
		TONE( 6) TONE( 7) TONE( 8) TONE( 9) TONE(10) TONE(11)

        *buffer++ = sum / tms->voices;
	}
}
Example #4
0
void tms36xx_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
{
	int samplerate = m_samplerate;
	stream_sample_t *buffer = outputs[0];

	/* no tune played? */
	if( !tunes[m_tune_num] || m_voices == 0 )
	{
		while (--samples >= 0)
			buffer[samples] = 0;
		return;
	}

	while( samples-- > 0 )
	{
		int sum = 0;

		/* decay the twelve voices */
		DECAY( 0) DECAY( 1) DECAY( 2) DECAY( 3) DECAY( 4) DECAY( 5)
		DECAY( 6) DECAY( 7) DECAY( 8) DECAY( 9) DECAY(10) DECAY(11)

		/* musical note timing */
		m_tune_counter -= m_speed;
		if( m_tune_counter <= 0 )
		{
			int n = (-m_tune_counter / samplerate) + 1;
			m_tune_counter += n * samplerate;

			if( (m_note_counter -= n) <= 0 )
			{
				m_note_counter += TMS36XX_VMAX;
				if (m_tune_ofs < m_tune_max)
				{
					/* shift to the other 'bank' of voices */
					m_shift ^= 6;
					/* restart one 'bank' of voices */
					RESTART(0) RESTART(1) RESTART(2)
					RESTART(3) RESTART(4) RESTART(5)
					m_tune_ofs++;
				}
			}
		}

		/* update the twelve voices */
		TONE( 0) TONE( 1) TONE( 2) TONE( 3) TONE( 4) TONE( 5)
		TONE( 6) TONE( 7) TONE( 8) TONE( 9) TONE(10) TONE(11)

		*buffer++ = sum / m_voices;
	}
}
Example #5
0
void matcher::gen_ans_pairs() {
	clock_t time_start = clock();
	ans_pairs.clear();
	vector<match_edge> match_edges;
	char * flag_a = new char[MAX_NODES], * flag = new char[MAX_NODES];
	char * fake_flag_a = new char[MAX_NODES], * fake_flag = new char[MAX_NODES];
	memset(flag_a, 0, MAX_NODES);
	memset(flag, 0, MAX_NODES);
	memset(fake_flag_a, 0, MAX_NODES);
	memset(fake_flag, 0, MAX_NODES);

	int * match = new int[MAX_NODES];

	for (int i=1; i <= G_a->num_nodes; i++)
		for (int j=1; j <= G->num_nodes; j++)
			match_edges.push_back(match_edge(i, j, sim_nodes[i][j]));
	sort(match_edges.begin(), match_edges.end());

	for (vector <match_edge> :: iterator it=match_edges.begin();
			it!=match_edges.end(); it++)
		if (!fake_flag_a[it->u] && !fake_flag[it->v]) {
			fake_flag_a[it->u] = 1;
			fake_flag[it->v] = 1;
			if (ans_pairs.size() < G_a->num_nodes * PERC_THRSD
					&& !flag_a[it->u] && !flag[it->v]) {
				flag_a[it->u] = 1;
				flag[it->v] = 1;
				match[it->u] = it->v;
				ans_pairs.push_back(*it);
			}
			if (ans_pairs.size() > G_a->num_nodes * PERC_THRSD)
				break;
		}

	fprintf(stderr, "First part: %lu pairs.\n", ans_pairs.size());

	double TINY = 1e20;
	for (size_t i = 1; i <= G_a->num_nodes; i++) {
		for (int j = 1; j <= G->num_nodes; j++)
			if (TINY > sim_nodes[i][j])
				TINY = sim_nodes[i][j];
	}

	for (int i=1; i<=G_a->num_nodes; i++) {
		if (!flag_a[i]) {
			map <int, double> weight;
			for (vector <int> :: iterator j = G_a->edges[i]->begin();
					j != G_a->edges[i]->end(); j++)
				if (flag_a[*j]) {
					for (vector <int> :: iterator k = G->rev_edges[match[*j]]->begin();
							k != G->rev_edges[match[*j]]->end(); k++)
						if (!flag[*k])
							weight[*k] += max(sim_nodes[i][*k], TINY);
				}
			for (vector <int> :: iterator j = G_a->rev_edges[i]->begin();
					j != G_a->rev_edges[i]->end(); j++)
				if (flag_a[*j]) {
					for (vector <int> :: iterator k = G->edges[match[*j]]->begin();
							k != G->edges[match[*j]]->end(); k++)
						if (!flag[*k])
							weight[*k] += max(sim_nodes[i][*k], TINY);
				}
			for (map <int, double> :: iterator k = weight.begin();
					k!=weight.end(); k++)
				weights[i][k->first] = k->second;
		}
	}

	fprintf(stderr, "init weights.\n");

	int iterno = 0;
	H = new matcher::heap(weights, G_a->num_nodes, this);

	for (int last_s = 0, u, v; H->len && ans_pairs.size() != last_s; iterno++) {
		last_s = ans_pairs.size();
		while (H->len){
			u = H->nodes[1].u, v = H->nodes[1].v;
			H->pop();
			if (!flag_a[u] && !flag[v])
				break;
		}
		if (flag_a[u] || flag[v])
			break;
		flag_a[u] = flag[v] = 1;
		match[u] = v;
		ans_pairs.push_back(match_edge(u, v, weights[u][v]));

		for (vector <int> :: iterator j = G_a->edges[u]->begin();
				j != G_a->edges[u]->end(); j++)
			if (!flag_a[*j]) {
				for (vector <int> :: iterator k = G->edges[v]->begin();
						k != G->edges[v]->end(); k++)
					if (!flag[*k]){
						weights[*j][*k] += max(sim_nodes[*j][*k], TINY)
								* DECAY(iterno);
						if (H->heap_pos[*j][*k])
							H->heap_up(H->heap_pos[*j][*k]);
						else
							H->push(*j, *k);
					}
			}

		for (vector <int> :: iterator j = G_a->rev_edges[u]->begin();
				j != G_a->rev_edges[u]->end(); j++)
			if (!flag_a[*j]) {
				for (vector <int> :: iterator k = G->rev_edges[v]->begin();
						k != G->rev_edges[v]->end(); k++)
					if (!flag[*k]){
						weights[*j][*k] += max(sim_nodes[*j][*k], TINY)
								* DECAY(iterno);
						if (H->heap_pos[*j][*k])
							H->heap_up(H->heap_pos[*j][*k]);
						else
							H->push(*j, *k);
					}
			}
	}

	fprintf(stderr, "%lu pairs matched.\n", ans_pairs.size());

	for (std::vector<match_edge> :: iterator it=match_edges.begin();
			it!=match_edges.end(); it++)
			if (!flag_a[it->u] && !flag[it->v]){
				flag_a[it->u] = flag[it->v] = 1;
				match[it->u] = it->v;
				ans_pairs.push_back(*it);
			}
	fprintf(stderr, "%lu pairs processed.\n", ans_pairs.size());

	for (int i=1; i<=G_a->num_nodes; i++)
		if (!flag_a[i]) {
			for (int j=1; j<=G->num_nodes; j++)
				if (!flag[j]) {
					flag_a[i] = flag[j] = 1;
					match[i] = j;
					ans_pairs.push_back(match_edge(i, j, 0));
					break;
				}
		}

	delete H;

	delete []match;
	delete []flag_a;
	delete []flag;
	delete []fake_flag_a;
	delete []fake_flag;
	fprintf(stderr, "answer pairs generated.\n\t%.2lf seconds.\n",
			(clock()-time_start)*1.0/CLOCKS_PER_SEC);
}