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

📄 haudio.c

📁 该压缩包为最新版htk的源代码,htk是现在比较流行的语音处理软件,请有兴趣的朋友下载使用
💻 C
📖 第 1 页 / 共 5 页
字号:
   ptr=GlobalFree(ptr);   return(TRUE);}void mmeProcessCallbacks(void){}void mmeWaitForCallbacks(void){}Boolean mmeCheckForCallbacks(void){   return(FALSE);}#endifstatic AudioIn sAudioIn=NULL;void CALLBACK callBackIn(HWAVE hwaveIn, UINT msg, DWORD magic,                          LPARAM param1, LPARAM param2){   AudioIn a;   LPWAVEHDR curHdr;   mmApiBuf *cur,*p,*r;   a = sAudioIn;   if (a==NULL || a->magic!=magic) return;   switch(msg) {   case MM_WIM_DATA:#ifdef WIN32_AUDIO      EnterCriticalSection(&a->c);#endif      curHdr=(LPWAVEHDR)param1;      if (a->qHead==NULL || a->qHead->index!=curHdr->dwUser) {         a->current=-1;    /* Buffer underran */      }      else {         cur=a->qHead;         if (cur->next==NULL) {            a->qHead=a->qTail=NULL;  /* Buffer about to underrun */         }         else {            /* Remove from head of queue */            cur->next->prev=NULL; a->qHead=cur->next;            cur->next->index=cur->index+1;         }         /* Set it up */         cur->cur=0; cur->n=curHdr->dwBytesRecorded/sizeof(short);         /* Add to tail of filled list */         if (a->fTail==NULL)            cur->next=cur->prev=NULL,a->fHead=a->fTail=cur;         else {            cur->prev=a->fTail; cur->next=NULL;            a->fTail->next=cur; a->fTail=cur;         }      }#ifdef WIN32_AUDIO      LeaveCriticalSection(&a->c);      SetEvent(a->callBackEvent);#endif      break;   default:      break;   }}#endif/* InitAudi: initialise the given audio input device */static void InitAudi(AudioIn a, HTime *sampPeriod){   if (a->isActive!=ADS_INIT) return;   if (trace&T_AUD) {      printf("Initialising Audio Input @%.0f\n",*sampPeriod);      fflush(stdout);   }#ifdef MMAPI_AUDIO    {      int i=0;      /* Initialise */      if (sAudioIn!=NULL)         HError(6006,"InitAudi: MMAPI audio input already in use");      sAudioIn=a;      a->current=-1; a->fHead=a->fTail=NULL; a->qHead=a->qTail=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;      a->bufSize = MMAPI_BUFFER_DURATION*a->waveFmt->wf.nAvgBytesPerSec;#ifdef WIN32_AUDIO      InitializeCriticalSection( &(a->c) );      a->callBackEvent = CreateEvent( NULL, TRUE, FALSE, "callBack" );#endif      if (trace & T_AUD) {         printf(" Initialised MMAPI audio input at %.2fkHz\n",                a->waveFmt->wf.nSamplesPerSec*1E-3);         fflush(stdout);      }   }#endif#ifdef RS6000_AUDIO   {      long sampRate;      a->evin = somGetGlobalEnvironment();      a->adevin = UMSBAUDDeviceNew();      if ((a->rc = UMSAudioDevice_open(a->adevin,a->evin,AUDIO_DEV,"RECORD",                                       UMSAudioDevice_BlockingIO))!=rOK)         HError(6006,"InitAudi: Cannot open RS6000 audio input device");             a->channels = 1 ;      a->bits  = 16 ;       if (*sampPeriod == 0.0){               UMSAudioDevice_get_sample_rate(a->adevin,a->evin,&sampRate);         *sampPeriod= 1.0E+07 / sampRate;                        }      else         sampRate = 1.0E+07 / *sampPeriod;      a->rc=UMSAudioDevice_set_sample_rate(a->adevin,a->evin,sampRate,&a->osamples);      a->rc=UMSAudioDevice_set_bits_per_sample(a->adevin,a->evin,a->bits);      a->rc=UMSAudioDevice_set_number_of_channels(a->adevin,a->evin,a->channels);      a->rc=UMSAudioDevice_set_audio_format_type(a->adevin,a->evin,"PCM");      a->rc=UMSAudioDevice_set_byte_order(a->adevin,a->evin,"MSB");      a->rc=UMSAudioDevice_set_number_format(a->adevin,a->evin,"TWOS COMPLEMENT");      a->rc = UMSAudioDevice_get_byte_order(a->adevin,a->evin,&a->obyte_order);      /* you have to free the string after the query */      if (a->obyte_order) free(a->obyte_order);      a->rc = UMSAudioDevice_set_volume(a->adevin,a->evin,100);      a->rc = UMSAudioDevice_set_balance(a->adevin,a->evin,0);      a->rc=UMSAudioDevice_set_time_format(a->adevin,a->evin,UMSAudioTypes_Samples);      a->lgain = 100; /*maximum left input gain*/      a->rgain = 100; /*maimum right input gain*/      if (micIn)         strcpy(a->inConn, "HIGH_GAIN_MIC");      else         strcpy(a->inConn, "LINE_IN");      a->rc = UMSAudioDevice_enable_input(a->adevin,a->evin,a->inConn,                                          &a->lgain,&a->rgain);      a->rc = UMSAudioDevice_set_monitor(a->adevin,a->evin,TRUE);      a->rc = UMSAudioDevice_initialize(a->adevin,a->evin);   }#endif#ifdef SGI_AUDIO   a->params[0] = AL_INPUT_RATE;   ALgetparams(AL_DEFAULT_DEVICE, a->params, 2);   if (*sampPeriod == 0.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);   ALsetqueuesize(a->config, a->params[1] * 5);#endif#ifdef SUN16_AUDIO   {      int f,g,i=0;            if ((a->audio_ctld = open(AUDIO_IO, O_RDONLY + O_NDELAY)) < 0)          HError(6006,"InitAudi: Cannot open Sun audio input%s",                (errno==EBUSY?" [Already in use]":""));      if (ioctl(a->audio_ctld, AUDIO_GETINFO, &a->audio_info) < 0)         HError(6006,"InitAudi: Cannot interrogate Sun audio input");      if (*sampPeriod == 0 )         *sampPeriod = 1.0E+07 / (float) a->audio_info.record.sample_rate;      AUDIO_INITINFO(&a->audio_info);      f = (int) (1.0E+07 / *sampPeriod);      a->audio_info.record.sample_rate = f;      a->audio_info.record.channels = 1;      a->audio_info.record.precision = 16;      a->audio_info.record.encoding = AUDIO_ENCODING_LINEAR;      a->audio_info.record.pause = 1;      a->audio_info.record.port =          (lineIn?AUDIO_LINE_IN:0)+         (micIn?AUDIO_MICROPHONE:0);      if (ioctl(a->audio_ctld, AUDIO_SETINFO, &a->audio_info) < 0) {         g = TrimSampFreq(f);         if (f==g)            HError(6006,"InitAudi: Cannot initialise Sun audio input");         a->audio_info.record.sample_rate = g;         if (ioctl(a->audio_ctld, AUDIO_SETINFO, &a->audio_info) < 0)            HError(6006,"InitAudi: Cannot initialise Sun audio input");         HError(-6006,"InitAudi: adjusting sampling frequency %d -> %d", f, g);      }      ioctl(a->audio_ctld, FIONBIO, &i);      ioctl(a->audio_ctld, I_FLUSH, FLUSHR);      a->numSamples=a->audio_info.record.samples;   }#endif#ifdef HPUX_AUDIO   {      long st;      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,"InitAudi: Cannot open HP audio input ERR=%d",st);      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;            a->gains[0].u.i.in_ch = AICTMono;      a->gains[0].gain = AUnityGain;      if (micIn)         a->gains[0].u.i.in_src = AISTMonoMicrophone;      if (lineIn)         a->gains[0].u.i.in_src = AISTMonoAuxiliary;            a->parms.gain_matrix.type = AGMTInput;      a->parms.gain_matrix.num_entries = 1;      a->parms.gain_matrix.gain_entries = a->gains;      a->parms.record_gain = AUnityGain;      a->parms.event_mask = 0;      a->parms.pause_first = True;            if ((a->socket = socket(AF_INET,SOCK_STREAM,0))<0)         HError(6006,"InitAudi: Cannot create HP audio socket");      mask=ASDataFormatMask|ASBitsPerSampleMask|ASSamplingRateMask|ASChannelsMask|         ASInterleaveMask;      a->tid = ARecordSStream(a->audio,mask,&a->attr,&a->parms,&a->stream,&st);      if (st!=0)         HError(6006,"InitAudi: Invalid HP audio parameters");      st=connect(a->socket,&a->stream.tcp_sockaddr,sizeof(struct sockaddr_in));   }#endif#ifdef OSS_AUDIO   {      int f, g;      short *p;            if (*sampPeriod==0) {         *sampPeriod = 1.0E+07 / 16000.0;      }      if (audio_io==0) {         if ((audio_fd = open(AUDIO_DEV, O_RDONLY, 0)) < 0)            HError(6006, "InitAudi: Cannot open OSS audio device %s", AUDIO_DEV);         if ((mixer_fd = open(MIXER_DEV, O_RDONLY, 0)) < 0)            HError(6006, "InitAudi: 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, "InitAudi: error dividing buffer");      }      audio_io = audio_io | AUDIO_RD;      if (ioctl(audio_fd, SNDCTL_DSP_RESET, 0)==-1)         HError(6006, "InitAudi: error resetting audio device");      f = g = (IsVAXOrder ()) ? AFMT_S16_LE : AFMT_S16_BE;      if (ioctl(audio_fd, SNDCTL_DSP_SETFMT, &f) < 0)         HError(6006, "InitAudi: error setting sample format");      if (f != g)         HError(6006, "InitAudi: unable to set 16 bit sample format");      f = 0;      if (ioctl(audio_fd, SNDCTL_DSP_STEREO, &f) < 0)         HError(6006, "InitAudi: error setting mono audio channel");      f = g = (int) (1.0E+07 / (float) (*sampPeriod));      if (ioctl(audio_fd, SNDCTL_DSP_SPEED, &f)==-1)         HError(6006, "InitAudi: error setting sampling rate");      if (ioctl(audio_fd, SNDCTL_DSP_GETISPACE, &audio_info) < 0)         HError(6006, "InitAudi: error getting fragment size");      frag_size = audio_info.fragsize / sizeof(short);      if (trace&T_AUD) {         printf("InitAudi: info.fragments   %d\n", audio_info.fragments);         printf("InitAudi: info.fragsize    %d\n", audio_info.fragsize);         printf("InitAudi: info.bytes       %d\n", audio_info.bytes);      }   }#endif#ifdef NO_AUDIO   *sampPeriod = 0.0;#endif   a->isActive = ADS_OPEN;}/* CloseAudi: close the given audio input device */static void CloseAudi(AudioIn a){   if (a->isActive<ADS_OPEN || a->isActive==ADS_CLOSED) return;   if (trace&T_AUD) {      printf("Closing Audio Input from %d\n",a->isActive);      fflush(stdout);   }#ifdef MMAPI_AUDIO   {      mmApiBuf *p;      #ifdef DEC_AUDIO      /* Only needed with DEC API */      if (mmeCheckForCallbacks())         mmeProcessCallbacks();#endif      for (p=a->fHead;p!=NULL;p=p->next) {#ifdef WIN32_AUDIO         if ((a->mmError=waveInUnprepareHeader(a->waveIn, p->waveHdr,                                               sizeof(WAVEHDR)))!=MMSYSERR_NOERROR)            HError(6006,"CloseAudi: Header Unpreparation failed");#endif         if (mmeFreeMem(p->waveHdr)!=TRUE)            HError(6006,"CloseAudi: MMAPI Header Free failed");         if (mmeFreeBuffer(p->waveData)!=TRUE)            HError(6006,"CloseAudi: MMAPI Data Free failed");         /* Note mmApiBufs will be freed with AudioOut structure */      }      if (mmeFreeMem(a->waveFmt)!=TRUE)         HError(6006,"CloseAudi: MMAPI wave foramt free failed");      if (mmeFreeBuffer(a->wavePos)!=TRUE)         HError(6006,"CloseAudi: MMAPI wave position free failed");#ifdef DEC_AUDIO      /* Only needed with DEC API */      if (mmeCheckForCallbacks())         mmeProcessCallbacks();#endif      if (a->isActive>ADS_SAMPLING)         if ((a->mmError = waveInClose(a->waveIn))!=MMSYSERR_NOERROR)            HError(6006,"StopAudi: Could not close MMAPI audio [ERR=%d]",a->mmError);      if (trace & T_AUD) {         printf(" Closing MMAPI audio input\n");         fflush(stdout);      }      sAudioIn=NULL;   }#endif#ifdef RS6000_AUDIO             if ((a->rc = UMSAudioDevice_close(a->adevin,a->evin))!=rOK)      HError(6006,"CloseAudi: Cannot close RS6000 audio device");   _somFree(a->adevin);#endif   #ifdef SGI_AUDIO   ALfreeconfig(a->config);#endif#ifdef SUN16_AUDIO   ioctl(a->audio_ctld, I_FLUSH, FLUSHR);   close(a->audio_ctld);   a->numSamples=a->audio_info.record.samples;   a->audio_ctld=-1;#endif#ifdef HPUX_AUDIO   {      long st;      ATransStatus trst;      close(a->socket);      AStopAudio(a->audio,a->tid,ASMThisTrans,&trst,&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_RD) {      audio_io^=AUDIO_RD;      if (audio_io==0) {         close(audio_fd);          close(mixer_fd);      }   }#endif   a->isActive = ADS_CLOSED;   a->curVol = 0.0;}/* InSamples: return number of bytes in audio device input buffer */static int InSamples(AudioIn a){   if (a->isActive!=ADS_SAMPLING) return(0);#ifdef MMAPI_AUDIO   {      mmApiBuf *p;      int inSamps;      #ifdef DEC_AUDIO      /* Only needed with DEC API */      if (mmeCheckForCallbacks())         mmeProcessCallbacks();#endif

⌨️ 快捷键说明

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