X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fbackends%2Fportaudio%2Fportaudio_io.h;h=c67fdc1b19c5efbfa653c88b46d51f9076a80a26;hb=6298246a009c32784aa1d789c5887390d113c4f5;hp=532dc66df6db1f69375288e7a06cf8c2815a27fd;hpb=ced4378d0914bcfb926267772c45d1d23f3bed38;p=ardour.git diff --git a/libs/backends/portaudio/portaudio_io.h b/libs/backends/portaudio/portaudio_io.h index 532dc66df6..c67fdc1b19 100644 --- a/libs/backends/portaudio/portaudio_io.h +++ b/libs/backends/portaudio/portaudio_io.h @@ -35,28 +35,64 @@ public: PortAudioIO (void); ~PortAudioIO (void); - int state (void) const { return _state; } + enum StandardDevices { + DeviceNone = -2, + DeviceDefault = -1 + }; + + void host_api_list (std::vector&); + bool set_host_api (const std::string& host_api_name); + std::string get_host_api () const { return _host_api_name; } + PaHostApiTypeId get_current_host_api_type () const; + PaHostApiIndex get_host_api_index_from_name (const std::string& name); + + PaDeviceIndex get_default_input_device () const; + PaDeviceIndex get_default_output_device () const; + + bool update_devices(); + void input_device_list (std::map &devices) const; + void output_device_list (std::map &devices) const; + + int available_sample_rates (int device_id, std::vector& sample_rates); + int available_buffer_sizes (int device_id, std::vector& buffer_sizes); - void discover(); - void device_list (std::map &devices) const; +#ifdef WITH_ASIO + bool get_asio_buffer_properties (int device_id, + long& min_size_frames, + long& max_size_frames, + long& preferred_size_frames, + long& granularity); - int available_sample_rates (int device_id, std::vector& sampleRates); - int available_buffer_sizes (int device_id, std::vector& sampleRates); + bool get_asio_buffer_sizes(int device_id, + std::vector& buffer_size, + bool preferred_only); +#endif + std::string control_app_name (int device_id) const; + void launch_control_app (int device_id); - void pcm_stop (void); - int pcm_start (void); + PaErrorCode open_blocking_stream(int device_input, + int device_output, + double sample_rate, + uint32_t samples_per_period); - int pcm_setup ( - int device_input, - int device_output, - double sample_rate, - uint32_t samples_per_period - ); + PaErrorCode open_callback_stream(int device_input, + int device_output, + double sample_rate, + uint32_t samples_per_period, + PaStreamCallback* callback, + void* data); + + PaErrorCode start_stream(void); + + PaErrorCode close_stream(void); uint32_t n_playback_channels (void) const { return _playback_channels; } uint32_t n_capture_channels (void) const { return _capture_channels; } + std::string get_input_channel_name (int device_id, uint32_t channel) const; + std::string get_output_channel_name (int device_id, uint32_t channel) const; + double sample_rate (void) const { return _cur_sample_rate; } uint32_t capture_latency (void) const { return _cur_input_latency; } uint32_t playback_latency (void) const { return _cur_output_latency; } @@ -66,10 +102,40 @@ public: int get_capture_channel (uint32_t chn, float *input, uint32_t n_samples); int set_playback_channel (uint32_t chn, const float *input, uint32_t n_samples); -private: - int _state; - bool _initialized; + float* get_capture_buffer () { return _input_buffer; } + float* get_playback_buffer () { return _output_buffer; } + +private: // Methods + + static bool pa_initialize(); + static bool pa_deinitialize(); + static bool& pa_initialized(); + void clear_device_lists (); + void add_none_devices (); + void add_default_devices (); + void add_devices (); + std::string get_host_api_name_from_index (PaHostApiIndex index); + + bool get_output_stream_params(int device_output, + PaStreamParameters& outputParam) const; + bool get_input_stream_params(int device_input, + PaStreamParameters& inputParam) const; + + bool set_sample_rate_and_latency_from_stream(); + bool allocate_buffers_for_blocking_api (uint32_t samples_per_period); + + PaErrorCode pre_stream_open(int device_input, + PaStreamParameters& inputParam, + int device_output, + PaStreamParameters& outputParam); + + void reset_stream_dependents (); + + static void get_default_sample_rates(std::vector&); + static void get_default_buffer_sizes(std::vector&); + +private: // Data uint32_t _capture_channels; uint32_t _playback_channels; @@ -82,7 +148,6 @@ private: uint32_t _cur_input_latency; uint32_t _cur_output_latency; - struct paDevice { std::string name; uint32_t n_inputs; @@ -95,7 +160,12 @@ private: {} }; - std::map _devices; + std::map _input_devices; + std::map _output_devices; + + PaHostApiIndex _host_api_index; + std::string _host_api_name; + }; } // namespace