From: Steinar H. Gunderson Date: Thu, 21 Jul 2016 21:42:07 +0000 (+0200) Subject: Let the theme distinguish between fake and real inputs (ie., if there is an actual... X-Git-Tag: 1.3.2~9 X-Git-Url: https://git.sesse.net/?p=nageru;a=commitdiff_plain;h=884f2c044c4ab008ce9295edd343ee851eba4576 Let the theme distinguish between fake and real inputs (ie., if there is an actual card connected or not). --- diff --git a/bmusb b/bmusb index c753d69..76a878c 160000 --- a/bmusb +++ b/bmusb @@ -1 +1 @@ -Subproject commit c753d698b047822c11f5f97b889649a3e582a4c9 +Subproject commit 76a878cbab84d8c3c2859b28a2363085d6a2fcb1 diff --git a/fake_capture.cpp b/fake_capture.cpp index 53d0db8..5ad0b62 100644 --- a/fake_capture.cpp +++ b/fake_capture.cpp @@ -195,6 +195,7 @@ void FakeCapture::producer_thread_func() video_format.frame_rate_nom = FAKE_FPS; video_format.frame_rate_den = 1; video_format.has_signal = true; + video_format.is_connected = false; FrameAllocator::Frame video_frame = video_frame_allocator->alloc_frame(); if (video_frame.data != nullptr) { diff --git a/mixer.cpp b/mixer.cpp index 327ea65..ce3ceb4 100644 --- a/mixer.cpp +++ b/mixer.cpp @@ -506,6 +506,7 @@ void Mixer::bm_frame(unsigned card_index, uint16_t timecode, } userdata->last_interlaced = video_format.interlaced; userdata->last_has_signal = video_format.has_signal; + userdata->last_is_connected = video_format.is_connected; userdata->last_frame_rate_nom = video_format.frame_rate_nom; userdata->last_frame_rate_den = video_format.frame_rate_den; RefCountedFrame frame(video_frame); diff --git a/pbo_frame_allocator.cpp b/pbo_frame_allocator.cpp index 0020ba4..74f54fd 100644 --- a/pbo_frame_allocator.cpp +++ b/pbo_frame_allocator.cpp @@ -45,6 +45,7 @@ PBOFrameAllocator::PBOFrameAllocator(size_t frame_size, GLuint width, GLuint hei userdata[i].last_height[1] = 0; userdata[i].last_interlaced = false; userdata[i].last_has_signal = false; + userdata[i].last_is_connected = false; for (unsigned field = 0; field < 2; ++field) { glBindTexture(GL_TEXTURE_2D, userdata[i].tex_y[field]); check_error(); diff --git a/pbo_frame_allocator.h b/pbo_frame_allocator.h index 5dba2fc..891806a 100644 --- a/pbo_frame_allocator.h +++ b/pbo_frame_allocator.h @@ -32,7 +32,7 @@ public: // The second set is only used for the second field of interlaced inputs. GLuint tex_y[2], tex_cbcr[2]; GLuint last_width[2], last_height[2]; - bool last_interlaced, last_has_signal; + bool last_interlaced, last_has_signal, last_is_connected; unsigned last_frame_rate_nom, last_frame_rate_den; }; diff --git a/theme.cpp b/theme.cpp index ed187e5..a73b607 100644 --- a/theme.cpp +++ b/theme.cpp @@ -46,7 +46,7 @@ struct InputStateInfo { InputStateInfo(const InputState& input_state); unsigned last_width[MAX_CARDS], last_height[MAX_CARDS]; - bool last_interlaced[MAX_CARDS], last_has_signal[MAX_CARDS]; + bool last_interlaced[MAX_CARDS], last_has_signal[MAX_CARDS], last_is_connected[MAX_CARDS]; unsigned last_frame_rate_nom[MAX_CARDS], last_frame_rate_den[MAX_CARDS]; }; @@ -58,6 +58,7 @@ InputStateInfo::InputStateInfo(const InputState &input_state) last_width[signal_num] = last_height[signal_num] = 0; last_interlaced[signal_num] = false; last_has_signal[signal_num] = false; + last_is_connected[signal_num] = false; continue; } const PBOFrameAllocator::Userdata *userdata = (const PBOFrameAllocator::Userdata *)frame.frame->userdata; @@ -65,6 +66,7 @@ InputStateInfo::InputStateInfo(const InputState &input_state) last_height[signal_num] = userdata->last_height[frame.field_number]; last_interlaced[signal_num] = userdata->last_interlaced; last_has_signal[signal_num] = userdata->last_has_signal; + last_is_connected[signal_num] = userdata->last_is_connected; last_frame_rate_nom[signal_num] = userdata->last_frame_rate_nom; last_frame_rate_den[signal_num] = userdata->last_frame_rate_den; } @@ -380,6 +382,16 @@ int InputStateInfo_get_has_signal(lua_State* L) return 1; } +int InputStateInfo_get_is_connected(lua_State* L) +{ + assert(lua_gettop(L) == 2); + InputStateInfo *input_state_info = get_input_state_info(L, 1); + Theme *theme = get_theme_updata(L); + int signal_num = theme->map_signal(luaL_checknumber(L, 2)); + lua_pushboolean(L, input_state_info->last_is_connected[signal_num]); + return 1; +} + int InputStateInfo_get_frame_rate_nom(lua_State* L) { assert(lua_gettop(L) == 2); @@ -557,6 +569,7 @@ const luaL_Reg InputStateInfo_funcs[] = { { "get_height", InputStateInfo_get_height }, { "get_interlaced", InputStateInfo_get_interlaced }, { "get_has_signal", InputStateInfo_get_has_signal }, + { "get_is_connected", InputStateInfo_get_is_connected }, { "get_frame_rate_nom", InputStateInfo_get_frame_rate_nom }, { "get_frame_rate_den", InputStateInfo_get_frame_rate_den }, { NULL, NULL } diff --git a/theme.lua b/theme.lua index df9e9c7..77a1ff1 100644 --- a/theme.lua +++ b/theme.lua @@ -269,7 +269,10 @@ end -- there's no signal. function get_channel_resolution(signal_num) res = last_resolution[signal_num] - if (not res) or res.height <= 0 then + if (not res) or not res.is_connected then + return "disconnected" + end + if res.height <= 0 then return "no signal" end if not res.has_signal then @@ -558,6 +561,7 @@ function get_chain(num, t, width, height, signals) width = signals:get_width(signal_num), height = signals:get_height(signal_num), interlaced = signals:get_interlaced(signal_num), + is_connected = signals:get_is_connected(signal_num), has_signal = signals:get_has_signal(signal_num), frame_rate_nom = signals:get_frame_rate_nom(signal_num), frame_rate_den = signals:get_frame_rate_den(signal_num)