void SoundInput::start(qint32 device) { stop(); //---------------------------------------------------- Soundcard Setup m_callbackData.kin=0; //Buffer pointer m_callbackData.ncall=0; //Number of callbacks m_callbackData.bzero=false; //Flag to request reset of kin m_callbackData.monitoring=m_monitoring; //### Temporary: hardwired device selection QAudioDeviceInfo DeviceInfo; QList<QAudioDeviceInfo> m_InDevices; QAudioDeviceInfo m_InDeviceInfo; m_InDevices = DeviceInfo.availableDevices(QAudio::AudioInput); inputDevice = m_InDevices.at(0); //### // qDebug() << "B" << m_InDevices.length() << inputDevice.deviceName(); const char* pcmCodec = "audio/pcm"; QAudioFormat audioFormat = inputDevice.preferredFormat(); audioFormat.setChannelCount(1); audioFormat.setCodec(pcmCodec); audioFormat.setSampleRate(12000); audioFormat.setSampleType(QAudioFormat::SignedInt); audioFormat.setSampleSize(16); // qDebug() << "C" << audioFormat << audioFormat.isValid(); if (!audioFormat.isValid()) { emit error(tr("Requested audio format is not available.")); return; } audioInput = new QAudioInput(inputDevice, audioFormat); // qDebug() << "D" << audioInput->error() << QAudio::NoError; if (audioInput->error() != QAudio::NoError) { emit error(reportAudioError(audioInput->error())); return; } stream = audioInput->start(); // qDebug() << "E" << stream->errorString(); m_ntr0 = 99; // initial value higher than any expected m_nBusy = 0; m_intervalTimer.start(100); m_ms0 = QDateTime::currentMSecsSinceEpoch(); m_nsps0 = 0; }
/*! Creates a new audio buffer with space for \a numFrames frames of the given \a format. The individual samples will be initialized to the default for the format. \a startTime (in microseconds) indicates when this buffer starts in the stream. If this buffer is not part of a stream, set it to -1. */ QAudioBuffer::QAudioBuffer(int numFrames, const QAudioFormat &format, qint64 startTime) { if (format.isValid()) d = new QAudioBufferPrivate(new QMemoryAudioBufferProvider(0, numFrames, format, startTime)); else d = 0; }
/*! Creates a new audio buffer from the supplied \a data, in the given \a format. The format will determine how the number and sizes of the samples are interpreted from the \a data. If the supplied \a data is not an integer multiple of the calculated frame size, the excess data will not be used. This audio buffer will copy the contents of \a data. \a startTime (in microseconds) indicates when this buffer starts in the stream. If this buffer is not part of a stream, set it to -1. */ QAudioBuffer::QAudioBuffer(const QByteArray &data, const QAudioFormat &format, qint64 startTime) { if (format.isValid()) { int frameCount = format.framesForBytes(data.size()); d = new QAudioBufferPrivate(new QMemoryAudioBufferProvider(data.constData(), frameCount, format, startTime)); } else d = 0; }
void tst_QWaveDecoder::file() { QFETCH(QString, file); QFETCH(tst_QWaveDecoder::Corruption, corruption); QFETCH(int, channels); QFETCH(int, samplesize); QFETCH(int, samplerate); QFETCH(QAudioFormat::Endian, byteorder); QFile stream; stream.setFileName(file); stream.open(QIODevice::ReadOnly); QVERIFY(stream.isOpen()); QWaveDecoder waveDecoder(&stream); QSignalSpy validFormatSpy(&waveDecoder, SIGNAL(formatKnown())); QSignalSpy parsingErrorSpy(&waveDecoder, SIGNAL(parsingError())); if (corruption == NotAWav) { QSKIP("Not all failures detected correctly yet"); QTRY_COMPARE(parsingErrorSpy.count(), 1); QCOMPARE(validFormatSpy.count(), 0); } else if (corruption == NoSampleData) { QTRY_COMPARE(validFormatSpy.count(), 1); QCOMPARE(parsingErrorSpy.count(), 0); QVERIFY(waveDecoder.audioFormat().isValid()); QVERIFY(waveDecoder.size() == 0); QVERIFY(waveDecoder.duration() == 0); } else if (corruption == FormatDescriptor) { QTRY_COMPARE(parsingErrorSpy.count(), 1); QCOMPARE(validFormatSpy.count(), 0); } else if (corruption == FormatString) { QTRY_COMPARE(parsingErrorSpy.count(), 1); QCOMPARE(validFormatSpy.count(), 0); QVERIFY(!waveDecoder.audioFormat().isValid()); } else if (corruption == DataDescriptor) { QTRY_COMPARE(parsingErrorSpy.count(), 1); QCOMPARE(validFormatSpy.count(), 0); QVERIFY(waveDecoder.size() == 0); } else if (corruption == None) { QTRY_COMPARE(validFormatSpy.count(), 1); QCOMPARE(parsingErrorSpy.count(), 0); QVERIFY(waveDecoder.audioFormat().isValid()); QVERIFY(waveDecoder.size() > 0); QVERIFY(waveDecoder.duration() == 250); QAudioFormat format = waveDecoder.audioFormat(); QVERIFY(format.isValid()); QVERIFY(format.channelCount() == channels); QVERIFY(format.sampleSize() == samplesize); QVERIFY(format.sampleRate() == samplerate); if (format.sampleSize() != 8) { QVERIFY(format.byteOrder() == byteorder); } } stream.close(); }
bool QAudioDeviceInfoInternal::isFormatSupported(const QAudioFormat& format) const { QAudioDeviceInfoInternal *self = const_cast<QAudioDeviceInfoInternal*>(this); return format.isValid() && format.codec() == QString::fromLatin1("audio/pcm") && self->supportedSampleRates().contains(format.sampleRate()) && self->supportedChannelCounts().contains(format.channelCount()) && self->supportedSampleSizes().contains(format.sampleSize()); }
Generator::Generator(const QAudioFormat &format, qint64 durationUs, int sampleRate, QObject *parent) : QIODevice(parent) , m_pos(0) // 1) не знаю что эта за функция , m_sampleRate(sampleRate) // 2) частота дискретизации или сигнала? , m_durationUs(durationUs) // 3) длительность в микросек , m_format(format) // сколько байт в одно одной дискрете { if (format.isValid()) // метод, который выполняет фактическую проверку допустимости generateData(format, m_durationUs, m_sampleRate); }
Generator::Generator(const QAudioFormat &format, qint64 durationUs, int sampleRate, QObject *parent) : QIODevice(parent) , m_pos(0) { if (format.isValid()) generateData(format, durationUs, sampleRate); }
void MFAudioProbeControl::bufferProbed(const char *data, quint32 size, const QAudioFormat& format, qint64 startTime) { if (!format.isValid()) return; QAudioBuffer audioBuffer = QAudioBuffer(QByteArray(data, size), format, startTime); { QMutexLocker locker(&m_bufferMutex); m_pendingBuffer = audioBuffer; QMetaObject::invokeMethod(this, "bufferProbed", Qt::QueuedConnection); } }
Generator::Generator(const QAudioFormat &format, qint64 durationUs, int sampleRate, QObject *parent) : QIODevice(parent) , m_pos(0) { if (format.isValid()) { qDebug() << "generating" << durationUs << "at" << sampleRate; generateData(format, durationUs, sampleRate); } }
bool Lockin2::start(const QAudioDeviceInfo &audioDevice, const QAudioFormat &format) { if (_audioInput != 0) { qDebug() << __FUNCTION__ << ": lockin is already running, please stop is before start"; return false; } if (!format.isValid()) { qDebug() << __FUNCTION__ << ": format not valid"; return false; } if (!isFormatSupported(format)) { qDebug() << __FUNCTION__ << ": format not supported for lockin2"; return false; } if (audioDevice.isFormatSupported(format)) { _audioInput = new QAudioInput(audioDevice, format, this); _audioInput->setNotifyInterval(_outputPeriod * 1000.0); connect(_audioInput, SIGNAL(notify()), this, SLOT(interpretInput())); connect(_audioInput, SIGNAL(stateChanged(QAudio::State)), this, SLOT(audioStateChanged(QAudio::State))); // pour être au millieu avec le temps _timeValue = -(_integrationTime / 2.0); // nombre d'échantillons pour le temps d'integration _sampleIntegration = format.sampleRate() * _integrationTime; // nombre d'échantillons pour un affichage de vumeter _sampleVumeter = _vumeterTime * format.sampleRate(); // nettoyage des variables _fifo->readAll(); // vide le fifo _dataXY.clear(); // vide <x,y> _format = format; _audioInput->start(_fifo); } else { qDebug() << __FUNCTION__ << ": format not supported, can't start"; return false; } return true; }
void SoundInput::start(QAudioDeviceInfo const& device, int framesPerBuffer, AudioDevice * sink, unsigned downSampleFactor, AudioDevice::Channel channel) { Q_ASSERT (sink); stop (); m_sink = sink; QAudioFormat format (device.preferredFormat()); format.setChannelCount (AudioDevice::Mono == channel ? 1 : 2); format.setCodec ("audio/pcm"); format.setSampleRate (12000 * downSampleFactor); format.setSampleType (QAudioFormat::SignedInt); format.setSampleSize (16); if (!format.isValid ()) { Q_EMIT error (tr ("Requested input audio format is not valid.")); return; } // this function lies! // if (!device.isFormatSupported (format)) // { // Q_EMIT error (tr ("Requested input audio format is not supported on device.")); // return; // } m_stream.reset (new QAudioInput {device, format}); if (audioError ()) { return; } connect (m_stream.data(), &QAudioInput::stateChanged, this, &SoundInput::handleStateChanged); m_stream->setBufferSize (m_stream->format ().bytesForFrames (framesPerBuffer)); if (sink->initialize (QIODevice::WriteOnly, channel)) { m_stream->start (sink); audioError (); } else { Q_EMIT error (tr ("Failed to initialize audio sink device")); } }
void QGstreamerAudioProbeControl::bufferProbed(GstBuffer* buffer) { GstCaps* caps = gst_buffer_get_caps(buffer); if (!caps) return; QAudioFormat format = QGstUtils::audioFormatForCaps(caps); gst_caps_unref(caps); if (!format.isValid()) return; QAudioBuffer audioBuffer = QAudioBuffer(QByteArray((const char*)buffer->data, buffer->size), format); { QMutexLocker locker(&m_bufferMutex); m_pendingBuffer = audioBuffer; QMetaObject::invokeMethod(this, "bufferProbed", Qt::QueuedConnection); } }
// This function returns the maximum possible sample value for a given audio format qreal getPeakValue(const QAudioFormat& format) { // Note: Only the most common sample formats are supported if (!format.isValid()) return qreal(0); if (format.codec() != "audio/pcm") return qreal(0); switch (format.sampleType()) { case QAudioFormat::Unknown: break; case QAudioFormat::Float: if (format.sampleSize() != 32) // other sample formats are not supported return qreal(0); return qreal(1.00003); case QAudioFormat::SignedInt: if (format.sampleSize() == 32) return qreal(INT_MAX); if (format.sampleSize() == 16) return qreal(SHRT_MAX); if (format.sampleSize() == 8) return qreal(CHAR_MAX); break; case QAudioFormat::UnSignedInt: if (format.sampleSize() == 32) return qreal(UINT_MAX); if (format.sampleSize() == 16) return qreal(USHRT_MAX); if (format.sampleSize() == 8) return qreal(UCHAR_MAX); break; } return qreal(0); }
bool OutputQtMultimedia::initialize(quint32 freq, ChannelMap map, Qmmp::AudioFormat format) { QAudioFormat qformat; qformat.setCodec("audio/pcm"); qformat.setFrequency(freq); qformat.setByteOrder(QAudioFormat::LittleEndian); qformat.setChannels(map.size()); qformat.setSampleType(QAudioFormat::SignedInt); //Size of sample representation in input data. For 24-bit is 4, high byte is ignored. qint64 bytes_per_sample = 0; switch (format) { case Qmmp::PCM_S8: qformat.setSampleSize(8); bytes_per_sample = 1; break; case Qmmp::PCM_S16LE: qformat.setSampleSize(16); bytes_per_sample = 2; break; case Qmmp::PCM_S24LE: qformat.setSampleSize(24); bytes_per_sample = 4; break; case Qmmp::PCM_S32LE: qformat.setSampleSize(32); bytes_per_sample = 4; break; default: break; } if (!qformat.isValid()) return false; m_bytes_per_second = bytes_per_sample * freq * qformat.channels(); const QSettings settings(Qmmp::configFile(), QSettings::IniFormat); const QString saved_device_name = settings.value("QTMULTIMEDIA/device").toString(); QAudioDeviceInfo device_info; if (!saved_device_name.isEmpty()) { const QList<QAudioDeviceInfo> devices = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput); foreach (const QAudioDeviceInfo &info, devices) { if (info.deviceName()==saved_device_name) { if (info.isFormatSupported(qformat)) { device_info = info; break; } else qDebug() << "OutputQtMultimedia: Output device: " << saved_device_name << " is not supported"; } } } if (device_info.isNull()) { device_info = QAudioDeviceInfo::defaultOutputDevice(); if (!device_info.isFormatSupported(qformat)) return false; } qDebug() << "OutputQtMultimedia: Using output device: " << device_info.deviceName(); m_output.reset(new QAudioOutput(device_info, qformat)); m_buffer = m_output->start(); configure(freq, map, format); return true; }