fix detecting .flac format
[ardour.git] / libs / backends / portaudio / portaudio_io.h
index fccda4f05e13f4e9d884ae035a554b5c1b8edc92..c67fdc1b19c5efbfa653c88b46d51f9076a80a26 100644 (file)
@@ -35,37 +35,64 @@ public:
        PortAudioIO (void);
        ~PortAudioIO (void);
 
-       int      state (void) const { return _state; }
-
-       bool     initialize_pa ();
+       enum StandardDevices {
+               DeviceNone = -2,
+               DeviceDefault = -1
+       };
 
-       void     host_api_list (std::vector<std::string>&);
-       void     set_host_api (const std::string& host_api_name);
+       void host_api_list (std::vector<std::string>&);
+       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 ();
-       PaDeviceIndex get_default_output_device ();
+       PaDeviceIndex get_default_input_device () const;
+       PaDeviceIndex get_default_output_device () const;
+
+       bool     update_devices();
+       void     input_device_list (std::map<int, std::string> &devices) const;
+       void     output_device_list (std::map<int, std::string> &devices) const;
+
+       int available_sample_rates (int device_id, std::vector<float>& sample_rates);
+       int available_buffer_sizes (int device_id, std::vector<uint32_t>& buffer_sizes);
 
-       void     discover();
-       void     device_list (std::map<int, std::string> &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<float>& sampleRates);
-       int      available_buffer_sizes (int device_id, std::vector<uint32_t>& sampleRates);
+       bool get_asio_buffer_sizes(int device_id,
+                                  std::vector<uint32_t>& 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; }
@@ -75,16 +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);
 
+       float* get_capture_buffer () { return _input_buffer; }
+       float* get_playback_buffer () { return _output_buffer; }
+
 private: // Methods
 
-       void clear_device_list ();
-       void add_default_device ();
+       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);
 
-private: // Data
-       int  _state;
-       bool _initialized;
+       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<float>&);
+       static void get_default_buffer_sizes(std::vector<uint32_t>&);
+
+private: // Data
        uint32_t _capture_channels;
        uint32_t _playback_channels;
 
@@ -109,9 +160,11 @@ private: // Data
                {}
        };
 
-       std::map<int, paDevice *> _devices;
+       std::map<int, paDevice *> _input_devices;
+       std::map<int, paDevice *> _output_devices;
 
        PaHostApiIndex _host_api_index;
+       std::string _host_api_name;
 
 };