コード例 #1
0
ファイル: compress_offload.c プロジェクト: jiangchao87/m8uhl
static unsigned int snd_compr_poll(struct file *f, poll_table *wait)
{
	struct snd_compr_file *data = f->private_data;
	struct snd_compr_stream *stream;
	size_t avail;
	int retval = 0;

	if (snd_BUG_ON(!data))
		return -EFAULT;
	stream = &data->stream;
	if (snd_BUG_ON(!stream))
		return -EFAULT;

	mutex_lock(&stream->device->lock);
	if (stream->runtime->state == SNDRV_PCM_STATE_PAUSED ||
			stream->runtime->state == SNDRV_PCM_STATE_OPEN) {
		retval = -EBADFD;
		goto out;
	}
	poll_wait(f, &stream->runtime->sleep, wait);

	avail = snd_compr_get_avail(stream);
	pr_debug("avail is %ld\n", (unsigned long)avail);
	/* check if we have at least one fragment to fill */
	switch (stream->runtime->state) {
	case SNDRV_PCM_STATE_DRAINING:
		/* stream has been woken up after drain is complete
		 * draining done so set stream state to stopped
		 */
		retval = snd_compr_get_poll(stream);
		stream->runtime->state = SNDRV_PCM_STATE_SETUP;
		break;
	case SNDRV_PCM_STATE_RUNNING:
	case SNDRV_PCM_STATE_PREPARED:
	case SNDRV_PCM_STATE_PAUSED:
//htc audio ++
		if (avail >= stream->runtime->fragment_size && (avail % stream->runtime->fragment_size == 0))
//htc audio --
			retval = snd_compr_get_poll(stream);
		break;
	default:
		if (stream->direction == SND_COMPRESS_PLAYBACK)
			retval = POLLOUT | POLLWRNORM | POLLERR;
		else
			retval = POLLIN | POLLRDNORM | POLLERR;
		break;
	}
out:
	mutex_unlock(&stream->device->lock);
	return retval;
}
コード例 #2
0
ファイル: compress_offload.c プロジェクト: krzk/linux
static __poll_t snd_compr_poll(struct file *f, poll_table *wait)
{
	struct snd_compr_file *data = f->private_data;
	struct snd_compr_stream *stream;
	size_t avail;
	__poll_t retval = 0;

	if (snd_BUG_ON(!data))
		return EPOLLERR;

	stream = &data->stream;

	mutex_lock(&stream->device->lock);

	switch (stream->runtime->state) {
	case SNDRV_PCM_STATE_OPEN:
	case SNDRV_PCM_STATE_XRUN:
		retval = snd_compr_get_poll(stream) | EPOLLERR;
		goto out;
	default:
		break;
	}

	poll_wait(f, &stream->runtime->sleep, wait);

	avail = snd_compr_get_avail(stream);
	pr_debug("avail is %ld\n", (unsigned long)avail);
	/* check if we have at least one fragment to fill */
	switch (stream->runtime->state) {
	case SNDRV_PCM_STATE_DRAINING:
		/* stream has been woken up after drain is complete
		 * draining done so set stream state to stopped
		 */
		retval = snd_compr_get_poll(stream);
		stream->runtime->state = SNDRV_PCM_STATE_SETUP;
		break;
	case SNDRV_PCM_STATE_RUNNING:
	case SNDRV_PCM_STATE_PREPARED:
	case SNDRV_PCM_STATE_PAUSED:
		if (avail >= stream->runtime->fragment_size)
			retval = snd_compr_get_poll(stream);
		break;
	default:
		retval = snd_compr_get_poll(stream) | EPOLLERR;
		break;
	}
out:
	mutex_unlock(&stream->device->lock);
	return retval;
}
コード例 #3
0
static unsigned int snd_compr_poll(struct file *f, poll_table *wait)
{
    struct snd_compr_file *data = f->private_data;
    struct snd_compr_stream *stream;
    size_t avail;
    int retval = 0;

    if (snd_BUG_ON(!data))
        return -EFAULT;
    stream = &data->stream;
    if (snd_BUG_ON(!stream))
        return -EFAULT;

    mutex_lock(&stream->device->lock);
    if (stream->runtime->state == SNDRV_PCM_STATE_PAUSED ||
            stream->runtime->state == SNDRV_PCM_STATE_OPEN) {
        retval = -EBADFD;
        goto out;
    }
    poll_wait(f, &stream->runtime->sleep, wait);

    avail = snd_compr_get_avail(stream);
    pr_debug("avail is %ld\n", (unsigned long)avail);

    switch (stream->runtime->state) {
    case SNDRV_PCM_STATE_DRAINING:
        retval = snd_compr_get_poll(stream);
        stream->runtime->state = SNDRV_PCM_STATE_SETUP;
        break;
    case SNDRV_PCM_STATE_RUNNING:
    case SNDRV_PCM_STATE_PREPARED:
    case SNDRV_PCM_STATE_PAUSED:
        if (avail >= stream->runtime->fragment_size && (avail % stream->runtime->fragment_size == 0))
            retval = snd_compr_get_poll(stream);
        break;
    default:
        if (stream->direction == SND_COMPRESS_PLAYBACK)
            retval = POLLOUT | POLLWRNORM | POLLERR;
        else
            retval = POLLIN | POLLRDNORM | POLLERR;
        break;
    }
out:
    mutex_unlock(&stream->device->lock);
    return retval;
}