2 * Copyright (C) 2015 Robin Gareus <robin@gareus.org>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 #ifndef __libbackend_portaudio_pcmio_h__
20 #define __libbackend_portaudio_pcmio_h__
25 #include <boost/shared_ptr.hpp>
29 #include <portaudio.h>
38 enum StandardDevices {
43 void host_api_list (std::vector<std::string>&);
44 bool set_host_api (const std::string& host_api_name);
45 std::string get_host_api () const { return _host_api_name; }
46 PaHostApiTypeId get_current_host_api_type () const;
47 PaHostApiIndex get_host_api_index_from_name (const std::string& name);
49 PaDeviceIndex get_default_input_device () const;
50 PaDeviceIndex get_default_output_device () const;
52 bool update_devices();
53 void input_device_list (std::map<int, std::string> &devices) const;
54 void output_device_list (std::map<int, std::string> &devices) const;
56 int available_sample_rates (int device_id, std::vector<float>& sample_rates);
57 int available_buffer_sizes (int device_id, std::vector<uint32_t>& buffer_sizes);
60 bool get_asio_buffer_properties (int device_id,
61 long& min_size_frames,
62 long& max_size_frames,
63 long& preferred_size_frames,
66 bool get_asio_buffer_sizes(int device_id,
67 std::vector<uint32_t>& buffer_size,
71 std::string control_app_name (int device_id) const;
72 void launch_control_app (int device_id);
74 PaErrorCode open_blocking_stream(int device_input,
77 uint32_t samples_per_period);
79 PaErrorCode open_callback_stream(int device_input,
82 uint32_t samples_per_period,
83 PaStreamCallback* callback,
86 PaErrorCode start_stream(void);
88 PaErrorCode close_stream(void);
90 uint32_t n_playback_channels (void) const { return _playback_channels; }
91 uint32_t n_capture_channels (void) const { return _capture_channels; }
93 std::string get_input_channel_name (int device_id, uint32_t channel) const;
94 std::string get_output_channel_name (int device_id, uint32_t channel) const;
96 double sample_rate (void) const { return _cur_sample_rate; }
97 uint32_t capture_latency (void) const { return _cur_input_latency; }
98 uint32_t playback_latency (void) const { return _cur_output_latency; }
99 double stream_time(void) const { if (_stream) return Pa_GetStreamTime (_stream); return 0; }
101 int next_cycle(uint32_t n_samples);
102 int get_capture_channel (uint32_t chn, float *input, uint32_t n_samples);
103 int set_playback_channel (uint32_t chn, const float *input, uint32_t n_samples);
105 float* get_capture_buffer () { return _input_buffer; }
106 float* get_playback_buffer () { return _output_buffer; }
110 static bool pa_initialize();
111 static bool pa_deinitialize();
112 static bool& pa_initialized();
114 void clear_device_lists ();
115 void add_none_devices ();
116 void add_default_devices ();
118 std::string get_host_api_name_from_index (PaHostApiIndex index);
120 bool get_output_stream_params(int device_output,
121 PaStreamParameters& outputParam) const;
122 bool get_input_stream_params(int device_input,
123 PaStreamParameters& inputParam) const;
125 bool set_sample_rate_and_latency_from_stream();
126 bool allocate_buffers_for_blocking_api (uint32_t samples_per_period);
128 PaErrorCode pre_stream_open(int device_input,
129 PaStreamParameters& inputParam,
131 PaStreamParameters& outputParam);
133 void reset_stream_dependents ();
135 static void get_default_sample_rates(std::vector<float>&);
136 static void get_default_buffer_sizes(std::vector<uint32_t>&);
139 uint32_t _capture_channels;
140 uint32_t _playback_channels;
144 float *_input_buffer;
145 float *_output_buffer;
147 double _cur_sample_rate;
148 uint32_t _cur_input_latency;
149 uint32_t _cur_output_latency;
156 paDevice (std::string n, uint32_t i, uint32_t o)
163 std::map<int, paDevice *> _input_devices;
164 std::map<int, paDevice *> _output_devices;
166 PaHostApiIndex _host_api_index;
167 std::string _host_api_name;
173 #endif /* __libbackend_portaudio_pcmio_h__ */