From 42b8b94ff434b19010dfe8c2d04922e22c43aae2 Mon Sep 17 00:00:00 2001 From: "N.N." Date: Mon, 25 May 2009 05:02:35 +0000 Subject: reformat svn path=/trunk/; revision=11488 --- desiredata/src/s_audio_alsamm.c | 185 ++++++++++++++-------------------------- 1 file changed, 62 insertions(+), 123 deletions(-) (limited to 'desiredata/src/s_audio_alsamm.c') diff --git a/desiredata/src/s_audio_alsamm.c b/desiredata/src/s_audio_alsamm.c index a0a2d101..06205214 100644 --- a/desiredata/src/s_audio_alsamm.c +++ b/desiredata/src/s_audio_alsamm.c @@ -54,17 +54,10 @@ #define CLIP32(x) (((x)>F32MAX)?F32MAX:((x) < -F32MAX)?-F32MAX:(x)) #define ALSAMM_FORMAT SND_PCM_FORMAT_S32 -/* - maximum of 4 devices - you can mix rme9632,hdsp9632 (18 chans) rme9652,hdsp9652 (26 chans), dsp-madi (64 chans) - if synced -*/ +/* maximum of 4 devices. you can mix rme9632,hdsp9632 (18 chans) rme9652,hdsp9652 (26 chans), dsp-madi (64 chans) if synced */ -/* - we need same samplerate, buffertime and so on for - each card soo we use global vars... - time is in us, size in frames (i hope so ;-) -*/ +/* we need same samplerate, buffertime and so on for each card soo we use global vars... + time is in us, size in frames (i hope so ;-) */ static unsigned int alsamm_sr = 0; static unsigned int alsamm_buffertime = 0; static unsigned int alsamm_buffersize = 0; @@ -178,9 +171,8 @@ int alsamm_open_audio(int rate) { sys_schedadvance,sys_advance_samples,alsamm_buffertime, sys_blocksize,alsamm_buffersize); alsamm_periods = 0; /* no one wants periods setting from command line ;-) */ - for (i=0;i maxchs)channels = maxchs; - if(channels < minchs)channels = minchs; + if(channels<0) channels=maxchs; + if(channels>maxchs) channels = maxchs; + if(channels 0 && avail != NULL && offset != NULL) { - if ((err = snd_pcm_mmap_begin(dev, &mm_areas, offset, avail)) < 0) { - check_error(err,"setmems: begin_mmap failure ???"); - return err; - } - for (int chn = 0; chn < nchns; chn++) { + if (nchns>0 && avail && offset) { + err = snd_pcm_mmap_begin(dev, &mm_areas, offset, avail); + if (err<0) {check_error(err,"setmems: begin_mmap failure ???"); return err;} + for (int chn=0; chnaddr + ((a->first + a->step * *offset) / 8); } @@ -421,16 +407,13 @@ static int alsamm_get_channels(snd_pcm_t *dev, snd_pcm_uframes_t *avail, snd_pcm static void alsamm_start() { int err = 0; - int chn; /* first prepare for in/out */ for (int devno=0; devnoa_handle)) < 0) { - check_error(err,"outcard prepare error for playback"); - return; - } + err = snd_pcm_prepare(dev->a_handle); + if (err<0) {check_error(err,"outcard prepare error for playback"); return;} offset = 0; avail = snd_pcm_avail_update(dev->a_handle); if (avail != (snd_pcm_uframes_t) alsamm_buffer_size) { @@ -440,12 +423,9 @@ static void alsamm_start() { if(debug&&sys_verbose) post("start: set mems for avail=%d,offset=%d at buffersize=%d",avail,offset,alsamm_buffer_size); if(avail > 0) { int comitted = 0; - if ((err = alsamm_get_channels(dev->a_handle, &avail, &offset, dev->a_channels,dev->a_addr)) < 0) { - check_error(err,"setting initial out channelspointer failure ?"); - continue; - } - for (chn = 0; chn < dev->a_channels; chn++) - memset(dev->a_addr[chn],0,avail*ALSAMM_SAMPLEWIDTH_32); + err = alsamm_get_channels(dev->a_handle, &avail, &offset, dev->a_channels,dev->a_addr); + if (err<0) {check_error(err,"setting initial out channelspointer failure ?"); continue;} + for (int chn=0; chna_channels; chn++) memset(dev->a_addr[chn],0,avail*ALSAMM_SAMPLEWIDTH_32); comitted = snd_pcm_mmap_commit (dev->a_handle, offset, avail); avail = snd_pcm_avail_update(dev->a_handle); if(debug&&sys_verbose) post("start: now channels cleared, out with avail=%d, offset=%d,comitted=%d",avail,offset,comitted); @@ -454,20 +434,16 @@ static void alsamm_start() { avail = snd_pcm_avail_update(dev->a_handle); if(debug&&sys_verbose) post("start: finish start, out with avail=%d, offset=%d",avail,offset); /* we have no autostart so anyway start*/ - if ((err = snd_pcm_start (dev->a_handle)) < 0) { - check_error(err,"could not start playback"); - } + err = snd_pcm_start (dev->a_handle); + if (err<0) check_error(err,"could not start playback"); } - for (int devno = 0;devno < alsa_nindev;devno++) { + for (int devno=0; devnoa_synced == 0) { - if ((err = snd_pcm_prepare (dev->a_handle)) < 0) { - check_error(err,"incard prepare error for capture"); - /* return err;*/ - } + /* if devices are synced then don't need to prepare; hopefully dma in aereas allready filled correct by the card */ + if (dev->a_synced == 0) { + err = snd_pcm_prepare (dev->a_handle); + if (err<0) {check_error(err,"incard prepare error for capture"); /* return err;*/} } ioffset = 0; iavail = snd_pcm_avail_update (dev->a_handle); @@ -475,10 +451,8 @@ static void alsamm_start() { if (debug) post("start in: set in mems for avail=%d,offset=%d at buffersize=%d",iavail,ioffset,alsamm_buffer_size); if (iavail > (snd_pcm_uframes_t) 0) { if (debug) post("empty buffer not available at start, since avail %d != %d buffersize", iavail, alsamm_buffer_size); - if ((err = alsamm_get_channels(dev->a_handle, &iavail, &ioffset, dev->a_channels,dev->a_addr)) < 0) { - check_error(err,"getting in channelspointer failure ????"); - continue; - } + err = alsamm_get_channels(dev->a_handle, &iavail, &ioffset, dev->a_channels,dev->a_addr); + if (err<0) {check_error(err,"getting in channelspointer failure ????"); continue;} snd_pcm_mmap_commit (dev->a_handle, ioffset, iavail); iavail = snd_pcm_avail_update (dev->a_handle); if (debug) post("start in now avail=%d",iavail); @@ -487,22 +461,18 @@ static void alsamm_start() { /* if devices are synced then dont need to start */ /* start with autostart , but anyway start */ if(dev->a_synced == 0) { - if ((err = snd_pcm_start (dev->a_handle)) < 0) { - check_error(err,"could not start capture"); - continue; - } + err = snd_pcm_start (dev->a_handle); + if (err<0) {check_error(err,"could not start capture"); continue;} } } } static void alsamm_stop() { - /* first stop in... */ for (int devno=0; devnoa_handle)); } - /* then outs */ for (int devno=0; devno 0) { - int chn; snd_pcm_sframes_t oframes; oframes = size; err = alsamm_get_channels(out, (unsigned long *)&oframes, (unsigned long *)&ooffset,ochannels,dev->a_addr); @@ -620,14 +575,12 @@ int alsamm_send_dacs() { out_offset[dac_send] = ooffset; outaddr[dac_send] = (char *) dev->a_addr[0]; } - if (err < 0) { - if ((err = xrun_recovery(out, err)) < 0) { - check_error(err,"MMAP begins avail error"); - break; /* next card please */ - } + if (err<0) { + err = xrun_recovery(out, err); + if (err<0) {check_error(err,"MMAP begins avail error"); break; /* next card please */} } /* transfer into memory */ - for (chn = 0; chn < ochannels; chn++) { + for (int chn=0; chna_addr[chn]; /* osc(buf, oframes, (dac_send%1000 < 500)?-100.0:-10.0,440,&(indexes[chn])); */ for (i = 0, fp2 = fp1 + chn*sys_dacblocksize; i < oframes; i++,fp2++) { @@ -667,17 +620,11 @@ int alsamm_send_dacs() { state = snd_pcm_state(in); if (state == SND_PCM_STATE_XRUN) { err = xrun_recovery(in, -EPIPE); - if (err < 0) { - check_error(err,"ADC XRUN recovery failed"); - return SENDDACS_NO; - } + if (err<0) {check_error(err,"ADC XRUN recovery failed"); return SENDDACS_NO;} iavail=snd_pcm_avail_update(in); } else if (state == SND_PCM_STATE_SUSPENDED) { err = xrun_recovery(in, -ESTRPIPE); - if (err < 0) { - check_error(err,"ADC SUSPEND recovery failed"); - return SENDDACS_NO; - } + if (err < 0) {check_error(err,"ADC SUSPEND recovery failed"); return SENDDACS_NO;} iavail=snd_pcm_avail_update(in); } /* only transfer full transfersize or nothing */ @@ -689,14 +636,11 @@ int alsamm_send_dacs() { transfer (normally when buffersize is a multiple of transfersize this should never happen) */ while(size > 0) { - int chn; snd_pcm_sframes_t iframes = size; - err = alsamm_get_channels(in, (unsigned long *)&iframes, (unsigned long *)&ioffset,ichannels,dev->a_addr); - if (err < 0) { - if ((err = xrun_recovery(in, err)) < 0) { - check_error(err,"MMAP begins avail error"); - return SENDDACS_NO; - } + err = alsamm_get_channels(in, (unsigned long *)&iframes, (unsigned long *)&ioffset,ichannels,dev->a_addr); + if (err<0) { + err = xrun_recovery(in, err); + if (err<0) {check_error(err,"MMAP begins avail error"); return SENDDACS_NO;} } if(debug && dac_send < WATCH_PERIODS) { in_avail[dac_send] = iavail; @@ -704,21 +648,18 @@ int alsamm_send_dacs() { inaddr[dac_send] = dev->a_addr[0]; } /* transfer into memory */ - for (chn = 0; chn < ichannels; chn++) { + for (int chn=0; chna_addr[chn]; for (i = 0, fp2 = fp1 + chn*sys_dacblocksize; i < iframes; i++,fp2++) { /* mask the lowest bits, since subchannels info can make zero samples nonzero */ - *fp2 = (float) ((t_alsa_sample32) (buf[i] & 0xFFFFFF00)) - * (1.0 / (float) INT32_MAX); + *fp2 = (float) (t_alsa_sample32(buf[i] & 0xFFFFFF00)) * (1.0 / float(INT32_MAX)); } } commitres = snd_pcm_mmap_commit(in, ioffset, iframes); if (commitres < 0 || commitres != iframes) { post("please never"); - if ((err = xrun_recovery(in, commitres >= 0 ? -EPIPE : commitres)) < 0) { - check_error(err,"MMAP synced in commit error"); - return SENDDACS_NO; - } + err = xrun_recovery(in, commitres >= 0 ? -EPIPE : commitres); + if (err<0) {check_error(err,"MMAP synced in commit error"); return SENDDACS_NO;} } fp1 += iframes; size -= iframes; @@ -738,9 +679,7 @@ void alsamm_showstat(snd_pcm_t *handle) { int err; snd_pcm_status_t *status; snd_pcm_status_alloca(&status); - if ((err = snd_pcm_status(handle, status)) < 0) { - check_error(err, "Get Stream status error"); - return; - } + err = snd_pcm_status(handle, status); + if (err<0) {check_error(err,"Get Stream status error"); return;} snd_pcm_status_dump(status, alsa_stdout); } -- cgit v1.2.1