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 int 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 return realtime_toc->show_window(flush);
245 return realtime_toc->hide_window(flush);
252 RecordFragment::RecordFragment(int x,
254 PreferencesWindow *pwindow,
263 this->pwindow = pwindow;
264 this->record = record;
267 int RecordFragment::handle_event()
269 pwindow->thread->edl->session->record_fragment_size = atol(get_text());
279 RecordWriteLength::RecordWriteLength(MWindow *mwindow, PreferencesWindow *pwindow, int x, int y, char *text)
280 : BC_TextBox(x, y, 100, 1, text)
282 this->pwindow = pwindow;
285 int RecordWriteLength::handle_event()
287 pwindow->thread->edl->session->record_write_length = atol(get_text());
292 RecordRealTime::RecordRealTime(MWindow *mwindow,
293 PreferencesWindow *pwindow, int x, int y, int value)
294 : BC_CheckBox(x, y, value,
295 _("Record in realtime priority (root only)"))
297 this->pwindow = pwindow;
300 int RecordRealTime::handle_event()
302 pwindow->thread->edl->session->real_time_record = get_value();
307 RecordMap51_2::RecordMap51_2(MWindow *mwindow,
308 PreferencesWindow *pwindow, int x, int y, int value)
309 : BC_CheckBox(x, y, value, _("Map 5.1->2"))
311 this->pwindow = pwindow;
314 int RecordMap51_2::handle_event()
316 pwindow->thread->edl->session->aconfig_in->map51_2 = get_value();
321 RecordSampleRate::RecordSampleRate(PreferencesWindow *pwindow, int x, int y)
322 : BC_TextBox(x, y, 70, 1, pwindow->thread->edl->session->aconfig_in->in_samplerate)
324 this->pwindow = pwindow;
326 int RecordSampleRate::handle_event()
328 pwindow->thread->edl->session->aconfig_in->in_samplerate = atol(get_text());
333 RecordRealtimeTOC::RecordRealtimeTOC(MWindow *mwindow,
334 PreferencesWindow *pwindow, int x, int y, int value)
335 : BC_CheckBox(x, y, value, _("Realtime TOC"))
337 this->pwindow = pwindow;
340 int RecordRealtimeTOC::handle_event()
342 pwindow->thread->edl->session->record_realtime_toc = get_value();
347 // DuplexEnable::DuplexEnable(MWindow *mwindow, PreferencesWindow *pwindow, int x, int y, int value)
348 // : BC_CheckBox(x, y, value, _("Enable full duplex"))
349 // { this->pwindow = pwindow; }
351 // int DuplexEnable::handle_event()
353 // pwindow->thread->edl->session->enable_duplex = get_value();
358 RecordW::RecordW(PreferencesWindow *pwindow, int x, int y)
359 : BC_TextBox(x, y, 70, 1, pwindow->thread->edl->session->vconfig_in->w)
361 this->pwindow = pwindow;
363 int RecordW::handle_event()
365 pwindow->thread->edl->session->vconfig_in->w = atol(get_text());
369 RecordH::RecordH(PreferencesWindow *pwindow, int x, int y)
370 : BC_TextBox(x, y, 70, 1, pwindow->thread->edl->session->vconfig_in->h)
372 this->pwindow = pwindow;
374 int RecordH::handle_event()
376 pwindow->thread->edl->session->vconfig_in->h = atol(get_text());
380 RecordFrameRate::RecordFrameRate(PreferencesWindow *pwindow, int x, int y)
381 : BC_TextBox(x, y, 70, 1, pwindow->thread->edl->session->vconfig_in->in_framerate)
383 this->pwindow = pwindow;
385 int RecordFrameRate::handle_event()
387 pwindow->thread->edl->session->vconfig_in->in_framerate = atof(get_text());
393 RecordChannels::RecordChannels(PreferencesWindow *pwindow, BC_SubWindow *gui, int x, int y)
394 : BC_TumbleTextBox(gui,
395 pwindow->thread->edl->session->aconfig_in->channels,
396 1, MAX_CHANNELS, x, y, 100)
398 this->pwindow = pwindow;
401 int RecordChannels::handle_event()
403 pwindow->thread->edl->session->aconfig_in->channels = atoi(get_text());
407 RecordGain::RecordGain(PreferencesWindow *pwindow, BC_SubWindow *gui, int x, int y)
408 : BC_TumbleTextBox(gui,
409 pwindow->thread->edl->session->aconfig_in->rec_gain,
410 0.0001f, 10000.0f, x, y, 72)
412 this->pwindow = pwindow;
413 this->set_increment(0.1);
416 int RecordGain::handle_event()
418 pwindow->thread->edl->session->aconfig_in->rec_gain = atof(get_text());
424 VideoWriteLength::VideoWriteLength(PreferencesWindow *pwindow, char *text, int y)
425 : BC_TextBox(260, y, 100, 1, text)
427 this->pwindow = pwindow;
430 int VideoWriteLength::handle_event()
432 pwindow->thread->edl->session->video_write_length = atol(get_text());
437 VideoCaptureLength::VideoCaptureLength(PreferencesWindow *pwindow, char *text, int y)
438 : BC_TextBox(260, y, 100, 1, text)
440 this->pwindow = pwindow;
443 int VideoCaptureLength::handle_event()
445 pwindow->thread->edl->session->vconfig_in->capture_length = atol(get_text());
449 CaptureLengthTumbler::CaptureLengthTumbler(PreferencesWindow *pwindow, BC_TextBox *text, int x, int y)
452 this->pwindow = pwindow;
456 int CaptureLengthTumbler::handle_up_event()
458 int value = atol(text->get_text());
460 char string[BCTEXTLEN];
461 sprintf(string, "%d", value);
462 text->update(string);
463 text->handle_event();
467 int CaptureLengthTumbler::handle_down_event()
469 int value = atol(text->get_text());
471 value = MAX(1, value);
472 char string[BCTEXTLEN];
473 sprintf(string, "%d", value);
474 text->update(string);
475 text->handle_event();
479 RecordPositioning::RecordPositioning(PreferencesWindow *pwindow, BC_TextBox *textbox)
480 : BC_ListBox(textbox->get_x() + textbox->get_w(), textbox->get_y(),
481 200, 100, LISTBOX_TEXT, &position_type, 0, 0, 1, 0, 1)
483 this->pwindow = pwindow;
484 this->textbox = textbox;
487 RecordPositioning::~RecordPositioning()
489 for( int i=0; i<position_type.total; ++i )
490 delete position_type.values[i];
493 void RecordPositioning::create_objects()
495 position_type.append(new BC_ListBoxItem(_("Presentation Timestamps")));
496 position_type.append(new BC_ListBoxItem(_("Software timing")));
497 position_type.append(new BC_ListBoxItem(_("Device Position")));
498 position_type.append(new BC_ListBoxItem(_("Sample Position")));
499 int value = pwindow->thread->edl->session->record_positioning;
500 textbox->update(position_type.values[value]->get_text());
503 int RecordPositioning::handle_event()
505 int v = get_selection_number(0, 0);
506 pwindow->thread->edl->session->record_positioning = v;
507 textbox->update(position_type.values[v]->get_text());
508 textbox->handle_event();
513 RecordSyncDrives::RecordSyncDrives(PreferencesWindow *pwindow, int value, int x, int y)
514 : BC_CheckBox(x, y, value, _("Sync drives automatically"))
516 this->pwindow = pwindow;
519 int RecordSyncDrives::handle_event()
521 pwindow->thread->edl->session->record_sync_drives = get_value();