1#include <OS.h>
2#include <File.h>
3#include <stdio.h>
4#include <DataIO.h>
5#include <string.h>
6#include "MediaPlugin.h"
7#include "ReaderPlugin.h"
8#include "FileDataIO.h"
9
10const bool		SEEKABLE = 1;
11const char *	FILENAME = "/boot/home/Desktop/mediastuff/test1.wav";
12
13#define TRACE_THIS 1
14#if TRACE_THIS
15  #define TRACE printf
16#else
17  #define TRACE ((void)0)
18#endif
19
20void *cookies[100];
21
22int main(int argc, char *argv[])
23{
24	TRACE("\n\n");
25
26	TRACE("main: creating plugin...\n");
27
28	MediaPlugin *plugin = instantiate_plugin();
29
30	TRACE("main: creating reader...\n");
31
32	ReaderPlugin *readerplugin;
33	readerplugin = dynamic_cast<ReaderPlugin *>(plugin);
34
35	Reader *reader = readerplugin->NewReader();
36
37	TRACE("main: opening source file...\n");
38
39	BDataIO *source;
40	if (SEEKABLE)
41		source = new BFile(argc == 2 ? argv[1] : FILENAME, O_RDWR);
42	else
43		source = new FileDataIO(argc == 2 ? argv[1] : FILENAME, O_RDWR);
44
45	TRACE("main: calling setup...\n");
46
47	reader->Setup(source);
48
49	TRACE("main: creating ...\n");
50
51	TRACE("main: copyright: \"%s\"\n", reader->Copyright());
52
53	status_t s;
54	int32 streamCount;
55
56	s = reader->Sniff(&streamCount);
57	if (s != B_OK) {
58		TRACE("main: Sniff() failed with error %lx (%s)\n", s, strerror(s));
59		goto err;
60	}
61
62	TRACE("main: Sniff() found %ld streams\n", streamCount);
63
64
65	for (int i = 0; i < streamCount; i++) {
66		TRACE("main: calling AllocateCookie(stream = %d)\n", i);
67		s = reader->AllocateCookie(i, &cookies[i]);
68		if (s != B_OK) {
69			TRACE("main: AllocateCookie(stream = %d) failed with error %lx (%s)\n", i,  s, strerror(s));
70			goto err;
71		}
72	}
73
74	for (int i = 0; i < streamCount; i++) {
75		TRACE("main: calling GetStreamInfo(stream = %d)\n", i);
76		int64 frameCount;
77		bigtime_t duration;
78		media_format format;
79		const void *infoBuffer;
80		size_t infoSize;
81		s = reader->GetStreamInfo(cookies[i], &frameCount, &duration, &format, &infoBuffer, &infoSize);
82		if (s != B_OK) {
83			TRACE("main: GetStreamInfo(stream = %d) failed with error %lx (%s)\n", i,  s, strerror(s));
84			goto err;
85		}
86		TRACE("main: GetStreamInfo(stream = %d) result: %lld frames, %.6f sec\n", i, frameCount, duration / 1000000.0);
87	}
88
89	for (int i = 0; i < streamCount; i++) {
90		const void *chunkBuffer;
91		size_t chunkSize;
92		media_header mediaHeader;
93		for (int j = 0; j < 5; j++) {
94			s = reader->GetNextChunk(cookies[i], &chunkBuffer, &chunkSize, &mediaHeader);
95			if (s != B_OK) {
96				TRACE("main: GetNextChunk(stream = %d, chunk = %d) failed with error %lx (%s)\n", i, j,  s, strerror(s));
97				break;
98			}
99		}
100
101		int64 frame;
102		bigtime_t time;
103
104		time = 1000000; // 1 sec
105		TRACE("main: calling Seek(stream = %d, time %.6f forward)\n", i, time / 1000000.0);
106		s = reader->Seek(cookies[i], B_MEDIA_SEEK_TO_TIME | B_MEDIA_SEEK_CLOSEST_FORWARD, &frame, &time);
107		TRACE("main: Seek result: time %.6f, frame %lld\n", time / 1000000.0, frame);
108
109		frame = 1000;
110		TRACE("main: calling Seek(stream = %d, frame %lld forward)\n", i, frame);
111		s = reader->Seek(cookies[i], B_MEDIA_SEEK_TO_FRAME | B_MEDIA_SEEK_CLOSEST_FORWARD, &frame, &time);
112		TRACE("main: Seek result: time %.6f, frame %lld\n", time / 1000000.0, frame);
113
114		time = 1000000; // 1 sec
115		TRACE("main: calling Seek(stream = %d, time %.6f backward)\n", i, time / 1000000.0);
116		s = reader->Seek(cookies[i], B_MEDIA_SEEK_TO_TIME | B_MEDIA_SEEK_CLOSEST_BACKWARD, &frame, &time);
117		TRACE("main: Seek result: time %.6f, frame %lld\n", time / 1000000.0, frame);
118
119		frame = 1000;
120		TRACE("main: calling Seek(stream = %d, frame %lld backward)\n", i, frame);
121		s = reader->Seek(cookies[i], B_MEDIA_SEEK_TO_FRAME | B_MEDIA_SEEK_CLOSEST_BACKWARD, &frame, &time);
122		TRACE("main: Seek result: time %.6f, frame %lld\n", time / 1000000.0, frame);
123	}
124
125	for (int i = 0; i < streamCount; i++) {
126		TRACE("main: calling FreeCookie(stream = %d)\n", i);
127		s = reader->FreeCookie(cookies[i]);
128		if (s != B_OK) {
129			TRACE("main: FreeCookie(stream = %d) failed with error %lx (%s)\n", i,  s, strerror(s));
130			goto err;
131		}
132	}
133
134err:
135	delete reader;
136	delete plugin;
137	delete source;
138	return 0;
139}
140
141status_t
142_get_format_for_description(media_format *out_format, const media_format_description &in_desc)
143{
144	return B_OK;
145}
146