alsa: when probing for profiles configure buffer/period sizes since some broken drivers apparently need that

This commit is contained in:
Lennart Poettering 2009-09-09 23:56:51 +02:00
parent 84ade2140e
commit 8364b959b4
3 changed files with 22 additions and 5 deletions

View file

@ -3145,7 +3145,13 @@ fail:
return NULL; return NULL;
} }
void pa_alsa_profile_set_probe(pa_alsa_profile_set *ps, const char *dev_id, const pa_sample_spec *ss) { void pa_alsa_profile_set_probe(
pa_alsa_profile_set *ps,
const char *dev_id,
const pa_sample_spec *ss,
unsigned default_n_fragments,
unsigned default_fragment_size_msec) {
void *state; void *state;
pa_alsa_profile *p, *last = NULL; pa_alsa_profile *p, *last = NULL;
pa_alsa_mapping *m; pa_alsa_mapping *m;
@ -3160,6 +3166,7 @@ void pa_alsa_profile_set_probe(pa_alsa_profile_set *ps, const char *dev_id, cons
PA_HASHMAP_FOREACH(p, ps->profiles, state) { PA_HASHMAP_FOREACH(p, ps->profiles, state) {
pa_sample_spec try_ss; pa_sample_spec try_ss;
pa_channel_map try_map; pa_channel_map try_map;
snd_pcm_uframes_t try_period_size, try_buffer_size;
uint32_t idx; uint32_t idx;
/* Is this already marked that it is supported? (i.e. from the config file) */ /* Is this already marked that it is supported? (i.e. from the config file) */
@ -3213,13 +3220,18 @@ void pa_alsa_profile_set_probe(pa_alsa_profile_set *ps, const char *dev_id, cons
try_ss = *ss; try_ss = *ss;
try_ss.channels = try_map.channels; try_ss.channels = try_map.channels;
try_period_size =
pa_usec_to_bytes(default_fragment_size_msec * PA_USEC_PER_MSEC, &try_ss) /
pa_frame_size(&try_ss);
try_buffer_size = default_n_fragments * try_period_size;
if (!(m ->output_pcm = pa_alsa_open_by_template( if (!(m ->output_pcm = pa_alsa_open_by_template(
m->device_strings, m->device_strings,
dev_id, dev_id,
NULL, NULL,
&try_ss, &try_map, &try_ss, &try_map,
SND_PCM_STREAM_PLAYBACK, SND_PCM_STREAM_PLAYBACK,
NULL, NULL, 0, NULL, NULL, &try_period_size, &try_buffer_size, 0, NULL, NULL,
TRUE))) { TRUE))) {
p->supported = FALSE; p->supported = FALSE;
break; break;
@ -3237,13 +3249,18 @@ void pa_alsa_profile_set_probe(pa_alsa_profile_set *ps, const char *dev_id, cons
try_ss = *ss; try_ss = *ss;
try_ss.channels = try_map.channels; try_ss.channels = try_map.channels;
try_period_size =
pa_usec_to_bytes(default_fragment_size_msec*PA_USEC_PER_MSEC, &try_ss) /
pa_frame_size(&try_ss);
try_buffer_size = default_n_fragments * try_period_size;
if (!(m ->input_pcm = pa_alsa_open_by_template( if (!(m ->input_pcm = pa_alsa_open_by_template(
m->device_strings, m->device_strings,
dev_id, dev_id,
NULL, NULL,
&try_ss, &try_map, &try_ss, &try_map,
SND_PCM_STREAM_CAPTURE, SND_PCM_STREAM_CAPTURE,
NULL, NULL, 0, NULL, NULL, &try_period_size, &try_buffer_size, 0, NULL, NULL,
TRUE))) { TRUE))) {
p->supported = FALSE; p->supported = FALSE;
break; break;

View file

@ -269,7 +269,7 @@ void pa_alsa_mapping_dump(pa_alsa_mapping *m);
void pa_alsa_profile_dump(pa_alsa_profile *p); void pa_alsa_profile_dump(pa_alsa_profile *p);
pa_alsa_profile_set* pa_alsa_profile_set_new(const char *fname, const pa_channel_map *bonus); pa_alsa_profile_set* pa_alsa_profile_set_new(const char *fname, const pa_channel_map *bonus);
void pa_alsa_profile_set_probe(pa_alsa_profile_set *ps, const char *dev_id, const pa_sample_spec *ss); void pa_alsa_profile_set_probe(pa_alsa_profile_set *ps, const char *dev_id, const pa_sample_spec *ss, unsigned default_n_fragments, unsigned default_fragment_size_msec);
void pa_alsa_profile_set_free(pa_alsa_profile_set *s); void pa_alsa_profile_set_free(pa_alsa_profile_set *s);
void pa_alsa_profile_set_dump(pa_alsa_profile_set *s); void pa_alsa_profile_set_dump(pa_alsa_profile_set *s);

View file

@ -329,7 +329,7 @@ int pa__init(pa_module *m) {
if (!u->profile_set) if (!u->profile_set)
goto fail; goto fail;
pa_alsa_profile_set_probe(u->profile_set, u->device_id, &m->core->default_sample_spec); pa_alsa_profile_set_probe(u->profile_set, u->device_id, &m->core->default_sample_spec, m->core->default_n_fragments, m->core->default_fragment_size_msec);
pa_card_new_data_init(&data); pa_card_new_data_init(&data);
data.driver = __FILE__; data.driver = __FILE__;