goto _end_unlock; case DROPPED: err = -EBADFD; 
static snd_pcm_sframes_t snd_pcm_lib_read1(snd_pcm_substream_t *substream,					   unsigned long data,					   snd_pcm_uframes_t size,					   int nonblock,					   transfer_f transfer){	snd_pcm_runtime_t *runtime = substream->runtime;	snd_pcm_uframes_t xfer = 0;	snd_pcm_uframes_t offset = 0;	int err = 0;	if (size == 0)		return 0;	if (size > runtime->xfer_align)		size -= size % runtime->xfer_align;	snd_pcm_stream_lock_irq(substream);	switch (runtime->status->state) {	case SNDRV_PCM_STATE_PREPARED:		if (size >= runtime->start_threshold) {			err = snd_pcm_start(substream);			if (err < 0)				goto _end_unlock;		}		break;	case SNDRV_PCM_STATE_DRAINING:	case SNDRV_PCM_STATE_RUNNING:	case SNDRV_PCM_STATE_PAUSED:		break;	case SNDRV_PCM_STATE_XRUN:		err = -EPIPE;		goto _end_unlock;	case SNDRV_PCM_STATE_SUSPENDED:		err = -ESTRPIPE;		goto _end_unlock;	default:		err = -EBADFD;		goto _end_unlock;	}	while (size > 0) {		snd_pcm_uframes_t frames, appl_ptr, appl_ofs;		snd_pcm_uframes_t avail;		snd_pcm_uframes_t cont;		if (runtime->sleep_min == 0 && runtime->status->state == SNDRV_PCM_STATE_RUNNING)			snd_pcm_update_hw_ptr(substream);	      __draining:		avail = snd_pcm_capture_avail(runtime);		if (runtime->status->state == SNDRV_PCM_STATE_DRAINING) {			if (avail < runtime->xfer_align) {				err = -EPIPE;				goto _end_unlock;			}		} else if ((avail < runtime->control->avail_min && size > avail) ||			   (size >= runtime->xfer_align && avail < runtime->xfer_align)) {			wait_queue_t wait;			enum { READY, SIGNALED, ERROR, SUSPENDED, EXPIRED } state;			long tout;			if (nonblock) {				err = -EAGAIN;				goto _end_unlock;			}			init_waitqueue_entry(&wait, current);			add_wait_queue(&runtime->sleep, &wait);			while (1) {				if (signal_pending(current)) {					state = SIGNALED;					break;				}				set_current_state(TASK_INTERRUPTIBLE);				snd_pcm_stream_unlock_irq(substream);				tout = schedule_timeout(10 * HZ);				snd_pcm_stream_lock_irq(substream);				if (tout == 0) {					if (runtime->status->state != SNDRV_PCM_STATE_PREPARED &&					    runtime->status->state != SNDRV_PCM_STATE_PAUSED) {						state = runtime->status->state == SNDRV_PCM_STATE_SUSPENDED ? SUSPENDED : EXPIRED;						break;					}				}				switch (runtime->status->state) {				case SNDRV_PCM_STATE_XRUN:					state = ERROR;					goto _end_loop;				case SNDRV_PCM_STATE_SUSPENDED:					state = SUSPENDED;					goto _end_loop;				case SNDRV_PCM_STATE_DRAINING:					goto __draining;				default:					break;				}				avail = snd_pcm_capture_avail(runtime);				if (avail >= runtime->control->avail_min) {					state = READY;					break;				}			}		       _end_loop:			remove_wait_queue(&runtime->sleep, &wait);			switch (state) {			case ERROR:				err = -EPIPE;				goto _end_unlock;			case SUSPENDED:				err = -ESTRPIPE;				goto _end_unlock;			case SIGNALED:				err = -ERESTARTSYS;				goto _end_unlock;			case EXPIRED:				snd_printd("capture read error (DMA or IRQ trouble?)\n");				err = -EIO;				goto _end_unlock;			default:				break;			}		}		if (avail > runtime->xfer_align)			avail -= avail % runtime->xfer_align;		frames = size > avail ? avail : size;		cont = runtime->buffer_size - runtime->control->appl_ptr % runtime->buffer_size;		if (frames > cont)			frames = cont;		snd_assert(frames != 0, snd_pcm_stream_unlock_irq(substream); return -EINVAL);		appl_ptr = runtime->control->appl_ptr;		appl_ofs = appl_ptr % runtime->buffer_size;		snd_pcm_stream_unlock_irq(substream);		if ((err = transfer(substream, appl_ofs, data, offset, frames)) < 0)			goto _end;		snd_pcm_stream_lock_irq(substream);		switch (runtime->status->state) {		case SNDRV_PCM_STATE_XRUN:			err = -EPIPE;			goto _end_unlock;		case SNDRV_PCM_STATE_SUSPENDED:			err = -ESTRPIPE;			goto _end_unlock;		default:			break;		}		appl_ptr += frames;		if (appl_ptr >= runtime->boundary)			appl_ptr -= runtime->boundary;		runtime->control->appl_ptr = appl_ptr;		if (substream->ops->ack)			substream->ops->ack(substream);		offset += frames;		size -= frames;		xfer += frames;		if (runtime->sleep_min &&		    runtime->status->state == SNDRV_PCM_STATE_RUNNING)			snd_pcm_tick_prepare(substream);	} _end_unlock:	snd_pcm_stream_unlock_irq(substream); _end:	return xfer > 0 ? (snd_pcm_sframes_t)xfer : err;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/443feb882679e21ba5d1e0ff9eff067ac26d9461/pcm_lib.c/clean/sound/core/pcm_lib.c