aboutsummaryrefslogtreecommitdiffstats
path: root/src/base/song.hpp
blob: 4fb7e2ae255dd8eda144108875ac885c19b77891 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/*
 * UltraStar Deluxe - Karaoke Game
 *
 * UltraStar Deluxe is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; see the file COPYING. If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 *
 */

#ifndef SONG_HPP
#define SONG_HPP

#include <string>
#include <map>
#include <list>
#include <boost/filesystem.hpp>
#include <log4cpp/Category.hh>
#include "bpm.hpp"
#include "lyric_line.hpp"
#include "utils/image.hpp"
#include "utils/base_exception.hpp"

namespace usdx
{
	class MissingTagException : public BaseException
	{
	private:
		/**
		 * TODO: Maybe refactor this to separate sub-classes.
		 */
		const std::string tag;

	public:
		MissingTagException(const std::string tag,
				    const std::string message) :
			BaseException(message), tag(tag) {};

		~MissingTagException () throw () {};

		virtual const std::string& get_tag() const { return tag; };
	};

	class Song
	{
	private:
		static log4cpp::Category&  log;

		boost::filesystem::wpath filename;

		std::string title;
		std::string artist;

		// filenames
		std::string mp3;

		std::string background;

		std::string video;
		float video_gap;

		std::string cover_file;
		Image* cover;

		std::string genre;
		std::string edition;
		std::string language;
		int year;
		std::string creator;

		int notes_gap;
		float gap; ///< in miliseconds

		float start; ///< in seconds
		int stop; ///< in miliseconds
		bool relative;
		int resolution;

		std::list<BPM*> bpm;

		std::list<LyricLine*> lyrics;

		std::map<std::string, std::string> custom_header_tags;

		std::string get_header_tag(const std::string& tag, const bool required = false);
		float get_header_tag_float(const std::string& tag, const bool required = false);
		int get_header_tag_int(const std::string& tag, const bool required = false);
		bool get_header_tag_bool(const std::string& tag, const bool required = false);

		LyricLine* get_last_lyric_line(void);
		LyricLine* create_new_lyric_line(int start);

		/**
		 * Used to calculate the absolute beat times in relative song
		 * mode.
		 *
		 * @return Start beat time from last line.
		 */
		int get_relative_beat(void);

		// TODO: Encoding:   TEncoding;
	public:
		Song(const boost::filesystem::wpath& filename,
		     const std::map<std::string, std::string>& header);

		virtual ~Song(void);

		const boost::filesystem::wpath& get_filename(void) const;

		const std::string& get_title(void) const;
		const std::string& get_artist(void) const;
		const std::string& get_mp3(void) const;
		const float get_bpm(int beat) const;
		const float get_gap(void) const;
		const std::string& get_cover_file(void) const;
		const std::string& get_background(void) const;
		const std::string& get_video(void) const;
		const float get_video_gap(void) const;
		const std::string& get_genre(void) const;
		const std::string& get_edition(void) const;
		const std::string& get_creator(void) const;
		const std::string& get_language(void) const;
		const int get_year(void) const;
		const float get_start(void) const;
		const int get_stop(void) const;
		const int get_resolution(void) const;
		const int get_notes_gap(void) const;
		const bool get_relative(void) const;

		// TODO: encoding class
		// const std::string& get_encoding(void) const;

		void new_bpm(const int beat, const float new_bpm);
		void new_line(const int line_out, const int line_in);
		void new_note(const char type, const int beat, const int length, const int height, const std::string& lyric);
	};
}

#endif