X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=theme.cpp;h=0c74a8b88c76b1acdb0b779440371c7f51eef0c8;hb=adaeecd2ab8f1da45169861b7af22a0c7af066be;hp=001930019187478ff19c57e79bbc9dc7dbf0cf86;hpb=d62349fd118e89b16adfc5478c73cd8e10136364;p=nageru diff --git a/theme.cpp b/theme.cpp index 0019300..0c74a8b 100644 --- a/theme.cpp +++ b/theme.cpp @@ -89,7 +89,7 @@ int wrap_lua_object(lua_State* L, const char *class_name, Args&&... args) { // Construct the C++ object and put it on the stack. void *mem = lua_newuserdata(L, sizeof(T)); - new(mem) T(std::forward(args)...); + new(mem) T(forward(args)...); // Look up the metatable named , and set it on the new object. luaL_getmetatable(L, class_name); @@ -111,7 +111,7 @@ int wrap_lua_object_nonowned(lua_State* L, const char *class_name, Args&&... arg { // Construct the pointer ot the C++ object and put it on the stack. T **obj = (T **)lua_newuserdata(L, sizeof(T *)); - *obj = new T(std::forward(args)...); + *obj = new T(forward(args)...); // Look up the metatable named , and set it on the new object. luaL_getmetatable(L, class_name); @@ -157,11 +157,11 @@ bool checkbool(lua_State* L, int idx) return lua_toboolean(L, idx); } -std::string checkstdstring(lua_State *L, int index) +string checkstdstring(lua_State *L, int index) { size_t len; const char* cstr = lua_tolstring(L, index, &len); - return std::string(cstr, len); + return string(cstr, len); } int EffectChain_new(lua_State* L) @@ -284,7 +284,7 @@ int LiveInputWrapper_connect_signal(lua_State* L) int ImageInput_new(lua_State* L) { assert(lua_gettop(L) == 1); - std::string filename = checkstdstring(L, 1); + string filename = checkstdstring(L, 1); return wrap_lua_object_nonowned(L, "ImageInput", filename); } @@ -384,7 +384,7 @@ int Effect_set_float(lua_State *L) { assert(lua_gettop(L) == 3); Effect *effect = (Effect *)get_effect(L, 1); - std::string key = checkstdstring(L, 2); + string key = checkstdstring(L, 2); float value = luaL_checknumber(L, 3); if (!effect->set_float(key, value)) { luaL_error(L, "Effect refused set_float(\"%s\", %d) (invalid key?)", key.c_str(), int(value)); @@ -396,7 +396,7 @@ int Effect_set_int(lua_State *L) { assert(lua_gettop(L) == 3); Effect *effect = (Effect *)get_effect(L, 1); - std::string key = checkstdstring(L, 2); + string key = checkstdstring(L, 2); float value = luaL_checknumber(L, 3); if (!effect->set_int(key, value)) { luaL_error(L, "Effect refused set_int(\"%s\", %d) (invalid key?)", key.c_str(), int(value)); @@ -408,7 +408,7 @@ int Effect_set_vec3(lua_State *L) { assert(lua_gettop(L) == 5); Effect *effect = (Effect *)get_effect(L, 1); - std::string key = checkstdstring(L, 2); + string key = checkstdstring(L, 2); float v[3]; v[0] = luaL_checknumber(L, 3); v[1] = luaL_checknumber(L, 4); @@ -424,7 +424,7 @@ int Effect_set_vec4(lua_State *L) { assert(lua_gettop(L) == 6); Effect *effect = (Effect *)get_effect(L, 1); - std::string key = checkstdstring(L, 2); + string key = checkstdstring(L, 2); float v[4]; v[0] = luaL_checknumber(L, 3); v[1] = luaL_checknumber(L, 4); @@ -646,6 +646,25 @@ void LiveInputWrapper::connect_signal(int signal_num) } } +namespace { + +int call_num_channels(lua_State *L) +{ + lua_getglobal(L, "num_channels"); + + if (lua_pcall(L, 0, 1, 0) != 0) { + fprintf(stderr, "error running function `num_channels': %s\n", lua_tostring(L, -1)); + exit(1); + } + + int num_channels = luaL_checknumber(L, 1); + lua_pop(L, 1); + assert(lua_gettop(L) == 0); + return num_channels; +} + +} // namespace + Theme::Theme(const char *filename, ResourcePool *resource_pool, unsigned num_cards) : resource_pool(resource_pool), num_cards(num_cards) { @@ -674,16 +693,7 @@ Theme::Theme(const char *filename, ResourcePool *resource_pool, unsigned num_car assert(lua_gettop(L) == 0); // Ask it for the number of channels. - lua_getglobal(L, "num_channels"); - - if (lua_pcall(L, 0, 1, 0) != 0) { - fprintf(stderr, "error running function `num_channels': %s\n", lua_tostring(L, -1)); - exit(1); - } - - num_channels = luaL_checknumber(L, 1); - lua_pop(L, 1); - assert(lua_gettop(L) == 0); + num_channels = call_num_channels(L); } Theme::~Theme() @@ -756,7 +766,7 @@ Theme::Chain Theme::get_chain(unsigned num, float t, unsigned width, unsigned he return chain; } -std::string Theme::get_channel_name(unsigned channel) +string Theme::get_channel_name(unsigned channel) { unique_lock lock(m); lua_getglobal(L, "channel_name"); @@ -766,7 +776,23 @@ std::string Theme::get_channel_name(unsigned channel) exit(1); } - std::string ret = lua_tostring(L, -1); + string ret = lua_tostring(L, -1); + lua_pop(L, 1); + assert(lua_gettop(L) == 0); + return ret; +} + +int Theme::get_channel_signal(unsigned channel) +{ + unique_lock lock(m); + lua_getglobal(L, "channel_signal"); + lua_pushnumber(L, channel); + if (lua_pcall(L, 1, 1, 0) != 0) { + fprintf(stderr, "error running function `channel_signal': %s\n", lua_tostring(L, -1)); + exit(1); + } + + int ret = luaL_checknumber(L, 1); lua_pop(L, 1); assert(lua_gettop(L) == 0); return ret; @@ -804,7 +830,7 @@ void Theme::set_wb(unsigned channel, double r, double g, double b) assert(lua_gettop(L) == 0); } -std::vector Theme::get_transition_names(float t) +vector Theme::get_transition_names(float t) { unique_lock lock(m); lua_getglobal(L, "get_transitions"); @@ -814,7 +840,7 @@ std::vector Theme::get_transition_names(float t) exit(1); } - std::vector ret; + vector ret; lua_pushnil(L); while (lua_next(L, -2) != 0) { ret.push_back(lua_tostring(L, -1)); @@ -827,14 +853,23 @@ std::vector Theme::get_transition_names(float t) int Theme::map_signal(int signal_num) { + unique_lock lock(map_m); + if (signal_to_card_mapping.count(signal_num)) { + return signal_to_card_mapping[signal_num]; + } if (signal_num >= int(num_cards)) { - if (signals_warned_about.insert(signal_num).second) { - fprintf(stderr, "WARNING: Theme asked for input %d, but we only have %u card(s).\n", signal_num, num_cards); - fprintf(stderr, "Mapping to card %d instead.\n", signal_num % num_cards); - } - signal_num %= num_cards; + fprintf(stderr, "WARNING: Theme asked for input %d, but we only have %u card(s).\n", signal_num, num_cards); + fprintf(stderr, "Mapping to card %d instead.\n", signal_num % num_cards); } - return signal_num; + signal_to_card_mapping[signal_num] = signal_num % num_cards; + return signal_num % num_cards; +} + +void Theme::set_signal_mapping(int signal_num, int card_num) +{ + unique_lock lock(map_m); + assert(card_num < int(num_cards)); + signal_to_card_mapping[signal_num] = card_num; } void Theme::transition_clicked(int transition_num, float t)