alsa: better period_time default value for high sample rates
The default values for buffer_time and period_time were both capped by the hardware limits on practically all chips. The result was a period_time which was half as big as the buffer_time. On some chips, this led to lots of underruns when using a high sample rate (192 kHz), because MPD had very little time to send new samples to ALSA. A period time which is one fourth of the buffer time turned out to be much better. If no period_time is configured, see how much buffer_time the hardware accepts, and try to configure one fourth of it as period_time, instead of hard-coding the default period_time value. This is yet another attempt to provide a solution which is valid for all sound chips. Using the SND_PCM_NONBLOCK flag also seemed to solve the underruns, but put a lot more CPU load to MPD.
This commit is contained in:
parent
27193d8402
commit
554a34fb95
1
NEWS
1
NEWS
|
@ -28,6 +28,7 @@ ver 0.15 - (200?/??/??)
|
||||||
- mvp: check for reopen errors
|
- mvp: check for reopen errors
|
||||||
- mvp: fixed default device detection
|
- mvp: fixed default device detection
|
||||||
- pipe: new audio output plugin which runs a command
|
- pipe: new audio output plugin which runs a command
|
||||||
|
- alsa: better period_time default value for high sample rates
|
||||||
* commands:
|
* commands:
|
||||||
- "playlistinfo" supports a range now
|
- "playlistinfo" supports a range now
|
||||||
- added "sticker database", command "sticker", which allows clients
|
- added "sticker database", command "sticker", which allows clients
|
||||||
|
|
|
@ -32,7 +32,6 @@ static const char default_device[] = "default";
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
MPD_ALSA_BUFFER_TIME_US = 500000,
|
MPD_ALSA_BUFFER_TIME_US = 500000,
|
||||||
MPD_ALSA_PERIOD_TIME_US = 125000,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MPD_ALSA_RETRY_NR 5
|
#define MPD_ALSA_RETRY_NR 5
|
||||||
|
@ -118,8 +117,7 @@ alsa_configure(struct alsa_data *ad, const struct config_param *param)
|
||||||
|
|
||||||
ad->buffer_time = config_get_block_unsigned(param, "buffer_time",
|
ad->buffer_time = config_get_block_unsigned(param, "buffer_time",
|
||||||
MPD_ALSA_BUFFER_TIME_US);
|
MPD_ALSA_BUFFER_TIME_US);
|
||||||
ad->period_time = config_get_block_unsigned(param, "period_time",
|
ad->period_time = config_get_block_unsigned(param, "period_time", 0);
|
||||||
MPD_ALSA_PERIOD_TIME_US);
|
|
||||||
|
|
||||||
#ifdef SND_PCM_NO_AUTO_RESAMPLE
|
#ifdef SND_PCM_NO_AUTO_RESAMPLE
|
||||||
if (!config_get_block_bool(param, "auto_resample", true))
|
if (!config_get_block_bool(param, "auto_resample", true))
|
||||||
|
@ -313,6 +311,13 @@ configure_hw:
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (period_time_ro == 0 && buffer_time >= 10000) {
|
||||||
|
period_time_ro = period_time = buffer_time / 4;
|
||||||
|
|
||||||
|
g_debug("default period_time = buffer_time/4 = %u/4 = %u",
|
||||||
|
buffer_time, period_time);
|
||||||
|
}
|
||||||
|
|
||||||
if (period_time_ro > 0) {
|
if (period_time_ro > 0) {
|
||||||
period_time = period_time_ro;
|
period_time = period_time_ro;
|
||||||
cmd = "snd_pcm_hw_params_set_period_time_near";
|
cmd = "snd_pcm_hw_params_set_period_time_near";
|
||||||
|
|
Loading…
Reference in New Issue