44 lines
1.0 KiB
C++
44 lines
1.0 KiB
C++
#ifndef LYRIC_PARSER_H
|
|
#define LYRIC_PARSER_H
|
|
|
|
#include <string>
|
|
#include <map>
|
|
|
|
typedef struct LyricPacket
|
|
{
|
|
// 歌词
|
|
std::string lyric;
|
|
// ms时间戳
|
|
int64_t pts = 0;
|
|
|
|
bool isEmpty() const { return lyric.empty() && pts == 0; }
|
|
} LyricPacket;
|
|
|
|
class LrcParser
|
|
{
|
|
public:
|
|
LrcParser() {};
|
|
~LrcParser() {};
|
|
bool parseLrc(const std::string &lrcFile);
|
|
LyricPacket readPacket();
|
|
int64_t duration() const;
|
|
|
|
/**
|
|
* @brief 利用给定的时间戳来寻求一个最接近的位置
|
|
* @param[in] timestamp 时间戳,单位ms
|
|
* @return 成功返回true,否则返回false
|
|
*/
|
|
bool seek(int64_t timestamp);
|
|
private:
|
|
int64_t duration_ = 0;
|
|
size_t currentIndex_ = 0;
|
|
std::string lrcData_;
|
|
std::map<int64_t, std::string> lyrics_;
|
|
std::map<int64_t, std::string>::iterator readIndex_;
|
|
size_t parseHeader();
|
|
void parseLine(const std::string &line);
|
|
std::string readLine();
|
|
};
|
|
|
|
#endif // LRCDECODER_H
|