QString formatToString(const QAudioFormat &format) { QString result; if (QAudioFormat() != format) { if (format.codec() == "audio/pcm") { Q_ASSERT(format.sampleType() == QAudioFormat::SignedInt); const QString formatEndian = (format.byteOrder() == QAudioFormat::LittleEndian) ? QString("LE") : QString("BE"); QString formatType; switch (format.sampleType()) { case QAudioFormat::SignedInt: formatType = "signed"; break; case QAudioFormat::UnSignedInt: formatType = "unsigned"; break; case QAudioFormat::Float: formatType = "float"; break; case QAudioFormat::Unknown: formatType = "unknown"; break; } QString formatChannels = QString("%1 channels").arg(format.channelCount()); switch (format.channelCount()) { case 1: formatChannels = "mono"; break; case 2: formatChannels = "stereo"; break; } result = QString("%1 Hz %2 bit %3 %4 %5") .arg(format.sampleRate()) .arg(format.sampleSize()) .arg(formatType) .arg(formatEndian) .arg(formatChannels); } else { result = format.codec(); } } return result; }
bool QAudioDeviceInfoInternal::isFormatSupported( const QAudioFormat &format) const { getSupportedFormats(); bool supported = false; if (m_capabilities.contains(format.codec())) { const Capabilities &codecCaps = m_capabilities[format.codec()]; supported = codecCaps.m_frequencies.contains(format.frequency()) && codecCaps.m_channels.contains(format.channels()) && codecCaps.m_sampleSizes.contains(format.sampleSize()) && codecCaps.m_byteOrders.contains(format.byteOrder()) && codecCaps.m_sampleTypes.contains(format.sampleType()); } return supported; }
bool QAudioDeviceInfoInternal::testSettings(const QAudioFormat& format) const { // Set nearest to closest settings that do work. // See if what is in settings will work (return value). bool failed = false; // For now, just accept only audio/pcm codec if(!format.codec().startsWith(QLatin1String("audio/pcm"))) failed = true; if(!failed && !(format.channels() == 1 || format.channels() == 2)) failed = true; if(!failed) { if(!(format.frequency() == 8000 || format.frequency() == 11025 || format.frequency() == 22050 || format.frequency() == 44100 || format.frequency() == 48000 || format.frequency() == 96000)) failed = true; } if(!failed && !(format.sampleSize() == 8 || format.sampleSize() == 16)) failed = true; if(!failed) { // settings work return true; } return false; }
bool WaveFileWriter::open(const QString& fileName, const QAudioFormat& format) { if (file.isOpen()) return false; // file already open if (format.codec() != "audio/pcm" || format.sampleType() != QAudioFormat::SignedInt) return false; // data format is not supported if (fileName == "stdout") { if (!file.open(stdout, QIODevice::WriteOnly)) return false; } else { file.setFileName(fileName); if (!file.open(QIODevice::WriteOnly)) return false; // unable to open file for writing } if (!writeHeader(format)) return false; m_format = format; return true; }
bool formatQtToNative(const QAudioFormat &inputFormat, TUint32 &outputFourCC, TMMFCapabilities &outputFormat) { bool result = false; // Need to use temporary variables because TMMFCapabilities fields are all // TInt, rather than MMF enumerated types. TMMFSampleRate outputSampleRate; TMMFMonoStereo outputChannels; TMMFSoundEncoding outputEncoding; if (inputFormat.codec() == "audio/pcm") { result = sampleRateQtToNative(inputFormat.frequency(), outputSampleRate) && channelsQtToNative(inputFormat.channels(), outputChannels) && sampleInfoQtToNative(inputFormat.sampleSize(), inputFormat.byteOrder(), inputFormat.sampleType(), outputFourCC, outputEncoding); } if (result) { outputFormat.iRate = outputSampleRate; outputFormat.iChannels = outputChannels; outputFormat.iEncoding = outputEncoding; } return result; }
QAudioFormat QAudioDeviceInfoInternal::preferredFormat() const { QAudioFormat format; switch (m_mode) { case QAudio::AudioOutput: format.setFrequency(44100); format.setChannels(2); format.setSampleSize(16); format.setByteOrder(QAudioFormat::LittleEndian); format.setSampleType(QAudioFormat::SignedInt); format.setCodec(QLatin1String("audio/pcm")); break; case QAudio::AudioInput: format.setFrequency(8000); format.setChannels(1); format.setSampleSize(16); format.setByteOrder(QAudioFormat::LittleEndian); format.setSampleType(QAudioFormat::SignedInt); format.setCodec(QLatin1String("audio/pcm")); break; default: Q_ASSERT_X(false, Q_FUNC_INFO, "Invalid mode"); } if (!isFormatSupported(format)) { format = QAudioFormat(); format.setCodec(QLatin1String("audio/pcm")); if (m_capabilities.contains(format.codec())) { const Capabilities &codecCaps = m_capabilities[format.codec()]; if (codecCaps.m_frequencies.size()) format.setFrequency(codecCaps.m_frequencies[0]); if (codecCaps.m_channels.size()) format.setChannels(codecCaps.m_channels[0]); if (codecCaps.m_sampleSizes.size()) format.setSampleSize(codecCaps.m_sampleSizes[0]); if (codecCaps.m_byteOrders.size()) format.setByteOrder(codecCaps.m_byteOrders[0]); if (codecCaps.m_sampleTypes.size()) format.setSampleType(codecCaps.m_sampleTypes[0]); } } return format; }
/*! Returns the closest QAudioFormat to the supplied \a settings that the system supports. These settings are provided by the platform/audio plugin being used. They are also dependent on the \l {QAudio}::Mode being used. */ QAudioFormat QAudioDeviceInfo::nearestFormat(const QAudioFormat &settings) const { if (isFormatSupported(settings)) return settings; QAudioFormat nearest = settings; QList<QString> testCodecs = supportedCodecs(); QList<int> testChannels = supportedChannelCounts(); QList<QAudioFormat::Endian> testByteOrders = supportedByteOrders(); QList<QAudioFormat::SampleType> testSampleTypes; QList<QAudioFormat::SampleType> sampleTypesAvailable = supportedSampleTypes(); QMap<int,int> testSampleRates; QList<int> sampleRatesAvailable = supportedSampleRates(); QMap<int,int> testSampleSizes; QList<int> sampleSizesAvailable = supportedSampleSizes(); // Get sorted lists for checking if (testCodecs.contains(settings.codec())) { testCodecs.removeAll(settings.codec()); testCodecs.insert(0, settings.codec()); } testChannels.removeAll(settings.channelCount()); testChannels.insert(0, settings.channelCount()); testByteOrders.removeAll(settings.byteOrder()); testByteOrders.insert(0, settings.byteOrder()); if (sampleTypesAvailable.contains(settings.sampleType())) testSampleTypes.append(settings.sampleType()); if (sampleTypesAvailable.contains(QAudioFormat::SignedInt)) testSampleTypes.append(QAudioFormat::SignedInt); if (sampleTypesAvailable.contains(QAudioFormat::UnSignedInt)) testSampleTypes.append(QAudioFormat::UnSignedInt); if (sampleTypesAvailable.contains(QAudioFormat::Float)) testSampleTypes.append(QAudioFormat::Float); if (sampleSizesAvailable.contains(settings.sampleSize())) testSampleSizes.insert(0,settings.sampleSize()); sampleSizesAvailable.removeAll(settings.sampleSize()); foreach (int size, sampleSizesAvailable) { int larger = (size > settings.sampleSize()) ? size : settings.sampleSize(); int smaller = (size > settings.sampleSize()) ? settings.sampleSize() : size; bool isMultiple = ( 0 == (larger % smaller)); int diff = larger - smaller; testSampleSizes.insert((isMultiple ? diff : diff+100000), size); }
S60AudioEncoderControl::S60AudioEncoderControl(QObject *session, QObject *parent) :QAudioEncoderControl(parent), m_quality(QtMultimediaKit::NormalQuality) { m_session = qobject_cast<S60AudioCaptureSession*>(session); QAudioFormat fmt = m_session->format(); // medium, 22050Hz mono S16 fmt.setSampleType(QAudioFormat::SignedInt); if (fmt.codec().compare("PCM", Qt::CaseInsensitive) == 0) { fmt.setSampleSize(16); fmt.setFrequency(22050); } fmt.setChannels(1); m_session->setFormat(fmt); m_settings.setChannelCount(fmt.channels()); m_settings.setCodec(fmt.codec()); m_settings.setSampleRate(fmt.sampleRate()); }
void EQAlgorithm::gatherData() { this->file = Core::autoEQCore->mainWin->fileNames; this->file.open(QIODevice::ReadWrite); this->fftInput = file.readAll(); this->file.close(); QAudioFormat format; this->fftOutput = new QAudioBuffer(fftInput, format.codec(), 0); }
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()); }
bool Lockin2::isFormatSupported(const QAudioFormat &format) { if (format.codec() != "audio/pcm") { return false; } if (format.channelCount() != 2) { return false; } return true; }
QDebug operator<<(QDebug dbg, const QAudioFormat &f) { dbg.nospace() << "QAudioFormat(" << f.sampleRate(); dbg.nospace() << "Hz, " << f.sampleSize(); dbg.nospace() << "bit, channelCount=" << f.channelCount(); dbg.nospace() << ", sampleType=" << f.sampleType(); dbg.nospace() << ", byteOrder=" << f.byteOrder(); dbg.nospace() << ", codec=" << f.codec(); dbg.nospace() << ")"; return dbg.space(); }
bool QAudioDeviceInfoInternal::isFormatSupported( const QAudioFormat &format) const { getSupportedFormats(); const bool supported = m_codecs.contains(format.codec()) && m_frequencies.contains(format.frequency()) && m_channels.contains(format.channels()) && m_sampleSizes.contains(format.sampleSize()) && m_byteOrders.contains(format.byteOrder()) && m_sampleTypes.contains(format.sampleType()); return supported; }
QT_BEGIN_NAMESPACE // Debugging QDebug operator<<(QDebug dbg, const QAudioFormat& audioFormat) { dbg.nospace() << "QAudioFormat(" << audioFormat.frequency() << "," << audioFormat.channels() << "," << audioFormat.sampleSize()<< "," << audioFormat.codec() << "," << audioFormat.byteOrder() << "," << audioFormat.sampleType() << ")"; return dbg.space(); }
bool isFormatSupported(const QAudioFormat &formatQt, const DevSoundCapabilities &caps) { TMMFCapabilities formatNative; TUint32 fourCC; bool result = false; if (formatQt.codec() == "audio/pcm" && formatQtToNative(formatQt, fourCC, formatNative)) { result = (formatNative.iRate & caps.caps().iRate) && (formatNative.iChannels & caps.caps().iChannels) && (caps.fourCC().Find(fourCC) != KErrNotFound); } return result; }
void AudioTest::test() { // tries to set all the settings picked. logOutput->clear(); logOutput->append("NOTE: an invalid codec audio/test exists for testing, to get a fail condition."); if (!deviceInfo.isNull()) { if (deviceInfo.isFormatSupported(settings)) { logOutput->append(tr("Success")); nearestFreq->setText(""); nearestChannel->setText(""); nearestCodec->setText(""); nearestSampleSize->setText(""); nearestSampleType->setText(""); nearestEndian->setText(""); } else { QAudioFormat nearest = deviceInfo.nearestFormat(settings); logOutput->append(tr("Failed")); nearestFreq->setText(QString("%1").arg(nearest.frequency())); nearestChannel->setText(QString("%1").arg(nearest.channels())); nearestCodec->setText(nearest.codec()); nearestSampleSize->setText(QString("%1").arg(nearest.sampleSize())); switch(nearest.sampleType()) { case QAudioFormat::SignedInt: nearestSampleType->setText("SignedInt"); break; case QAudioFormat::UnSignedInt: nearestSampleType->setText("UnSignedInt"); break; case QAudioFormat::Float: nearestSampleType->setText("Float"); break; case QAudioFormat::Unknown: nearestSampleType->setText("Unknown"); } switch(nearest.byteOrder()) { case QAudioFormat::LittleEndian: nearestEndian->setText("LittleEndian"); break; case QAudioFormat::BigEndian: nearestEndian->setText("BigEndian"); } } } else logOutput->append(tr("No Device")); }
// 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 QAlsaAudioDeviceInfo::testSettings(const QAudioFormat& format) const { // Set nearest to closest settings that do work. // See if what is in settings will work (return value). int err = -1; snd_pcm_t* pcmHandle; snd_pcm_hw_params_t *params; QString dev; #if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) dev = device; if (dev.compare(QLatin1String("default")) == 0) { QList<QByteArray> devices = availableDevices(QAudio::AudioOutput); if (!devices.isEmpty()) dev = QLatin1String(devices.first().constData()); } #else if (dev.compare(QLatin1String("default")) == 0) { dev = QLatin1String("hw:0,0"); } else { int idx = 0; char *name; QString shortName = device.mid(device.indexOf(QLatin1String("="),0)+1); while(snd_card_get_name(idx,&name) == 0) { if(shortName.compare(QLatin1String(name)) == 0) break; idx++; } dev = QString(QLatin1String("hw:%1,0")).arg(idx); } #endif snd_pcm_stream_t stream = mode == QAudio::AudioOutput ? SND_PCM_STREAM_PLAYBACK : SND_PCM_STREAM_CAPTURE; if (snd_pcm_open(&pcmHandle, dev.toLocal8Bit().constData(), stream, 0) < 0) return false; snd_pcm_nonblock(pcmHandle, 0); snd_pcm_hw_params_alloca(¶ms); snd_pcm_hw_params_any(pcmHandle, params); // set the values! snd_pcm_hw_params_set_channels(pcmHandle, params, format.channelCount()); snd_pcm_hw_params_set_rate(pcmHandle, params, format.sampleRate(), 0); snd_pcm_format_t pcmFormat = SND_PCM_FORMAT_UNKNOWN; switch (format.sampleSize()) { case 8: if (format.sampleType() == QAudioFormat::SignedInt) pcmFormat = SND_PCM_FORMAT_S8; else if (format.sampleType() == QAudioFormat::UnSignedInt) pcmFormat = SND_PCM_FORMAT_U8; break; case 16: if (format.sampleType() == QAudioFormat::SignedInt) { pcmFormat = format.byteOrder() == QAudioFormat::LittleEndian ? SND_PCM_FORMAT_S16_LE : SND_PCM_FORMAT_S16_BE; } else if (format.sampleType() == QAudioFormat::UnSignedInt) { pcmFormat = format.byteOrder() == QAudioFormat::LittleEndian ? SND_PCM_FORMAT_U16_LE : SND_PCM_FORMAT_U16_BE; } break; case 32: if (format.sampleType() == QAudioFormat::SignedInt) { pcmFormat = format.byteOrder() == QAudioFormat::LittleEndian ? SND_PCM_FORMAT_S32_LE : SND_PCM_FORMAT_S32_BE; } else if (format.sampleType() == QAudioFormat::UnSignedInt) { pcmFormat = format.byteOrder() == QAudioFormat::LittleEndian ? SND_PCM_FORMAT_U32_LE : SND_PCM_FORMAT_U32_BE; } else if (format.sampleType() == QAudioFormat::Float) { pcmFormat = format.byteOrder() == QAudioFormat::LittleEndian ? SND_PCM_FORMAT_FLOAT_LE : SND_PCM_FORMAT_FLOAT_BE; } } if (pcmFormat != SND_PCM_FORMAT_UNKNOWN) err = snd_pcm_hw_params_set_format(pcmHandle, params, pcmFormat); // For now, just accept only audio/pcm codec if (!format.codec().startsWith(QLatin1String("audio/pcm"))) err = -1; if (err >= 0 && format.channelCount() != -1) { err = snd_pcm_hw_params_test_channels(pcmHandle, params, format.channelCount()); if (err >= 0) err = snd_pcm_hw_params_set_channels(pcmHandle, params, format.channelCount()); } if (err >= 0 && format.sampleRate() != -1) { err = snd_pcm_hw_params_test_rate(pcmHandle, params, format.sampleRate(), 0); if (err >= 0) err = snd_pcm_hw_params_set_rate(pcmHandle, params, format.sampleRate(), 0); } if (err >= 0 && pcmFormat != SND_PCM_FORMAT_UNKNOWN) err = snd_pcm_hw_params_set_format(pcmHandle, params, pcmFormat); if (err >= 0) err = snd_pcm_hw_params(pcmHandle, params); snd_pcm_close(pcmHandle); return (err == 0); }
bool isPCM(const QAudioFormat &format) { return (format.codec() == "audio/pcm"); }
bool QAudioDeviceInfoInternal::testSettings(const QAudioFormat& format) const { // Set nearest to closest settings that do work. // See if what is in settings will work (return value). int err = 0; snd_pcm_t* handle; snd_pcm_hw_params_t *params; QString dev = device; QList<QByteArray> devices = QAudioDeviceInfoInternal::availableDevices(QAudio::AudioOutput); if(dev.compare(QLatin1String("default")) == 0) { #if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) dev = QLatin1String(devices.first().constData()); #else dev = QLatin1String("hw:0,0"); #endif } else { #if(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 14) dev = device; #else int idx = 0; char *name; QString shortName = device.mid(device.indexOf(QLatin1String("="),0)+1); while(snd_card_get_name(idx,&name) == 0) { if(shortName.compare(QLatin1String(name)) == 0) break; idx++; } dev = QString(QLatin1String("hw:%1,0")).arg(idx); #endif } if(mode == QAudio::AudioOutput) { err=snd_pcm_open( &handle,dev.toLocal8Bit().constData(),SND_PCM_STREAM_PLAYBACK,0); } else { err=snd_pcm_open( &handle,dev.toLocal8Bit().constData(),SND_PCM_STREAM_CAPTURE,0); } if(err < 0) { handle = 0; return false; } bool testChannel = false; bool testCodec = false; bool testFreq = false; bool testType = false; bool testSize = false; int dir = 0; snd_pcm_nonblock( handle, 0 ); snd_pcm_hw_params_alloca( ¶ms ); snd_pcm_hw_params_any( handle, params ); // set the values! snd_pcm_hw_params_set_channels(handle,params,format.channels()); snd_pcm_hw_params_set_rate(handle,params,format.frequency(),dir); err = -1; switch(format.sampleSize()) { case 8: if(format.sampleType() == QAudioFormat::SignedInt) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S8); else if(format.sampleType() == QAudioFormat::UnSignedInt) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U8); break; case 16: if(format.sampleType() == QAudioFormat::SignedInt) { if(format.byteOrder() == QAudioFormat::LittleEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S16_LE); else if(format.byteOrder() == QAudioFormat::BigEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S16_BE); } else if(format.sampleType() == QAudioFormat::UnSignedInt) { if(format.byteOrder() == QAudioFormat::LittleEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U16_LE); else if(format.byteOrder() == QAudioFormat::BigEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U16_BE); } break; case 32: if(format.sampleType() == QAudioFormat::SignedInt) { if(format.byteOrder() == QAudioFormat::LittleEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S32_LE); else if(format.byteOrder() == QAudioFormat::BigEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S32_BE); } else if(format.sampleType() == QAudioFormat::UnSignedInt) { if(format.byteOrder() == QAudioFormat::LittleEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U32_LE); else if(format.byteOrder() == QAudioFormat::BigEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U32_BE); } } // For now, just accept only audio/pcm codec if(!format.codec().startsWith(QLatin1String("audio/pcm"))) { err=-1; } else testCodec = true; if(err>=0 && format.channels() != -1) { err = snd_pcm_hw_params_test_channels(handle,params,format.channels()); if(err>=0) err = snd_pcm_hw_params_set_channels(handle,params,format.channels()); if(err>=0) testChannel = true; } if(err>=0 && format.frequency() != -1) { err = snd_pcm_hw_params_test_rate(handle,params,format.frequency(),0); if(err>=0) err = snd_pcm_hw_params_set_rate(handle,params,format.frequency(),dir); if(err>=0) testFreq = true; } if((err>=0 && format.sampleSize() != -1) && (format.sampleType() != QAudioFormat::Unknown)) { switch(format.sampleSize()) { case 8: if(format.sampleType() == QAudioFormat::SignedInt) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S8); else if(format.sampleType() == QAudioFormat::UnSignedInt) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U8); break; case 16: if(format.sampleType() == QAudioFormat::SignedInt) { if(format.byteOrder() == QAudioFormat::LittleEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S16_LE); else if(format.byteOrder() == QAudioFormat::BigEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S16_BE); } else if(format.sampleType() == QAudioFormat::UnSignedInt) { if(format.byteOrder() == QAudioFormat::LittleEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U16_LE); else if(format.byteOrder() == QAudioFormat::BigEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U16_BE); } break; case 32: if(format.sampleType() == QAudioFormat::SignedInt) { if(format.byteOrder() == QAudioFormat::LittleEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S32_LE); else if(format.byteOrder() == QAudioFormat::BigEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S32_BE); } else if(format.sampleType() == QAudioFormat::UnSignedInt) { if(format.byteOrder() == QAudioFormat::LittleEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U32_LE); else if(format.byteOrder() == QAudioFormat::BigEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U32_BE); } } if(err>=0) { testSize = true; testType = true; } } if(err>=0) err = snd_pcm_hw_params(handle, params); if(err == 0) { // settings work // close() if(handle) snd_pcm_close(handle); return true; } if(handle) snd_pcm_close(handle); return false; }
bool QAudioDeviceInfoInternal::testSettings(const QAudioFormat& format) const { // Set nearest to closest settings that do work. // See if what is in settings will work (return value). bool failed = false; bool match = false; // check codec for( int i = 0; i < codecz.count(); i++) { if (format.codec() == codecz.at(i)) match = true; } if (!match) failed = true; // check channel match = false; if (!failed) { for( int i = 0; i < channelz.count(); i++) { if (format.channels() == channelz.at(i)) { match = true; break; } } if (!match) failed = true; } // check frequency match = false; if (!failed) { for( int i = 0; i < freqz.count(); i++) { if (format.frequency() == freqz.at(i)) { match = true; break; } } if (!match) failed = true; } // check sample size match = false; if (!failed) { for( int i = 0; i < sizez.count(); i++) { if (format.sampleSize() == sizez.at(i)) { match = true; break; } } if (!match) failed = true; } // check byte order match = false; if (!failed) { for( int i = 0; i < byteOrderz.count(); i++) { if (format.byteOrder() == byteOrderz.at(i)) { match = true; break; } } if (!match) failed = true; } // check sample type match = false; if (!failed) { for( int i = 0; i < typez.count(); i++) { if (format.sampleType() == typez.at(i)) { match = true; break; } } if (!match) failed = true; } if(!failed) { // settings work return true; } return false; }
bool QAudioDeviceInfoInternal::testSettings(const QAudioFormat& format) const { // Set nearest to closest settings that do work. // See if what is in settings will work (return value). int err = 0; snd_pcm_t* handle; snd_pcm_hw_params_t *params; QString dev = device; // open() if(!dev.contains(QLatin1String("default"))) { int idx = snd_card_get_index(dev.toLocal8Bit().constData()); dev = QString(QLatin1String("hw:%1,0")).arg(idx); } if(mode == QAudio::AudioOutput) { err=snd_pcm_open( &handle,dev.toLocal8Bit().constData(),SND_PCM_STREAM_PLAYBACK,0); } else { err=snd_pcm_open( &handle,dev.toLocal8Bit().constData(),SND_PCM_STREAM_CAPTURE,0); } if(err < 0) { handle = 0; return false; } bool testChannel = false; bool testCodec = false; bool testFreq = false; bool testType = false; bool testSize = false; int dir = 0; snd_pcm_nonblock( handle, 0 ); snd_pcm_hw_params_alloca( ¶ms ); snd_pcm_hw_params_any( handle, params ); // set the values! snd_pcm_hw_params_set_channels(handle,params,format.channels()); snd_pcm_hw_params_set_rate(handle,params,format.frequency(),dir); switch(format.sampleSize()) { case 8: if(format.sampleType() == QAudioFormat::SignedInt) snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S8); else if(format.sampleType() == QAudioFormat::UnSignedInt) snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U8); break; case 16: if(format.sampleType() == QAudioFormat::SignedInt) { if(format.byteOrder() == QAudioFormat::LittleEndian) snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S16_LE); else if(format.byteOrder() == QAudioFormat::BigEndian) snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S16_BE); } else if(format.sampleType() == QAudioFormat::UnSignedInt) { if(format.byteOrder() == QAudioFormat::LittleEndian) snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U16_LE); else if(format.byteOrder() == QAudioFormat::BigEndian) snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U16_BE); } break; case 32: if(format.sampleType() == QAudioFormat::SignedInt) { if(format.byteOrder() == QAudioFormat::LittleEndian) snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S32_LE); else if(format.byteOrder() == QAudioFormat::BigEndian) snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S32_BE); } else if(format.sampleType() == QAudioFormat::UnSignedInt) { if(format.byteOrder() == QAudioFormat::LittleEndian) snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U32_LE); else if(format.byteOrder() == QAudioFormat::BigEndian) snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U32_BE); } } // For now, just accept only audio/pcm codec if(!format.codec().startsWith(QLatin1String("audio/pcm"))) { err=-1; } else testCodec = true; if(err>=0 && format.channels() != -1) { err = snd_pcm_hw_params_test_channels(handle,params,format.channels()); if(err>=0) err = snd_pcm_hw_params_set_channels(handle,params,format.channels()); if(err>=0) testChannel = true; } if(err>=0 && format.frequency() != -1) { err = snd_pcm_hw_params_test_rate(handle,params,format.frequency(),0); if(err>=0) err = snd_pcm_hw_params_set_rate(handle,params,format.frequency(),dir); if(err>=0) testFreq = true; } if((err>=0 && format.sampleSize() != -1) && (format.sampleType() != QAudioFormat::Unknown)) { switch(format.sampleSize()) { case 8: if(format.sampleType() == QAudioFormat::SignedInt) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S8); else if(format.sampleType() == QAudioFormat::UnSignedInt) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U8); break; case 16: if(format.sampleType() == QAudioFormat::SignedInt) { if(format.byteOrder() == QAudioFormat::LittleEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S16_LE); else if(format.byteOrder() == QAudioFormat::BigEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S16_BE); } else if(format.sampleType() == QAudioFormat::UnSignedInt) { if(format.byteOrder() == QAudioFormat::LittleEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U16_LE); else if(format.byteOrder() == QAudioFormat::BigEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U16_BE); } break; case 32: if(format.sampleType() == QAudioFormat::SignedInt) { if(format.byteOrder() == QAudioFormat::LittleEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S32_LE); else if(format.byteOrder() == QAudioFormat::BigEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_S32_BE); } else if(format.sampleType() == QAudioFormat::UnSignedInt) { if(format.byteOrder() == QAudioFormat::LittleEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U32_LE); else if(format.byteOrder() == QAudioFormat::BigEndian) err = snd_pcm_hw_params_set_format(handle,params,SND_PCM_FORMAT_U32_BE); } } if(err>=0) { testSize = true; testType = true; } } if(err>=0) err = snd_pcm_hw_params(handle, params); if(err == 0) { // settings work // close() if(handle) snd_pcm_close(handle); return true; } if(handle) snd_pcm_close(handle); return false; }
void tst_QAudioFormat::checkCodec() { QAudioFormat audioFormat; audioFormat.setCodec(QString::fromLatin1("audio/pcm")); QVERIFY(audioFormat.codec() == QString::fromLatin1("audio/pcm")); }
void QOggSimplePlayer::open() { QMutexLocker mutexLocker(&mutex); if(!QFile(filePath).exists()) return; QAudioFormat format; format.setSampleRate(48000); format.setChannelCount(1); format.setSampleSize(16); format.setCodec("audio/pcm"); format.setByteOrder(QAudioFormat::LittleEndian); format.setSampleType(QAudioFormat::SignedInt); int returnCode=ov_fopen(QDir::toNativeSeparators(filePath).toLocal8Bit().data(), &vf); if(returnCode < 0) { qDebug() << "Input does not appear to be an Ogg bitstream for " << QDir::toNativeSeparators(filePath) << ", return code: " << returnCode; ov_clear(&vf); return; } { char **ptr=ov_comment(&vf,-1)->user_comments; vorbis_info *vi=ov_info(&vf,-1); while(*ptr){ fprintf(stderr,"%s\n",*ptr); ++ptr; } qDebug() << QString("Bitstream is %1 channel, %2Hz").arg(vi->channels).arg(vi->rate); qDebug() << QString("Encoded by: %1").arg(ov_comment(&vf,-1)->vendor); qDebug() << QString("Play on: %1").arg(QAudioDeviceInfo::defaultOutputDevice().deviceName()); format.setChannelCount(vi->channels); format.setSampleRate(vi->rate); } if(format.channelCount()!=1) { qDebug() << "Only mono sound is supported due to a bug"; ov_clear(&vf); return; } QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice()); if (!info.isFormatSupported(format)) { qDebug() << QString("raw audio format not supported by backend, cannot play audio: SampleRate: %1, ChannelCount: %2, SampleSize: %3, Codec: %4, ByteOrder: %5, SampleType: %6") .arg(format.sampleRate()) .arg(format.channelCount()) .arg(format.sampleSize()) .arg(format.codec()) .arg(format.byteOrder()) .arg(format.sampleType()) ; QAudioFormat preferedFormat=info.preferredFormat(); qDebug() << QString("prefered format: SampleRate: %1, ChannelCount: %2, SampleSize: %3, Codec: %4, ByteOrder: %5, SampleType: %6") .arg(preferedFormat.sampleRate()) .arg(preferedFormat.channelCount()) .arg(preferedFormat.sampleSize()) .arg(preferedFormat.codec()) .arg(preferedFormat.byteOrder()) .arg(preferedFormat.sampleType()) ; QAudioFormat nearestFormat=info.nearestFormat(format); qDebug() << QString("nearest format: SampleRate: %1, ChannelCount: %2, SampleSize: %3, Codec: %4, ByteOrder: %5, SampleType: %6") .arg(nearestFormat.sampleRate()) .arg(nearestFormat.channelCount()) .arg(nearestFormat.sampleSize()) .arg(nearestFormat.codec()) .arg(nearestFormat.byteOrder()) .arg(nearestFormat.sampleType()) ; ov_clear(&vf); return; } if(output!=NULL) delete output; output = new QAudioOutput(format); output->setVolume(volume); output->setBufferSize(4096); connect(output,&QAudioOutput::stateChanged,this,&QOggSimplePlayer::finishedPlaying,Qt::QueuedConnection); if(needPlay) start(); }