// 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. //----------------------------------------------------------------------------- #include "xmp_player.hpp" #include using namespace srb2; using namespace srb2::audio; template XmpPlayer::XmpPlayer(Xmp&& xmp) : xmp_(std::move(xmp)), buf_() { } template XmpPlayer::XmpPlayer(XmpPlayer&& rhs) noexcept = default; template XmpPlayer& XmpPlayer::operator=(XmpPlayer&& rhs) noexcept = default; template XmpPlayer::~XmpPlayer() = default; template std::size_t XmpPlayer::generate(tcb::span> buffer) { buf_.resize(buffer.size()); std::size_t read = xmp_.play_buffer(tcb::make_span(buf_)); buf_.resize(read); std::size_t ret = std::min(buffer.size(), buf_.size()); for (std::size_t i = 0; i < ret; i++) { for (std::size_t j = 0; j < C; j++) { buffer[i].amplitudes[j] = buf_[i][j] / 32768.f; } } return ret; } template float XmpPlayer::duration_seconds() const { return xmp_.duration_seconds(); } template float XmpPlayer::position_seconds() const { return xmp_.position_seconds(); } template void XmpPlayer::seek(float position_seconds) { xmp_.seek(static_cast(std::round(position_seconds * 1000.f))); } template class srb2::audio::XmpPlayer<1>; template class srb2::audio::XmpPlayer<2>;