OSS implementation



  • Moins

    Ich versuche eine OSS implementation zu machen.
    Ziel ist es, eine passende C++ Verkapslung zu machen.

    Leider lauft das "demo" progi einfach nicht.
    Ich hab schon sehr viel versucht.. aber jedes mal wenn
    ich ein ioctl zu griff machen will ist Fertig, das programm
    beendet sich.

    #include <sys/ioctl.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <cstdio>
    #include <cstring>
    #include <sys/soundcard.h>
    
    signed int main(int argc, char *argv[])
    {
    
      int dev_fd, arg;
      int buff_size;
      unsigned char *buf;
      FILE *pcm;
      char *devname = "/dev/dsp";
    
      printf("Open device: %s\n", devname);
    
      if (dev_fd = open(devname, O_WRONLY | O_NONBLOCK) == -1)
        return -2;
    
      if(fcntl(dev_fd, F_SETFL, 0) == -1)
        return -3;
    
    #if defined(F_SETFD) && defined(FD_CLOEXEC)
      if(fcntl(dev_fd, F_SETFD, FD_CLOEXEC) == -1)
          return -3;
    #endif
    
      printf("Init Sound\n");
    
    // Bis hier funct es... beim ersten ioctl ist fertig...
      arg = AFMT_S16_LE;
      if (ioctl(dev_fd, SNDCTL_DSP_SETFMT, &arg) == -1)
        return -4;
    
      arg = 1;
      if (ioctl(dev_fd, SNDCTL_DSP_STEREO, &arg) == -1)
        return -3;
    
      arg = 44100;
      if (ioctl(dev_fd, SNDCTL_DSP_SPEED, &arg) == -1)
        return -5;
    
      {
        audio_buf_info zz;
        if (ioctl(dev_fd, SNDCTL_DSP_GETOSPACE, &zz) == -1)
          return -6;
    
        buff_size = zz.fragments * zz.fragsize;
      }
    
      buf = new unsigned char[buff_size];
    
      pcm = fopen(argv[1], "r");
      if (pcm)
        return -7;
    
      while (!feof(pcm)) {
    
        int new_buf;
        new_buf = fread(buf, 1, buff_size, pcm);
    
        if(new_buf != buff_size)
          write(dev_fd, buf, new_buf);
        else
          write(dev_fd, buf, buff_size);
    
      }
    
      close(dev_fd);
      fclose(pcm);
    
      delete [] buf;
      return 1;
    }
    

    Was mache ich falsch bzw. hab ich vergessen?

    Greets
    Pascal



  • Vielleicht wird das Sampling-Format von der OSS-Implementierung Deines Soundkarten-Treibers nicht unterstützt.
    Es gibt ja extra ein ioctl()-Kommando, um die unterstützten Formate abzufragen:

    int fd, mask;
        ...
        if (ioctl(fd, SNDCTL_DSP_GETFMTS, &mask) == -1)
          printf("Can't get list of formats!\n");
        else
         {
          printf("Device supports:\n");
          if (mask & AFMT_MU_LAW)
            printf("  - u-law encoding\n");
          if (mask & AFMT_A_LAW)
            printf("  - a-law encoding\n");
          if (mask & AFMT_IMA_ADPCM)
            printf("  - ADPCM compression\n");
          if (mask & AFMT_U8)
            printf("  - unsigned 8 bit\n");
          if (mask & AFMT_S8)
            printf("  - signed 8 bit\n");
          if (mask & AFMT_S16_LE)
            printf("  - signed 16 bit (little endian)\n");
          if (mask & AFMT_S16_BE)
            printf("  - signed 16 bit (big endian)\n");
          if (mask & AFMT_U16_LE)
            printf("  - unsigned 16 bit (little endian)\n");
          if (mask & AFMT_U16_BE)
            printf("  - unsigned 16 bit (big endian)\n");
          if (mask & AFMT_MPEG)
            printf("  - MPEG-2-Audio encoding\n");
          if (mask & AFMT_AC3)
            printf("  - Dolby digital\n");
         }
    

Anmelden zum Antworten