From owner-svn-src-all@FreeBSD.ORG Tue Jun 7 17:32:13 2011 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 34FE21065676; Tue, 7 Jun 2011 17:32:13 +0000 (UTC) (envelope-from hselasky@c2i.net) Received: from swip.net (mailfe08.c2i.net [212.247.154.226]) by mx1.freebsd.org (Postfix) with ESMTP id E3EAB8FC1B; Tue, 7 Jun 2011 17:32:11 +0000 (UTC) X-Cloudmark-Score: 0.000000 [] X-Cloudmark-Analysis: v=1.1 cv=PvOwS0pD1JWuCk2fMyCiv7x8TRi/oBifOus6FmFACNc= c=1 sm=1 a=SvYTsOw2Z4kA:10 a=T3xg-fz5BeEA:10 a=WQU8e4WWZSUA:10 a=N659UExz7-8A:10 a=CL8lFSKtTFcA:10 a=i9M/sDlu2rpZ9XS819oYzg==:17 a=6I5d2MoRAAAA:8 a=M5xNTXWlDeJN2m3o8woA:9 a=HX4OEtGSOkArBYGJaIYA:7 a=pILNOxqGKmIA:10 a=i9M/sDlu2rpZ9XS819oYzg==:117 Received: from [188.126.198.129] (account mc467741@c2i.net HELO laptop002.hselasky.homeunix.org) by mailfe08.swip.net (CommuniGate Pro SMTP 5.2.19) with ESMTPA id 136935603; Tue, 07 Jun 2011 19:32:10 +0200 From: Hans Petter Selasky To: Alexander Motin Date: Tue, 7 Jun 2011 19:30:49 +0200 User-Agent: KMail/1.13.5 (FreeBSD/8.2-STABLE; KDE/4.4.5; amd64; ; ) References: <201106071701.p57H1qvN092370@svn.freebsd.org> In-Reply-To: <201106071701.p57H1qvN092370@svn.freebsd.org> X-Face: *nPdTl_}RuAI6^PVpA02T?$%Xa^>@hE0uyUIoiha$pC:9TVgl.Oq, NwSZ4V"|LR.+tj}g5 %V,x^qOs~mnU3]Gn; cQLv&.N>TrxmSFf+p6(30a/{)KUU!s}w\IhQBj}[g}bj0I3^glmC( :AuzV9:.hESm-x4h240C`9=w MIME-Version: 1.0 Content-Type: Text/Plain; charset="windows-1252" Content-Transfer-Encoding: 7bit Message-Id: <201106071930.49724.hselasky@c2i.net> Cc: "svn-src-head@freebsd.org" , "svn-src-all@freebsd.org" , "src-committers@freebsd.org" Subject: Re: svn commit: r222826 - head/sys/dev/sound/pcm X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 07 Jun 2011 17:32:13 -0000 On Tuesday 07 June 2011 19:01:52 Alexander Motin wrote: > Author: mav > Date: Tue Jun 7 17:01:52 2011 > New Revision: 222826 > URL: http://svn.freebsd.org/changeset/base/222826 > > Log: > Make automatic hw.snd.default_unit choice a bit more intelligent. Instead > of just setting it to the first registered device, reevaluate it for each > device registered, trying to choose best candidate, unless one was > forced. For now use such preference order: play&rec, play, rec. > > As side effect, this should workaround the situation when HDMI audio > output of the video card, usually not connected to anything, becomes > default, that requires manual user intervention to make sound working. If > at some point this won't be enough, we can try to fetch some additional > priority flags from the device driver. > > Modified: > head/sys/dev/sound/pcm/sound.c > > Modified: head/sys/dev/sound/pcm/sound.c > =========================================================================== > === --- head/sys/dev/sound/pcm/sound.c Tue Jun 7 16:23:27 2011 (r222825) > +++ head/sys/dev/sound/pcm/sound.c Tue Jun 7 17:01:52 2011 (r222826) @@ > -51,7 +51,7 @@ int pcm_veto_load = 1; > int snd_unit = -1; > TUNABLE_INT("hw.snd.default_unit", &snd_unit); > > -static int snd_unit_auto = 0; > +static int snd_unit_auto = -1; > TUNABLE_INT("hw.snd.default_auto", &snd_unit_auto); > SYSCTL_INT(_hw_snd, OID_AUTO, default_auto, CTLFLAG_RW, > &snd_unit_auto, 0, "assign default unit to a newly attached device"); > @@ -443,6 +443,7 @@ sysctl_hw_snd_default_unit(SYSCTL_HANDLE > if (!PCM_REGISTERED(d) || CHN_EMPTY(d, channels.pcm)) > return EINVAL; > snd_unit = unit; > + snd_unit_auto = 0; > } > return (error); > } > @@ -737,6 +738,32 @@ pcm_killchan(device_t dev) > return (pcm_chn_destroy(ch)); > } > > +static int > +pcm_best_unit(int old) > +{ > + struct snddev_info *d; > + int i, best, bestprio, prio; > + > + best = -1; > + bestprio = -100; > + for (i = 0; pcm_devclass != NULL && > + i < devclass_get_maxunit(pcm_devclass); i++) { > + d = devclass_get_softc(pcm_devclass, i); > + if (!PCM_REGISTERED(d)) > + continue; > + prio = 0; > + if (d->playcount == 0) > + prio -= 10; > + if (d->reccount == 0) > + prio -= 2; > + if (prio > bestprio || (prio == bestprio && i == old)) { > + best = i; > + bestprio = prio; > + } > + } > + return (best); > +} > + > int > pcm_setstatus(device_t dev, char *str) > { > @@ -770,8 +797,12 @@ pcm_setstatus(device_t dev, char *str) > > PCM_UNLOCK(d); > > - if (snd_unit < 0 || snd_unit_auto != 0) > + if (snd_unit_auto < 0) > + snd_unit_auto = (snd_unit < 0) ? 1 : 0; > + if (snd_unit < 0 || snd_unit_auto > 1) > snd_unit = device_get_unit(dev); > + else if (snd_unit_auto == 1) > + snd_unit = pcm_best_unit(snd_unit); > > return (0); > } > @@ -1113,7 +1144,6 @@ pcm_unregister(device_t dev) > struct snddev_info *d; > struct pcm_channel *ch; > struct thread *td; > - int i; > > td = curthread; > d = device_get_softc(dev); > @@ -1216,21 +1246,9 @@ pcm_unregister(device_t dev) > sndstat_release(td); > > if (snd_unit == device_get_unit(dev)) { > - /* > - * Reassign default unit to the next available dev, but > - * first, reset snd_unit to something ridiculous. > - */ > - snd_unit = -1; > - for (i = 0; pcm_devclass != NULL && > - i < devclass_get_maxunit(pcm_devclass); i++) { > - if (device_get_unit(dev) == i) > - continue; > - d = devclass_get_softc(pcm_devclass, i); > - if (PCM_REGISTERED(d)) { > - snd_unit = i; > - break; > - } > - } > + snd_unit = pcm_best_unit(-1); > + if (snd_unit_auto == 0) > + snd_unit_auto = 1; > } > > return (0); Idea: I would be cool if some GTK mixer apps can set this value. --HPS