X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=alsa_input.h;h=4638e4bb802ff875dea5e48a59cb285fda852ff1;hb=e4c99b681aceb0d960f1d56acc9dafc83643854b;hp=07e8fe52e18dac164cdc6d967e92e3cf48fe1042;hpb=a0e27555696d0c63e3d89e31ca8f4292dcf40179;p=nageru diff --git a/alsa_input.h b/alsa_input.h index 07e8fe5..4638e4b 100644 --- a/alsa_input.h +++ b/alsa_input.h @@ -30,6 +30,11 @@ public: ALSAInput(const char *device, unsigned sample_rate, unsigned num_channels, audio_callback_t audio_callback, ALSAPool *parent_pool, unsigned internal_dev_index); ~ALSAInput(); + // If not called before start_capture_thread(), the capture thread + // will call it until it succeeds. + bool open_device(); + + // Not valid before the device has been successfully opened. // NOTE: Might very well be different from the sample rate given to the // constructor, since the card might not support the one you wanted. unsigned get_sample_rate() const { return sample_rate; } @@ -40,7 +45,13 @@ public: private: void capture_thread_func(); int64_t frames_to_pts(uint64_t n) const; - void die_on_error(const char *func_name, int err); + + enum class CaptureEndReason { + REQUESTED_QUIT, + DEVICE_GONE, + OTHER_ERROR + }; + CaptureEndReason do_capture(); std::string device; unsigned sample_rate, num_channels, num_periods; @@ -49,7 +60,7 @@ private: bmusb::AudioFormat audio_format; audio_callback_t audio_callback; - snd_pcm_t *pcm_handle; + snd_pcm_t *pcm_handle = nullptr; std::thread capture_thread; std::atomic should_quit{false}; std::unique_ptr buffer; @@ -173,7 +184,10 @@ private: // Must be called with held. Will allocate a new entry if needed. // The returned entry will be set to READY state. - unsigned find_free_device_index(); + unsigned find_free_device_index(const std::string &name, + const std::string &info, + unsigned num_channels, + const std::string &address); friend class ALSAInput; };