]> git.sesse.net Git - vlc/blob - modules/video_filter/atmo/AtmoDynData.cpp
Use var_InheritString for --decklink-video-connection.
[vlc] / modules / video_filter / atmo / AtmoDynData.cpp
1 /*
2  * AtmoDynData.cpp: class for holding all variable data - which may be
3  * passed between function calls, into threads instead of the use
4  * of global variables
5  *
6  * See the README.txt file for copyright information and how to reach the author(s).
7  *
8  * $Id$
9  */
10
11 #include "AtmoDynData.h"
12
13 #if defined(_ATMO_VLC_PLUGIN_)
14 CAtmoDynData::CAtmoDynData(vlc_object_t *p_atmo_filter, CAtmoConfig *pAtmoConfig) {
15     this->p_atmo_filter     = p_atmo_filter;
16     this->m_pAtmoConfig     = pAtmoConfig;
17     this->m_pAtmoConnection = NULL;
18     this->m_pCurrentEffectThread = NULL;
19
20     this->m_pLivePacketQueue = NULL;
21     this->m_pLiveInput = NULL;
22     this->m_LivePictureSource = lpsExtern;
23     vlc_mutex_init( &m_lock );
24 }
25 #else
26 CAtmoDynData::CAtmoDynData(HINSTANCE hInst, CAtmoConfig *pAtmoConfig, CAtmoDisplays *pAtmoDisplays) {
27     this->m_pAtmoConfig     = pAtmoConfig;
28     this->m_pAtmoDisplays   = pAtmoDisplays;
29     this->m_pAtmoConnection = NULL;
30     this->m_pCurrentEffectThread = NULL;
31     this->m_hInst = hInst;
32
33     this->m_pLivePacketQueue = NULL;
34     this->m_pLiveInput = NULL;
35     this->m_LivePictureSource = lpsScreenCapture;
36     InitializeCriticalSection( &m_RemoteCallCriticalSection );
37 }
38 #endif
39
40 CAtmoDynData::~CAtmoDynData(void)
41 {
42 #if defined(_ATMO_VLC_PLUGIN_)
43     vlc_mutex_destroy( &m_lock );
44 #else
45     DeleteCriticalSection(&m_RemoteCallCriticalSection);
46 #endif
47 }
48
49 void CAtmoDynData::LockCriticalSection() {
50 #if defined(_ATMO_VLC_PLUGIN_)
51     vlc_mutex_lock( &m_lock );
52 #else
53     EnterCriticalSection(&m_RemoteCallCriticalSection);
54 #endif
55 }
56
57 void CAtmoDynData::UnLockCriticalSection() {
58 #if defined(_ATMO_VLC_PLUGIN_)
59     vlc_mutex_unlock( &m_lock );
60 #else
61     LeaveCriticalSection(&m_RemoteCallCriticalSection);
62 #endif
63 }
64
65 void CAtmoDynData::CalculateDefaultZones()
66 {
67   int i;
68   int num_cols_top;
69   int num_cols_bottom;
70   int num_rows;
71   CAtmoZoneDefinition *zoneDef;
72
73   if(!m_pAtmoConfig)
74      return;
75
76   m_pAtmoConfig->UpdateZoneDefinitionCount();
77
78
79   num_cols_top    = m_pAtmoConfig->getZonesTopCount();
80   num_cols_bottom = m_pAtmoConfig->getZonesBottomCount();
81   num_rows        = m_pAtmoConfig->getZonesLRCount();
82
83   for(int zone=0; zone < m_pAtmoConfig->getZoneCount(); zone++)
84   {
85      zoneDef = m_pAtmoConfig->getZoneDefinition(zone);
86      if(zoneDef)
87         zoneDef->Fill(0);
88   }
89
90
91   // the zones will be counted starting from top left - in clockwise order around the display
92   // the summary channel will be the last one (in the center)
93   i = 0;
94   // top zones from left to right
95   for(int c=0;c<num_cols_top;c++)
96   {
97        zoneDef = m_pAtmoConfig->getZoneDefinition(i); i++;
98        if(zoneDef) {
99           int l = (c * CAP_WIDTH)/num_cols_top;
100           int r = ((c+1) * CAP_WIDTH)/num_cols_top;
101           zoneDef->FillGradientFromTop( ATMO_MAX( l - CAP_ZONE_OVERLAP, 0) , ATMO_MIN( r + CAP_ZONE_OVERLAP, CAP_WIDTH ) );
102        }
103   }
104   // right zones from top to bottom
105   for(int r=0;r<num_rows;r++)
106   {
107        zoneDef = m_pAtmoConfig->getZoneDefinition(i); i++;
108        if(zoneDef) {
109           int t = (r * CAP_HEIGHT)/num_rows;
110           int b = ((r+1) * CAP_HEIGHT)/num_rows;
111           zoneDef->FillGradientFromRight( ATMO_MAX( t - CAP_ZONE_OVERLAP, 0) , ATMO_MIN( b + CAP_ZONE_OVERLAP, CAP_HEIGHT) );
112        }
113   }
114   //  bottom zones from  RIGHT to LEFT!
115   for(int c=(num_cols_bottom-1);c>=0;c--)
116   {
117        zoneDef = m_pAtmoConfig->getZoneDefinition(i); i++;
118        if(zoneDef) {
119           int l = (c * CAP_WIDTH)/num_cols_bottom;
120           int r = ((c+1) * CAP_WIDTH)/num_cols_bottom;
121           zoneDef->FillGradientFromBottom( ATMO_MAX( l - CAP_ZONE_OVERLAP, 0 ), ATMO_MIN( r + CAP_ZONE_OVERLAP, CAP_WIDTH ) );
122        }
123   }
124   // left zones from bottom to top!
125   for(int r=(num_rows-1);r>=0;r--)
126   {
127        zoneDef = m_pAtmoConfig->getZoneDefinition(i); i++;
128        if(zoneDef)
129        {
130           int t = (r * CAP_HEIGHT)/num_rows;
131           int b = ((r+1) * CAP_HEIGHT)/num_rows;
132           zoneDef->FillGradientFromLeft( ATMO_MAX( t - CAP_ZONE_OVERLAP, 0 ), ATMO_MIN( b + CAP_ZONE_OVERLAP, CAP_HEIGHT ) );
133        }
134   }
135   if(m_pAtmoConfig->getZoneSummary())
136   {
137      // and last the summary zone if requested!
138      zoneDef = m_pAtmoConfig->getZoneDefinition(i++);
139      if(zoneDef)
140         zoneDef->Fill(255);
141   }
142 }
143
144
145 #if defined(_ATMO_VLC_PLUGIN_)
146 void CAtmoDynData::ReloadZoneDefinitionBitmaps()
147 {
148  // only as dummy for VLC Module - to avoid to if def out all calls to this function
149 }
150 #endif
151
152
153 #if !defined(_ATMO_VLC_PLUGIN_)
154
155 void CAtmoDynData::setWorkDir(const char *dir)
156 {
157     strcpy( m_WorkDir, dir );
158 }
159
160 char *CAtmoDynData::getWorkDir()
161 {
162     return m_WorkDir;
163 }
164
165 void CAtmoDynData::ReloadZoneDefinitionBitmaps()
166 {
167   int i;
168   // suchlogik für die Bitmaps ...
169   // <WorkDir>\hardware\numchannels\zone..0..n.bmp
170   // <WorkDir>\hardware\zone..0..n.bmp
171   // <WorkDir>\zone..0..n.bmp
172   // Automatik Berechnung...
173   LockCriticalSection();
174   if(!m_pAtmoConnection || !m_pAtmoConfig) {
175       UnLockCriticalSection();
176       return;
177   }
178
179   m_pAtmoConfig->UpdateZoneDefinitionCount();
180
181   CalculateDefaultZones();
182
183
184   char psz_filename[MAX_PATH];
185   CAtmoZoneDefinition *zoneDef;
186
187   sprintf(psz_filename,"%s%s",
188                         m_WorkDir,
189                         m_pAtmoConnection->getDevicePath()
190                 );
191   CreateDirectory( psz_filename, NULL );
192
193   sprintf(psz_filename,"%s%s\\%dx%dx%d",
194                         m_WorkDir,
195                         m_pAtmoConnection->getDevicePath(),
196                         m_pAtmoConfig->getZonesTopCount(),
197                         m_pAtmoConfig->getZonesLRCount(),
198                         m_pAtmoConfig->getZonesBottomCount()
199
200                );
201   CreateDirectory(psz_filename, NULL );
202
203   // try to load device depended zone definition bitmaps
204   for(int zone=0; zone < m_pAtmoConfig->getZoneCount(); zone++)  {
205       zoneDef = m_pAtmoConfig->getZoneDefinition(zone);
206       if(!zoneDef) continue;
207
208       sprintf(psz_filename,"%s%s\\%dx%dx%d\\zone_%d.bmp",
209                         m_WorkDir,
210                         m_pAtmoConnection->getDevicePath(),
211                         m_pAtmoConfig->getZonesTopCount(),
212                         m_pAtmoConfig->getZonesLRCount(),
213                         m_pAtmoConfig->getZonesBottomCount(),
214                         zone
215                 );
216       i = zoneDef->LoadGradientFromBitmap( psz_filename );
217       if(i == ATMO_LOAD_GRADIENT_OK) continue;
218       if((i == ATMO_LOAD_GRADIENT_FAILED_SIZE) || (i == ATMO_LOAD_GRADIENT_FAILED_HEADER))
219          MessageBox(0,psz_filename,"Failed to load, Check Format, Check Size.",MB_ICONERROR);
220
221       sprintf(psz_filename,"%s%s\\zone_%d.bmp",
222                         m_WorkDir,
223                         m_pAtmoConnection->getDevicePath(),
224                         zone
225                 );
226       i = zoneDef->LoadGradientFromBitmap( psz_filename );
227       if(i == ATMO_LOAD_GRADIENT_OK) continue;
228       if((i == ATMO_LOAD_GRADIENT_FAILED_SIZE) || (i == ATMO_LOAD_GRADIENT_FAILED_HEADER))
229          MessageBox(0,psz_filename,"Failed to load, Check Format, Check Size.",MB_ICONERROR);
230
231       sprintf(psz_filename,"%szone_%d.bmp",
232                         m_WorkDir,
233                         zone
234                 );
235       i = zoneDef->LoadGradientFromBitmap( psz_filename );
236       if(i == ATMO_LOAD_GRADIENT_OK) continue;
237       if((i == ATMO_LOAD_GRADIENT_FAILED_SIZE) || (i == ATMO_LOAD_GRADIENT_FAILED_HEADER))
238          MessageBox(0,psz_filename,"Failed to load, Check Format, Check Size.",MB_ICONERROR);
239   }
240
241   UnLockCriticalSection();
242 }
243
244 #endif
245
246
247