⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 audio_aix.c

📁 mpg123 是 MPEG 1.0/2.0/2.5 的实时播放软件
💻 C
字号:
/*	audio_aix.c: Driver for IBM RS/6000 with AIX Ultimedia Services	copyright ?-2006 by the mpg123 project - free software under the terms of the LGPL 2.1	see COPYING and AUTHORS files in distribution or http://mpg123.de	initially written by Juergen Schoew and Tomas Oegren*/#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <errno.h>#include <fcntl.h>#include <sys/audio.h>#include <stropts.h>#include <sys/types.h>#include <sys/file.h>#include <sys/stat.h>#include <sys/param.h>#include "config.h"#include "mpg123.h"/* use AUDIO_BSIZE to set the msec for audio buffering in Ultimedia library *//* #define AUDIO_BSIZE AUDIO_IGNORE */#define AUDIO_BSIZE 200int audio_rate_best_match(struct audio_info_struct *ai){  static long valid [ ] = {  5510,  6620,  8000,  9600, 11025, 16000, 18900,                            22050, 27420, 32000, 33075, 37800, 44100, 48000, 0 };  int  i = 0;  long best = 8000;  if(!ai || ai->fn < 0 || ai->rate < 0) {    return -1;  }   while (valid [i])  {    if (abs(valid[i] - ai->rate) < abs(best - ai->rate))    {      best = valid [i];    }    i = i + 1;  }  ai->rate = best;  return best;}int audio_open(struct audio_info_struct *ai){  audio_init ainit;  int ret;  if(!ai->device) {    if(getenv("AUDIODEV")) {      if(param.verbose > 1)          fprintf(stderr,"Using audio-device value from AUDIODEV environmentvariable!\n");      ai->device = getenv("AUDIODEV");      ai->fn = open(ai->device,O_WRONLY);    }    else {      ai->device = "/dev/paud0/1";                   /* paud0 for PCI */      ai->fn = open(ai->device,O_WRONLY);      if ((ai->fn == -1) & (errno == ENOENT)) {        ai->device = "/dev/baud0/1";                 /* baud0 for MCA */        ai->fn = open(ai->device,O_WRONLY);      }       }  } else ai->fn = open(ai->device,O_WRONLY);  if(ai->fn < 0){     fprintf(stderr,"Can't open audio device!\n");     return ai->fn;  }  /* Init to default values */  memset ( & ainit, '\0', sizeof (ainit));  ainit.srate            = 44100;  ainit.channels         = 2;  ainit.mode             = PCM;  ainit.bits_per_sample  = 16;  ainit.flags            = BIG_ENDIAN | TWOS_COMPLEMENT;  ainit.operation        = PLAY;  ainit.bsize            = AUDIO_BSIZE;   ret = ioctl (ai->fn, AUDIO_INIT, & ainit);  if (ret < 0)     return ret;  audio_reset_parameters(ai);  return ai->fn;}int audio_reset_parameters(struct audio_info_struct *ai){  audio_control  acontrol;  audio_change   achange;  audio_init     ainit;  int ret;  memset ( & achange, '\0', sizeof (achange));  memset ( & acontrol, '\0', sizeof (acontrol));    achange.balance        = 0x3fff0000;  achange.balance_delay  = 0;  achange.volume         = (long) (0x7fff << 16);  achange.volume_delay   = 0;  achange.input          = AUDIO_IGNORE;  if (ai->output == -1) achange.output = INTERNAL_SPEAKER;  else  achange.output      = 0;  if(ai->output & AUDIO_OUT_INTERNAL_SPEAKER)     achange.output     |= INTERNAL_SPEAKER;  if(ai->output & AUDIO_OUT_HEADPHONES)     achange.output     |= EXTERNAL_SPEAKER;  if(ai->output & AUDIO_OUT_LINE_OUT)     achange.output     |= OUTPUT_1;  if(ai->output == 0)     achange.output      = AUDIO_IGNORE;  achange.treble         = AUDIO_IGNORE;  achange.bass          = AUDIO_IGNORE;  achange.pitch          = AUDIO_IGNORE;  achange.monitor        = AUDIO_IGNORE;  achange.dev_info       = (char *) NULL;  acontrol.ioctl_request = AUDIO_CHANGE;  acontrol.position      = 0;  acontrol.request_info  = (char *) & achange;  ret = ioctl (ai->fn, AUDIO_CONTROL, & acontrol);  if (ret < 0)    return ret;  /* Init Device for new values */  if (ai->rate >0) {    memset ( & ainit, '\0', sizeof (ainit));    ainit.srate                 = audio_rate_best_match(ai);    if (ai->channels > 0)       ainit.channels          = ai->channels;    else      ainit.channels           = 1;    switch (ai->format) {      default :        ainit.mode             = PCM;        ainit.bits_per_sample  = 8;        ainit.flags            = BIG_ENDIAN | TWOS_COMPLEMENT;        break;      case AUDIO_FORMAT_SIGNED_16:        ainit.mode             = PCM;        ainit.bits_per_sample  = 16;        ainit.flags            = BIG_ENDIAN | TWOS_COMPLEMENT;        break;      case AUDIO_FORMAT_SIGNED_8:        ainit.mode             = PCM;        ainit.bits_per_sample  = 8;        ainit.flags            = BIG_ENDIAN | TWOS_COMPLEMENT;        break;      case AUDIO_FORMAT_UNSIGNED_16:        ainit.mode             = PCM;        ainit.bits_per_sample  = 16;        ainit.flags            = BIG_ENDIAN | TWOS_COMPLEMENT | SIGNED;        break;      case AUDIO_FORMAT_UNSIGNED_8:        ainit.mode             = PCM;        ainit.bits_per_sample  = 8;        ainit.flags            = BIG_ENDIAN | TWOS_COMPLEMENT | SIGNED;        break;      case AUDIO_FORMAT_ULAW_8:        ainit.mode             = MU_LAW;        ainit.bits_per_sample  = 8;        ainit.flags            = BIG_ENDIAN | TWOS_COMPLEMENT;        break;      case AUDIO_FORMAT_ALAW_8:        ainit.mode             = A_LAW;        ainit.bits_per_sample  = 8;        ainit.flags            = BIG_ENDIAN | TWOS_COMPLEMENT;        break;    }    ainit.operation            = PLAY;    ainit.bsize                = AUDIO_BSIZE;     ret = ioctl (ai->fn, AUDIO_INIT, & ainit);    if (ret < 0) {      fprintf(stderr,"Can't set new audio parameters!\n");      return ret;    }  }  acontrol.ioctl_request   = AUDIO_START;  acontrol.request_info    = NULL;  acontrol.position        = 0;  ret = ioctl (ai->fn, AUDIO_CONTROL, & acontrol);  if (ret < 0) {    fprintf(stderr,"Can't reset audio!\n");    return ret;  }  return 0;}int audio_get_formats(struct audio_info_struct *ai){/* ULTIMEDIA DOCUMENTATION SAYS:   The Ultimedia Audio Adapter supports fourteen sample rates you can use to   capture and playback audio data. The rates are (in kHz): 5.51, 6.62, 8.0,   9.6, 11.025, 16.0, 18.9, 22.050, 27.42, 32.0, 33.075, 37.8, 44.1, and 48.0.   These rates are supported for mono and stereo PCM (8- and 16-bit), mu-law,   and A-law. */  long rate;    rate = ai->rate;  audio_rate_best_match(ai);  if (ai->rate == rate)     return (AUDIO_FORMAT_SIGNED_16|AUDIO_FORMAT_UNSIGNED_16|             AUDIO_FORMAT_UNSIGNED_8|AUDIO_FORMAT_SIGNED_8|             AUDIO_FORMAT_ULAW_8|AUDIO_FORMAT_ALAW_8);  else    return 0;}int audio_play_samples(struct audio_info_struct *ai,unsigned char *buf,int len){    return write(ai->fn,buf,len);}int audio_close(struct audio_info_struct *ai){    audio_control acontrol;    audio_buffer  abuffer;    int           ret,i;    /* Don't close the audio-device until it's played all its contents */    memset ( & acontrol, '\0', sizeof ( acontrol ) );    acontrol.request_info = &abuffer;    acontrol.position = 0;    i=50;   /* Don't do this forever on a bad day :-) */    while (i-- > 0) {            if ((ioctl(ai->fn, AUDIO_BUFFER, &acontrol))< 0) {                    fprintf(stderr, "buffer read failed: %d\n", errno);                    break;            } else {                    if (abuffer.flags <= 0)                            break;            }            usleep(200000); /* sleep 0.2 sec */    }    memset ( & acontrol, '\0', sizeof ( acontrol ) );    acontrol.ioctl_request = AUDIO_STOP;    acontrol.request_info  = NULL;    acontrol.position      = 0;    ret = ioctl ( ai->fn, AUDIO_CONTROL, & acontrol );    if (ret < 0)       fprintf(stderr,"Can't close audio!\n");    ret = close (ai->fn);    if (ret < 0)      fprintf(stderr,"Can't close audio!\n");    return 0;}void audio_queueflush(struct audio_info_struct *ai){}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -