X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=alsa_pool.cpp;h=59ae595f029f8ba6cfef0d7aff12f88a97f61799;hb=ffd68fbfb90242069af957f2a28908f0559f8348;hp=3b6dd7ed3bcaab379accd31f26cd58e00e6de466;hpb=cf7b9ee186d4ef8e5da0531b75854c97b821be44;p=nageru diff --git a/alsa_pool.cpp b/alsa_pool.cpp index 3b6dd7e..59ae595 100644 --- a/alsa_pool.cpp +++ b/alsa_pool.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -41,7 +42,10 @@ ALSAPool::~ALSAPool() } should_quit = true; const uint64_t one = 1; - write(should_quit_fd, &one, sizeof(one)); + if (write(should_quit_fd, &one, sizeof(one)) != sizeof(one)) { + perror("write(should_quit_fd)"); + exit(1); + } inotify_thread.join(); while (retry_threads_running > 0) { @@ -131,6 +135,10 @@ void ALSAPool::probe_device_retry_thread_func(unsigned card_index, unsigned dev_ char address[256]; snprintf(address, sizeof(address), "hw:%d,%d", card_index, dev_index); + char thread_name[16]; + snprintf(thread_name, sizeof(thread_name), "Reprobe_hw:%d,%d", card_index, dev_index); + pthread_setname_np(pthread_self(), thread_name); + for ( ;; ) { // Termination condition within the loop. sleep(1); @@ -177,19 +185,24 @@ ALSAPool::ProbeResult ALSAPool::probe_device_once(unsigned card_index, unsigned } unique_ptr ctl_closer(ctl, snd_ctl_close); + snprintf(address, sizeof(address), "hw:%d,%d", card_index, dev_index); + snd_pcm_info_t *pcm_info; snd_pcm_info_alloca(&pcm_info); snd_pcm_info_set_device(pcm_info, dev_index); snd_pcm_info_set_subdevice(pcm_info, 0); snd_pcm_info_set_stream(pcm_info, SND_PCM_STREAM_CAPTURE); - if (snd_ctl_pcm_info(ctl, pcm_info) < 0) { + err = snd_ctl_pcm_info(ctl, pcm_info); + if (err == -ENOENT) { + // Not a capture card. + return ALSAPool::ProbeResult::FAILURE; + } + if (err < 0) { // Not available for capture. printf("%s: Not available for capture.\n", address); return ALSAPool::ProbeResult::DEFER; } - snprintf(address, sizeof(address), "hw:%d,%d", card_index, dev_index); - unsigned num_channels = 0; // Find all channel maps for this device, and pick out the one @@ -285,6 +298,8 @@ void ALSAPool::init() void ALSAPool::inotify_thread_func() { + pthread_setname_np(pthread_self(), "ALSA_Hotplug"); + int inotify_fd = inotify_init(); if (inotify_fd == -1) { perror("inotify_init()"); @@ -383,7 +398,7 @@ void ALSAPool::reset_device(unsigned index) inputs[index].reset(); } else { // TODO: Put on a background thread instead of locking? - auto callback = bind(&AudioMixer::add_audio, global_audio_mixer, DeviceSpec{InputSourceType::ALSA_INPUT, index}, _1, _2, _3, _4); + auto callback = bind(&AudioMixer::add_audio, global_audio_mixer, DeviceSpec{InputSourceType::ALSA_INPUT, index}, _1, _2, _3, _4, _5); inputs[index].reset(new ALSAInput(device->address.c_str(), OUTPUT_FREQUENCY, device->num_channels, callback, this, index)); inputs[index]->start_capture_thread(); }