]> code.delx.au - pulseaudio/blobdiff - src/modules/module-alsa-sink.c
* rework latency interpolation to make it smoother
[pulseaudio] / src / modules / module-alsa-sink.c
index e768e16a6414c87538eea6a5b4e9cb84089a97a9..620047b775d0cf79e87b0f18b8a99ffe07304a2a 100644 (file)
@@ -363,19 +363,25 @@ int pa__init(pa_core *c, pa_module*m) {
         goto fail;
     }
 
+    if (ss.channels != map.channels)
+        /* Seems ALSA didn't like the channel number, so let's fix the channel map */
+        pa_channel_map_init_auto(&map, ss.channels, PA_CHANNEL_MAP_ALSA);
+    
     if ((err = snd_mixer_open(&u->mixer_handle, 0)) < 0) {
         pa_log(__FILE__": Error opening mixer: %s", snd_strerror(err));
         goto fail;
     }
 
     if ((pa_alsa_prepare_mixer(u->mixer_handle, dev) < 0) ||
-        !(u->mixer_elem = pa_alsa_find_elem(u->mixer_handle, "PCM"))) {
+        !(u->mixer_elem = pa_alsa_find_elem(u->mixer_handle, "PCM", "Master"))) {
         snd_mixer_close(u->mixer_handle);
         u->mixer_handle = NULL;
     }
 
-    u->sink = pa_sink_new(c, __FILE__, pa_modargs_get_value(ma, "sink_name", DEFAULT_SINK_NAME), 0, &ss, &map);
-    assert(u->sink);
+    if (!(u->sink = pa_sink_new(c, __FILE__, pa_modargs_get_value(ma, "sink_name", DEFAULT_SINK_NAME), 0, &ss, &map))) {
+        pa_log(__FILE__": Failed to create sink object");
+        goto fail;
+    }
 
     u->sink->get_latency = sink_get_latency_cb;
     if (u->mixer_handle) {
@@ -420,7 +426,8 @@ int pa__init(pa_core *c, pa_module*m) {
         }
         snd_mixer_elem_set_callback(u->mixer_elem, mixer_callback);
         snd_mixer_elem_set_callback_private(u->mixer_elem, u);
-    }
+    } else
+        u->mixer_fdl = NULL;
     
     u->frame_size = frame_size;
     u->fragment_size = period_size * frame_size;