4 * Copyright (C) 2008-2013 Adam Williams <broadcast at earthling dot net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include "adeviceprefs.h"
24 #include "audioconfig.h"
27 #include "edlsession.h"
29 #include "formattools.h"
33 #include "preferences.h"
34 #include "recordconfig.h"
35 #include "recordprefs.h"
37 #include "vdeviceprefs.h"
42 RecordPrefs::RecordPrefs(MWindow *mwindow, PreferencesWindow *pwindow)
43 : PreferencesDialog(mwindow, pwindow)
45 this->mwindow = mwindow;
48 RecordPrefs::~RecordPrefs()
50 delete audio_in_device;
51 delete video_in_device;
52 delete recording_format;
53 // delete duplex_device;
56 void RecordPrefs::create_objects()
59 char string[BCTEXTLEN];
60 BC_Resources *resources = BC_WindowBase::get_resources();
63 x = mwindow->theme->preferencesoptions_x;
64 y = mwindow->theme->preferencesoptions_y;
67 add_subwindow(title = new BC_Title(x, y, _("File Format:"),
68 LARGEFONT, resources->text_default));
69 y += title->get_h() + 5;
71 recording_format = new FormatTools(mwindow, this,
72 pwindow->thread->edl->session->recording_format);
74 recording_format->create_objects(x, y,
75 1, // Include tools for audio
76 1, // Include tools for video
77 1, // Include checkbox for audio
78 1, // Include checkbox for video
81 0, // Select compressors to be offered
82 1, // Prompt for recording options
83 0, // If nonzero, prompt for insertion strategy
84 0); // Supply file formats for background rendering
86 realtime_toc = new RecordRealtimeTOC(mwindow, pwindow,
87 x0+400, y0, pwindow->thread->edl->session->record_realtime_toc);
88 add_subwindow(realtime_toc);
91 add_subwindow(new BC_Bar(5, y, get_w() - 10));
95 add_subwindow(title = new BC_Title(x, y,
96 _("Audio In"), LARGEFONT,
97 resources->text_default));
99 y += title->get_h() + 5;
101 add_subwindow(new BC_Title(x, y, _("Record Driver:"),
102 MEDIUMFONT, resources->text_default));
103 audio_in_device = new ADevicePrefs(x + 110, y, pwindow, this, 0,
104 pwindow->thread->edl->session->aconfig_in, MODERECORD);
105 audio_in_device->initialize(1);
106 y += audio_in_device->get_h(1);
110 BC_Title *title0, *title1, *title2, *title3;
111 int pad = RecordWriteLength::calculate_h(this,
115 mwindow->theme->widget_border;
116 add_subwindow(title0 = new BC_Title(x, y, _("Samples read from device:")));
117 add_subwindow(title1 = new BC_Title(x, y + pad, _("Samples to write to disk:")));
118 add_subwindow(title2 = new BC_Title(x, y + pad * 2, _("Sample rate for recording:")));
119 add_subwindow(title3 = new BC_Title(x, y + pad * 3, _("Channels to record:")));
120 x2 = MAX(title0->get_w(), title1->get_w()) + mwindow->theme->widget_border;
121 x2 = MAX(x2, title2->get_w() + mwindow->theme->widget_border);
122 x2 = MAX(x2, title3->get_w() + mwindow->theme->widget_border);
125 sprintf(string, "%ld", (long)pwindow->thread->edl->session->record_fragment_size);
126 RecordFragment *menu;
127 add_subwindow(menu = new RecordFragment(x2,
132 y += menu->get_h() + mwindow->theme->widget_border;
133 menu->add_item(new BC_MenuItem("1024"));
134 menu->add_item(new BC_MenuItem("2048"));
135 menu->add_item(new BC_MenuItem("4096"));
136 menu->add_item(new BC_MenuItem("8192"));
137 menu->add_item(new BC_MenuItem("16384"));
138 menu->add_item(new BC_MenuItem("32768"));
139 menu->add_item(new BC_MenuItem("65536"));
140 menu->add_item(new BC_MenuItem("131072"));
141 menu->add_item(new BC_MenuItem("262144"));
143 sprintf(string, "" _LD "", pwindow->thread->edl->session->record_write_length);
144 add_subwindow(textbox = new RecordWriteLength(mwindow, pwindow, x2, y, string));
145 y += textbox->get_h() + mwindow->theme->widget_border;
146 add_subwindow(textbox = new RecordSampleRate(pwindow, x2, y));
147 add_subwindow(new SampleRatePulldown(mwindow,
149 x2 + textbox->get_w(),
151 y += textbox->get_h() + mwindow->theme->widget_border;
153 RecordChannels *channels = new RecordChannels(pwindow, this, x2, y);
154 channels->create_objects();
155 y += channels->get_h() + mwindow->theme->widget_border;
157 RecordMap51_2 *record_map51_2 = new RecordMap51_2(mwindow, pwindow, x, y,
158 pwindow->thread->edl->session->aconfig_in->map51_2);
159 add_subwindow(record_map51_2);
161 x2 = x + record_map51_2->get_w() + 30;
162 int y2 = y + BC_TextBox::calculate_h(this,MEDIUMFONT,1,1) - get_text_height(MEDIUMFONT);
163 add_subwindow(title = new BC_Title(x2, y2, _("Gain:")));
164 x2 += title->get_w() + 8;
165 RecordGain *rec_gain = new RecordGain(pwindow, this, x2, y);
166 rec_gain->create_objects();
168 x2 += rec_gain->get_w() + 30;
169 add_subwindow(new RecordRealTime(mwindow, pwindow, x2, y,
170 pwindow->thread->edl->session->real_time_record));
176 add_subwindow(new BC_Bar(5, y, get_w() - 10));
179 add_subwindow(new BC_Title(x, y, _("Video In"), LARGEFONT,
180 resources->text_default));
183 add_subwindow(new BC_Title(x, y, _("Record Driver:"), MEDIUMFONT,
184 resources->text_default));
185 video_in_device = new VDevicePrefs(x + 110, y, pwindow, this, 0,
186 pwindow->thread->edl->session->vconfig_in, MODERECORD);
187 video_in_device->initialize(1);
190 sprintf(string, "%d", pwindow->thread->edl->session->video_write_length);
191 add_subwindow(textbox = new VideoWriteLength(pwindow, string, y));
192 add_subwindow(new CaptureLengthTumbler(pwindow, textbox, textbox->get_x() + textbox->get_w(), y));
193 add_subwindow(new BC_Title(x, y, _("Frames to record to disk at a time:")));
195 sprintf(string, "%d", pwindow->thread->edl->session->vconfig_in->capture_length);
196 add_subwindow(textbox = new VideoCaptureLength(pwindow, string, y));
197 add_subwindow(new CaptureLengthTumbler(pwindow, textbox, textbox->get_x() + textbox->get_w(), y));
198 add_subwindow(new BC_Title(x, y, _("Frames to buffer in device:")));
202 add_subwindow(new BC_Title(x1, y, _("Positioning:")));
204 add_subwindow(textbox = new BC_TextBox(x1, y, 200, 1, ""));
205 RecordPositioning *positioning = new RecordPositioning(pwindow,textbox);
206 add_subwindow(positioning);
207 positioning->create_objects();
208 y += positioning->get_h() + 5;
210 add_subwindow(new RecordSyncDrives(pwindow,
211 pwindow->thread->edl->session->record_sync_drives,
215 BC_TextBox *w_text, *h_text;
216 add_subwindow(new BC_Title(x, y, _("Size of captured frame:")));
218 add_subwindow(w_text = new RecordW(pwindow, x, y));
219 x += w_text->get_w() + 2;
220 add_subwindow(new BC_Title(x, y, "x"));
222 add_subwindow(h_text = new RecordH(pwindow, x, y));
223 x += h_text->get_w();
224 add_subwindow(new FrameSizePulldown(mwindow->theme,
225 w_text, h_text, x, y));
229 add_subwindow(new BC_Title(x, y, _("Frame rate for recording:")));
231 add_subwindow(textbox = new RecordFrameRate(pwindow, x, y));
233 add_subwindow(new FrameRatePulldown(mwindow, textbox, x, y));
238 void RecordPrefs::show_window(int flush)
240 PreferencesDialog::show_window(flush);
241 if( pwindow->thread->edl->session->recording_format->format == FILE_MPEG &&
242 pwindow->thread->edl->session->vconfig_in->driver == CAPTURE_DVB &&
243 pwindow->thread->edl->session->aconfig_in->driver == AUDIO_DVB )
244 realtime_toc->show_window(flush);
246 realtime_toc->hide_window(flush);
253 RecordFragment::RecordFragment(int x,
255 PreferencesWindow *pwindow,
264 this->pwindow = pwindow;
265 this->record = record;
268 int RecordFragment::handle_event()
270 pwindow->thread->edl->session->record_fragment_size = atol(get_text());
280 RecordWriteLength::RecordWriteLength(MWindow *mwindow, PreferencesWindow *pwindow, int x, int y, char *text)
281 : BC_TextBox(x, y, 100, 1, text)
283 this->pwindow = pwindow;
286 int RecordWriteLength::handle_event()
288 pwindow->thread->edl->session->record_write_length = atol(get_text());
293 RecordRealTime::RecordRealTime(MWindow *mwindow,
294 PreferencesWindow *pwindow, int x, int y, int value)
295 : BC_CheckBox(x, y, value,
296 _("Record in realtime priority (root only)"))
298 this->pwindow = pwindow;
301 int RecordRealTime::handle_event()
303 pwindow->thread->edl->session->real_time_record = get_value();
308 RecordMap51_2::RecordMap51_2(MWindow *mwindow,
309 PreferencesWindow *pwindow, int x, int y, int value)
310 : BC_CheckBox(x, y, value, _("Map 5.1->2"))
312 this->pwindow = pwindow;
315 int RecordMap51_2::handle_event()
317 pwindow->thread->edl->session->aconfig_in->map51_2 = get_value();
322 RecordSampleRate::RecordSampleRate(PreferencesWindow *pwindow, int x, int y)
323 : BC_TextBox(x, y, 70, 1, pwindow->thread->edl->session->aconfig_in->in_samplerate)
325 this->pwindow = pwindow;
327 int RecordSampleRate::handle_event()
329 pwindow->thread->edl->session->aconfig_in->in_samplerate = atol(get_text());
334 RecordRealtimeTOC::RecordRealtimeTOC(MWindow *mwindow,
335 PreferencesWindow *pwindow, int x, int y, int value)
336 : BC_CheckBox(x, y, value, _("Realtime TOC"))
338 this->pwindow = pwindow;
341 int RecordRealtimeTOC::handle_event()
343 pwindow->thread->edl->session->record_realtime_toc = get_value();
348 // DuplexEnable::DuplexEnable(MWindow *mwindow, PreferencesWindow *pwindow, int x, int y, int value)
349 // : BC_CheckBox(x, y, value, _("Enable full duplex"))
350 // { this->pwindow = pwindow; }
352 // int DuplexEnable::handle_event()
354 // pwindow->thread->edl->session->enable_duplex = get_value();
359 RecordW::RecordW(PreferencesWindow *pwindow, int x, int y)
360 : BC_TextBox(x, y, 70, 1, pwindow->thread->edl->session->vconfig_in->w)
362 this->pwindow = pwindow;
364 int RecordW::handle_event()
366 pwindow->thread->edl->session->vconfig_in->w = atol(get_text());
370 RecordH::RecordH(PreferencesWindow *pwindow, int x, int y)
371 : BC_TextBox(x, y, 70, 1, pwindow->thread->edl->session->vconfig_in->h)
373 this->pwindow = pwindow;
375 int RecordH::handle_event()
377 pwindow->thread->edl->session->vconfig_in->h = atol(get_text());
381 RecordFrameRate::RecordFrameRate(PreferencesWindow *pwindow, int x, int y)
382 : BC_TextBox(x, y, 70, 1, pwindow->thread->edl->session->vconfig_in->in_framerate)
384 this->pwindow = pwindow;
386 int RecordFrameRate::handle_event()
388 pwindow->thread->edl->session->vconfig_in->in_framerate = atof(get_text());
394 RecordChannels::RecordChannels(PreferencesWindow *pwindow, BC_SubWindow *gui, int x, int y)
395 : BC_TumbleTextBox(gui,
396 pwindow->thread->edl->session->aconfig_in->channels,
397 1, MAX_CHANNELS, x, y, 100)
399 this->pwindow = pwindow;
402 int RecordChannels::handle_event()
404 pwindow->thread->edl->session->aconfig_in->channels = atoi(get_text());
408 RecordGain::RecordGain(PreferencesWindow *pwindow, BC_SubWindow *gui, int x, int y)
409 : BC_TumbleTextBox(gui,
410 pwindow->thread->edl->session->aconfig_in->rec_gain,
411 0.0001f, 10000.0f, x, y, 72)
413 this->pwindow = pwindow;
414 this->set_increment(0.1);
417 int RecordGain::handle_event()
419 pwindow->thread->edl->session->aconfig_in->rec_gain = atof(get_text());
425 VideoWriteLength::VideoWriteLength(PreferencesWindow *pwindow, char *text, int y)
426 : BC_TextBox(260, y, 100, 1, text)
428 this->pwindow = pwindow;
431 int VideoWriteLength::handle_event()
433 pwindow->thread->edl->session->video_write_length = atol(get_text());
438 VideoCaptureLength::VideoCaptureLength(PreferencesWindow *pwindow, char *text, int y)
439 : BC_TextBox(260, y, 100, 1, text)
441 this->pwindow = pwindow;
444 int VideoCaptureLength::handle_event()
446 pwindow->thread->edl->session->vconfig_in->capture_length = atol(get_text());
450 CaptureLengthTumbler::CaptureLengthTumbler(PreferencesWindow *pwindow, BC_TextBox *text, int x, int y)
453 this->pwindow = pwindow;
457 int CaptureLengthTumbler::handle_up_event()
459 int value = atol(text->get_text());
461 char string[BCTEXTLEN];
462 sprintf(string, "%d", value);
463 text->update(string);
464 text->handle_event();
468 int CaptureLengthTumbler::handle_down_event()
470 int value = atol(text->get_text());
472 value = MAX(1, value);
473 char string[BCTEXTLEN];
474 sprintf(string, "%d", value);
475 text->update(string);
476 text->handle_event();
480 RecordPositioning::RecordPositioning(PreferencesWindow *pwindow, BC_TextBox *textbox)
481 : BC_ListBox(textbox->get_x() + textbox->get_w(), textbox->get_y(),
482 200, 100, LISTBOX_TEXT, &position_type, 0, 0, 1, 0, 1)
484 this->pwindow = pwindow;
485 this->textbox = textbox;
488 RecordPositioning::~RecordPositioning()
490 for( int i=0; i<position_type.total; ++i )
491 delete position_type.values[i];
494 void RecordPositioning::create_objects()
496 position_type.append(new BC_ListBoxItem(_("Presentation Timestamps")));
497 position_type.append(new BC_ListBoxItem(_("Software timing")));
498 position_type.append(new BC_ListBoxItem(_("Device Position")));
499 position_type.append(new BC_ListBoxItem(_("Sample Position")));
500 int value = pwindow->thread->edl->session->record_positioning;
501 textbox->update(position_type.values[value]->get_text());
504 int RecordPositioning::handle_event()
506 int v = get_selection_number(0, 0);
507 pwindow->thread->edl->session->record_positioning = v;
508 textbox->update(position_type.values[v]->get_text());
509 textbox->handle_event();
514 RecordSyncDrives::RecordSyncDrives(PreferencesWindow *pwindow, int value, int x, int y)
515 : BC_CheckBox(x, y, value, _("Sync drives automatically"))
517 this->pwindow = pwindow;
520 int RecordSyncDrives::handle_event()
522 pwindow->thread->edl->session->record_sync_drives = get_value();