daten von mikrofon einlese bzw. auf soundkarte schreiben



  • hi,

    nachdem ich in nächster zeit voip applikation schreibe, benötige ich eine möglichkeit "sprachdaten" von einem mikrofon zu lesen bzw. diese auf die soundkarte zu schreiben. hat vlt. jemand von euch schon erfahrung damit? bzw. kennt jemand von euch eine c/c++ lib die das erledigen könnte?

    oder, reicht es einfach die daten mittels read von dem entsprechenden /dev - device zu lesen?



  • Du kannst direkt die ALSA-API ansprechen. Oder besser Jack benutzen.

    Wenn du mit Qt/KDE oder dem GNOME-Zeugs arbeitest, solltest du mal in den Libs schauen.



  • für die ausgabe kannst du ja die API von einem sound-server nehmen wie ESD oder aRts. die lassen sich glaub leichter ansprechen als ALSA und man kann mehrere anwendung mit sound-ausgabe gleichzeitig benutzen.

    mfg blan



  • blan schrieb:

    für die ausgabe kannst du ja die API von einem sound-server nehmen wie ESD oder aRts. die lassen sich glaub leichter ansprechen als ALSA und man kann mehrere anwendung mit sound-ausgabe gleichzeitig benutzen.

    Das geht aber mit einer anständigen Soundkarte oder dmix auch ohne Soundserver. Und abgesehen hat keiner von beiden eine besonders rosige Zukunft. Mit KDE 4 ist Schluss mit aRTs und esd ist extrem veraltet. Ich würde es direkt über ALSA machen (es sei denn, du benötigst die von Jack angebotenen Zusatzeigenschaften wie Audiodaten an andere Programme durchreichen oder sowas).



  • xandl33 schrieb:

    [...] oder, reicht es einfach die daten mittels read von dem entsprechenden /dev - device zu lesen?

    Das geht natürlich auch. Es ist aber sinnvoll, vorher das Format (8/16 Bit, Mono/Stereo usw.) und die Samplingrate nach Wunsch einzustellen. Hier mal ein Beispielprogramm für die Aufnahme und Wiedergabe mit 22kHz 8Bit Mono:

    /*
        rec_play.c - Audio-Signal aufnehmen u. wiedergeben
    */
    
    # include <stdio.h>
    # include <unistd.h>
    # include <fcntl.h>
    # include <sys/ioctl.h>
    # include <linux/soundcard.h>
    
    # define NUM_SAMPLES 100000
    
    unsigned char buffer[NUM_SAMPLES];
    
    int main()
     {
      int fd, i, format=AFMT_U8;
      long length;
      char input[16];
    
      fd = open("/dev/dsp", O_RDWR);
    
      ioctl(fd, SNDCTL_DSP_SETFMT, &format);
    
      i = 0;
      ioctl(fd, SNDCTL_DSP_STEREO, &i);
    
      i = 22050;
      ioctl(fd, SNDCTL_DSP_SPEED, &i);
    
      printf("Press <RETURN> to start recording. ");
      fgets(input, 16, stdin);
    
      length = read(fd, buffer, NUM_SAMPLES);
    
      printf("Press <RETURN> to start playing. ");
      fgets(input, 16, stdin);
    
      write(fd, buffer, length);
    
      close(fd);
      return(0);
     }
    

Anmelden zum Antworten