8 #include <pa_ringbuffer.h>
10 #include <portaudio.h>
18 unsigned long frame_count,
19 const PaStreamCallbackTimeInfo* time_info,
20 PaStreamCallbackFlags status_flags,
29 Init(sample_rate, num_channels, bits_per_sample);
44 ring_buffer_size_t num_available_samples = 0;
46 num_available_samples =
55 num_available_samples = PaUtil_GetRingBufferReadAvailable(&
pa_ringbuffer_);
56 data->resize(num_available_samples);
57 ring_buffer_size_t num_read_samples = PaUtil_ReadRingBuffer(
59 if (num_read_samples != num_available_samples) {
60 std::cerr << num_available_samples <<
" samples were available, but "
61 <<
"only " << num_read_samples <<
" samples were read." <<
std::endl;
66 unsigned long frame_count,
67 const PaStreamCallbackTimeInfo* time_info,
68 PaStreamCallbackFlags status_flags) {
70 ring_buffer_size_t num_written_samples =
85 bool Init(
int sample_rate,
int num_channels,
int bits_per_sample) {
87 int ringbuffer_size = 16384;
89 PaUtil_AllocateMemory(bits_per_sample / 8 * ringbuffer_size));
96 ring_buffer_size_t rb_init_ans =
99 if (rb_init_ans == -1) {
105 PaError pa_init_ans = Pa_Initialize();
106 if (pa_init_ans != paNoError) {
107 std::cerr <<
"Fail to initialize PortAudio, error message is \""
108 << Pa_GetErrorText(pa_init_ans) <<
"\"" <<
std::endl;
113 if (bits_per_sample == 8) {
114 pa_open_ans = Pa_OpenDefaultStream(
115 &
pa_stream_, num_channels, 0, paUInt8, sample_rate,
117 }
else if (bits_per_sample == 16) {
118 pa_open_ans = Pa_OpenDefaultStream(
119 &
pa_stream_, num_channels, 0, paInt16, sample_rate,
121 }
else if (bits_per_sample == 32) {
122 pa_open_ans = Pa_OpenDefaultStream(
123 &
pa_stream_, num_channels, 0, paInt32, sample_rate,
126 std::cerr <<
"Unsupported BitsPerSample: " << bits_per_sample
130 if (pa_open_ans != paNoError) {
131 std::cerr <<
"Fail to open PortAudio stream, error message is \""
132 << Pa_GetErrorText(pa_open_ans) <<
"\"" <<
std::endl;
136 PaError pa_stream_start_ans = Pa_StartStream(
pa_stream_);
137 if (pa_stream_start_ans != paNoError) {
138 std::cerr <<
"Fail to start PortAudio stream, error message is \""
139 << Pa_GetErrorText(pa_stream_start_ans) <<
"\"" <<
std::endl;
164 unsigned long frame_count,
165 const PaStreamCallbackTimeInfo* time_info,
166 PaStreamCallbackFlags status_flags,
169 pa_wrapper->
Callback(input, output, frame_count, time_info, status_flags);
178 int main(
int argc,
char* argv[]) {
180 "Example that shows how to use Snowboy in C++. Parameters are\n"
181 "hard-coded in the parameter section. Please check the source code for\n"
182 "more details. Audio is captured by PortAudio.\n"
184 "To run the example:\n"
194 struct sigaction sig_int_handler;
196 sigemptyset(&sig_int_handler.sa_mask);
197 sig_int_handler.sa_flags = 0;
198 sigaction(SIGINT, &sig_int_handler, NULL);
205 std::string resource_filename =
"resources/common.res";
206 std::string model_filename =
"resources/snowboy.umdl";
208 float audio_gain = 1;
212 detector.SetSensitivity(sensitivity_str);
226 if (
data.size() != 0) {