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()