xref: /haiku/src/servers/midi/MidiServerApp.h (revision 8f279618017d491e8f5c1cefb663581ea73d8f52)
176bb8030Smahlzeit /*
283f803c6SAxel Dörfler  * Copyright 2002-2015, Haiku, Inc. All rights reserved.
35b2d7337SPhilippe Houdoin  * Distributed under the terms of the MIT License.
4263f2c60Smahlzeit  *
55b2d7337SPhilippe Houdoin  * Authors:
65b2d7337SPhilippe Houdoin  *		Matthijs Hollemans
77c27cd32Smahlzeit  */
837192de9Smahlzeit #ifndef MIDI_SERVER_APP_H
937192de9Smahlzeit #define MIDI_SERVER_APP_H
1037192de9Smahlzeit 
1183f803c6SAxel Dörfler 
12*8f279618SAxel Dörfler #include <Server.h>
1353284a9fSmahlzeit #include <List.h>
1437192de9Smahlzeit 
1594d1c0eaSmahlzeit #include "DeviceWatcher.h"
1694d1c0eaSmahlzeit 
1783f803c6SAxel Dörfler 
1853284a9fSmahlzeit struct app_t;
1953284a9fSmahlzeit struct endpoint_t;
2027d74562Smahlzeit 
2153284a9fSmahlzeit 
2283f803c6SAxel Dörfler /*!	The heart of the midi_server. This BApplication subclass
2383f803c6SAxel Dörfler 	keeps the roster of endpoints and applications, processes
2483f803c6SAxel Dörfler 	incoming messages from libmidi2.so, and notifies the apps
2583f803c6SAxel Dörfler 	when something interesting happens.
2683f803c6SAxel Dörfler */
27*8f279618SAxel Dörfler class MidiServerApp : public BServer {
2883f803c6SAxel Dörfler public:
29*8f279618SAxel Dörfler 								MidiServerApp(status_t& error);
3027d74562Smahlzeit 	virtual						~MidiServerApp();
3127d74562Smahlzeit 
3237192de9Smahlzeit 	virtual	void				AboutRequested();
3327d74562Smahlzeit 	virtual	void				MessageReceived(BMessage* msg);
3496462df1Sjerl1 
3596462df1Sjerl1 private:
36*8f279618SAxel Dörfler 	typedef BServer super;
3727d74562Smahlzeit 
3883f803c6SAxel Dörfler 			void				_OnRegisterApp(BMessage* msg);
3983f803c6SAxel Dörfler 			void				_OnCreateEndpoint(BMessage* msg);
4083f803c6SAxel Dörfler 			void				_OnDeleteEndpoint(BMessage* msg);
4183f803c6SAxel Dörfler 			void				_OnPurgeEndpoint(BMessage* msg);
4283f803c6SAxel Dörfler 			void				_OnChangeEndpoint(BMessage* msg);
4383f803c6SAxel Dörfler 			void				_OnConnectDisconnect(BMessage* msg);
4453284a9fSmahlzeit 
4583f803c6SAxel Dörfler 			bool				_SendAllEndpoints(app_t* app);
4683f803c6SAxel Dörfler 			bool				_SendAllConnections(app_t* app);
4753284a9fSmahlzeit 
4883f803c6SAxel Dörfler 			void				_AddEndpoint(BMessage* msg, endpoint_t* endp);
4983f803c6SAxel Dörfler 			void				_RemoveEndpoint(app_t* app, endpoint_t* endp);
5053284a9fSmahlzeit 
5183f803c6SAxel Dörfler 			void				_DisconnectDeadConsumer(endpoint_t* cons);
5253284a9fSmahlzeit 
5383f803c6SAxel Dörfler 			void				_MakeCreatedNotification(BMessage* msg,
5483f803c6SAxel Dörfler 									endpoint_t* endp);
5583f803c6SAxel Dörfler 			void				_MakeConnectedNotification(BMessage* msg,
5683f803c6SAxel Dörfler 									endpoint_t* prod, endpoint_t* cons,
5783f803c6SAxel Dörfler 									bool mustConnect);
5853284a9fSmahlzeit 
5983f803c6SAxel Dörfler 			app_t*				_WhichApp(BMessage* msg);
6083f803c6SAxel Dörfler 			endpoint_t*			_WhichEndpoint(BMessage* msg, app_t* app);
6183f803c6SAxel Dörfler 			endpoint_t*			_FindEndpoint(int32 id);
6253284a9fSmahlzeit 
6383f803c6SAxel Dörfler 			void				_NotifyAll(BMessage* msg, app_t* except);
6483f803c6SAxel Dörfler 			bool				_SendNotification(app_t* app, BMessage* msg);
6583f803c6SAxel Dörfler 			bool				_SendReply(app_t* app, BMessage* msg,
6683f803c6SAxel Dörfler 									BMessage* reply);
6753284a9fSmahlzeit 
6883f803c6SAxel Dörfler 			void				_DeliveryError(app_t* app);
6953284a9fSmahlzeit 
7083f803c6SAxel Dörfler 			int32				_CountApps();
7183f803c6SAxel Dörfler 			app_t*				_AppAt(int32 index);
7253284a9fSmahlzeit 
7383f803c6SAxel Dörfler 			int32				_CountEndpoints();
7483f803c6SAxel Dörfler 			endpoint_t*			_EndpointAt(int32 index);
7553284a9fSmahlzeit 
7683f803c6SAxel Dörfler 			int32				_CountConnections(endpoint_t* prod);
7783f803c6SAxel Dörfler 			endpoint_t*			_ConnectionAt(endpoint_t* prod, int32 index);
7894d1c0eaSmahlzeit 
7953284a9fSmahlzeit #ifdef DEBUG
8083f803c6SAxel Dörfler 			void				_DumpApps();
8183f803c6SAxel Dörfler 			void				_DumpEndpoints();
8253284a9fSmahlzeit #endif
8383f803c6SAxel Dörfler 
8483f803c6SAxel Dörfler private:
8583f803c6SAxel Dörfler 	//! The registered applications.
8683f803c6SAxel Dörfler 			BList				fApps;
8783f803c6SAxel Dörfler 
8883f803c6SAxel Dörfler 	//! All the endpoints in the system.
8983f803c6SAxel Dörfler 			BList				fEndpoints;
9083f803c6SAxel Dörfler 
9183f803c6SAxel Dörfler 	//! The ID we will assign to the next new endpoint.
9283f803c6SAxel Dörfler 			int32				fNextID;
9383f803c6SAxel Dörfler 
9483f803c6SAxel Dörfler 	//! Watch endpoints from /dev/midi drivers.
9583f803c6SAxel Dörfler 			DeviceWatcher*		fDeviceWatcher;
9637192de9Smahlzeit };
9737192de9Smahlzeit 
9883f803c6SAxel Dörfler 
9937192de9Smahlzeit #endif // MIDI_SERVER_APP_H
100