From: Lennart Poettering Date: Mon, 17 Sep 2007 17:00:50 +0000 (+0000) Subject: fall back to plughw: if hw: doesn't work X-Git-Tag: 1.0_branch~2762^2~1^2~126 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1ae473bd1bb0f9087aa260a57cda869d9609f61f;p=profile%2Fivi%2Fpulseaudio.git fall back to plughw: if hw: doesn't work git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/lennart@1844 fefdeb5f-60dc-0310-8127-8f9354f1896f --- diff --git a/src/modules/module-alsa-sink.c b/src/modules/module-alsa-sink.c index 70685e4..fb3f926 100644 --- a/src/modules/module-alsa-sink.c +++ b/src/modules/module-alsa-sink.c @@ -678,7 +678,7 @@ int pa__init(pa_module*m) { pa_modargs *ma = NULL; struct userdata *u = NULL; - const char *dev; + char *dev; pa_sample_spec ss; pa_channel_map map; uint32_t nfrags, frag_size; @@ -737,24 +737,39 @@ int pa__init(pa_module*m) { pa_rtpoll_item_new_asyncmsgq(u->rtpoll, PA_RTPOLL_EARLY, u->thread_mq.inq); snd_config_update_free_global(); - if ((err = snd_pcm_open(&u->pcm_handle, dev = pa_modargs_get_value(ma, "device", DEFAULT_DEVICE), SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) { - pa_log("Error opening PCM device %s: %s", dev, snd_strerror(err)); - goto fail; - } - u->device_name = pa_xstrdup(dev); + dev = pa_xstrdup(pa_modargs_get_value(ma, "device", DEFAULT_DEVICE)); - if ((err = snd_pcm_info(u->pcm_handle, pcm_info)) < 0) { - pa_log("Error fetching PCM info: %s", snd_strerror(err)); - goto fail; - } + for (;;) { + + if ((err = snd_pcm_open(&u->pcm_handle, dev, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) { + pa_log("Error opening PCM device %s: %s", dev, snd_strerror(err)); + pa_xfree(dev); + goto fail; + } + + b = use_mmap; + if ((err = pa_alsa_set_hw_params(u->pcm_handle, &ss, &nfrags, &period_size, &b)) < 0) { - b = use_mmap; - if ((err = pa_alsa_set_hw_params(u->pcm_handle, &ss, &nfrags, &period_size, &b)) < 0) { - pa_log("Failed to set hardware parameters: %s", snd_strerror(err)); - goto fail; - } + if (err == -EPERM) { + /* Hmm, some hw is very exotic, so we retry with plughw, if hw didn't work */ + + if (pa_startswith(dev, "hw:")) { + char *d = pa_sprintf_malloc("plughw:%s", dev+3); + pa_xfree(dev); + dev = d; + continue; + } + } + + pa_log("Failed to set hardware parameters: %s", snd_strerror(err)); + pa_xfree(dev); + goto fail; + } + break; + } + if (use_mmap && !b) { pa_log_info("Device doesn't support mmap(), falling back to UNIX read/write mode."); u->use_mmap = use_mmap = b; @@ -763,6 +778,13 @@ int pa__init(pa_module*m) { if (u->use_mmap) pa_log_info("Successfully enabled mmap() mode."); + if ((err = snd_pcm_info(u->pcm_handle, pcm_info)) < 0) { + pa_log("Error fetching PCM info: %s", snd_strerror(err)); + goto fail; + } + + u->device_name = dev; + if ((err = pa_alsa_set_sw_params(u->pcm_handle)) < 0) { pa_log("Failed to set software parameters: %s", snd_strerror(err)); goto fail;