]> git.sesse.net Git - nageru/blobdiff - nageru/theme.cpp
Make number of cards flexible at runtime.
[nageru] / nageru / theme.cpp
index 2bb9e807495e32a2d316ee5287a6f25b45208dc8..bb7613c9871e71df19db23feb39baccabf6ae993 100644 (file)
@@ -1466,8 +1466,8 @@ int Nageru_set_audio_bus_eq_level_db(lua_State *L)
        return 0;
 }
 
-Theme::Theme(const string &filename, const vector<string> &search_dirs, ResourcePool *resource_pool, unsigned num_cards)
-       : resource_pool(resource_pool), num_cards(num_cards), signal_to_card_mapping(global_flags.default_stream_mapping)
+Theme::Theme(const string &filename, const vector<string> &search_dirs, ResourcePool *resource_pool)
+       : resource_pool(resource_pool), signal_to_card_mapping(global_flags.default_stream_mapping)
 {
        // Defaults.
        channel_names[0] = "Live";
@@ -1748,8 +1748,8 @@ Theme::Chain Theme::get_chain(unsigned num, float t, unsigned width, unsigned he
 
        // TODO: Can we do better, e.g. by running setup_chain() and seeing what it references?
        // Actually, setup_chain does maybe hold all the references we need now anyway?
-       chain.input_frames.reserve(num_cards * FRAME_HISTORY_LENGTH);
-       for (unsigned card_index = 0; card_index < num_cards; ++card_index) {
+       chain.input_frames.reserve(MAX_VIDEO_CARDS * FRAME_HISTORY_LENGTH);
+       for (unsigned card_index = 0; card_index < MAX_VIDEO_CARDS; ++card_index) {
                for (unsigned frame_num = 0; frame_num < FRAME_HISTORY_LENGTH; ++frame_num) {
                        chain.input_frames.push_back(input_state.buffered_frames[card_index][frame_num].frame);
                }
@@ -1959,24 +1959,25 @@ int Theme::map_signal_to_card(int signal_num)
        }
 
        int card_index;
-       if (global_flags.output_card != -1 && num_cards > 1) {
+       if (global_flags.output_card != -1) {
                // Try to exclude the output card from the default card_index.
-               card_index = signal_num % (num_cards - 1);
+               card_index = signal_num % (global_flags.max_num_cards - 1);
                if (card_index >= global_flags.output_card) {
                         ++card_index;
                }
-               if (signal_num >= int(num_cards - 1)) {
+               if (signal_num >= int(global_flags.max_num_cards - 1)) {
                        print_warning(L, "Theme asked for input %d, but we only have %u input card(s) (card %d is busy with output).\n",
-                               signal_num, num_cards - 1, global_flags.output_card);
+                               signal_num, global_flags.max_num_cards - 1, global_flags.output_card);
                        fprintf(stderr, "Mapping to card %d instead.\n", card_index);
                }
        } else {
-               card_index = signal_num % num_cards;
-               if (signal_num >= int(num_cards)) {
-                       print_warning(L, "Theme asked for input %d, but we only have %u card(s).\n", signal_num, num_cards);
+               card_index = signal_num % global_flags.max_num_cards;
+               if (signal_num >= int(global_flags.max_num_cards)) {
+                       print_warning(L, "Theme asked for input %d, but we only have %u card(s).\n", signal_num, global_flags.max_num_cards);
                        fprintf(stderr, "Mapping to card %d instead.\n", card_index);
                }
        }
+       global_mixer->force_card_active(card_index);
        signal_to_card_mapping[signal_num] = card_index;
        return card_index;
 }
@@ -1984,7 +1985,7 @@ int Theme::map_signal_to_card(int signal_num)
 void Theme::set_signal_mapping(int signal_num, int card_idx)
 {
        lock_guard<mutex> lock(map_m);
-       assert(card_idx < int(num_cards));
+       assert(card_idx < MAX_VIDEO_CARDS);
        signal_to_card_mapping[signal_num] = card_idx;
 }