97 lines
1.9 KiB
C
97 lines
1.9 KiB
C
|
|
#pragma once
|
|||
|
|
|
|||
|
|
#include <resource/resource.h>
|
|||
|
|
#include <SDL2/SDL_mixer.h>
|
|||
|
|
#include <string>
|
|||
|
|
|
|||
|
|
namespace extra2d {
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 音频类型枚举
|
|||
|
|
*/
|
|||
|
|
enum class AudioType : uint8 {
|
|||
|
|
Sound, // 音效(短音频,完全加载到内存)
|
|||
|
|
Music // 音乐(流式播放)
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 音频资源类
|
|||
|
|
*
|
|||
|
|
* 封装 SDL2_mixer 音频
|
|||
|
|
*/
|
|||
|
|
class Audio : public Resource {
|
|||
|
|
public:
|
|||
|
|
Audio();
|
|||
|
|
~Audio() override;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 获取资源类型
|
|||
|
|
*/
|
|||
|
|
ResourceType getType() const override { return ResourceType::Audio; }
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 从文件加载音频
|
|||
|
|
* @param path 文件路径
|
|||
|
|
* @param type 音频类型
|
|||
|
|
* @return 是否加载成功
|
|||
|
|
*/
|
|||
|
|
bool loadFromFile(const std::string& path, AudioType type);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 播放音频
|
|||
|
|
* @param loops 循环次数,-1 表示无限循环,0 表示播放一次
|
|||
|
|
*/
|
|||
|
|
void play(int loops = 0);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 暂停播放
|
|||
|
|
*/
|
|||
|
|
void pause();
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 恢复播放
|
|||
|
|
*/
|
|||
|
|
void resume();
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 停止播放
|
|||
|
|
*/
|
|||
|
|
void stop();
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 设置音量
|
|||
|
|
* @param volume 音量(0.0 - 1.0)
|
|||
|
|
*/
|
|||
|
|
void setVolume(float volume);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 获取音量
|
|||
|
|
* @return 音量(0.0 - 1.0)
|
|||
|
|
*/
|
|||
|
|
float getVolume() const;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 检查是否正在播放
|
|||
|
|
*/
|
|||
|
|
bool isPlaying() const;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 检查是否已暂停
|
|||
|
|
*/
|
|||
|
|
bool isPaused() const;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 获取音频类型
|
|||
|
|
*/
|
|||
|
|
AudioType getAudioType() const { return type_; }
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
AudioType type_ = AudioType::Sound; // 音频类型
|
|||
|
|
Mix_Chunk* chunk_ = nullptr; // 音效数据
|
|||
|
|
Mix_Music* music_ = nullptr; // 音乐数据
|
|||
|
|
int channel_ = -1; // 音效通道
|
|||
|
|
float volume_ = 1.0f; // 音量
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
} // namespace extra2d
|