Virtuelle Soundkanäle wollen nicht & esound will auch nicht

sic

Member
System: FreeBSD 5.4
Soundkarte: Intel ICH5 (82801EB)


Hallo,

generell funktioniert der Sound, nur leider kann ich immer nur eine Tonquelle abspielen. Würde aber gerne Teamspeak und ET gleichzeitig mit Sound nutzen können.

Virtuelle Soundkanäle

Um das zu ändern, habe ich es als erstes so versucht wie im Handbuch beschrieben.[1]
Aber egal welches /dev/dsp0.x ich im Teamspeak und ET konfiguriere, jedesmal werden anscheinend alle Kanäle belegt. Also Teamspeak hat z.B. dsp0.1 und ET dsp0.2, starte ich ET kommt wieder die altbekannte /dev/dsp0.2: Device or resource busy Meldung. Beende ich Teamspeak geht es (natürlich).


esound

Weil ich damit nicht weitergekommen bin, habe ich es mit esound probiert. Will ich nun aber z.B. ET mittels esddsp et starten kommt folgende Meldung:
Code:
./et.x86: error while loading shared libraries: /usr/local/lib/libesddsp.so: ELF file OS ABI invalid

Linux-Umgebung ist geladen. Linprocfs auch, /compat/usr ist ebenfalls gemountet. Ich habe auch schon versucht die libesddsp.so mit Linux zu branden, hat auch nix gebracht.


Wäre sehr nett wenn mir einer helfen könnte!

Gruß,
sic

[1] http://www.freebsd.org/doc/de_DE.ISO8859-1/books/handbook/sound-setup.html
 
Zu vchains: Du darfst Anwendungen nicht auf /dev/dsp0.? einstellen, sondern mußt /dev/dsp0 verwenden. Steht auch so im Handbuch, siehe deine eigene Quellenangabe.

Zu esound: Wenn du ein Linux-Programm über esddsp tunneln willst, brauchst du dafür linux-esound. Linux-Programme brauchen Linux-Libs. FreeBSD-Libs sind dazu völlig inkompatibel. Daher ist es auch zwecklos, irgendwelche Shared Libraries zu branden.
 
Hi,

0815Chaot schrieb:
Zu vchains: Du darfst Anwendungen nicht auf /dev/dsp0.? einstellen, sondern mußt /dev/dsp0 verwenden. Steht auch so im Handbuch, siehe deine eigene Quellenangabe.

Ich habe das in dem Handbuch anders aufgefasst. Da steht ja /dev/dsp0.x wobei x dann von 0 bis 4 geht. Anyway, mit /dev/dsp0 bekomme ich auch eine Device or resource busy Meldung.

0815Chaot schrieb:
Zu esound: Wenn du ein Linux-Programm über esddsp tunneln willst, brauchst du dafür linux-esound. Linux-Programme brauchen Linux-Libs. FreeBSD-Libs sind dazu völlig inkompatibel. Daher ist es auch zwecklos, irgendwelche Shared Libraries zu branden.

Gut zu wissen! Danke, wieder was gelernt! Jetzt bekomme ich bei Eingabe von
/usr/compat/linux/usr/bin/esddsp et
folgende Meldung:

Code:
./et.x86: error while loading shared libraries: libesd.so: cannot open shared object file: No such file or directory

Die libesd.so gibt es zwar im System, aber leider als FreeBSD-Lib. Wie bzw. woher bekomme ich die Linux-Version dieser Lib? Laut rpmseek ist sie Bestandteil des esound-devel Paketes, aber das finde ich nicht als Linuxversion in den Ports (?)
 
sic schrieb:
Ich habe das in dem Handbuch anders aufgefasst. Da steht ja /dev/dsp0.x wobei x dann von 0 bis 4 geht.
Nein, dort steht:
http://www.freebsd.org/doc/de_DE.ISO8859-1/books/handbook/sound-setup.html schrieb:
Wenn Sie ein System ohne devfs(5) einsetzen, müssen Anwendungen die Geräte /dev/dsp0.x verwenden. Wenn hw.snd.pcm.0.vchans wie oben auf 4 gesetzt wurde, läuft x von 0 bis 4. Auf Systemen mit devfs(5) werden die Geräte automatisch zugeteilt.
Also darfst du nicht /dev/dsp0.x verwenden.

sic schrieb:
Anyway, mit /dev/dsp0 bekomme ich auch eine Device or resource busy Meldung.
Versuche nochmal mit /dev/dsp. Wenn das funktioniert, wäre das allerdings Pfusch. Aber probieren kann man ja mal.

sic schrieb:
Code:
./et.x86: error while loading shared libraries: libesd.so: cannot open shared object file: No such file or directory
Suchen mit:
Code:
find /usr/compat/linux -name 'libesd.so*'
und Verzeichnis dann in $LD_LIBRARY_PATH aufnehmen. Besser ist es aber ohne esound, also versuch das erstmal mit den vchains.
 
Hi,

okay - war mir nicht sicher ob ich devfs habe. Also /dev/dsp geht leider auch nicht. Schade, denn mir würde die vchain-Methode auch besser gefallen.

Hab es aber nun mit esound hingefuscht. Also die libesd.so hatte er ja nicht. Hab dummerweise auch ohne die Wildcard gesucht. Mit der Wildcard hat er mir eine libesd.so.0 geliefert. Da esound nun unbedingt die libesd.so haben will habe ich einfach einen symbolischen Link erstellt. Vielleicht nicht ganz sauber - aber es geht!

Danke für deine Hilfe!

Und sollte es doch noch eine saubere Lösung geben wäre das natürlich auch was feines :)
 
sic schrieb:
Hi,okay - war mir nicht sicher ob ich devfs habe. Also /dev/dsp geht leider auch nicht. Schade, denn mir würde die vchain-Methode auch besser gefallen.
Könnte eventuell dieser Absatz hier von Bedeutung sein:
Anmerkung: Sie können die Anzahl der virtuellen Kanäle nur ändern, wenn das Gerät nicht genutzt wird. Schließen Sie daher zuerst alle Programme (etwa Musikabspielprogramme oder Sound-Daemonen), die auf dieses Gerät zugreifen.
 
Hallo,

Ich hatte das selbe Problem, es resultiert ganz einfach aus schlechter programmierung bei ET. ET belegt das Sounddevice READ/WRITE obwohl das ueberhaupt nicht notwendig ist..
Da es nur einen READ-Channel gibt, ist klar, dass wenn man den vchan mit RW oeffnet, wie TS, es busy ist.

Esound, artsdsp etc. ging hier nicht, weil PRELOADING durch verschiedene fehlende Libs leider geblockt wurde...

Nun meine Loesung... (etwas Buggy)
Im file /usr/src/sys/dev/sound/pcm/sound.c (ein Sourcefile von sound.ko) laesst sich in der Funktion pcm_chnalloc() folgendes aendern:
Code:
int
pcm_chnalloc(struct snddev_info *d, struct pcm_channel **ch, int direction,
		pid_t pid, int chnum)
{
	struct pcm_channel *c;
	struct snddev_channel *sce;
	int err;

retry_chnalloc:
	err = ENODEV;
	/* scan for a free channel */
	SLIST_FOREACH(sce, &d->channels, link) {
		c = sce->channel;
		CHN_LOCK(c);
		if (c->direction == direction && !(c->flags & CHN_F_BUSY)) {
			if (chnum < 0 || sce->chan_num == chnum) {
				/* 
				 * DIE FOLGENDE ZEILE WIRD EINGEFUEGT...
				 * 
				 * if (direction != PCMDIR_REC)
				 *
				 */
				if (direction != PCMDIR_REC) /* <<<<<< */
					c->flags |= CHN_F_BUSY;
				c->pid = pid;
				*ch = c;
				return 0;
			}
		}
		if (sce->chan_num == chnum) {
			if (c->direction != direction)
				err = EOPNOTSUPP;
			else if (c->flags & CHN_F_BUSY)
				err = EBUSY;
			else
				err = EINVAL;
			CHN_UNLOCK(c);
			return err;
		} else if (c->direction == direction && (c->flags & CHN_F_BUSY))
			err = EBUSY;
		CHN_UNLOCK(c);
	}

	/* no channel available */
	if (chnum == -1 && direction == PCMDIR_PLAY && d->vchancount > 0 &&
			d->vchancount < snd_maxautovchans &&
			d->devcount <= PCMMAXCHAN) {
		err = pcm_setvchans(d, d->vchancount + 1);
		if (err == 0) {
			chnum = -2;
			goto retry_chnalloc;
		}
	}

	return err;
}

Dies verhindert dass der READ-Channel busy wird.. Dadurch lassen sich alle vchans RW oeffnen.
Kompilieren kann man das ganze in /usr/src/sys/modules/sound/sound/ "make"
Anschließend das neue sound.ko in /boot/kernel/ "Sicherheitskopie..."

BUGS: Durch blocking etc. bekommt immer der letzte RW Zugriff den Zuspruch, darum muss ET vor TS geoeffnet werden, und wenn moeglich muss TS auch als erstes wieder geschlossen werden...

NOTE: in der aktuellen -CURRENT version von FreeBSD sind alle vchans mit RW ausgeruestet... mal sehen ab welcher Stable version sich dieses Problem somit erledigt hat

- Aus den oben genannten Bugs kann ich keine garantie uebernehmen, bei mir gehts, mehr kann ich nicht sagen

FreeBSD 6.2

Gruesse,
- tane
 
Zuletzt bearbeitet:
Zurück
Oben