Update of /cvsroot/pure-data/pd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31408
Modified Files: Tag: desiredata s_audio_pa.c Log Message: cleanup
Index: s_audio_pa.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/s_audio_pa.c,v retrieving revision 1.4.4.7.2.5.2.2 retrieving revision 1.4.4.7.2.5.2.3 diff -C2 -d -r1.4.4.7.2.5.2.2 -r1.4.4.7.2.5.2.3 *** s_audio_pa.c 30 Jun 2007 20:28:14 -0000 1.4.4.7.2.5.2.2 --- s_audio_pa.c 30 Jul 2007 23:36:20 -0000 1.4.4.7.2.5.2.3 *************** *** 17,21 **** #include <errno.h>
- #ifdef MSW /* jmz thinks that we have to include: --- 17,20 ---- *************** *** 23,32 **** * on linux: <alloca.h> (might be true for osX too, no way to check right now...) */ ! # include <malloc.h> #else # include <alloca.h> #endif
- #ifdef MSW #include "pthread.h" /* for ETIMEDOUT */ --- 22,30 ---- * on linux: <alloca.h> (might be true for osX too, no way to check right now...) */ ! #zinclude <malloc.h> #else # include <alloca.h> #endif
#ifdef MSW #include "pthread.h" /* for ETIMEDOUT */ *************** *** 36,40 ****
/* portaudio's blocking api is not working, yet: */ ! /* #define PABLOCKING */
//#ifndef PABLOCKING --- 34,38 ----
/* portaudio's blocking api is not working, yet: */ ! /* #define PABLOCKING */
//#ifndef PABLOCKING *************** *** 48,103 **** static PaStreamCallback *pa_callback = NULL;
! int process (const void *input, void *output, unsigned long frameCount, ! const PaStreamCallbackTimeInfo* timeInfo, ! PaStreamCallbackFlags statusFlags, void *userData);
! int pa_open_audio(int inchans, int outchans, int rate, int advance, ! int indeviceno, int outdeviceno, int schedmode) ! { PaError err; int j, devno, pa_indev = -1, pa_outdev = -1; ! ! if (schedmode == 1) ! pa_callback = process; ! else ! pa_callback = NULL; ! ! sys_setscheduler(schedmode); ! ! /* Initialize PortAudio */ ! err = Pa_Initialize(); ! if ( err != paNoError ) ! { ! fprintf( stderr, ! "Error number %d occured initializing portaudio\n", ! err); ! fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); ! return (1); ! } ! ! /* post("in %d out %d rate %d device %d", inchans, outchans, rate, deviceno); */ ! if (inchans > MAX_PA_CHANS) ! { ! post("input channels reduced to maximum %d", MAX_PA_CHANS); ! inchans = MAX_PA_CHANS; ! } ! if (outchans > MAX_PA_CHANS) ! { ! post("output channels reduced to maximum %d", MAX_PA_CHANS); ! outchans = MAX_PA_CHANS; } ! ! if (inchans > 0) ! { ! for (j = 0, devno = 0; j < Pa_GetDeviceCount(); j++) ! { const PaDeviceInfo *info = Pa_GetDeviceInfo(j); ! int maxchans = info->maxInputChannels; ! if (maxchans > 0) ! { ! if (devno == indeviceno) ! { ! if (maxchans < inchans) ! inchans = maxchans; pa_indev = j; break; --- 46,74 ---- static PaStreamCallback *pa_callback = NULL;
! int process (const void *input, void *output, unsigned long frameCount, const PaStreamCallbackTimeInfo* timeInfo, ! PaStreamCallbackFlags statusFlags, void *userData);
! int pa_open_audio(int inchans, int outchans, int rate, int advance, int indeviceno, int outdeviceno, int schedmode) { PaError err; int j, devno, pa_indev = -1, pa_outdev = -1; ! pa_callback = schedmode==1 ? process : NULL; ! sys_setscheduler(schedmode); ! /* Initialize PortAudio */ ! err = Pa_Initialize(); ! if (err != paNoError) { ! fprintf(stderr, "Error number %d occured initializing portaudio\n", err); ! fprintf(stderr, "Error message: %s\n", Pa_GetErrorText(err)); ! return 1; } ! /* post("in %d out %d rate %d device %d", inchans, outchans, rate, deviceno); */ ! if ( inchans > MAX_PA_CHANS) {post( "input channels reduced to maximum %d", MAX_PA_CHANS); inchans = MAX_PA_CHANS;} ! if (outchans > MAX_PA_CHANS) {post("output channels reduced to maximum %d", MAX_PA_CHANS); outchans = MAX_PA_CHANS;} ! if (inchans > 0) { ! for (j = 0, devno = 0; j < Pa_GetDeviceCount(); j++) { const PaDeviceInfo *info = Pa_GetDeviceInfo(j); ! int maxchans = info->maxInputChannels; ! if (maxchans > 0) { ! if (devno == indeviceno) { ! if (maxchans < inchans) inchans = maxchans; pa_indev = j; break; *************** *** 107,123 **** } } ! ! if (outchans > 0) ! { ! for (j = 0, devno = 0; j < Pa_GetDeviceCount(); j++) ! { const PaDeviceInfo *info = Pa_GetDeviceInfo(j); ! int maxchans = info->maxOutputChannels; ! if (maxchans > 0) ! { ! if (devno == outdeviceno) ! { ! if (maxchans < outchans) ! outchans = maxchans; pa_outdev = j; break; --- 78,88 ---- } } ! if (outchans > 0) { ! for (j = 0, devno = 0; j < Pa_GetDeviceCount(); j++) { const PaDeviceInfo *info = Pa_GetDeviceInfo(j); ! int maxchans = info->maxOutputChannels; ! if (maxchans > 0) { ! if (devno == outdeviceno) { ! if (maxchans < outchans) outchans = maxchans; pa_outdev = j; break; *************** *** 127,299 **** } } ! ! if (sys_verbose) ! { ! post("input device %d, channels %d", pa_indev, inchans); post("output device %d, channels %d", pa_outdev, outchans); post("latency advance %d", advance); } ! if (inchans || outchans) ! { #ifndef PABLOCKING ! if (schedmode == 1) ! { #endif ! PaStreamParameters inputParameters, outputParameters; ! ! /* initialize input */ ! inputParameters.device = pa_indev ; ! inputParameters.channelCount = inchans; ! inputParameters.sampleFormat = paFloat32 | paNonInterleaved; ! inputParameters.suggestedLatency = advance * 0.001; ! inputParameters.hostApiSpecificStreamInfo = NULL; ! ! /* initialize output */ ! outputParameters.device = pa_outdev; ! outputParameters.channelCount = outchans; ! outputParameters.sampleFormat = paFloat32 | paNonInterleaved; ! outputParameters.suggestedLatency = advance * 0.001; ! outputParameters.hostApiSpecificStreamInfo = NULL; ! ! /* report to portaudio */ ! err = Pa_OpenStream(&pa_stream, ! ( (pa_indev != -1) ? &inputParameters : 0), ! ( (pa_outdev != -1) ? &outputParameters : 0), ! rate, ! sys_dacblocksize, ! paClipOff, /* tb: we should be faster ;-) */ ! pa_callback, NULL); ! ! if (err == paNoError) ! { ! const PaStreamInfo * streaminfo = Pa_GetStreamInfo (pa_stream); ! sys_schedadvance = 1e6 * streaminfo->outputLatency; ! } ! #ifndef PABLOCKING ! } ! else ! { ! int nbuffers = sys_advance_samples / sys_dacblocksize; ! err = PD_OpenAudioStream( &pablio_stream, rate, paFloat32, ! inchans, outchans, sys_dacblocksize, ! nbuffers, pa_indev, pa_outdev); ! } ! #endif } ! else ! err = 0; ! ! if ( err != paNoError ) ! { ! post("Error number %d occured opening portaudio stream\n", ! err); post("Error message: %s\n", Pa_GetErrorText( err ) ); Pa_Terminate(); sys_inchannels = sys_outchannels = 0; ! return (1); ! } ! else if (sys_verbose) ! post("... opened OK."); pa_inchans = inchans; pa_outchans = outchans; - #ifndef PABLOCKING ! if (schedmode) #endif ! err = Pa_StartStream(pa_stream); ! ! if ( err != paNoError ) ! { ! post("Error number %d occured starting portaudio stream\n", ! err); post("Error message: %s\n", Pa_GetErrorText(err)); Pa_Terminate(); sys_inchannels = sys_outchannels = 0; ! return (1); } ! ! post("successfully started"); ! ! return (0); }
- void sys_peakmeters(void); extern int sys_meters; /* true if we're metering */
int process (const void *input, void *output, unsigned long frameCount, ! const PaStreamCallbackTimeInfo* timeInfo, ! PaStreamCallbackFlags statusFlags, void *userData) ! { ! int i,j; ! int timeout = (float)frameCount / (float) sys_dacsr * 1e6; ! ! if (sys_timedlock(timeout) == ETIMEDOUT) ! /* we're late */ ! { ! post("timeout %d", timeout); ! sys_log_error(ERR_SYSLOCK); ! return 0; ! } ! for (j = 0; j < sys_inchannels; j++) ! { ! t_sample * in = ((t_sample**)input)[j]; ! copyvec(sys_soundin + j * sys_dacblocksize, ! in, ! sys_dacblocksize); ! } ! ! sched_tick(sys_time + sys_time_per_dsp_tick); ! ! for (j = 0; j < sys_outchannels; j++) ! { ! t_sample * out = ((t_sample**)output)[j]; ! copyvec(out, ! sys_soundout + j * sys_dacblocksize, ! sys_dacblocksize); ! } ! /* update peak meters */ ! if (sys_meters) ! sys_peakmeters(); ! ! /* clear the output buffer */ ! zerovec(sys_soundout, pa_outchans * sys_dacblocksize); ! ! sys_unlock(); ! return 0; }
! void pa_close_audio( void) ! { ! post("closing portaudio"); ! if (pa_inchans || pa_outchans) ! { ! if (pa_stream) ! { ! Pa_StopStream(pa_stream); ! Pa_CloseStream(pa_stream); ! pa_stream = NULL; ! } ! if (pablio_stream) ! { ! PD_CloseAudioStream(pablio_stream); ! pablio_stream = NULL; ! } } ! post("portaudio closed"); pa_inchans = pa_outchans = 0; }
- /* for blocked IO */ ! int pa_send_dacs(void) ! { #ifdef PABLOCKING /* tb: blocking IO isn't really working for v19 yet */ double timenow, timebefore; ! ! if ( (pa_inchans && Pa_GetStreamReadAvailable(pa_stream) ! < sys_dacblocksize*0.8) && (pa_outchans && Pa_GetStreamWriteAvailable(pa_stream) < sys_dacblocksize*0.8)) --- 92,209 ---- } } ! if (sys_verbose) { ! post( "input device %d, channels %d", pa_indev, inchans); post("output device %d, channels %d", pa_outdev, outchans); post("latency advance %d", advance); } ! if (inchans || outchans) { #ifndef PABLOCKING ! if (schedmode == 1) { #endif ! PaStreamParameters inputParameters, outputParameters; ! /* initialize input */ ! inputParameters.device = pa_indev ; ! inputParameters.channelCount = inchans; ! inputParameters.sampleFormat = paFloat32 | paNonInterleaved; ! inputParameters.suggestedLatency = advance * 0.001; ! inputParameters.hostApiSpecificStreamInfo = NULL; ! /* initialize output */ ! outputParameters.device = pa_outdev; ! outputParameters.channelCount = outchans; ! outputParameters.sampleFormat = paFloat32 | paNonInterleaved; ! outputParameters.suggestedLatency = advance * 0.001; ! outputParameters.hostApiSpecificStreamInfo = NULL; ! /* report to portaudio */ ! err = Pa_OpenStream(&pa_stream, ! ( pa_indev!=-1 ? &inputParameters : 0), ! (pa_outdev!=-1 ? &outputParameters : 0), ! rate, sys_dacblocksize, paClipOff, /* tb: we should be faster ;-) */ pa_callback, NULL); ! if (err == paNoError) { ! const PaStreamInfo * streaminfo = Pa_GetStreamInfo (pa_stream); ! sys_schedadvance = 1e6 * streaminfo->outputLatency; ! } #ifndef PABLOCKING ! } else { ! int nbuffers = sys_advance_samples / sys_dacblocksize; ! err = PD_OpenAudioStream( &pablio_stream, rate, paFloat32, ! inchans, outchans, sys_dacblocksize, nbuffers, pa_indev, pa_outdev); } ! #endif ! } else err = 0; ! if (err != paNoError) { ! post("Error number %d occured opening portaudio stream\n", err); post("Error message: %s\n", Pa_GetErrorText( err ) ); Pa_Terminate(); sys_inchannels = sys_outchannels = 0; ! return 1; ! } else if (sys_verbose) post("... opened OK."); pa_inchans = inchans; pa_outchans = outchans; #ifndef PABLOCKING ! if (schedmode) #endif ! err = Pa_StartStream(pa_stream); ! if (err != paNoError) { ! post("Error number %d occured starting portaudio stream\n", err); post("Error message: %s\n", Pa_GetErrorText(err)); Pa_Terminate(); sys_inchannels = sys_outchannels = 0; ! return 1; } ! post("successfully started"); ! return 0; }
void sys_peakmeters(void); extern int sys_meters; /* true if we're metering */
int process (const void *input, void *output, unsigned long frameCount, ! const PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags statusFlags, void *userData) { ! int i,j; ! int timeout = (float)frameCount / (float) sys_dacsr * 1e6; ! if (sys_timedlock(timeout) == ETIMEDOUT) /* we're late */ { ! post("timeout %d", timeout); ! sys_log_error(ERR_SYSLOCK); return 0; + } + for (j = 0; j < sys_inchannels; j++) { + t_sample * in = ((t_sample**)input)[j]; + copyvec(sys_soundin + j * sys_dacblocksize,in,sys_dacblocksize); + } + sched_tick(sys_time + sys_time_per_dsp_tick); + for (j = 0; j < sys_outchannels; j++) { + t_sample * out = ((t_sample**)output)[j]; + copyvec(out,sys_soundout + j * sys_dacblocksize,sys_dacblocksize); + } + /* update peak meters */ + if (sys_meters) sys_peakmeters(); + /* clear the output buffer */ + zerovec(sys_soundout, pa_outchans * sys_dacblocksize); + sys_unlock(); + return 0; }
! void pa_close_audio() { ! post("closing portaudio"); ! if (pa_inchans || pa_outchans) { ! if (pa_stream) { ! Pa_StopStream(pa_stream); ! Pa_CloseStream(pa_stream); ! pa_stream = NULL; } ! if (pablio_stream) { ! PD_CloseAudioStream(pablio_stream); ! pablio_stream = NULL; ! } ! } ! post("portaudio closed"); pa_inchans = pa_outchans = 0; }
/* for blocked IO */ ! int pa_send_dacs() { #ifdef PABLOCKING /* tb: blocking IO isn't really working for v19 yet */ double timenow, timebefore; ! if ((pa_inchans && Pa_GetStreamReadAvailable(pa_stream) < sys_dacblocksize*0.8) && (pa_outchans && Pa_GetStreamWriteAvailable(pa_stream) < sys_dacblocksize*0.8))