Strategic use of '[[nodiscard]]' in 'Audio' module

This commit is contained in:
Vittorio Romeo 2021-12-14 14:04:15 +01:00
parent ab0378805d
commit bb854fa739
14 changed files with 63 additions and 37 deletions

View File

@ -4,6 +4,7 @@
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
#include <SFML/Audio.hpp> #include <SFML/Audio.hpp>
#include <iostream> #include <iostream>
#include <cstdlib>
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
@ -35,7 +36,12 @@ int main()
sf::SoundBufferRecorder recorder; sf::SoundBufferRecorder recorder;
// Audio capture is done in a separate thread, so we can block the main thread while it is capturing // Audio capture is done in a separate thread, so we can block the main thread while it is capturing
recorder.start(sampleRate); if (!recorder.start(sampleRate))
{
std::cerr << "Failed to start recorder" << std::endl;
return EXIT_FAILURE;
}
std::cout << "Recording... press enter to stop"; std::cout << "Recording... press enter to stop";
std::cin.ignore(10000, '\n'); std::cin.ignore(10000, '\n');
recorder.stop(); recorder.stop();
@ -63,7 +69,8 @@ int main()
std::getline(std::cin, filename); std::getline(std::cin, filename);
// Save the buffer // Save the buffer
buffer.saveToFile(filename); if (!buffer.saveToFile(filename))
std::cerr << "Could not save sound buffer to file" << std::endl;
} }
else else
{ {

View File

@ -138,7 +138,12 @@ void doClient(unsigned short port)
std::cin.ignore(10000, '\n'); std::cin.ignore(10000, '\n');
// Start capturing audio data // Start capturing audio data
recorder.start(44100); if (!recorder.start(44100))
{
std::cerr << "Failed to start recorder" << std::endl;
return;
}
std::cout << "Recording... press enter to stop"; std::cout << "Recording... press enter to stop";
std::cin.ignore(10000, '\n'); std::cin.ignore(10000, '\n');
recorder.stop(); recorder.stop();

View File

@ -76,7 +76,7 @@ public:
/// \return True if the file was successfully opened /// \return True if the file was successfully opened
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool openFromFile(const std::string& filename); [[nodiscard]] bool openFromFile(const std::string& filename);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Open a sound file in memory for reading /// \brief Open a sound file in memory for reading
@ -90,7 +90,7 @@ public:
/// \return True if the file was successfully opened /// \return True if the file was successfully opened
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool openFromMemory(const void* data, std::size_t sizeInBytes); [[nodiscard]] bool openFromMemory(const void* data, std::size_t sizeInBytes);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Open a sound file from a custom stream for reading /// \brief Open a sound file from a custom stream for reading
@ -103,7 +103,7 @@ public:
/// \return True if the file was successfully opened /// \return True if the file was successfully opened
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool openFromStream(InputStream& stream); [[nodiscard]] bool openFromStream(InputStream& stream);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Get the total number of audio samples in the file /// \brief Get the total number of audio samples in the file
@ -198,7 +198,7 @@ public:
/// \return Number of samples actually read (may be less than \a maxCount) /// \return Number of samples actually read (may be less than \a maxCount)
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
Uint64 read(Int16* samples, Uint64 maxCount); [[nodiscard]] Uint64 read(Int16* samples, Uint64 maxCount);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Close the current file /// \brief Close the current file

View File

@ -116,7 +116,7 @@ public:
/// \see openFromMemory, openFromStream /// \see openFromMemory, openFromStream
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool openFromFile(const std::string& filename); [[nodiscard]] bool openFromFile(const std::string& filename);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Open a music from an audio file in memory /// \brief Open a music from an audio file in memory
@ -139,7 +139,7 @@ public:
/// \see openFromFile, openFromStream /// \see openFromFile, openFromStream
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool openFromMemory(const void* data, std::size_t sizeInBytes); [[nodiscard]] bool openFromMemory(const void* data, std::size_t sizeInBytes);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Open a music from an audio file in a custom stream /// \brief Open a music from an audio file in a custom stream
@ -160,7 +160,7 @@ public:
/// \see openFromFile, openFromMemory /// \see openFromFile, openFromMemory
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool openFromStream(InputStream& stream); [[nodiscard]] bool openFromStream(InputStream& stream);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Get the total duration of the music /// \brief Get the total duration of the music
@ -222,7 +222,7 @@ protected:
/// \return True to continue playback, false to stop /// \return True to continue playback, false to stop
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool onGetData(Chunk& data) override; [[nodiscard]] bool onGetData(Chunk& data) override;
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Change the current playing position in the stream source /// \brief Change the current playing position in the stream source

View File

@ -71,7 +71,7 @@ public:
/// \return True if the file was successfully opened /// \return True if the file was successfully opened
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool openFromFile(const std::string& filename, unsigned int sampleRate, unsigned int channelCount); [[nodiscard]] bool openFromFile(const std::string& filename, unsigned int sampleRate, unsigned int channelCount);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Write audio samples to the file /// \brief Write audio samples to the file

View File

@ -252,7 +252,10 @@ private:
/// Usage example: /// Usage example:
/// \code /// \code
/// sf::SoundBuffer buffer; /// sf::SoundBuffer buffer;
/// buffer.loadFromFile("sound.wav"); /// if (!buffer.loadFromFile("sound.wav"))
/// {
/// // Handle error...
/// }
/// ///
/// sf::Sound sound; /// sf::Sound sound;
/// sound.setBuffer(buffer); /// sound.setBuffer(buffer);

View File

@ -83,7 +83,7 @@ public:
/// \see loadFromMemory, loadFromStream, loadFromSamples, saveToFile /// \see loadFromMemory, loadFromStream, loadFromSamples, saveToFile
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool loadFromFile(const std::string& filename); [[nodiscard]] bool loadFromFile(const std::string& filename);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Load the sound buffer from a file in memory /// \brief Load the sound buffer from a file in memory
@ -99,7 +99,7 @@ public:
/// \see loadFromFile, loadFromStream, loadFromSamples /// \see loadFromFile, loadFromStream, loadFromSamples
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool loadFromMemory(const void* data, std::size_t sizeInBytes); [[nodiscard]] bool loadFromMemory(const void* data, std::size_t sizeInBytes);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Load the sound buffer from a custom stream /// \brief Load the sound buffer from a custom stream
@ -114,7 +114,7 @@ public:
/// \see loadFromFile, loadFromMemory, loadFromSamples /// \see loadFromFile, loadFromMemory, loadFromSamples
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool loadFromStream(InputStream& stream); [[nodiscard]] bool loadFromStream(InputStream& stream);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Load the sound buffer from an array of audio samples /// \brief Load the sound buffer from an array of audio samples
@ -132,7 +132,7 @@ public:
/// \see loadFromFile, loadFromMemory, saveToFile /// \see loadFromFile, loadFromMemory, saveToFile
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool loadFromSamples(const Int16* samples, Uint64 sampleCount, unsigned int channelCount, unsigned int sampleRate); [[nodiscard]] bool loadFromSamples(const Int16* samples, Uint64 sampleCount, unsigned int channelCount, unsigned int sampleRate);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Save the sound buffer to an audio file /// \brief Save the sound buffer to an audio file
@ -147,7 +147,7 @@ public:
/// \see loadFromFile, loadFromMemory, loadFromSamples /// \see loadFromFile, loadFromMemory, loadFromSamples
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool saveToFile(const std::string& filename) const; [[nodiscard]] bool saveToFile(const std::string& filename) const;
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Get the array of audio samples stored in the buffer /// \brief Get the array of audio samples stored in the buffer
@ -235,7 +235,7 @@ private:
/// \return True on successful initialization, false on failure /// \return True on successful initialization, false on failure
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool initialize(InputSoundFile& file); [[nodiscard]] bool initialize(InputSoundFile& file);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Update the internal buffer with the cached audio samples /// \brief Update the internal buffer with the cached audio samples
@ -246,7 +246,7 @@ private:
/// \return True on success, false if any error happened /// \return True on success, false if any error happened
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool update(unsigned int channelCount, unsigned int sampleRate); [[nodiscard]] bool update(unsigned int channelCount, unsigned int sampleRate);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Add a sound to the list of sounds that use this buffer /// \brief Add a sound to the list of sounds that use this buffer

View File

@ -72,7 +72,7 @@ protected:
/// \return True to start the capture, or false to abort it /// \return True to start the capture, or false to abort it
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool onStart() override; [[nodiscard]] bool onStart() override;
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Process a new chunk of recorded samples /// \brief Process a new chunk of recorded samples
@ -83,7 +83,7 @@ protected:
/// \return True to continue the capture, or false to stop it /// \return True to continue the capture, or false to stop it
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool onProcessSamples(const Int16* samples, std::size_t sampleCount) override; [[nodiscard]] bool onProcessSamples(const Int16* samples, std::size_t sampleCount) override;
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Stop capturing audio data /// \brief Stop capturing audio data
@ -127,7 +127,10 @@ private:
/// { /// {
/// // Record some audio data /// // Record some audio data
/// sf::SoundBufferRecorder recorder; /// sf::SoundBufferRecorder recorder;
/// recorder.start(); /// if (!recorder.start())
/// {
/// // Handle error...
/// }
/// ... /// ...
/// recorder.stop(); /// recorder.stop();
/// ///
@ -135,7 +138,10 @@ private:
/// const sf::SoundBuffer& buffer = recorder.getBuffer(); /// const sf::SoundBuffer& buffer = recorder.getBuffer();
/// ///
/// // Save it to a file (for example...) /// // Save it to a file (for example...)
/// buffer.saveToFile("my_record.ogg"); /// if (!buffer.saveToFile("my_record.ogg"))
/// {
/// // Handle error...
/// }
/// } /// }
/// \endcode /// \endcode
/// ///

View File

@ -73,7 +73,7 @@ public:
/// \return True if the file was successfully opened /// \return True if the file was successfully opened
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
virtual bool open(InputStream& stream, Info& info) = 0; [[nodiscard]] virtual bool open(InputStream& stream, Info& info) = 0;
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Change the current read position to the given sample offset /// \brief Change the current read position to the given sample offset
@ -99,7 +99,7 @@ public:
/// \return Number of samples actually read (may be less than \a maxCount) /// \return Number of samples actually read (may be less than \a maxCount)
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
virtual Uint64 read(Int16* samples, Uint64 maxCount) = 0; [[nodiscard]] virtual Uint64 read(Int16* samples, Uint64 maxCount) = 0;
}; };
} // namespace sf } // namespace sf

View File

@ -58,7 +58,7 @@ public:
/// \return True if the file was successfully opened /// \return True if the file was successfully opened
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
virtual bool open(const std::string& filename, unsigned int sampleRate, unsigned int channelCount) = 0; [[nodiscard]] virtual bool open(const std::string& filename, unsigned int sampleRate, unsigned int channelCount) = 0;
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Write audio samples to the open file /// \brief Write audio samples to the open file

View File

@ -74,7 +74,7 @@ public:
/// \see stop, getAvailableDevices /// \see stop, getAvailableDevices
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool start(unsigned int sampleRate = 44100); [[nodiscard]] bool start(unsigned int sampleRate = 44100);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Stop the capture /// \brief Stop the capture
@ -134,7 +134,7 @@ public:
/// \see getAvailableDevices, getDefaultDevice /// \see getAvailableDevices, getDefaultDevice
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool setDevice(const std::string& name); [[nodiscard]] bool setDevice(const std::string& name);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Get the name of the current audio capture device /// \brief Get the name of the current audio capture device
@ -240,7 +240,7 @@ protected:
/// \return True to continue the capture, or false to stop it /// \return True to continue the capture, or false to stop it
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
virtual bool onProcessSamples(const Int16* samples, std::size_t sampleCount) = 0; [[nodiscard]] virtual bool onProcessSamples(const Int16* samples, std::size_t sampleCount) = 0;
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Stop capturing audio data /// \brief Stop capturing audio data
@ -392,7 +392,7 @@ private:
/// return true; /// return true;
/// } /// }
/// ///
/// bool onProcessSamples(const Int16* samples, std::size_t sampleCount) override /// [[nodiscard]] bool onProcessSamples(const Int16* samples, std::size_t sampleCount) override
/// { /// {
/// // Do something with the new chunk of samples (store them, send them, ...) /// // Do something with the new chunk of samples (store them, send them, ...)
/// ... /// ...

View File

@ -226,7 +226,7 @@ protected:
/// \return True to continue playback, false to stop /// \return True to continue playback, false to stop
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
virtual bool onGetData(Chunk& data) = 0; [[nodiscard]] virtual bool onGetData(Chunk& data) = 0;
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Change the current playing position in the stream source /// \brief Change the current playing position in the stream source
@ -290,7 +290,7 @@ private:
/// \return True if the stream source has requested to stop, false otherwise /// \return True if the stream source has requested to stop, false otherwise
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool fillAndPushBuffer(unsigned int bufferNum, bool immediateLoop = false); [[nodiscard]] bool fillAndPushBuffer(unsigned int bufferNum, bool immediateLoop = false);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Fill the audio buffers and put them all into the playing queue /// \brief Fill the audio buffers and put them all into the playing queue
@ -301,7 +301,7 @@ private:
/// \return True if the derived class has requested to stop, false otherwise /// \return True if the derived class has requested to stop, false otherwise
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool fillQueue(); [[nodiscard]] bool fillQueue();
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Clear all the audio buffers and empty the playing queue /// \brief Clear all the audio buffers and empty the playing queue

View File

@ -58,7 +58,8 @@ m_sounds () // don't copy the attached sounds
alCheck(alGenBuffers(1, &m_buffer)); alCheck(alGenBuffers(1, &m_buffer));
// Update the internal buffer with the new samples // Update the internal buffer with the new samples
update(copy.getChannelCount(), copy.getSampleRate()); if (!update(copy.getChannelCount(), copy.getSampleRate()))
err() << "Failed to update copy-constructed sound buffer" << std::endl;
} }

View File

@ -26,6 +26,7 @@
// Headers // Headers
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
#include <SFML/Audio/SoundBufferRecorder.hpp> #include <SFML/Audio/SoundBufferRecorder.hpp>
#include <SFML/System/Err.hpp>
#include <algorithm> #include <algorithm>
#include <iterator> #include <iterator>
@ -62,8 +63,11 @@ bool SoundBufferRecorder::onProcessSamples(const Int16* samples, std::size_t sam
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
void SoundBufferRecorder::onStop() void SoundBufferRecorder::onStop()
{ {
if (!m_samples.empty()) if (m_samples.empty())
m_buffer.loadFromSamples(m_samples.data(), m_samples.size(), getChannelCount(), getSampleRate()); return;
if (!m_buffer.loadFromSamples(m_samples.data(), m_samples.size(), getChannelCount(), getSampleRate()))
err() << "Failed to stop capturing audio data" << std::endl;
} }