Sida 1 av 1

Ljud ut i Linux GCC?

Postat: 7 januari 2016, 14:40:12
av Marta
Vill skicka PCM ljuddata i form av en följd av buffers med olika längd som då skall spelas upp. Skickas inget skall där inte kräkas upp underrun errors o,dyl., bara tystna tills mera data skickas.

Har gjort detta i ett annat OS tidigara, där var det bara att skicka pekare till buffer och dess längd. När en buffer var klar generarades ett event som talade om detta. Finns motsvarande API i Linux? Vill ha så lite "hjälpsamhet" från systemet som möjligt.

Re: Ljud ut i Linux GCC?

Postat: 7 januari 2016, 14:50:56
av Micke_s
Du ska nog kolla på Alsa...

http://cboard.cprogramming.com/linux-pr ... files.html

Är dock osäker på om du kan få ett event dock...


Edit: för undvika underrun skulle du kunna skicka 0:or tills du har ny data...

Re: Ljud ut i Linux GCC?

Postat: 7 januari 2016, 15:35:48
av lillahuset
Eftersom jag är så jävla lat skulle jag ta till tricket att använda system() och låta något befintligt program spela upp buffrarna. Alltså, skapa en fil med ljuddata och sedan spela upp den med ett befintligt program. Jag vet inte ens vad jag har för system för ljud i min dator. ALSA? Jack? Något annat? :D

Här finns en del info: https://jan.newmarch.name/LinuxSound/

Edit: Lite ALSA: http://www.linuxjournal.com/article/6735?page=0,0

Re: Ljud ut i Linux GCC?

Postat: 7 januari 2016, 16:11:59
av Marta
Vill inte hålla på och kladda med filer på disk. Data skall skickas direkt till ljudkortet. Ljudhanteringen är PulseAudio. Vill helst att denna används så att flera program kan vara öppna mot ljudkortet samtidigt.

Hur fungerar det utan något event att tala om när buffern är fri? Det måste givetvis vara en non-blocking funktion för att skicka buffern till systemet.

Det allra enklaste är kanske att återanvända befintlig kod och köra denna under Wine... Fast jag vill givetvis helst ha native Linux!

Re: Ljud ut i Linux GCC?

Postat: 7 januari 2016, 16:20:56
av lillahuset
RAMdisk?

Re: Ljud ut i Linux GCC?

Postat: 7 januari 2016, 16:36:40
av svanted
man borde kunna skicka det direkt till /dev/audio i rawformat utan att låta det landa på disk, om du inte vill det...
vet inte exakt vad du gör men typ:
sox soundfile.wav -t raw -r 8012 -u -b -c 1 | cat > /dev/audio
kanske kan ge någon ledtråd.
sox ovan konverterar en ljudfil men direkt till ljudkortet.
förutsatt att det audiokortet finns som /dev/audio på burken.

Re: Ljud ut i Linux GCC?

Postat: 7 januari 2016, 19:08:07
av Marta
Ser ut att blir PulseAudio. Där finns både ett enkelt API med blocking calls som är lika enkelt som att skriva en file och ett mera avancerat som påminner om ett annat OS. Kanske går att använda blocking på en modern dator och hinna skapa nästa block så snabbt att det inte märks, annars får det bli lite läsande av stökig dokumentation för det avancerade alternativet. De som skriver sådant är dessvärre mästare i att få det enkla att se ut som en avhandling i kvantfysik...

Re: Ljud ut i Linux GCC?

Postat: 8 januari 2016, 11:40:48
av svanted
mha esound kan man mixa ljud från flera klienter som vill använda samma ljudutgång...

Re: Ljud ut i Linux GCC?

Postat: 8 januari 2016, 13:10:10
av maDa
Hur ser "tyst" PCM data ut? Nollor? Skulle man inte kunna fylla i med det när det inte finns något att spela upp.

Kod: Markera allt

någotsomgörPCM|aplay -f S16_LE -r 44100 -c 2

Re: Ljud ut i Linux GCC?

Postat: 8 januari 2016, 19:05:54
av SvenW
Kunde inte motstå denna dumhet men jag ursäktar mig med att det är min första publicerade musikaliska komposition. Nördmusik.
Varsågod:

Kod: Markera allt


#include <stdio.h>
#include <math.h>
#include <unistd.h>

/* Kompilera:  */
/* gcc musik.c -lm */
/* Spela:  */
/* a.out | aplay -f S16_LE -r 44100 -c1 */

int
main ()
{
  int i, k, ut;
  double t[24];

  for (i = 0; i < 12; i++)
    {
      t[i] = 1.0 * exp (1.0 * i / 12.0 * log (2));
    }
  {
    double c = 1, d = t[2], e = t[4], f = t[5], g = t[7], a = t[9], h = t[11];
    double m[24] =
      { c, e, g, a, t[10], a, g, e, c, e, g, a, t[10], a, g, e, c };

    for (i = 0; i < 180000; i++)
      {
        k = (i / 4000) % 24;

        ut = 8000 * exp (-1.0 * ((double) (i % 4000) / 2000.0)) *
          ((1.0 + sin (m[k] * 3.1416 * i / 80.0))
           + (1.0 + sin (3 * m[k] * 3.1416 * i / 80.0)));

        write (1, &ut, 4);
      }
  }
}