Added lyrics UTF8 conversion flag to addLyrics;
[xbmc:xbmc-antiquated.git] / XBMC / xbmc / karaoke / karaokelyricstext.h
1 //
2 // C++ Interface: karaokelyricstext
3 //
4 // Description:
5 //
6 //
7 // Author: Team XBMC <>, (C) 2008
8 //
9 // Copyright: See COPYING file that comes with this distribution
10 //
11 //
12
13 #ifndef KARAOKELYRICSTEXT_H
14 #define KARAOKELYRICSTEXT_H
15
16
17 #include "karaokelyrics.h"
18
19 class CGUITextLayout;
20 class CGUIFont;
21
22 //! This class is a base abstract class for all lyric loaders which provide text-based lyrics.
23 //! Once the lyrics are properly transferred to this class, it will take care of rendering.
24 //! Therefore the Render() function in the derived class might be empty, but must still call
25 //! the parent function to function properly.
26 class CKaraokeLyricsText : public CKaraokeLyrics
27 {
28   public:
29     CKaraokeLyricsText();
30     virtual ~CKaraokeLyricsText();
31
32     //! Parses the lyrics or song file, and loads the lyrics into memory.
33     //! Done in derived classes, this class only takes care of rendering.
34     virtual bool Load() = 0;
35
36     //! Most of text lyrics do not have any backgrounds
37     virtual bool HasBackground();
38
39   protected:
40     enum
41     {
42       LYRICS_NEW_LINE = 0x0001,
43       LYRICS_NEW_PARAGRAPH = 0x0002,
44       LYRICS_CONVERT_UTF8 = 0x0010,
45       LYRICS_END = 0xFFFFFFFF
46     };
47
48     //! Render functionality from the parent class is handled here
49     virtual void Render();
50
51     //! This function is called when the karoke visualisation window created. It may
52     //! be called after Start(), but is guaranteed to be called before Render()
53     //! Default implementation does nothing and returns true.
54     virtual bool InitGraphics();
55
56     //! This function is called when the karoke visualisation window is destroyed.
57     //! Default implementation does nothing.
58     virtual void Shutdown();
59
60     //! The loader should call this function to add each separate lyrics syllable.
61     //! timing is in 1/10 seconds; if you have time in milliseconds, multiple by 100.
62     //! flags could be 0 (regular), LYRICS_NEW_LINE (this syllable should start on a new line),
63     //! and LYRICS_NEW_PARAGRAPH (this syllable should start on a new paragraph)
64     void  addLyrics( const CStdString& text, unsigned int timing, unsigned int flags = 0 );
65
66     //! This function clears the lyrics array and resets song information
67     void  clearLyrics();
68
69     //! This function calculares next paragraph of lyrics which will be shown. Returns true if indexes change
70     void  nextParagraph();
71
72     //! Rescan lyrics, fix typical issues
73     void  rescanLyrics();
74
75     //! Returns string width if rendered using current font
76     float  getStringWidth( const CStdString& text );
77
78     //! Saves parsed lyrics into a temporary file for debugging
79     void  saveLyrics();
80
81     //! Those variables keep the song information if available, parsed from the lyrics file.
82     //! It should not be based on filename, as this case will be handled internally.
83     //! Should be set to "" if no information available.
84     CStdString    m_songName;
85     CStdString    m_artist;
86
87   private:
88
89     //! Lyrics render state machine
90     enum
91     {
92       //! the next paragraph lyrics are not shown yet. Screen is clear.
93       //! All indexes are set, m_index points to the first element.
94       //! m_index timing - m_delayBefore shows when the state changes to STATE_DRAW_SYLLABLE
95       STATE_WAITING,
96
97       //! the next paragraph lyrics are shown, but the paragraph hasn't start yet.
98       //! Using m_preambleTime, we redraw the marker each second.
99       STATE_PREAMBLE,
100
101       //! the lyrics are played, the end of paragraph is not reached.
102       STATE_PLAYING_PARAGRAPH,
103
104       //! the whole paragraph is colored, but still shown, waiting until it's time to clear the lyrics.
105       //! m_index still points to the last entry, and m_indexNextPara points to the first entry of next
106       //! paragraph, or to LYRICS_END. When the next paragraph is about to start (which is
107       //! m_indexNextPara timing - m_delayBefore), the state switches to STATE_START_PARAGRAPH. When time
108       //! goes after m_index timing + m_delayAfter, the state switches to STATE_WAITING,
109       STATE_END_PARAGRAPH,
110
111       //!< the song is completed, there are no more lyrics to show. This state is finita la comedia.
112       STATE_END_SONG,
113     };
114
115     typedef struct
116     {
117       CStdString    text;
118       unsigned int   timing;
119       unsigned int   flags;
120
121     } Lyric;
122
123     std::vector<Lyric>  m_lyrics;
124
125     //! Text layout for lyrics
126     CGUITextLayout  *  m_karaokeLayout;
127
128     //! Text layout for preamble
129     CGUITextLayout  *  m_preambleLayout;
130
131     //! Fond for lyrics
132     CGUIFont     *  m_karaokeFont;
133
134     //! Lyrics colors
135     unsigned int    m_colorLyrics;
136     unsigned int    m_colorLyricsOutline;
137     CStdString       m_colorSinging;
138
139     //! This is index in m_lyrics pointing to current paragraph first, last and current elements
140     unsigned int    m_indexEndPara;
141     unsigned int    m_indexStartPara;
142     unsigned int    m_index;
143
144     //! This is preamble timing, used to update preamble each second
145     unsigned int    m_lastPreambleUpdate;
146
147     //! This is index in m_lyrics pointing to next paragraph.
148     //! If LYRICS_END - there is no next paragraph
149     unsigned int    m_indexNextPara;
150
151     //! Current lyrics rendering state
152     unsigned int    m_lyricsState;
153
154     //! Lyrics text on screen
155     CStdString      m_currentLyrics;
156
157     //! Preamble text on screen
158     CStdString      m_currentPreamble;
159
160     //
161     // Configuration settings
162     //
163     //! Number of 1/10 seconds between the lyrics are shown and start singing. 50 means 5 seconds
164     unsigned int    m_showLyricsBeforeStart;
165     unsigned int    m_showPreambleBeforeStart;
166     bool            m_mergeLines;
167
168     //! Autosplitter uses this value to split paragraphs. If a new line starts in more than
169     //! m_paragraphBreakTime after current line ends, it's a new paragraph.
170     unsigned int    m_paragraphBreakTime;
171
172     //! Number of 1/10 seconds after the lyrics are sung. 50 means 5 seconds
173     unsigned int    m_delayAfter;
174 };
175
176 #endif