You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
1.5 KiB
68 lines
1.5 KiB
|
5 years ago
|
#pragma once
|
||
|
|
|
||
|
|
#include <chrono>
|
||
|
|
#include <cstdint>
|
||
|
|
#include <memory>
|
||
|
|
#include <queue>
|
||
|
|
|
||
|
|
#include <Aulib/Decoder.h>
|
||
|
|
#include <SDL_mutex.h>
|
||
|
|
|
||
|
|
#include "utils/sdl_mutex.h"
|
||
|
|
|
||
|
|
namespace devilution {
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief A Decoder interface implementations that simply has the samples pushed into it by the user.
|
||
|
|
*/
|
||
|
|
class PushAulibDecoder final : public ::Aulib::Decoder {
|
||
|
|
public:
|
||
|
|
PushAulibDecoder(int numChannels, int sampleRate)
|
||
|
|
: numChannels_(numChannels)
|
||
|
|
, sampleRate_(sampleRate)
|
||
|
|
, queue_mutex_(SDL_CreateMutex())
|
||
|
|
{
|
||
|
|
}
|
||
|
|
|
||
|
|
void PushSamples(const std::uint8_t *data, unsigned size) noexcept;
|
||
|
|
void PushSamples(const std::int16_t *data, unsigned size) noexcept;
|
||
|
|
void DiscardPendingSamples() noexcept;
|
||
|
|
|
||
|
|
bool open(SDL_RWops *rwops) override;
|
||
|
|
|
||
|
|
[[nodiscard]] int getChannels() const override
|
||
|
|
{
|
||
|
|
return numChannels_;
|
||
|
|
}
|
||
|
|
|
||
|
|
[[nodiscard]] int getRate() const override
|
||
|
|
{
|
||
|
|
return sampleRate_;
|
||
|
|
}
|
||
|
|
|
||
|
|
bool rewind() override;
|
||
|
|
[[nodiscard]] std::chrono::microseconds duration() const override;
|
||
|
|
bool seekToTime(std::chrono::microseconds pos) override;
|
||
|
|
|
||
|
|
protected:
|
||
|
|
int doDecoding(float buf[], int len, bool &callAgain) override;
|
||
|
|
|
||
|
|
private:
|
||
|
|
struct AudioQueueItem {
|
||
|
|
std::unique_ptr<std::int16_t[]> data;
|
||
|
|
unsigned len;
|
||
|
|
const std::int16_t *pos;
|
||
|
|
};
|
||
|
|
|
||
|
|
const int numChannels_;
|
||
|
|
const int sampleRate_;
|
||
|
|
|
||
|
|
// Requires holding the queue_mutex_.
|
||
|
|
AudioQueueItem *Next();
|
||
|
|
|
||
|
|
std::queue<AudioQueueItem> queue_;
|
||
|
|
SDLMutexUniquePtr queue_mutex_;
|
||
|
|
};
|
||
|
|
|
||
|
|
} // namespace devilution
|