/*********************** Main program **********************/ int main(int argc, char **argv) { register int err; // No wave data loaded yet WavePtr = 0; if (argc < 2) { printf("You must supply the name of a 16-bit mono WAVE file to play\n"); return 0; } // Load the wave file if (waveLoad(argv[1])) { printf("Could not load wave file\n"); return 0; } if(WaveBits != 16) { printf("16 bit PCM audio only!!!\n"); return 0; } printf("Sample total %d\n", WaveSize); printf("Sample rate %d\n", WaveRate); printf("Sample bits %d\n", WaveBits); add_effect(fuzz_init, fuzz_run, fuzz_end, "Fuzz"); printf("Finished effect line\n"); // Open audio card we wish to use for playback if ((err = snd_pcm_open(&PlaybackHandle, &SoundCardPortName[0], SND_PCM_STREAM_PLAYBACK, 0)) < 0) { printf("Can't open audio %s: %s\n", &SoundCardPortName[0], snd_strerror(err)); return 0; } // Set the audio card's hardware parameters (sample rate, bit resolution, etc) if ((err = snd_pcm_set_params(PlaybackHandle, SND_PCM_FORMAT_S16, SND_PCM_ACCESS_RW_INTERLEAVED, WaveChannels, WaveRate, 1, 10000)) < 0) { printf("Can't set sound parameters: %s\n", snd_strerror(err)); return 0; } // Play the waveform play_audio(); // Close sound card snd_pcm_close(PlaybackHandle); // Free the WAVE data free_wave_data(); return 0; }
/*! * @brief プログラムのエントリポイント * * 使い方<br> * $ ./main [wavefile-name] N * @param [in] argc コマンドライン引数の数 * @param [in] argv コマンドライン引数 * @return 終了コード */ int main(int argc, char *argv[]) { unsigned int N; unsigned int k; double frq_rate; double *restrict f_real; double *restrict f_imag; WAVE_DATA *restrict wd; POINT *restrict points; RANGE range = {{0.0, 0.0}, {0.0, 0.0}}; if (argc != 3) { fprintf(stderr, "bad argument!\n"); return EXIT_FAILURE; } wd = read_wave_file(argv[1]); N = str2int(argv[2]); print_wave_header(wd); f_real = CALLOC(double, N); f_imag = CALLOC(double, N); points = CALLOC(POINT, N); if (f_real == NULL || f_imag == NULL || points == NULL) { fputs("メモリ確保エラーです\n", stderr); return EXIT_FAILURE; } auto_dft(f_real, f_imag, wd->s_data1, NULL, N); frq_rate = (double)wd->samples_per_sec / N; for (k = 0; k < N; k++) { points[k].x = frq_rate * k; points[k].y = sqrt(SQ(f_real[k]) + SQ(f_imag[k])); if (range.max.y < points[k].y) range.max.y = points[k].y; } range.max.x = (double)wd->samples_per_sec / 2; range.max.y = (range.max.y == 0.0 ? 1.0 : range.max.y * 1.2); // print_result(points, N); if (show_gplot(points, N, range) == -1) { fputs("gnuplotを起動できません\n", stderr); fputs("gnuplotにPATHが通っているか、確認してください\n", stderr); } FREE(&f_real); FREE(&f_imag); FREE(&points); free_wave_data(wd); return EXIT_SUCCESS; }