Програмирование звука Linux ioctl() пример

#include <stdio.h>
#include <fcntl.h>
#include <sys/soundcard.h>

#define DSPDEVICE "/dev/dsp"

int main() {
  int dsp, rate, realr, stereo, reals, formats, format;

  dsp = open(DSPDEVICE,O_WRONLY,0);
  if(dsp==-1) {
   perror("open: " DSPDEVICE);
   exit(1);
  }

  realr=rate=11025;
  if(ioctl(dsp,SOUND_PCM_WRITE_RATE,&realr)==-1) {
   perror("ioctl(SOUND_PCM_WRITE_RATE): " DSPDEVICE);
   exit(1);
  }

  printf("NOTICE: I asked rate %i, and %i was set.\n",rate,realr);

  reals=stereo=1;
  if(ioctl(dsp,SNDCTL_DSP_STEREO,&reals)==-1) {
   perror("ioctl(SNDCTL_DSP_STEREO): " DSPDEVICE);
   exit(1);
  }

  printf("NOTICE: I asked %s, and %s was set.\n",
       stereo?"stereo":"mono",
       reals?"stereo":"mono");

  if(ioctl(dsp,SNDCTL_DSP_GETFMTS,&formats)==-1) {
   perror("ioctl(SNDCTL_DSP_GETFMTS): " DSPDEVICE);
   exit(1);
  }

  printf("NOTICE: Device support formats:\n%s%s%s%s%s%s%s%s%s%s",
   (formats&AFMT_MU_LAW)?"\tU-LAW\n":"",
   (formats&AFMT_A_LAW)?"\tA-LAW\n":"",
   (formats&AFMT_IMA_ADPCM)?"\tIMA-ADPCM\n":"",
   (formats&AFMT_U8)?"\tUnsigned-8\n":"",
   (formats&AFMT_S16_LE)?"\tSigned-16 (little-endian)\n":"",
   (formats&AFMT_S16_BE)?"\tSigned-16 (big-endian)\n":"",
   (formats&AFMT_S8)?"\tSigned-8\n":"",
   (formats&AFMT_U16_LE)?"\tUnsigned-16 (little-endian)\n":"",
   (formats&AFMT_U16_BE)?"\tUnsigned-16 (big-endian)\n":"",
   (formats&AFMT_MPEG)?"\tMPEG-2\n":"");

  format=0;
  if((formats&AFMT_S16_LE)!=0) {
   format=AFMT_S16_LE;

   if(ioctl(dsp,SNDCTL_DSP_SETFMT,&format)==-1) {
      perror("ioctl(SNDCTL_DSP_SETFMT): " DSPDEVICE);
      exit(1);
   }

   if(format==AFMT_S16_LE)
      printf("NOTICE: Signed 16-bit little-endian "
          "was set.\n");
   else {
      printf("STRANGE: Cannot set mode S16_LE :-(\n");
      format=0;
   }
  }

  if (!format && (formats&AFMT_U8)!=0) {
                format=AFMT_U8;

                if(ioctl(dsp,SNDCTL_DSP_SETFMT,&format)==-1) {
                        perror("ioctl(SNDCTL_DSP_SETFMT): " DSPDEVICE);
                        exit(1);
                }

                if(format==AFMT_U8)
                        printf("NOTICE: Unsigned 8-bit was set.\n");
   else
      printf("STRANGE: Cannot set mode U8 :-(\n");
  }

  close(dsp);
  return 0;
}

Добавить комментарий

Обратная связь

Интересуют вопросы реализации алгоритмов, программирования, выбора электроники и прочая информация, постараюсь осветить в отдельных статьях

пишите мне на netdm@mail.ru