static Tuple *metronom_probe_for_tuple(const char * filename, VFSFile *fd) { Tuple *tuple = tuple_new_from_filename(filename); metronom_t metronom; char *tmp = NULL; if (metronom_get_cp(filename, &metronom, &tmp)) tuple_set_str(tuple, FIELD_TITLE, tmp); str_unref(tmp); return tuple; }
static bool_t metronom_play (const char * filename, VFSFile * file) { metronom_t pmetronom; int16_t data[BUF_SAMPLES]; int t = 0, tact, num; int datagoal = 0; int datamiddle = 0; int datacurrent = datamiddle; int datalast = datamiddle; int data_form[TACT_FORM_MAX]; if (aud_input_open_audio(FMT_S16_NE, AUDIO_FREQ, 1) == 0) return FALSE; if (!metronom_get_cp(filename, &pmetronom, NULL)) { fprintf (stderr, "Invalid metronom tact parameters in URI %s", filename); return FALSE; } aud_input_set_bitrate(sizeof(data[0]) * 8 * AUDIO_FREQ); tact = 60 * AUDIO_FREQ / pmetronom.bpm; /* prepare weighted amplitudes */ for (num = 0; num < pmetronom.num; num++) { data_form[num] = MAX_AMPL * tact_form[pmetronom.id][num]; } num = 0; while (!aud_input_check_stop()) { int i; for (i = 0; i < BUF_SAMPLES; i++) { if (t == tact) { t = 0; datagoal = data_form[num]; } else if (t == 10) { datagoal = -data_form[num]; } else if (t == 25) { datagoal = data_form[num]; /* circle through weighted amplitudes */ num++; if (num >= pmetronom.num) num = 0; } /* makes curve a little bit smoother */ data[i] = (datalast + datacurrent + datagoal) / 3; datalast = datacurrent; datacurrent = data[i]; if (t > 35) datagoal = (datamiddle + 7 * datagoal) / 8; t++; } aud_input_write_audio(data, BUF_BYTES); } return TRUE; }
static gboolean metronom_play(InputPlayback *playback, const gchar *filename, VFSFile *file, gint start_time, gint stop_time, gboolean pause) { metronom_t pmetronom; gint16 data[BUF_SAMPLES]; gint t = 0, tact, num; gint datagoal = 0; gint datamiddle = 0; gint datacurrent = datamiddle; gint datalast = datamiddle; gint data_form[TACT_FORM_MAX]; gboolean error = FALSE; if (playback->output->open_audio(FMT_S16_LE, AUDIO_FREQ, 1) == 0) { error = TRUE; goto error_exit; } if (!metronom_get_cp(filename, &pmetronom, NULL)) { g_message("Invalid metronom tact parameters in URI %s", filename); goto error_exit; } if (pause) playback->output->pause(TRUE); playback->set_params(playback, sizeof(data[0]) * 8 * AUDIO_FREQ, AUDIO_FREQ, 1); tact = 60 * AUDIO_FREQ / pmetronom.bpm; /* prepare weighted amplitudes */ for (num = 0; num < pmetronom.num; num++) { data_form[num] = MAX_AMPL * tact_form[pmetronom.id][num]; } stop_flag = FALSE; playback->set_pb_ready(playback); num = 0; while (!stop_flag) { gint i; for (i = 0; i < BUF_SAMPLES; i++) { if (t == tact) { t = 0; datagoal = data_form[num]; } else if (t == 10) { datagoal = -data_form[num]; } else if (t == 25) { datagoal = data_form[num]; /* circle through weighted amplitudes */ num++; if (num >= pmetronom.num) num = 0; } /* makes curve a little bit smoother */ data[i] = (datalast + datacurrent + datagoal) / 3; datalast = datacurrent; datacurrent = data[i]; if (t > 35) datagoal = (datamiddle + 7 * datagoal) / 8; t++; } if (!stop_flag) playback->output->write_audio(data, BUF_BYTES); } error_exit: stop_flag = TRUE; playback->output->close_audio(); return !error; }