RingRacers/src/audio/wav.hpp
2024-04-05 09:46:07 -04:00

55 lines
1.5 KiB
C++

// DR. ROBOTNIK'S RING RACERS
//-----------------------------------------------------------------------------
// Copyright (C) 2024 by Ronald "Eidolon" Kinard
// Copyright (C) 2024 by Kart Krew
//
// This program is free software distributed under the
// terms of the GNU General Public License, version 2.
// See the 'LICENSE' file for more details.
//-----------------------------------------------------------------------------
#ifndef __SRB2_AUDIO_WAV_HPP__
#define __SRB2_AUDIO_WAV_HPP__
#include <cstddef>
#include <cstdint>
#include <type_traits>
#include <variant>
#include <vector>
#include <tcb/span.hpp>
#include "../io/streams.hpp"
#include "sample.hpp"
namespace srb2::audio
{
class Wav final
{
std::variant<std::vector<uint8_t>, std::vector<int16_t>> interleaved_samples_;
std::size_t channels_ = 1;
std::size_t sample_rate_ = 44100;
public:
Wav();
explicit Wav(tcb::span<std::byte> data);
std::size_t get_samples(std::size_t offset, tcb::span<Sample<1>> buffer) const noexcept;
std::size_t interleaved_length() const noexcept;
std::size_t length() const noexcept { return interleaved_length() / channels(); };
std::size_t channels() const noexcept { return channels_; };
std::size_t sample_rate() const noexcept { return sample_rate_; };
};
template <typename I, typename std::enable_if_t<srb2::io::IsInputStreamV<I>, int> = 0>
inline Wav load_wav(I& stream)
{
std::vector<std::byte> data = srb2::io::read_to_vec(stream);
return Wav {data};
}
} // namespace srb2::audio
#endif // __SRB2_AUDIO_WAV_HPP__