#include #include PaStreamParameters param_in; PaStreamParameters param_out; static int cb_input(const void *in, void *out, unsigned long frames, const PaStreamCallbackTimeInfo *ti, PaStreamCallbackFlags flags, void *data) { float *pi = (float *) in; float *po = (float *) out; return 0; } static int cb_output(const void *in, void *out, unsigned long frames, const PaStreamCallbackTimeInfo *ti, PaStreamCallbackFlags flags, void *data) { float *pi = (float *) in; float *po = (float *) out; return 0; } int main(void) { const PaDeviceInfo *dev_info; PaStream *in_s; PaStream *out_s; PaError err; int num_devices; unsigned int ind; err = Pa_Initialize(); if (err != paNoError) printf("error: init: %s\n", Pa_GetErrorText(err)); printf("info: init\n"); num_devices = Pa_GetDeviceCount(); if (num_devices < 0) { printf("error: devicecount: %s\n", Pa_GetErrorText(num_devices)); goto END; } for (ind = 0; ind < num_devices; ++ind) { dev_info = Pa_GetDeviceInfo(ind); printf("info: device %u %s %u %u %f\n", ind, dev_info->name, dev_info->maxInputChannels, dev_info->maxOutputChannels, dev_info->defaultSampleRate); } param_in.channelCount = 2; param_in.device = 0; param_in.sampleFormat = paFloat32; param_in.suggestedLatency = Pa_GetDeviceInfo(0)->defaultLowInputLatency; printf("info: opening input stream\n"); err = Pa_OpenStream(&in_s, ¶m_in, 0, 44000.0, 1024, paNoFlag, cb_input, 0); if (err != paNoError) { printf("error: openstream: %s\n", Pa_GetErrorText(err)); goto END; } param_out.channelCount = 2; param_out.device = 0; param_out.sampleFormat = paFloat32; param_out.suggestedLatency = Pa_GetDeviceInfo(0)->defaultLowOutputLatency; printf("info: opening output stream\n"); err = Pa_OpenStream(&out_s, ¶m_out, 0, 44000.0, 1024, paNoFlag, cb_output, 0); if (err != paNoError) { printf("error: openstream: %s\n", Pa_GetErrorText(err)); goto END; } printf("info: starting input stream\n"); err = Pa_StartStream(in_s); if (err != paNoError) { printf("error: startstream: %s\n", Pa_GetErrorText(err)); goto END; } printf("info: starting output stream\n"); err = Pa_StartStream(out_s); if (err != paNoError) { printf("error: startstream: %s\n", Pa_GetErrorText(err)); goto END; } printf("info: running for two seconds\n"); Pa_Sleep(2 * 1000); printf("info: stopping input stream\n"); err = Pa_StopStream(in_s); if (err != paNoError) { printf("error: stopstream: %s\n", Pa_GetErrorText(err)); goto END; } printf("info: stopping output stream\n"); err = Pa_StopStream(out_s); if (err != paNoError) { printf("error: stopstream: %s\n", Pa_GetErrorText(err)); goto END; } END: err = Pa_Terminate(); if (err != paNoError) printf("error: terminate: %s\n", Pa_GetErrorText(err)); printf("info: terminated\n"); return 0; }