1 #include <TimedEventQueue.h>
2 #include <stdio.h>
3
4 #define DEBUG 1
5 #include <Debug.h>
6
7 BTimedEventQueue::queue_action DoForEachHook(media_timed_event *event, void *context);
8 void DumpEvent(const media_timed_event & e);
9 void DumpEvent(const media_timed_event * e);
10 void InsertRemoveTest();
11 void DoForEachTest();
12 void MatchTest();
13 void FlushTest();
14
DumpEvent(const media_timed_event & e)15 void DumpEvent(const media_timed_event & e)
16 {
17 DumpEvent(&e);
18 }
19
DumpEvent(const media_timed_event * e)20 void DumpEvent(const media_timed_event * e)
21 {
22 if (!e) {
23 printf("NULL\n");
24 return;
25 }
26 printf("time = 0x%x, type = ",int(e->event_time));
27 switch (e->type) {
28 case BTimedEventQueue::B_NO_EVENT: printf("B_NO_EVENT\n"); break;
29 case BTimedEventQueue::B_ANY_EVENT: printf("B_ANY_EVENT\n"); break;
30 case BTimedEventQueue::B_START: printf("B_START\n"); break;
31 case BTimedEventQueue::B_STOP: printf("B_STOP\n"); break;
32 case BTimedEventQueue::B_SEEK: printf("B_SEEK\n"); break;
33 case BTimedEventQueue::B_WARP: printf("B_WARP\n"); break;
34 case BTimedEventQueue::B_TIMER: printf("B_TIMER\n"); break;
35 case BTimedEventQueue::B_HANDLE_BUFFER: printf("B_HANDLE_BUFFER\n"); break;
36 case BTimedEventQueue::B_DATA_STATUS: printf("B_DATA_STATUS\n"); break;
37 case BTimedEventQueue::B_HARDWARE: printf("B_HARDWARE\n"); break;
38 case BTimedEventQueue::B_PARAMETER: printf("B_PARAMETER\n"); break;
39 default: printf("0x%x\n",int(e->type));
40 }
41 }
42
InsertRemoveTest()43 void InsertRemoveTest()
44 {
45 BTimedEventQueue *q =new BTimedEventQueue;
46 q->AddEvent(media_timed_event(0x1007,BTimedEventQueue::B_START));//
47 q->AddEvent(media_timed_event(0x1005,BTimedEventQueue::B_START));//
48 q->AddEvent(media_timed_event(0x9999,BTimedEventQueue::B_STOP));//
49 q->AddEvent(media_timed_event(0x1006,BTimedEventQueue::B_START));//
50 q->AddEvent(media_timed_event(0x1002,BTimedEventQueue::B_START));//
51 q->AddEvent(media_timed_event(0x1011,BTimedEventQueue::B_START));//
52 q->AddEvent(media_timed_event(0x1000,BTimedEventQueue::B_START));//
53 q->AddEvent(media_timed_event(0x0777,BTimedEventQueue::B_START));//
54 q->AddEvent(media_timed_event(0x1001,BTimedEventQueue::B_START));//
55 q->AddEvent(media_timed_event(0x1000,BTimedEventQueue::B_STOP));//
56 q->AddEvent(media_timed_event(0x1003,BTimedEventQueue::B_START));//
57 q->AddEvent(media_timed_event(0x1000,BTimedEventQueue::B_SEEK));//
58 ASSERT(q->EventCount() == 12);
59 ASSERT(q->HasEvents() == true);
60
61 media_timed_event e1(0x1003,BTimedEventQueue::B_START);
62 q->RemoveEvent(&e1);
63 ASSERT(q->EventCount() == 11);
64 ASSERT(q->HasEvents() == true);
65
66 media_timed_event e2(0x1007,BTimedEventQueue::B_START);
67 q->RemoveEvent(&e2);
68 ASSERT(q->EventCount() == 10);
69 ASSERT(q->HasEvents() == true);
70
71 media_timed_event e3(0x1000,BTimedEventQueue::B_STOP);
72 q->RemoveEvent(&e3);
73 ASSERT(q->EventCount() == 9);
74 ASSERT(q->HasEvents() == true);
75
76 media_timed_event e4(0x1000,BTimedEventQueue::B_SEEK);
77 q->RemoveEvent(&e4);
78 ASSERT(q->EventCount() == 8);
79 ASSERT(q->HasEvents() == true);
80
81 //remove non existing element (time)
82 media_timed_event e5(0x1111,BTimedEventQueue::B_STOP);
83 q->RemoveEvent(&e5);
84 ASSERT(q->EventCount() == 8);
85 ASSERT(q->HasEvents() == true);
86
87 //remove non existing element (type)
88 media_timed_event e6(0x1011,BTimedEventQueue::B_STOP);
89 q->RemoveEvent(&e6);
90 ASSERT(q->EventCount() == 8);
91 ASSERT(q->HasEvents() == true);
92
93 media_timed_event e7(0x1000,BTimedEventQueue::B_START);
94 q->RemoveEvent(&e7);
95 ASSERT(q->EventCount() == 7);
96 ASSERT(q->HasEvents() == true);
97
98 media_timed_event e8(0x1011,BTimedEventQueue::B_START);
99 q->RemoveEvent(&e8);
100 ASSERT(q->EventCount() == 6);
101 ASSERT(q->HasEvents() == true);
102
103 media_timed_event e9(0x1002,BTimedEventQueue::B_START);
104 q->RemoveEvent(&e9);
105 ASSERT(q->EventCount() == 5);
106 ASSERT(q->HasEvents() == true);
107
108 media_timed_event e10(0x0777,BTimedEventQueue::B_START);
109 q->RemoveEvent(&e10);
110 ASSERT(q->EventCount() == 4);
111 ASSERT(q->HasEvents() == true);
112
113 media_timed_event e11(0x9999,BTimedEventQueue::B_STOP);
114 q->RemoveEvent(&e11);
115 ASSERT(q->EventCount() == 3);
116 ASSERT(q->HasEvents() == true);
117
118 media_timed_event e12(0x1006,BTimedEventQueue::B_START);
119 q->RemoveEvent(&e12);
120 ASSERT(q->EventCount() == 2);
121 ASSERT(q->HasEvents() == true);
122
123 media_timed_event e13(0x1001,BTimedEventQueue::B_START);
124 q->RemoveEvent(&e13);
125 ASSERT(q->EventCount() == 1);
126 ASSERT(q->HasEvents() == true);
127
128 media_timed_event e14(0x1005,BTimedEventQueue::B_START);
129 q->RemoveEvent(&e14);
130 ASSERT(q->EventCount() == 0);
131 ASSERT(q->HasEvents() == false);
132
133 delete q;
134 }
135
136 media_timed_event DoForEachEvent;
137 int DoForEachCount;
138
139 BTimedEventQueue::queue_action
DoForEachHook(media_timed_event * event,void * context)140 DoForEachHook(media_timed_event *event, void *context)
141 {
142 DoForEachEvent = *event;
143 DoForEachCount++;
144 printf("Callback, event_time = %x\n",int(event->event_time));
145 return BTimedEventQueue::B_NO_ACTION;
146 }
147
DoForEachTest()148 void DoForEachTest()
149 {
150 BTimedEventQueue *q =new BTimedEventQueue;
151 ASSERT(q->EventCount() == 0);
152 ASSERT(q->HasEvents() == false);
153
154 q->AddEvent(media_timed_event(0x1000,BTimedEventQueue::B_SEEK));
155 q->AddEvent(media_timed_event(0x1001,BTimedEventQueue::B_START));
156 q->AddEvent(media_timed_event(0x1002,BTimedEventQueue::B_START));
157 q->AddEvent(media_timed_event(0x1003,BTimedEventQueue::B_START));
158 q->AddEvent(media_timed_event(0x1010,BTimedEventQueue::B_START));
159 q->AddEvent(media_timed_event(0x1011,BTimedEventQueue::B_START));
160 q->AddEvent(media_timed_event(0x1012,BTimedEventQueue::B_START));
161 q->AddEvent(media_timed_event(0x1004,BTimedEventQueue::B_START));
162 q->AddEvent(media_timed_event(0x1005,BTimedEventQueue::B_START));
163 q->AddEvent(media_timed_event(0x1006,BTimedEventQueue::B_STOP));
164 q->AddEvent(media_timed_event(0x1007,BTimedEventQueue::B_START));
165 q->AddEvent(media_timed_event(0x1008,BTimedEventQueue::B_START));
166 q->AddEvent(media_timed_event(0x1009,BTimedEventQueue::B_START));
167 q->AddEvent(media_timed_event(0x1013,BTimedEventQueue::B_START));
168 q->AddEvent(media_timed_event(0x1013,BTimedEventQueue::B_START));
169 q->AddEvent(media_timed_event(0x1013,BTimedEventQueue::B_SEEK));
170 ASSERT(q->EventCount() == 16);
171 ASSERT(q->HasEvents() == true);
172
173
174 printf("\n expected: 0x1000\n");
175 DoForEachCount = 0;
176 q->DoForEach(DoForEachHook,(void*)1234,0x1000,BTimedEventQueue::B_AT_TIME);
177 ASSERT(DoForEachEvent == media_timed_event(0x1000,BTimedEventQueue::B_SEEK));
178 ASSERT(DoForEachCount == 1);
179
180
181 printf("\n expected: 0x1006\n");
182 DoForEachCount = 0;
183 q->DoForEach(DoForEachHook,(void*)1234,0x1006,BTimedEventQueue::B_AT_TIME);
184 ASSERT(DoForEachEvent == media_timed_event(0x1006,BTimedEventQueue::B_STOP));
185 ASSERT(DoForEachCount == 1);
186
187 printf("\n expected: 0x1013, 0x1013, 0x1013\n");
188 DoForEachCount = 0;
189 q->DoForEach(DoForEachHook,(void*)1234,0x1013,BTimedEventQueue::B_AT_TIME);
190 ASSERT(DoForEachCount == 3);
191
192 printf("\n expected: 0x1000, 0x1001, 0x1002\n");
193 DoForEachCount = 0;
194 q->DoForEach(DoForEachHook,(void*)1234,0x1003,BTimedEventQueue::B_BEFORE_TIME,false);
195 ASSERT(DoForEachCount == 3);
196
197 printf("\n expected: 0x1000, 0x1001, 0x1002, 0x1003\n");
198 DoForEachCount = 0;
199 q->DoForEach(DoForEachHook,(void*)1234,0x1003,BTimedEventQueue::B_BEFORE_TIME,true);
200 ASSERT(DoForEachCount == 4);
201
202 printf("\n expected: 0x1013, 0x1013, 0x1013\n");
203 DoForEachCount = 0;
204 q->DoForEach(DoForEachHook,(void*)1234,0x1012,BTimedEventQueue::B_AFTER_TIME,false);
205 ASSERT(DoForEachCount == 3);
206
207 printf("\n expected: 0x1012, 0x1013, 0x1013, 0x1013\n");
208 DoForEachCount = 0;
209 q->DoForEach(DoForEachHook,(void*)1234,0x1012,BTimedEventQueue::B_AFTER_TIME,true);
210 ASSERT(DoForEachCount == 4);
211
212 printf("\n expected: none\n");
213 DoForEachCount = 0;
214 q->DoForEach(DoForEachHook,(void*)1234,0x1013,BTimedEventQueue::B_AFTER_TIME,false);
215 ASSERT(DoForEachCount == 0);
216
217 printf("\n expected: 0x1013, 0x1013, 0x1013\n");
218 DoForEachCount = 0;
219 q->DoForEach(DoForEachHook,(void*)1234,0x1013,BTimedEventQueue::B_AFTER_TIME,true);
220 ASSERT(DoForEachCount == 3);
221
222 printf("\n expected: all 16\n");
223 DoForEachCount = 0;
224 q->DoForEach(DoForEachHook,(void*)1234,0x0,BTimedEventQueue::B_ALWAYS);
225 ASSERT(DoForEachCount == 16);
226
227 printf("\n expected: none\n");
228 DoForEachCount = 0;
229 q->DoForEach(DoForEachHook,(void*)1234,0x0,BTimedEventQueue::B_ALWAYS,false,BTimedEventQueue::B_WARP);
230 ASSERT(DoForEachCount == 0);
231
232 printf("\n expected: 0x1000, 0x1013\n");
233 DoForEachCount = 0;
234 q->DoForEach(DoForEachHook,(void*)1234,0x0,BTimedEventQueue::B_ALWAYS,false,BTimedEventQueue::B_SEEK);
235 ASSERT(DoForEachCount == 2);
236
237 printf("\n expected: 0x1000, 0x1013\n");
238 DoForEachCount = 0;
239 q->DoForEach(DoForEachHook,(void*)1234,0x0999,BTimedEventQueue::B_AFTER_TIME,false,BTimedEventQueue::B_SEEK);
240 ASSERT(DoForEachCount == 2);
241
242 printf("\n expected: 0x1000, 0x1013\n");
243 DoForEachCount = 0;
244 q->DoForEach(DoForEachHook,(void*)1234,0x1014,BTimedEventQueue::B_BEFORE_TIME,false,BTimedEventQueue::B_SEEK);
245 ASSERT(DoForEachCount == 2);
246
247 printf("\n expected: none\n");
248 DoForEachCount = 0;
249 q->DoForEach(DoForEachHook,(void*)1234,0x0004,BTimedEventQueue::B_BEFORE_TIME,true);
250 ASSERT(DoForEachCount == 0);
251
252 delete q;
253 }
254
MatchTest()255 void MatchTest()
256 {
257 BTimedEventQueue *q = new BTimedEventQueue;
258 ASSERT(q->EventCount() == 0);
259 ASSERT(q->HasEvents() == false);
260
261 q->AddEvent(media_timed_event(0x1000,BTimedEventQueue::B_SEEK));
262 q->AddEvent(media_timed_event(0x1001,BTimedEventQueue::B_START));
263 q->AddEvent(media_timed_event(0x1002,BTimedEventQueue::B_START));
264 q->AddEvent(media_timed_event(0x1003,BTimedEventQueue::B_START));
265 q->AddEvent(media_timed_event(0x1010,BTimedEventQueue::B_START));
266 q->AddEvent(media_timed_event(0x1011,BTimedEventQueue::B_START));
267 q->AddEvent(media_timed_event(0x1012,BTimedEventQueue::B_START));
268 q->AddEvent(media_timed_event(0x1004,BTimedEventQueue::B_START));
269 q->AddEvent(media_timed_event(0x1005,BTimedEventQueue::B_START));
270 q->AddEvent(media_timed_event(0x1006,BTimedEventQueue::B_STOP));
271 q->AddEvent(media_timed_event(0x1007,BTimedEventQueue::B_START));
272 q->AddEvent(media_timed_event(0x1008,BTimedEventQueue::B_START));
273 q->AddEvent(media_timed_event(0x1009,BTimedEventQueue::B_START));
274 q->AddEvent(media_timed_event(0x1013,BTimedEventQueue::B_START));
275 q->AddEvent(media_timed_event(0x1013,BTimedEventQueue::B_START));
276 q->AddEvent(media_timed_event(0x1013,BTimedEventQueue::B_SEEK));
277 ASSERT(q->EventCount() == 16);
278 ASSERT(q->HasEvents() == true);
279
280 printf("\nexpected: "); DumpEvent(media_timed_event(0x1006,BTimedEventQueue::B_STOP));
281 printf("found: "); DumpEvent(q->FindFirstMatch(0x1001,BTimedEventQueue::B_AFTER_TIME,true,BTimedEventQueue::B_STOP));
282
283 printf("\nexpected: "); DumpEvent(media_timed_event(0x1006,BTimedEventQueue::B_STOP));
284 printf("found: "); DumpEvent(q->FindFirstMatch(0x1006,BTimedEventQueue::B_AT_TIME,true));
285
286 printf("\nexpected: "); DumpEvent(media_timed_event(0x1006,BTimedEventQueue::B_STOP));
287 printf("found: "); DumpEvent(q->FindFirstMatch(0x1007,BTimedEventQueue::B_BEFORE_TIME,true,BTimedEventQueue::B_STOP));
288
289 printf("\nexpected: "); DumpEvent(media_timed_event(0x1000,BTimedEventQueue::B_SEEK));
290 printf("found: "); DumpEvent(q->FindFirstMatch(0x1006,BTimedEventQueue::B_BEFORE_TIME,true));
291
292 printf("\nexpected: "); DumpEvent(media_timed_event(0x1006,BTimedEventQueue::B_STOP));
293 printf("found: "); DumpEvent(q->FindFirstMatch(0x1006,BTimedEventQueue::B_AFTER_TIME,true));
294
295 printf("\nexpected: "); DumpEvent(0);
296 printf("found: "); DumpEvent(q->FindFirstMatch(0x1006,BTimedEventQueue::B_BEFORE_TIME,false,BTimedEventQueue::B_STOP));
297
298 printf("\nexpected: "); DumpEvent(0);
299 printf("found: "); DumpEvent(q->FindFirstMatch(0x1006,BTimedEventQueue::B_AFTER_TIME,false,BTimedEventQueue::B_STOP));
300
301 printf("\nexpected: "); DumpEvent(0);
302 printf("found: "); DumpEvent(q->FindFirstMatch(0x1006,BTimedEventQueue::B_AT_TIME,false,BTimedEventQueue::B_SEEK));
303
304 printf("\nexpected: "); DumpEvent(media_timed_event(0x1000,BTimedEventQueue::B_SEEK));
305 printf("found: "); DumpEvent(q->FindFirstMatch(0x1000,BTimedEventQueue::B_AFTER_TIME,true));
306
307 printf("\nexpected: "); DumpEvent(media_timed_event(0x1000,BTimedEventQueue::B_SEEK));
308 printf("found: "); DumpEvent(q->FindFirstMatch(0x1010,BTimedEventQueue::B_BEFORE_TIME,true));
309
310 printf("\nexpected: "); DumpEvent(media_timed_event(0x1000,BTimedEventQueue::B_SEEK));
311 printf("found: "); DumpEvent(q->FindFirstMatch(0x1007,BTimedEventQueue::B_BEFORE_TIME,false));
312
313 printf("\nexpected: "); DumpEvent(media_timed_event(0x1013,BTimedEventQueue::B_SEEK));
314 printf("found: "); DumpEvent(q->FindFirstMatch(0x1001,BTimedEventQueue::B_AFTER_TIME,false,BTimedEventQueue::B_SEEK));
315
316 printf("\nexpected: "); DumpEvent(media_timed_event(0x1010,BTimedEventQueue::B_START));
317 printf("found: "); DumpEvent(q->FindFirstMatch(0x1009,BTimedEventQueue::B_AFTER_TIME,false));
318
319 printf("\nexpected: "); DumpEvent(media_timed_event(0x1010,BTimedEventQueue::B_START));
320 printf("found: "); DumpEvent(q->FindFirstMatch(0x1010,BTimedEventQueue::B_AFTER_TIME,true));
321
322 printf("\nexpected: "); DumpEvent(media_timed_event(0x1010,BTimedEventQueue::B_START));
323 printf("found: "); DumpEvent(q->FindFirstMatch(0x1010,BTimedEventQueue::B_AT_TIME,true));
324
325 delete q;
326 }
327
FlushTest()328 void FlushTest()
329 {
330 BTimedEventQueue *q = new BTimedEventQueue;
331 ASSERT(q->EventCount() == 0);
332 ASSERT(q->HasEvents() == false);
333
334 q->AddEvent(media_timed_event(0x1000,BTimedEventQueue::B_SEEK));
335 q->AddEvent(media_timed_event(0x1001,BTimedEventQueue::B_START));
336 q->AddEvent(media_timed_event(0x1002,BTimedEventQueue::B_START));
337 q->AddEvent(media_timed_event(0x1003,BTimedEventQueue::B_START));
338 q->AddEvent(media_timed_event(0x1004,BTimedEventQueue::B_START));
339 q->AddEvent(media_timed_event(0x1005,BTimedEventQueue::B_START));
340 q->AddEvent(media_timed_event(0x1006,BTimedEventQueue::B_STOP));
341 q->AddEvent(media_timed_event(0x1007,BTimedEventQueue::B_START));
342 q->AddEvent(media_timed_event(0x1008,BTimedEventQueue::B_START));
343 q->AddEvent(media_timed_event(0x1009,BTimedEventQueue::B_START));
344 q->AddEvent(media_timed_event(0x1010,BTimedEventQueue::B_START));
345 q->AddEvent(media_timed_event(0x1011,BTimedEventQueue::B_START));
346 q->AddEvent(media_timed_event(0x1012,BTimedEventQueue::B_START));
347 q->AddEvent(media_timed_event(0x1013,BTimedEventQueue::B_START));
348 q->AddEvent(media_timed_event(0x1013,BTimedEventQueue::B_START));
349 q->AddEvent(media_timed_event(0x1013,BTimedEventQueue::B_SEEK));
350 ASSERT(q->EventCount() == 16);
351 ASSERT(q->HasEvents() == true);
352
353 printf("### removing 0x1007\n");
354 q->FlushEvents(0x1007, BTimedEventQueue::B_AT_TIME);
355 ASSERT(q->EventCount() == 15);
356
357 printf("### removing 0x1013\n");
358 q->FlushEvents(0x1012, BTimedEventQueue::B_AFTER_TIME,false);
359 ASSERT(q->EventCount() == 12);
360
361 printf("### removing none\n");
362 q->FlushEvents(0x1fff, BTimedEventQueue::B_AFTER_TIME,false);
363 ASSERT(q->EventCount() == 12);
364
365 printf("### removing none\n");
366 q->FlushEvents(0x1fff, BTimedEventQueue::B_AFTER_TIME,true);
367 ASSERT(q->EventCount() == 12);
368
369 printf("### removing 0x1010, 0x1011, 0x1012\n");
370 q->FlushEvents(0x1010, BTimedEventQueue::B_AFTER_TIME,true);
371 ASSERT(q->EventCount() == 9);
372
373 printf("### removing 0x1000 to 0x1005\n");
374 q->FlushEvents(0x1006, BTimedEventQueue::B_BEFORE_TIME,false);
375 ASSERT(q->EventCount() == 3);
376
377 printf("### removing 0x1006\n");
378 q->FlushEvents(0x1006, BTimedEventQueue::B_AT_TIME);
379 ASSERT(q->EventCount() == 2);
380
381 printf("### removing 0x1008 0x1009\n");
382 q->FlushEvents(0xffffff, BTimedEventQueue::B_BEFORE_TIME);
383 ASSERT(q->EventCount() == 0);
384
385 delete q;
386 }
387
388
main()389 int main()
390 {
391 InsertRemoveTest();
392 DoForEachTest();
393 MatchTest();
394 FlushTest();
395 return 0;
396 }
397