snd_pcm_sframes_t consumed_count;
int err;
- // Wait for hardware IRQ when no avail space in buffer.
- err = snd_pcm_wait(state->handle, -1);
- if (err < 0)
- return err;
+ if (state->use_waiter) {
+ // Wait for hardware IRQ when no avail space in buffer.
+ err = snd_pcm_wait(state->handle, -1);
+ if (err < 0)
+ return err;
+ }
// Sync cache in user space to data in kernel space to calculate avail
// frames according to the latest positions on PCM buffer.
goto error;
}
- // Wait for hardware IRQ when no available space.
- err = snd_pcm_wait(state->handle, -1);
- if (err < 0)
- goto error;
+ if (state->use_waiter) {
+ // Wait for hardware IRQ when no available space.
+ err = snd_pcm_wait(state->handle, -1);
+ if (err < 0)
+ goto error;
+ }
// Check available space on the buffer.
avail = snd_pcm_avail(state->handle);
unsigned int avail_count;
int err;
- // Wait for hardware IRQ when no left space.
- err = snd_pcm_wait(state->handle, -1);
- if (err < 0)
- goto error;
+ if (state->use_waiter) {
+ // Wait for hardware IRQ when no left space.
+ err = snd_pcm_wait(state->handle, -1);
+ if (err < 0)
+ goto error;
+ }
// Check available space on the buffer.
avail = snd_pcm_avail(state->handle);
enum no_short_opts {
// 200 or later belong to non us-ascii character set.
OPT_FATAL_ERRORS = 200,
+ OPT_TEST_NOWAIT,
};
#define S_OPTS "D:NM"
{"mmap", 0, 0, 'M'},
// For debugging.
{"fatal-errors", 0, 0, OPT_FATAL_ERRORS},
+ {"test-nowait", 0, 0, OPT_TEST_NOWAIT},
};
static int xfer_libasound_init(struct xfer_context *xfer,
state->mmap = true;
else if (key == OPT_FATAL_ERRORS)
state->finish_at_xrun = true;
+ else if (key == OPT_TEST_NOWAIT)
+ state->test_nowait = true;
else
err = -ENXIO;
return -EINVAL;
}
+ if (state->test_nowait) {
+ if (!state->nonblock && !state->mmap) {
+ fprintf(stderr,
+ "An option for nowait test should be used with "
+ "nonblock or mmap options.\n");
+ return -EINVAL;
+ }
+ }
+
return err;
}
return err;
}
+ if ((state->nonblock || state->mmap) && !state->test_nowait)
+ state->use_waiter = true;
+
err = snd_pcm_hw_params_any(state->handle, state->hw_params);
if (err < 0)
return err;
bool finish_at_xrun:1;
bool nonblock:1;
bool mmap:1;
+ bool test_nowait:1;
+
+ bool use_waiter:1;
};
// For internal use in 'libasound' module.