/* * 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++; }
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; } }
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; } }
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; } }
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); }