kwave  18.07.70
RecordDialog.cpp
Go to the documentation of this file.
1 /*************************************************************************
2  RecordDialog.cpp - dialog window for controlling audio recording
3  -------------------
4  begin : Wed Aug 20 2003
5  copyright : (C) 2003 by Thomas Eschenbacher
6  email : Thomas.Eschenbacher@gmx.de
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #include "config.h"
19 
20 #include <QLatin1Char>
21 #include <QVector>
22 
23 #include <QCheckBox>
24 #include <QDateTimeEdit>
25 #include <QGroupBox>
26 #include <QIcon>
27 #include <QLabel>
28 #include <QPixmap>
29 #include <QProgressBar>
30 #include <QPushButton>
31 #include <QSlider>
32 #include <QSpinBox>
33 #include <QStatusBar>
34 #include <QTabWidget>
35 #include <QTreeView>
36 #include <QTreeWidget>
37 #include <QTreeWidgetItem>
38 
39 #include <KComboBox>
40 #include <KHelpClient>
41 #include <KLocalizedString>
42 #include <KIconLoader>
43 #include <KIconTheme>
44 
45 #include "libkwave/Compression.h"
46 #include "libkwave/SampleFormat.h"
47 #include "libkwave/String.h"
48 #include "libkwave/Utils.h"
49 
50 #include "libgui/FileDialog.h"
51 #include "libgui/HMSTimeWidget.h"
52 
53 #include "LevelMeter.h"
54 #include "RecordDevice.h"
55 #include "RecordDialog.h"
56 #include "RecordParams.h"
57 #include "RecordState.h"
58 
59 // status bar icons
60 #include "ledgreen.xpm"
61 #include "ledlightgreen.xpm"
62 #include "ledred.xpm"
63 #include "ledyellow.xpm"
64 #include "ok.xpm"
65 #include "stop_hand.xpm"
66 #include "walk_r1.xpm"
67 #include "walk_r2.xpm"
68 #include "walk_r3.xpm"
69 #include "walk_r4.xpm"
70 #include "walk_r5.xpm"
71 #include "walk_r6.xpm"
72 #include "walk_r7.xpm"
73 #include "walk_r8.xpm"
74 
75 /* some macros, for laziness ;-) */
76 #define SETUP(enabled,property,check,value) \
77  check->setChecked(m_params.enabled); \
78  value->setValue(m_params.property); \
79 
80 #define STD_SETUP(enabled,property,control) \
81  SETUP(enabled,property,chk##control,sb##control); \
82  sb##control->setEnabled(chk##control->isEnabled() && \
83  chk##control->isChecked());
84 
85 #define STD_SETUP_SLIDER(enabled,property,control) \
86  STD_SETUP(enabled,property,control); \
87  sl##control->setEnabled(sb##control->isEnabled());
88 
89 //***************************************************************************
90 Kwave::RecordDialog::RecordDialog(QWidget *parent, QStringList &params,
91  Kwave::RecordController *controller,
93  :QDialog(parent), Ui::RecordDlg(), m_methods_map(),
94  m_file_filter(), m_devices_list_map(),
95  m_state(Kwave::REC_EMPTY), m_params(),
96  m_supported_resolutions(), m_buffer_progress_count(0),
97  m_buffer_progress_total(0), m_buffer_progress_timer(this),
98  m_record_enabled(true), m_samples_recorded(0),
99  m_enable_setDevice(true), m_state_icon_widget(Q_NULLPTR)
100 {
101  m_status_bar.m_state = Q_NULLPTR;
102  m_status_bar.m_time = Q_NULLPTR;
103  m_status_bar.m_sample_rate = Q_NULLPTR;
104  m_status_bar.m_bits_per_sample = Q_NULLPTR;
105  m_status_bar.m_tracks = Q_NULLPTR;
106 
107  setupUi(this);
108 
109  /* get initial parameters */
110  m_params.fromList(params);
111 
112  /* set the icons of the record control buttons */
113  btNew->setIcon( QIcon::fromTheme(_("document-new")));
114  btStop->setIcon( QIcon::fromTheme(_("kwave_player_stop")));
115  btPause->setIcon( QIcon::fromTheme(_("kwave_player_pause")));
116  btRecord->setIcon(QIcon::fromTheme(_("kwave_player_record")));
117 
118  // fill the combo box with playback methods
119  unsigned int index=0;
120  for (index = 0; index < m_methods_map.count(); ++index) {
121  cbMethod->addItem(m_methods_map.description(index, true));
122  }
123  cbMethod->setEnabled(cbMethod->count() > 1);
124 
125  /* --- set up all controls with their default/startup values --- */
126 
127  // pre-record
128  STD_SETUP_SLIDER(pre_record_enabled, pre_record_time, RecordPre);
129  connect(chkRecordPre, SIGNAL(toggled(bool)),
130  this, SLOT(preRecordingChecked(bool)));
131  connect(sbRecordPre, SIGNAL(valueChanged(int)),
132  this, SLOT(preRecordingTimeChanged(int)));
133 
134  // record time (duration)
135  STD_SETUP(record_time_limited, record_time, RecordTime);
136 
137  // start time (date & time)
138  chkRecordStartTime->setChecked(m_params.start_time_enabled);
139  startTime->setDateTime(m_params.start_time);
140 
141  // record trigger
142  STD_SETUP_SLIDER(record_trigger_enabled, record_trigger, RecordTrigger);
143 
144  // amplification
145  STD_SETUP_SLIDER(amplification_enabled, amplification, LevelAmplify);
146 
147  // AGC
148  STD_SETUP_SLIDER(agc_enabled, agc_decay, LevelAGC);
149 
150  // fade in
151  STD_SETUP(fade_in_enabled, fade_in_time, LevelFadeIn);
152 
153  // fade out
154  STD_SETUP(fade_out_enabled, fade_out_time, LevelFadeOut);
155 
156  // sample rate, bits per sample, track
157  // -> will be initialized later, by the plugin
158 
159  // number of buffers
160  slSourceBufferCount->setValue(m_params.buffer_count);
161 
162  // power of buffer size
163  slSourceBufferSize->setValue(m_params.buffer_size);
165 
166  // after this point all controls have their initial values
167 
168  /* --- connect some missing low level GUI functionality --- */
169 
170  connect(cbMethod, SIGNAL(activated(int)),
171  this, SLOT(methodSelected(int)));
172 
173  // record buffer size and count
174  slSourceBufferCount->setValue(m_params.buffer_count);
175  slSourceBufferSize->setValue(m_params.buffer_size);
176  connect(slSourceBufferSize, SIGNAL(valueChanged(int)),
177  this, SLOT(sourceBufferSizeChanged(int)));
178  connect(slSourceBufferCount, SIGNAL(valueChanged(int)),
179  this, SLOT(sourceBufferCountChanged(int)));
180 
181  // device treeview
182  connect(listDevices,
183  SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)),
184  SLOT(listEntrySelected(QTreeWidgetItem*,QTreeWidgetItem*)));
185  connect(listDevices, SIGNAL(itemExpanded(QTreeWidgetItem*)),
186  SLOT(listItemExpanded(QTreeWidgetItem*)));
187  connect(listDevices, SIGNAL(focusLost()),
188  SLOT(updateListSelection()));
189 
190  // "select device..." button
191  connect(btSourceSelect, SIGNAL(clicked()),
192  this, SLOT(selectRecordDevice()));
193  connect(cbDevice, SIGNAL(activated(QString)),
194  this, SLOT(setDevice(QString)));
195 
196  // setup controls
197  connect(chkRecordTime, SIGNAL(toggled(bool)),
198  this, SLOT(recordTimeChecked(bool)));
199  connect(sbRecordTime, SIGNAL(valueChanged(int)),
200  this, SLOT(recordTimeChanged(int)));
201 
202  connect(chkRecordStartTime, SIGNAL(toggled(bool)),
203  this, SLOT(startTimeChecked(bool)));
204  connect(startTime, SIGNAL(dateTimeChanged(QDateTime)),
205  this, SLOT(startTimeChanged(QDateTime)));
206 
207  connect(chkRecordTrigger, SIGNAL(toggled(bool)),
208  this, SLOT(triggerChecked(bool)));
209  connect(sbRecordTrigger, SIGNAL(valueChanged(int)),
210  this, SLOT(triggerChanged(int)));
211 
212  connect(cbFormatSampleRate, SIGNAL(editTextChanged(QString)),
213  this, SLOT(sampleRateChanged(QString)));
214  connect(cbFormatSampleRate, SIGNAL(activated(QString)),
215  this, SLOT(sampleRateChanged(QString)));
216 
217  connect(sbFormatTracks, SIGNAL(valueChanged(int)),
218  this, SLOT(tracksChanged(int)));
219 
220  connect(cbFormatCompression, SIGNAL(activated(int)),
221  this, SLOT(compressionChanged(int)));
222 
223  connect(sbFormatResolution, SIGNAL(valueChanged(int)),
224  this, SLOT(bitsPerSampleChanged(int)));
225 
226  connect(cbFormatSampleFormat, SIGNAL(activated(int)),
227  this, SLOT(sampleFormatChanged(int)));
228 
229  // connect the buttons to the record controller
230  connect(btNew, SIGNAL(clicked()),
231  controller, SLOT(actionReset()));
232  connect(btStop, SIGNAL(clicked()),
233  controller, SLOT(actionStop()));
234  connect(btPause, SIGNAL(clicked()),
235  controller, SLOT(actionPause()));
236  connect(btRecord, SIGNAL(clicked()),
237  controller, SLOT(actionStart()));
238 
239  // stop recording when the window gets closed
240  connect(this, SIGNAL(rejected()), controller, SLOT(actionStop()));
241  connect(this, SIGNAL(accepted()), controller, SLOT(actionStop()));
242 
243  // connect the notifications/commands of the record controller
244  connect(controller, SIGNAL(stateChanged(Kwave::RecordState)),
245  this, SLOT(setState(Kwave::RecordState)));
246 
247  // timer for updating the buffer progress bar
248  connect(&m_buffer_progress_timer, SIGNAL(timeout()),
249  this, SLOT(updateBufferProgressBar()));
250 
251  // help button
252  connect(buttonBox->button(QDialogButtonBox::Help), SIGNAL(clicked()),
253  this, SLOT(invokeHelp()));
254 
255  // status bar
257  Q_ASSERT(m_state_icon_widget);
258  if (!m_state_icon_widget) return;
259 
260  m_state_icon_widget->setFixedSize(16, 16);
261  lbl_state->addWidget(m_state_icon_widget);
262 
263  m_status_bar.m_state = new (std::nothrow) QLabel(_(" "));
264  Q_ASSERT(m_status_bar.m_state);
265  if (!m_status_bar.m_state) return;
266  m_status_bar.m_state->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
267  lbl_state->addWidget(m_status_bar.m_state);
268 
269  m_status_bar.m_time = new (std::nothrow) QLabel(_(" "));
270  Q_ASSERT(m_status_bar.m_time);
271  if (!m_status_bar.m_time) return;
272  m_status_bar.m_time->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
273  lbl_state->addWidget(m_status_bar.m_time);
274 
275  m_status_bar.m_sample_rate = new (std::nothrow) QLabel(_(" "));
276  Q_ASSERT(m_status_bar.m_sample_rate);
277  if (!m_status_bar.m_sample_rate) return;
278  m_status_bar.m_sample_rate->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
279  lbl_state->addWidget(m_status_bar.m_sample_rate);
280 
281  m_status_bar.m_bits_per_sample = new (std::nothrow) QLabel(_(" "));
282  Q_ASSERT(m_status_bar.m_bits_per_sample);
283  if (!m_status_bar.m_bits_per_sample) return;
284  m_status_bar.m_bits_per_sample->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
285  lbl_state->addWidget(m_status_bar.m_bits_per_sample);
286 
287  m_status_bar.m_tracks = new (std::nothrow) QLabel(_(" "));
288  Q_ASSERT(m_status_bar.m_tracks);
289  if (!m_status_bar.m_tracks) return;
290  m_status_bar.m_tracks->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
291  lbl_state->addWidget(m_status_bar.m_tracks);
292 
293  m_state_icon_widget->setFixedSize(16, lbl_state->childrenRect().height());
294 
295  // set the initial state of the dialog to "Reset/Empty"
297 
298  // disable the "level" tab, it is not implemented yet
299  tabRecord->setCurrentIndex(1);
300  QWidget *page = tabRecord->currentWidget();
301  tabRecord->setCurrentIndex(0);
302  if (page) delete page;
303 
304  // add the "Done" button manually, otherwise it would have "Cancel" semantic
305  QPushButton *bt_done =
306  buttonBox->addButton(i18n("&Done"), QDialogButtonBox::AcceptRole);
307  Q_ASSERT(bt_done);
308  if (!bt_done) return;
309  connect(bt_done, SIGNAL(clicked(bool)), this, SLOT(accept()));
310 
311  switch (mode)
312  {
314  tabRecord->setCurrentIndex(1);
315  break;
317  tabRecord->setCurrentIndex(2);
318  break;
319  case Kwave::RecordDialog::START_RECORDING: /* FALLTHROUGH */
320  case Kwave::RecordDialog::SETTINGS_DEFAULT: /* FALLTHROUGH */
321  default:
322  tabRecord->setCurrentIndex(0);
323  // set the focus onto the "Record" button
324  btRecord->setFocus();
325  break;
326  }
327 }
328 
329 //***************************************************************************
331 {
332  updateBufferState(0,0);
333 }
334 
335 //***************************************************************************
337 {
338  return m_params;
339 }
340 
341 //***************************************************************************
343 {
344  m_params.method = method;
345  cbMethod->setCurrentIndex(m_methods_map.findFromData(
346  m_params.method));
347 }
348 
349 //***************************************************************************
351 {
352  Kwave::record_method_t method = m_methods_map.data(index);
353 // qDebug("RecordDialog::methodSelected(%d) - %d", index, (int)method);
354 
355  Q_ASSERT(method > Kwave::RECORD_NONE);
356  Q_ASSERT(method < Kwave::RECORD_INVALID);
357  if (method <= Kwave::RECORD_NONE) return;
358  if (method >= Kwave::RECORD_INVALID) return;
359 
360  if (method != m_params.method) {
361  setMethod(method);
362  emit sigMethodChanged(method);
363  }
364 }
365 
366 //***************************************************************************
368 {
369 // qDebug("RecordDialog::setSupportedDevices(QStringList devices)");
370  Q_ASSERT(cbDevice);
371  Q_ASSERT(listDevices);
372  if (!cbDevice || !listDevices) return;
373  QString current_device = m_params.device_name;
374 
375  // disable all that noisy stuff that comes from modifying the
376  // device controls...
377  m_enable_setDevice = false;
378 
379  KIconLoader *icon_loader = KIconLoader::global();
380 
381  cbDevice->clearEditText();
382  cbDevice->clear();
383  listDevices->clear();
384 
385  if (devices.contains(_("#EDIT#"))) {
386  devices.removeAll(_("#EDIT#"));
387  cbDevice->setEditable(true);
388  } else {
389  cbDevice->setEditable(false);
390  }
391 
392  if (devices.contains(_("#SELECT#"))) {
393  devices.removeAll(_("#SELECT#"));
394  btSourceSelect->setEnabled(true);
395  btSourceSelect->show();
396  } else {
397  btSourceSelect->setEnabled(false);
398  btSourceSelect->hide();
399  }
400 
401  if (devices.contains(_("#TREE#"))) {
402  // treeview mode
403  devices.removeAll(_("#TREE#"));
404  listDevices->setEnabled(true);
405  cbDevice->setEnabled(false);
406  cbDevice->hide();
407  m_devices_list_map.clear();
408 
409  // build a tree with all nodes in the list
410  foreach (QString dev_id, devices) {
411  QTreeWidgetItem *parent = Q_NULLPTR;
412 
413  QStringList list = dev_id.split(_("||"), QString::KeepEmptyParts);
414  foreach (QString token, list) {
415  QTreeWidgetItem *item = Q_NULLPTR;
416 
417  // split the icon name from the token
418  QString icon_name;
419  int pos = token.indexOf(QLatin1Char('|'));
420  if (pos > 0) {
421  icon_name = token.mid(pos+1);
422  token = token.left(pos);
423  }
424 
425  // find the first item with the same text
426  // and the same root
427  if (parent) {
428  for (int i = 0; i < parent->childCount(); i++) {
429  QTreeWidgetItem *node = parent->child(i);
430  if (node && node->text(0) == token) {
431  item = node;
432  break;
433  }
434  }
435  } else {
436  QList<QTreeWidgetItem *> matches =
437  listDevices->findItems(token, Qt::MatchExactly);
438  if (matches.count())
439  item = matches.takeFirst();
440  }
441 
442  if (item) {
443  // already in the list
444  parent = item;
445  } else if (parent) {
446  // new leaf, add to the parent
447  item = new QTreeWidgetItem(parent);
448  Q_ASSERT(item);
449  if (item) {
450  item->setText(0, token);
451  m_devices_list_map.insert(item, dev_id);
452  }
453 
454  parent->setExpanded(true);
455  parent->setFlags(parent->flags() &
456  ~(Qt::ItemIsUserCheckable | Qt::ItemIsSelectable));
457  if (m_devices_list_map.contains(parent)) {
458  // make the parent not selectable
459  m_devices_list_map.remove(parent);
460  }
461  } else {
462  // new root node
463  item = new QTreeWidgetItem(listDevices);
464  Q_ASSERT(item);
465  if (item) {
466  item->setText(0, token);
467  m_devices_list_map.insert(item, dev_id);
468  }
469  }
470 
471  if (item && icon_name.length() && icon_loader) {
472  QIcon icon = icon_loader->loadIcon(
473  icon_name, KIconLoader::User);
474  item->setIcon(0, icon);
475  }
476 
477  // use the current item as parent for the next pass
478  parent = item;
479  }
480  }
481  } else {
482  // combo box mode
483  cbDevice->addItems(devices);
484  cbDevice->show();
485  listDevices->setEnabled(false);
486 
487  if (devices.contains(current_device)) {
488  // current device is in the list
489  cbDevice->setCurrentIndex(cbDevice->findText(current_device));
490  } else {
491  if (cbDevice->isEditable() && current_device.length()) {
492  // user defined device name
493  cbDevice->setEditText(current_device);
494  } else if (devices.count()) {
495  // one or more other possibilities -> take the first one
496  cbDevice->setCurrentIndex(0);
497  } else {
498  // empty list of possibilities
499  cbDevice->clearEditText();
500  cbDevice->clear();
501  }
502  }
503  cbDevice->setEnabled(devices.count() > 1);
504  }
505 
506  // enable changes in the device controls again
507  m_enable_setDevice = true;
508 }
509 
510 //***************************************************************************
511 void Kwave::RecordDialog::listEntrySelected(QTreeWidgetItem *current,
512  QTreeWidgetItem *previous)
513 {
514  Q_ASSERT(listDevices);
515  Q_UNUSED(previous);
516  if (!current || !listDevices) return;
517 
518  if (m_devices_list_map.contains(current))
519  setDevice(m_devices_list_map[current]);
520 }
521 
522 //***************************************************************************
523 void Kwave::RecordDialog::listItemExpanded(QTreeWidgetItem *item)
524 {
525  Q_UNUSED(item);
527 }
528 
529 //***************************************************************************
531 {
532  // set the current device again, otherwise nothing will be selected
534 }
535 
536 //***************************************************************************
537 void Kwave::RecordDialog::setDevice(const QString &device)
538 {
539  Q_ASSERT(cbDevice);
540  Q_ASSERT(listDevices);
541  if (!cbDevice || !listDevices) return;
542 
543  bool device_changed = (device != m_params.device_name);
544  m_params.device_name = device;
545 // qDebug("RecordDialog::setDevice(%s)", device.local8Bit().data());
546 
547  if (listDevices->isEnabled()) {
548  // treeview mode
549  QTreeWidgetItem *node = m_devices_list_map.key(device, Q_NULLPTR);
550  if (node) {
551  node->setSelected(true);
552  listDevices->scrollToItem(node);
553  listDevices->setCurrentItem(node);
554  }
555  } else if (cbDevice->isEditable() && device.length()) {
556  // user defined device name
557  if (!device.isEmpty() && (cbDevice->currentText() != device)) {
558  cbDevice->setCurrentIndex(cbDevice->findText(device));
559  cbDevice->setEditText(device);
560  }
561  } else {
562  // just take one from the list
563  if (cbDevice->findText(device) >= 0) {
564  cbDevice->setCurrentIndex(cbDevice->findText(device));
565  } else if (cbDevice->count()) {
566  cbDevice->setCurrentIndex(0);
567  }
568  }
569 
570  if (device_changed) emit sigDeviceChanged(device);
571 }
572 
573 //***************************************************************************
575 {
576  Q_ASSERT(value >= 4);
577  Q_ASSERT(value <= 64);
578  if (value < 4) value = 4;
579  if (value > 64) value = 64;
580 
581  // take the value into our struct
582  m_params.buffer_count = value;
583  emit sigBuffersChanged();
584 }
585 
586 //***************************************************************************
588 {
589  Q_ASSERT(value >= 10);
590  Q_ASSERT(value <= 18);
591  if (value < 10) value = 10;
592  if (value > 18) value = 18;
593 
594  // take the value into our struct
595  m_params.buffer_size = value;
596 
597  // update the text
598  unsigned int buffer_size = (1 << value);
599  txtSourceBuffer->setText(i18n("%1 samples", buffer_size));
600 
601  emit sigBuffersChanged();
602 }
603 
604 //***************************************************************************
605 void Kwave::RecordDialog::setFileFilter(const QString &filter)
606 {
607  m_file_filter = filter;
608  if (btSourceSelect) btSourceSelect->setEnabled(m_file_filter.length());
609 }
610 
611 //***************************************************************************
613 {
614  if (!m_enable_setDevice) return;
615 
616  QString filter;
617  filter += _("dsp*|") + i18n("OSS record device (dsp*)");
618  filter += _("\nadsp*|") + i18n("ALSA record device (adsp*)");
619  filter += _("\n*|") + i18n("Any device (*)");
620 
621  QPointer<Kwave::FileDialog> dlg = new(std::nothrow) Kwave::FileDialog(
622  _("kfiledialog:///kwave_record_device"),
623  Kwave::FileDialog::OpenFile, filter, this,
624  QUrl(_("file:/dev"))
625  );
626  if (!dlg) return;
627  dlg->setWindowTitle(i18n("Select Record Device"));
628  if (!m_params.device_name.startsWith(_("#")))
629  dlg->selectUrl(QUrl(_("file:") + m_params.device_name));
630  else
631  dlg->selectUrl(QUrl(_("file:/dev/*")));
632  if (dlg->exec() == QDialog::Accepted) {
633  // selected new device
634  QString new_device = dlg->selectedUrl().path();
635  if (new_device != m_params.device_name)
636  emit sigDeviceChanged(new_device);
637  }
638  delete dlg;
639 }
640 
641 //***************************************************************************
642 QString Kwave::RecordDialog::rate2string(double rate) const
643 {
644  QLocale locale;
645  const QString dot = locale.decimalPoint();
646  const QString tsep = locale.groupSeparator();
647 
648  // format number with 3 digits
649  QString s = locale.toString(rate, 'f', 3);
650 
651  // remove thousands separator (looks ugly)
652  s.remove(tsep);
653 
654  // remove trailing zeroes
655  while (s.endsWith(_("0"))) s.remove(s.length()-1, 1);
656 
657  // remove decimal point if necessary
658  if (s.endsWith(dot)) s.remove(s.length()-1, 1);
659 
660  return s;
661 }
662 
663 //***************************************************************************
664 double Kwave::RecordDialog::string2rate(const QString &rate) const
665 {
666  QLocale locale;
667  const QString s = rate;
668  double r;
669  bool ok;
670  r = locale.toDouble(rate, &ok);
671  Q_ASSERT(ok);
672  if (!ok) return s.toDouble();
673 
674  return r;
675 }
676 
677 //***************************************************************************
679  unsigned int max)
680 {
681  Q_ASSERT(sbFormatTracks);
682  if (!sbFormatTracks) return;
683 
684  if ((min == max) || (!max)) {
685  sbFormatTracks->setEnabled(false);
686  return;
687  } else
688  sbFormatTracks->setEnabled(true);
689 
690  if (sbFormatTracks->value() < sbFormatTracks->minimum()) {
691  sbFormatTracks->setMaximum(max);
692  sbFormatTracks->setMinimum(min);
693  } else {
694  sbFormatTracks->setMinimum(min);
695  sbFormatTracks->setMaximum(max);
696  }
697 
698 }
699 
700 //***************************************************************************
701 void Kwave::RecordDialog::setTracks(unsigned int tracks)
702 {
703 // qDebug("+++ RecordDialog::setTracks(%u)", tracks);
704  Q_ASSERT(sbFormatTracks);
705  Q_ASSERT(m_status_bar.m_tracks);
706  if (!sbFormatTracks || !m_status_bar.m_tracks) return;
707  if (!tracks) return;
708 
709  m_params.tracks = tracks;
710  QString tracks_str;
711 
712  switch (tracks) {
713  case 1:
714  tracks_str = i18n("Mono");
715  break;
716  case 2:
717  tracks_str = i18n("Stereo");
718  break;
719  case 4:
720  tracks_str = i18n("Quadro");
721  break;
722  default:
723  tracks_str = _("");
724  }
725 
726  if (tracks_str.length()) {
727  lblTracksVerbose->setText(_("(") + tracks_str + _(")"));
728  m_status_bar.m_tracks->setText(tracks_str);
729  } else {
730  lblTracksVerbose->setText(_(""));
731  m_status_bar.m_tracks->setText(i18n("%1 tracks", tracks));
732  }
733 
734  sbFormatTracks->setValue(tracks);
735 }
736 
737 //***************************************************************************
739 {
740  if (tracks < 1) return; // no device
741  if (tracks == Kwave::toInt(m_params.tracks)) return;
742 
743  m_params.tracks = tracks;
744  emit sigTracksChanged(tracks);
745 }
746 
747 //***************************************************************************
748 void Kwave::RecordDialog::setSupportedSampleRates(const QList<double> &rates)
749 {
750  Q_ASSERT(cbFormatSampleRate);
751  if (!cbFormatSampleRate) return;
752 
753  cbFormatSampleRate->clearEditText();
754  cbFormatSampleRate->setEditable(false);
755  cbFormatSampleRate->clear();
756 
757  foreach (double r, rates) {
758  QString rate = rate2string(r);
759  Q_ASSERT(rate.length());
760  if (!rate.length()) continue; // string was zero?
761  cbFormatSampleRate->addItem(rate);
762  }
763 
764  bool have_choice = (cbFormatSampleRate->count() > 1);
765  cbFormatSampleRate->setEnabled(have_choice);
766 }
767 
768 //***************************************************************************
770 {
771  Q_ASSERT(cbFormatSampleRate);
772  Q_ASSERT(m_status_bar.m_sample_rate);
773  if (!cbFormatSampleRate || !m_status_bar.m_sample_rate) return;
774 
775  if (new_rate <= 0) {
776  cbFormatSampleRate->setEnabled(false);
777  return;
778  } else {
779  bool have_choice = (cbFormatSampleRate->count() > 1);
780  cbFormatSampleRate->setEnabled(have_choice);
781  m_params.sample_rate = new_rate;
782  }
783 
784  QString rate;
785  rate = rate2string(new_rate);
786  cbFormatSampleRate->setCurrentItem(rate, true);
787  m_status_bar.m_sample_rate->setText(i18n("%1 Hz", rate));
788 }
789 
790 //***************************************************************************
791 void Kwave::RecordDialog::sampleRateChanged(const QString &rate)
792 {
793  if (!rate.length()) return; // no rate selected, combo box clear
794  double sample_rate = string2rate(rate);
795  if (qFuzzyCompare(sample_rate, m_params.sample_rate)) return;
796 
797  m_params.sample_rate = sample_rate;
798  emit sampleRateChanged(sample_rate);
799 }
800 
801 //***************************************************************************
803  const QList<Kwave::Compression::Type> &comps
804 )
805 {
806  Q_ASSERT(cbFormatCompression);
807  if (!cbFormatCompression) return;
808 
809  cbFormatCompression->clear();
810 
811  if (comps.isEmpty()) {
812  // no compressions -> add "none" manually
814  cbFormatCompression->addItem(comp.name());
815  } else {
816  foreach (Kwave::Compression::Type c, comps) {
817  const Kwave::Compression comp(c);
818  cbFormatCompression->addItem(comp.name(), comp.toInt());
819  }
820  }
821 
822  bool have_choice = (cbFormatCompression->count() > 1);
823  cbFormatCompression->setEnabled(have_choice);
824 }
825 
826 //***************************************************************************
828 {
829  Q_ASSERT(cbFormatCompression);
830  if (!cbFormatCompression) return;
831 
832  if (compression < 0) {
833  cbFormatCompression->setEnabled(false);
834  return;
835  } else {
836  bool have_choice = (cbFormatCompression->count() > 1);
837  cbFormatCompression->setEnabled(have_choice);
839  }
840 
841  const Kwave::Compression comp(Kwave::Compression::fromInt(compression));
842  cbFormatCompression->setCurrentItem(comp.name(), true);
843 }
844 
845 //***************************************************************************
847 {
849  cbFormatCompression->itemData(index).toInt());
850  if (compression != m_params.compression)
851  emit sigCompressionChanged(compression);
852 }
853 
854 //***************************************************************************
855 void Kwave::RecordDialog::setSupportedBits(const QList<unsigned int> &bits)
856 {
857  Q_ASSERT(sbFormatResolution);
858  if (!sbFormatResolution) return;
859 
861  if (bits.count()) {
862  sbFormatResolution->setMinimum(bits.first());
863  sbFormatResolution->setMaximum(bits.last());
864  }
865 
866  // enable only if there is a choice
867  sbFormatResolution->setEnabled(bits.count() > 1);
868 }
869 
870 //***************************************************************************
872 {
873  Q_ASSERT(sbFormatResolution);
874  Q_ASSERT(m_status_bar.m_bits_per_sample);
875  if (!sbFormatResolution || !m_status_bar.m_bits_per_sample) return;
876 
877  if (!bits ) {
878  sbFormatResolution->setEnabled(false);
879  return;
880  } else {
881  sbFormatResolution->setEnabled(m_supported_resolutions.count() > 1);
882  m_params.bits_per_sample = bits;
883  }
884 
885  m_status_bar.m_bits_per_sample->setText(i18n("%1 bit", bits));
886  sbFormatResolution->setValue(bits);
887 }
888 
889 //***************************************************************************
891 {
892  if (bits < 1) return; // no device
893  int last = m_params.bits_per_sample;
894  if (bits == last) return;
895 
896  // round up or down to the next supported resolution in bits per sample
897  if (!m_supported_resolutions.isEmpty()) {
898  if (bits > last) {
899  // step up to the next supported value
900  QListIterator<unsigned int> it(m_supported_resolutions);
901  while (it.hasNext()) {
902  bits = it.next();
903  if (bits > last) break;
904  }
905  if (bits < last) bits = m_supported_resolutions.last();
906  } else {
907  // step down to the next supported value
908  QListIterator<unsigned int> it(m_supported_resolutions);
909  it.toBack();
910  while (it.hasPrevious()) {
911  bits = it.previous();
912  if (bits < last) break;
913  }
914  if (bits > last) bits = m_supported_resolutions.first();
915  }
916  }
917 
918  m_params.bits_per_sample = bits;
919 
920  if (sbFormatResolution && (bits != sbFormatResolution->value()))
921  sbFormatResolution->setValue(bits);
922 
923  emit sigBitsPerSampleChanged(bits);
924 }
925 
926 //***************************************************************************
928  const QList<Kwave::SampleFormat::Format> &formats)
929 {
930  Q_ASSERT(cbFormatSampleFormat);
931  if (!cbFormatSampleFormat) return;
932 
933  cbFormatSampleFormat->clear();
935  foreach (Kwave::SampleFormat::Format format, formats) {
936  int index = types.findFromData(format);
937  cbFormatSampleFormat->addItem(
938  types.description(index, true),
939  Kwave::SampleFormat(format).toInt()
940  );
941  }
942 
943  bool have_choice = (cbFormatSampleFormat->count() > 1);
944  cbFormatSampleFormat->setEnabled(have_choice);
945 }
946 
947 //***************************************************************************
949  Kwave::SampleFormat::Format sample_format)
950 {
951  Q_ASSERT(cbFormatSampleFormat);
952  if (!cbFormatSampleFormat) return;
953 
954  if (sample_format == Kwave::SampleFormat::Unknown) {
955  cbFormatSampleFormat->setEnabled(false);
956  return;
957  } else {
958  bool have_choice = (cbFormatSampleFormat->count() > 1);
959  cbFormatSampleFormat->setEnabled(have_choice);
960  m_params.sample_format = sample_format;
961  }
962 
963  int cb_index = cbFormatSampleFormat->findData(
964  Kwave::SampleFormat(sample_format).toInt());
965  cbFormatSampleFormat->setCurrentIndex(cb_index);
966 }
967 
968 //***************************************************************************
970 {
971  Q_ASSERT(cbFormatSampleFormat);
972  if (!cbFormatSampleFormat) return;
973 
974  Kwave::SampleFormat format;
975  format.fromInt(cbFormatSampleFormat->itemData(index).toInt());
976 
977  if (format == m_params.sample_format) return;
978 
979  emit sigSampleFormatChanged(format);
980 }
981 
982 //***************************************************************************
984 {
985  Q_ASSERT(m_status_bar.m_state);
986  if (!m_status_bar.m_state) return;
987 
988  bool enable_new = false;
989  bool enable_pause = false;
990  bool enable_stop = false;
991  bool enable_record = false;
992  bool enable_settings = false;
993  bool enable_trigger = false;
994  QString state_text = _("");
995  QVector<QPixmap> pixmaps;
996  unsigned int animation_time = 500;
997 
998  m_state = state;
999  switch (state) {
1001  state_text = i18n("Please check the source device settings...");
1002  enable_new = true;
1003  enable_pause = false;
1004  enable_stop = false;
1005  enable_record = false;
1006  enable_settings = true;
1007  enable_trigger = true;
1008  pixmaps.push_back(QPixmap(stop_hand_xpm));
1009  pixmaps.push_back(QPixmap(ledred_xpm));
1010  m_status_bar.m_time->setText(_(""));
1011  break;
1012  case Kwave::REC_EMPTY:
1013  state_text = i18n("(empty)");
1014  enable_new = true;
1015  enable_pause = false;
1016  enable_stop = false;
1017  enable_record = m_params.device_name.length();
1018  enable_settings = true;
1019  enable_trigger = true;
1020  pixmaps.push_back(QPixmap(ledgreen_xpm));
1021  m_status_bar.m_time->setText(_(""));
1022  break;
1023  case Kwave::REC_BUFFERING:
1024  state_text = i18n("Buffering...");
1025  enable_new = true; /* throw away current FIFO content */
1026  enable_pause = false;
1027  enable_stop = true;
1028  enable_record = true; /* acts as "trigger now" */
1029  enable_settings = false;
1030  enable_trigger = true;
1031  pixmaps.push_back(QPixmap(ledgreen_xpm));
1032  pixmaps.push_back(QPixmap(ledlightgreen_xpm));
1033  break;
1035  state_text = i18n("Prerecording...");
1036  enable_new = false;
1037  enable_pause = false;
1038  enable_stop = true;
1039  enable_record = true;
1040  enable_settings = false;
1041  enable_trigger = true;
1042  pixmaps.push_back(QPixmap(ledgreen_xpm));
1043  pixmaps.push_back(QPixmap(ledlightgreen_xpm));
1044  break;
1046  state_text = i18n("Waiting for trigger...");
1047  enable_new = false;
1048  enable_pause = false;
1049  enable_stop = true;
1050  enable_record = true; /* acts as "trigger now" */
1051  enable_settings = false;
1052  enable_trigger = true;
1053  pixmaps.push_back(QPixmap(ledgreen_xpm));
1054  pixmaps.push_back(QPixmap(ledlightgreen_xpm));
1055  break;
1056  case Kwave::REC_RECORDING:
1057  state_text = i18n("Recording...");
1058  enable_new = false;
1059  enable_pause = true;
1060  enable_stop = true;
1061  enable_record = false;
1062  enable_settings = false;
1063  enable_trigger = false;
1064  pixmaps.push_back(QPixmap(walk_r1_xpm));
1065  pixmaps.push_back(QPixmap(walk_r2_xpm));
1066  pixmaps.push_back(QPixmap(walk_r3_xpm));
1067  pixmaps.push_back(QPixmap(walk_r4_xpm));
1068  pixmaps.push_back(QPixmap(walk_r5_xpm));
1069  pixmaps.push_back(QPixmap(walk_r6_xpm));
1070  pixmaps.push_back(QPixmap(walk_r7_xpm));
1071  pixmaps.push_back(QPixmap(walk_r8_xpm));
1072  animation_time = 100;
1073  break;
1074  case Kwave::REC_PAUSED:
1075  state_text = i18n("Paused");
1076  enable_new = true; /* start again */
1077  enable_pause = true; /* used for "continue" */
1078  enable_stop = true;
1079  enable_record = true; /* used for "continue" */
1080  enable_settings = false;
1081  enable_trigger = false;
1082  pixmaps.push_back(QPixmap(ledgreen_xpm));
1083  pixmaps.push_back(QPixmap(ledyellow_xpm));
1084  break;
1085  case Kwave::REC_DONE:
1086  state_text = i18n("Done");
1087  enable_new = true;
1088  enable_pause = false;
1089  enable_stop = false;
1090  enable_record = true;
1091  enable_settings = true;
1092  enable_trigger = true;
1093  pixmaps.push_back(QPixmap(ok_xpm));
1094  break;
1095  }
1096  m_status_bar.m_state->setText(state_text);
1097  m_state_icon_widget->setPixmaps(pixmaps, animation_time);
1098 
1099  // enable/disable the record control buttons
1100  btNew->setEnabled(enable_new);
1101  btPause->setEnabled(enable_pause);
1102  btStop->setEnabled(enable_stop);
1103  m_record_enabled = enable_record;
1105 
1106  // enable disable all controls (groups) for setup
1107  chkRecordPre->setEnabled(enable_settings);
1108  sbRecordPre->setEnabled(enable_settings &&
1109  chkRecordPre->isChecked());
1110  slRecordPre->setEnabled(enable_settings &&
1111  chkRecordPre->isChecked());
1112 
1113  chkRecordStartTime->setEnabled(enable_settings);
1114  chkRecordTime->setEnabled(enable_settings);
1115  sbRecordTime->setEnabled(enable_settings &&
1116  chkRecordTime->isChecked());
1117  chkRecordTrigger->setEnabled(enable_settings);
1118 
1119  // it is not really necessary to disable these ;-)
1120  sbRecordTrigger->setEnabled(enable_trigger &&
1121  chkRecordTrigger->isChecked());
1122  slRecordTrigger->setEnabled(enable_trigger &&
1123  chkRecordTrigger->isChecked());
1124  startTime->setEnabled(enable_settings &&
1125  chkRecordStartTime->isChecked());
1126 
1127  grpFormat->setEnabled(enable_settings);
1128  grpSource->setEnabled(enable_settings);
1129 
1130 }
1131 
1132 //***************************************************************************
1134  unsigned int total)
1135 {
1136  Q_ASSERT(progress_bar);
1137  Q_ASSERT(m_status_bar.m_state);
1138  if (!progress_bar || !m_status_bar.m_state) return;
1139 
1140  if (total == 0) {
1141  // we are done: stop update timer and reset buffer percentage
1142  m_buffer_progress_timer.stop();
1145  progress_bar->setTextVisible(false);
1146  progress_bar->setMinimum(0);
1147  progress_bar->setMaximum(100);
1148  progress_bar->setValue(0);
1149  progress_bar->reset();
1150  } else {
1151  m_buffer_progress_count = count;
1152  m_buffer_progress_total = total;
1153 
1154  if (!m_buffer_progress_timer.isActive())
1156  }
1157 
1158  // update recording time
1159  QString txt;
1160  switch (m_state) {
1162  case Kwave::REC_EMPTY:
1163  case Kwave::REC_BUFFERING:
1165  txt = _("");
1166  break;
1168  txt = _("");
1169  QString state_text;
1170  QDateTime now = QDateTime::currentDateTime();
1171  QDateTime t_start = m_params.start_time;
1172 
1173  if (m_params.start_time_enabled && (now < t_start)) {
1174  // waiting for start time to come...
1175 
1176  int s = Kwave::toInt(now.secsTo(t_start));
1177  int m = s / 60;
1178  s %= 60;
1179  int h = m / 60;
1180  m %= 60;
1181  int d = h / 24;
1182  h %= 24;
1183 
1184  QString days = (d) ?
1185  i18np("one day ", "%1 days ", d) : _("");
1186  QString hours = (h) ?
1187  i18np("one hour ", "%1 hours ", h) : _("");
1188  QString minutes = (m) ?
1189  i18np("one minute ", "%1 minutes ", m) : _("");
1190  QString seconds =
1191  (d | h | m) ?
1192  i18np("and %1 second", "and %1 seconds", s) :
1193  i18np("%1 second", "%1 seconds", s);
1194 
1195  state_text = i18nc(
1196  "%1=days; %2=hours; %3=minutes; %4=seconds",
1197  "Waiting for start in %1%2%3%4...",
1198  days, hours, minutes, seconds);
1199  } else {
1200  // waiting for trigger...
1201  state_text = i18n("Waiting for trigger...");
1202  }
1203  m_status_bar.m_state->setText(state_text);
1204 
1205  break;
1206  }
1207  case Kwave::REC_RECORDING:
1208  case Kwave::REC_PAUSED:
1209  case Kwave::REC_DONE: {
1210  if (m_samples_recorded > 1) {
1211  double rate = m_params.sample_rate;
1212  double ms = (rate > 0) ?
1213  ((static_cast<double>(m_samples_recorded) / rate) * 1E3)
1214  : 0;
1215  txt = _(" ") +
1216  i18n("Length: %1", Kwave::ms2string(ms)) +
1217  _(" ") + i18n("(%1 samples)",
1219  } else txt = _("");
1220  break;
1221  }
1222  }
1223  m_status_bar.m_time->setText(txt);
1224 }
1225 
1226 //***************************************************************************
1228 {
1229  m_params.pre_record_enabled = enabled;
1230  emit sigPreRecordingChanged(enabled);
1231 }
1232 
1233 //***************************************************************************
1235 {
1236  m_params.pre_record_time = time;
1237 }
1238 
1239 //***************************************************************************
1241 {
1242  m_params.record_time_limited = limited;
1243  emit sigRecordTimeChanged(limited ? sbRecordTime->value() : -1);
1244 }
1245 
1246 //***************************************************************************
1248 {
1249  m_params.record_time = limit;
1250  emit sigRecordTimeChanged(chkRecordTime->isChecked() ?
1251  limit : -1);
1253 }
1254 
1255 //***************************************************************************
1257 {
1258  m_params.start_time_enabled = enabled;
1260 }
1261 
1262 //***************************************************************************
1263 void Kwave::RecordDialog::startTimeChanged(const QDateTime &datetime)
1264 {
1265  m_params.start_time = datetime;
1266 
1267  // force seconds to zero
1268  QTime t = m_params.start_time.time();
1269  t.setHMS(t.hour(), t.minute(), 0, 0);
1270  m_params.start_time.setTime(t);
1271 }
1272 
1273 //***************************************************************************
1275 {
1276  m_params.record_trigger_enabled = enabled;
1278 }
1279 
1280 //***************************************************************************
1282 {
1283  m_params.record_trigger = trigger;
1284 }
1285 
1286 //***************************************************************************
1288 {
1289  unsigned int count = m_buffer_progress_count;
1290  unsigned int total = m_buffer_progress_total;
1291 // qDebug("RecordDialog::updateBufferProgressBar(): %u/%u",
1292 // count, total);
1293 
1294  /*
1295  * @note: QProgressBar has a bug when handling small numbers,
1296  * therefore we multiply everything by 100
1297  */
1298  progress_bar->setTextVisible(true);
1299  progress_bar->setMinimum(0);
1300  progress_bar->setMaximum(100 * total);
1301  progress_bar->setValue(100 * count);
1302 
1303  m_buffer_progress_timer.setSingleShot(true);
1304  m_buffer_progress_timer.setInterval(100);
1305  m_buffer_progress_timer.start();
1306 }
1307 
1308 //***************************************************************************
1309 void Kwave::RecordDialog::updateEffects(unsigned int track,
1310  Kwave::SampleArray &buffer)
1311 {
1312  if (!buffer.size()) return;
1313 
1314  if (level_meter) {
1315  level_meter->setTracks(m_params.tracks);
1316  level_meter->setSampleRate(m_params.sample_rate);
1317  level_meter->updateTrack(track, buffer);
1318  }
1319 
1320 }
1321 
1322 //***************************************************************************
1324 {
1325  // if (!m_params.record_time_limited) return; // not of interest
1326  m_samples_recorded = samples_recorded;
1328 }
1329 
1330 //***************************************************************************
1332 {
1333  bool old_enable = btRecord->isEnabled();
1334  bool new_enable;
1335 
1336  // enabled if not disabled by status and also not limited or
1337  // less than the limit has been recorded
1338  new_enable = m_record_enabled && (!m_params.record_time_limited ||
1340 
1341  if (new_enable != old_enable) btRecord->setEnabled(new_enable);
1342 }
1343 
1344 //***************************************************************************
1346 {
1347  KHelpClient::invokeHelp(_("recording"));
1348 }
1349 
1350 //***************************************************************************
1352 {
1353  if (lbl_state) lbl_state->showMessage(message, 3000);
1354 }
1355 
1356 //***************************************************************************
1358 {
1359  if (tabRecord) tabRecord->setCurrentIndex(2);
1360 }
1361 
1362 //***************************************************************************
1363 //***************************************************************************
void bitsPerSampleChanged(int bits)
RecordDialog(QWidget *parent, QStringList &params, Kwave::RecordController *controller, Mode mode)
void setBitsPerSample(unsigned int bits)
unsigned int bits_per_sample
Definition: RecordParams.h:105
void recordTimeChecked(bool limited)
void setState(Kwave::RecordState state)
void updateBufferState(unsigned int count, unsigned int total)
void setTracks(unsigned int tracks)
void setPixmaps(const QVector< QPixmap > &pixmaps, unsigned int speed=150)
unsigned int count() const
Definition: TypesMap.h:81
struct Kwave::RecordDialog::@16 m_status_bar
Definition: App.h:33
Kwave::StatusWidget * m_state_icon_widget
Definition: RecordDialog.h:349
QString Q_DECL_EXPORT ms2string(double ms, int precision=6)
Definition: Utils.cpp:66
QString Q_DECL_EXPORT samples2string(sample_index_t samples)
Definition: Utils.cpp:98
QString rate2string(double rate) const
QString description(IDX type, bool localized) const
Definition: TypesMap.h:128
void selectUrl(const QUrl &url)
Definition: FileDialog.cpp:271
DATA data(IDX type) const
Definition: TypesMap.h:110
void sigDeviceChanged(const QString &device)
void setSupportedBits(const QList< unsigned int > &bits)
QString name() const
Definition: Compression.cpp:45
void sourceBufferSizeChanged(int value)
QMap< QTreeWidgetItem *, QString > m_devices_list_map
Definition: RecordDialog.h:315
QTimer m_buffer_progress_timer
Definition: RecordDialog.h:333
sample_index_t m_samples_recorded
Definition: RecordDialog.h:343
void preRecordingTimeChanged(int time)
static Kwave::Compression::Type fromInt(int i)
Definition: Compression.cpp:78
quint64 sample_index_t
Definition: Sample.h:28
unsigned int pre_record_time
Definition: RecordParams.h:78
Kwave::RecordParams m_params
Definition: RecordDialog.h:321
void sigBitsPerSampleChanged(unsigned int bits)
void tracksChanged(int tracks)
bool connect(Kwave::StreamObject &source, const char *output, Kwave::StreamObject &sink, const char *input)
Definition: Connect.cpp:48
Kwave::RecordTypesMap m_methods_map
Definition: RecordDialog.h:309
record_method_t
Definition: RecordParams.h:37
unsigned int m_buffer_progress_total
Definition: RecordDialog.h:330
void setCompression(int compression)
unsigned int record_time
Definition: RecordParams.h:81
unsigned int record_trigger
Definition: RecordParams.h:87
#define STD_SETUP(enabled, property, control)
void setRecordedSamples(sample_index_t samples_recorded)
void setMethod(Kwave::record_method_t method)
void sigPreRecordingChanged(bool enabled)
void preRecordingChecked(bool enabled)
void sigTracksChanged(unsigned int tracks)
void sampleFormatChanged(int index)
int toInt(T x)
Definition: Utils.h:127
void sigSampleFormatChanged(Kwave::SampleFormat::Format sample_format)
void startTimeChecked(bool enabled)
void setSupportedSampleRates(const QList< double > &rates)
unsigned int tracks
Definition: RecordParams.h:102
void listItemExpanded(QTreeWidgetItem *item)
unsigned int m_buffer_progress_count
Definition: RecordDialog.h:327
void sigMethodChanged(Kwave::record_method_t method)
void setSampleRate(double new_rate)
void sigRecordTimeChanged(int limit)
QList< unsigned int > m_supported_resolutions
Definition: RecordDialog.h:324
void setSupportedTracks(unsigned int min, unsigned int max)
void triggerChanged(int trigger)
void sampleRateChanged(double rate)
void listEntrySelected(QTreeWidgetItem *current, QTreeWidgetItem *previous)
void setSampleFormat(Kwave::SampleFormat::Format sample_format)
Kwave::RecordParams & params()
Kwave::SampleFormat::Format sample_format
Definition: RecordParams.h:106
void sourceBufferCountChanged(int value)
void triggerChecked(bool enabled)
#define _(m)
Definition: memcpy.c:66
void setDevice(const QString &device)
unsigned int size() const
void setSupportedDevices(QStringList devices)
QDateTime start_time
Definition: RecordParams.h:84
#define STD_SETUP_SLIDER(enabled, property, control)
Kwave::record_method_t method
Definition: RecordParams.h:75
void startTimeChanged(const QDateTime &datetime)
void sigTriggerChanged(bool enabled)
int toInt() const
Definition: SampleFormat.h:70
void updateEffects(unsigned int track, Kwave::SampleArray &buffer)
Kwave::Compression::Type compression
Definition: RecordParams.h:104
unsigned int buffer_count
Definition: RecordParams.h:108
double string2rate(const QString &rate) const
void sigCompressionChanged(Kwave::Compression::Type compression)
void setFileFilter(const QString &filter)
void compressionChanged(int index)
void setSupportedSampleFormats(const QList< Kwave::SampleFormat::Format > &formats)
virtual int fromList(const QStringList &list)
Kwave::RecordState m_state
Definition: RecordDialog.h:318
RecordState
Definition: RecordState.h:25
IDX findFromData(const DATA &data) const
Definition: TypesMap.h:89
void methodSelected(int index)
void recordTimeChanged(int record_time)
unsigned int buffer_size
Definition: RecordParams.h:109
int toInt() const
Definition: Compression.h:122
void setSupportedCompressions(const QList< Kwave::Compression::Type > &comps)
void message(const QString &message)