void sys_close_audio(void) { if (sys_externalschedlib) { return; } if (!audio_isopen()) return; #ifdef USEAPI_PORTAUDIO if (sys_audioapiopened == API_PORTAUDIO) pa_close_audio(); else #endif #ifdef USEAPI_JACK if (sys_audioapiopened == API_JACK) jack_close_audio(); else #endif #ifdef USEAPI_OSS if (sys_audioapiopened == API_OSS) oss_close_audio(); else #endif #ifdef USEAPI_ALSA if (sys_audioapiopened == API_ALSA) alsa_close_audio(); else #endif #ifdef USEAPI_MMIO if (sys_audioapiopened == API_MMIO) mmio_close_audio(); else #endif #ifdef USEAPI_AUDIOUNIT if (sys_audioapiopened == API_AUDIOUNIT) audiounit_close_audio(); else #endif #ifdef USEAPI_ESD if (sys_audioapiopened == API_ESD) esd_close_audio(); else #endif #ifdef USEAPI_DUMMY if (sys_audioapiopened == API_DUMMY) dummy_close_audio(); else #endif post("sys_close_audio: unknown API %d", sys_audioapiopened); sys_inchannels = sys_outchannels = 0; sys_audioapiopened = -1; sched_set_using_audio(SCHED_AUDIO_NONE); audio_state = 0; audio_callback_is_open = 0; sys_vgui("set pd_whichapi 0\n"); }
void sys_close_audio(void) { if (!audio_isopen()) return; #ifdef USEAPI_PORTAUDIO if (sys_audioapi == API_PORTAUDIO) pa_close_audio(); else #endif #ifdef USEAPI_JACK if (sys_audioapi == API_JACK) jack_close_audio(); else #endif #ifdef USEAPI_OSS if (sys_audioapi == API_OSS) oss_close_audio(); else #endif #ifdef USEAPI_ALSA if (sys_audioapi == API_ALSA) alsa_close_audio(); else #endif #ifdef USEAPI_MMIO if (sys_audioapi == API_MMIO) mmio_close_audio(); else #endif #ifdef USEAPI_ROCKBOX if (sys_audioapi == API_ROCKBOX) rockbox_close_audio(); else #endif post("sys_close_audio: unknown API %d", sys_audioapi); sys_inchannels = sys_outchannels = 0; }
int pa_open_audio(int inchans, int outchans, int rate, t_sample *soundin, t_sample *soundout, int framesperbuf, int nbuffers, int indeviceno, int outdeviceno, t_audiocallback callbackfn) { PaError err; int j, devno, pa_indev = -1, pa_outdev = -1; pa_callback = callbackfn; /* fprintf(stderr, "open callback %d\n", (callbackfn != 0)); */ pa_init(); /* post("in %d out %d rate %d device %d", inchans, outchans, rate, deviceno); */ if (pa_stream) pa_close_audio(); if (inchans > 0) { for (j = 0, devno = 0; j < Pa_GetDeviceCount(); j++) { const PaDeviceInfo *info = Pa_GetDeviceInfo(j); if (info->maxInputChannels > 0) { if (devno == indeviceno) { if (inchans > info->maxInputChannels) inchans = info->maxInputChannels; pa_indev = j; break; } devno++; } } } if (outchans > 0) { for (j = 0, devno = 0; j < Pa_GetDeviceCount(); j++) { const PaDeviceInfo *info = Pa_GetDeviceInfo(j); if (info->maxOutputChannels > 0) { if (devno == outdeviceno) { if (outchans > info->maxOutputChannels) outchans = info->maxOutputChannels; pa_outdev = j; break; } devno++; } } } if (inchans > 0 && pa_indev == -1) inchans = 0; if (outchans > 0 && pa_outdev == -1) outchans = 0; if (sys_verbose) { post("input device %d, channels %d", pa_indev, inchans); post("output device %d, channels %d", pa_outdev, outchans); post("framesperbuf %d, nbufs %d", framesperbuf, nbuffers); } pa_inchans = sys_inchannels = inchans; pa_outchans = sys_outchannels = outchans; pa_soundin = soundin; pa_soundout = soundout; if (pa_inbuf) free(pa_inbuf), pa_inbuf = 0; if (pa_outbuf) free(pa_outbuf), pa_outbuf = 0; if (! inchans && !outchans) return (0); if (callbackfn) { pa_callback = callbackfn; err = pa_open_callback(rate, inchans, outchans, framesperbuf, nbuffers, pa_indev, pa_outdev, pa_lowlevel_callback); } else { if (pa_inchans) { pa_inbuf = malloc(nbuffers*framesperbuf*pa_inchans*sizeof(float)); sys_ringbuf_Init(&pa_inring, nbuffers*framesperbuf*pa_inchans*sizeof(float), pa_inbuf, nbuffers*framesperbuf*pa_inchans*sizeof(float)); } if (pa_outchans) { pa_outbuf = malloc(nbuffers*framesperbuf*pa_outchans*sizeof(float)); sys_ringbuf_Init(&pa_outring, nbuffers*framesperbuf*pa_outchans*sizeof(float), pa_outbuf, 0); } err = pa_open_callback(rate, inchans, outchans, framesperbuf, nbuffers, pa_indev, pa_outdev, pa_fifo_callback); } if ( err != paNoError ) { fprintf(stderr, "Error number %d opening portaudio stream\n", err); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); Pa_Terminate(); return (1); } else if (sys_verbose) post("... opened OK."); return (0); }
PaError pa_open_callback(double sampleRate, int inchannels, int outchannels, int framesperbuf, int nbuffers, int indeviceno, int outdeviceno, PaStreamCallback *callbackfn) { long bytesPerSample; PaError err; PaStreamParameters instreamparams, outstreamparams; PaStreamParameters*p_instreamparams=0, *p_outstreamparams=0; /* fprintf(stderr, "nchan %d, flags %d, bufs %d, framesperbuf %d\n", nchannels, flags, nbuffers, framesperbuf); */ instreamparams.device = indeviceno; instreamparams.channelCount = inchannels; instreamparams.sampleFormat = paFloat32; instreamparams.suggestedLatency = 0; /* was nbuffers*framesperbuf/sampleRate */ instreamparams.hostApiSpecificStreamInfo = 0; outstreamparams.device = outdeviceno; outstreamparams.channelCount = outchannels; outstreamparams.sampleFormat = paFloat32; outstreamparams.suggestedLatency = 0; outstreamparams.hostApiSpecificStreamInfo = 0; if(inchannels>0 && indeviceno >= 0) p_instreamparams=&instreamparams; if(outchannels>0 && outdeviceno >= 0) p_outstreamparams=&outstreamparams; err=Pa_IsFormatSupported(p_instreamparams, p_outstreamparams, sampleRate); if (paFormatIsSupported != err) { /* check whether we have to change the numbers of channel and/or samplerate */ const PaDeviceInfo* info = 0; double inRate=0, outRate=0; if (inchannels>0) { if (NULL != (info = Pa_GetDeviceInfo( instreamparams.device ))) { inRate=info->defaultSampleRate; if(info->maxInputChannels<inchannels) instreamparams.channelCount=info->maxInputChannels; } } if (outchannels>0) { if (NULL != (info = Pa_GetDeviceInfo( outstreamparams.device ))) { outRate=info->defaultSampleRate; if(info->maxOutputChannels<outchannels) outstreamparams.channelCount=info->maxOutputChannels; } } if (err == paInvalidSampleRate) { sampleRate=outRate; } err=Pa_IsFormatSupported(p_instreamparams, p_outstreamparams, sampleRate); if (paFormatIsSupported != err) goto error; } err = Pa_OpenStream( &pa_stream, p_instreamparams, p_outstreamparams, sampleRate, framesperbuf, paNoFlag, /* portaudio will clip for us */ callbackfn, 0); if (err != paNoError) goto error; err = Pa_StartStream(pa_stream); if (err != paNoError) { fprintf(stderr, "Pa_StartStream failed; closing audio stream...\n"); pa_close_audio(); goto error; } sys_dacsr=sampleRate; return paNoError; error: pa_stream = NULL; return err; }