mirror of
https://github.com/alsa-project/alsa-utils
synced 2024-09-20 01:59:57 +02:00
PCM API cleaning. silencing implementation. xfer_min removal
This commit is contained in:
parent
38fd1dc722
commit
924fa1704a
1 changed files with 46 additions and 52 deletions
|
@ -81,7 +81,6 @@ static int buffer_size = -1;
|
||||||
static int frag_length = 125000;
|
static int frag_length = 125000;
|
||||||
static int buffer_length = 500000;
|
static int buffer_length = 500000;
|
||||||
static int avail_min = 50000;
|
static int avail_min = 50000;
|
||||||
static int xfer_min = 50000;
|
|
||||||
static int verbose = 0;
|
static int verbose = 0;
|
||||||
static int buffer_pos = 0;
|
static int buffer_pos = 0;
|
||||||
static size_t bits_per_sample, bits_per_frame;
|
static size_t bits_per_sample, bits_per_frame;
|
||||||
|
@ -393,9 +392,6 @@ int main(int argc, char *argv[])
|
||||||
case 'A':
|
case 'A':
|
||||||
avail_min = atoi(optarg);
|
avail_min = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
case 'X':
|
|
||||||
xfer_min = atoi(optarg);
|
|
||||||
break;
|
|
||||||
case 'v':
|
case 'v':
|
||||||
verbose = 1;
|
verbose = 1;
|
||||||
break;
|
break;
|
||||||
|
@ -717,6 +713,7 @@ static void set_params(void)
|
||||||
snd_pcm_sw_params_t swparams;
|
snd_pcm_sw_params_t swparams;
|
||||||
size_t bufsize;
|
size_t bufsize;
|
||||||
int err;
|
int err;
|
||||||
|
size_t n;
|
||||||
err = snd_pcm_hw_params_any(handle, ¶ms);
|
err = snd_pcm_hw_params_any(handle, ¶ms);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
error("Broken configuration for this PCM: no configurations available");
|
error("Broken configuration for this PCM: no configurations available");
|
||||||
|
@ -727,79 +724,77 @@ static void set_params(void)
|
||||||
mask_set(mask, SND_PCM_ACCESS_MMAP_INTERLEAVED);
|
mask_set(mask, SND_PCM_ACCESS_MMAP_INTERLEAVED);
|
||||||
mask_set(mask, SND_PCM_ACCESS_MMAP_NONINTERLEAVED);
|
mask_set(mask, SND_PCM_ACCESS_MMAP_NONINTERLEAVED);
|
||||||
mask_set(mask, SND_PCM_ACCESS_MMAP_COMPLEX);
|
mask_set(mask, SND_PCM_ACCESS_MMAP_COMPLEX);
|
||||||
err = snd_pcm_hw_params_mask(handle, ¶ms,
|
err = snd_pcm_hw_param_mask(handle, ¶ms,
|
||||||
SND_PCM_HW_PARAM_ACCESS, mask);
|
SND_PCM_HW_PARAM_ACCESS, mask);
|
||||||
} else if (interleaved)
|
} else if (interleaved)
|
||||||
err = snd_pcm_hw_params_set(handle, ¶ms,
|
err = snd_pcm_hw_param_set(handle, ¶ms,
|
||||||
SND_PCM_HW_PARAM_ACCESS,
|
SND_PCM_HW_PARAM_ACCESS,
|
||||||
SND_PCM_ACCESS_RW_INTERLEAVED);
|
SND_PCM_ACCESS_RW_INTERLEAVED);
|
||||||
else
|
else
|
||||||
err = snd_pcm_hw_params_set(handle, ¶ms,
|
err = snd_pcm_hw_param_set(handle, ¶ms,
|
||||||
SND_PCM_HW_PARAM_ACCESS,
|
SND_PCM_HW_PARAM_ACCESS,
|
||||||
SND_PCM_ACCESS_RW_NONINTERLEAVED);
|
SND_PCM_ACCESS_RW_NONINTERLEAVED);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
error("Access type not available");
|
error("Access type not available");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
err = snd_pcm_hw_params_set(handle, ¶ms, SND_PCM_HW_PARAM_FORMAT,
|
err = snd_pcm_hw_param_set(handle, ¶ms, SND_PCM_HW_PARAM_FORMAT,
|
||||||
hwparams.format);
|
hwparams.format);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
error("Sample format non available");
|
error("Sample format non available");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
err = snd_pcm_hw_params_set(handle, ¶ms, SND_PCM_HW_PARAM_CHANNELS,
|
err = snd_pcm_hw_param_set(handle, ¶ms, SND_PCM_HW_PARAM_CHANNELS,
|
||||||
hwparams.channels);
|
hwparams.channels);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
error("Channels count non available");
|
error("Channels count non available");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
err = snd_pcm_hw_params_min(handle, ¶ms,
|
err = snd_pcm_hw_param_min(handle, ¶ms,
|
||||||
SND_PCM_HW_PARAM_FRAGMENTS, 2);
|
SND_PCM_HW_PARAM_FRAGMENTS, 2);
|
||||||
assert(err >= 0);
|
assert(err >= 0);
|
||||||
err = snd_pcm_hw_params_near(handle, ¶ms,
|
err = snd_pcm_hw_param_near(handle, ¶ms,
|
||||||
SND_PCM_HW_PARAM_RATE, hwparams.rate);
|
SND_PCM_HW_PARAM_RATE, hwparams.rate);
|
||||||
assert(err >= 0);
|
assert(err >= 0);
|
||||||
err = snd_pcm_hw_params_near(handle, ¶ms,
|
err = snd_pcm_hw_param_near(handle, ¶ms,
|
||||||
SND_PCM_HW_PARAM_FRAGMENT_LENGTH,
|
SND_PCM_HW_PARAM_FRAGMENT_LENGTH,
|
||||||
frag_length);
|
frag_length);
|
||||||
assert(err >= 0);
|
assert(err >= 0);
|
||||||
err = snd_pcm_hw_params_near(handle, ¶ms,
|
err = snd_pcm_hw_param_near(handle, ¶ms,
|
||||||
SND_PCM_HW_PARAM_BUFFER_LENGTH,
|
SND_PCM_HW_PARAM_BUFFER_LENGTH,
|
||||||
buffer_length);
|
buffer_length);
|
||||||
assert(err >= 0);
|
assert(err >= 0);
|
||||||
err = snd_pcm_hw_params(handle, ¶ms);
|
err = snd_pcm_hw_params(handle, ¶ms);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
fprintf(stderr, "Unable to install params:\n");
|
fprintf(stderr, "Unable to install hw params:\n");
|
||||||
snd_pcm_dump_hw_params(¶ms, stderr);
|
snd_pcm_hw_params_dump(¶ms, stderr);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
bufsize = snd_pcm_hw_params_value(¶ms, SND_PCM_HW_PARAM_FRAGMENT_SIZE) *
|
buffer_size = snd_pcm_hw_param_value(¶ms, SND_PCM_HW_PARAM_FRAGMENT_SIZE);
|
||||||
snd_pcm_hw_params_value(¶ms, SND_PCM_HW_PARAM_FRAGMENTS);
|
bufsize = buffer_size * snd_pcm_hw_param_value(¶ms, SND_PCM_HW_PARAM_FRAGMENTS);
|
||||||
|
|
||||||
swparams.start_mode = SND_PCM_START_DATA;
|
snd_pcm_sw_params_current(handle, &swparams);
|
||||||
swparams.ready_mode = ready_mode;
|
err = snd_pcm_sw_param_set(handle, &swparams,
|
||||||
swparams.xrun_mode = xrun_mode;
|
SND_PCM_SW_PARAM_READY_MODE, ready_mode);
|
||||||
swparams.avail_min = snd_pcm_hw_params_value(¶ms, SND_PCM_HW_PARAM_RATE) * avail_min / 1000000;
|
assert(err >= 0);
|
||||||
swparams.xfer_min = snd_pcm_hw_params_value(¶ms, SND_PCM_HW_PARAM_RATE) * xfer_min / 1000000;
|
err = snd_pcm_sw_param_set(handle, &swparams,
|
||||||
if (xrun_mode == SND_PCM_XRUN_FRAGMENT)
|
SND_PCM_SW_PARAM_XRUN_MODE, xrun_mode);
|
||||||
swparams.xfer_align = snd_pcm_hw_params_value(¶ms, SND_PCM_HW_PARAM_FRAGMENT_SIZE);
|
assert(err >= 0);
|
||||||
else
|
n = snd_pcm_hw_param_value(¶ms, SND_PCM_HW_PARAM_RATE) * avail_min / 1000000;
|
||||||
swparams.xfer_align = 1;
|
if (n > bufsize - buffer_size)
|
||||||
swparams.xfer_min -= swparams.xfer_min % swparams.xfer_align;
|
n = bufsize - buffer_size;
|
||||||
swparams.avail_min -= swparams.avail_min % swparams.xfer_align;
|
err = snd_pcm_sw_param_near(handle, &swparams,
|
||||||
if (swparams.xfer_min == 0)
|
SND_PCM_SW_PARAM_AVAIL_MIN, n);
|
||||||
swparams.xfer_min = swparams.xfer_align;
|
|
||||||
else if (swparams.xfer_min >= bufsize)
|
if (xrun_mode == SND_PCM_XRUN_ASAP) {
|
||||||
swparams.xfer_min = bufsize - swparams.xfer_align;
|
err = snd_pcm_sw_param_near(handle, &swparams,
|
||||||
if (swparams.avail_min == 0)
|
SND_PCM_SW_PARAM_XFER_ALIGN, 1);
|
||||||
swparams.avail_min = swparams.xfer_align;
|
assert(err >= 0);
|
||||||
else if (swparams.avail_min >= bufsize)
|
}
|
||||||
swparams.avail_min = bufsize - swparams.xfer_align;
|
|
||||||
swparams.time = 0;
|
|
||||||
if (snd_pcm_sw_params(handle, &swparams) < 0) {
|
if (snd_pcm_sw_params(handle, &swparams) < 0) {
|
||||||
snd_pcm_dump_sw_params_fail(&swparams, stderr);
|
error("unable to install sw params:");
|
||||||
error("unable to set sw params");
|
snd_pcm_sw_params_dump(&swparams, stderr);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
if (snd_pcm_prepare(handle) < 0) {
|
if (snd_pcm_prepare(handle) < 0) {
|
||||||
|
@ -810,7 +805,6 @@ static void set_params(void)
|
||||||
if (verbose)
|
if (verbose)
|
||||||
snd_pcm_dump(handle, stderr);
|
snd_pcm_dump(handle, stderr);
|
||||||
|
|
||||||
buffer_size = snd_pcm_hw_params_value(¶ms, SND_PCM_HW_PARAM_FRAGMENT_SIZE);
|
|
||||||
bits_per_sample = snd_pcm_format_physical_width(hwparams.format);
|
bits_per_sample = snd_pcm_format_physical_width(hwparams.format);
|
||||||
bits_per_frame = bits_per_sample * hwparams.channels;
|
bits_per_frame = bits_per_sample * hwparams.channels;
|
||||||
buffer_bytes = buffer_size * bits_per_frame / 8;
|
buffer_bytes = buffer_size * bits_per_frame / 8;
|
||||||
|
@ -841,7 +835,7 @@ void xrun(void)
|
||||||
fprintf(stderr, "xrun!!! (at least %.3f ms long)\n", diff.tv_sec * 1000 + diff.tv_usec / 1000.0);
|
fprintf(stderr, "xrun!!! (at least %.3f ms long)\n", diff.tv_sec * 1000 + diff.tv_usec / 1000.0);
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
fprintf(stderr, "Status:\n");
|
fprintf(stderr, "Status:\n");
|
||||||
snd_pcm_dump_status(&status, stderr);
|
snd_pcm_status_dump(&status, stderr);
|
||||||
}
|
}
|
||||||
if ((res = snd_pcm_prepare(handle))<0) {
|
if ((res = snd_pcm_prepare(handle))<0) {
|
||||||
error("xrun: prepare error: %s", snd_strerror(res));
|
error("xrun: prepare error: %s", snd_strerror(res));
|
||||||
|
|
Loading…
Reference in a new issue