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

📄 haudio.c

📁 该压缩包为最新版htk的源代码,htk是现在比较流行的语音处理软件,请有兴趣的朋友下载使用
💻 C
📖 第 1 页 / 共 5 页
字号:
      ATransStatus trst;      APauseAudio(a->audio,a->tid,&trst,&st);      /*        AStopAudio(a->audio,a->tid,ASMThisTrans,&trst,&st);      */   }#endif#ifdef OSS_AUDIO   if (ioctl(audio_fd, SNDCTL_DSP_RESET, 0) < 0)      HError(6006, "StopAudi: error stopping OSS input audio port");#endif   a->isActive = ADS_STOPPED;   a->curVol = 0;}#ifdef MMAPI_AUDIOstatic int OutSamples(AudioOut a);static AudioOut sAudioOut=NULL;void CALLBACK callBackOut(HWAVE hwaveIn, UINT msg,                           DWORD magic, DWORD fullBufHdr, DWORD c){   AudioOut a;   mmApiBuf *p;   a = sAudioOut;   if (a==NULL || a->magic!=magic) return;   switch(msg) {   case MM_WOM_DONE:      for (p=a->pHead;p!=NULL;p=p->next)         if (p->index==a->current) break;      if (p!=NULL) a->total-=p->n;      if (p!=NULL && p->next!=NULL) a->current=p->next->index;      else a->current=-1; /* Done or fail */      break;   default:      break;   }}#endif/* InitAudo: initialise the given audio output device */static void InitAudo(AudioOut a, HTime *sampPeriod){#ifdef MMAPI_AUDIO   {      /* Initialise */      if (sAudioOut!=NULL)         HError(6006,"InitAudo: MMAPI audio output already in use");      sAudioOut=a;      a->total=0; a->current=-1; a->pHead=a->pTail=NULL;       a->magic=sMagic; sMagic+=12345;      /* Allocate special structures */      a->waveFmt = mmeAllocMem(sizeof(PCMWAVEFORMAT));      a->wavePos = mmeAllocMem(sizeof(MMTIME));      /* Set up required format */      a->waveFmt->wf.wFormatTag = WAVE_FORMAT_PCM;      a->waveFmt->wf.nChannels = 1;      if(*sampPeriod == 0.0){         *sampPeriod = 1.0E+07 / (float)16000;         a->waveFmt->wf.nSamplesPerSec = 16000;      }else         a->waveFmt->wf.nSamplesPerSec = 1.0E+07 / *sampPeriod;      a->waveFmt->wf.nBlockAlign = sizeof(short);      a->waveFmt->wf.nAvgBytesPerSec =          a->waveFmt->wf.nBlockAlign*a->waveFmt->wf.nSamplesPerSec;      a->waveFmt->wBitsPerSample = 16;      /* Set up position query */      a->wavePos->wType = TIME_SAMPLES;      /* Open wave device */      if ((a->mmError=waveOutOpen(&a->waveOut, WAVE_MAPPER,                                   (LPWAVEFORMAT)a->waveFmt, callBackOut, a->magic,                                  CALLBACK_FUNCTION))!=MMSYSERR_NOERROR)         HError(6006,"InitAudo: Cannot open MMAPI audio output [ERR=%d]",a->mmError);#ifdef DEC_AUDIO      if ((a->mmError=waveOutGetID(a->waveOut,                                    &a->waveOutDev))!=MMSYSERR_NOERROR)         HError(6006,"InitAudo: Cannot get MMAPI audio output device number [ERR=%d]",a->mmError);      /* Only needed with DEC API */      if (mmeCheckForCallbacks())         mmeProcessCallbacks();#endif      if (trace & T_AUD) {         printf(" Initialised MMAPI audio output at %.2fkHz\n",                a->waveFmt->wf.nSamplesPerSec*1E-3);         fflush(stdout);      }   }#endif#ifdef RS6000_AUDIO                               {      long sampRate;            a->evout = somGetGlobalEnvironment();      a->adevout = UMSBAUDDeviceNew();      if ((a->rc = UMSAudioDevice_open(a->adevout,a->evout,AUDIO_DEV,"PLAY",                                       UMSAudioDevice_BlockingIO))!=rOK)         HError(6006,"InitAudo: Cannot open RS6000 audio output device");      a->channels = 1;      a->bits  = 16 ;      if (*sampPeriod == 0.0){         UMSAudioDevice_get_sample_rate(a->adevout,a->evout,&sampRate);          *sampPeriod= 1.0E+07 / sampRate;                        }      else         sampRate = 1.0E+07 / *sampPeriod;      a->rc = UMSAudioDevice_set_sample_rate(a->adevout,a->evout,sampRate,&a->osamples);      a->rc = UMSAudioDevice_set_bits_per_sample(a->adevout,a->evout,a->bits);      a->rc = UMSAudioDevice_set_number_of_channels(a->adevout,a->evout,a->channels);      a->rc = UMSAudioDevice_set_audio_format_type(a->adevout,a->evout,"PCM");      a->rc = UMSAudioDevice_set_byte_order(a->adevout,a->evout,"MSB");      a->rc=UMSAudioDevice_set_number_format(a->adevout,a->evout,"TWOS COMPLEMENT");      a->rc = UMSAudioDevice_get_byte_order(a->adevout,a->evout,&a->obyte_order);      /* you have to free the string after the query */      if (a->obyte_order) free(a->obyte_order);      a->rc = UMSAudioDevice_set_balance(a->adevout,a->evout,0);      a->rc=UMSAudioDevice_set_time_format(a->adevout,a->evout,UMSAudioTypes_Samples);      a->lgain = 100; /*maximum left input gain*/      a->rgain = 100; /*maimum right input gain*/      if (lineOut)         strcpy(a->outConn, "LINE_OUT");      if (phonesOut)         strcpy(a->outConn, "LINE_OUT"); /* Don't have a phones out in RS6000 */      if (speakerOut)         strcpy(a->outConn, "INTERNAL_SPEAKER");      a->rc = UMSAudioDevice_enable_output(a->adevout,a->evout,a->outConn,                                           &a->lgain,&a->rgain);      a->rc = UMSAudioDevice_initialize(a->adevout,a->evout);   }#endif   #ifdef SGI_AUDIO   {      a->params[0] = AL_OUTPUT_RATE;      a->params[2] = AL_LEFT_SPEAKER_GAIN;      a->params[4] = AL_RIGHT_SPEAKER_GAIN;            ALgetparams(AL_DEFAULT_DEVICE, a->params, 6);      if (*sampPeriod == 0 )          *sampPeriod =  1.0E+07 / (float) a->params[1] + 0.5;      else {         a->params[1] = (long int) (1.0E+07 / *sampPeriod + 0.5);         ALsetparams(AL_DEFAULT_DEVICE,a->params,2);      }      a->config = ALnewconfig();      ALsetchannels(a->config, AL_MONO);      ALsetwidth(a->config, AL_SAMPLE_16);      if ((a->playPort = ALopenport("HAudio_output", "w", a->config)) == NULL)         HError(6006,"InitAudo: Cannot initialise SGI output audio port");   }#endif#ifdef SUN16_AUDIO   {      int f,g;            AUDIO_INITINFO(&a->audio_info);      if ((a->audio_ctld = open(AUDIO_IO, O_WRONLY + O_NDELAY)) < 0)          HError(6006,"InitAudo: Cannot open Sun audio output%s",                (errno==EBUSY?" [Already in use]":""));      if (ioctl(a->audio_ctld, AUDIO_GETINFO, &a->audio_info) < 0)         HError(6006,"InitAudo: Cannot interrogate Sun audio output");      if (*sampPeriod == 0 )         *sampPeriod = 1.0E+07 / (float) a->audio_info.play.sample_rate;      AUDIO_INITINFO(&a->audio_info);      f = (int) (1.0E+07 / *sampPeriod);      a->audio_info.play.sample_rate = f;      a->audio_info.play.channels = 1;      a->audio_info.play.precision = 16;      a->audio_info.play.balance = AUDIO_MID_BALANCE;      a->audio_info.play.encoding = AUDIO_ENCODING_LINEAR;      a->audio_info.play.port =          (lineOut?AUDIO_LINE_OUT:0)+         (speakerOut?AUDIO_SPEAKER:0)+         (phonesOut?AUDIO_HEADPHONE:0);      if (ioctl(a->audio_ctld, AUDIO_SETINFO, &a->audio_info) < 0) {         g = TrimSampFreq(f);         if (f==g)            HError(6006,"InitAudo: Cannot initialise Sun audio output [%d]",errno);         a->audio_info.play.sample_rate = g;         if (ioctl(a->audio_ctld, AUDIO_SETINFO, &a->audio_info) < 0)            HError(6006,"InitAudo: Cannot initialise Sun audio output [%d]",errno);         HError(-6006,"InitAudo: adjusting sampling frequency %d -> %d", f, g);      }      a->numSamples = a->numWrites = 0;   }#endif#ifdef HPUX_AUDIO   {      long st;      int i;      ATransStatus atst;      AudioAttributes *attr;      AudioAttrMask mask;            if (audio_dev==NULL)         audio_dev=AOpenAudio(NULL,&st);      else         st=AENoError;      a->audio=audio_dev;      audio_cnt++;      if (a->audio==NULL || st!=AENoError)         HError(6006,"InitAudo: Cannot open HP audio output ERR=%d",st);      ASetCloseDownMode(a->audio,AKeepTransactions,NULL);      a->attr=*ABestAudioAttributes(a->audio);      a->attr.type=ATSampled;      a->attr.attr.sampled_attr.data_format = ADFLin16;      a->attr.attr.sampled_attr.bits_per_sample = 16;      if (*sampPeriod == 0.0)         *sampPeriod= 1.0E+07 / a->attr.attr.sampled_attr.sampling_rate;      else         a->attr.attr.sampled_attr.sampling_rate = (long unsigned int) (1.0E+07 / *sampPeriod);      a->attr.attr.sampled_attr.channels = 1;      a->attr.attr.sampled_attr.interleave = 1;            i=0;      if (speakerOut) {         a->gains[i].u.o.out_ch = AOCTMono;         a->gains[i].gain = AUnityGain;         a->gains[i].u.o.out_dst = AODTMonoIntSpeaker;         i++;      }      if (phonesOut) {         a->gains[i].u.o.out_ch = AOCTMono;         a->gains[i].gain = AUnityGain;         a->gains[i].u.o.out_dst = AODTMonoHeadphone;         i++;      }      if (lineOut || i==0) {         a->gains[i].u.o.out_ch = AOCTMono;         a->gains[i].gain = AUnityGain;         a->gains[i].u.o.out_dst = AODTMonoJack;         i++;      }      a->parms.gain_matrix.type = AGMTOutput;      a->parms.gain_matrix.num_entries = i;      a->parms.gain_matrix.gain_entries = a->gains;      a->parms.play_volume = AUnityGain;      a->parms.priority = APriorityNormal;      a->parms.event_mask = 0;   }#endif#ifdef OSS_AUDIO   {      int f, g;      short *p;            if (audio_io==0) {         if ((audio_fd = open(AUDIO_DEV, O_WRONLY, 0)) < 0)            HError(6006, "InitAudo: Cannot open OSS audio device %s", AUDIO_DEV);         if ((mixer_fd = open(MIXER_DEV, O_WRONLY, 0)) < 0)            HError(6006, "InitAudo: unable to open OSS audio mixer %s", MIXER_DEV);         for (f=0, p=zero_buf; f<BUF_SIZE; f++, p++) *p=0;         f = 2;         if (ioctl(audio_fd, SNDCTL_DSP_SUBDIVIDE, &f) < 0)            HError(-6006, "InitAudo: error dividing buffer");      }      audio_io = audio_io | AUDIO_WR;      if (ioctl (audio_fd, SNDCTL_DSP_SYNC, NULL) < 0) {         HError(6006, "InitAudo: unable to sync audio device");      }           f = g = (IsVAXOrder ()) ? AFMT_S16_LE : AFMT_S16_BE;      if (ioctl(audio_fd, SNDCTL_DSP_SETFMT, &f) < 0)         HError(6006, "InitAudo: error setting sample format");      if (f != g)         HError(6006, "InitAudo: unable to set 16 bit sample format");      f = 0;      if (ioctl(audio_fd, SNDCTL_DSP_STEREO, &f) < 0)         HError(6006, "InitAudo: error setting audio channel");      f = g = (int) (1.0E+07 / (float) (*sampPeriod));      if (ioctl(audio_fd, SNDCTL_DSP_SPEED, &f)==-1)         HError(6006, "InitAudo: error setting sampling rate");      if (ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &audio_info) < 0)         HError(6006, "InitAudo: error getting fragment size");      frag_size = audio_info.fragsize / sizeof(short);      if (trace&T_AUD) {         printf("InitAudo: info.fragments   %d\n", audio_info.fragments);         printf("InitAudo: info.fragsize    %d\n", audio_info.fragsize);         printf("InitAudo: info.bytes       %d\n", audio_info.bytes);      }   }#endif#ifdef NO_AUDIO   *sampPeriod = 0.0;#endif   a->isActive = FALSE;}/* CloseAudo: close the given audio output device */static void CloseAudo(AudioOut a){#ifdef MMAPI_AUDIO    {      mmApiBuf *p;      while(a->current>=0) {#ifdef DEC_AUDIO         /* Only needed with DEC API */         mmeWaitForCallbacks();         mmeProcessCallbacks();#endif         if (OutSamples(a)==0) break;      }  /* Block until finished playing */      if((a->mmError=waveOutReset(a->waveOut))!=MMSYSERR_NOERROR)         HError(6006,"CloseAudo: Cannot reset MMAPI output audio device [ERR=%d]",a->mmError);      for(p=a->pHead;p!=NULL;p=p->next) {#ifdef WIN32_AUDIO         if((a->mmError=waveOutUnprepareHeader(a->waveOut, p->waveHdr,                                                sizeof(WAVEHDR))) != MMSYSERR_NOERROR)            HError(6006,"CloseAudo: MMAPI Header unpreparation failed [ERR=%d]",a->mmError);#endif         if (mmeFreeMem(p->waveHdr)!=TRUE)            HError(6006,"CloseAudo: MMAPI Header Free failed");         if (mmeFreeMem(p->waveData)!=TRUE)            HError(6006,"CloseAudo: MMAPI Data Free failed");         /* Note mmApiBufs will be freed with AudioOut structure */      }      a->pHead=a->pTail=NULL;      if((a->mmError=waveOutClose( a->waveOut )) != MMSYSERR_NOERROR)          HError(6006,"CloseAudo: Cannot close MMAPI output audio device [ERR=%d]",a->mmError);      if (mmeFreeMem(a->waveFmt)!=TRUE)         HError(6006,"CloseAudo: MMAPI wave foramt free failed");      if (mmeFreeBuffer(a->wavePos)!=TRUE)         HError(6006,"CloseAudo: MMAPI wave position free failed");#ifdef DEC_AUDIO      /* Only needed with DEC API */      if (mmeCheckForCallbacks())         mmeProcessCallbacks();#endif      if (trace & T_AUD) {         printf(" Closing MMAPI audio output\n");         fflush(stdout);      }      sAudioOut=NULL;   }#endif#ifdef RS6000_AUDIO        {      UMSAudioDevice_stop(a->adevout,a->evout);      UMSAudioDevice_close(a->adevout,a->evout);      _somFree(a->adevout);   }#endif   #ifdef SGI_AUDIO   {      ALfreeconfig(a->config);      ALcloseport(a->playPort);   }#endif#ifdef SUN16_AUDIO   {      close(a->audio_ctld);      a->audio_ctld=-1;   }#endif#ifdef HPUX_AUDIO   {      long st;      a->audio=NULL;      audio_cnt--;      if (audio_cnt<=0) {         ASetCloseDownMode(audio_dev,AKeepTransactions,NULL);         ACloseAudio(audio_dev,&st);         audio_cnt=0;audio_dev=NULL;      }   }#endif#ifdef OSS_AUDIO   {      if (audio_io&AUDIO_WR) {         audio_io^=AUDIO_WR;         if (audio_io==0) {            if (ioctl (audio_fd, SNDCTL_DSP_SYNC, NULL) < 0) {               HError(6006, "CloseAudo: unable to sync audio device");            }                 close(audio_fd);             close(mixer_fd);         }      }   }#endif   a->isActive = FALSE;}/* OutSamples: return num samples left to play in output device */static int OutSamples(AudioOut a){   if (!a->isActive) return 0;#ifdef MMAPI_AUDIO   {#ifdef DEC_AUDIO      /* Only needed with DEC API */      if (mmeCheckForCallbacks())         mmeProcessCallbacks();#endif      if (a->current<0) return(0);      if((a->mmError=waveOutGetPosition( a->waveOut, a->wavePos,                                         sizeof(MMTIME))) != MMSYSERR_NOERROR)          HError(6006,"OutSamples: Cannot get current play back position");      return(a->total - a->wavePos->u.sample);   }#endif#ifdef RS6000_AUDIO   {      long samps=0;            if ((a->rc=UMSAudioDevice_write_buff_used(a->adevout,a->evout,&samps))!=rOK){         if (a->rc==rUR)            samps=0; 

⌨️ 快捷键说明

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