X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=alsa_input.cpp;h=7230abeecd10839c8bcbb84c87a40d9c18115747;hb=e284d1c7a2e18ee7e4aea082c4a57a3504a0f5e8;hp=0d6901423b17085d65459708385a5fcb055218a4;hpb=f0dacf505189f0cadcd89a2b632000fd9d012bd2;p=nageru diff --git a/alsa_input.cpp b/alsa_input.cpp index 0d69014..7230abe 100644 --- a/alsa_input.cpp +++ b/alsa_input.cpp @@ -101,6 +101,7 @@ bool ALSAInput::open_device() default: assert(false); } + audio_format.sample_rate = sample_rate; //printf("num_periods=%u period_size=%u buffer_frames=%u sample_rate=%u bits_per_sample=%d\n", // num_periods, unsigned(period_size), unsigned(buffer_frames), sample_rate, audio_format.bits_per_sample); @@ -157,13 +158,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(); } @@ -173,17 +174,19 @@ 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)); + if (pcm_handle) { + WARN_ON_ERROR("snd_pcm_close()", snd_pcm_close(pcm_handle)); + } pcm_handle = nullptr; return; } @@ -205,7 +208,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; } } @@ -218,7 +221,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) { @@ -247,7 +250,7 @@ ALSAInput::CaptureEndReason ALSAInput::do_capture() const steady_clock::time_point now = steady_clock::now(); bool success; do { - if (should_quit) return CaptureEndReason::REQUESTED_QUIT; + 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;