int snd_open_stream() { int samplerate; char info_buf[256]; PaDeviceIndex pa_dev_id; PaStreamParameters pa_params; PaError pa_err; const PaDeviceInfo *pa_dev_info; if(cfg.audio.dev_count == 0) { print_info("ERROR: no sound device with input channels found", 1); return 1; } buf_size = PA_FRAMES * 2; framepacket_size = PA_FRAMES * cfg.audio.channel; pa_pcm_buf = (short*)malloc(buf_size * sizeof(short)); encode_buf = (char*)malloc(buf_size * sizeof(char)); rb_init(&rec_rb, 16 * buf_size * sizeof(short)); rb_init(&stream_rb, 16 * buf_size * sizeof(short)); samplerate = cfg.audio.samplerate; pa_dev_id = cfg.audio.pcm_list[cfg.audio.dev_num]->dev_id; pa_dev_info = Pa_GetDeviceInfo(pa_dev_id); if(pa_dev_info == NULL) { snprintf(info_buf, 127, "Error getting device Info (%d)", pa_dev_id); print_info(info_buf, 1); return 1; } pa_params.device = pa_dev_id; pa_params.channelCount = cfg.audio.channel; pa_params.sampleFormat = paInt16; pa_params.suggestedLatency = pa_dev_info->defaultHighInputLatency; pa_params.hostApiSpecificStreamInfo = NULL; pa_err = Pa_IsFormatSupported(&pa_params, NULL, samplerate); if(pa_err != paFormatIsSupported) { if(pa_err == paInvalidSampleRate) { snprintf(info_buf, sizeof(info_buf), "Samplerate not supported: %dHz\n" "Using default samplerate: %dHz", samplerate, (int)pa_dev_info->defaultSampleRate); print_info(info_buf, 1); if(Pa_IsFormatSupported(&pa_params, NULL, pa_dev_info->defaultSampleRate) != paFormatIsSupported) { print_info("FAILED", 1); return 1; } else { samplerate = (int)pa_dev_info->defaultSampleRate; cfg.audio.samplerate = samplerate; cfg.rec.samplerate = samplerate; update_samplerates(); } } else { snprintf(info_buf, sizeof(info_buf), "PA: Format not supported: %s\n", Pa_GetErrorText(pa_err)); print_info(info_buf, 1); return 1; } } pa_err = Pa_OpenStream(&stream, &pa_params, NULL, samplerate, PA_FRAMES, paNoFlag, snd_callback, NULL); if(pa_err != paNoError) { printf("error opening sound device: \n%s\n", Pa_GetErrorText(pa_err)); return 1; } Pa_StartStream(stream); return 0; }
int snd_open_stream(void) { int samplerate; char info_buf[256]; PaDeviceIndex pa_dev_id; PaStreamParameters pa_params; PaError pa_err; const PaDeviceInfo *pa_dev_info; if(cfg.audio.dev_count == 0) { print_info(_("ERROR: no sound device with input channels found"), 1); return 1; } pa_frames = (cfg.audio.buffer_ms/1000.0)*cfg.audio.samplerate; snd_reset_samplerate_conv(SND_STREAM); snd_reset_samplerate_conv(SND_REC); framepacket_size = pa_frames * cfg.audio.channel; pa_pcm_buf = (short*)malloc(16 * framepacket_size * sizeof(short)); encode_buf = (char*)malloc(16 * framepacket_size * sizeof(char)); rb_init(&rec_rb, 16 * framepacket_size * sizeof(short)); rb_init(&stream_rb, 16 * framepacket_size * sizeof(short)); samplerate = cfg.audio.samplerate; pa_dev_id = cfg.audio.pcm_list[cfg.audio.dev_num]->dev_id; pa_dev_info = Pa_GetDeviceInfo(pa_dev_id); if(pa_dev_info == NULL) { snprintf(info_buf, 127, _("Error getting device Info (%d)"), pa_dev_id); print_info(info_buf, 1); return 1; } pa_params.device = pa_dev_id; pa_params.channelCount = cfg.audio.channel; pa_params.sampleFormat = paInt16; pa_params.suggestedLatency = pa_dev_info->defaultHighInputLatency; pa_params.hostApiSpecificStreamInfo = NULL; pa_err = Pa_IsFormatSupported(&pa_params, NULL, samplerate); if(pa_err != paFormatIsSupported) { if(pa_err == paInvalidSampleRate) { snprintf(info_buf, sizeof(info_buf), _("Samplerate not supported: %dHz\n" "Using default samplerate: %dHz"), samplerate, (int)pa_dev_info->defaultSampleRate); print_info(info_buf, 1); if(Pa_IsFormatSupported(&pa_params, NULL, pa_dev_info->defaultSampleRate) != paFormatIsSupported) { print_info(_("PA: Format not supported"), 1); return 1; } else { samplerate = (int)pa_dev_info->defaultSampleRate; cfg.audio.samplerate = samplerate; update_samplerates(); } } else { snprintf(info_buf, sizeof(info_buf), _("PA: Format not supported: %s\n"), Pa_GetErrorText(pa_err)); print_info(info_buf, 1); return 1; } } pa_err = Pa_OpenStream(&stream, &pa_params, NULL, samplerate, pa_frames, paNoFlag, snd_callback, NULL); if(pa_err != paNoError) { printf(_("error opening sound device: \n%s\n"), Pa_GetErrorText(pa_err)); return 1; } stream_buf = new char[16 * pa_frames*2 * sizeof(short)]; record_buf = new char[16 * pa_frames*2 * sizeof(short)]; dsp = new DSPEffects(pa_frames, cfg.audio.channel, samplerate); Pa_StartStream(stream); return 0; }