1#include <Application.h>
2#include <MediaDefs.h>
3#include <MediaRoster.h>
4#include <TimeSource.h>
5
6#include <string.h>
7
8#include "ConsumerNode.h"
9#include "misc.h"
10#include "ProducerNode.h"
11
12
13BMediaRoster *roster;
14ProducerNode *producer;
15ConsumerNode *consumer;
16status_t rv;
17
18int main()
19{
20	out("Basic BBufferProducer, BBufferConsumer, BMediaRoster test\n");
21	out("for Haiku by Marcus Overhagen <Marcus@Overhagen.de>\n\n");
22	out("Creating BApplication now\n");
23	BApplication app("application/x-vnd.OpenBeOS-NodeTest");
24
25	out("Creating MediaRoster\n");
26	roster = BMediaRoster::Roster();
27	val(roster);
28
29	out("Creating ProducerNode\n");
30	producer = new ProducerNode();
31	val(producer);
32
33	out("Creating ConsumerNode\n");
34	consumer = new ConsumerNode();
35	val(consumer);
36
37	out("Registering ProducerNode\n");
38	rv = roster->RegisterNode(producer);
39	val(rv);
40
41	out("Registering ConsumerNode\n");
42	rv = roster->RegisterNode(consumer);
43	val(rv);
44
45	media_node sourceNode;
46	media_node destinationNode;
47
48	out("Calling producer->Node()\n");
49	sourceNode = producer->Node();
50
51	out("Calling consumer->Node()\n");
52	destinationNode = consumer->Node();
53
54
55	live_node_info live_nodes[100];
56	int32 live_count;
57	media_format liveformat;
58	memset(&liveformat, 0, sizeof(liveformat));
59
60	liveformat.type = B_MEDIA_RAW_AUDIO;
61
62	out("Calling GetLiveNodes(), has_input = B_MEDIA_RAW_AUDIO\n");
63	live_count = 100;
64	rv = roster->GetLiveNodes(live_nodes, &live_count, &liveformat);
65	val(rv);
66	out("Found %ld\n",live_count);
67
68	out("Calling GetLiveNodes(), has_output = B_MEDIA_RAW_AUDIO\n");
69	live_count = 100;
70	rv = roster->GetLiveNodes(live_nodes, &live_count, NULL, &liveformat);
71	val(rv);
72	out("Found %ld\n",live_count);
73
74	out("Calling GetLiveNodes(), has_input = has_output = B_MEDIA_RAW_AUDIO\n");
75	live_count = 100;
76	rv = roster->GetLiveNodes(live_nodes, &live_count, &liveformat, &liveformat);
77	val(rv);
78	out("Found %ld\n",live_count);
79
80	liveformat.type = B_MEDIA_RAW_VIDEO;
81
82	out("Calling GetLiveNodes(), has_input = B_MEDIA_RAW_VIDEO\n");
83	live_count = 100;
84	rv = roster->GetLiveNodes(live_nodes, &live_count, &liveformat);
85	val(rv);
86	out("Found %ld\n",live_count);
87
88	out("Calling GetLiveNodes(), has_output = B_MEDIA_RAW_VIDEO\n");
89	live_count = 100;
90	rv = roster->GetLiveNodes(live_nodes, &live_count, NULL, &liveformat);
91	val(rv);
92	out("Found %ld\n",live_count);
93
94	out("Calling GetLiveNodes(), has_input = has_output = B_MEDIA_RAW_VIDEO\n");
95	live_count = 100;
96	rv = roster->GetLiveNodes(live_nodes, &live_count, &liveformat, &liveformat);
97	val(rv);
98	out("Found %ld\n",live_count);
99
100
101	media_output output;
102	media_input input;
103	media_output outputs[2];
104	media_input inputs[2];
105	int32 count;
106
107	out("Calling GetAllOutputsFor(source)\n");
108	rv = roster->GetAllOutputsFor(sourceNode,outputs,2,&count);
109	val(rv);
110	out("Found %ld\n",count);
111	rv = (count == 1) ? B_OK : B_ERROR;
112	val(rv);
113
114	out("Calling GetAllInputsFor(destination)\n");
115	rv = roster->GetAllInputsFor(destinationNode,inputs,2,&count);
116	val(rv);
117	out("Found %ld\n",count);
118	rv = (count == 1) ? B_OK : B_ERROR;
119	val(rv);
120
121	out("Calling GetAllInputsFor(source) (should fail)\n");
122	rv = roster->GetAllInputsFor(sourceNode,inputs,2,&count);
123	val(rv);
124	out("Found %ld\n",count);
125
126	out("Calling GetAllOutputsFor(destination) (should fail)\n");
127	rv = roster->GetAllOutputsFor(destinationNode,outputs,2,&count);
128	val(rv);
129	out("Found %ld\n",count);
130
131	out("Calling GetConnectedOutputsFor(source)\n");
132	rv = roster->GetConnectedOutputsFor(sourceNode,outputs,2,&count);
133	val(rv);
134	out("Found %ld\n",count);
135	rv = (count == 0) ? B_OK : B_ERROR;
136	val(rv);
137
138	out("Calling GetConnectedInputsFor(destination)\n");
139	rv = roster->GetConnectedInputsFor(destinationNode,inputs,2,&count);
140	val(rv);
141	out("Found %ld\n",count);
142	rv = (count == 0) ? B_OK : B_ERROR;
143	val(rv);
144
145	out("Calling GetConnectedInputsFor(source) (should fail)\n");
146	rv = roster->GetConnectedInputsFor(sourceNode,inputs,2,&count);
147	val(rv);
148	out("Found %ld\n",count);
149
150	out("Calling GetConnectedOutputsFor(destination) (should fail)\n");
151	rv = roster->GetConnectedOutputsFor(destinationNode,outputs,2,&count);
152	val(rv);
153	out("Found %ld\n",count);
154
155	out("Calling GetFreeOutputsFor(source)\n");
156	rv = roster->GetFreeOutputsFor(sourceNode,&output,1,&count,B_MEDIA_RAW_AUDIO);
157	val(rv);
158	out("Found %ld\n",count);
159	rv = (count == 1) ? B_OK : B_ERROR;
160	val(rv);
161
162	out("Calling GetFreeInputsFor(destination)\n");
163	rv = roster->GetFreeInputsFor(destinationNode,&input,1,&count,B_MEDIA_RAW_AUDIO);
164	val(rv);
165	out("Found %ld\n",count);
166	rv = (count == 1) ? B_OK : B_ERROR;
167	val(rv);
168
169	out("Calling GetFreeOutputsFor(destination) (should fail)\n");
170	rv = roster->GetFreeOutputsFor(destinationNode,outputs,2,&count,B_MEDIA_RAW_AUDIO);
171	val(rv);
172	out("Found %ld\n",count);
173
174	out("Calling GetFreeInputsFor(source) (should fail)\n");
175	rv = roster->GetFreeInputsFor(sourceNode,inputs,2,&count,B_MEDIA_RAW_AUDIO);
176	val(rv);
177	out("Found %ld\n",count);
178
179	out("Calling GetAttNodeAttributesFor(source)\n");
180	media_node_attribute attr[10];
181	ssize_t size = roster->GetNodeAttributesFor(sourceNode, attr, 10);
182	val_size(size);
183	out("Found %" B_PRIdSSIZE "\n", size);
184
185	media_format format;
186	format.type = B_MEDIA_RAW_AUDIO;
187	format.u.raw_audio = media_raw_audio_format::wildcard;
188
189	out("Connecting nodes\n");
190	rv = roster->Connect(output.source, input.destination, &format, &output, &input);
191	val(rv);
192
193	out("Prerolling Producer()\n");
194	rv = roster->PrerollNode(sourceNode);
195	val(rv);
196
197	out("Prerolling Consumer\n");
198	rv = roster->PrerollNode(destinationNode);
199	val(rv);
200
201	bigtime_t time1;
202	bigtime_t time2;
203	bigtime_t start;
204
205	out("Getting Producer startlatency\n");
206	rv = roster->GetStartLatencyFor(destinationNode, &time1);
207	val(rv);
208
209	out("Getting Consumer startlatency\n");
210	rv = roster->GetStartLatencyFor(sourceNode, &time2);
211	val(rv);
212
213	start = max_c(time1,time2) + producer->TimeSource()->PerformanceTimeFor(BTimeSource::RealTime() + 2000000);
214
215	out("Starting Consumer in 2 sec\n");
216	rv = roster->StartNode(destinationNode, start);
217	val(rv);
218
219	out("Starting Producer in 2 sec\n");
220	rv = roster->StartNode(sourceNode, start);
221	val(rv);
222
223	out("Testing SyncToNode performance time set is 5 sec\n");
224	rv = roster->SyncToNode(sourceNode,
225		producer->TimeSource()->PerformanceTimeFor(
226			BTimeSource::RealTime() + 5000000), B_INFINITE_TIMEOUT);
227	val(rv);
228
229	out("########################## PRESS ENTER TO QUIT ##########################\n");
230	getchar();
231
232	media_node_id sourceNodeID;
233	media_node_id destinationNodeID;
234
235	out("Calling producer->ID()\n");
236	sourceNodeID = producer->ID();
237
238	out("Calling consumer->ID()\n");
239	destinationNodeID = consumer->ID();
240
241	out("Stopping Producer()\n");
242	rv = roster->StopNode(sourceNode, 0, true);
243	val(rv);
244
245	out("Stopping Consumer\n");
246	rv = roster->StopNode(destinationNode, 0, true);
247	val(rv);
248
249	out("Disconnecting nodes\n");
250	rv = roster->Disconnect(sourceNodeID, output.source, destinationNodeID, input.destination);
251	val(rv);
252
253	out("Unregistering ProducerNode\n");
254	rv = roster->UnregisterNode(producer);
255	val(rv);
256
257	out("Unregistering ConsumerNode\n");
258	rv = roster->UnregisterNode(consumer);
259	val(rv);
260
261	out("Releasing ProducerNode\n");
262	rv = (producer->Release() == NULL) ? B_OK : B_ERROR;
263	val(rv);
264
265	out("Releasing ConsumerNode\n");
266	rv = (consumer->Release() == NULL) ? B_OK : B_ERROR;
267	val(rv);
268
269	return 0;
270}
271
272