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