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

📄 haudio.c

📁 该压缩包为最新版htk的源代码,htk是现在比较流行的语音处理软件,请有兴趣的朋友下载使用
💻 C
📖 第 1 页 / 共 5 页
字号:
#ifdef WIN32_AUDIO      EnterCriticalSection(&(a->c));#endif      for (inSamps=0,p=a->fHead;p!=NULL;p=p->next) inSamps+=p->n;#ifdef WIN32_AUDIO      LeaveCriticalSection(&(a->c));#endif      return inSamps;   }#endif#ifdef RS6000_AUDIO   {      long samps;            samps=0;      if ((a->rc = UMSAudioDevice_read_buff_used(a->adevin,                                                  a->evin,&samps))!=rOK)         HError(6006,"InSamples: Error accessing RS6000 read buffer");      return ((int)samps);   }#endif#ifdef SGI_AUDIO   {      return ALgetfilled(a->recPort);   }#endif#ifdef SUN16_AUDIO   {      int bytes=0;            ioctl(a->audio_ctld, FIONREAD, &bytes);      return(bytes/2);   }#endif#ifdef HPUX_AUDIO   {      int bytes=0;            ioctl(a->socket, FIONREAD, &bytes);      return(bytes/2);   }#endif#ifdef OSS_AUDIO   {      if (ioctl(audio_fd, SNDCTL_DSP_GETISPACE, &audio_info)==-1)         HError(6006, "InSamples: unable to obtain OSS buffer info.");      return (audio_info.bytes)/sizeof(short);   }#endif#ifdef NO_AUDIO   return 0;#endif}/* EXPORT->GetCurrentVol: obtain volume of input source */float GetCurrentVol(AudioIn a){   return a->curVol;}/* EXPORT->SetAudioInput: query/set audio device input */int AudioDevInput(int *mask) {   int in = HA_IN_NONE;   if (mask==NULL) {      if (lineIn) in|=HA_IN_LINE;      if (micIn)  in|=HA_IN_MIC;   } else {      in=*mask;      micIn = ((in&HA_IN_MIC)?TRUE:FALSE);      lineIn = ((in&HA_IN_LINE)?TRUE:FALSE);   }   return in;}/* EXPORT->AudioDevOutput: query/set audio device output */int AudioDevOutput(int *mask) {   int out = HA_OUT_NONE;   if (mask==NULL) {      if (speakerOut) out|=HA_OUT_SPEAKER;      if (phonesOut)  out|=HA_OUT_PHONES;      if (lineOut)    out|=HA_OUT_LINE;   } else {      out=*mask;      speakerOut = ((out&HA_OUT_SPEAKER)?TRUE:FALSE);      phonesOut = ((out&HA_OUT_PHONES)?TRUE:FALSE);      lineOut = ((out&HA_OUT_LINE)?TRUE:FALSE);   }   return out;}/* ReadAudio: read nSamples from audio device into buf */static void ReadAudio(AudioIn a, short *buf, int nSamples){   int i;   if (a->isActive!=ADS_SAMPLING && a->isActive!=ADS_STOPPED) {       for (i=0; i<nSamples; i++) *buf++=0;      return;   }#ifdef MMAPI_AUDIO   {      mmApiBuf *cur;      int n,needed=nSamples;      short *s=buf;            if (trace & T_AUD) {         printf(" Reading %d samples from MMAPI audio input\n",nSamples);         fflush(stdout);      }      do {#ifdef WIN32_AUDIO         EnterCriticalSection(&a->c);#endif         while (a->fHead==NULL) {            if (needed<=0) break;            /* Need to wait for callback */#ifdef WIN32_AUDIO            LeaveCriticalSection(&a->c);            WaitForSingleObject(a->callBackEvent, INFINITE);            ResetEvent(a->callBackEvent);            EnterCriticalSection(&a->c);#endif#ifdef DEC_AUDIO            mmeWaitForCallbacks();            mmeProcessCallbacks();#endif         }         cur=a->fHead;#ifdef WIN32_AUDIO         /* Contents of fHead are not going to change */         LeaveCriticalSection(&a->c);#endif         if (cur==NULL || needed<=0) break; /* End or have enough already */         if (cur->n<needed) n=cur->n;         else n=needed;         memcpy(s,((short*)cur->waveData)+cur->cur,n*sizeof(short));         s+=n; cur->cur+=n; cur->n-=n; needed-=n;         if (cur->n<=0) {#ifdef WIN32_AUDIO            EnterCriticalSection(&a->c);#endif            /* Remove from filled list */            if (cur->next==NULL) {               a->fHead=a->fTail=NULL;  /* No more to process */            }            else {               a->fHead=cur->next; cur->next->prev=NULL;            }            /* Add to ready queue */            cur->index=-1;            if (a->qTail==NULL) {               cur->next=cur->prev=NULL;               a->qTail=a->qHead=cur;            }            else {               cur->next=NULL; cur->prev=a->qTail;               a->qTail->next=cur; a->qTail=cur;            }            /* This may be necessary */#ifdef WIN32_AUDIO            if ((a->mmError=waveInUnprepareHeader(a->waveIn, cur->waveHdr,                                                  sizeof(WAVEHDR)))!=MMSYSERR_NOERROR)               HError(6006,"CloseAudi: Header Unpreparation failed");#endif            cur->waveHdr->lpData = cur->waveData;            cur->waveHdr->dwBufferLength = cur->size;            cur->waveHdr->dwBytesRecorded = 0;            cur->waveHdr->dwUser = ++a->total;            cur->waveHdr->dwFlags = 0;            cur->waveHdr->dwLoops = 0;#ifdef WIN32_AUDIO            if ((a->mmError=waveInPrepareHeader(a->waveIn, cur->waveHdr,                                                sizeof(WAVEHDR)))!=MMSYSERR_NOERROR)               HError(6006,"CloseAudi: Header Preparation failed");#endif                        if ((a->mmError=waveInAddBuffer(a->waveIn, cur->waveHdr,                                            sizeof(WAVEHDR)))!=MMSYSERR_NOERROR)               HError(6006,"ReadAudio: Buffer addition failed");#ifdef WIN32_AUDIO            /* Contents of fHead are not going to change */            LeaveCriticalSection(&a->c);#endif         }      }      while(needed>0);   }#endif#ifdef RS6000_AUDIO   {      UMSAudioTypes_Buffer ainBuf;             /* NOTE, ainBuf stores internally as unsigned char hence cast below */      ainBuf._length = nSamples*sizeof(short);         ainBuf._maximum = nSamples*sizeof(short);      ainBuf._buffer = (unsigned char *)buf;      if ((a->rc=UMSAudioDevice_read(a->adevin,a->evin,&ainBuf,                                     nSamples,&(a->sw)))!=rOK)         HError(6006,"ReadAudio: Cannot read from RS6000 audio device");      if ((a->sw!=nSamples) && !stopSignalled)         HError(-6006,                "ReadAudio: Failed to read all %d samples from RS6000 audio",nSamples);   }#endif#ifdef SGI_AUDIO   ALreadsamps(a->recPort, buf, nSamples);#endif#ifdef SUN16_AUDIO   {      int i,n;      char *ptr;            n=nSamples*sizeof(short);ptr=(char*)buf;      do {         if ((i = read(a->audio_ctld,ptr,n)) <= 0)            break;         ptr+=i;         n-=i;      }      while (n!=0);      if (i<=0 && !stopSignalled)         HError(-6006,"ReadAudio: Failed to read all %d samples from Sun audio",                nSamples);      a->numSamples+=nSamples;   }#endif#ifdef HPUX_AUDIO   {      int n;      char *ptr;            n=nSamples*sizeof(short);ptr=(char*)buf;      do {         if ((i = read(a->socket,ptr,n)) <= 0) {            break;         }         ptr+=i;         n-=i;      }      while (n!=0);      if (i<=0 && !stopSignalled)         HError(-6006,"ReadAudio: Failed to read all %d samples from HP audio",                nSamples);      while(n>0) *ptr++=0,n--;   }#endif#ifdef OSS_AUDIO   {      int n;      char *ptr;            n = nSamples*sizeof(short); ptr=(char*)buf;      do {         if ((i = read(audio_fd, ptr, n)) <= 0) {            break;         }         ptr += i; n -= i;      } while (n!=0);      if (i<=0 && !stopSignalled)         HError(-6006, "ReadAudio: Failed to read all %d samples from OSS audio", nSamples);      while(n>0) *ptr++=0,n--;   }#endif   if (nSamples > 64)       a->curVol = CalcVolume(buf, nSamples);}/* StartAudi: start the audio input device sampling */static void StartAudi(AudioIn a){   a->curVol = 0;   if (a->isActive!=ADS_OPEN) return;   if (trace&T_AUD) {      printf("Starting Audio Input from %d\n",a->isActive);      fflush(stdout);   }#ifdef MMAPI_AUDIO   {      int i;      mmApiBuf *p;            if ((a->mmError=waveInOpen(NULL, WAVE_MAPPER, (LPWAVEFORMAT)a->waveFmt,                                 NULL,0,WAVE_FORMAT_QUERY))!=MMSYSERR_NOERROR)         HError(6006,"StartAudi: Requested data format is not supported [ERR=%d]",a->mmError);      if ((a->mmError=waveInOpen(&a->waveIn, WAVE_MAPPER,(LPWAVEFORMAT)a->waveFmt,                                 callBackIn,a->magic,CALLBACK_FUNCTION))!=MMSYSERR_NOERROR)         HError(6006,"StartAudi: Cannot open MMAPI audio input [ERR=%d]",a->mmError);            a->total=0;      for (i=0;i<MMAPI_BUFFER_COUNT;i++) {         /* Add new buffer to end of list */         p=New(a->mem,sizeof(mmApiBuf));         p->waveHdr = mmeAllocMem(sizeof(WAVEHDR));         p->cur=p->n=0; p->next=p->prev=NULL;                  p->size = a->bufSize;         p->waveData = mmeAllocBuffer(p->size);         if(p->waveData==NULL)            HError(6006,"StartAudi: Unable to allocate audio buffer");         p->index = -1; p->cur=-1; p->n=0;                  /* Set up header */         p->waveHdr->lpData = p->waveData;         p->waveHdr->dwBufferLength = p->size;         p->waveHdr->dwBytesRecorded = 0; /* Unused */         p->waveHdr->dwUser = ++a->total;         p->waveHdr->dwFlags = 0;         p->waveHdr->dwLoops = 0;#ifdef WIN32_AUDIO         if ((a->mmError=waveInPrepareHeader(a->waveIn, p->waveHdr,                                              sizeof(WAVEHDR)))!=MMSYSERR_NOERROR)            HError(6006,"StartAudi: Header preparation failed");#endif                  /* Add in */         if (a->qTail==NULL) a->qHead=a->qTail=p;         else a->qTail->next=p,p->prev=a->qTail,a->qTail=p;                  if ((a->mmError=waveInAddBuffer(a->waveIn, p->waveHdr,                                          sizeof(WAVEHDR)))!=MMSYSERR_NOERROR)            HError(6006,"StartAudi: Cannot add input buffer %d",a->mmError);      }            /* And record */      a->qHead->index=a->current=1;   #ifdef DEC_AUDIO      /* Only needed with DEC API */      if (mmeCheckForCallbacks())         mmeProcessCallbacks();#endif      if ((a->mmError=waveInStart( a->waveIn ))!=MMSYSERR_NOERROR)          HError(6006,"StartAudi: Cannot start MMAPI input audio port [ERR=%d]",a->mmError);#ifdef WIN32_AUDIO      ResetEvent(a->callBackEvent);#endif   }#endif#ifdef RS6000_AUDIO      {      if ((a->rc = UMSAudioDevice_start(a->adevin,a->evin))!=rOK)         HError(6006,"StartAudi: Cannot start RS6000 audio input device");   }#endif#ifdef SGI_AUDIO   {      if ((a->recPort=ALopenport("HAudio_input","r",a->config))==NULL)         HError(6006,"StartAudi: Cannot open SGI input audio port");   }#endif#ifdef SUN16_AUDIO   {      ioctl(a->audio_ctld, I_FLUSH, FLUSHR);      ioctl(a->audio_ctld, AUDIO_GETINFO, &a->audio_info);      a->audio_info.record.pause=0;      ioctl(a->audio_ctld, AUDIO_SETINFO, &a->audio_info);   }#endif#ifdef HPUX_AUDIO   {      long st;      ATransStatus trst;      AGetTransStatus(a->audio,a->tid,&trst,&st);            AResumeAudio(a->audio,a->tid,&trst,&st);   }#endif#ifdef OSS_AUDIO   {       short sample;            if (read(audio_fd, &sample, sizeof(short))!=sizeof(short))         HError(6006, "StartAudi: Unable to start OSS audio port");   }#endif   a->isActive = ADS_SAMPLING;}/* StopAudi: stop the audio input device sampling */static void StopAudi(AudioIn a){   if (a->isActive!=ADS_SAMPLING) return;   if (trace&T_AUD) {      printf("Stopping Audio Input from %d\n",a->isActive);      fflush(stdout);   }#ifdef MMAPI_AUDIO   {      if ((a->mmError=waveInStop(a->waveIn))!=MMSYSERR_NOERROR ||          (a->mmError=waveInReset(a->waveIn))!=MMSYSERR_NOERROR)         HError(6006,"StopAudi: Cannot stop MMAPI input audio port [ERR=%d]",a->mmError);   }#endif#ifdef RS6000_AUDIO            if ((a->rc = UMSAudioDevice_stop(a->adevin,a->evin))!=rOK)      HError(6006,"StopAudi: Cannot stop RS6000 audio input device");#endif#ifdef SGI_AUDIO   ALcloseport(a->recPort);#endif#ifdef SUN16_AUDIO   ioctl(a->audio_ctld, AUDIO_GETINFO, &a->audio_info);   a->audio_info.record.pause=1;   ioctl(a->audio_ctld, AUDIO_SETINFO, &a->audio_info);#endif#ifdef HPUX_AUDIO   {      long st;

⌨️ 快捷键说明

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