Files
polypartiCL/include/AudioStreamUnmanaged.hpp
Alex Lardner d7890c9808 init commit
2026-07-04 19:08:19 -07:00

201 lines
5.4 KiB
C++

#ifndef RAYLIB_CPP_INCLUDE_AUDIOSTREAMUNMANAGED_HPP_
#define RAYLIB_CPP_INCLUDE_AUDIOSTREAMUNMANAGED_HPP_
#include "./RaylibException.hpp"
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* An AudioStream that is not managed by C++ RAII.
*
* Make sure to Unload() this if needed, otherwise use raylib::AudioStream.
*
* @see raylib::AudioStream
*/
class AudioStreamUnmanaged : public ::AudioStream {
public:
/**
* Creates an AudioStreamUnmanaged from an existing AudioStream struct.
*/
AudioStreamUnmanaged(const ::AudioStream& stream) : ::AudioStream(stream) {}
/**
* Creates an AudioStreamUnmanaged from its components.
*/
AudioStreamUnmanaged(
rAudioBuffer* buffer = nullptr,
rAudioProcessor* processor = nullptr,
unsigned int sampleRate = 0,
unsigned int sampleSize = 0,
unsigned int channels = 0)
: ::AudioStream{buffer, processor, sampleRate, sampleSize, channels} {}
/**
* Init audio stream (to stream raw audio PCM data).
*
* @throws raylib::RaylibException Throws if the AudioStream failed to load.
*/
AudioStreamUnmanaged(unsigned int sampleRate, unsigned int sampleSize, unsigned int channels = 2) {
Load(sampleRate, sampleSize, channels);
}
GETTER(rAudioBuffer*, Buffer, buffer)
GETTER(rAudioProcessor*, Processor, processor)
GETTER(unsigned int, SampleRate, sampleRate)
GETTER(unsigned int, SampleSize, sampleSize)
GETTER(unsigned int, Channels, channels)
AudioStreamUnmanaged& operator=(const ::AudioStream& stream) {
set(stream);
return *this;
}
/**
* Load audio stream (to stream raw audio PCM data).
*
* Does NOT call Unload() first — that is the responsibility of the managed class.
*
* @throws raylib::RaylibException Throws if the AudioStream failed to load.
*/
void Load(unsigned int sampleRate, unsigned int sampleSize, unsigned int channels = 2) {
set(::LoadAudioStream(sampleRate, sampleSize, channels));
if (!IsValid()) {
throw RaylibException("Failed to load audio stream");
}
}
/**
* Unload audio stream and free memory.
*/
void Unload() {
// Protect against calling UnloadAudioStream() twice.
if (buffer != nullptr) {
::UnloadAudioStream(*this);
buffer = nullptr;
}
}
/**
* Update audio stream buffers with data.
*/
AudioStreamUnmanaged& Update(const void* data, int samplesCount) {
::UpdateAudioStream(*this, data, samplesCount);
return *this;
}
/**
* Check if any audio stream buffers require refill.
*/
RLCPP_NODISCARD bool IsProcessed() const { return ::IsAudioStreamProcessed(*this); }
/**
* Play audio stream.
*/
AudioStreamUnmanaged& Play() {
::PlayAudioStream(*this);
return *this;
}
/**
* Pause audio stream.
*/
AudioStreamUnmanaged& Pause() {
::PauseAudioStream(*this);
return *this;
}
/**
* Resume audio stream.
*/
AudioStreamUnmanaged& Resume() {
::ResumeAudioStream(*this);
return *this;
}
/**
* Check if audio stream is playing.
*/
RLCPP_NODISCARD bool IsPlaying() const { return ::IsAudioStreamPlaying(*this); }
/**
* Stop audio stream.
*/
AudioStreamUnmanaged& Stop() {
::StopAudioStream(*this);
return *this;
}
/**
* Set volume for audio stream (1.0 is max level).
*/
AudioStreamUnmanaged& SetVolume(float volume = 1.0f) {
::SetAudioStreamVolume(*this, volume);
return *this;
}
/**
* Set pitch for audio stream (1.0 is base level).
*/
AudioStreamUnmanaged& SetPitch(float pitch) {
::SetAudioStreamPitch(*this, pitch);
return *this;
}
/**
* Set pan for audio stream (0.5 is centered).
*/
AudioStreamUnmanaged& SetPan(float pan = 0.5f) {
::SetAudioStreamPan(*this, pan);
return *this;
}
/**
* Default size for new audio streams.
*/
static void SetBufferSizeDefault(int size) { ::SetAudioStreamBufferSizeDefault(size); }
/**
* Audio thread callback to request new data.
*/
AudioStreamUnmanaged& SetCallback(::AudioCallback callback) {
::SetAudioStreamCallback(*this, callback);
return *this;
}
/**
* Attach audio stream processor to stream.
*/
AudioStreamUnmanaged& AttachProcessor(::AudioCallback processor) {
::AttachAudioStreamProcessor(*this, processor);
return *this;
}
/**
* Detach audio stream processor from stream.
*/
AudioStreamUnmanaged& DetachProcessor(::AudioCallback processor) {
::DetachAudioStreamProcessor(*this, processor);
return *this;
}
/**
* Retrieve whether or not the audio stream is ready.
*/
RLCPP_NODISCARD bool IsValid() const { return ::IsAudioStreamValid(*this); }
protected:
void set(const ::AudioStream& stream) {
buffer = stream.buffer;
processor = stream.processor;
sampleRate = stream.sampleRate;
sampleSize = stream.sampleSize;
channels = stream.channels;
}
};
} // namespace raylib
using RAudioStreamUnmanaged = raylib::AudioStreamUnmanaged;
#endif // RAYLIB_CPP_INCLUDE_AUDIOSTREAMUNMANAGED_HPP_