FP Perception 0.1.2
Loading...
Searching...
No Matches
utils.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <portaudio.h>
4#include <string>
5#include <sstream>
6#include <cmath>
7#include <rclcpp/rclcpp.hpp>
9
10namespace fp_perception
11{
22inline std::string getHostApiName(PaHostApiIndex host_api_index)
23{
24 const PaHostApiInfo* host_api_info = Pa_GetHostApiInfo(host_api_index);
25 return host_api_info && host_api_info->name ? host_api_info->name : "unknown";
26}
27
28inline std::string describePortAudioDevice(int device_id)
29{
30 const PaDeviceInfo* device_info = Pa_GetDeviceInfo(device_id);
31 if (!device_info)
32 return "PortAudio device " + std::to_string(device_id) + ": <null>";
33
34 std::ostringstream out;
35 out << "PortAudio device " << device_id << " ['" << (device_info->name ? device_info->name : "unknown") << "']"
36 << " host_api='" << getHostApiName(device_info->hostApi) << "'"
37 << " max_input=" << device_info->maxInputChannels << " max_output=" << device_info->maxOutputChannels
38 << " default_sample_rate=" << static_cast<int>(std::lround(device_info->defaultSampleRate))
39 << " low_input_latency=" << device_info->defaultLowInputLatency
40 << " low_output_latency=" << device_info->defaultLowOutputLatency;
41
42 return out.str();
43}
44
45template <typename LoggerT>
46inline void logPortAudioDevices(const LoggerT& logger)
47{
48 const int num_devices = Pa_GetDeviceCount();
49 if (num_devices < 0)
50 {
51 RCLCPP_WARN(logger, "PortAudio device enumeration failed: %s", Pa_GetErrorText(num_devices));
52 return;
53 }
54
55 RCLCPP_INFO(logger, "PortAudio device count: %d", num_devices);
56 for (int i = 0; i < num_devices; ++i)
57 {
58 const auto description = describePortAudioDevice(i);
59 RCLCPP_INFO(logger, "%s", description.c_str());
60 }
61}
62
63inline int getDeviceIdByName(const std::string& target_name)
64{
65 int num_devices = Pa_GetDeviceCount();
66 if (num_devices < 0)
67 throw fp_perception::fp_perception_exception("No PortAudio devices found");
68
69 for (int i = 0; i < num_devices; ++i)
70 {
71 const PaDeviceInfo* device_info = Pa_GetDeviceInfo(i);
72 if (device_info && std::string(device_info->name).find(target_name) != std::string::npos)
73 {
74 return i;
75 }
76 }
77
78 throw fp_perception::fp_perception_exception("Device with name \"" + target_name + "\" not found");
79}
80} // namespace fp_perception
Definition audio_buffer.hpp:16
int getDeviceIdByName(const std::string &target_name)
Definition utils.hpp:63
std::string describePortAudioDevice(int device_id)
Definition utils.hpp:28
void logPortAudioDevices(const LoggerT &logger)
Definition utils.hpp:46
std::string getHostApiName(PaHostApiIndex host_api_index)
Get the device ID by name.
Definition utils.hpp:22
Base class for driver exceptions.
Definition exceptions.hpp:14