int main(int argc, char **argv) { wav_t *w; audio_meta_t meta; talking_skull_t *talking_skull; void *data; size_t n_data; if (argc != 2) { fprintf(stderr, "usage: filename.wav\n"); return 1; } w = wav_new(argv[1]); if (! w) { perror(argv[1]); return 1; } meta = wav_get_meta(w); data = wav_get_raw_data(w, &n_data); talking_skull = talking_skull_new(&meta, true, update, NULL); talking_skull_play(talking_skull, data, n_data); sleep(30); wav_destroy(w); return 0; }
int export_wav(struct play_s *play) { /* Export wav uses following pipeline: file -(uncompressed_buffer)-> reads data from stream file unpack -(uncompressed_buffer)-> decompresses lzo/quicklz packets wav -(rgb)-> write audio to file in wav format */ ps_bufferattr_t attr; ps_buffer_t uncompressed_buffer, compressed_buffer; wav_t wav; unpack_t unpack; int ret = 0; if ((ret = ps_bufferattr_init(&attr))) goto err; /* buffers */ if ((ret = ps_bufferattr_setsize(&attr, play->compressed_size))) goto err; if ((ret = ps_buffer_init(&compressed_buffer, &attr))) goto err; if ((ret = ps_bufferattr_setsize(&attr, play->uncompressed_size))) goto err; if ((ret = ps_buffer_init(&uncompressed_buffer, &attr))) goto err; if ((ret = ps_bufferattr_destroy(&attr))) goto err; /* init filters */ if ((ret = unpack_init(&unpack, &play->glc))) goto err; if ((ret = wav_init(&wav, &play->glc))) goto err; wav_set_interpolation(wav, play->interpolate); wav_set_filename(wav, play->export_filename_format); wav_set_stream_id(wav, play->export_audio_id); wav_set_silence_threshold(wav, play->silence_threshold); /* start the threads */ if ((ret = unpack_process_start(unpack, &compressed_buffer, &uncompressed_buffer))) goto err; if ((ret = wav_process_start(wav, &uncompressed_buffer))) goto err; if ((ret = file_read(play->file, &compressed_buffer))) goto err; /* wait and clean up */ if ((ret = wav_process_wait(wav))) goto err; if ((ret = unpack_process_wait(unpack))) goto err; unpack_destroy(unpack); wav_destroy(wav); ps_buffer_destroy(&compressed_buffer); ps_buffer_destroy(&uncompressed_buffer); return 0; err: if (!ret) { fprintf(stderr, "exporting wav failed: initializing filters failed\n"); return EAGAIN; } else { fprintf(stderr, "exporting wav failed: %s (%d)\n", strerror(ret), ret); return ret; } }
int main(int argc, char **argv) { wav_t *w; audio_meta_t meta; state_t s; audio_config_t audio_cfg; audio_device_t audio_dev; audio_t *audio; talking_skull_t *talking_skull; bool has_servo_track; pi_usb_init(); s.gain = 1; if ((s.m = maestro_new()) == NULL) { fprintf(stderr, "couldn't find a recognized device.\n"); exit(1); } while (argc > 1 && argv[1][0] == '-' && argv[1][1] == '-') { if (strcmp(argv[1], "--") == 0) { argc -= 1; argv += 1; break; } if (argc > 2 && strcmp(argv[1], "--gain") == 0) { s.gain = atof(argv[2]); argc -= 2; argv += 2; } if (argc > 1 && strcmp(argv[1], "--servo") == 0) { has_servo_track = true; argc -= 1; argv += 1; } if (argc > 1 && strcmp(argv[1], "--baxter") == 0) { maestro_set_servo_range(s.m, SERVO_ID, BAXTER_MOUTH); argc -= 1; argv += 1; } if (argc > 1 && strcmp(argv[1], "--deer") == 0) { maestro_set_servo_is_inverted(s.m, SERVO_ID, 0); maestro_set_servo_range(s.m, SERVO_ID, TALKING_DEER); argc -= 1; argv += 1; } if (argc > 1 && strcmp(argv[1], "--skull2") == 0) { maestro_set_servo_is_inverted(s.m, SERVO_ID, 0); maestro_set_servo_range(s.m, SERVO_ID, TALKING_SKULL2); argc -= 1; argv += 1; } } w = wav_new(argv[1]); if (! w) { perror(argv[1]); exit(1); } meta = wav_get_meta(w); talking_skull = talking_skull_new(&meta, has_servo_track, update_servo, &s); if (has_servo_track) { wav_extract_servo_track(w); } audio_device_init_playback(&audio_dev); audio_config_init_default(&audio_cfg); wav_configure_audio(w, &audio_cfg); printf("Config from wav file: "); audio_config_print(&audio_cfg, stdout); printf("\n"); audio = audio_new(&audio_cfg, &audio_dev); if (! audio) { perror("audio_new"); exit(1); } audio_set_volume(audio, 100); wav_play_with_talking_skull(w, audio, talking_skull); if (s.m) { maestro_set_servo_pos(s.m, SERVO_ID, 50); maestro_destroy(s.m); } wav_destroy(w); audio_destroy(audio); return 0; }