22 #include <QApplication> 25 #include <QLatin1Char> 27 #include <QPushButton> 30 #include <QStringList> 31 #include <QTreeWidget> 32 #include <QTreeWidgetItem> 36 #include <KConfigGroup> 37 #include <KHelpClient> 38 #include <KLocalizedString> 39 #include <KIconLoader> 41 #include <KSharedConfig> 60 :QDialog(p.parentWidget()), PlayBackDlg(),
61 m_playback_controller(playback_controller),
63 m_playback_params(params),
67 m_enable_setDevice(true)
79 cbMethod->setEnabled(cbMethod->count() > 1);
81 connect(cbMethod, SIGNAL(activated(
int)),
83 connect(cbDevice, SIGNAL(editTextChanged(QString)),
85 connect(cbDevice, SIGNAL(activated(QString)),
87 connect(cbBitsPerSample, SIGNAL(editTextChanged(QString)),
89 connect(cbBitsPerSample, SIGNAL(activated(QString)),
91 connect(sbChannels, SIGNAL(valueChanged(
int)),
93 connect(slBufferSize, SIGNAL(valueChanged(
int)),
95 connect(btSelectDevice, SIGNAL(clicked()),
99 SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)),
101 connect(listDevices, SIGNAL(itemExpanded(QTreeWidgetItem*)),
103 connect(listDevices, SIGNAL(focusLost()),
106 connect(btTest, SIGNAL(clicked()),
108 connect(btHelp->button(QDialogButtonBox::Help), SIGNAL(clicked()),
112 listDevices->headerItem()->setHidden(
true);
115 setFixedHeight(sizeHint().height());
129 buttonBox->button(QDialogButtonBox::Ok)->setFocus();
145 int index = cbMethod->findData(static_cast<int>(method));
146 if (cbMethod->currentIndex() != index) {
147 cbMethod->setCurrentIndex(index);
151 qDebug(
"PlayBackDialog::setMethod('%s' [%d])",
153 static_cast<int>(method) );
156 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
166 QString device =
_(
"");
167 QString section =
_(
"plugin playback");
168 KConfigGroup cfg = KSharedConfig::openConfig()->group(section);
172 QString(
_(
"last_device_%1")).arg(static_cast<int>(old_method)),
174 qDebug(
"SAVE: '%s' (%d) -> '%s'",
176 static_cast<int>(old_method),
184 qDebug(
" method has changed: %d -> %d",
186 static_cast<int>(method));
190 QApplication::restoreOverrideCursor();
197 qWarning(
"found no valid playback method");
208 QApplication::restoreOverrideCursor();
214 device = cfg.readEntry(
215 _(
"last_device_%1").arg(static_cast<int>(method)));
216 qDebug(
"RESTORE: '%s' (%d) -> '%s'",
218 static_cast<int>(method),
219 DBG(device.split(
_(
"|")).at(0)));
235 QApplication::restoreOverrideCursor();
242 cbMethod->itemData(index).toInt());
244 qDebug(
"PlayBackDialog::methodSelected(%d) -> %s [%d]", index,
246 static_cast<int>(method) );
258 Q_ASSERT(listDevices);
259 if (!cbDevice || !listDevices)
return;
270 cbDevice->clearEditText();
272 listDevices->clear();
274 if (devices.contains(
_(
"#EDIT#"))) {
275 devices.removeAll(
_(
"#EDIT#"));
276 cbDevice->setEditable(
true);
278 cbDevice->setEditable(
false);
281 if (devices.contains(
_(
"#SELECT#"))) {
282 devices.removeAll(
_(
"#SELECT#"));
283 btSelectDevice->setEnabled(
true);
284 btSelectDevice->show();
286 btSelectDevice->setEnabled(
false);
287 btSelectDevice->hide();
290 if (devices.contains(
_(
"#TREE#"))) {
292 KIconLoader *icon_loader = KIconLoader::global();
294 devices.removeAll((
_(
"#TREE#")));
295 listDevices->setEnabled(
true);
296 cbDevice->setEnabled(
false);
301 foreach (
const QString &dev_id, devices) {
302 QTreeWidgetItem *parent = Q_NULLPTR;
304 QStringList list = dev_id.split(
_(
"||"), QString::KeepEmptyParts);
305 foreach (
const QString &t, list) {
307 QTreeWidgetItem *item = Q_NULLPTR;
311 int pos = token.indexOf(QLatin1Char(
'|'));
313 icon_name = token.mid(pos+1);
314 token = token.left(pos);
320 for (
int i = 0; i < parent->childCount(); i++) {
321 QTreeWidgetItem *node = parent->child(i);
322 if (node && node->text(0) == token) {
328 QList<QTreeWidgetItem *> matches =
329 listDevices->findItems(token, Qt::MatchExactly);
331 item = matches.takeFirst();
339 item =
new QTreeWidgetItem(parent);
342 item->setText(0, token);
346 parent->setExpanded(
true);
347 parent->setFlags(parent->flags() &
348 ~(Qt::ItemIsUserCheckable | Qt::ItemIsSelectable));
355 item =
new QTreeWidgetItem(listDevices);
358 item->setText(0, token);
363 if (item && icon_name.length() && icon_loader) {
364 QIcon icon = icon_loader->loadIcon(
365 icon_name, KIconLoader::User);
366 item->setIcon(0, icon);
375 cbDevice->addItems(devices);
377 listDevices->setEnabled(
false);
379 if (devices.contains(current_device)) {
381 cbDevice->setCurrentIndex(cbDevice->findText(current_device));
383 if (cbDevice->isEditable() && current_device.length()) {
385 cbDevice->setEditText(current_device);
386 }
else if (devices.count()) {
388 cbDevice->setCurrentIndex(0);
391 cbDevice->clearEditText();
395 cbDevice->setEnabled(devices.count() > 1);
404 QTreeWidgetItem *previous)
406 Q_ASSERT(listDevices);
408 if (!current || !listDevices)
return;
432 Q_ASSERT(listDevices);
433 if (!cbDevice || !listDevices)
return;
437 qDebug(
"PlayBackDialog::setDevice(): '%s' -> '%s'",
439 DBG(device.split(
_(
"|")).at(0)));
441 if (listDevices->isEnabled()) {
445 node->setSelected(
true);
446 listDevices->scrollToItem(node);
447 listDevices->setCurrentItem(node);
449 }
else if (cbDevice->isEditable() && device.length()) {
451 if (!device.isEmpty() && (cbDevice->currentText() != device)) {
452 cbDevice->setCurrentIndex(cbDevice->findText(device));
453 cbDevice->setEditText(device);
457 if (cbDevice->findText(device) >= 0) {
458 cbDevice->setCurrentIndex(cbDevice->findText(device));
459 }
else if (cbDevice->count()) {
460 cbDevice->setCurrentIndex(0);
465 QString dev = device;
468 supported.removeAll(
_(
"#EDIT#"));
469 supported.removeAll(
_(
"#SELECT#"));
470 supported.removeAll(
_(
"#TREE#"));
471 if (!supported.isEmpty() && !supported.contains(device)) {
473 dev = supported.first();
474 qDebug(
"PlayBackPlugin::setDevice(%s) -> fallback to '%s'",
475 DBG(device.split(
_(
"|")).at(0)),
476 DBG(dev.split(
_(
"|")).at(0)));
484 QList<unsigned int> supported_bits;
488 unsigned int min = 0;
489 unsigned int max = 0;
497 Q_ASSERT(slBufferSize);
498 Q_ASSERT(txtBufferSize);
499 if (!slBufferSize || !txtBufferSize)
return;
501 if (exp < 8) exp = 8;
502 if (exp > 18) exp = 18;
505 if (slBufferSize->value() != exp) slBufferSize->setValue(exp);
511 unsigned int buffer_size = (1 << exp);
513 if (buffer_size < 1024) {
514 text = i18n(
"%1 Bytes", buffer_size);
516 text = i18n(
"%1 kB", buffer_size >> 10);
518 txtBufferSize->setText(text);
524 Q_ASSERT(cbBitsPerSample);
525 if (!cbBitsPerSample)
return;
528 cbBitsPerSample->clear();
530 foreach (
unsigned int b, bits) {
532 cbBitsPerSample->addItem(txt);
537 txt.setNum(current_bits);
538 cbBitsPerSample->addItem(txt);
541 if (!bits.contains(current_bits) && bits.count())
542 current_bits = bits.last();
545 cbBitsPerSample->setEnabled(bits.count() > 0);
552 unsigned int bits = text.toUInt(&ok);
561 Q_ASSERT(cbBitsPerSample);
562 if (!cbBitsPerSample)
return;
564 qDebug(
"PlayBackDialog::setBitsPerSample(): %u -> %u",
569 if (cbBitsPerSample->findText(txt) >= 0) {
570 cbBitsPerSample->setCurrentIndex(cbBitsPerSample->findText(txt));
578 Q_ASSERT(sbChannels);
579 if (!sbChannels)
return;
584 if (!min && !max && current_channels)
585 min = max = current_channels;
587 sbChannels->setMinimum(min);
588 sbChannels->setMaximum(max);
590 sbChannels->setEnabled(min != max);
596 Q_ASSERT(sbChannels);
597 if (!sbChannels)
return;
599 if ((sbChannels->value() != channels) &&
600 (sbChannels->minimum() != sbChannels->maximum()) &&
601 (sbChannels->maximum() > 0))
603 sbChannels->setValue(channels);
604 channels = sbChannels->value();
607 qDebug(
"PlayBackDialog::setChannels(): %d -> %d",
613 case 1: txt = i18n(
"(mono)");
break;
614 case 2: txt = i18n(
"(stereo)");
break;
615 case 4: txt = i18n(
"(quadro)");
break;
616 default: txt =
_(
"");
618 lblChannels->setText(txt);
631 if (btSelectDevice) btSelectDevice->setEnabled(
m_file_filter.length());
640 _(
"kfiledialog:///kwave_playback_device"),
645 dlg->setWindowTitle(i18n(
"Select Playback Device"));
649 dlg->selectUrl(QUrl(
_(
"file:/dev/*")));
650 if (dlg->exec() == QDialog::Accepted) {
651 QString new_device = dlg->selectedUrl().fileName();
653 if (cbDevice) cbDevice->setEditText(new_device);
661 KHelpClient::invokeHelp(
_(
"playback"));
unsigned int count() const
void setMethod(Kwave::playback_method_t method)
virtual int detectChannels(const QString &device, unsigned int &min, unsigned int &max)
PlayBackDialog(Kwave::Plugin &p, Kwave::PlaybackController &playback_controller, const Kwave::PlayBackParam ¶ms)
void updateListSelection()
QString description(IDX type, bool localized) const
void selectUrl(const QUrl &url)
DATA data(IDX type) const
virtual QString fileFilter()
unsigned int bits_per_sample
void listItemExpanded(QTreeWidgetItem *item)
void checkMethod(Kwave::playback_method_t &method)
void methodSelected(int index)
bool connect(Kwave::StreamObject &source, const char *output, Kwave::StreamObject &sink, const char *input)
void setDevice(const QString &device)
QMap< QTreeWidgetItem *, QString > m_devices_list_map
Kwave::PlayBackDevice * m_device
Kwave::PlayBackTypesMap m_methods_map
virtual QStringList supportedDevices()
void selectPlaybackDevice()
void setSupportedDevices(QStringList devices)
void listEntrySelected(QTreeWidgetItem *current, QTreeWidgetItem *previous)
void setSupportedChannels(unsigned int min, unsigned int max)
virtual QList< unsigned int > supportedBits(const QString &device)=0
void setBitsPerSample(unsigned int bits)
void setSupportedBits(const QList< unsigned int > &bits)
void bitsPerSampleSelected(const QString &text)
void setChannels(int channels)
void setFileFilter(const QString &filter)
QString name(IDX type) const
Kwave::playback_method_t method
Kwave::PlayBackParam m_playback_params
virtual ~PlayBackDialog()
virtual Kwave::PlayBackDevice * createDevice(Kwave::playback_method_t method)
Kwave::PlaybackController & m_playback_controller
void setBufferSize(int exp)
IDX findFromData(const DATA &data) const
const Kwave::PlayBackParam & params()