Commit a057b4f6 authored by Max Kellermann's avatar Max Kellermann

*: add lost of "noexcept" specifications

parent 62b03cfd
......@@ -127,7 +127,7 @@ struct AudioFormat {
void ApplyMask(AudioFormat mask) noexcept;
gcc_pure
AudioFormat WithMask(AudioFormat mask) const {
AudioFormat WithMask(AudioFormat mask) const noexcept {
AudioFormat result = *this;
result.ApplyMask(mask);
return result;
......
......@@ -152,7 +152,7 @@ public:
bool IsRemote() const noexcept;
gcc_pure
bool IsFile() const {
bool IsFile() const noexcept {
return !IsRemote();
}
......@@ -162,11 +162,11 @@ public:
gcc_pure
bool IsInDatabase() const noexcept;
const Tag &GetTag() const {
const Tag &GetTag() const noexcept {
return tag;
}
Tag &WritableTag() {
Tag &WritableTag() noexcept {
return tag;
}
......
......@@ -31,45 +31,45 @@ class MixRampInfo {
public:
MixRampInfo() = default;
void Clear() {
void Clear() noexcept {
start.clear();
end.clear();
}
gcc_pure
bool IsDefined() const {
bool IsDefined() const noexcept {
return !start.empty() || !end.empty();
}
gcc_pure
const char *GetStart() const {
const char *GetStart() const noexcept {
return start.empty() ? nullptr : start.c_str();
}
gcc_pure
const char *GetEnd() const {
const char *GetEnd() const noexcept {
return end.empty() ? nullptr : end.c_str();
}
void SetStart(const char *new_value) {
void SetStart(const char *new_value) noexcept {
if (new_value == nullptr)
start.clear();
else
start = new_value;
}
void SetStart(std::string &&new_value) {
void SetStart(std::string &&new_value) noexcept {
start = std::move(new_value);
}
void SetEnd(const char *new_value) {
void SetEnd(const char *new_value) noexcept {
if (new_value == nullptr)
end.clear();
else
end = new_value;
}
void SetEnd(std::string &&new_value) {
void SetEnd(std::string &&new_value) noexcept {
end = std::move(new_value);
}
};
......
......@@ -60,7 +60,7 @@ public:
* music_buffer_new().
*/
gcc_pure
unsigned GetSize() const {
unsigned GetSize() const noexcept {
return buffer.GetCapacity();
}
......
......@@ -39,7 +39,7 @@ MusicPipe::Contains(const MusicChunk *chunk) const noexcept
#endif
MusicChunk *
MusicPipe::Shift()
MusicPipe::Shift() noexcept
{
const std::lock_guard<Mutex> protect(mutex);
......@@ -73,7 +73,7 @@ MusicPipe::Shift()
}
void
MusicPipe::Clear(MusicBuffer &buffer)
MusicPipe::Clear(MusicBuffer &buffer) noexcept
{
MusicChunk *chunk;
......@@ -82,7 +82,7 @@ MusicPipe::Clear(MusicBuffer &buffer)
}
void
MusicPipe::Push(MusicChunk *chunk)
MusicPipe::Push(MusicChunk *chunk) noexcept
{
assert(!chunk->IsEmpty());
assert(chunk->length == 0 || chunk->audio_format.IsValid());
......
......@@ -77,7 +77,7 @@ public:
* audio_format.
*/
gcc_pure
bool CheckFormat(AudioFormat other) const {
bool CheckFormat(AudioFormat other) const noexcept {
return !audio_format.IsDefined() ||
audio_format == other;
}
......@@ -94,37 +94,37 @@ public:
* nullptr if the pipe is empty.
*/
gcc_pure
const MusicChunk *Peek() const {
const MusicChunk *Peek() const noexcept {
return head;
}
/**
* Removes the first chunk from the head, and returns it.
*/
MusicChunk *Shift();
MusicChunk *Shift() noexcept;
/**
* Clears the whole pipe and returns the chunks to the buffer.
*
* @param buffer the buffer object to return the chunks to
*/
void Clear(MusicBuffer &buffer);
void Clear(MusicBuffer &buffer) noexcept;
/**
* Pushes a chunk to the tail of the pipe.
*/
void Push(MusicChunk *chunk);
void Push(MusicChunk *chunk) noexcept;
/**
* Returns the number of chunks currently in this pipe.
*/
gcc_pure
unsigned GetSize() const {
unsigned GetSize() const noexcept {
return size;
}
gcc_pure
bool IsEmpty() const {
bool IsEmpty() const noexcept {
return GetSize() == 0;
}
};
......
......@@ -100,7 +100,7 @@ public:
}
gcc_pure
bool IsExpired() const {
bool IsExpired() const noexcept {
return !FullyBufferedSocket::IsDefined();
}
......
......@@ -82,12 +82,12 @@ struct ConfigBlock {
* object that was synthesized and not loaded from a
* configuration file.
*/
bool IsNull() const {
bool IsNull() const noexcept {
return line < 0;
}
gcc_pure
bool IsEmpty() const {
bool IsEmpty() const noexcept {
return block_params.empty();
}
......
......@@ -29,7 +29,7 @@
struct StringLess {
gcc_pure
bool operator()(const char *a, const char *b) const {
bool operator()(const char *a, const char *b) const noexcept {
return strcmp(a, b) < 0;
}
};
......
......@@ -126,7 +126,7 @@ public:
* Returns 0 if that is not not known/available.
*/
gcc_pure
virtual time_t GetUpdateStamp() const = 0;
virtual time_t GetUpdateStamp() const noexcept = 0;
};
#endif
......@@ -44,16 +44,16 @@ struct LightDirectory {
constexpr LightDirectory(const char *_uri, time_t _mtime)
:uri(_uri), mtime(_mtime) {}
static constexpr LightDirectory Root() {
static constexpr LightDirectory Root() noexcept {
return LightDirectory("", 0);
}
bool IsRoot() const {
bool IsRoot() const noexcept {
return *uri == 0;
}
gcc_pure
const char *GetPath() const {
const char *GetPath() const noexcept {
return uri;
}
};
......
......@@ -45,7 +45,7 @@ struct PlaylistInfo {
constexpr CompareName(const char *_name):name(_name) {}
gcc_pure
bool operator()(const PlaylistInfo &pi) const {
bool operator()(const PlaylistInfo &pi) const noexcept {
return pi.name.compare(name) == 0;
}
};
......
......@@ -127,7 +127,7 @@ public:
unsigned Update(const char *uri_utf8, bool discard) override;
time_t GetUpdateStamp() const override {
time_t GetUpdateStamp() const noexcept override {
return update_stamp;
}
......
......@@ -187,7 +187,7 @@ public:
}
gcc_pure
const char *GetPath() const {
const char *GetPath() const noexcept {
return path.c_str();
}
......
......@@ -76,7 +76,7 @@ public:
const ConfigBlock &block);
gcc_pure
Directory &GetRoot() {
Directory &GetRoot() noexcept {
assert(root != NULL);
return *root;
......@@ -125,7 +125,7 @@ public:
DatabaseStats GetStats(const DatabaseSelection &selection) const override;
time_t GetUpdateStamp() const override {
time_t GetUpdateStamp() const noexcept override {
return mtime;
}
......
......@@ -60,7 +60,7 @@ public:
* Parent's ObjectId
*/
std::string parent_id;
std::string url;
/**
......@@ -80,7 +80,7 @@ public:
UPnPDirObject &operator=(UPnPDirObject &&) = default;
void Clear() {
void Clear() noexcept {
id.clear();
parent_id.clear();
url.clear();
......@@ -90,7 +90,7 @@ public:
}
gcc_pure
bool Check() const {
bool Check() const noexcept {
return !id.empty() && !parent_id.empty() && !name.empty() &&
(type != UPnPDirObject::Type::ITEM ||
item_class != UPnPDirObject::ItemClass::UNKNOWN);
......
......@@ -93,7 +93,7 @@ public:
DatabaseStats GetStats(const DatabaseSelection &selection) const override;
time_t GetUpdateStamp() const override {
time_t GetUpdateStamp() const noexcept override {
return 0;
}
......
......@@ -36,7 +36,7 @@
#include <string.h>
bool
ExcludeList::LoadFile(Path path_fs)
ExcludeList::LoadFile(Path path_fs) noexcept
try {
#ifdef HAVE_CLASS_GLOB
TextFile file(path_fs);
......@@ -67,7 +67,7 @@ try {
}
bool
ExcludeList::Check(Path name_fs) const
ExcludeList::Check(Path name_fs) const noexcept
{
assert(!name_fs.IsNull());
......
......@@ -50,7 +50,7 @@ public:
:parent(&_parent) {}
gcc_pure
bool IsEmpty() const {
bool IsEmpty() const noexcept {
#ifdef HAVE_CLASS_GLOB
return ((parent == nullptr) || parent->IsEmpty()) && patterns.empty();
#else
......@@ -62,13 +62,13 @@ public:
/**
* Loads and parses a .mpdignore file.
*/
bool LoadFile(Path path_fs);
bool LoadFile(Path path_fs) noexcept;
/**
* Checks whether one of the patterns in the .mpdignore file matches
* the specified file name.
*/
bool Check(Path name_fs) const;
bool Check(Path name_fs) const noexcept;
};
......
......@@ -277,7 +277,7 @@ DecoderBridge::Ready(const AudioFormat audio_format,
}
DecoderCommand
DecoderBridge::GetCommand()
DecoderBridge::GetCommand() noexcept
{
return LockGetVirtualCommand();
}
......@@ -326,7 +326,7 @@ DecoderBridge::CommandFinished()
}
SongTime
DecoderBridge::GetSeekTime()
DecoderBridge::GetSeekTime() noexcept
{
assert(dc.pipe != nullptr);
......@@ -341,7 +341,7 @@ DecoderBridge::GetSeekTime()
}
uint64_t
DecoderBridge::GetSeekFrame()
DecoderBridge::GetSeekFrame() noexcept
{
return GetSeekTime().ToScale<uint64_t>(dc.in_audio_format.sample_rate);
}
......
......@@ -134,10 +134,10 @@ public:
/* virtual methods from DecoderClient */
void Ready(AudioFormat audio_format,
bool seekable, SignedSongTime duration) override;
DecoderCommand GetCommand() override;
DecoderCommand GetCommand() noexcept override;
void CommandFinished() override;
SongTime GetSeekTime() override;
uint64_t GetSeekFrame() override;
SongTime GetSeekTime() noexcept override;
uint64_t GetSeekFrame() noexcept override;
void SeekError() override;
InputStreamPtr OpenUri(const char *uri) override;
size_t Read(InputStream &is, void *buffer, size_t length) override;
......
......@@ -58,7 +58,7 @@ public:
* command pending
*/
gcc_pure
virtual DecoderCommand GetCommand() = 0;
virtual DecoderCommand GetCommand() noexcept = 0;
/**
* Called by the decoder when it has performed the requested command
......@@ -73,7 +73,7 @@ public:
* @return the destination position for the seek in milliseconds
*/
gcc_pure
virtual SongTime GetSeekTime() = 0;
virtual SongTime GetSeekTime() noexcept = 0;
/**
* Call this when you have received the DecoderCommand::SEEK command.
......@@ -81,7 +81,7 @@ public:
* @return the destination position for the seek in frames
*/
gcc_pure
virtual uint64_t GetSeekFrame() = 0;
virtual uint64_t GetSeekFrame() noexcept = 0;
/**
* Call this instead of CommandFinished() when seeking has
......
......@@ -54,11 +54,11 @@ public:
size_t _size)
:client(_client), is(_is), buffer(_size) {}
const InputStream &GetStream() const {
const InputStream &GetStream() const noexcept {
return is;
}
void Clear() {
void Clear() noexcept {
buffer.Clear();
}
......@@ -75,7 +75,7 @@ public:
* How many bytes are stored in the buffer?
*/
gcc_pure
size_t GetAvailable() const {
size_t GetAvailable() const noexcept {
return buffer.GetAvailable();
}
......@@ -84,7 +84,7 @@ public:
* you have to call Consume() to do that. The returned buffer
* becomes invalid after a Fill() or a Consume() call.
*/
ConstBuffer<void> Read() const {
ConstBuffer<void> Read() const noexcept {
auto r = buffer.Read();
return { r.data, r.size };
}
......@@ -102,7 +102,7 @@ public:
*
* @param nbytes the number of bytes to consume
*/
void Consume(size_t nbytes) {
void Consume(size_t nbytes) noexcept {
buffer.Consume(nbytes);
}
......
......@@ -227,29 +227,29 @@ struct DecoderControl {
}
gcc_pure
bool LockIsIdle() const {
bool LockIsIdle() const noexcept {
const std::lock_guard<Mutex> protect(mutex);
return IsIdle();
}
bool IsStarting() const {
bool IsStarting() const noexcept {
return state == DecoderState::START;
}
gcc_pure
bool LockIsStarting() const {
bool LockIsStarting() const noexcept {
const std::lock_guard<Mutex> protect(mutex);
return IsStarting();
}
bool HasFailed() const {
bool HasFailed() const noexcept {
assert(command == DecoderCommand::NONE);
return state == DecoderState::ERROR;
}
gcc_pure
bool LockHasFailed() const {
bool LockHasFailed() const noexcept {
const std::lock_guard<Mutex> protect(mutex);
return HasFailed();
}
......
......@@ -42,25 +42,27 @@ public:
return chain;
}
bool Read(const char *path) {
bool Read(const char *path) noexcept {
return ::FLAC__metadata_chain_read(chain, path);
}
bool Read(FLAC__IOHandle handle, FLAC__IOCallbacks callbacks) {
bool Read(FLAC__IOHandle handle,
FLAC__IOCallbacks callbacks) noexcept {
return ::FLAC__metadata_chain_read_with_callbacks(chain,
handle,
callbacks);
}
bool Read(InputStream &is) {
bool Read(InputStream &is) noexcept {
return Read(::ToFlacIOHandle(is), ::GetFlacIOCallbacks(is));
}
bool ReadOgg(const char *path) {
bool ReadOgg(const char *path) noexcept {
return ::FLAC__metadata_chain_read_ogg(chain, path);
}
bool ReadOgg(FLAC__IOHandle handle, FLAC__IOCallbacks callbacks) {
bool ReadOgg(FLAC__IOHandle handle,
FLAC__IOCallbacks callbacks) noexcept {
return ::FLAC__metadata_chain_read_ogg_with_callbacks(chain,
handle,
callbacks);
......@@ -71,12 +73,12 @@ public:
}
gcc_pure
FLAC__Metadata_ChainStatus GetStatus() const {
FLAC__Metadata_ChainStatus GetStatus() const noexcept {
return ::FLAC__metadata_chain_status(chain);
}
gcc_pure
const char *GetStatusString() const {
const char *GetStatusString() const noexcept {
return FLAC__Metadata_ChainStatusString[GetStatus()];
}
......@@ -99,12 +101,12 @@ public:
::FLAC__metadata_iterator_delete(iterator);
}
bool Next() {
bool Next() noexcept {
return ::FLAC__metadata_iterator_next(iterator);
}
gcc_pure
FLAC__StreamMetadata *GetBlock() {
FLAC__StreamMetadata *GetBlock() noexcept {
return ::FLAC__metadata_iterator_get_block(iterator);
}
};
......
......@@ -52,14 +52,14 @@ static constexpr unsigned opus_output_buffer_frames = opus_sample_rate / 4;
gcc_pure
static bool
IsOpusHead(const ogg_packet &packet)
IsOpusHead(const ogg_packet &packet) noexcept
{
return packet.bytes >= 8 && memcmp(packet.packet, "OpusHead", 8) == 0;
}
gcc_pure
static bool
IsOpusTags(const ogg_packet &packet)
IsOpusTags(const ogg_packet &packet) noexcept
{
return packet.bytes >= 8 && memcmp(packet.packet, "OpusTags", 8) == 0;
}
......
......@@ -199,7 +199,7 @@ public:
* Are we currently running inside this EventLoop's thread?
*/
gcc_pure
bool IsInside() const {
bool IsInside() const noexcept {
assert(!thread.IsNull());
return thread.IsInside();
......@@ -207,7 +207,7 @@ public:
#ifndef NDEBUG
gcc_pure
bool IsInsideOrVirgin() const {
bool IsInsideOrVirgin() const noexcept {
return virgin || IsInside();
}
#endif
......@@ -219,7 +219,7 @@ public:
* are not yet/anymore handled.
*/
gcc_pure
bool IsInsideOrNull() const {
bool IsInsideOrNull() const noexcept {
return thread.IsNull() || thread.IsInside();
}
};
......
......@@ -77,12 +77,12 @@ public:
* @see IsNull()
*/
gcc_const
static AllocatedPath Null() {
static AllocatedPath Null() noexcept {
return AllocatedPath(nullptr);
}
gcc_pure
operator Path() const {
operator Path() const noexcept {
return Path::FromFS(c_str());
}
......@@ -90,36 +90,39 @@ public:
* Join two path components with the path separator.
*/
gcc_pure gcc_nonnull_all
static AllocatedPath Build(const_pointer_type a, const_pointer_type b) {
static AllocatedPath Build(const_pointer_type a,
const_pointer_type b) noexcept {
return Build(a, PathTraitsFS::GetLength(a),
b, PathTraitsFS::GetLength(b));
}
gcc_pure gcc_nonnull_all
static AllocatedPath Build(Path a, const_pointer_type b) {
static AllocatedPath Build(Path a, const_pointer_type b) noexcept {
return Build(a.c_str(), b);
}
gcc_pure gcc_nonnull_all
static AllocatedPath Build(Path a, Path b) {
static AllocatedPath Build(Path a, Path b) noexcept {
return Build(a, b.c_str());
}
gcc_pure gcc_nonnull_all
static AllocatedPath Build(const_pointer_type a, const AllocatedPath &b) {
static AllocatedPath Build(const_pointer_type a,
const AllocatedPath &b) noexcept {
return Build(a, PathTraitsFS::GetLength(a),
b.value.c_str(), b.value.size());
}
gcc_pure gcc_nonnull_all
static AllocatedPath Build(const AllocatedPath &a, const_pointer_type b) {
static AllocatedPath Build(const AllocatedPath &a,
const_pointer_type b) noexcept {
return Build(a.value.c_str(), a.value.size(),
b, PathTraitsFS::GetLength(b));
}
gcc_pure
static AllocatedPath Build(const AllocatedPath &a,
const AllocatedPath &b) {
const AllocatedPath &b) noexcept {
return Build(a.value.c_str(), a.value.size(),
b.value.c_str(), b.value.size());
}
......@@ -129,13 +132,13 @@ public:
* character set to a #Path instance.
*/
gcc_pure
static AllocatedPath FromFS(const_pointer_type fs) {
static AllocatedPath FromFS(const_pointer_type fs) noexcept {
return AllocatedPath(fs);
}
gcc_pure
static AllocatedPath FromFS(const_pointer_type _begin,
const_pointer_type _end) {
const_pointer_type _end) noexcept {
return AllocatedPath(_begin, _end);
}
......@@ -144,7 +147,7 @@ public:
* character set to a #Path instance.
*/
gcc_pure
static AllocatedPath FromFS(string &&fs) {
static AllocatedPath FromFS(string &&fs) noexcept {
return AllocatedPath(std::move(fs));
}
......@@ -176,12 +179,12 @@ public:
}
gcc_pure
bool operator==(const AllocatedPath &other) const {
bool operator==(const AllocatedPath &other) const noexcept {
return value == other.value;
}
gcc_pure
bool operator!=(const AllocatedPath &other) const {
bool operator!=(const AllocatedPath &other) const noexcept {
return value != other.value;
}
......@@ -197,7 +200,7 @@ public:
* Check if this is a "nulled" instance. A "nulled" instance
* must not be used.
*/
bool IsNull() const {
bool IsNull() const noexcept {
return value.empty();
}
......@@ -206,7 +209,7 @@ public:
*
* @see IsNull()
*/
void SetNull() {
void SetNull() noexcept {
value.clear();
}
......@@ -215,7 +218,7 @@ public:
* elements (which may not be the number of characters).
*/
gcc_pure
size_t length() const {
size_t length() const noexcept {
return value.length();
}
......@@ -225,7 +228,7 @@ public:
* instance ends.
*/
gcc_pure
const_pointer_type c_str() const {
const_pointer_type c_str() const noexcept {
return value.c_str();
}
......@@ -234,7 +237,7 @@ public:
* null-terminated.
*/
gcc_pure
const_pointer_type data() const {
const_pointer_type data() const noexcept {
return value.data();
}
......
......@@ -54,7 +54,7 @@ public:
#endif
gcc_pure
bool Check(const char *name_fs) const {
bool Check(const char *name_fs) const noexcept {
#ifdef HAVE_FNMATCH
return fnmatch(pattern.c_str(), name_fs, 0) == 0;
#elif defined(WIN32)
......
......@@ -92,7 +92,7 @@ public:
* elements (which may not be the number of characters).
*/
gcc_pure
size_t length() const {
size_t length() const noexcept {
assert(!IsNull());
return PathTraitsFS::GetLength(c_str());
......@@ -104,7 +104,7 @@ public:
* instance ends.
*/
gcc_pure
const_pointer_type c_str() const {
const_pointer_type c_str() const noexcept {
return Base::c_str();
}
......@@ -113,7 +113,7 @@ public:
* null-terminated.
*/
gcc_pure
const_pointer_type data() const {
const_pointer_type data() const noexcept {
return c_str();
}
......
......@@ -63,7 +63,7 @@ struct PathTraitsFS {
static constexpr const_pointer_type CURRENT_DIRECTORY = PATH_LITERAL(".");
static constexpr bool IsSeparator(value_type ch) {
static constexpr bool IsSeparator(value_type ch) noexcept {
return
#ifdef WIN32
ch == '/' ||
......@@ -72,7 +72,7 @@ struct PathTraitsFS {
}
gcc_pure gcc_nonnull_all
static const_pointer_type FindLastSeparator(const_pointer_type p) {
static const_pointer_type FindLastSeparator(const_pointer_type p) noexcept {
#if !CLANG_CHECK_VERSION(3,6)
/* disabled on clang due to -Wtautological-pointer-compare */
assert(p != nullptr);
......@@ -90,13 +90,13 @@ struct PathTraitsFS {
#ifdef WIN32
gcc_pure gcc_nonnull_all
static constexpr bool IsDrive(const_pointer_type p) {
static constexpr bool IsDrive(const_pointer_type p) noexcept {
return IsAlphaASCII(p[0]) && p[1] == ':';
}
#endif
gcc_pure gcc_nonnull_all
static bool IsAbsolute(const_pointer_type p) {
static bool IsAbsolute(const_pointer_type p) noexcept {
#if !CLANG_CHECK_VERSION(3,6)
/* disabled on clang due to -Wtautological-pointer-compare */
assert(p != nullptr);
......@@ -110,12 +110,12 @@ struct PathTraitsFS {
}
gcc_pure gcc_nonnull_all
static size_t GetLength(const_pointer_type p) {
static size_t GetLength(const_pointer_type p) noexcept {
return StringLength(p);
}
gcc_pure gcc_nonnull_all
static const_pointer_type Find(const_pointer_type p, value_type ch) {
static const_pointer_type Find(const_pointer_type p, value_type ch) noexcept {
return StringFind(p, ch);
}
......@@ -179,7 +179,7 @@ struct PathTraitsUTF8 {
}
gcc_pure gcc_nonnull_all
static const_pointer_type FindLastSeparator(const_pointer_type p) {
static const_pointer_type FindLastSeparator(const_pointer_type p) noexcept {
#if !CLANG_CHECK_VERSION(3,6)
/* disabled on clang due to -Wtautological-pointer-compare */
assert(p != nullptr);
......@@ -190,13 +190,13 @@ struct PathTraitsUTF8 {
#ifdef WIN32
gcc_pure gcc_nonnull_all
static constexpr bool IsDrive(const_pointer_type p) {
static constexpr bool IsDrive(const_pointer_type p) noexcept {
return IsAlphaASCII(p[0]) && p[1] == ':';
}
#endif
gcc_pure gcc_nonnull_all
static bool IsAbsolute(const_pointer_type p) {
static bool IsAbsolute(const_pointer_type p) noexcept {
#if !CLANG_CHECK_VERSION(3,6)
/* disabled on clang due to -Wtautological-pointer-compare */
assert(p != nullptr);
......@@ -210,12 +210,12 @@ struct PathTraitsUTF8 {
}
gcc_pure gcc_nonnull_all
static size_t GetLength(const_pointer_type p) {
static size_t GetLength(const_pointer_type p) noexcept {
return StringLength(p);
}
gcc_pure gcc_nonnull_all
static const_pointer_type Find(const_pointer_type p, value_type ch) {
static const_pointer_type Find(const_pointer_type p, value_type ch) noexcept {
return StringFind(p, ch);
}
......@@ -255,7 +255,7 @@ struct PathTraitsUTF8 {
const_pointer_type b, size_t b_size) noexcept;
gcc_pure gcc_nonnull_all
static string Build(const_pointer_type a, const_pointer_type b) {
static string Build(const_pointer_type a, const_pointer_type b) noexcept {
return Build(a, GetLength(a), b, GetLength(b));
}
};
......
......@@ -67,7 +67,7 @@ BufferedReader::ReadFull(size_t size)
}
size_t
BufferedReader::ReadFromBuffer(WritableBuffer<void> dest)
BufferedReader::ReadFromBuffer(WritableBuffer<void> dest) noexcept
{
auto src = Read();
size_t nbytes = std::min(src.size, dest.size);
......
......@@ -47,7 +47,7 @@ public:
* Reset the internal state. Should be called after rewinding
* the underlying #Reader.
*/
void Reset() {
void Reset() noexcept {
buffer.Clear();
eof = false;
line_number = 0;
......@@ -56,7 +56,7 @@ public:
bool Fill(bool need_more);
gcc_pure
WritableBuffer<void> Read() const {
WritableBuffer<void> Read() const noexcept {
return buffer.Read().ToVoid();
}
......@@ -67,7 +67,7 @@ public:
*/
void *ReadFull(size_t size);
void Consume(size_t n) {
void Consume(size_t n) noexcept {
buffer.Consume(n);
}
......@@ -75,7 +75,7 @@ public:
* Read (and consume) data from the input buffer into the
* given buffer. Does not attempt to refill the buffer.
*/
size_t ReadFromBuffer(WritableBuffer<void> dest);
size_t ReadFromBuffer(WritableBuffer<void> dest) noexcept;
/**
* Read data into the given buffer and consume it from our
......@@ -86,7 +86,7 @@ public:
char *ReadLine();
unsigned GetLineNumber() const {
unsigned GetLineNumber() const noexcept {
return line_number;
}
};
......
......@@ -52,14 +52,14 @@ AsyncInputStream::~AsyncInputStream()
}
void
AsyncInputStream::SetTag(Tag *_tag)
AsyncInputStream::SetTag(Tag *_tag) noexcept
{
delete tag;
tag = _tag;
}
void
AsyncInputStream::Pause()
AsyncInputStream::Pause() noexcept
{
assert(io_thread_inside());
......@@ -141,7 +141,7 @@ AsyncInputStream::Seek(offset_type new_offset)
}
void
AsyncInputStream::SeekDone()
AsyncInputStream::SeekDone() noexcept
{
assert(io_thread_inside());
assert(IsSeekPending());
......@@ -201,7 +201,7 @@ AsyncInputStream::Read(void *ptr, size_t read_size)
}
void
AsyncInputStream::CommitWriteBuffer(size_t nbytes)
AsyncInputStream::CommitWriteBuffer(size_t nbytes) noexcept
{
buffer.Append(nbytes);
......@@ -212,7 +212,7 @@ AsyncInputStream::CommitWriteBuffer(size_t nbytes)
}
void
AsyncInputStream::AppendToBuffer(const void *data, size_t append_size)
AsyncInputStream::AppendToBuffer(const void *data, size_t append_size) noexcept
{
auto w = buffer.Write();
assert(!w.IsEmpty());
......@@ -238,7 +238,7 @@ AsyncInputStream::AppendToBuffer(const void *data, size_t append_size)
}
void
AsyncInputStream::DeferredResume()
AsyncInputStream::DeferredResume() noexcept
{
const std::lock_guard<Mutex> protect(mutex);
......@@ -251,7 +251,7 @@ AsyncInputStream::DeferredResume()
}
void
AsyncInputStream::DeferredSeek()
AsyncInputStream::DeferredSeek() noexcept
{
const std::lock_guard<Mutex> protect(mutex);
if (seek_state != SeekState::SCHEDULED)
......
......@@ -92,15 +92,15 @@ protected:
/**
* Pass an tag from the I/O thread to the client thread.
*/
void SetTag(Tag *_tag);
void SetTag(Tag *_tag) noexcept;
void ClearTag() {
void ClearTag() noexcept {
SetTag(nullptr);
}
void Pause();
void Pause() noexcept;
bool IsPaused() const {
bool IsPaused() const noexcept {
return paused;
}
......@@ -109,15 +109,15 @@ protected:
* continue feeding Read() calls from the buffer until it runs
* empty.
*/
void SetClosed() {
void SetClosed() noexcept {
open = false;
}
bool IsBufferEmpty() const {
bool IsBufferEmpty() const noexcept {
return buffer.IsEmpty();
}
bool IsBufferFull() const {
bool IsBufferFull() const noexcept {
return buffer.IsFull();
}
......@@ -125,21 +125,21 @@ protected:
* Determine how many bytes can be added to the buffer.
*/
gcc_pure
size_t GetBufferSpace() const {
size_t GetBufferSpace() const noexcept {
return buffer.GetSpace();
}
CircularBuffer<uint8_t>::Range PrepareWriteBuffer() {
CircularBuffer<uint8_t>::Range PrepareWriteBuffer() noexcept {
return buffer.Write();
}
void CommitWriteBuffer(size_t nbytes);
void CommitWriteBuffer(size_t nbytes) noexcept;
/**
* Append data to the buffer. The size must fit into the
* buffer; see GetBufferSpace().
*/
void AppendToBuffer(const void *data, size_t append_size);
void AppendToBuffer(const void *data, size_t append_size) noexcept;
/**
* Implement code here that will resume the stream after it
......@@ -154,7 +154,7 @@ protected:
*/
virtual void DoSeek(offset_type new_offset) = 0;
bool IsSeekPending() const {
bool IsSeekPending() const noexcept {
return seek_state == SeekState::PENDING;
}
......@@ -162,14 +162,14 @@ protected:
* Call this after seeking has finished. It will notify the
* client thread.
*/
void SeekDone();
void SeekDone() noexcept;
private:
void Resume();
/* for DeferredCall */
void DeferredResume();
void DeferredSeek();
void DeferredResume() noexcept;
void DeferredSeek() noexcept;
};
#endif
......@@ -184,20 +184,20 @@ public:
void LockWaitReady();
gcc_pure
bool HasMimeType() const {
bool HasMimeType() const noexcept {
assert(ready);
return !mime.empty();
}
gcc_pure
const char *GetMimeType() const {
const char *GetMimeType() const noexcept {
assert(ready);
return mime.empty() ? nullptr : mime.c_str();
}
void ClearMimeType() {
void ClearMimeType() noexcept {
mime.clear();
}
......@@ -215,35 +215,35 @@ public:
}
gcc_pure
bool KnownSize() const {
bool KnownSize() const noexcept {
assert(ready);
return size != UNKNOWN_SIZE;
}
gcc_pure
offset_type GetSize() const {
offset_type GetSize() const noexcept {
assert(ready);
assert(KnownSize());
return size;
}
void AddOffset(offset_type delta) {
void AddOffset(offset_type delta) noexcept {
assert(ready);
offset += delta;
}
gcc_pure
offset_type GetOffset() const {
offset_type GetOffset() const noexcept {
assert(ready);
return offset;
}
gcc_pure
offset_type GetRest() const {
offset_type GetRest() const noexcept {
assert(ready);
assert(KnownSize());
......@@ -251,7 +251,7 @@ public:
}
gcc_pure
bool IsSeekable() const {
bool IsSeekable() const noexcept {
assert(ready);
return seekable;
......
......@@ -63,7 +63,7 @@ public:
*/
static int SocketFunction(CURL *easy,
curl_socket_t s, int action,
void *userp, void *socketp);
void *userp, void *socketp) noexcept;
virtual bool OnSocketReady(unsigned flags) override;
......@@ -75,7 +75,7 @@ private:
}
gcc_const
static unsigned CurlPollToFlags(int action) {
static unsigned CurlPollToFlags(int action) noexcept {
switch (action) {
case CURL_POLL_NONE:
return 0;
......@@ -108,7 +108,7 @@ CurlGlobal::CurlGlobal(EventLoop &_loop)
int
CurlSocket::SocketFunction(gcc_unused CURL *easy,
curl_socket_t s, int action,
void *userp, void *socketp) {
void *userp, void *socketp) noexcept {
auto &global = *(CurlGlobal *)userp;
CurlSocket *cs = (CurlSocket *)socketp;
......
......@@ -147,16 +147,16 @@ public:
~NfsConnection();
gcc_pure
const char *GetServer() const {
const char *GetServer() const noexcept {
return server.c_str();
}
gcc_pure
const char *GetExportName() const {
const char *GetExportName() const noexcept {
return export_name.c_str();
}
EventLoop &GetEventLoop() {
EventLoop &GetEventLoop() noexcept {
return SocketMonitor::GetEventLoop();
}
......
......@@ -114,12 +114,12 @@ public:
std::list<std::string> getSearchCapabilities(UpnpClient_Handle handle) const;
gcc_pure
std::string GetURI() const {
std::string GetURI() const noexcept {
return "upnp://" + m_deviceId + "/" + m_serviceType;
}
/** Retrieve the "friendly name" for this server, useful for display. */
const char *getFriendlyName() const {
const char *getFriendlyName() const noexcept {
return m_friendlyName.c_str();
}
};
......
......@@ -48,12 +48,12 @@ class SmbclientNeighborExplorer final : public NeighborExplorer {
Server(const Server &) = delete;
gcc_pure
bool operator==(const Server &other) const {
bool operator==(const Server &other) const noexcept {
return name == other.name;
}
gcc_pure
NeighborInfo Export() const {
NeighborInfo Export() const noexcept {
return { "smb://" + name + "/", comment };
}
};
......
......@@ -43,12 +43,12 @@ class UpnpNeighborExplorer final
Server(const Server &) = delete;
gcc_pure
bool operator==(const Server &other) const {
bool operator==(const Server &other) const noexcept {
return name == other.name;
}
gcc_pure
NeighborInfo Export() const {
NeighborInfo Export() const noexcept {
return { "smb://" + name + "/", comment };
}
};
......
......@@ -76,47 +76,47 @@ public:
AllocatedSocketAddress &operator=(const AllocatedSocketAddress &) = delete;
AllocatedSocketAddress &operator=(AllocatedSocketAddress &&src) {
AllocatedSocketAddress &operator=(AllocatedSocketAddress &&src) noexcept {
std::swap(address, src.address);
std::swap(size, src.size);
return *this;
}
gcc_pure
bool operator==(SocketAddress other) const {
bool operator==(SocketAddress other) const noexcept {
return (SocketAddress)*this == other;
}
bool operator!=(SocketAddress &other) const {
bool operator!=(SocketAddress &other) const noexcept {
return !(*this == other);
}
gcc_const
static AllocatedSocketAddress Null() {
static AllocatedSocketAddress Null() noexcept {
return AllocatedSocketAddress(nullptr, 0);
}
bool IsNull() const {
bool IsNull() const noexcept {
return address == nullptr;
}
size_type GetSize() const {
size_type GetSize() const noexcept {
return size;
}
const struct sockaddr *GetAddress() const {
const struct sockaddr *GetAddress() const noexcept {
return address;
}
operator SocketAddress() const {
operator SocketAddress() const noexcept {
return SocketAddress(address, size);
}
operator const struct sockaddr *() const {
operator const struct sockaddr *() const noexcept {
return address;
}
int GetFamily() const {
int GetFamily() const noexcept {
return address->sa_family;
}
......@@ -124,11 +124,11 @@ public:
* Does the object have a well-defined address? Check !IsNull()
* before calling this method.
*/
bool IsDefined() const {
bool IsDefined() const noexcept {
return GetFamily() != AF_UNSPEC;
}
void Clear() {
void Clear() noexcept {
free(address);
address = nullptr;
size = 0;
......
......@@ -51,52 +51,52 @@ public:
StaticSocketAddress &operator=(SocketAddress other) noexcept;
operator SocketAddress() const {
operator SocketAddress() const noexcept {
return SocketAddress(reinterpret_cast<const struct sockaddr *>(&address),
size);
}
struct sockaddr *GetAddress() {
struct sockaddr *GetAddress() noexcept {
return reinterpret_cast<struct sockaddr *>(&address);
}
const struct sockaddr *GetAddress() const {
const struct sockaddr *GetAddress() const noexcept {
return reinterpret_cast<const struct sockaddr *>(&address);
}
constexpr size_type GetCapacity() const {
constexpr size_type GetCapacity() const noexcept {
return sizeof(address);
}
size_type GetSize() const {
size_type GetSize() const noexcept {
return size;
}
void SetSize(size_type _size) {
void SetSize(size_type _size) noexcept {
assert(_size > 0);
assert(size_t(_size) <= sizeof(address));
size = _size;
}
int GetFamily() const {
int GetFamily() const noexcept {
return address.ss_family;
}
bool IsDefined() const {
bool IsDefined() const noexcept {
return GetFamily() != AF_UNSPEC;
}
void Clear() {
void Clear() noexcept {
address.ss_family = AF_UNSPEC;
}
gcc_pure
bool operator==(SocketAddress other) const {
bool operator==(SocketAddress other) const noexcept {
return (SocketAddress)*this == other;
}
bool operator!=(SocketAddress &other) const {
bool operator!=(SocketAddress &other) const noexcept {
return !(*this == other);
}
};
......
......@@ -85,7 +85,7 @@ public:
* those which are disabled right now.
*/
gcc_pure
unsigned Size() const {
unsigned Size() const noexcept {
return outputs.size();
}
......@@ -186,7 +186,7 @@ public:
* finished yet.
*/
gcc_pure
SignedSongTime GetElapsedTime() const {
SignedSongTime GetElapsedTime() const noexcept {
return elapsed_time;
}
......
......@@ -132,7 +132,7 @@ public:
}
gcc_pure
const char *GetDevice() {
const char *GetDevice() const noexcept {
return device.empty() ? default_device : device.c_str();
}
......
......@@ -73,19 +73,19 @@ class OpenALOutput {
private:
gcc_pure
ALint GetSourceI(ALenum param) const {
ALint GetSourceI(ALenum param) const noexcept {
ALint value;
alGetSourcei(source, param, &value);
return value;
}
gcc_pure
bool HasProcessed() const {
bool HasProcessed() const noexcept {
return GetSourceI(AL_BUFFERS_PROCESSED) > 0;
}
gcc_pure
bool IsPlaying() const {
bool IsPlaying() const noexcept {
return GetSourceI(AL_SOURCE_STATE) == AL_PLAYING;
}
......
......@@ -97,7 +97,7 @@ class RecorderOutput {
private:
gcc_pure
bool HasDynamicPath() const {
bool HasDynamicPath() const noexcept {
return !format_path.empty();
}
......
......@@ -191,7 +191,7 @@ public:
* Caller must lock the mutex.
*/
gcc_pure
bool HasClients() const {
bool HasClients() const noexcept {
return !clients.empty();
}
......@@ -199,7 +199,7 @@ public:
* Check whether there is at least one client.
*/
gcc_pure
bool LockHasClients() const {
bool LockHasClients() const noexcept {
const std::lock_guard<Mutex> protect(mutex);
return HasClients();
}
......
......@@ -247,7 +247,7 @@ private:
* finished.
*/
gcc_pure
bool IsDecoderAtCurrentSong() const {
bool IsDecoderAtCurrentSong() const noexcept {
assert(pipe != nullptr);
return dc.pipe == pipe;
......@@ -259,7 +259,7 @@ private:
* switched to that song yet.
*/
gcc_pure
bool IsDecoderAtNextSong() const {
bool IsDecoderAtNextSong() const noexcept {
return dc.pipe != nullptr && !IsDecoderAtCurrentSong();
}
......
......@@ -162,14 +162,14 @@ struct Queue {
}
gcc_pure
unsigned OrderToPosition(unsigned _order) const {
unsigned OrderToPosition(unsigned _order) const noexcept {
assert(_order < length);
return order[_order];
}
gcc_pure
unsigned PositionToOrder(unsigned position) const {
unsigned PositionToOrder(unsigned position) const noexcept {
assert(position < length);
for (unsigned i = 0;; ++i) {
......@@ -181,7 +181,7 @@ struct Queue {
}
gcc_pure
uint8_t GetPriorityAtPosition(unsigned position) const {
uint8_t GetPriorityAtPosition(unsigned position) const noexcept {
assert(position < length);
return items[position].priority;
......
......@@ -149,7 +149,7 @@ CompositeStorage::Directory::Make(const char *uri)
}
bool
CompositeStorage::Directory::Unmount()
CompositeStorage::Directory::Unmount() noexcept
{
if (storage == nullptr)
return false;
......@@ -160,7 +160,7 @@ CompositeStorage::Directory::Unmount()
}
bool
CompositeStorage::Directory::Unmount(const char *uri)
CompositeStorage::Directory::Unmount(const char *uri) noexcept
{
if (StringIsEmpty(uri))
return Unmount();
......
......@@ -55,7 +55,7 @@ class CompositeStorage final : public Storage {
~Directory();
gcc_pure
bool IsEmpty() const {
bool IsEmpty() const noexcept {
return storage == nullptr && children.empty();
}
......@@ -64,8 +64,8 @@ class CompositeStorage final : public Storage {
Directory &Make(const char *uri);
bool Unmount();
bool Unmount(const char *uri);
bool Unmount() noexcept;
bool Unmount(const char *uri) noexcept;
gcc_pure
bool MapToRelativeUTF8(std::string &buffer,
......
......@@ -511,7 +511,7 @@ private:
* to the base file name.
*/
gcc_pure
StringView HrefToEscapedName(const char *href) const {
StringView HrefToEscapedName(const char *href) const noexcept {
const char *path = uri_get_path(href);
if (path == nullptr)
return nullptr;
......
......@@ -53,7 +53,7 @@ ParseMixRampTag(MixRampInfo &info, const char *name, const char *value)
const char *value;
gcc_pure
const char *operator[](const char *n) const {
const char *operator[](const char *n) const noexcept {
return StringEqualsCaseASCII(name, n)
? value
: nullptr;
......@@ -70,7 +70,7 @@ ParseMixRampVorbis(MixRampInfo &info, const char *entry)
const char *entry;
gcc_pure
const char *operator[](const char *n) const {
const char *operator[](const char *n) const noexcept {
return vorbis_comment_value(entry, n);
}
};
......
......@@ -60,7 +60,7 @@ ParseReplayGainTag(ReplayGainInfo &info, const char *name, const char *value)
const char *value;
gcc_pure
const char *operator[](const char *n) const {
const char *operator[](const char *n) const noexcept {
return StringEqualsCaseASCII(name, n)
? value
: nullptr;
......@@ -77,7 +77,7 @@ ParseReplayGainVorbis(ReplayGainInfo &info, const char *entry)
const char *entry;
gcc_pure
const char *operator[](const char *n) const {
const char *operator[](const char *n) const noexcept {
return vorbis_comment_value(entry, n);
}
};
......
......@@ -67,7 +67,7 @@ CopyTagMask(TagBuilder &dest, const Tag &src, tag_mask_t mask)
void
TagSet::InsertUnique(const Tag &src, TagType type, const char *value,
tag_mask_t group_mask)
tag_mask_t group_mask) noexcept
{
TagBuilder builder;
if (value == nullptr)
......@@ -85,7 +85,7 @@ TagSet::InsertUnique(const Tag &src, TagType type, const char *value,
bool
TagSet::CheckUnique(TagType dest_type,
const Tag &tag, TagType src_type,
tag_mask_t group_mask)
tag_mask_t group_mask) noexcept
{
bool found = false;
......@@ -101,7 +101,7 @@ TagSet::CheckUnique(TagType dest_type,
void
TagSet::InsertUnique(const Tag &tag,
TagType type, tag_mask_t group_mask)
TagType type, tag_mask_t group_mask) noexcept
{
static_assert(sizeof(group_mask) * 8 >= TAG_NUM_OF_ITEM_TYPES,
"Mask is too small");
......
......@@ -33,7 +33,7 @@
*/
struct TagLess {
gcc_pure
bool operator()(const Tag &a, const Tag &b) const {
bool operator()(const Tag &a, const Tag &b) const noexcept {
if (a.num_items != b.num_items)
return a.num_items < b.num_items;
......@@ -59,15 +59,15 @@ struct TagLess {
class TagSet : public std::set<Tag, TagLess> {
public:
void InsertUnique(const Tag &tag,
TagType type, tag_mask_t group_mask);
TagType type, tag_mask_t group_mask) noexcept;
private:
void InsertUnique(const Tag &src, TagType type, const char *value,
tag_mask_t group_mask);
tag_mask_t group_mask) noexcept;
bool CheckUnique(TagType dest_type,
const Tag &tag, TagType src_type,
tag_mask_t group_mask);
tag_mask_t group_mask) noexcept;
};
#endif
......@@ -82,7 +82,7 @@ public:
* Returns true if the object contains any information.
*/
gcc_pure
bool IsDefined() const {
bool IsDefined() const noexcept {
return !duration.IsNegative() || has_playlist || !IsEmpty();
}
......
......@@ -53,7 +53,7 @@ public:
#endif
gcc_const
static ThreadId Null() {
static ThreadId Null() noexcept {
#ifdef WIN32
return 0;
#else
......@@ -63,7 +63,7 @@ public:
}
gcc_pure
bool IsNull() const {
bool IsNull() const noexcept {
return *this == Null();
}
......@@ -80,7 +80,7 @@ public:
}
gcc_pure
bool operator==(const ThreadId &other) const {
bool operator==(const ThreadId &other) const noexcept {
#ifdef WIN32
return id == other.id;
#else
......
......@@ -77,7 +77,7 @@ public:
* Check if this thread is the current thread.
*/
gcc_pure
bool IsInside() const {
bool IsInside() const noexcept {
#ifdef WIN32
return GetCurrentThreadId() == id;
#else
......
......@@ -140,7 +140,7 @@ struct ConstBuffer {
template<typename U>
gcc_pure
bool Contains(U &&u) const {
bool Contains(U &&u) const noexcept {
for (const auto &i : *this)
if (u == i)
return true;
......
......@@ -31,14 +31,14 @@
#include "CharUtil.hxx"
void
StringView::StripLeft()
StringView::StripLeft() noexcept
{
while (!IsEmpty() && IsWhitespaceOrNull(front()))
pop_front();
}
void
StringView::StripRight()
StringView::StripRight() noexcept
{
while (!IsEmpty() && IsWhitespaceOrNull(back()))
pop_back();
......
......@@ -64,67 +64,67 @@ struct StringView : ConstBuffer<char> {
return StringView("", size_t(0));
}
void SetEmpty() {
void SetEmpty() noexcept {
data = "";
size = 0;
}
gcc_pure
pointer_type Find(char ch) const {
pointer_type Find(char ch) const noexcept {
return (pointer_type)memchr(data, ch, size);
}
StringView &operator=(std::nullptr_t) {
StringView &operator=(std::nullptr_t) noexcept {
data = nullptr;
size = 0;
return *this;
}
StringView &operator=(pointer_type _data) {
StringView &operator=(pointer_type _data) noexcept {
data = _data;
size = _data != nullptr ? strlen(_data) : 0;
return *this;
}
gcc_pure
bool StartsWith(StringView needle) const {
bool StartsWith(StringView needle) const noexcept {
return size >= needle.size &&
memcmp(data, needle.data, needle.size) == 0;
}
gcc_pure
bool Equals(StringView other) const {
bool Equals(StringView other) const noexcept {
return size == other.size &&
memcmp(data, other.data, size) == 0;
}
template<size_t n>
bool EqualsLiteral(const char (&other)[n]) const {
bool EqualsLiteral(const char (&other)[n]) const noexcept {
return Equals(Literal(other));
}
gcc_pure
bool EqualsIgnoreCase(StringView other) const {
bool EqualsIgnoreCase(StringView other) const noexcept {
return size == other.size &&
strncasecmp(data, other.data, size) == 0;
}
template<size_t n>
bool EqualsLiteralIgnoreCase(const char (&other)[n]) const {
bool EqualsLiteralIgnoreCase(const char (&other)[n]) const noexcept {
return EqualsIgnoreCase(Literal(other));
}
/**
* Skip all whitespace at the beginning.
*/
void StripLeft();
void StripLeft() noexcept;
/**
* Skip all whitespace at the end.
*/
void StripRight();
void StripRight() noexcept;
void Strip() {
void Strip() noexcept {
StripLeft();
StripRight();
}
......
......@@ -45,7 +45,7 @@ FakeDecoder::Ready(const AudioFormat audio_format,
}
DecoderCommand
FakeDecoder::GetCommand()
FakeDecoder::GetCommand() noexcept
{
return DecoderCommand::NONE;
}
......@@ -56,13 +56,13 @@ FakeDecoder::CommandFinished()
}
SongTime
FakeDecoder::GetSeekTime()
FakeDecoder::GetSeekTime() noexcept
{
return SongTime();
}
uint64_t
FakeDecoder::GetSeekFrame()
FakeDecoder::GetSeekFrame() noexcept
{
return 1;
}
......
......@@ -34,10 +34,10 @@ struct FakeDecoder final : DecoderClient {
/* virtual methods from DecoderClient */
void Ready(AudioFormat audio_format,
bool seekable, SignedSongTime duration) override;
DecoderCommand GetCommand() override;
DecoderCommand GetCommand() noexcept override;
void CommandFinished() override;
SongTime GetSeekTime() override;
uint64_t GetSeekFrame() override;
SongTime GetSeekTime() noexcept override;
uint64_t GetSeekFrame() noexcept override;
void SeekError() override;
InputStreamPtr OpenUri(const char *uri) override;
size_t Read(InputStream &is, void *buffer, size_t length) override;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment