diff --git a/NEWS b/NEWS index 20464734f..f4dc110bd 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,12 @@ ver 0.21 (not yet released) * output - alsa: non-blocking mode +ver 0.20.9 (2017/06/04) +* decoder + - ffmpeg: support *.adx +* fix byte order detection on FreeBSD/aarch64 +* fix more random crashes when compiled with clang + ver 0.20.8 (2017/05/19) * output - osx: fix build failure due to missing "noexcept" diff --git a/src/AudioFormat.hxx b/src/AudioFormat.hxx index 04c682b54..77e710f55 100644 --- a/src/AudioFormat.hxx +++ b/src/AudioFormat.hxx @@ -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; diff --git a/src/DetachedSong.hxx b/src/DetachedSong.hxx index 9a0ef8e24..2a08e4994 100644 --- a/src/DetachedSong.hxx +++ b/src/DetachedSong.hxx @@ -163,7 +163,7 @@ public: bool IsRemote() const noexcept; gcc_pure - bool IsFile() const { + bool IsFile() const noexcept { return !IsRemote(); } @@ -173,11 +173,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; } diff --git a/src/MixRampInfo.hxx b/src/MixRampInfo.hxx index 2dbd9075a..c5caf241f 100644 --- a/src/MixRampInfo.hxx +++ b/src/MixRampInfo.hxx @@ -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); } }; diff --git a/src/MusicBuffer.hxx b/src/MusicBuffer.hxx index 1c51839e2..438ade621 100644 --- a/src/MusicBuffer.hxx +++ b/src/MusicBuffer.hxx @@ -60,7 +60,7 @@ public: * music_buffer_new(). */ gcc_pure - unsigned GetSize() const { + unsigned GetSize() const noexcept { return buffer.GetCapacity(); } diff --git a/src/MusicPipe.cxx b/src/MusicPipe.cxx index c82faa648..9dd2a7a8f 100644 --- a/src/MusicPipe.cxx +++ b/src/MusicPipe.cxx @@ -39,7 +39,7 @@ MusicPipe::Contains(const MusicChunk *chunk) const noexcept #endif MusicChunk * -MusicPipe::Shift() +MusicPipe::Shift() noexcept { const std::lock_guard 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()); diff --git a/src/MusicPipe.hxx b/src/MusicPipe.hxx index e9bebed6e..f9e42326b 100644 --- a/src/MusicPipe.hxx +++ b/src/MusicPipe.hxx @@ -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; } }; diff --git a/src/client/Client.hxx b/src/client/Client.hxx index f23f1324d..82067ce55 100644 --- a/src/client/Client.hxx +++ b/src/client/Client.hxx @@ -106,7 +106,7 @@ public: } gcc_pure - bool IsExpired() const { + bool IsExpired() const noexcept { return !FullyBufferedSocket::IsDefined(); } diff --git a/src/command/Request.hxx b/src/command/Request.hxx index 884b5eea7..02f7804e5 100644 --- a/src/command/Request.hxx +++ b/src/command/Request.hxx @@ -45,68 +45,57 @@ public: : default_value; } - gcc_pure int ParseInt(unsigned idx) const { assert(idx < size); return ParseCommandArgInt(data[idx]); } - gcc_pure int ParseInt(unsigned idx, int min_value, int max_value) const { assert(idx < size); return ParseCommandArgInt(data[idx], min_value, max_value); } - gcc_pure int ParseUnsigned(unsigned idx) const { assert(idx < size); return ParseCommandArgUnsigned(data[idx]); } - gcc_pure int ParseUnsigned(unsigned idx, unsigned max_value) const { assert(idx < size); return ParseCommandArgUnsigned(data[idx], max_value); } - gcc_pure bool ParseBool(unsigned idx) const { assert(idx < size); return ParseCommandArgBool(data[idx]); } - gcc_pure RangeArg ParseRange(unsigned idx) const { assert(idx < size); return ParseCommandArgRange(data[idx]); } - gcc_pure float ParseFloat(unsigned idx) const { assert(idx < size); return ParseCommandArgFloat(data[idx]); } - gcc_pure SongTime ParseSongTime(unsigned idx) const { assert(idx < size); return ParseCommandArgSongTime(data[idx]); } - gcc_pure SignedSongTime ParseSignedSongTime(unsigned idx) const { assert(idx < size); return ParseCommandArgSignedSongTime(data[idx]); } - gcc_pure int ParseOptional(unsigned idx, int default_value) const { return idx < size ? ParseInt(idx) : default_value; } - gcc_pure RangeArg ParseOptional(unsigned idx, RangeArg default_value) const { return idx < size ? ParseRange(idx) diff --git a/src/config/Block.hxx b/src/config/Block.hxx index edfa5a7d2..b8257db78 100644 --- a/src/config/Block.hxx +++ b/src/config/Block.hxx @@ -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(); } diff --git a/src/db/Helpers.cxx b/src/db/Helpers.cxx index 686e22ff6..799e8362f 100644 --- a/src/db/Helpers.cxx +++ b/src/db/Helpers.cxx @@ -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; } }; diff --git a/src/db/Interface.hxx b/src/db/Interface.hxx index a10b1ffbb..56cfcb82e 100644 --- a/src/db/Interface.hxx +++ b/src/db/Interface.hxx @@ -111,7 +111,6 @@ public: TagType tag_type, TagMask group_mask, VisitTag visit_tag) const = 0; - gcc_pure virtual DatabaseStats GetStats(const DatabaseSelection &selection) const = 0; /** @@ -132,7 +131,7 @@ public: * Returns a negative value if that is not not known/available. */ gcc_pure - virtual std::chrono::system_clock::time_point GetUpdateStamp() const = 0; + virtual std::chrono::system_clock::time_point GetUpdateStamp() const noexcept = 0; }; #endif diff --git a/src/db/LightDirectory.hxx b/src/db/LightDirectory.hxx index eca91c41f..be17329a6 100644 --- a/src/db/LightDirectory.hxx +++ b/src/db/LightDirectory.hxx @@ -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; } }; diff --git a/src/db/PlaylistInfo.hxx b/src/db/PlaylistInfo.hxx index bc43fd62e..eacedac58 100644 --- a/src/db/PlaylistInfo.hxx +++ b/src/db/PlaylistInfo.hxx @@ -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; } }; diff --git a/src/db/plugins/ProxyDatabasePlugin.cxx b/src/db/plugins/ProxyDatabasePlugin.cxx index 9c086d93e..32d232bd4 100644 --- a/src/db/plugins/ProxyDatabasePlugin.cxx +++ b/src/db/plugins/ProxyDatabasePlugin.cxx @@ -128,7 +128,7 @@ public: unsigned Update(const char *uri_utf8, bool discard) override; - std::chrono::system_clock::time_point GetUpdateStamp() const override { + std::chrono::system_clock::time_point GetUpdateStamp() const noexcept override { return update_stamp; } diff --git a/src/db/plugins/simple/Directory.hxx b/src/db/plugins/simple/Directory.hxx index 9a5092631..f33edffa0 100644 --- a/src/db/plugins/simple/Directory.hxx +++ b/src/db/plugins/simple/Directory.hxx @@ -187,7 +187,7 @@ public: } gcc_pure - const char *GetPath() const { + const char *GetPath() const noexcept { return path.c_str(); } diff --git a/src/db/plugins/simple/SimpleDatabasePlugin.hxx b/src/db/plugins/simple/SimpleDatabasePlugin.hxx index 7acaffd1f..2f771dba7 100644 --- a/src/db/plugins/simple/SimpleDatabasePlugin.hxx +++ b/src/db/plugins/simple/SimpleDatabasePlugin.hxx @@ -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; - std::chrono::system_clock::time_point GetUpdateStamp() const override { + std::chrono::system_clock::time_point GetUpdateStamp() const noexcept override { return mtime; } diff --git a/src/db/plugins/upnp/Object.hxx b/src/db/plugins/upnp/Object.hxx index 9f7a42ad3..8a2a4e579 100644 --- a/src/db/plugins/upnp/Object.hxx +++ b/src/db/plugins/upnp/Object.hxx @@ -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); diff --git a/src/db/plugins/upnp/UpnpDatabasePlugin.cxx b/src/db/plugins/upnp/UpnpDatabasePlugin.cxx index bb6a3d4cf..2af522745 100644 --- a/src/db/plugins/upnp/UpnpDatabasePlugin.cxx +++ b/src/db/plugins/upnp/UpnpDatabasePlugin.cxx @@ -94,7 +94,7 @@ public: DatabaseStats GetStats(const DatabaseSelection &selection) const override; - std::chrono::system_clock::time_point GetUpdateStamp() const override { + std::chrono::system_clock::time_point GetUpdateStamp() const noexcept override { return std::chrono::system_clock::time_point::min(); } diff --git a/src/db/update/ExcludeList.cxx b/src/db/update/ExcludeList.cxx index c62e8ee3e..e54999f8c 100644 --- a/src/db/update/ExcludeList.cxx +++ b/src/db/update/ExcludeList.cxx @@ -36,7 +36,7 @@ #include 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()); diff --git a/src/db/update/ExcludeList.hxx b/src/db/update/ExcludeList.hxx index c0b287169..793a3a162 100644 --- a/src/db/update/ExcludeList.hxx +++ b/src/db/update/ExcludeList.hxx @@ -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; }; diff --git a/src/decoder/Bridge.cxx b/src/decoder/Bridge.cxx index c24c80768..37fcb2bf9 100644 --- a/src/decoder/Bridge.cxx +++ b/src/decoder/Bridge.cxx @@ -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(dc.in_audio_format.sample_rate); } diff --git a/src/decoder/Bridge.hxx b/src/decoder/Bridge.hxx index 8573d6a7f..3b354c063 100644 --- a/src/decoder/Bridge.hxx +++ b/src/decoder/Bridge.hxx @@ -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; diff --git a/src/decoder/Client.hxx b/src/decoder/Client.hxx index 8de82d155..87f19f5be 100644 --- a/src/decoder/Client.hxx +++ b/src/decoder/Client.hxx @@ -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 diff --git a/src/decoder/DecoderBuffer.hxx b/src/decoder/DecoderBuffer.hxx index c79f8d96c..a7ba2f85f 100644 --- a/src/decoder/DecoderBuffer.hxx +++ b/src/decoder/DecoderBuffer.hxx @@ -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 Read() const { + ConstBuffer 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); } diff --git a/src/decoder/DecoderControl.hxx b/src/decoder/DecoderControl.hxx index 926f74343..dfd8232e6 100644 --- a/src/decoder/DecoderControl.hxx +++ b/src/decoder/DecoderControl.hxx @@ -227,29 +227,29 @@ struct DecoderControl { } gcc_pure - bool LockIsIdle() const { + bool LockIsIdle() const noexcept { const std::lock_guard 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 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 protect(mutex); return HasFailed(); } diff --git a/src/decoder/plugins/FfmpegDecoderPlugin.cxx b/src/decoder/plugins/FfmpegDecoderPlugin.cxx index 1380bf94b..a035e058c 100644 --- a/src/decoder/plugins/FfmpegDecoderPlugin.cxx +++ b/src/decoder/plugins/FfmpegDecoderPlugin.cxx @@ -881,7 +881,8 @@ ffmpeg_scan_stream(InputStream &is, * more formats. */ static const char *const ffmpeg_suffixes[] = { - "16sv", "3g2", "3gp", "4xm", "8svx", "aa3", "aac", "ac3", "afc", "aif", + "16sv", "3g2", "3gp", "4xm", "8svx", + "aa3", "aac", "ac3", "adx", "afc", "aif", "aifc", "aiff", "al", "alaw", "amr", "anim", "apc", "ape", "asf", "atrac", "au", "aud", "avi", "avm2", "avs", "bap", "bfi", "c93", "cak", "cin", "cmv", "cpk", "daud", "dct", "divx", "dts", "dv", "dvd", "dxa", @@ -934,6 +935,7 @@ static const char *const ffmpeg_mime_types[] = { "audio/x-16sv", "audio/x-aac", "audio/x-ac3", + "audio/x-adx", "audio/x-aiff" "audio/x-alaw", "audio/x-au", diff --git a/src/decoder/plugins/FlacMetadata.hxx b/src/decoder/plugins/FlacMetadata.hxx index ede627aa1..d0ee8c824 100644 --- a/src/decoder/plugins/FlacMetadata.hxx +++ b/src/decoder/plugins/FlacMetadata.hxx @@ -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); } }; diff --git a/src/decoder/plugins/OpusDecoderPlugin.cxx b/src/decoder/plugins/OpusDecoderPlugin.cxx index 7474bb2f2..3b9a29233 100644 --- a/src/decoder/plugins/OpusDecoderPlugin.cxx +++ b/src/decoder/plugins/OpusDecoderPlugin.cxx @@ -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; } diff --git a/src/event/Loop.hxx b/src/event/Loop.hxx index f1962b4df..1060a8769 100644 --- a/src/event/Loop.hxx +++ b/src/event/Loop.hxx @@ -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(); } }; diff --git a/src/fs/AllocatedPath.hxx b/src/fs/AllocatedPath.hxx index 513453ffd..be26ffd78 100644 --- a/src/fs/AllocatedPath.hxx +++ b/src/fs/AllocatedPath.hxx @@ -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(); } diff --git a/src/fs/Glob.hxx b/src/fs/Glob.hxx index 714eaa753..1f8402089 100644 --- a/src/fs/Glob.hxx +++ b/src/fs/Glob.hxx @@ -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) diff --git a/src/fs/Path.hxx b/src/fs/Path.hxx index 5053162ef..8e3eefb09 100644 --- a/src/fs/Path.hxx +++ b/src/fs/Path.hxx @@ -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(); } diff --git a/src/fs/Traits.hxx b/src/fs/Traits.hxx index 699ab73e8..67f74dc57 100644 --- a/src/fs/Traits.hxx +++ b/src/fs/Traits.hxx @@ -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)); } }; diff --git a/src/fs/io/BufferedReader.cxx b/src/fs/io/BufferedReader.cxx index 4999965a6..f3095ca93 100644 --- a/src/fs/io/BufferedReader.cxx +++ b/src/fs/io/BufferedReader.cxx @@ -67,7 +67,7 @@ BufferedReader::ReadFull(size_t size) } size_t -BufferedReader::ReadFromBuffer(WritableBuffer dest) +BufferedReader::ReadFromBuffer(WritableBuffer dest) noexcept { auto src = Read(); size_t nbytes = std::min(src.size, dest.size); diff --git a/src/fs/io/BufferedReader.hxx b/src/fs/io/BufferedReader.hxx index 0e1b4a5b7..c4c6da80f 100644 --- a/src/fs/io/BufferedReader.hxx +++ b/src/fs/io/BufferedReader.hxx @@ -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 Read() const { + WritableBuffer 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 dest); + size_t ReadFromBuffer(WritableBuffer 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; } }; diff --git a/src/input/AsyncInputStream.cxx b/src/input/AsyncInputStream.cxx index daf63faf1..ec28e8bc8 100644 --- a/src/input/AsyncInputStream.cxx +++ b/src/input/AsyncInputStream.cxx @@ -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(GetEventLoop().IsInside()); @@ -141,7 +141,7 @@ AsyncInputStream::Seek(offset_type new_offset) } void -AsyncInputStream::SeekDone() +AsyncInputStream::SeekDone() noexcept { assert(GetEventLoop().IsInside()); 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 protect(mutex); @@ -251,7 +251,7 @@ AsyncInputStream::DeferredResume() } void -AsyncInputStream::DeferredSeek() +AsyncInputStream::DeferredSeek() noexcept { const std::lock_guard protect(mutex); if (seek_state != SeekState::SCHEDULED) diff --git a/src/input/AsyncInputStream.hxx b/src/input/AsyncInputStream.hxx index 29fea5406..e986f623b 100644 --- a/src/input/AsyncInputStream.hxx +++ b/src/input/AsyncInputStream.hxx @@ -96,15 +96,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; } @@ -113,15 +113,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(); } @@ -129,21 +129,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::Range PrepareWriteBuffer() { + CircularBuffer::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 @@ -158,7 +158,7 @@ protected: */ virtual void DoSeek(offset_type new_offset) = 0; - bool IsSeekPending() const { + bool IsSeekPending() const noexcept { return seek_state == SeekState::PENDING; } @@ -166,14 +166,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 diff --git a/src/input/InputStream.hxx b/src/input/InputStream.hxx index 86f19f094..b5237ee4b 100644 --- a/src/input/InputStream.hxx +++ b/src/input/InputStream.hxx @@ -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; diff --git a/src/lib/curl/Global.cxx b/src/lib/curl/Global.cxx index 922089bb0..0da8553c5 100644 --- a/src/lib/curl/Global.cxx +++ b/src/lib/curl/Global.cxx @@ -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; diff --git a/src/lib/nfs/Connection.hxx b/src/lib/nfs/Connection.hxx index a752535e0..2374c47ca 100644 --- a/src/lib/nfs/Connection.hxx +++ b/src/lib/nfs/Connection.hxx @@ -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(); } diff --git a/src/lib/upnp/ContentDirectoryService.hxx b/src/lib/upnp/ContentDirectoryService.hxx index 198d104c5..78d7dffca 100644 --- a/src/lib/upnp/ContentDirectoryService.hxx +++ b/src/lib/upnp/ContentDirectoryService.hxx @@ -114,12 +114,12 @@ public: std::list 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(); } }; diff --git a/src/mixer/MixerInternal.hxx b/src/mixer/MixerInternal.hxx index 0d62fb0f3..4e2e50657 100644 --- a/src/mixer/MixerInternal.hxx +++ b/src/mixer/MixerInternal.hxx @@ -84,7 +84,6 @@ public: * @return the current volume (0..100 including) or -1 if * unavailable */ - gcc_pure virtual int GetVolume() = 0; /** diff --git a/src/neighbor/plugins/SmbclientNeighborPlugin.cxx b/src/neighbor/plugins/SmbclientNeighborPlugin.cxx index 2354e5fea..e23054bf0 100644 --- a/src/neighbor/plugins/SmbclientNeighborPlugin.cxx +++ b/src/neighbor/plugins/SmbclientNeighborPlugin.cxx @@ -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 }; } }; diff --git a/src/neighbor/plugins/UpnpNeighborPlugin.cxx b/src/neighbor/plugins/UpnpNeighborPlugin.cxx index a0ce36817..34e14514f 100644 --- a/src/neighbor/plugins/UpnpNeighborPlugin.cxx +++ b/src/neighbor/plugins/UpnpNeighborPlugin.cxx @@ -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 }; } }; diff --git a/src/net/StaticSocketAddress.hxx b/src/net/StaticSocketAddress.hxx index c2fdc5da2..6047ca2bd 100644 --- a/src/net/StaticSocketAddress.hxx +++ b/src/net/StaticSocketAddress.hxx @@ -51,43 +51,43 @@ public: StaticSocketAddress &operator=(SocketAddress other) noexcept; - operator SocketAddress() const { + operator SocketAddress() const noexcept { return SocketAddress(reinterpret_cast(&address), size); } - struct sockaddr *GetAddress() { + struct sockaddr *GetAddress() noexcept { return reinterpret_cast(&address); } - const struct sockaddr *GetAddress() const { + const struct sockaddr *GetAddress() const noexcept { return reinterpret_cast(&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; } @@ -108,11 +108,11 @@ public: #endif 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); } }; diff --git a/src/output/MultipleOutputs.hxx b/src/output/MultipleOutputs.hxx index 3be68981e..3febfeecb 100644 --- a/src/output/MultipleOutputs.hxx +++ b/src/output/MultipleOutputs.hxx @@ -90,7 +90,7 @@ public: * those which are disabled right now. */ gcc_pure - unsigned Size() const { + unsigned Size() const noexcept { return outputs.size(); } @@ -191,7 +191,7 @@ public: * finished yet. */ gcc_pure - SignedSongTime GetElapsedTime() const { + SignedSongTime GetElapsedTime() const noexcept { return elapsed_time; } diff --git a/src/output/plugins/AlsaOutputPlugin.cxx b/src/output/plugins/AlsaOutputPlugin.cxx index 363437b48..fcaf5ac11 100644 --- a/src/output/plugins/AlsaOutputPlugin.cxx +++ b/src/output/plugins/AlsaOutputPlugin.cxx @@ -285,7 +285,7 @@ public: } gcc_pure - const char *GetDevice() { + const char *GetDevice() const noexcept { return device.empty() ? default_device : device.c_str(); } diff --git a/src/output/plugins/OpenALOutputPlugin.cxx b/src/output/plugins/OpenALOutputPlugin.cxx index 02a8364e3..4f31ad4ee 100644 --- a/src/output/plugins/OpenALOutputPlugin.cxx +++ b/src/output/plugins/OpenALOutputPlugin.cxx @@ -74,19 +74,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; } diff --git a/src/output/plugins/RecorderOutputPlugin.cxx b/src/output/plugins/RecorderOutputPlugin.cxx index 15d24b737..75705a609 100644 --- a/src/output/plugins/RecorderOutputPlugin.cxx +++ b/src/output/plugins/RecorderOutputPlugin.cxx @@ -98,7 +98,7 @@ class RecorderOutput { private: gcc_pure - bool HasDynamicPath() const { + bool HasDynamicPath() const noexcept { return !format_path.empty(); } diff --git a/src/output/plugins/httpd/HttpdInternal.hxx b/src/output/plugins/httpd/HttpdInternal.hxx index 35268a8cd..11d193d56 100644 --- a/src/output/plugins/httpd/HttpdInternal.hxx +++ b/src/output/plugins/httpd/HttpdInternal.hxx @@ -200,7 +200,7 @@ public: * Caller must lock the mutex. */ gcc_pure - bool HasClients() const { + bool HasClients() const noexcept { return !clients.empty(); } @@ -208,7 +208,7 @@ public: * Check whether there is at least one client. */ gcc_pure - bool LockHasClients() const { + bool LockHasClients() const noexcept { const std::lock_guard protect(mutex); return HasClients(); } diff --git a/src/pcm/Resampler.hxx b/src/pcm/Resampler.hxx index a82387e39..26d5014da 100644 --- a/src/pcm/Resampler.hxx +++ b/src/pcm/Resampler.hxx @@ -63,11 +63,12 @@ public: /** * Resamples a block of PCM data. * + * Throws std::runtime_error on error. + * * @param src the input buffer * @return the destination buffer (will be invalidated by * filter_close() or filter_filter()) */ - gcc_pure virtual ConstBuffer Resample(ConstBuffer src) = 0; }; diff --git a/src/player/Thread.cxx b/src/player/Thread.cxx index eaeb7e3b5..91600baf9 100644 --- a/src/player/Thread.cxx +++ b/src/player/Thread.cxx @@ -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(); } diff --git a/src/queue/Queue.hxx b/src/queue/Queue.hxx index 805c2f4de..bd2f95c1a 100644 --- a/src/queue/Queue.hxx +++ b/src/queue/Queue.hxx @@ -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; diff --git a/src/storage/CompositeStorage.cxx b/src/storage/CompositeStorage.cxx index 90d2afd83..e55bd4ffb 100644 --- a/src/storage/CompositeStorage.cxx +++ b/src/storage/CompositeStorage.cxx @@ -139,7 +139,7 @@ CompositeStorage::Directory::Make(const char *uri) } bool -CompositeStorage::Directory::Unmount() +CompositeStorage::Directory::Unmount() noexcept { if (storage == nullptr) return false; @@ -150,7 +150,7 @@ CompositeStorage::Directory::Unmount() } bool -CompositeStorage::Directory::Unmount(const char *uri) +CompositeStorage::Directory::Unmount(const char *uri) noexcept { if (StringIsEmpty(uri)) return Unmount(); diff --git a/src/storage/CompositeStorage.hxx b/src/storage/CompositeStorage.hxx index db71fad8f..668d55a6a 100644 --- a/src/storage/CompositeStorage.hxx +++ b/src/storage/CompositeStorage.hxx @@ -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, diff --git a/src/storage/StorageInterface.hxx b/src/storage/StorageInterface.hxx index 57d15ab15..810b31687 100644 --- a/src/storage/StorageInterface.hxx +++ b/src/storage/StorageInterface.hxx @@ -39,7 +39,6 @@ public: /** * Throws #std::runtime_error on error. */ - gcc_pure virtual StorageFileInfo GetInfo(bool follow) = 0; }; @@ -52,7 +51,6 @@ public: /** * Throws #std::runtime_error on error. */ - gcc_pure virtual StorageFileInfo GetInfo(const char *uri_utf8, bool follow) = 0; /** diff --git a/src/storage/plugins/CurlStorage.cxx b/src/storage/plugins/CurlStorage.cxx index e8291f1bf..0d4505a4a 100644 --- a/src/storage/plugins/CurlStorage.cxx +++ b/src/storage/plugins/CurlStorage.cxx @@ -471,7 +471,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; diff --git a/src/system/ByteOrder.hxx b/src/system/ByteOrder.hxx index d4cf454c9..edeeb31c3 100644 --- a/src/system/ByteOrder.hxx +++ b/src/system/ByteOrder.hxx @@ -52,6 +52,15 @@ # define IS_LITTLE_ENDIAN false # define IS_BIG_ENDIAN true # endif +#elif defined(__BYTE_ORDER__) +/* GCC-specific macros */ +# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +# define IS_LITTLE_ENDIAN true +# define IS_BIG_ENDIAN false +# else +# define IS_LITTLE_ENDIAN false +# define IS_BIG_ENDIAN true +# endif #else /* generic compile-time check */ # include diff --git a/src/tag/Builder.hxx b/src/tag/Builder.hxx index 31f00c6a8..396b626e2 100644 --- a/src/tag/Builder.hxx +++ b/src/tag/Builder.hxx @@ -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(); } diff --git a/src/tag/MixRamp.cxx b/src/tag/MixRamp.cxx index f5597794f..a8eab0bef 100644 --- a/src/tag/MixRamp.cxx +++ b/src/tag/MixRamp.cxx @@ -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); } }; diff --git a/src/tag/ReplayGain.cxx b/src/tag/ReplayGain.cxx index 963469373..10f2f8a32 100644 --- a/src/tag/ReplayGain.cxx +++ b/src/tag/ReplayGain.cxx @@ -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); } }; diff --git a/src/tag/Set.cxx b/src/tag/Set.cxx index 0c699fe40..0009173bb 100644 --- a/src/tag/Set.cxx +++ b/src/tag/Set.cxx @@ -68,7 +68,7 @@ CopyTagMask(TagBuilder &dest, const Tag &src, TagMask mask) void TagSet::InsertUnique(const Tag &src, TagType type, const char *value, - TagMask group_mask) + TagMask group_mask) noexcept { TagBuilder builder; if (value == nullptr) @@ -82,7 +82,7 @@ TagSet::InsertUnique(const Tag &src, TagType type, const char *value, bool TagSet::CheckUnique(TagType dest_type, const Tag &tag, TagType src_type, - TagMask group_mask) + TagMask group_mask) noexcept { bool found = false; @@ -98,7 +98,7 @@ TagSet::CheckUnique(TagType dest_type, void TagSet::InsertUnique(const Tag &tag, - TagType type, TagMask group_mask) + TagType type, TagMask group_mask) noexcept { static_assert(sizeof(group_mask) * 8 >= TAG_NUM_OF_ITEM_TYPES, "Mask is too small"); diff --git a/src/tag/Set.hxx b/src/tag/Set.hxx index 25df4b848..59a39d7f6 100644 --- a/src/tag/Set.hxx +++ b/src/tag/Set.hxx @@ -34,7 +34,7 @@ class TagMask; */ 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; @@ -60,15 +60,15 @@ struct TagLess { class TagSet : public std::set { public: void InsertUnique(const Tag &tag, - TagType type, TagMask group_mask); + TagType type, TagMask group_mask) noexcept; private: void InsertUnique(const Tag &src, TagType type, const char *value, - TagMask group_mask); + TagMask group_mask) noexcept; bool CheckUnique(TagType dest_type, const Tag &tag, TagType src_type, - TagMask group_mask); + TagMask group_mask) noexcept; }; #endif diff --git a/src/thread/Id.hxx b/src/thread/Id.hxx index 169cb1af8..4b0b9109e 100644 --- a/src/thread/Id.hxx +++ b/src/thread/Id.hxx @@ -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 diff --git a/src/thread/Thread.hxx b/src/thread/Thread.hxx index 86a3efae3..0251f46ec 100644 --- a/src/thread/Thread.hxx +++ b/src/thread/Thread.hxx @@ -78,7 +78,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 diff --git a/src/util/ConstBuffer.hxx b/src/util/ConstBuffer.hxx index 67d7253d8..4f4901564 100644 --- a/src/util/ConstBuffer.hxx +++ b/src/util/ConstBuffer.hxx @@ -140,7 +140,7 @@ struct ConstBuffer { template gcc_pure - bool Contains(U &&u) const { + bool Contains(U &&u) const noexcept { for (const auto &i : *this) if (u == i) return true; diff --git a/test/FakeDecoderAPI.cxx b/test/FakeDecoderAPI.cxx index 2310c335c..ce915ba1e 100644 --- a/test/FakeDecoderAPI.cxx +++ b/test/FakeDecoderAPI.cxx @@ -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; } diff --git a/test/FakeDecoderAPI.hxx b/test/FakeDecoderAPI.hxx index 9fb98859c..2f6b8d9d3 100644 --- a/test/FakeDecoderAPI.hxx +++ b/test/FakeDecoderAPI.hxx @@ -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;