]> git.sesse.net Git - nageru/blobdiff - alsa_input.cpp
Update the queue length metric after trimming, not before.
[nageru] / alsa_input.cpp
index ff726f06f6002de1d992e471e57667c7fd004c0b..3b59c00b6139ebe6737e0e2122fab66195b3760a 100644 (file)
@@ -5,12 +5,14 @@
 #include <errno.h>
 #include <stdio.h>
 #include <unistd.h>
+#include <cstdint>
 
 #include "alsa_pool.h"
 #include "bmusb/bmusb.h"
 #include "timebase.h"
 
 using namespace std;
+using namespace std::chrono;
 using namespace std::placeholders;
 
 #define RETURN_ON_ERROR(msg, expr) do {                                                    \
@@ -155,13 +157,13 @@ ALSAInput::~ALSAInput()
 
 void ALSAInput::start_capture_thread()
 {
-       should_quit = false;
+       should_quit.unquit();
        capture_thread = thread(&ALSAInput::capture_thread_func, this);
 }
 
 void ALSAInput::stop_capture_thread()
 {
-       should_quit = true;
+       should_quit.quit();
        capture_thread.join();
 }
 
@@ -171,15 +173,15 @@ void ALSAInput::capture_thread_func()
 
        // If the device hasn't been opened already, we need to do so
        // before we can capture.
-       while (!should_quit && pcm_handle == nullptr) {
+       while (!should_quit.should_quit() && pcm_handle == nullptr) {
                if (!open_device()) {
                        fprintf(stderr, "[%s] Waiting one second and trying again...\n",
                                device.c_str());
-                       sleep(1);
+                       should_quit.sleep_for(seconds(1));
                }
        }
 
-       if (should_quit) {
+       if (should_quit.should_quit()) {
                // Don't call free_card(); that would be a deadlock.
                WARN_ON_ERROR("snd_pcm_close()", snd_pcm_close(pcm_handle));
                pcm_handle = nullptr;
@@ -203,7 +205,7 @@ void ALSAInput::capture_thread_func()
                        parent_pool->set_card_state(internal_dev_index, ALSAPool::Device::State::STARTING);
                        fprintf(stderr, "[%s] Sleeping one second and restarting capture...\n",
                                device.c_str());
-                       sleep(1);
+                       should_quit.sleep_for(seconds(1));
                        break;
                }
        }
@@ -216,7 +218,7 @@ ALSAInput::CaptureEndReason ALSAInput::do_capture()
        parent_pool->set_card_state(internal_dev_index, ALSAPool::Device::State::RUNNING);
 
        uint64_t num_frames_output = 0;
-       while (!should_quit) {
+       while (!should_quit.should_quit()) {
                int ret = snd_pcm_wait(pcm_handle, /*timeout=*/100);
                if (ret == 0) continue;  // Timeout.
                if (ret == -EPIPE) {
@@ -242,10 +244,11 @@ ALSAInput::CaptureEndReason ALSAInput::do_capture()
 
                const int64_t prev_pts = frames_to_pts(num_frames_output);
                const int64_t pts = frames_to_pts(num_frames_output + frames);
+               const steady_clock::time_point now = steady_clock::now();
                bool success;
                do {
-                       if (should_quit) return CaptureEndReason::REQUESTED_QUIT;
-                       success = audio_callback(buffer.get(), frames, audio_format, pts - prev_pts);
+                       if (should_quit.should_quit()) return CaptureEndReason::REQUESTED_QUIT;
+                       success = audio_callback(buffer.get(), frames, audio_format, pts - prev_pts, now);
                } while (!success);
                num_frames_output += frames;
        }