72 lines
1.3 KiB
C++
72 lines
1.3 KiB
C++
#pragma once
|
|
|
|
#include <string>
|
|
#include <string_view>
|
|
#include <vector>
|
|
|
|
#include "app.hh"
|
|
|
|
|
|
namespace pg {
|
|
|
|
class Input final : App {
|
|
public:
|
|
class Data;
|
|
|
|
static Input& instance() noexcept { return instance_; }
|
|
|
|
Input() = default;
|
|
Input(const Input&) = delete;
|
|
Input(Input&&) = delete;
|
|
Input& operator=(const Input&) = delete;
|
|
Input& operator=(Input&&) = delete;
|
|
|
|
size_t Add(Data*) noexcept;
|
|
void Update() noexcept override;
|
|
|
|
Data* slots(size_t idx) noexcept {
|
|
return idx < slots_.size()? slots_[idx]: nullptr;
|
|
}
|
|
|
|
private:
|
|
static Input instance_;
|
|
|
|
std::vector<Data*> slots_;
|
|
};
|
|
|
|
class Input::Data {
|
|
public:
|
|
struct Frame {
|
|
public:
|
|
size_t w, h;
|
|
const uint8_t* rgba;
|
|
};
|
|
|
|
Data() = delete;
|
|
Data(std::string_view name) noexcept : name_(name) {
|
|
idx_ = Input::instance().Add(this);
|
|
}
|
|
virtual ~Data() = default;
|
|
Data(const Data&) = delete;
|
|
Data(Data&&) = delete;
|
|
Data& operator=(const Data&) = delete;
|
|
Data& operator=(Data&&) = delete;
|
|
|
|
virtual Frame Fetch(size_t) noexcept = 0;
|
|
virtual size_t frames() noexcept = 0;
|
|
|
|
size_t index() const noexcept { return idx_; }
|
|
|
|
std::vector<float> FetchSamples(
|
|
size_t st, size_t dur, float x, float y, size_t offset) noexcept;
|
|
|
|
const std::string& name() const noexcept { return name_; }
|
|
|
|
private:
|
|
std::string name_;
|
|
|
|
size_t idx_;
|
|
};
|
|
|
|
} // namespace pg
|