📄 haudio.c
字号:
#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 + -