#include <vector>
#include "bmusb/bmusb.h"
+#include "db.h"
#include "defs.h"
#include "filter.h"
#include "resampling_queue.h"
struct AudioFormat;
} // namespace bmusb
+enum class InputSourceType { SILENCE, CAPTURE_CARD };
+
+struct InputMapping {
+ struct Input {
+ std::string name;
+ InputSourceType input_source_type;
+ unsigned input_source_index;
+ int source_channel[2] { -1, -1 }; // Left and right. -1 = none.
+ };
+
+ std::vector<Input> inputs;
+};
+
class AudioMixer {
public:
AudioMixer(unsigned num_cards);
// See comments inside get_output().
void set_current_loudness(double level_lufs) { loudness_lufs = level_lufs; }
+ void set_fader_volume(unsigned card_index, float level_db) { cards[card_index].fader_volume_db = level_db; }
+ std::vector<std::string> get_names() const;
+ void set_name(unsigned card_index, const std::string &name);
+
+ void set_input_mapping(const InputMapping &input_mapping);
+ InputMapping get_input_mapping() const;
+
void set_locut_cutoff(float cutoff_hz)
{
locut_cutoff_hz = cutoff_hz;
{
std::unique_lock<std::mutex> lock(compressor_mutex);
final_makeup_gain_auto = false;
- final_makeup_gain = pow(10.0f, gain_db / 20.0f);
+ final_makeup_gain = from_db(gain_db);
}
float get_final_makeup_gain_db()
{
std::unique_lock<std::mutex> lock(compressor_mutex);
- return 20.0 * log10(final_makeup_gain);
+ return to_db(final_makeup_gain);
}
void set_final_makeup_gain_auto(bool enabled)
unsigned num_cards;
struct CaptureCard {
- std::mutex audio_mutex;
- std::unique_ptr<ResamplingQueue> resampling_queue; // Under audio_mutex.
- int64_t next_local_pts = 0; // Beginning of next frame, in TIMEBASE units. Under audio_mutex.
+ std::atomic<float> fader_volume_db{0.0f};
+
+ // Everything below audio_mutex is protected by it.
+ mutable std::mutex audio_mutex;
+ std::unique_ptr<ResamplingQueue> resampling_queue;
+ int64_t next_local_pts = 0;
+ std::string name;
};
CaptureCard cards[MAX_CARDS];
double final_makeup_gain = 1.0; // Under compressor_mutex. Read/write by the user. Note: Not in dB, we want the numeric precision so that we can change it slowly.
bool final_makeup_gain_auto = true; // Under compressor_mutex.
+
+ mutable std::mutex mapping_mutex;
+ InputMapping input_mapping; // Under mapping_mutex.
};
#endif // !defined(_AUDIO_MIXER_H)