r827: Fix a crash when no audio output device can be opened.
[cinelerra_cv.git] / cinelerra / meterpanel.C
blob61db20f1ebadaed21fc690244d80c48bf881c5a7
1 #include "edl.h"
2 #include "edlsession.h"
3 #include "language.h"
4 #include "meterpanel.h"
5 #include "mwindow.h"
6 #include "preferences.h"
7 #include "theme.h"
8 #include "vframe.h"
12 MeterPanel::MeterPanel(MWindow *mwindow, 
13         BC_WindowBase *subwindow, 
14         int x, 
15         int y,
16         int h,
17         int meter_count,
18         int use_meters,
19         int use_recording)
21         this->subwindow = subwindow;
22         this->mwindow = mwindow;
23         this->x = x;
24         this->y = y;
25         this->h = h;
26         this->meter_count = meter_count;
27         this->use_meters = use_meters;
28         this->use_recording = use_recording;
32 MeterPanel::~MeterPanel()
34         meters.remove_all_objects();
37 int MeterPanel::get_meters_width(int meter_count, int use_meters)
39 //printf("MeterPanel::get_meters_width %d %d\n", BC_Meter::get_title_w(), BC_Meter::get_meter_w());
40         return use_meters ? 
41                 (BC_Meter::get_title_w() + BC_Meter::get_meter_w() * meter_count) : 
42                 0;
45 void MeterPanel::reposition_window(int x, int y, int h)
47         this->x = x;
48         this->y = y;
49         this->h = h;
51 //      reset->reposition_window(get_reset_x(), get_reset_y());
53 //printf("MeterPanel::reposition_window 0 %d\n", meter_count);
55         for(int i = 0; i < meter_count; i++)
56         {
57 //printf("MeterPanel::reposition_window 1 %d\n", x);
58                 meters.values[i]->reposition_window(x, y, get_meter_h());
59                 x += get_meter_w(i);
60         }
63 int MeterPanel::change_status_event()
65 //printf("MeterPanel::change_status_event\n");
66         return 1;
69 int MeterPanel::get_reset_x()
71         return x + 
72                 get_meters_width(meter_count, use_meters) - 
73                 mwindow->theme->over_button[0]->get_w();
76 int MeterPanel::get_reset_y()
78         return y + h - mwindow->theme->over_button[0]->get_h();
81 int MeterPanel::get_meter_w(int number)
83         return (number == 0) ? BC_Meter::get_title_w() + BC_Meter::get_meter_w() : BC_Meter::get_meter_w();
86 int MeterPanel::get_meter_h()
88         return /* reset->get_y() - this->y - */ this->h - 5;
91 void MeterPanel::update(double *levels)
93         if(subwindow->get_hidden()) return;
95         for(int i = 0; 
96                 i < meter_count; 
97                 i++)
98         {
99                 meters.values[i]->update(levels[i], levels[i] > 1);
100         }
103 void MeterPanel::stop_meters()
105         for(int i = 0; 
106                 i < meter_count; 
107                 i++)
108         {
109                 meters.values[i]->reset();
110         }
114 int MeterPanel::create_objects()
116         set_meters(meter_count, use_meters);
117         return 0;
120 int MeterPanel::set_meters(int meter_count, int use_meters)
122         if(meter_count != meters.total || use_meters != this->use_meters)
123         {
124 // Delete old meters
125                 meters.remove_all_objects();
127                 this->meter_count = meter_count;
128                 this->use_meters = use_meters;
129 //              if(!use_meters) this->meter_count = 0;
131                 if(meter_count)
132                 {
133                         int x = this->x;
134                         int y = this->y;
135                         int h = get_meter_h();
136                         for(int i = 0; i < meter_count; i++)
137                         {
138                                 MeterMeter *new_meter;
139                                 subwindow->add_subwindow(new_meter = new MeterMeter(mwindow,
140                                                 this,
141                                                 x, 
142                                                 y, 
143                                                 h, 
144                                                 (i == 0)));
145                                 meters.append(new_meter);
146                         x += get_meter_w(i);
147                         }
148                 }
149         }
151         return 0;
154 void MeterPanel::reset_meters()
156         for(int i = 0; i < meters.total; i++)
157                 meters.values[i]->reset_over();
161 void MeterPanel::change_format(int mode, int min, int max)
163         for(int i = 0; i < meters.total; i++)
164         {
165                 if(use_recording)
166                         meters.values[i]->change_format(mode, min, 0);
167                 else
168                         meters.values[i]->change_format(mode, min, max);
169         }
180 MeterReset::MeterReset(MWindow *mwindow, MeterPanel *panel, int x, int y)
181  : BC_Button(x, y, mwindow->theme->over_button)
183         this->mwindow = mwindow;
184         this->panel = panel;
187 MeterReset::~MeterReset()
190         
191 int MeterReset::handle_event()
193         for(int i = 0; i < panel->meters.total; i++)
194                 panel->meters.values[i]->reset_over();
195         return 1;
202 MeterMeter::MeterMeter(MWindow *mwindow, 
203         MeterPanel *panel, 
204         int x, 
205         int y, 
206         int h, 
207         int titles)
208  : BC_Meter(x,
209         y,
210         METER_VERT,
211         h,
212         mwindow->edl->session->min_meter_db, 
213         panel->use_recording ? 0 : mwindow->edl->session->max_meter_db, 
214         mwindow->edl->session->meter_format,
215         titles,
216         TRACKING_RATE * 10,
217         TRACKING_RATE)
219         this->mwindow = mwindow;
220         this->panel = panel;
223 MeterMeter::~MeterMeter()
228 int MeterMeter::button_press_event()
230         if(is_event_win() && BC_WindowBase::cursor_inside())
231         {
232                 panel->reset_meters();
233                 mwindow->reset_meters();
234                 return 1;
235         }
237         return 0;
244 MeterShow::MeterShow(MWindow *mwindow, MeterPanel *panel, int x, int y)
245  : BC_Toggle(x, 
246                 y, 
247                 mwindow->theme->get_image_set("meters"), 
248                 panel->use_meters)
250         this->mwindow = mwindow;
251         this->panel = panel;
252         set_tooltip(_("Show meters"));
256 MeterShow::~MeterShow()
261 int MeterShow::handle_event()
263 //printf("MeterShow::MeterShow 1 %d\n",panel->use_meters );
264         panel->use_meters = get_value();
265         panel->change_status_event();
266         return 1;