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