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