mirror of
https://github.com/love2d/love.git
synced 2026-08-20 04:30:09 +02:00
Revert "Implement audio probing to reduce audio false positive."
This reverts commit5f386cfa87and17800813b9.
This commit is contained in:
@@ -48,11 +48,6 @@ Decoder::~Decoder()
|
|||||||
delete [](char *) buffer;
|
delete [](char *) buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Decoder::probe(Stream */* stream */)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *Decoder::getBuffer() const
|
void *Decoder::getBuffer() const
|
||||||
{
|
{
|
||||||
return buffer;
|
return buffer;
|
||||||
|
|||||||
@@ -51,7 +51,6 @@ public:
|
|||||||
|
|
||||||
Decoder(Stream *stream, int bufferSize);
|
Decoder(Stream *stream, int bufferSize);
|
||||||
virtual ~Decoder();
|
virtual ~Decoder();
|
||||||
static int probe(Stream *stream);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Indicates how many bytes of raw data should be generated at each
|
* Indicates how many bytes of raw data should be generated at each
|
||||||
|
|||||||
@@ -118,22 +118,6 @@ CoreAudioDecoder::~CoreAudioDecoder()
|
|||||||
closeAudioFile();
|
closeAudioFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
int CoreAudioDecoder::probe(Stream* stream)
|
|
||||||
{
|
|
||||||
AudioFileID audioFile;
|
|
||||||
OSStatus err = noErr;
|
|
||||||
|
|
||||||
// I think this is sufficient
|
|
||||||
err = AudioFileOpenWithCallbacks(stream, readFunc, nullptr, getSizeFunc, nullptr, kAudioFileMP3Type, &audioFile);
|
|
||||||
if (err == noErr)
|
|
||||||
{
|
|
||||||
AudioFileClose(audioFile);
|
|
||||||
return 80;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CoreAudioDecoder::closeAudioFile()
|
void CoreAudioDecoder::closeAudioFile()
|
||||||
{
|
{
|
||||||
if (extAudioFile != nullptr)
|
if (extAudioFile != nullptr)
|
||||||
|
|||||||
@@ -49,7 +49,6 @@ public:
|
|||||||
|
|
||||||
CoreAudioDecoder(Stream *stream, int bufferSize);
|
CoreAudioDecoder(Stream *stream, int bufferSize);
|
||||||
virtual ~CoreAudioDecoder();
|
virtual ~CoreAudioDecoder();
|
||||||
static int probe(Stream *stream);
|
|
||||||
|
|
||||||
love::sound::Decoder *clone() override;
|
love::sound::Decoder *clone() override;
|
||||||
int decode() override;
|
int decode() override;
|
||||||
|
|||||||
@@ -59,22 +59,6 @@ FLACDecoder::~FLACDecoder()
|
|||||||
drflac_close(flac);
|
drflac_close(flac);
|
||||||
}
|
}
|
||||||
|
|
||||||
int FLACDecoder::probe(Stream *stream)
|
|
||||||
{
|
|
||||||
char header[4];
|
|
||||||
|
|
||||||
if (stream->read(header, 4) >= 4)
|
|
||||||
{
|
|
||||||
if (memcmp(header, "fLaC", 4) == 0)
|
|
||||||
return 100;
|
|
||||||
else if (memcmp(header, "OggS", 4) == 0)
|
|
||||||
// Vorbis has higher priority
|
|
||||||
return 40;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
love::sound::Decoder *FLACDecoder::clone()
|
love::sound::Decoder *FLACDecoder::clone()
|
||||||
{
|
{
|
||||||
StrongRef<Stream> s(stream->clone(), Acquire::NORETAIN);
|
StrongRef<Stream> s(stream->clone(), Acquire::NORETAIN);
|
||||||
|
|||||||
@@ -40,7 +40,6 @@ class FLACDecoder : public Decoder
|
|||||||
public:
|
public:
|
||||||
FLACDecoder(Stream *stream, int bufferSize);
|
FLACDecoder(Stream *stream, int bufferSize);
|
||||||
~FLACDecoder();
|
~FLACDecoder();
|
||||||
static int probe(Stream *stream);
|
|
||||||
|
|
||||||
love::sound::Decoder *clone() override;
|
love::sound::Decoder *clone() override;
|
||||||
int decode() override;
|
int decode() override;
|
||||||
|
|||||||
@@ -85,66 +85,6 @@ MP3Decoder::~MP3Decoder()
|
|||||||
drmp3_uninit(&mp3);
|
drmp3_uninit(&mp3);
|
||||||
}
|
}
|
||||||
|
|
||||||
int MP3Decoder::probe(Stream* stream)
|
|
||||||
{
|
|
||||||
// Header size of ID3v2
|
|
||||||
unsigned char header[10];
|
|
||||||
|
|
||||||
if (stream->read(header, 10) >= 10)
|
|
||||||
{
|
|
||||||
if (memcmp(header, "TAG", 3) == 0)
|
|
||||||
{
|
|
||||||
// ID3v1 size is 128 bytes. https://id3.org/ID3v1
|
|
||||||
stream->seek(128, Stream::SEEKORIGIN_BEGIN);
|
|
||||||
// We just need 4 bytes actually
|
|
||||||
if (stream->read(header, 4) < 4)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else if (memcmp(header, "ID3", 3) == 0)
|
|
||||||
{
|
|
||||||
// ID3v2 size is variable
|
|
||||||
size_t id3Size =
|
|
||||||
size_t(header[9] & 0x7F) |
|
|
||||||
(size_t(header[8] & 0x7F) << 7) |
|
|
||||||
(size_t(header[7] & 0x7F) << 14) |
|
|
||||||
(size_t(header[6] & 0x7F) << 21);
|
|
||||||
stream->seek(3 /* "ID3" */ + 2 /* version */ + 1 /* flags */ + 4 /* size */ + id3Size, Stream::SEEKORIGIN_BEGIN);
|
|
||||||
// We just need 4 bytes actually
|
|
||||||
if (stream->read(header, 4) < 4)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
// According to http://www.mp3-tech.org/programmer/frame_header.html
|
|
||||||
// Check sync bits
|
|
||||||
if ((header[0] == 0xFF) && (((header[1] >> 5) & 0x7) == 0x7))
|
|
||||||
{
|
|
||||||
if (((header[1] >> 3) & 3) == 1)
|
|
||||||
// Reserved version
|
|
||||||
return 0;
|
|
||||||
if (((header[1] >> 1) & 3) == 0)
|
|
||||||
// Reserved layer
|
|
||||||
return 0;
|
|
||||||
if (((header[2] >> 4) & 0xF) == 0xF)
|
|
||||||
// Bad bitrate
|
|
||||||
return 0;
|
|
||||||
if (((header[2] >> 2) & 0x3) == 0x3)
|
|
||||||
// Reserved sample rate
|
|
||||||
return 0;
|
|
||||||
if ((header[3] & 0x3) == 2)
|
|
||||||
// Reserved emphasis
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
// Likely MP3.
|
|
||||||
return 75;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sync bits probably elsewhere
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
love::sound::Decoder *MP3Decoder::clone()
|
love::sound::Decoder *MP3Decoder::clone()
|
||||||
{
|
{
|
||||||
StrongRef<Stream> s(stream->clone(), Acquire::NORETAIN);
|
StrongRef<Stream> s(stream->clone(), Acquire::NORETAIN);
|
||||||
|
|||||||
@@ -43,7 +43,6 @@ public:
|
|||||||
|
|
||||||
MP3Decoder(Stream *stream, int bufsize);
|
MP3Decoder(Stream *stream, int bufsize);
|
||||||
virtual ~MP3Decoder();
|
virtual ~MP3Decoder();
|
||||||
static int probe(Stream *stream);
|
|
||||||
|
|
||||||
love::sound::Decoder *clone() override;
|
love::sound::Decoder *clone() override;
|
||||||
int decode() override;
|
int decode() override;
|
||||||
|
|||||||
@@ -95,19 +95,6 @@ ModPlugDecoder::~ModPlugDecoder()
|
|||||||
ModPlug_Unload(plug);
|
ModPlug_Unload(plug);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ModPlugDecoder::probe(Stream* stream)
|
|
||||||
{
|
|
||||||
// Ideally we want to probe every single format that ModPlug supports.
|
|
||||||
Data *data = stream->read(1024 * 1024 * 4);
|
|
||||||
ModPlugFile *plug = ModPlug_Load(data->getData(), (int)data->getSize());
|
|
||||||
|
|
||||||
if (plug)
|
|
||||||
ModPlug_Unload(plug);
|
|
||||||
|
|
||||||
data->release();
|
|
||||||
return plug ? 80 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
love::sound::Decoder *ModPlugDecoder::clone()
|
love::sound::Decoder *ModPlugDecoder::clone()
|
||||||
{
|
{
|
||||||
StrongRef<Stream> s(stream->clone(), Acquire::NORETAIN);
|
StrongRef<Stream> s(stream->clone(), Acquire::NORETAIN);
|
||||||
|
|||||||
@@ -49,7 +49,6 @@ public:
|
|||||||
|
|
||||||
ModPlugDecoder(Stream *stream, int bufferSize);
|
ModPlugDecoder(Stream *stream, int bufferSize);
|
||||||
virtual ~ModPlugDecoder();
|
virtual ~ModPlugDecoder();
|
||||||
static int probe(Stream *stream);
|
|
||||||
|
|
||||||
love::sound::Decoder *clone() override;
|
love::sound::Decoder *clone() override;
|
||||||
int decode() override;
|
int decode() override;
|
||||||
|
|||||||
@@ -38,15 +38,8 @@
|
|||||||
struct DecoderImpl
|
struct DecoderImpl
|
||||||
{
|
{
|
||||||
love::sound::Decoder *(*create)(love::Stream *stream, int bufferSize);
|
love::sound::Decoder *(*create)(love::Stream *stream, int bufferSize);
|
||||||
int (*probe)(love::Stream *stream);
|
|
||||||
int probeScore;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool compareProbeScore(const DecoderImpl& a, const DecoderImpl& b)
|
|
||||||
{
|
|
||||||
return a.probeScore > b.probeScore;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename DecoderType>
|
template<typename DecoderType>
|
||||||
DecoderImpl DecoderImplFor()
|
DecoderImpl DecoderImplFor()
|
||||||
{
|
{
|
||||||
@@ -55,20 +48,6 @@ DecoderImpl DecoderImplFor()
|
|||||||
{
|
{
|
||||||
return new DecoderType(stream, bufferSize);
|
return new DecoderType(stream, bufferSize);
|
||||||
};
|
};
|
||||||
decoderImpl.probe = [](love::Stream* stream)
|
|
||||||
{
|
|
||||||
return DecoderType::probe(stream);
|
|
||||||
};
|
|
||||||
// Short description of probe score:
|
|
||||||
// Probe score indicates how likely is a file is in certain format. If the
|
|
||||||
// score is 0 then this particular decoder factory is skipped. Otherwise,
|
|
||||||
// decoder with highest probe score is used first then decoder with lower
|
|
||||||
// score.
|
|
||||||
// There's no standarized value for the probe value (except 0) but if a file
|
|
||||||
// is "very likely" on certain format, it's safe to return 100. If the file
|
|
||||||
// is "unlikely" to be certain format but determining such thing requires
|
|
||||||
// more complicated parsing, it's better to return 1.
|
|
||||||
decoderImpl.probeScore = 0;
|
|
||||||
return decoderImpl;
|
return decoderImpl;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,7 +73,7 @@ const char *Sound::getName() const
|
|||||||
|
|
||||||
sound::Decoder *Sound::newDecoder(Stream *stream, int bufferSize)
|
sound::Decoder *Sound::newDecoder(Stream *stream, int bufferSize)
|
||||||
{
|
{
|
||||||
std::vector<DecoderImpl> possibleActiveDecoders, possibleDecoders = {
|
std::vector<DecoderImpl> possibleDecoders = {
|
||||||
DecoderImplFor<MP3Decoder>(),
|
DecoderImplFor<MP3Decoder>(),
|
||||||
DecoderImplFor<VorbisDecoder>(),
|
DecoderImplFor<VorbisDecoder>(),
|
||||||
#ifdef LOVE_SUPPORT_COREAUDIO
|
#ifdef LOVE_SUPPORT_COREAUDIO
|
||||||
@@ -107,20 +86,9 @@ sound::Decoder *Sound::newDecoder(Stream *stream, int bufferSize)
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
// Probe decoders
|
|
||||||
for (DecoderImpl& possibleDecoder : possibleDecoders)
|
|
||||||
{
|
|
||||||
stream->seek(0);
|
|
||||||
possibleDecoder.probeScore = possibleDecoder.probe(stream);
|
|
||||||
|
|
||||||
if (possibleDecoder.probeScore > 0)
|
|
||||||
possibleActiveDecoders.push_back(possibleDecoder);
|
|
||||||
}
|
|
||||||
std::sort(possibleActiveDecoders.begin(), possibleActiveDecoders.end(), compareProbeScore);
|
|
||||||
|
|
||||||
// Load
|
|
||||||
std::stringstream decodingErrors;
|
std::stringstream decodingErrors;
|
||||||
for (DecoderImpl &possibleDecoder : possibleActiveDecoders)
|
decodingErrors << "Failed to determine file type:\n";
|
||||||
|
for (DecoderImpl &possibleDecoder : possibleDecoders)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -97,19 +97,6 @@ VorbisDecoder::~VorbisDecoder()
|
|||||||
ov_clear(&handle);
|
ov_clear(&handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
int VorbisDecoder::probe(Stream *stream)
|
|
||||||
{
|
|
||||||
char header[4];
|
|
||||||
|
|
||||||
if (stream->read(header, 4) >= 4)
|
|
||||||
{
|
|
||||||
if (memcmp(header, "OggS", 4) == 0)
|
|
||||||
return 60;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
love::sound::Decoder *VorbisDecoder::clone()
|
love::sound::Decoder *VorbisDecoder::clone()
|
||||||
{
|
{
|
||||||
StrongRef<Stream> s(stream->clone(), Acquire::NORETAIN);
|
StrongRef<Stream> s(stream->clone(), Acquire::NORETAIN);
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ public:
|
|||||||
|
|
||||||
VorbisDecoder(Stream *stream, int bufferSize);
|
VorbisDecoder(Stream *stream, int bufferSize);
|
||||||
virtual ~VorbisDecoder();
|
virtual ~VorbisDecoder();
|
||||||
static int probe(Stream *stream);
|
|
||||||
|
|
||||||
love::sound::Decoder *clone() override;
|
love::sound::Decoder *clone() override;
|
||||||
int decode() override;
|
int decode() override;
|
||||||
|
|||||||
@@ -91,27 +91,6 @@ WaveDecoder::~WaveDecoder()
|
|||||||
wuff_close(handle);
|
wuff_close(handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
int WaveDecoder::probe(Stream* stream)
|
|
||||||
{
|
|
||||||
char header[8];
|
|
||||||
|
|
||||||
if (stream->read(header, 4) < 4)
|
|
||||||
return 0;
|
|
||||||
if (memcmp(header, "RIFF", 4) != 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
// Ignore size
|
|
||||||
stream->seek(4, Stream::SEEKORIGIN_CURRENT);
|
|
||||||
|
|
||||||
if (stream->read(header, 8) < 8)
|
|
||||||
return 0;
|
|
||||||
if (memcmp(header, "WAVEfmt ", 8) != 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
// WAV file
|
|
||||||
return 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
love::sound::Decoder *WaveDecoder::clone()
|
love::sound::Decoder *WaveDecoder::clone()
|
||||||
{
|
{
|
||||||
StrongRef<Stream> s(stream->clone(), Acquire::NORETAIN);
|
StrongRef<Stream> s(stream->clone(), Acquire::NORETAIN);
|
||||||
|
|||||||
@@ -40,7 +40,6 @@ public:
|
|||||||
|
|
||||||
WaveDecoder(Stream *stream, int bufferSize);
|
WaveDecoder(Stream *stream, int bufferSize);
|
||||||
virtual ~WaveDecoder();
|
virtual ~WaveDecoder();
|
||||||
static int probe(Stream *stream);
|
|
||||||
|
|
||||||
love::sound::Decoder *clone() override;
|
love::sound::Decoder *clone() override;
|
||||||
int decode() override;
|
int decode() override;
|
||||||
|
|||||||
Reference in New Issue
Block a user