lock_guard<mutex> lock(audio_mutex);
// Pick out all the interesting channels from all the cards.
+ // TODO: If the card has been hotswapped, the number of channels
+ // might have changed; if so, we need to do some sort of remapping
+ // to silence.
for (unsigned card_index = 0; card_index < num_cards; ++card_index) {
AudioDevice *device = &cards[card_index];
if (!device->interesting_channels.empty()) {
return samples_out;
}
-vector<string> AudioMixer::get_names() const
+map<DeviceSpec, DeviceInfo> AudioMixer::get_devices() const
{
lock_guard<mutex> lock(audio_mutex);
- vector<string> names;
+ map<DeviceSpec, DeviceInfo> devices;
for (unsigned card_index = 0; card_index < num_cards; ++card_index) {
+ const DeviceSpec spec{ InputSourceType::CAPTURE_CARD, card_index };
const AudioDevice *device = &cards[card_index];
- names.push_back(device->name);
+ DeviceInfo info;
+ info.name = device->name;
+ info.num_channels = 8; // FIXME: This is wrong for fake cards.
+ devices.insert(make_pair(spec, info));
}
- return names;
+ return devices;
}
void AudioMixer::set_name(DeviceSpec device_spec, const string &name)
{
lock_guard<mutex> lock(audio_mutex);
- // FIXME: This needs to be keyed on DeviceSpec.
- map<unsigned, set<unsigned>> interesting_channels;
+ map<DeviceSpec, set<unsigned>> interesting_channels;
for (const InputMapping::Bus &bus : new_input_mapping.buses) {
if (bus.device.type == InputSourceType::CAPTURE_CARD) {
for (unsigned channel = 0; channel < 2; ++channel) {
if (bus.source_channel[channel] != -1) {
- interesting_channels[bus.device.index].insert(bus.source_channel[channel]);
+ interesting_channels[bus.device].insert(bus.source_channel[channel]);
}
}
}
// Reset resamplers for all cards that don't have the exact same state as before.
for (unsigned card_index = 0; card_index < num_cards; ++card_index) {
+ DeviceSpec device_spec{InputSourceType::CAPTURE_CARD, card_index};
AudioDevice *device = &cards[card_index];
- if (device->interesting_channels != interesting_channels[card_index]) {
- device->interesting_channels = interesting_channels[card_index];
+ if (device->interesting_channels != interesting_channels[device_spec]) {
+ device->interesting_channels = interesting_channels[device_spec];
reset_device_mutex_held(DeviceSpec{InputSourceType::CAPTURE_CARD, card_index});
}
}