mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05:00 
			
		
		
		
	alsa: when probing for profiles configure buffer/period sizes since some broken drivers apparently need that
This commit is contained in:
		
							parent
							
								
									84ade2140e
								
							
						
					
					
						commit
						8364b959b4
					
				
					 3 changed files with 22 additions and 5 deletions
				
			
		| 
						 | 
					@ -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;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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__;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue