Added intro video
This commit is contained in:
67
src/states/VideoState.h
Normal file
67
src/states/VideoState.h
Normal file
@ -0,0 +1,67 @@
|
||||
// VideoState.h
|
||||
#pragma once
|
||||
|
||||
#include "State.h"
|
||||
|
||||
#include <atomic>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <thread>
|
||||
#include <vector>
|
||||
|
||||
class VideoPlayer;
|
||||
|
||||
class VideoState : public State {
|
||||
public:
|
||||
explicit VideoState(StateContext& ctx);
|
||||
~VideoState() override;
|
||||
|
||||
void onEnter() override;
|
||||
void onExit() override;
|
||||
void handleEvent(const SDL_Event& e) override;
|
||||
void update(double frameMs) override;
|
||||
void render(SDL_Renderer* renderer, float logicalScale, SDL_Rect logicalVP) override;
|
||||
|
||||
// Called from the App's on-enter hook so we can create textures.
|
||||
bool begin(SDL_Renderer* renderer, const std::string& path);
|
||||
|
||||
private:
|
||||
enum class Phase {
|
||||
FadeInFirstFrame,
|
||||
Playing,
|
||||
FadeOutToBlack,
|
||||
Done
|
||||
};
|
||||
|
||||
void startAudioIfReady();
|
||||
void stopAudio();
|
||||
|
||||
static bool decodeAudioPcm16Stereo44100(
|
||||
const std::string& path,
|
||||
std::vector<int16_t>& outPcm,
|
||||
int& outRate,
|
||||
int& outChannels
|
||||
);
|
||||
|
||||
std::unique_ptr<VideoPlayer> m_player;
|
||||
std::string m_path;
|
||||
|
||||
Phase m_phase = Phase::FadeInFirstFrame;
|
||||
double m_phaseClockMs = 0.0;
|
||||
|
||||
static constexpr double FADE_IN_MS = 900.0;
|
||||
static constexpr double FADE_OUT_MS = 450.0;
|
||||
|
||||
// Audio decoding runs in the background while we fade in.
|
||||
std::atomic<bool> m_audioDecoded{false};
|
||||
std::atomic<bool> m_audioDecodeFailed{false};
|
||||
std::vector<int16_t> m_audioPcm;
|
||||
int m_audioRate = 44100;
|
||||
int m_audioChannels = 2;
|
||||
bool m_audioStarted = false;
|
||||
|
||||
std::unique_ptr<std::jthread> m_audioThread;
|
||||
|
||||
// Render-time overlay alpha (0..1) for fade stages.
|
||||
float m_blackOverlayAlpha = 1.0f;
|
||||
};
|
||||
Reference in New Issue
Block a user