static int files_close(void *handle) { struct files_handle *h = handle; if (h->audio.fmtid != AUDIO_NONE) { wav_stop_write(h->wav_fd,&h->wav_header,h->wav_size); close(h->wav_fd); } free(h); return 0; }
static int raw_close(void *handle) { struct raw_handle *h = handle; if (h->audio.fmtid != AUDIO_NONE) { wav_stop_write(h->wav_fd,&h->wav_header,h->wav_size); close(h->wav_fd); } if (h->video.fmtid != VIDEO_NONE && 1 != h->fd) close(h->fd); free(h); return 0; }
int main() { long loops; int rc; int size; snd_pcm_t *rec_handle; snd_pcm_hw_params_t *rec_params; unsigned int val; int dir; snd_pcm_uframes_t frames; char *buffer; WAVEHDR wavheader; int total_len = 0; FILE *fp_rec = fopen("rec.wav", "wb"); if(fp_rec==NULL) { return 0; } wav_start_write(fp_rec, &wavheader); /* Open PCM device for recording (capture). */ rc = snd_pcm_open(&rec_handle, "default", SND_PCM_STREAM_CAPTURE, 0); if (rc < 0) { fprintf(stderr, "unable to open pcm device: %s\n", snd_strerror(rc)); exit(1); } /* Allocate a hardware parameters object. */ snd_pcm_hw_params_alloca(&rec_params); /* Fill it in with default values. */ snd_pcm_hw_params_any(rec_handle, rec_params); /* Set the desired hardware parameters. */ /* Interleaved mode */ snd_pcm_hw_params_set_access(rec_handle, rec_params, SND_PCM_ACCESS_RW_INTERLEAVED); /* Signed 16-bit little-endian format */ snd_pcm_hw_params_set_format(rec_handle, rec_params, SND_PCM_FORMAT_S16_LE); /* Two channels (stereo) */ snd_pcm_hw_params_set_channels(rec_handle, rec_params, 1); /* 44100 bits/second sampling rate (CD quality) */ val = 8000; snd_pcm_hw_params_set_rate_near(rec_handle, rec_params, &val, &dir); /* Set period size to 32 frames. */ frames = 32; snd_pcm_hw_params_set_period_size_near(rec_handle, rec_params, &frames, &dir); /* Write the parameters to the driver */ rc = snd_pcm_hw_params(rec_handle, rec_params); if (rc < 0) { fprintf(stderr, "unable to set hw parameters: %s\n", snd_strerror(rc)); exit(1); } /* Use a buffer large enough to hold one period */ snd_pcm_hw_params_get_period_size(rec_params, &frames, &dir); size = frames * 2; /* 2 bytes/sample, 2 channels */ buffer = (char *) malloc(size); /* We want to loop for 5 seconds */ snd_pcm_hw_params_get_period_time(rec_params, &val, &dir); loops = 2000; while (loops-- > 0) { rc = snd_pcm_readi(rec_handle, buffer, frames); if (rc == -EPIPE) { /* EPIPE means overrun */ fprintf(stderr, "overrun occurred\n"); snd_pcm_prepare(rec_handle); } else if (rc < 0) { fprintf(stderr, "error from read: %s\n", snd_strerror(rc)); } else if (rc != (int)frames) { fprintf(stderr, "short read, read %d frames\n", rc); } rc = fwrite(buffer, 1, size, fp_rec); total_len += size; printf("#\n"); if (rc != size) fprintf(stderr,"short write: wrote %d bytes\n", rc); } wav_stop_write(fp_rec, &wavheader, total_len); snd_pcm_drain(rec_handle); snd_pcm_close(rec_handle); free(buffer); fclose(fp_rec); return 0; }