19 #ifdef HAVE_QT_AUDIO_SUPPORT    24 #include <QApplication>    25 #include <QAudioDeviceInfo>    26 #include <QAudioFormat>    27 #include <QAudioInput>    31 #include <QLatin1Char>    37 #include <KLocalizedString>    48 #define DEFAULT_DEVICE (i18n("Default device") + _("|sound_note"))    51 #define RECORD_POLL_TIMEOUT 200    57 #define BUFFER_SIZE_OVERCOMMIT 2    63      m_lock(QMutex::Recursive),
    65      m_available_devices(),
    79             Qt::BlockingQueuedConnection);
    82             Qt::BlockingQueuedConnection);
   109     QList<Kwave::SampleFormat::Format> list;
   110     QMutexLocker _lock(&
m_lock); 
   115     if (info.isNull()) 
return list;
   118     foreach (QAudioFormat::SampleType t, info.supportedSampleTypes()) {
   120             case QAudioFormat::SignedInt:
   123             case QAudioFormat::UnSignedInt:
   126             case QAudioFormat::Float:
   141     QMutexLocker _lock(&
m_lock); 
   146     if (info.isNull()) 
return byte_order;
   149     switch (info.preferredFormat().byteOrder()) {
   182     QList<unsigned int> list;
   183     QMutexLocker _lock(&
m_lock); 
   188     if (info.isNull()) 
return list;
   191     foreach (
int bits, info.supportedSampleSizes()) {
   192         if (bits <= 0) 
continue;
   196     std::sort(list.begin(), list.end(), std::less<unsigned int>());
   219     QList<Kwave::Compression::Type> list;
   233     if (qFuzzyCompare(new_rate, 
m_rate))  
return 0;
   244     QMutexLocker _lock(&
m_lock); 
   249     if (info.isNull()) 
return list;
   252     foreach (
int rate, info.supportedSampleRates()) {
   253         if (rate <= 0) 
continue;
   254         list.append(static_cast<double>(rate));
   257     std::sort(list.begin(), list.end(), std::less<double>());
   271     if (tracks > 255) tracks = 255;
   281     QMutexLocker _lock(&
m_lock); 
   285     max = std::numeric_limits<unsigned int>::min();
   286     min = std::numeric_limits<unsigned int>::max();
   289     if (info.isNull()) 
return -1;
   292     foreach (
int channels, info.supportedChannelCounts()) {
   293         if (channels <= 0) 
continue;
   296         if (c < min) min = c;
   297         if (c > max) max = c;
   300     return (max > 0) ? max : -1;
   308         return QAudioDeviceInfo::defaultInputDevice();
   312         return QAudioDeviceInfo();
   318         if (dev.deviceName() == dev_name)
   319             return QAudioDeviceInfo(dev);
   323     return QAudioDeviceInfo();
   346     QMutexLocker _lock(&
m_lock);
   348     if (QThread::currentThread() == qApp->thread())
   359     if (buffer.isNull() || buffer.isEmpty())
   362     int buffer_size = buffer.size();
   368         if (err < 0) 
return -EAGAIN;
   377     if ((buffer_size > 0) && (
m_input->bufferSize() != buffer_size))
   383     char *p = buffer.data() + offset;
   384     unsigned int len = buffer.length() - offset;
   385     qint64 length = 
m_source->read(p, len);
   397     QMutexLocker _lock(&
m_lock);
   402     const QAudioDeviceInfo info(
deviceInfo(device));
   404         return QString::number(ENODEV);
   414     QMutexLocker _lock(&
m_lock); 
   426     if (!list.isEmpty()) list.append(
_(
"#TREE#"));
   436     if (
m_rate < 1.0)          
return -EINVAL;
   439     if (!
m_device.length())    
return -EINVAL;
   444     const QAudioFormat preferred_format(info.preferredFormat());
   445     QAudioFormat format(preferred_format);
   449     format.setCodec(
_(
"audio/pcm"));
   452     if (!format.isValid() || !info.isFormatSupported(format))
   453         format = info.nearestFormat(format);
   455     if (format.codec() != 
_(
"audio/pcm")) {
   456         qWarning(
"PCM encoding is not supported");
   466         qWarning(
"recording with %d channels is not supported", 
m_tracks);
   475     if ( (format.sampleType() != QAudioFormat::SignedInt) &&
   476          (format.sampleType() != QAudioFormat::UnSignedInt) )
   478         qWarning(
"integer sample format is not supported");
   483     if (QThread::currentThread() == qApp->thread())
   493                                          unsigned int buffer_size)
   495     QMutexLocker _lock(&
m_lock);
   501     m_input = 
new QAudioInput(format, 
this);
   526     foreach (
const QAudioDeviceInfo &device,
   527              QAudioDeviceInfo::availableDevices(QAudio::AudioInput))
   529         QString qt_name = device.deviceName();
   535         if (!qt_name.length()) {
   536             qWarning(
"RecordQt::supportedDevices() "   537                       "=> BUG: device with no name?");
   541         QString gui_name = qt_name + 
_(
"|sound_note");
   543             qWarning(
"RecordQt::supportedDevices() "   544             "=> BUG: duplicate device name: '%s'", 
DBG(gui_name));
 
virtual Kwave::SampleFormat::Format sampleFormat() Q_DECL_OVERRIDE
QList< QAudioDeviceInfo > m_available_devices
void createInMainThread(QAudioFormat &format, unsigned int buffer_size)
virtual ~RecordQt() Q_DECL_OVERRIDE
virtual QList< Kwave::SampleFormat::Format > detectSampleFormats() Q_DECL_OVERRIDE
virtual int close() Q_DECL_OVERRIDE
bool connect(Kwave::StreamObject &source, const char *output, Kwave::StreamObject &sink, const char *input)
virtual QList< Kwave::Compression::Type > detectCompressions() Q_DECL_OVERRIDE
Kwave::Compression::Type m_compression
virtual int setCompression(Kwave::Compression::Type new_compression) Q_DECL_OVERRIDE
unsigned int m_bits_per_sample
Kwave::SampleFormat::Format m_sample_format
void sigCreateRequested(QAudioFormat &format, unsigned int buffer_size)
virtual int detectTracks(unsigned int &min, unsigned int &max) Q_DECL_OVERRIDE
int initialize(unsigned int buffer_size)
virtual QList< unsigned int > supportedBits() Q_DECL_OVERRIDE
virtual int setBitsPerSample(unsigned int new_bits) Q_DECL_OVERRIDE
virtual int setSampleFormat(Kwave::SampleFormat::Format new_format) Q_DECL_OVERRIDE
virtual QStringList supportedDevices() Q_DECL_OVERRIDE
virtual double sampleRate() Q_DECL_OVERRIDE
virtual int setTracks(unsigned int &tracks) Q_DECL_OVERRIDE
virtual Kwave::Compression::Type compression() Q_DECL_OVERRIDE
virtual int read(QByteArray &buffer, unsigned int offset) Q_DECL_OVERRIDE
virtual int setSampleRate(double &new_rate) Q_DECL_OVERRIDE
virtual Kwave::byte_order_t endianness() Q_DECL_OVERRIDE
#define RECORD_POLL_TIMEOUT
QAudioDeviceInfo deviceInfo(const QString &device) const
virtual int bitsPerSample() Q_DECL_OVERRIDE
virtual QString open(const QString &dev) Q_DECL_OVERRIDE
QMap< QString, QString > m_device_name_map
virtual int tracks() Q_DECL_OVERRIDE
virtual QList< double > detectSampleRates() Q_DECL_OVERRIDE
#define BUFFER_SIZE_OVERCOMMIT