static void* files_open(char *filesname, char *audioname, struct ng_video_fmt *video, const void *priv_video, int fps, struct ng_audio_fmt *audio, const void *priv_audio) { struct files_handle *h; if (video->fmtid != VIDEO_NONE && NULL == filesname) return NULL; if (NULL == (h = malloc(sizeof(*h)))) return NULL; /* init */ memset(h,0,sizeof(*h)); h->video = *video; h->audio = *audio; if (filesname) strcpy(h->file,filesname); if (h->audio.fmtid != AUDIO_NONE) { h->wav_fd = open(audioname, O_CREAT | O_RDWR | O_TRUNC, 0666); if (-1 == h->wav_fd) { fprintf(stderr,"open %s: %s\n",audioname,strerror(errno)); free(h); return NULL; } wav_start_write(h->wav_fd,&h->wav_header,&h->audio); } return h; }
static void* raw_open(char *videoname, char *audioname, struct ng_video_fmt *video, const void *priv_video, int fps, struct ng_audio_fmt *audio, const void *priv_audio) { struct raw_handle *h; int frame_rate_code = 0; int frame_rate_mul = fps; int frame_rate_div = 1000; if (NULL == (h = malloc(sizeof(*h)))) return NULL; /* init */ memset(h,0,sizeof(*h)); h->video = *video; h->audio = *audio; h->vpriv = priv_video; /* audio */ if (h->audio.fmtid != AUDIO_NONE) { h->wav_fd = open(audioname, O_CREAT | O_RDWR | O_TRUNC, 0666); if (-1 == h->wav_fd) { fprintf(stderr,"open %s: %s\n",audioname,strerror(errno)); free(h); return NULL; } wav_start_write(h->wav_fd,&h->wav_header,&h->audio); } /* video */ if (h->video.fmtid != VIDEO_NONE) { if (h->vpriv && h->vpriv->yuv4mpeg) { switch (fps) { case 23976: frame_rate_code = 1; /* 24000 / 1001 */ frame_rate_mul = 24000; frame_rate_div = 1001; break; case 29970: frame_rate_code = 4; /* 30000 / 1001 */ frame_rate_mul = 30000; frame_rate_div = 1001; break; case 59940: frame_rate_code = 7; /* 60000 / 1001 */ frame_rate_mul = 60000; frame_rate_div = 1001; break; case 24000: frame_rate_code = 2; break; case 25000: frame_rate_code = 3; break; case 30000: frame_rate_code = 5; break; case 50000: frame_rate_code = 6; break; case 60000: frame_rate_code = 8; break; default: fprintf(stderr,"illegal frame rate\n"); free(h); return NULL; } } if (NULL != videoname) { h->fd = open(videoname, O_CREAT | O_RDWR | O_TRUNC, 0666); if (-1 == h->fd) { fprintf(stderr,"open %s: %s\n",videoname,strerror(errno)); if (h->wav_fd) close(h->wav_fd); free(h); return NULL; } } else { h->fd = 1; /* use stdout */ } if (h->vpriv && h->vpriv->yuv4mpeg) { char header[64]; switch (h->vpriv->yuv4mpeg) { case 1: sprintf(header, "YUV4MPEG %d %d %d\n", h->video.width, h->video.height,frame_rate_code); break; case 2: sprintf(header, "YUV4MPEG2 W%d H%d F%d:%d\n", h->video.width, h->video.height, frame_rate_mul, frame_rate_div); break; } write(h->fd, header, strlen(header)); } } return h; }
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; }