mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05:00 
			
		
		
		
	initialize sound cards only after the 'control' object appeared
This commit is contained in:
		
							parent
							
								
									9bea2503d9
								
							
						
					
					
						commit
						ca39fa2c6f
					
				
					 1 changed files with 25 additions and 5 deletions
				
			
		| 
						 | 
					@ -121,6 +121,7 @@ static const char *strip_udi(const char *udi) {
 | 
				
			||||||
enum alsa_type {
 | 
					enum alsa_type {
 | 
				
			||||||
    ALSA_TYPE_PLAYBACK,
 | 
					    ALSA_TYPE_PLAYBACK,
 | 
				
			||||||
    ALSA_TYPE_CAPTURE,
 | 
					    ALSA_TYPE_CAPTURE,
 | 
				
			||||||
 | 
					    ALSA_TYPE_CONTROL,
 | 
				
			||||||
    ALSA_TYPE_OTHER
 | 
					    ALSA_TYPE_OTHER
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -141,6 +142,8 @@ static enum alsa_type hal_alsa_device_get_type(LibHalContext *context, const cha
 | 
				
			||||||
        t = ALSA_TYPE_PLAYBACK;
 | 
					        t = ALSA_TYPE_PLAYBACK;
 | 
				
			||||||
    else if (pa_streq(type, "capture"))
 | 
					    else if (pa_streq(type, "capture"))
 | 
				
			||||||
        t = ALSA_TYPE_CAPTURE;
 | 
					        t = ALSA_TYPE_CAPTURE;
 | 
				
			||||||
 | 
					    else if (pa_streq(type, "control"))
 | 
				
			||||||
 | 
					        t = ALSA_TYPE_CONTROL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    libhal_free_string(type);
 | 
					    libhal_free_string(type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -171,6 +174,7 @@ static pa_bool_t hal_alsa_device_is_modem(LibHalContext *context, const char *ud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
finish:
 | 
					finish:
 | 
				
			||||||
    if (dbus_error_is_set(&error)) {
 | 
					    if (dbus_error_is_set(&error)) {
 | 
				
			||||||
 | 
					        if (!dbus_error_has_name(&error, "org.freedesktop.Hal.NoSuchProperty"))
 | 
				
			||||||
            pa_log_error("D-Bus error while parsing HAL ALSA data: %s: %s", error.name, error.message);
 | 
					            pa_log_error("D-Bus error while parsing HAL ALSA data: %s: %s", error.name, error.message);
 | 
				
			||||||
        dbus_error_free(&error);
 | 
					        dbus_error_free(&error);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -193,10 +197,23 @@ static int hal_device_load_alsa(struct userdata *u, const char *udi, struct devi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* We only care for PCM devices */
 | 
					    /* We only care for PCM devices */
 | 
				
			||||||
    type = hal_alsa_device_get_type(u->context, udi);
 | 
					    type = hal_alsa_device_get_type(u->context, udi);
 | 
				
			||||||
    if (type == ALSA_TYPE_OTHER)
 | 
					
 | 
				
			||||||
 | 
					    /* For each ALSA card that appears the control device will be the
 | 
				
			||||||
 | 
					     * last one to be created, this is considered part of the ALSA
 | 
				
			||||||
 | 
					     * usperspace API. We rely on this and load our modules only when
 | 
				
			||||||
 | 
					     * the control device is available assuming that *all* device
 | 
				
			||||||
 | 
					     * nodes have been properly created and assigned the right ACLs at
 | 
				
			||||||
 | 
					     * that time. Also see:
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * http://mailman.alsa-project.org/pipermail/alsa-devel/2009-April/015958.html
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * and the associated thread.*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (type != ALSA_TYPE_CONTROL)
 | 
				
			||||||
        goto fail;
 | 
					        goto fail;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* We don't care for modems */
 | 
					    /* We don't care for modems -- this is most likely not set for
 | 
				
			||||||
 | 
					     * control devices, so kind of pointless here. */
 | 
				
			||||||
    if (hal_alsa_device_is_modem(u->context, udi))
 | 
					    if (hal_alsa_device_is_modem(u->context, udi))
 | 
				
			||||||
        goto fail;
 | 
					        goto fail;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -411,9 +428,10 @@ static int hal_device_add_all(struct userdata *u) {
 | 
				
			||||||
        for (i = 0; i < n; i++) {
 | 
					        for (i = 0; i < n; i++) {
 | 
				
			||||||
            struct device *d;
 | 
					            struct device *d;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if ((d = hal_device_add(u, udis[i])))
 | 
					            if ((d = hal_device_add(u, udis[i]))) {
 | 
				
			||||||
                count++;
 | 
					                count++;
 | 
				
			||||||
            else
 | 
					                pa_log_debug("Loaded device %s", udis[i]);
 | 
				
			||||||
 | 
					            } else
 | 
				
			||||||
                pa_log_debug("Not loaded device %s", udis[i]);
 | 
					                pa_log_debug("Not loaded device %s", udis[i]);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -449,6 +467,8 @@ static void device_added_cb(LibHalContext *context, const char *udi) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!hal_device_add(u, udi))
 | 
					    if (!hal_device_add(u, udi))
 | 
				
			||||||
        pa_log_debug("Not loaded device %s", udi);
 | 
					        pa_log_debug("Not loaded device %s", udi);
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        pa_log_debug("Loaded device %s", udi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
finish:
 | 
					finish:
 | 
				
			||||||
    if (dbus_error_is_set(&error)) {
 | 
					    if (dbus_error_is_set(&error)) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue