]> git.sesse.net Git - nageru/blobdiff - nageru/alsa_pool.cpp
When the delay analyzer wants audio from an ALSA card, temporarily auto-enable captur...
[nageru] / nageru / alsa_pool.cpp
index 3092dc32335551deed1b2b7b2255c07b7e9a19db..4e12bb75349750d57d2e2ff1b72e43a1def841ce 100644 (file)
@@ -44,7 +44,7 @@ ALSAPool::~ALSAPool()
        const uint64_t one = 1;
        if (write(should_quit_fd, &one, sizeof(one)) != sizeof(one)) {
                perror("write(should_quit_fd)");
-               exit(1);
+               abort();
        }
        inotify_thread.join();
 
@@ -53,11 +53,13 @@ ALSAPool::~ALSAPool()
        }
 }
 
-std::vector<ALSAPool::Device> ALSAPool::get_devices()
+std::vector<ALSAPool::Device> ALSAPool::get_devices(bool hold_devices)
 {
        lock_guard<mutex> lock(mu);
-       for (Device &device : devices) {
-               device.held = true;
+       if (hold_devices) {
+               for (Device &device : devices) {
+                       device.held = true;
+               }
        }
        return devices;
 }
@@ -77,6 +79,16 @@ void ALSAPool::release_device(unsigned index)
        }
 }
 
+bool ALSAPool::device_is_held(unsigned index)
+{
+       lock_guard<mutex> lock(mu);
+       if (index < devices.size()) {
+               return devices[index].held;
+       } else {
+               return false;
+       }
+}
+
 void ALSAPool::enumerate_devices()
 {
        // Enumerate all cards.
@@ -402,7 +414,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, _5);
+               auto callback = bind(&AudioMixer::add_audio, global_audio_mixer, DeviceSpec{InputSourceType::ALSA_INPUT, index}, _1, _2, _3, _4);
                inputs[index].reset(new ALSAInput(device->address.c_str(), OUTPUT_FREQUENCY, device->num_channels, callback, this, index));
                inputs[index]->start_capture_thread();
        }