Toon posts:

[C++/Linux/ALSA] Geluid dooft uit

Pagina: 1
Acties:

Verwijderd

Topicstarter
OS: Suse Linux, sound lib: ALSA 0.5.x

Ik heb een applicatie die geluid samples ontvangt via TCP/IP. Die samples zijn afkomstig uit twee verschillende bronnen, maar ze moeten tegelijkertijd (dus door elkaar heen) te horen zijn. Ik open via ALSA device 0 subdevice 0, en device 0 subdevice 1, en stuur daar de samples naartoe.

Het lijkt goed te werken, MAAR:

Om te testen heb ik momenteel alleen de beschikking over 1 TCP/IP bron. Dus ik stuur de samples van die ene bron naar beide subdevices. Ik controleer of ze beide werken door soms de ene, soms de andere uit te schakelen (softwarematig) en het geluid blijft hoorbaar, dus kennelijk krijgen beide devices de samples correct binnen (als ik ze allebei uitschakel is het geluid wel weg). Maar als beide kanalen aan staan begint na een minuutje of zo het geluid brak te worden totdat het haast helemaal verdwijnt. En nog later wordt het langzaam weer hoorbaar... Als ik tijdens een brakke periode een van beide kanalen uitschakel, is het geluid ineens weer goed.

Kan het zijn dat de samples op die twee subdevices elkaar uitdoven? Dus dat het ene signaal een soort antigeluid is voor het andere (faseverschil van 180 graden)? En waarom gebeurt dat dan langzaam en komt het geluid ook langzaam weer terug? Je zou toch denken dat die twee subdevices op precies dezelfde clockrate draaien en dat het faseverschil (als dat tenminste de oorzaak is) constant blijft?

Iemand een verklaring? (Ja ik weet wel dat ik nog moet testen met twee totaal onafhankelijke geluidsbronnen, maar ik ben toch wel nieuwsgierig of er iemand een antwoord heeft.)

Verwijderd

ALSA doet allemaal vieze dingen met geluid die je via de lib naar het device toepompt (interne mixer). Het kan dus best dat softwarematige clocking (en dus faseverschil) en daarmee uitdoven van het geluid hier ook bij hoort. Ik persoonlijk vind ALSA een van de grootste rampen in jaren, had liever een elegantere OSS2 als oplossing gezien (dus een nieuwe versie van OSS die op zich een zelfde soort werking heeft, zie V4L1->V4L2).

Als je absoluut zeker wilt zijn van correcte werking vrees ik dat je zelf de mixing van je geluidjes zal moeten doen en dat je dat 'eindgeluid' naar de ALSA output moet sturen.

Verwijderd

Topicstarter
Tsja, ik had mijn app dus eerst gemaakt met OSS, liep als een trein, maar toen kwam de eis dat er een tweede geluidskanaal bij moest zonder dat er een geluidskaart bijgeplugd hoefde te worden (want moest ook op laptops kunnen, "en je hebt toch immers twee speakers?"). En aangezien ALSA twee subdevices per device support, dacht ik "dat is het". Dat valt dus tegen...

Andere vraag, beelzebubu: weet jij of ALSA 0.9 een beetje stabiel is? Suse levert weliswaar 0.5 mee (vandaar dat ik dat gebruik), maar als ik tegen onze systeembeheerder zeg dat ik 0.9 nodig heb, dan krijg ik dat wel. Alleen wil ik dan wel zeker weten dat ik me niet nog meer problemen op de hals haal dan ik nu al heb.

Verwijderd

ALSA-0.9 is stabiel en zit inmiddels zelfs in de development kernel versie (2.5.x). Ik gebruik het zelf niet, maar ken genoeg mensen die het wel gebruiken. OSS emulation is overigens voor veel kaarten niet werkend, maar als je native ALSA lib gebruikt werkt het wel.

Ik vraag me echter af of dat het probleem oplost... Vertel even of 0.9 beter werkt. ;).

Verwijderd

Topicstarter
Nah, als ik ALSA gebruik dan gebruik ik ook echt ALSA, geen OSS emulatie. Ik heb bij het bouwen in de Makefile een define staan, en in de code staat op diverse plaatsen #ifdef ALSA en/of #ifdef OSS . Dus OSS emulatie hoeft niet.

Enne, als het toch uitdraait op ALSA 0.9 en dat werkt beter, zal ik het inderdaad laten weten. Als twee onafhankelijke geluidskanalen geen uitdoving vertonen, is het zoals het nu is goed genoeg (denk ik) dus dan hoeft ALSA 0.9 niet.