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