File: track_info.h

package info (click to toggle)
cmus 2.7.1%2Bgit20160225-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 1,848 kB
  • sloc: ansic: 35,866; sh: 1,548; makefile: 260; python: 159
file content (159 lines) | stat: -rw-r--r-- 6,701 bytes parent folder | download | duplicates (2)
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
154
155
156
157
158
159
/*
 * Copyright 2008-2013 Various Authors
 * Copyright 2004-2005 Timo Hirvonen
 *
 * 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; if not, see <http://www.gnu.org/licenses/>.
 */

#ifndef CMUS_TRACK_INFO_H
#define CMUS_TRACK_INFO_H

#include <time.h>
#include <stddef.h>

struct track_info {
	struct keyval *comments;

	// next track_info in the hash table (cache.c)
	struct track_info *next;

	time_t mtime;
	int duration;
	long bitrate;
	char *codec;
	char *codec_profile;
	int ref;
	char *filename;

	int tracknumber;
	int discnumber;
	int date;
	int originaldate;
	double rg_track_gain;
	double rg_track_peak;
	double rg_album_gain;
	double rg_album_peak;
	const char *artist;
	const char *album;
	const char *title;
	const char *genre;
	const char *comment;
	const char *albumartist;
	const char *artistsort;
	const char *albumsort;
	const char *media;

	char *collkey_artist;
	char *collkey_album;
	char *collkey_title;
	char *collkey_genre;
	char *collkey_comment;
	char *collkey_albumartist;

	unsigned int play_count;

	int is_va_compilation : 1;
	int bpm;
};

typedef size_t sort_key_t;

#define SORT_INVALID            ((sort_key_t) (-1))
#define SORT_ARTIST        	offsetof(struct track_info, collkey_artist)
#define SORT_ALBUM         	offsetof(struct track_info, collkey_album)
#define SORT_TITLE         	offsetof(struct track_info, collkey_title)
#define SORT_TRACKNUMBER   	offsetof(struct track_info, tracknumber)
#define SORT_DISCNUMBER    	offsetof(struct track_info, discnumber)
#define SORT_DATE          	offsetof(struct track_info, date)
#define SORT_ORIGINALDATE  	offsetof(struct track_info, originaldate)
#define SORT_RG_TRACK_GAIN 	offsetof(struct track_info, rg_track_gain)
#define SORT_RG_TRACK_PEAK 	offsetof(struct track_info, rg_track_peak)
#define SORT_RG_ALBUM_GAIN 	offsetof(struct track_info, rg_album_gain)
#define SORT_RG_ALBUM_PEAK 	offsetof(struct track_info, rg_album_peak)
#define SORT_GENRE         	offsetof(struct track_info, collkey_genre)
#define SORT_COMMENT       	offsetof(struct track_info, collkey_comment)
#define SORT_ALBUMARTIST   	offsetof(struct track_info, collkey_albumartist)
#define SORT_PLAY_COUNT   	offsetof(struct track_info, play_count)
#define SORT_FILENAME      	offsetof(struct track_info, filename)
#define SORT_FILEMTIME     	offsetof(struct track_info, mtime)
#define SORT_BITRATE       	offsetof(struct track_info, bitrate)
#define SORT_CODEC         	offsetof(struct track_info, codec)
#define SORT_CODEC_PROFILE 	offsetof(struct track_info, codec_profile)
#define SORT_MEDIA		offsetof(struct track_info, media)
#define SORT_BPM		offsetof(struct track_info, bpm)
#define REV_SORT__START		sizeof(struct track_info)
#define REV_SORT_ARTIST		(REV_SORT__START + offsetof(struct track_info, collkey_artist))
#define REV_SORT_ALBUM          (REV_SORT__START + offsetof(struct track_info, collkey_album))
#define REV_SORT_TITLE          (REV_SORT__START + offsetof(struct track_info, collkey_title))
#define REV_SORT_PLAY_COUNT   	(REV_SORT__START + offsetof(struct track_info, play_count))
#define REV_SORT_TRACKNUMBER    (REV_SORT__START + offsetof(struct track_info, tracknumber))
#define REV_SORT_DISCNUMBER     (REV_SORT__START + offsetof(struct track_info, discnumber))
#define REV_SORT_DATE           (REV_SORT__START + offsetof(struct track_info, date))
#define REV_SORT_ORIGINALDATE   (REV_SORT__START + offsetof(struct track_info, originaldate))
#define REV_SORT_RG_TRACK_GAIN  (REV_SORT__START + offsetof(struct track_info, rg_track_gain))
#define REV_SORT_RG_TRACK_PEAK  (REV_SORT__START + offsetof(struct track_info, rg_track_peak))
#define REV_SORT_RG_ALBUM_GAIN  (REV_SORT__START + offsetof(struct track_info, rg_album_gain))
#define REV_SORT_RG_ALBUM_PEAK  (REV_SORT__START + offsetof(struct track_info, rg_album_peak))
#define REV_SORT_GENRE          (REV_SORT__START + offsetof(struct track_info, collkey_genre))
#define REV_SORT_COMMENT        (REV_SORT__START + offsetof(struct track_info, collkey_comment))
#define REV_SORT_ALBUMARTIST    (REV_SORT__START + offsetof(struct track_info, collkey_albumartist))
#define REV_SORT_FILENAME       (REV_SORT__START + offsetof(struct track_info, filename))
#define REV_SORT_FILEMTIME      (REV_SORT__START + offsetof(struct track_info, mtime))
#define REV_SORT_BITRATE        (REV_SORT__START + offsetof(struct track_info, bitrate))
#define REV_SORT_CODEC          (REV_SORT__START + offsetof(struct track_info, codec))
#define REV_SORT_CODEC_PROFILE  (REV_SORT__START + offsetof(struct track_info, codec_profile))
#define REV_SORT_MEDIA          (REV_SORT__START + offsetof(struct track_info, media))
#define REV_SORT_BPM            (REV_SORT__START + offsetof(struct track_info, bpm))

#define TI_MATCH_ARTIST       (1 << 0)
#define TI_MATCH_ALBUM        (1 << 1)
#define TI_MATCH_TITLE        (1 << 2)
#define TI_MATCH_ALBUMARTIST  (1 << 3)
#define TI_MATCH_ALL          (~0)

/* initializes only filename and ref */
struct track_info *track_info_new(const char *filename);
void track_info_set_comments(struct track_info *ti, struct keyval *comments);

void track_info_ref(struct track_info *ti);
void track_info_unref(struct track_info *ti);

/*
 * returns: 1 if @ti has any of the following tags: artist, album, title
 *          0 otherwise
 */
int track_info_has_tag(const struct track_info *ti);

/*
 * @flags  fields to search in (TI_MATCH_*)
 *
 * returns: 1 if all words in @text are found to match defined fields (@flags) in @ti
 *          0 otherwise
 */
int track_info_matches(const struct track_info *ti, const char *text, unsigned int flags);

/*
 * @flags            fields to search in (TI_MATCH_*)
 * @exclude_flags    fields which must not match (TI_MATCH_*)
 * @match_all_words  if true, all words must be found in @ti
 *
 * returns: 1 if all/any words in @text are found to match defined fields (@flags) in @ti
 *          0 otherwise
 */
int track_info_matches_full(const struct track_info *ti, const char *text, unsigned int flags,
		unsigned int exclude_flags, int match_all_words);

int track_info_cmp(const struct track_info *a, const struct track_info *b, const sort_key_t *keys);

#endif