27 AERROR <<
"an error occured while calling " << func_name;
29 AERROR <<
"error message: " << Pa_GetErrorText(
err);
34 Pa_CloseStream(pastream_ptr_);
35 delete input_parameters_ptr_;
39 int input_device_index, PaSampleFormat format) {
41 input_parameters_ptr_ =
new PaStreamParameters;
42 input_parameters_ptr_->device = input_device_index;
43 input_parameters_ptr_->channelCount = channels;
44 input_parameters_ptr_->sampleFormat = format;
45 input_parameters_ptr_->suggestedLatency =
46 Pa_GetDeviceInfo(input_parameters_ptr_->device)->defaultLowInputLatency;
47 input_parameters_ptr_->hostApiSpecificStreamInfo =
nullptr;
50 &pastream_ptr_, input_parameters_ptr_,
nullptr, rate, chunk,
53 if (
err != paNoError) {
56 err = Pa_StartStream(pastream_ptr_);
57 if (
err != paNoError) {
64 Pa_ReadStream(pastream_ptr_,
reinterpret_cast<void *
>(buffer), n_frames);
65 if (
err != paNoError) {
67 throw std::runtime_error(
"");
74 const std::shared_ptr<const MicrophoneConfig> µphone_config) {
76 AERROR <<
"Microphone driver only supports respeaker model in config file";
78 err = Pa_Initialize();
79 if (
err != paNoError) {
84 const PaDeviceIndex device_index = get_respeaker_index();
85 stream_ptr_.reset(
new Stream());
86 stream_ptr_->init_stream(
87 microphone_config->sample_rate(), microphone_config->channel_type_size(),
88 microphone_config->chunk(), device_index,
89 get_format_from_width(microphone_config->sample_width()));
92const PaSampleFormat Respeaker::get_format_from_width(
int width,
93 bool is_unsigned)
const {
96 return is_unsigned ? paUInt8 : paInt8;
106 AERROR <<
"invalid width: " << width;
110const PaDeviceIndex Respeaker::get_respeaker_index()
const {
112 const PaHostApiInfo *host_api_info = get_host_api_info(0);
113 const PaDeviceInfo *device_info =
nullptr;
114 PaDeviceIndex real_index;
115 for (PaDeviceIndex i = 0; i < host_api_info->deviceCount; ++i) {
116 real_index = host_api_device_index_to_device_index(0, i);
117 device_info = get_device_info(real_index);
118 if (std::string(device_info->name).find(
"ReSpeaker") != std::string::npos) {
122 AERROR <<
"respeaker device not found";
126const PaDeviceInfo *Respeaker::get_device_info(
127 const PaDeviceIndex index)
const {
128 const PaDeviceInfo *device_info =
129 reinterpret_cast<const PaDeviceInfo *
>(Pa_GetDeviceInfo(index));
131 AERROR <<
"internal error: invalid device index" << index;
137const PaDeviceIndex Respeaker::host_api_device_index_to_device_index(
138 const PaHostApiIndex host_api,
const int host_api_device_index)
const {
140 PaDeviceIndex device_index =
141 Pa_HostApiDeviceIndexToDeviceIndex(host_api, host_api_device_index);
142 if (device_index < 0) {
143 report_error(device_index,
"Pa_HostApiDeviceIndexToDeviceIndex");
148const PaHostApiInfo *Respeaker::get_host_api_info(
149 const PaHostApiIndex index)
const {
151 const PaHostApiInfo *pa_host_api_info =
152 reinterpret_cast<const PaHostApiInfo *
>(Pa_GetHostApiInfo(index));
153 if (!pa_host_api_info) {
154 AERROR <<
"internal error: invalid Host Api Index " << index;
156 return pa_host_api_info;
160 stream_ptr_->read_stream(n_frames, buffer);
void init(const std::shared_ptr< const MicrophoneConfig > µphone_config)
void read_stream(int n_frames, char *buffer) const
void read_stream(int n_frames, char *buffer) const
void init_stream(int rate, int channels, int chunk, int input_device_index, PaSampleFormat format)
void report_error(PaError err, const std::string &func_name)