Hi all, I'm trying to build a full-duplex app using alsa, but I'm having some problems with getting buffsersizes and timing right. I can't get a simple record-and-playback app working right without underruns occuring.
I hope some experienced alsa programmers can take a quick look at my attached piece of code and tell me what I need to do to get this working right. (or am I just doing things *really* wrong here ?) Hope to get some helpfull tips, Ico os : linx 2.4.20 alsa version: 0.9.4 soundcard: intel810 ----------------------------------------------------------------------------- #include <stdio.h> #include <sys/time.h> #include <time.h> #include <sys/select.h> #define ALSA_PCM_NEW_HW_PARAMS_API #define ALSA_PCM_NEW_SW_PARAMS_API #include <alsa/asoundlib.h> #include <math.h> #define PERIODSIZE 512 #define BUFSIZE (PERIODSIZE*4) char *device = "hw:0,0"; int samplerate = 16000; int channels = 2; int accessmode = SND_PCM_ACCESS_RW_INTERLEAVED; int format = SND_PCM_FORMAT_S16_LE; int periods = 4; snd_pcm_uframes_t buffer_size = PERIODSIZE * 4; snd_pcm_uframes_t period_size = PERIODSIZE; snd_output_t *output = NULL; #define checkr(r) if(r<0) { \ fprintf(stderr, "line %d: %s\n", __LINE__, snd_strerror(r)); \ exit(-1); \ } int set_hw_params(snd_pcm_t *handle, int play) { int r; snd_pcm_hw_params_t *hwparams; snd_pcm_sw_params_t *swparams; r = snd_pcm_hw_params_malloc(&hwparams); checkr(r); r = snd_pcm_hw_params_any(handle, hwparams); checkr(r); r = snd_pcm_hw_params_set_access(handle, hwparams, accessmode); checkr(r); r = snd_pcm_hw_params_set_format(handle, hwparams, format); checkr(r); r = snd_pcm_hw_params_set_channels(handle, hwparams, channels); checkr(r); r = snd_pcm_hw_params_set_rate_near(handle, hwparams, &samplerate, 0); checkr(r); r = snd_pcm_hw_params_set_periods(handle, hwparams, periods, 0); checkr(r); r = snd_pcm_hw_params_set_buffer_size_near(handle, hwparams, &buffer_size); checkr(r); r = snd_pcm_hw_params_set_period_size_near(handle, hwparams, &period_size, 0); checkr(r); r = snd_pcm_hw_params(handle, hwparams); checkr(r); snd_pcm_hw_params_free (hwparams); r = snd_pcm_sw_params_malloc(&swparams); checkr(r); r = snd_pcm_sw_params_current(handle, swparams); checkr(r); r = snd_pcm_sw_params_set_avail_min(handle, swparams, period_size); checkr(r); r = snd_pcm_sw_params(handle, swparams); checkr(r); snd_pcm_sw_params_free(swparams); snd_pcm_prepare(handle); return(0); } int main(int argc, char **argv) { short buf[BUFSIZE*10]; int r; snd_pcm_t *pcmr; snd_pcm_t *pcmp; r = snd_pcm_open(&pcmr, device, SND_PCM_STREAM_CAPTURE, 0); checkr(r); set_hw_params(pcmr, 1); r = snd_pcm_open(&pcmp, device, SND_PCM_STREAM_PLAYBACK, 0); checkr(r); set_hw_params(pcmp, 1); while(1) { r = snd_pcm_readi(pcmr, buf, BUFSIZE); if(r != BUFSIZE) printf("rec r=%d\n", r); checkr(r); r = snd_pcm_writei(pcmp, buf, BUFSIZE); if(r != BUFSIZE) printf("play r=%d\n", r); if(r == -EPIPE) { snd_pcm_prepare(pcmp); } else { checkr(r); } } return(0); } -- ------------------------------------------------------- This SF.Net email is sponsored by: INetU Attention Web Developers & Consultants: Become An INetU Hosting Partner. Refer Dedicated Servers. We Manage Them. You Get 10% Monthly Commission! INetU Dedicated Managed Hosting http://www.inetu.net/partner/index.php _______________________________________________ Alsa-devel mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-devel