Treat Wave files with IEEE Float (32-Bit) sample format separately from Wave files with 32-Bit Integer sample format. For example, the Opus encoder accepts 32-Bit IEEE Float just fine, but does NOT like 32-Bit Integer as input.
This commit is contained in:
parent
0a28e39309
commit
2878dc7ad0
@ -30,7 +30,7 @@
|
||||
#define VER_LAMEXP_MINOR_LO 5
|
||||
#define VER_LAMEXP_TYPE RC
|
||||
#define VER_LAMEXP_PATCH 2
|
||||
#define VER_LAMEXP_BUILD 1096
|
||||
#define VER_LAMEXP_BUILD 1097
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Tool versions (minimum expected versions!)
|
||||
|
@ -233,7 +233,8 @@ const unsigned int *OpusEncoder::supportedChannelCount(void)
|
||||
|
||||
const unsigned int *OpusEncoder::supportedBitdepths(void)
|
||||
{
|
||||
return NULL;
|
||||
static const unsigned int supportedBPS[] = {8, 16, 24, AudioFileModel::BITDEPTH_IEEE_FLOAT32, NULL};
|
||||
return supportedBPS;
|
||||
}
|
||||
|
||||
const bool OpusEncoder::needsTimingInfo(void)
|
||||
|
@ -25,9 +25,12 @@
|
||||
#include <QObject>
|
||||
#include <QMutexLocker>
|
||||
#include <QFile>
|
||||
#include <limits.h>
|
||||
|
||||
#define U16Str(X) QString::fromUtf16(reinterpret_cast<const unsigned short*>(L##X))
|
||||
|
||||
const unsigned int AudioFileModel::BITDEPTH_IEEE_FLOAT32 = UINT_MAX-1;
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
// Constructor & Destructor
|
||||
////////////////////////////////////////////////////////////
|
||||
@ -288,8 +291,15 @@ const QString AudioFileModel::formatAudioBaseInfo(void) const
|
||||
if(m_formatAudioBitdepth)
|
||||
{
|
||||
if(!info.isEmpty()) info.append(", ");
|
||||
if(m_formatAudioBitdepth == BITDEPTH_IEEE_FLOAT32)
|
||||
{
|
||||
info.append(QString("%1: %2 Bit (IEEE Float)").arg(tr("Bitdepth"), QString::number(32)));
|
||||
}
|
||||
else
|
||||
{
|
||||
info.append(QString("%1: %2 Bit").arg(tr("Bitdepth"), QString::number(m_formatAudioBitdepth)));
|
||||
}
|
||||
}
|
||||
return info;
|
||||
}
|
||||
else
|
||||
|
@ -45,6 +45,8 @@ public:
|
||||
BitrateModeVariable = 2,
|
||||
};
|
||||
|
||||
static const unsigned int BITDEPTH_IEEE_FLOAT32;
|
||||
|
||||
//-----------------------
|
||||
//Getters
|
||||
//-----------------------
|
||||
|
@ -339,6 +339,11 @@ const AudioFileModel AnalyzeTask::analyzeFile(const QString &filePath, int *type
|
||||
retrieveCover(audioFile, coverType, coverData);
|
||||
}
|
||||
|
||||
if((audioFile.formatAudioType().compare("PCM", Qt::CaseInsensitive) == 0) && (audioFile.formatAudioProfile().compare("Float", Qt::CaseInsensitive) == 0))
|
||||
{
|
||||
if(audioFile.formatAudioBitdepth() == 32) audioFile.setFormatAudioBitdepth(AudioFileModel::BITDEPTH_IEEE_FLOAT32);
|
||||
}
|
||||
|
||||
return audioFile;
|
||||
}
|
||||
|
||||
|
@ -444,14 +444,28 @@ void ProcessThread::insertDownsampleFilter(void)
|
||||
/* Adjust bit depth (word size) */
|
||||
if(m_encoder->supportedBitdepths() && m_audioFile.formatAudioBitdepth())
|
||||
{
|
||||
const unsigned int *supportedBPS = m_encoder->supportedBitdepths();
|
||||
const unsigned int inputBPS = m_audioFile.formatAudioBitdepth();
|
||||
const unsigned int *supportedBPS = m_encoder->supportedBitdepths();
|
||||
|
||||
bool bAdjustBitdepth = true;
|
||||
|
||||
//Is the input bit depth supported exactly? (inclduing IEEE Float)
|
||||
for(int i = 0; supportedBPS[i]; i++)
|
||||
{
|
||||
if(supportedBPS[i] == inputBPS) bAdjustBitdepth = false;
|
||||
}
|
||||
|
||||
if(bAdjustBitdepth)
|
||||
{
|
||||
unsigned int currentDiff = UINT_MAX, minimumDiff = UINT_MAX, bestBPS = UINT_MAX;
|
||||
const unsigned int originalBPS = (inputBPS == AudioFileModel::BITDEPTH_IEEE_FLOAT32) ? 32 : inputBPS;
|
||||
|
||||
//Find the most suitable supported bit depth
|
||||
for(int i = 0; supportedBPS[i]; i++)
|
||||
{
|
||||
currentDiff = DIFF(inputBPS, supportedBPS[i]);
|
||||
if(supportedBPS[i] == AudioFileModel::BITDEPTH_IEEE_FLOAT32) continue;
|
||||
|
||||
currentDiff = DIFF(originalBPS, supportedBPS[i]);
|
||||
if((currentDiff < minimumDiff) || ((currentDiff == minimumDiff) && (bestBPS < supportedBPS[i])))
|
||||
{
|
||||
bestBPS = supportedBPS[i];
|
||||
@ -460,11 +474,12 @@ void ProcessThread::insertDownsampleFilter(void)
|
||||
}
|
||||
}
|
||||
|
||||
if(bestBPS != inputBPS)
|
||||
if(bestBPS != originalBPS)
|
||||
{
|
||||
targetBitDepth = (bestBPS != UINT_MAX) ? bestBPS : supportedBPS[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Insert the filter */
|
||||
if(targetSampleRate || targetBitDepth)
|
||||
|
@ -96,7 +96,7 @@ bool WaveProperties::detect(const QString &sourceFile, AudioFileModel *info, vol
|
||||
{
|
||||
bool ok = false;
|
||||
unsigned int tmp = regExp_encoding.cap(1).toUInt(&ok);
|
||||
if(ok) info->setFormatAudioBitdepth(tmp);
|
||||
if(ok) info->setFormatAudioBitdepth((tmp == 32) ? AudioFileModel::BITDEPTH_IEEE_FLOAT32 : tmp);
|
||||
emit statusUpdated(qMin(progress += 25, 100));
|
||||
}
|
||||
if(regExp_samplerate.lastIndexIn(text) >= 0)
|
||||
|
Loading…
Reference in New Issue
Block a user