fprintf(stderr, "%s: Probed successfully.\n", address);
reset_device(internal_dev_index); // Restarts it if it is held (ie., we just replaced a dead card).
+ if (global_audio_mixer) {
+ global_audio_mixer->trigger_state_changed_callback();
+ }
return ALSAPool::ProbeResult::SUCCESS;
}
+void ALSAPool::unplug_device(unsigned card_index, unsigned dev_index)
+{
+ char address[256];
+ snprintf(address, sizeof(address), "hw:%d,%d", card_index, dev_index);
+ for (unsigned i = 0; i < devices.size(); ++i) {
+ if (devices[i].state != Device::State::EMPTY &&
+ devices[i].state != Device::State::DEAD &&
+ devices[i].address == address) {
+ free_card(i);
+ }
+ }
+}
+
void ALSAPool::init()
{
thread(&ALSAPool::inotify_thread_func, this).detach();
if (sscanf(event->name, "pcmC%uD%u%c", &card, &device, &type) == 3 && type == 'c') {
if (event->mask & (IN_MOVED_FROM | IN_DELETE)) {
printf("Deleted capture device: Card %u, device %u\n", card, device);
- // TODO: Unplug.
+ unplug_device(card, device);
}
if (event->mask & (IN_MOVED_TO | IN_CREATE)) {
printf("Adding capture device: Card %u, device %u\n", card, device);
bool silence = (state != ALSAPool::Device::State::RUNNING);
while (!global_audio_mixer->silence_card(spec, silence))
;
+ global_audio_mixer->trigger_state_changed_callback();
}
unsigned ALSAPool::find_free_device_index(const string &name, const string &info, unsigned num_channels, const string &address)
while (!global_audio_mixer->silence_card(spec, true))
;
- lock_guard<mutex> lock(mu);
- if (devices[index].held) {
- devices[index].state = Device::State::DEAD;
- } else {
- devices[index].state = Device::State::EMPTY;
- inputs[index].reset();
- }
- while (!devices.empty() && devices.back().state == Device::State::EMPTY) {
- devices.pop_back();
- inputs.pop_back();
+ {
+ lock_guard<mutex> lock(mu);
+ if (devices[index].held) {
+ devices[index].state = Device::State::DEAD;
+ } else {
+ devices[index].state = Device::State::EMPTY;
+ inputs[index].reset();
+ }
+ while (!devices.empty() && devices.back().state == Device::State::EMPTY) {
+ devices.pop_back();
+ inputs.pop_back();
+ }
}
+
+ global_audio_mixer->trigger_state_changed_callback();
}