xref: /haiku/src/apps/mediaplayer/playlist/PlaylistItem.cpp (revision 4c8e85b316c35a9161f5a1c50ad70bc91c83a76f)
1 /*
2  * Copyright 2009-2010 Stephan Aßmus <superstippi@gmx.de>
3  * All rights reserved. Distributed under the terms of the MIT license.
4  */
5 
6 #include "PlaylistItem.h"
7 
8 #include <stdio.h>
9 
10 #include <Catalog.h>
11 #include <Locale.h>
12 
13 #include "AudioTrackSupplier.h"
14 #include "TrackSupplier.h"
15 #include "VideoTrackSupplier.h"
16 
17 #undef B_TRANSLATION_CONTEXT
18 #define B_TRANSLATION_CONTEXT "MediaPlayer-PlaylistItem"
19 
20 
21 PlaylistItem::Listener::Listener()
22 {
23 }
24 
25 
26 PlaylistItem::Listener::~Listener()
27 {
28 }
29 
30 
31 void PlaylistItem::Listener::ItemChanged(const PlaylistItem* item)
32 {
33 }
34 
35 
36 // #pragma mark -
37 
38 
39 // #define DEBUG_INSTANCE_COUNT
40 #ifdef DEBUG_INSTANCE_COUNT
41 static vint32 sInstanceCount = 0;
42 #endif
43 
44 
45 PlaylistItem::PlaylistItem()
46 	:
47 	fPlaybackFailed(false),
48 	fTrackSupplier(NULL),
49 	fDuration(-1)
50 {
51 #ifdef DEBUG_INSTANCE_COUNT
52 	atomic_add(&sInstanceCount, 1);
53 	printf("%p->PlaylistItem::PlaylistItem() (%ld)\n", this, sInstanceCount);
54 #endif
55 }
56 
57 
58 PlaylistItem::~PlaylistItem()
59 {
60 #ifdef DEBUG_INSTANCE_COUNT
61 	atomic_add(&sInstanceCount, -1);
62 	printf("%p->PlaylistItem::~PlaylistItem() (%ld)\n", this, sInstanceCount);
63 #endif
64 }
65 
66 
67 TrackSupplier*
68 PlaylistItem::GetTrackSupplier()
69 {
70 	if (fTrackSupplier == NULL)
71 		fTrackSupplier = _CreateTrackSupplier();
72 
73 	return fTrackSupplier;
74 }
75 
76 
77 void
78 PlaylistItem::ReleaseTrackSupplier()
79 {
80 	delete fTrackSupplier;
81 	fTrackSupplier = NULL;
82 }
83 
84 
85 bool
86 PlaylistItem::HasTrackSupplier() const
87 {
88 	return fTrackSupplier != NULL;
89 }
90 
91 
92 BString
93 PlaylistItem::Name() const
94 {
95 	BString name;
96 	if (GetAttribute(ATTR_STRING_NAME, name) != B_OK)
97 		name = B_TRANSLATE_CONTEXT("<unnamed>", "PlaylistItem-name");
98 	return name;
99 }
100 
101 
102 BString
103 PlaylistItem::Author() const
104 {
105 	BString author;
106 	if (GetAttribute(ATTR_STRING_AUTHOR, author) != B_OK)
107 		author = B_TRANSLATE_CONTEXT("<unknown>", "PlaylistItem-author");
108 	return author;
109 }
110 
111 
112 BString
113 PlaylistItem::Album() const
114 {
115 	BString album;
116 	if (GetAttribute(ATTR_STRING_ALBUM, album) != B_OK)
117 		album = B_TRANSLATE_CONTEXT("<unknown>", "PlaylistItem-album");
118 	return album;
119 }
120 
121 
122 BString
123 PlaylistItem::Title() const
124 {
125 	BString title;
126 	if (GetAttribute(ATTR_STRING_TITLE, title) != B_OK)
127 		title = B_TRANSLATE_CONTEXT("<untitled>", "PlaylistItem-title");
128 	return title;
129 }
130 
131 
132 int32
133 PlaylistItem::TrackNumber() const
134 {
135 	int32 trackNumber;
136 	if (GetAttribute(ATTR_INT32_TRACK, trackNumber) != B_OK)
137 		trackNumber = 0;
138 	return trackNumber;
139 }
140 
141 
142 bigtime_t
143 PlaylistItem::Duration()
144 {
145 	bigtime_t duration;
146 	if (GetAttribute(ATTR_INT64_DURATION, duration) != B_OK) {
147 		if (fDuration == -1) {
148 			duration = this->_CalculateDuration();
149 			if (SetAttribute(ATTR_INT64_DURATION, duration) != B_OK) {
150 				fDuration = duration;
151 			}
152 		} else {
153 			duration = fDuration;
154 		}
155 	}
156 
157 	return duration;
158 }
159 
160 
161 int64
162 PlaylistItem::LastFrame() const
163 {
164 	int64 lastFrame;
165 	if (GetAttribute(ATTR_INT64_FRAME, lastFrame) != B_OK)
166 		lastFrame = 0;
167 	return lastFrame;
168 }
169 
170 
171 float
172 PlaylistItem::LastVolume() const
173 {
174 	float lastVolume;
175 	if (GetAttribute(ATTR_FLOAT_VOLUME, lastVolume) != B_OK)
176 		lastVolume = -1;
177 	return lastVolume;
178 }
179 
180 
181 status_t
182 PlaylistItem::SetLastFrame(int64 value)
183 {
184 	return SetAttribute(ATTR_INT64_FRAME, value);
185 }
186 
187 
188 status_t
189 PlaylistItem::SetLastVolume(float value)
190 {
191 	return SetAttribute(ATTR_FLOAT_VOLUME, value);
192 }
193 
194 
195 void
196 PlaylistItem::SetPlaybackFailed()
197 {
198 	fPlaybackFailed = true;
199 }
200 
201 
202 //! You must hold the Playlist lock.
203 bool
204 PlaylistItem::AddListener(Listener* listener)
205 {
206 	if (listener && !fListeners.HasItem(listener))
207 		return fListeners.AddItem(listener);
208 	return false;
209 }
210 
211 
212 //! You must hold the Playlist lock.
213 void
214 PlaylistItem::RemoveListener(Listener* listener)
215 {
216 	fListeners.RemoveItem(listener);
217 }
218 
219 
220 void
221 PlaylistItem::_NotifyListeners() const
222 {
223 	BList listeners(fListeners);
224 	int32 count = listeners.CountItems();
225 	for (int32 i = 0; i < count; i++) {
226 		Listener* listener = (Listener*)listeners.ItemAtFast(i);
227 		listener->ItemChanged(this);
228 	}
229 }
230 
231 
232 bigtime_t PlaylistItem::_CalculateDuration()
233 {
234 	// To be overridden in subclasses with more efficient methods
235 	TrackSupplier* supplier = GetTrackSupplier();
236 
237 	AudioTrackSupplier* au = supplier->CreateAudioTrackForIndex(0);
238 	VideoTrackSupplier* vi = supplier->CreateVideoTrackForIndex(0);
239 
240 	bigtime_t duration = max_c(au == NULL ? 0 : au->Duration(),
241 		vi == NULL ? 0 : vi->Duration());
242 
243 	delete vi;
244 	delete au;
245 	ReleaseTrackSupplier();
246 
247 	return duration;
248 }
249 
250