23class SoundLoader_Opus :
public SoundLoader {
25 SoundLoader_Opus() : SoundLoader(
"opus",
"Opus sound loader", 10) {}
40 bool Load(
SoundEntry &sound,
bool new_format, std::vector<std::byte> &data)
const override
42 if (!new_format)
return false;
48 auto filepos = sound.file->
GetPos();
50 sound.file->
ReadBlock(tmp.data(), tmp.size());
51 if (op_test(
nullptr, tmp.data(), tmp.size()) != 0)
return false;
54 tmp.resize(sound.file_size);
55 sound.file->
SeekTo(filepos, SEEK_SET);
56 sound.file->
ReadBlock(tmp.data(), tmp.size());
61 Debug(grf, 0,
"SoundLoader_Opus: Unable to open stream.");
67 data.resize(datapos + DECODE_BUFFER_BYTES);
70 int read = op_read(of.get(),
reinterpret_cast<opus_int16 *
>(&data[datapos]), DECODE_BUFFER_BYTES, &link_index);
74 Debug(grf, 0,
"SoundLoader_Opus: Unexpected end of stream.");
79 int channels = op_channel_count(of.get(), link_index);
81 Debug(grf, 0,
"SoundLoader_Opus: Unsupported channels {}, expected 1.", channels);
86 datapos += read *
sizeof(opus_int16);
95 data.resize(data.size() - DECODE_BUFFER_BYTES);
Helper for std::unique_ptr to use an arbitrary function as the deleter.
std::unique_ptr< T, DeleterFromFunc< Tfunc > > AutoRelease
Specialisation of std::unique_ptr for objects which must be deleted by calling a function.
void ReadBlock(void *ptr, size_t size)
Read a block.
size_t GetPos() const
Get position in the file.
void SeekTo(size_t pos, int mode)
Seek in the current file.
static constexpr uint16_t OPUS_SAMPLE_RATE
OpusFile always decodes at 48kHz.
static constexpr uint8_t OPUS_SAMPLE_BITS
OpusFile op_read() uses 16 bits per sample.
static constexpr size_t MIN_OPUS_FILE_SIZE
For good results, you will need at least 57 bytes (for a pure Opus-only stream).
static constexpr size_t DECODE_BUFFER_SAMPLES
It is recommended that this be large enough for at least 120 ms of data at 48 kHz per channel (5760 v...
bool Load(SoundEntry &sound, bool new_format, std::vector< std::byte > &data) const override
Load a sound from the file and offset in the given sound entry.
Functions related to debugging.
#define Debug(category, level, format_string,...)
Output a line of debugging information.
Class related to random access to files.
A number of safeguards to prevent using unsafe methods.
Types related to sound loaders.
Definition of base types and functions in a cross-platform compatible way.