diff --git a/spa/plugins/alsa/alsa-pcm-sink.c b/spa/plugins/alsa/alsa-pcm-sink.c index 018b01231..d84f1ee33 100644 --- a/spa/plugins/alsa/alsa-pcm-sink.c +++ b/spa/plugins/alsa/alsa-pcm-sink.c @@ -795,6 +795,8 @@ impl_init(const struct spa_handle_factory *factory, } } else if (!strcmp(info->items[i].key, "api.alsa.period-size")) { this->default_period_size = atoi(info->items[i].value); + } else if (!strcmp(info->items[i].key, "api.alsa.headroom")) { + this->default_headroom = atoi(info->items[i].value); } } return 0; diff --git a/spa/plugins/alsa/alsa-pcm-source.c b/spa/plugins/alsa/alsa-pcm-source.c index 9447e2174..81f03f8f4 100644 --- a/spa/plugins/alsa/alsa-pcm-source.c +++ b/spa/plugins/alsa/alsa-pcm-source.c @@ -816,6 +816,8 @@ impl_init(const struct spa_handle_factory *factory, } } else if (!strcmp(info->items[i].key, "api.alsa.period-size")) { this->default_period_size = atoi(info->items[i].value); + } else if (!strcmp(info->items[i].key, "api.alsa.headroom")) { + this->default_headroom = atoi(info->items[i].value); } } return 0; diff --git a/spa/plugins/alsa/alsa-pcm.c b/spa/plugins/alsa/alsa-pcm.c index 52c148177..e100621ff 100644 --- a/spa/plugins/alsa/alsa-pcm.c +++ b/spa/plugins/alsa/alsa-pcm.c @@ -605,8 +605,12 @@ int spa_alsa_set_format(struct state *state, struct spa_audio_info *fmt, uint32_ CHECK(snd_pcm_hw_params_get_buffer_size_max(params, &state->buffer_frames), "get_buffer_size_max"); CHECK(snd_pcm_hw_params_set_buffer_size_near(hndl, params, &state->buffer_frames), "set_buffer_size_near"); + if (state->default_headroom == 0) + state->headroom = is_batch ? period_size : 0; + else + state->headroom = state->default_headroom; + state->period_frames = period_size; - state->headroom = is_batch ? period_size : 0; periods = state->buffer_frames / state->period_frames; spa_log_info(state->log, NAME" %s (%s): format:%s access:%s-%s rate:%d channels:%d " diff --git a/spa/plugins/alsa/alsa-pcm.h b/spa/plugins/alsa/alsa-pcm.h index 8f823c724..35d266ca4 100644 --- a/spa/plugins/alsa/alsa-pcm.h +++ b/spa/plugins/alsa/alsa-pcm.h @@ -111,6 +111,7 @@ struct state { struct spa_audio_info current_format; uint32_t default_period_size; + uint32_t default_headroom; uint32_t default_format; unsigned int default_channels; unsigned int default_rate; diff --git a/src/daemon/media-session.d/alsa-monitor.conf b/src/daemon/media-session.d/alsa-monitor.conf index f53cb740f..da5f7a2a6 100644 --- a/src/daemon/media-session.d/alsa-monitor.conf +++ b/src/daemon/media-session.d/alsa-monitor.conf @@ -50,9 +50,12 @@ rules = [ #resample.quality = 4 #channelmix.normalize = false #channelmix.mix-lfe = false + #audio.channels = 2 #audio.format = "S16LE" #audio.rate = 44100 #audio.position = "FL,FR" + #api.alsa.period-size = 1024 + #api.alsa.headroom = 0 } } }