* Cleaned up the node manager, got rid of its use of Map, and List.
* Fixed at least two reference counting problems, but nodes from killed teams still remain alive (will look into this at a later point). * GetLiveNodes() is now using transfer_area() as well. * Made all sizes in the SendTo*() and Query*() functions size_t. * Replaced reinterpret_casts with static_casts when casting void pointers. * Ordered the request/reply structures by target. * Tried to consolidate the use of add_on vs. addon. * More cleanup. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34591 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -27,24 +27,24 @@ struct request_data;
|
||||
struct command_data;
|
||||
|
||||
// BMessage based data exchange with the media_server
|
||||
status_t SendToServer(BMessage *msg);
|
||||
status_t QueryServer(BMessage &request, BMessage &reply);
|
||||
status_t SendToServer(BMessage* msg);
|
||||
status_t QueryServer(BMessage& request, BMessage& reply);
|
||||
|
||||
// Raw data based data exchange with the media_server
|
||||
status_t SendToServer(int32 msgcode, command_data *msg, int size);
|
||||
status_t QueryServer(int32 msgcode, request_data *request, int requestsize,
|
||||
reply_data *reply, int replysize);
|
||||
status_t SendToServer(int32 msgCode, command_data* msg, size_t size);
|
||||
status_t QueryServer(int32 msgCode, request_data* request, size_t requestSize,
|
||||
reply_data* reply, size_t replySize);
|
||||
|
||||
// Raw data based data exchange with the media_addon_server
|
||||
status_t SendToAddonServer(int32 msgcode, command_data *msg, int size);
|
||||
status_t QueryAddonServer(int32 msgcode, request_data *request, int requestSize,
|
||||
reply_data *reply, int replysize);
|
||||
status_t SendToAddOnServer(int32 msgCode, command_data *msg, size_t size);
|
||||
status_t QueryAddOnServer(int32 msgCode, request_data* request,
|
||||
size_t requestSize, reply_data* reply, size_t replySize);
|
||||
|
||||
// Raw data based data exchange with any (media node control-) port
|
||||
status_t SendToPort(port_id sendport, int32 msgcode, command_data *msg,
|
||||
int size);
|
||||
status_t QueryPort(port_id requestport, int32 msgcode, request_data *request,
|
||||
int requestsize, reply_data *reply, int replysize);
|
||||
status_t SendToPort(port_id sendPort, int32 msgCode, command_data* msg,
|
||||
size_t size);
|
||||
status_t QueryPort(port_id requestPort, int32 msgCode, request_data* request,
|
||||
size_t requestSize, reply_data* reply, size_t replySize);
|
||||
|
||||
// The base struct used for all raw requests
|
||||
struct request_data {
|
||||
@@ -104,14 +104,14 @@ enum {
|
||||
// add_system_beep_event()
|
||||
MEDIA_SERVER_ADD_SYSTEM_BEEP_EVENT,
|
||||
|
||||
// media addon server
|
||||
MEDIA_ADDON_SERVER_PLAY_MEDIA = '_TRU'
|
||||
// media add-on server
|
||||
MEDIA_ADD_ON_SERVER_PLAY_MEDIA = '_TRU'
|
||||
};
|
||||
|
||||
// Raw port based communication
|
||||
enum {
|
||||
ADDONSERVER_RESCAN_MEDIAADDON_FLAVORS = 0x50,
|
||||
ADDONSERVER_RESCAN_FINISHED_NOTIFY,
|
||||
ADD_ON_SERVER_RESCAN_ADD_ON_FLAVORS = 0x50,
|
||||
ADD_ON_SERVER_RESCAN_FINISHED_NOTIFY,
|
||||
|
||||
SERVER_MESSAGE_START = 0x100,
|
||||
SERVER_REGISTER_APP,
|
||||
@@ -134,7 +134,7 @@ enum {
|
||||
SERVER_UNREGISTER_BUFFER,
|
||||
SERVER_RESCAN_DEFAULTS,
|
||||
SERVER_SET_NODE_CREATOR,
|
||||
SERVER_CHANGE_ADDON_FLAVOR_INSTANCES_COUNT,
|
||||
SERVER_CHANGE_FLAVOR_INSTANCES_COUNT,
|
||||
SERVER_GET_MEDIA_FILE_TYPES,
|
||||
SERVER_GET_MEDIA_FILE_ITEMS,
|
||||
SERVER_GET_REF_FOR,
|
||||
@@ -294,16 +294,31 @@ enum {
|
||||
MAX_READERS = 40,
|
||||
};
|
||||
|
||||
struct addonserver_instantiate_dormant_node_request : request_data {
|
||||
media_addon_id addon_id;
|
||||
|
||||
// #pragma mark - media add-on server commands
|
||||
|
||||
|
||||
struct add_on_server_instantiate_dormant_node_request : request_data {
|
||||
media_addon_id add_on_id;
|
||||
int32 flavor_id;
|
||||
team_id creator_team;
|
||||
};
|
||||
|
||||
struct addonserver_instantiate_dormant_node_reply : reply_data {
|
||||
struct add_on_server_instantiate_dormant_node_reply : reply_data {
|
||||
media_node node;
|
||||
};
|
||||
|
||||
struct add_on_server_rescan_flavors_command : command_data {
|
||||
media_addon_id add_on_id;
|
||||
};
|
||||
|
||||
struct add_on_server_rescan_finished_notify_command : command_data {
|
||||
};
|
||||
|
||||
|
||||
// #pragma mark - media server commands
|
||||
|
||||
|
||||
struct server_set_node_request : request_data {
|
||||
node_type type;
|
||||
bool use_node;
|
||||
@@ -330,158 +345,6 @@ struct server_get_node_reply : public reply_data {
|
||||
int32 input_id;
|
||||
};
|
||||
|
||||
struct producer_format_proposal_request : public request_data {
|
||||
media_source output;
|
||||
media_format format;
|
||||
};
|
||||
|
||||
struct producer_format_proposal_reply : reply_data {
|
||||
media_format format;
|
||||
};
|
||||
|
||||
struct producer_prepare_to_connect_request : request_data {
|
||||
media_source source;
|
||||
media_destination destination;
|
||||
media_format format;
|
||||
char name[B_MEDIA_NAME_LENGTH];
|
||||
};
|
||||
|
||||
struct producer_prepare_to_connect_reply : reply_data {
|
||||
media_format format;
|
||||
media_source out_source;
|
||||
char name[B_MEDIA_NAME_LENGTH];
|
||||
};
|
||||
|
||||
struct producer_connect_request : request_data {
|
||||
status_t error;
|
||||
media_source source;
|
||||
media_destination destination;
|
||||
media_format format;
|
||||
char name[B_MEDIA_NAME_LENGTH];
|
||||
};
|
||||
|
||||
struct producer_connect_reply : reply_data {
|
||||
char name[B_MEDIA_NAME_LENGTH];
|
||||
};
|
||||
|
||||
struct producer_disconnect_request : request_data {
|
||||
media_source source;
|
||||
media_destination destination;
|
||||
};
|
||||
|
||||
struct producer_disconnect_reply : reply_data {
|
||||
};
|
||||
|
||||
struct producer_format_suggestion_requested_request : request_data {
|
||||
media_type type;
|
||||
int32 quality;
|
||||
};
|
||||
|
||||
struct producer_format_suggestion_requested_reply : reply_data {
|
||||
media_format format;
|
||||
};
|
||||
|
||||
struct producer_set_play_rate_request : request_data {
|
||||
int32 numer;
|
||||
int32 denom;
|
||||
};
|
||||
|
||||
struct producer_set_play_rate_reply : reply_data {
|
||||
};
|
||||
|
||||
struct producer_get_initial_latency_request : request_data {
|
||||
};
|
||||
|
||||
struct producer_get_initial_latency_reply : reply_data {
|
||||
bigtime_t initial_latency;
|
||||
uint32 flags;
|
||||
};
|
||||
|
||||
struct producer_get_latency_request : request_data {
|
||||
};
|
||||
|
||||
struct producer_get_latency_reply : reply_data {
|
||||
bigtime_t latency;
|
||||
};
|
||||
|
||||
struct producer_set_buffer_group_command : command_data {
|
||||
media_source source;
|
||||
media_destination destination;
|
||||
void* user_data;
|
||||
int32 change_tag;
|
||||
int32 buffer_count;
|
||||
media_buffer_id buffers[1];
|
||||
};
|
||||
|
||||
struct producer_format_change_requested_command : command_data {
|
||||
media_source source;
|
||||
media_destination destination;
|
||||
media_format format;
|
||||
void* user_data;
|
||||
int32 change_tag;
|
||||
};
|
||||
|
||||
struct producer_video_clipping_changed_command : command_data {
|
||||
media_source source;
|
||||
media_destination destination;
|
||||
media_video_display_info display;
|
||||
void* user_data;
|
||||
int32 change_tag;
|
||||
int32 short_count;
|
||||
int16 shorts[1];
|
||||
};
|
||||
|
||||
struct producer_additional_buffer_requested_command : command_data {
|
||||
media_source source;
|
||||
media_buffer_id prev_buffer;
|
||||
bigtime_t prev_time;
|
||||
bool has_seek_tag;
|
||||
media_seek_tag prev_tag;
|
||||
};
|
||||
|
||||
struct producer_latency_changed_command : command_data {
|
||||
media_source source;
|
||||
media_destination destination;
|
||||
bigtime_t latency;
|
||||
uint32 flags;
|
||||
};
|
||||
|
||||
struct producer_enable_output_command : command_data {
|
||||
media_source source;
|
||||
media_destination destination;
|
||||
bool enabled;
|
||||
void* user_data;
|
||||
int32 change_tag;
|
||||
};
|
||||
|
||||
struct producer_late_notice_received_command : command_data {
|
||||
media_source source;
|
||||
bigtime_t how_much;
|
||||
bigtime_t performance_time;
|
||||
};
|
||||
|
||||
struct producer_set_run_mode_delay_command : command_data {
|
||||
BMediaNode::run_mode mode;
|
||||
bigtime_t delay;
|
||||
};
|
||||
|
||||
struct consumer_accept_format_request : request_data {
|
||||
media_destination dest;
|
||||
media_format format;
|
||||
};
|
||||
|
||||
struct consumer_accept_format_reply : reply_data {
|
||||
media_format format;
|
||||
};
|
||||
|
||||
struct consumer_connected_request : request_data {
|
||||
media_input input;
|
||||
};
|
||||
|
||||
struct consumer_connected_reply : reply_data {
|
||||
media_input input;
|
||||
};
|
||||
|
||||
struct server_publish_inputs_request : request_data {
|
||||
media_node node;
|
||||
int32 count;
|
||||
@@ -506,90 +369,6 @@ struct server_publish_outputs_request : area_request_data {
|
||||
struct server_publish_outputs_reply : reply_data {
|
||||
};
|
||||
|
||||
struct producer_get_next_output_request : request_data {
|
||||
int32 cookie;
|
||||
};
|
||||
|
||||
struct producer_get_next_output_reply : reply_data
|
||||
{
|
||||
int32 cookie;
|
||||
media_output output;
|
||||
};
|
||||
|
||||
struct producer_dispose_output_cookie_request : request_data
|
||||
{
|
||||
int32 cookie;
|
||||
};
|
||||
|
||||
struct producer_dispose_output_cookie_reply : reply_data {
|
||||
};
|
||||
|
||||
struct consumer_get_next_input_request : request_data {
|
||||
int32 cookie;
|
||||
};
|
||||
|
||||
struct consumer_get_next_input_reply : reply_data {
|
||||
int32 cookie;
|
||||
media_input input;
|
||||
};
|
||||
|
||||
struct consumer_dispose_input_cookie_request : request_data {
|
||||
int32 cookie;
|
||||
};
|
||||
|
||||
struct consumer_dispose_input_cookie_reply : reply_data {
|
||||
};
|
||||
|
||||
struct consumer_disconnected_request : request_data {
|
||||
media_source source;
|
||||
media_destination destination;
|
||||
};
|
||||
|
||||
struct consumer_disconnected_reply : reply_data {
|
||||
};
|
||||
|
||||
struct consumer_buffer_received_command : command_data {
|
||||
media_buffer_id buffer;
|
||||
media_header header;
|
||||
};
|
||||
|
||||
struct consumer_producer_data_status_command : command_data {
|
||||
media_destination for_whom;
|
||||
int32 status;
|
||||
bigtime_t at_performance_time;
|
||||
};
|
||||
|
||||
struct consumer_get_latency_for_request : request_data {
|
||||
media_destination for_whom;
|
||||
};
|
||||
|
||||
struct consumer_get_latency_for_reply : reply_data {
|
||||
bigtime_t latency;
|
||||
media_node_id timesource;
|
||||
};
|
||||
|
||||
struct consumer_format_changed_request : request_data {
|
||||
media_source producer;
|
||||
media_destination consumer;
|
||||
int32 change_tag;
|
||||
media_format format;
|
||||
};
|
||||
|
||||
struct consumer_format_changed_reply : reply_data {
|
||||
};
|
||||
|
||||
struct consumer_seek_tag_requested_request : request_data {
|
||||
media_destination destination;
|
||||
bigtime_t target_time;
|
||||
uint32 flags;
|
||||
};
|
||||
|
||||
struct consumer_seek_tag_requested_reply : reply_data {
|
||||
media_seek_tag seek_tag;
|
||||
bigtime_t tagged_time;
|
||||
uint32 flags;
|
||||
};
|
||||
|
||||
struct server_register_app_request : request_data {
|
||||
team_id team;
|
||||
BMessenger messenger;
|
||||
@@ -613,19 +392,19 @@ struct server_set_node_creator_request : request_data {
|
||||
struct server_set_node_creator_reply : reply_data {
|
||||
};
|
||||
|
||||
struct server_change_addon_flavor_instances_count_request : request_data {
|
||||
media_addon_id addon_id;
|
||||
struct server_change_flavor_instances_count_request : request_data {
|
||||
media_addon_id add_on_id;
|
||||
int32 flavor_id;
|
||||
int32 delta; // must be +1 or -1
|
||||
team_id team;
|
||||
};
|
||||
|
||||
struct server_change_addon_flavor_instances_count_reply : reply_data {
|
||||
struct server_change_flavor_instances_count_reply : reply_data {
|
||||
};
|
||||
|
||||
struct server_register_node_request : request_data {
|
||||
media_addon_id addon_id;
|
||||
int32 addon_flavor_id;
|
||||
media_addon_id add_on_id;
|
||||
int32 flavor_id;
|
||||
char name[B_MEDIA_NAME_LENGTH];
|
||||
uint64 kinds;
|
||||
port_id port;
|
||||
@@ -642,7 +421,7 @@ struct server_unregister_node_request : request_data {
|
||||
};
|
||||
|
||||
struct server_unregister_node_reply : reply_data {
|
||||
media_addon_id addon_id;
|
||||
media_addon_id add_on_id;
|
||||
int32 flavor_id;
|
||||
};
|
||||
|
||||
@@ -654,13 +433,13 @@ struct server_get_live_node_info_reply : reply_data {
|
||||
live_node_info live_info;
|
||||
};
|
||||
|
||||
struct server_get_live_nodes_request : request_data {
|
||||
int32 maxcount;
|
||||
struct server_get_live_nodes_request : request_area_data {
|
||||
int32 max_count;
|
||||
bool has_input;
|
||||
bool has_output;
|
||||
bool has_name;
|
||||
media_format inputformat;
|
||||
media_format outputformat;
|
||||
media_format input_format;
|
||||
media_format output_format;
|
||||
char name[B_MEDIA_NAME_LENGTH + 1];
|
||||
// +1 for a trailing "*"
|
||||
uint64 require_kinds;
|
||||
@@ -707,9 +486,9 @@ struct server_get_dormant_node_for_reply : reply_data {
|
||||
};
|
||||
|
||||
struct server_get_instances_for_request : request_data {
|
||||
int32 maxcount;
|
||||
media_addon_id addon_id;
|
||||
int32 addon_flavor_id;
|
||||
media_addon_id add_on_id;
|
||||
int32 flavor_id;
|
||||
int32 max_count;
|
||||
};
|
||||
|
||||
struct server_get_instances_for_reply : reply_data {
|
||||
@@ -721,30 +500,23 @@ struct server_get_instances_for_reply : reply_data {
|
||||
struct server_rescan_defaults_command : command_data {
|
||||
};
|
||||
|
||||
struct addonserver_rescan_mediaaddon_flavors_command : command_data {
|
||||
media_addon_id addon_id;
|
||||
};
|
||||
|
||||
struct addonserver_rescan_finished_notify_command : command_data {
|
||||
};
|
||||
|
||||
struct server_register_mediaaddon_request : request_data {
|
||||
struct server_register_add_on_request : request_data {
|
||||
xfer_entry_ref ref;
|
||||
};
|
||||
|
||||
struct server_register_mediaaddon_reply : reply_data {
|
||||
media_addon_id addon_id;
|
||||
struct server_register_add_on_reply : reply_data {
|
||||
media_addon_id add_on_id;
|
||||
};
|
||||
|
||||
struct server_unregister_mediaaddon_command : command_data {
|
||||
media_addon_id addon_id;
|
||||
struct server_unregister_add_on_command : command_data {
|
||||
media_addon_id add_on_id;
|
||||
};
|
||||
|
||||
struct server_get_mediaaddon_ref_request : request_data {
|
||||
media_addon_id addon_id;
|
||||
struct server_get_add_on_ref_request : request_data {
|
||||
media_addon_id add_on_id;
|
||||
};
|
||||
|
||||
struct server_get_mediaaddon_ref_reply : reply_data {
|
||||
struct server_get_add_on_ref_reply : reply_data {
|
||||
xfer_entry_ref ref;
|
||||
};
|
||||
|
||||
@@ -893,6 +665,254 @@ struct server_get_codec_info_reply : reply_data {
|
||||
// the codec info matching the cookie
|
||||
};
|
||||
|
||||
|
||||
// #pragma mark - buffer producer commands
|
||||
|
||||
|
||||
struct producer_format_proposal_request : public request_data {
|
||||
media_source output;
|
||||
media_format format;
|
||||
};
|
||||
|
||||
struct producer_format_proposal_reply : reply_data {
|
||||
media_format format;
|
||||
};
|
||||
|
||||
struct producer_prepare_to_connect_request : request_data {
|
||||
media_source source;
|
||||
media_destination destination;
|
||||
media_format format;
|
||||
char name[B_MEDIA_NAME_LENGTH];
|
||||
};
|
||||
|
||||
struct producer_prepare_to_connect_reply : reply_data {
|
||||
media_format format;
|
||||
media_source out_source;
|
||||
char name[B_MEDIA_NAME_LENGTH];
|
||||
};
|
||||
|
||||
struct producer_connect_request : request_data {
|
||||
status_t error;
|
||||
media_source source;
|
||||
media_destination destination;
|
||||
media_format format;
|
||||
char name[B_MEDIA_NAME_LENGTH];
|
||||
};
|
||||
|
||||
struct producer_connect_reply : reply_data {
|
||||
char name[B_MEDIA_NAME_LENGTH];
|
||||
};
|
||||
|
||||
struct producer_disconnect_request : request_data {
|
||||
media_source source;
|
||||
media_destination destination;
|
||||
};
|
||||
|
||||
struct producer_disconnect_reply : reply_data {
|
||||
};
|
||||
|
||||
struct producer_format_suggestion_requested_request : request_data {
|
||||
media_type type;
|
||||
int32 quality;
|
||||
};
|
||||
|
||||
struct producer_format_suggestion_requested_reply : reply_data {
|
||||
media_format format;
|
||||
};
|
||||
|
||||
struct producer_set_play_rate_request : request_data {
|
||||
int32 numer;
|
||||
int32 denom;
|
||||
};
|
||||
|
||||
struct producer_set_play_rate_reply : reply_data {
|
||||
};
|
||||
|
||||
struct producer_get_initial_latency_request : request_data {
|
||||
};
|
||||
|
||||
struct producer_get_initial_latency_reply : reply_data {
|
||||
bigtime_t initial_latency;
|
||||
uint32 flags;
|
||||
};
|
||||
|
||||
struct producer_get_latency_request : request_data {
|
||||
};
|
||||
|
||||
struct producer_get_latency_reply : reply_data {
|
||||
bigtime_t latency;
|
||||
};
|
||||
|
||||
struct producer_set_buffer_group_command : command_data {
|
||||
media_source source;
|
||||
media_destination destination;
|
||||
void* user_data;
|
||||
int32 change_tag;
|
||||
int32 buffer_count;
|
||||
media_buffer_id buffers[1];
|
||||
};
|
||||
|
||||
struct producer_format_change_requested_command : command_data {
|
||||
media_source source;
|
||||
media_destination destination;
|
||||
media_format format;
|
||||
void* user_data;
|
||||
int32 change_tag;
|
||||
};
|
||||
|
||||
struct producer_video_clipping_changed_command : command_data {
|
||||
media_source source;
|
||||
media_destination destination;
|
||||
media_video_display_info display;
|
||||
void* user_data;
|
||||
int32 change_tag;
|
||||
int32 short_count;
|
||||
int16 shorts[1];
|
||||
};
|
||||
|
||||
struct producer_additional_buffer_requested_command : command_data {
|
||||
media_source source;
|
||||
media_buffer_id prev_buffer;
|
||||
bigtime_t prev_time;
|
||||
bool has_seek_tag;
|
||||
media_seek_tag prev_tag;
|
||||
};
|
||||
|
||||
struct producer_latency_changed_command : command_data {
|
||||
media_source source;
|
||||
media_destination destination;
|
||||
bigtime_t latency;
|
||||
uint32 flags;
|
||||
};
|
||||
|
||||
struct producer_enable_output_command : command_data {
|
||||
media_source source;
|
||||
media_destination destination;
|
||||
bool enabled;
|
||||
void* user_data;
|
||||
int32 change_tag;
|
||||
};
|
||||
|
||||
struct producer_late_notice_received_command : command_data {
|
||||
media_source source;
|
||||
bigtime_t how_much;
|
||||
bigtime_t performance_time;
|
||||
};
|
||||
|
||||
struct producer_set_run_mode_delay_command : command_data {
|
||||
BMediaNode::run_mode mode;
|
||||
bigtime_t delay;
|
||||
};
|
||||
|
||||
struct producer_get_next_output_request : request_data {
|
||||
int32 cookie;
|
||||
};
|
||||
|
||||
struct producer_get_next_output_reply : reply_data
|
||||
{
|
||||
int32 cookie;
|
||||
media_output output;
|
||||
};
|
||||
|
||||
struct producer_dispose_output_cookie_request : request_data
|
||||
{
|
||||
int32 cookie;
|
||||
};
|
||||
|
||||
struct producer_dispose_output_cookie_reply : reply_data {
|
||||
};
|
||||
|
||||
|
||||
// #pragma mark - buffer consumer commands
|
||||
|
||||
|
||||
struct consumer_accept_format_request : request_data {
|
||||
media_destination dest;
|
||||
media_format format;
|
||||
};
|
||||
|
||||
struct consumer_accept_format_reply : reply_data {
|
||||
media_format format;
|
||||
};
|
||||
|
||||
struct consumer_connected_request : request_data {
|
||||
media_input input;
|
||||
};
|
||||
|
||||
struct consumer_connected_reply : reply_data {
|
||||
media_input input;
|
||||
};
|
||||
|
||||
struct consumer_get_next_input_request : request_data {
|
||||
int32 cookie;
|
||||
};
|
||||
|
||||
struct consumer_get_next_input_reply : reply_data {
|
||||
int32 cookie;
|
||||
media_input input;
|
||||
};
|
||||
|
||||
struct consumer_dispose_input_cookie_request : request_data {
|
||||
int32 cookie;
|
||||
};
|
||||
|
||||
struct consumer_dispose_input_cookie_reply : reply_data {
|
||||
};
|
||||
|
||||
struct consumer_disconnected_request : request_data {
|
||||
media_source source;
|
||||
media_destination destination;
|
||||
};
|
||||
|
||||
struct consumer_disconnected_reply : reply_data {
|
||||
};
|
||||
|
||||
struct consumer_buffer_received_command : command_data {
|
||||
media_buffer_id buffer;
|
||||
media_header header;
|
||||
};
|
||||
|
||||
struct consumer_producer_data_status_command : command_data {
|
||||
media_destination for_whom;
|
||||
int32 status;
|
||||
bigtime_t at_performance_time;
|
||||
};
|
||||
|
||||
struct consumer_get_latency_for_request : request_data {
|
||||
media_destination for_whom;
|
||||
};
|
||||
|
||||
struct consumer_get_latency_for_reply : reply_data {
|
||||
bigtime_t latency;
|
||||
media_node_id timesource;
|
||||
};
|
||||
|
||||
struct consumer_format_changed_request : request_data {
|
||||
media_source producer;
|
||||
media_destination consumer;
|
||||
int32 change_tag;
|
||||
media_format format;
|
||||
};
|
||||
|
||||
struct consumer_format_changed_reply : reply_data {
|
||||
};
|
||||
|
||||
struct consumer_seek_tag_requested_request : request_data {
|
||||
media_destination destination;
|
||||
bigtime_t target_time;
|
||||
uint32 flags;
|
||||
};
|
||||
|
||||
struct consumer_seek_tag_requested_reply : reply_data {
|
||||
media_seek_tag seek_tag;
|
||||
bigtime_t tagged_time;
|
||||
uint32 flags;
|
||||
};
|
||||
|
||||
|
||||
// #pragma mark - node commands
|
||||
|
||||
|
||||
struct node_request_completed_command : command_data {
|
||||
media_request_info info;
|
||||
};
|
||||
@@ -934,6 +954,10 @@ struct node_get_timesource_reply : reply_data {
|
||||
struct node_final_release_command : command_data {
|
||||
};
|
||||
|
||||
|
||||
// #pragma mark - time source commands
|
||||
|
||||
|
||||
struct timesource_add_slave_node_command : command_data {
|
||||
media_node node;
|
||||
};
|
||||
@@ -949,6 +973,10 @@ struct timesource_get_start_latency_reply : reply_data {
|
||||
bigtime_t start_latency;
|
||||
};
|
||||
|
||||
|
||||
// #pragma mark - file interface commands
|
||||
|
||||
|
||||
struct fileinterface_set_ref_request : request_data {
|
||||
dev_t device;
|
||||
ino_t directory;
|
||||
@@ -982,6 +1010,10 @@ struct fileinterface_sniff_ref_reply : reply_data {
|
||||
float capability;
|
||||
};
|
||||
|
||||
|
||||
// #pragma mark - controllable commands
|
||||
|
||||
|
||||
struct controllable_get_parameter_web_request : area_request_data {
|
||||
int32 max_size;
|
||||
};
|
||||
|
||||
@@ -14,10 +14,10 @@
|
||||
|
||||
|
||||
enum {
|
||||
ADDONSERVER_INSTANTIATE_DORMANT_NODE,
|
||||
SERVER_REGISTER_MEDIAADDON,
|
||||
SERVER_UNREGISTER_MEDIAADDON,
|
||||
SERVER_GET_MEDIAADDON_REF,
|
||||
ADD_ON_SERVER_INSTANTIATE_DORMANT_NODE,
|
||||
SERVER_REGISTER_ADD_ON,
|
||||
SERVER_UNREGISTER_ADD_ON,
|
||||
SERVER_GET_ADD_ON_REF,
|
||||
SERVER_REGISTER_DORMANT_NODE,
|
||||
SERVER_GET_DORMANT_NODES,
|
||||
SERVER_GET_DORMANT_FLAVOR_INFO,
|
||||
|
||||
@@ -26,55 +26,55 @@ namespace media {
|
||||
namespace dataexchange {
|
||||
|
||||
|
||||
BMessenger* MediaServerMessenger;
|
||||
static port_id MediaServerPort;
|
||||
static port_id MediaAddonServerPort;
|
||||
BMessenger* gMediaServerMessenger;
|
||||
static port_id sMediaServerPort;
|
||||
static port_id sMediaAddonServerPort;
|
||||
|
||||
void find_media_server_port();
|
||||
void find_media_addon_server_port();
|
||||
static void find_media_server_port();
|
||||
static void find_media_addon_server_port();
|
||||
|
||||
static BMessenger*
|
||||
GetMediaServerMessenger()
|
||||
{
|
||||
static BMessenger* messenger = new BMessenger(B_MEDIA_SERVER_SIGNATURE);
|
||||
return MediaServerMessenger = messenger;
|
||||
return gMediaServerMessenger = messenger;
|
||||
}
|
||||
|
||||
class initit {
|
||||
public:
|
||||
initit()
|
||||
{
|
||||
MediaServerMessenger = 0;
|
||||
gMediaServerMessenger = 0;
|
||||
find_media_server_port();
|
||||
find_media_addon_server_port();
|
||||
}
|
||||
|
||||
~initit()
|
||||
{
|
||||
delete MediaServerMessenger;
|
||||
delete gMediaServerMessenger;
|
||||
}
|
||||
};
|
||||
initit _initit;
|
||||
|
||||
|
||||
void
|
||||
static void
|
||||
find_media_server_port()
|
||||
{
|
||||
MediaServerPort = find_port(MEDIA_SERVER_PORT_NAME);
|
||||
if (MediaServerPort < 0) {
|
||||
ERROR("couldn't find MediaServerPort\n");
|
||||
MediaServerPort = BAD_MEDIA_SERVER_PORT; // make this a unique number
|
||||
sMediaServerPort = find_port(MEDIA_SERVER_PORT_NAME);
|
||||
if (sMediaServerPort < 0) {
|
||||
ERROR("couldn't find sMediaServerPort\n");
|
||||
sMediaServerPort = BAD_MEDIA_SERVER_PORT; // make this a unique number
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
static void
|
||||
find_media_addon_server_port()
|
||||
{
|
||||
MediaAddonServerPort = find_port(MEDIA_ADDON_SERVER_PORT_NAME);
|
||||
if (MediaAddonServerPort < 0) {
|
||||
ERROR("couldn't find MediaAddonServerPort\n");
|
||||
MediaAddonServerPort = BAD_MEDIA_ADDON_SERVER_PORT; // make this a unique number
|
||||
sMediaAddonServerPort = find_port(MEDIA_ADDON_SERVER_PORT_NAME);
|
||||
if (sMediaAddonServerPort < 0) {
|
||||
ERROR("couldn't find sMediaAddonServerPort\n");
|
||||
sMediaAddonServerPort = BAD_MEDIA_ADDON_SERVER_PORT; // make this a unique number
|
||||
}
|
||||
}
|
||||
|
||||
@@ -90,26 +90,27 @@ request_data::SendReply(status_t result, reply_data *reply,
|
||||
}
|
||||
|
||||
|
||||
// BMessage based data exchange with the media_server
|
||||
//! BMessage based data exchange with the media_server
|
||||
status_t
|
||||
SendToServer(BMessage *msg)
|
||||
SendToServer(BMessage* msg)
|
||||
{
|
||||
status_t rv;
|
||||
rv = GetMediaServerMessenger()->SendMessage(msg, static_cast<BHandler *>(NULL), TIMEOUT);
|
||||
if (rv != B_OK) {
|
||||
ERROR("SendToServer: SendMessage failed, error 0x%08lx (%s)\n", rv, strerror(rv));
|
||||
status_t status = GetMediaServerMessenger()->SendMessage(msg,
|
||||
static_cast<BHandler*>(NULL), TIMEOUT);
|
||||
if (status != B_OK) {
|
||||
ERROR("SendToServer: SendMessage failed: %s\n", strerror(status));
|
||||
DEBUG_ONLY(msg->PrintToStream());
|
||||
}
|
||||
return rv;
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
QueryServer(BMessage &request, BMessage &reply)
|
||||
QueryServer(BMessage& request, BMessage& reply)
|
||||
{
|
||||
status_t status = GetMediaServerMessenger()->SendMessage(&request, &reply, TIMEOUT, TIMEOUT);
|
||||
status_t status = GetMediaServerMessenger()->SendMessage(&request, &reply,
|
||||
TIMEOUT, TIMEOUT);
|
||||
if (status != B_OK) {
|
||||
ERROR("QueryServer: SendMessage failed, error 0x%08lx (%s)\n", status, strerror(status));
|
||||
ERROR("QueryServer: SendMessage failed: %s\n", strerror(status));
|
||||
DEBUG_ONLY(request.PrintToStream());
|
||||
DEBUG_ONLY(reply.PrintToStream());
|
||||
}
|
||||
@@ -117,58 +118,64 @@ QueryServer(BMessage &request, BMessage &reply)
|
||||
}
|
||||
|
||||
|
||||
// Raw data based data exchange with the media_server
|
||||
//! Raw data based data exchange with the media_server
|
||||
status_t
|
||||
SendToServer(int32 msgcode, command_data *msg, int size)
|
||||
SendToServer(int32 msgCode, command_data* msg, size_t size)
|
||||
{
|
||||
return SendToPort(MediaServerPort, msgcode, msg, size);
|
||||
return SendToPort(sMediaServerPort, msgCode, msg, size);
|
||||
}
|
||||
|
||||
status_t
|
||||
QueryServer(int32 msgcode, request_data *request, int requestsize, reply_data *reply, int replysize)
|
||||
QueryServer(int32 msgCode, request_data* request, size_t requestSize,
|
||||
reply_data* reply, size_t replySize)
|
||||
{
|
||||
return QueryPort(MediaServerPort, msgcode, request, requestsize, reply, replysize);
|
||||
return QueryPort(sMediaServerPort, msgCode, request, requestSize, reply,
|
||||
replySize);
|
||||
}
|
||||
|
||||
|
||||
// Raw data based data exchange with the media_addon_server
|
||||
//! Raw data based data exchange with the media_addon_server
|
||||
status_t
|
||||
SendToAddonServer(int32 msgcode, command_data *msg, int size)
|
||||
SendToAddOnServer(int32 msgCode, command_data* msg, size_t size)
|
||||
{
|
||||
return SendToPort(MediaAddonServerPort, msgcode, msg, size);
|
||||
return SendToPort(sMediaAddonServerPort, msgCode, msg, size);
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
QueryAddonServer(int32 msgcode, request_data *request, int requestsize, reply_data *reply, int replysize)
|
||||
QueryAddOnServer(int32 msgCode, request_data* request, size_t requestSize,
|
||||
reply_data* reply, size_t replySize)
|
||||
{
|
||||
return QueryPort(MediaAddonServerPort, msgcode, request, requestsize, reply, replysize);
|
||||
return QueryPort(sMediaAddonServerPort, msgCode, request, requestSize,
|
||||
reply, replySize);
|
||||
}
|
||||
|
||||
|
||||
// Raw data based data exchange with the media_server
|
||||
//! Raw data based data exchange with the media_server
|
||||
status_t
|
||||
SendToPort(port_id sendport, int32 msgcode, command_data *msg, int size)
|
||||
SendToPort(port_id sendPort, int32 msgCode, command_data* msg, size_t size)
|
||||
{
|
||||
status_t rv;
|
||||
|
||||
rv = write_port_etc(sendport, msgcode, msg, size, B_RELATIVE_TIMEOUT, TIMEOUT);
|
||||
if (rv != B_OK) {
|
||||
ERROR("SendToPort: write_port failed, msgcode 0x%lx, port %ld, error %#lx (%s)\n", msgcode, sendport, rv, strerror(rv));
|
||||
if (rv == B_BAD_PORT_ID && sendport == MediaServerPort) {
|
||||
status_t status = write_port_etc(sendPort, msgCode, msg, size,
|
||||
B_RELATIVE_TIMEOUT, TIMEOUT);
|
||||
if (status != B_OK) {
|
||||
ERROR("SendToPort: write_port failed, msgcode 0x%lx, port %ld: %s\n",
|
||||
msgCode, sendPort, strerror(status));
|
||||
if (status == B_BAD_PORT_ID && sendPort == sMediaServerPort) {
|
||||
find_media_server_port();
|
||||
sendport = MediaServerPort;
|
||||
} else if (rv == B_BAD_PORT_ID && sendport == MediaAddonServerPort) {
|
||||
sendPort = sMediaServerPort;
|
||||
} else if (status == B_BAD_PORT_ID
|
||||
&& sendPort == sMediaAddonServerPort) {
|
||||
find_media_addon_server_port();
|
||||
sendport = MediaAddonServerPort;
|
||||
} else {
|
||||
return rv;
|
||||
}
|
||||
sendPort = sMediaAddonServerPort;
|
||||
} else
|
||||
return status;
|
||||
|
||||
rv = write_port_etc(sendport, msgcode, msg, size, B_RELATIVE_TIMEOUT, TIMEOUT);
|
||||
if (rv != B_OK) {
|
||||
ERROR("SendToPort: retrying write_port failed, msgcode 0x%lx, port %ld, error %#lx (%s)\n", msgcode, sendport, rv, strerror(rv));
|
||||
return rv;
|
||||
status = write_port_etc(sendPort, msgCode, msg, size,
|
||||
B_RELATIVE_TIMEOUT, TIMEOUT);
|
||||
if (status != B_OK) {
|
||||
ERROR("SendToPort: retrying write_port failed, msgCode 0x%lx, "
|
||||
"port %ld: %s\n", msgCode, sendPort, strerror(status));
|
||||
return status;
|
||||
}
|
||||
}
|
||||
return B_OK;
|
||||
@@ -176,46 +183,55 @@ SendToPort(port_id sendport, int32 msgcode, command_data *msg, int size)
|
||||
|
||||
|
||||
status_t
|
||||
QueryPort(port_id requestport, int32 msgcode, request_data *request, int requestsize, reply_data *reply, int replysize)
|
||||
QueryPort(port_id requestPort, int32 msgCode, request_data* request,
|
||||
size_t requestSize, reply_data* reply, size_t replySize)
|
||||
{
|
||||
status_t rv;
|
||||
int32 code;
|
||||
|
||||
request->reply_port = gPortPool->GetPort();
|
||||
|
||||
rv = write_port_etc(requestport, msgcode, request, requestsize, B_RELATIVE_TIMEOUT, TIMEOUT);
|
||||
status_t status = write_port_etc(requestPort, msgCode, request, requestSize,
|
||||
B_RELATIVE_TIMEOUT, TIMEOUT);
|
||||
if (status != B_OK) {
|
||||
ERROR("QueryPort: write_port failed, msgcode 0x%lx, port %ld: %s\n",
|
||||
msgCode, requestPort, strerror(status));
|
||||
|
||||
if (rv != B_OK) {
|
||||
ERROR("QueryPort: write_port failed, msgcode 0x%lx, port %ld, error %#lx (%s)\n", msgcode, requestport, rv, strerror(rv));
|
||||
if (rv == B_BAD_PORT_ID && requestport == MediaServerPort) {
|
||||
if (status == B_BAD_PORT_ID && requestPort == sMediaServerPort) {
|
||||
find_media_server_port();
|
||||
requestport = MediaServerPort;
|
||||
} else if (rv == B_BAD_PORT_ID && requestport == MediaAddonServerPort) {
|
||||
requestPort = sMediaServerPort;
|
||||
} else if (status == B_BAD_PORT_ID
|
||||
&& requestPort == sMediaAddonServerPort) {
|
||||
find_media_addon_server_port();
|
||||
requestport = MediaAddonServerPort;
|
||||
requestPort = sMediaAddonServerPort;
|
||||
} else {
|
||||
gPortPool->PutPort(request->reply_port);
|
||||
return rv;
|
||||
return status;
|
||||
}
|
||||
|
||||
rv = write_port_etc(requestport, msgcode, request, requestsize, B_RELATIVE_TIMEOUT, TIMEOUT);
|
||||
if (rv != B_OK) {
|
||||
ERROR("QueryPort: retrying write_port failed, msgcode 0x%lx, port %ld, error %#lx (%s)\n", msgcode, requestport, rv, strerror(rv));
|
||||
status = write_port_etc(requestPort, msgCode, request, requestSize,
|
||||
B_RELATIVE_TIMEOUT, TIMEOUT);
|
||||
if (status != B_OK) {
|
||||
ERROR("QueryPort: retrying write_port failed, msgcode 0x%lx, port "
|
||||
"%ld: %s\n", msgCode, requestPort, strerror(status));
|
||||
gPortPool->PutPort(request->reply_port);
|
||||
return rv;
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
rv = read_port_etc(request->reply_port, &code, reply, replysize, B_RELATIVE_TIMEOUT, TIMEOUT);
|
||||
int32 code;
|
||||
status = read_port_etc(request->reply_port, &code, reply, replySize,
|
||||
B_RELATIVE_TIMEOUT, TIMEOUT);
|
||||
|
||||
gPortPool->PutPort(request->reply_port);
|
||||
|
||||
if (rv < B_OK) {
|
||||
ERROR("QueryPort: read_port failed, msgcode 0x%lx, port %ld, error %#lx (%s)\n", msgcode, request->reply_port, rv, strerror(rv));
|
||||
if (status < B_OK) {
|
||||
ERROR("QueryPort: read_port failed, msgcode 0x%lx, port %ld: %s\n",
|
||||
msgCode, request->reply_port, strerror(status));
|
||||
}
|
||||
|
||||
return (rv < B_OK) ? rv : reply->result;
|
||||
return status < B_OK ? status : reply->result;
|
||||
}
|
||||
|
||||
|
||||
} // dataexchange
|
||||
} // media
|
||||
} // BPrivate
|
||||
|
||||
@@ -197,7 +197,7 @@ DormantNodeManager::RegisterAddOn(const char* path)
|
||||
{
|
||||
TRACE("DormantNodeManager::RegisterAddon, path %s\n",path);
|
||||
|
||||
server_register_mediaaddon_request msg;
|
||||
server_register_add_on_request msg;
|
||||
entry_ref ref;
|
||||
status_t status = get_ref_for_path(path, &ref);
|
||||
if (status != B_OK) {
|
||||
@@ -216,7 +216,7 @@ DormantNodeManager::RegisterAddOn(const char* path)
|
||||
msg.reply_port = gPortPool->GetPort();
|
||||
msg.ref = ref;
|
||||
|
||||
status = write_port(port, SERVER_REGISTER_MEDIAADDON, &msg, sizeof(msg));
|
||||
status = write_port(port, SERVER_REGISTER_ADD_ON, &msg, sizeof(msg));
|
||||
if (status != B_OK) {
|
||||
gPortPool->PutPort(msg.reply_port);
|
||||
ERROR("DormantNodeManager::RegisterAddon failed, couldn't talk to "
|
||||
@@ -224,7 +224,7 @@ DormantNodeManager::RegisterAddOn(const char* path)
|
||||
return 0;
|
||||
}
|
||||
|
||||
server_register_mediaaddon_reply reply;
|
||||
server_register_add_on_reply reply;
|
||||
int32 code;
|
||||
status = read_port(msg.reply_port, &code, &reply, sizeof(reply));
|
||||
|
||||
@@ -237,9 +237,9 @@ DormantNodeManager::RegisterAddOn(const char* path)
|
||||
}
|
||||
|
||||
TRACE("DormantNodeManager::RegisterAddon finished with id %ld\n",
|
||||
reply.addon_id);
|
||||
reply.add_on_id);
|
||||
|
||||
return reply.addon_id;
|
||||
return reply.add_on_id;
|
||||
}
|
||||
|
||||
|
||||
@@ -254,9 +254,9 @@ DormantNodeManager::UnregisterAddOn(media_addon_id id)
|
||||
if (port < 0)
|
||||
return;
|
||||
|
||||
server_unregister_mediaaddon_command msg;
|
||||
msg.addon_id = id;
|
||||
write_port(port, SERVER_UNREGISTER_MEDIAADDON, &msg, sizeof(msg));
|
||||
server_unregister_add_on_command msg;
|
||||
msg.add_on_id = id;
|
||||
write_port(port, SERVER_UNREGISTER_ADD_ON, &msg, sizeof(msg));
|
||||
}
|
||||
|
||||
|
||||
@@ -267,17 +267,17 @@ DormantNodeManager::FindAddOnPath(BPath* path, media_addon_id id)
|
||||
if (port < 0)
|
||||
return B_ERROR;
|
||||
|
||||
server_get_mediaaddon_ref_request msg;
|
||||
msg.addon_id = id;
|
||||
server_get_add_on_ref_request msg;
|
||||
msg.add_on_id = id;
|
||||
msg.reply_port = gPortPool->GetPort();
|
||||
status_t status = write_port(port, SERVER_GET_MEDIAADDON_REF, &msg,
|
||||
status_t status = write_port(port, SERVER_GET_ADD_ON_REF, &msg,
|
||||
sizeof(msg));
|
||||
if (status != B_OK) {
|
||||
gPortPool->PutPort(msg.reply_port);
|
||||
return status;
|
||||
}
|
||||
|
||||
server_get_mediaaddon_ref_reply reply;
|
||||
server_get_add_on_ref_reply reply;
|
||||
int32 code;
|
||||
status = read_port(msg.reply_port, &code, &reply, sizeof(reply));
|
||||
|
||||
|
||||
@@ -616,9 +616,10 @@ BMediaAddOn::NotifyFlavorChange()
|
||||
if (fAddon == 0)
|
||||
return B_ERROR;
|
||||
|
||||
addonserver_rescan_mediaaddon_flavors_command command;
|
||||
command.addon_id = fAddon;
|
||||
return SendToAddonServer(ADDONSERVER_RESCAN_MEDIAADDON_FLAVORS, &command, sizeof(command));
|
||||
add_on_server_rescan_flavors_command command;
|
||||
command.add_on_id = fAddon;
|
||||
return SendToAddOnServer(ADD_ON_SERVER_RESCAN_ADD_ON_FLAVORS, &command,
|
||||
sizeof(command));
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
|
||||
@@ -154,14 +154,14 @@ status_t
|
||||
BMediaRosterEx::IncrementAddonFlavorInstancesCount(media_addon_id addonID,
|
||||
int32 flavorID)
|
||||
{
|
||||
server_change_addon_flavor_instances_count_request request;
|
||||
server_change_addon_flavor_instances_count_reply reply;
|
||||
server_change_flavor_instances_count_request request;
|
||||
server_change_flavor_instances_count_reply reply;
|
||||
|
||||
request.addon_id = addonID;
|
||||
request.add_on_id = addonID;
|
||||
request.flavor_id = flavorID;
|
||||
request.delta = 1;
|
||||
request.team = BPrivate::current_team();
|
||||
return QueryServer(SERVER_CHANGE_ADDON_FLAVOR_INSTANCES_COUNT, &request,
|
||||
return QueryServer(SERVER_CHANGE_FLAVOR_INSTANCES_COUNT, &request,
|
||||
sizeof(request), &reply, sizeof(reply));
|
||||
}
|
||||
|
||||
@@ -170,14 +170,14 @@ status_t
|
||||
BMediaRosterEx::DecrementAddonFlavorInstancesCount(media_addon_id addonID,
|
||||
int32 flavorID)
|
||||
{
|
||||
server_change_addon_flavor_instances_count_request request;
|
||||
server_change_addon_flavor_instances_count_reply reply;
|
||||
server_change_flavor_instances_count_request request;
|
||||
server_change_flavor_instances_count_reply reply;
|
||||
|
||||
request.addon_id = addonID;
|
||||
request.add_on_id = addonID;
|
||||
request.flavor_id = flavorID;
|
||||
request.delta = -1;
|
||||
request.team = BPrivate::current_team();
|
||||
return QueryServer(SERVER_CHANGE_ADDON_FLAVOR_INSTANCES_COUNT, &request,
|
||||
return QueryServer(SERVER_CHANGE_FLAVOR_INSTANCES_COUNT, &request,
|
||||
sizeof(request), &reply, sizeof(reply));
|
||||
}
|
||||
|
||||
@@ -1419,77 +1419,59 @@ BMediaRoster::GetLiveNodeInfo(const media_node& node,
|
||||
|
||||
|
||||
status_t
|
||||
BMediaRoster::GetLiveNodes(live_node_info* _liveNodes, int32* _totalCount,
|
||||
BMediaRoster::GetLiveNodes(live_node_info* liveNodes, int32* _totalCount,
|
||||
const media_format* hasInput, const media_format* hasOutput,
|
||||
const char* name, uint64 nodeKinds)
|
||||
{
|
||||
CALLED();
|
||||
if (_liveNodes == NULL || _totalCount == NULL || *_totalCount <= 0)
|
||||
if (liveNodes == NULL || _totalCount == NULL || *_totalCount <= 0)
|
||||
return B_BAD_VALUE;
|
||||
|
||||
// TODO: we also support the wildcard search as GetDormantNodes does.
|
||||
// This needs to be documented
|
||||
|
||||
server_get_live_nodes_request request;
|
||||
server_get_live_nodes_reply reply;
|
||||
status_t rv;
|
||||
request.team = BPrivate::current_team();
|
||||
|
||||
request.maxcount = *_totalCount;
|
||||
request.max_count = *_totalCount;
|
||||
request.has_input = hasInput != NULL;
|
||||
if (hasInput != NULL) {
|
||||
// TODO: we should not make a flat copy of media_format
|
||||
request.inputformat = *hasInput;
|
||||
request.input_format = *hasInput;
|
||||
}
|
||||
request.has_output = hasOutput != NULL;
|
||||
if (hasOutput != NULL) {
|
||||
// TODO: we should not make a flat copy of media_format
|
||||
request.outputformat = *hasOutput;
|
||||
request.output_format = *hasOutput;
|
||||
}
|
||||
request.has_name = name != NULL;
|
||||
if (name != NULL) {
|
||||
int len = strlen(name);
|
||||
len = min_c(len, (int)sizeof(request.name) - 1);
|
||||
memcpy(request.name, name, len);
|
||||
request.name[len] = 0;
|
||||
}
|
||||
if (name != NULL)
|
||||
strlcpy(request.name, name, sizeof(request.name));
|
||||
request.require_kinds = nodeKinds;
|
||||
|
||||
rv = QueryServer(SERVER_GET_LIVE_NODES, &request, sizeof(request),
|
||||
&reply, sizeof(reply));
|
||||
if (rv != B_OK) {
|
||||
ERROR("BMediaRoster::GetLiveNodes failed querying server\n");
|
||||
server_get_live_nodes_reply reply;
|
||||
status_t status = QueryServer(SERVER_GET_LIVE_NODES, &request,
|
||||
sizeof(request), &reply, sizeof(reply));
|
||||
if (status != B_OK) {
|
||||
ERROR("BMediaRoster::GetLiveNodes failed querying server: %s\n",
|
||||
strerror(status));
|
||||
*_totalCount = 0;
|
||||
return rv;
|
||||
return status;
|
||||
}
|
||||
|
||||
if (reply.count > MAX_LIVE_INFO) {
|
||||
live_node_info* liveInfo;
|
||||
area_id clone;
|
||||
const live_node_info* info;
|
||||
if (reply.area >= 0)
|
||||
info = (live_node_info*)reply.address;
|
||||
else
|
||||
info = reply.live_info;
|
||||
|
||||
clone = clone_area("live_node_info clone",
|
||||
reinterpret_cast<void **>(&liveInfo), B_ANY_ADDRESS,
|
||||
B_READ_AREA | B_WRITE_AREA, reply.area);
|
||||
if (clone < B_OK) {
|
||||
ERROR("BMediaRoster::GetLiveNodes failed to clone area, %#lx\n",
|
||||
clone);
|
||||
delete_area(reply.area);
|
||||
*_totalCount = 0;
|
||||
return B_ERROR;
|
||||
}
|
||||
for (int32 i = 0; i < reply.count; i++)
|
||||
liveNodes[i] = info[i];
|
||||
|
||||
for (int32 i = 0; i < reply.count; i++) {
|
||||
_liveNodes[i] = liveInfo[i];
|
||||
}
|
||||
|
||||
delete_area(clone);
|
||||
if (reply.area >= 0)
|
||||
delete_area(reply.area);
|
||||
} else {
|
||||
for (int32 i = 0; i < reply.count; i++) {
|
||||
_liveNodes[i] = reply.live_info[i];
|
||||
}
|
||||
}
|
||||
*_totalCount = reply.count;
|
||||
|
||||
*_totalCount = reply.count;
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
@@ -1885,7 +1867,7 @@ BMediaRoster::RegisterNode(BMediaNode* node)
|
||||
|
||||
|
||||
status_t
|
||||
BMediaRosterEx::RegisterNode(BMediaNode* node, media_addon_id addonID,
|
||||
BMediaRosterEx::RegisterNode(BMediaNode* node, media_addon_id addOnID,
|
||||
int32 flavorID)
|
||||
{
|
||||
CALLED();
|
||||
@@ -1899,16 +1881,15 @@ BMediaRosterEx::RegisterNode(BMediaNode* node, media_addon_id addonID,
|
||||
int32 testFlavorID;
|
||||
BMediaAddOn* addon = node->AddOn(&testFlavorID);
|
||||
|
||||
ASSERT(addonID == addon != NULL ? addon->AddonID() : -1);
|
||||
ASSERT(addOnID == addon != NULL ? addon->AddonID() : -1);
|
||||
ASSERT(flavorID == testFlavorID);
|
||||
);
|
||||
|
||||
status_t rv;
|
||||
server_register_node_request request;
|
||||
server_register_node_reply reply;
|
||||
|
||||
request.addon_id = addonID;
|
||||
request.addon_flavor_id = flavorID;
|
||||
request.add_on_id = addOnID;
|
||||
request.flavor_id = flavorID;
|
||||
strcpy(request.name, node->Name());
|
||||
request.kinds = node->Kinds();
|
||||
request.port = node->ControlPort();
|
||||
@@ -1918,12 +1899,12 @@ BMediaRosterEx::RegisterNode(BMediaNode* node, media_addon_id addonID,
|
||||
"%ld, kinds 0x%Lx, team %ld, name '%s'\n", request.port, request.kinds,
|
||||
request.team, request.name);
|
||||
|
||||
rv = QueryServer(SERVER_REGISTER_NODE, &request, sizeof(request), &reply,
|
||||
sizeof(reply));
|
||||
if (rv != B_OK) {
|
||||
ERROR("BMediaRoster::RegisterNode: failed to register node %s (error "
|
||||
"%#lx)\n", node->Name(), rv);
|
||||
return rv;
|
||||
status_t status = QueryServer(SERVER_REGISTER_NODE, &request,
|
||||
sizeof(request), &reply, sizeof(reply));
|
||||
if (status != B_OK) {
|
||||
ERROR("BMediaRoster::RegisterNode: failed to register node %s: %s\n",
|
||||
node->Name(), strerror(status));
|
||||
return status;
|
||||
}
|
||||
|
||||
TRACE("BMediaRoster::RegisterNode: QueryServer SERVER_REGISTER_NODE "
|
||||
@@ -1941,11 +1922,9 @@ BMediaRosterEx::RegisterNode(BMediaNode* node, media_addon_id addonID,
|
||||
|
||||
// if the BMediaNode also inherits from BTimeSource, we need to call
|
||||
// BTimeSource::FinishCreate()
|
||||
if (node->Kinds() & B_TIME_SOURCE) {
|
||||
BTimeSource *ts;
|
||||
ts = dynamic_cast<BTimeSource *>(node);
|
||||
if (ts)
|
||||
ts->FinishCreate();
|
||||
if ((node->Kinds() & B_TIME_SOURCE) != 0) {
|
||||
if (BTimeSource* timeSource = dynamic_cast<BTimeSource*>(node))
|
||||
timeSource->FinishCreate();
|
||||
}
|
||||
|
||||
TRACE("BMediaRoster::RegisterNode: publishing inputs/outputs\n");
|
||||
@@ -1957,18 +1936,15 @@ BMediaRosterEx::RegisterNode(BMediaNode* node, media_addon_id addonID,
|
||||
// if we send a message and wait for a reply here.
|
||||
// We have a pointer to the node, and thus call the functions directly
|
||||
|
||||
if (node->Kinds() & B_BUFFER_PRODUCER) {
|
||||
BBufferProducer *bp;
|
||||
bp = dynamic_cast<BBufferProducer *>(node);
|
||||
if (bp) {
|
||||
if ((node->Kinds() & B_BUFFER_PRODUCER) != 0) {
|
||||
if (BBufferProducer* producer = dynamic_cast<BBufferProducer*>(node)) {
|
||||
List<media_output> list;
|
||||
if (B_OK == GetAllOutputs(bp, &list))
|
||||
if (GetAllOutputs(producer, &list) == B_OK)
|
||||
PublishOutputs(node->Node(), &list);
|
||||
}
|
||||
}
|
||||
if ((node->Kinds() & B_BUFFER_CONSUMER) != 0) {
|
||||
BBufferConsumer* consumer = dynamic_cast<BBufferConsumer*>(node);
|
||||
if (consumer != NULL) {
|
||||
if (BBufferConsumer* consumer = dynamic_cast<BBufferConsumer*>(node)) {
|
||||
List<media_input> list;
|
||||
if (GetAllInputs(consumer, &list) == B_OK)
|
||||
PublishInputs(node->Node(), &list);
|
||||
@@ -1982,13 +1958,19 @@ BMediaRosterEx::RegisterNode(BMediaNode* node, media_addon_id addonID,
|
||||
TRACE("BMediaRoster::RegisterNode: finished\n");
|
||||
|
||||
/*
|
||||
TRACE("BMediaRoster::RegisterNode: registered node name '%s', id %ld, addon %ld, flavor %ld\n", node->Name(), node->ID(), addon_id, addon_flavor_id);
|
||||
TRACE("BMediaRoster::RegisterNode: registered node name '%s', id %ld,
|
||||
addon %ld, flavor %ld\n", node->Name(), node->ID(), addOnID, flavorID);
|
||||
TRACE("BMediaRoster::RegisterNode: node this %p\n", node);
|
||||
TRACE("BMediaRoster::RegisterNode: node fConsumerThis %p\n", node->fConsumerThis);
|
||||
TRACE("BMediaRoster::RegisterNode: node fProducerThis %p\n", node->fProducerThis);
|
||||
TRACE("BMediaRoster::RegisterNode: node fFileInterfaceThis %p\n", node->fFileInterfaceThis);
|
||||
TRACE("BMediaRoster::RegisterNode: node fControllableThis %p\n", node->fControllableThis);
|
||||
TRACE("BMediaRoster::RegisterNode: node fTimeSourceThis %p\n", node->fTimeSourceThis);
|
||||
TRACE("BMediaRoster::RegisterNode: node fConsumerThis %p\n",
|
||||
node->fConsumerThis);
|
||||
TRACE("BMediaRoster::RegisterNode: node fProducerThis %p\n",
|
||||
node->fProducerThis);
|
||||
TRACE("BMediaRoster::RegisterNode: node fFileInterfaceThis %p\n",
|
||||
node->fFileInterfaceThis);
|
||||
TRACE("BMediaRoster::RegisterNode: node fControllableThis %p\n",
|
||||
node->fControllableThis);
|
||||
TRACE("BMediaRoster::RegisterNode: node fTimeSourceThis %p\n",
|
||||
node->fTimeSourceThis);
|
||||
*/
|
||||
return B_OK;
|
||||
}
|
||||
@@ -2043,7 +2025,7 @@ BMediaRoster::UnregisterNode(BMediaNode* node)
|
||||
return status;
|
||||
}
|
||||
|
||||
if (reply.addon_id != -1) {
|
||||
if (reply.add_on_id != -1) {
|
||||
// TODO: this doesn't look right
|
||||
// Small problem here, we can't use DormantNodeManager::PutAddOn(), as
|
||||
// UnregisterNode() is called by a dormant node itself (by the
|
||||
@@ -2051,10 +2033,10 @@ BMediaRoster::UnregisterNode(BMediaNode* node)
|
||||
// The add-on that contains the node needs to remain in memory until the
|
||||
// destructor execution is finished.
|
||||
// DormantNodeManager::PutAddOnDelayed() will delay unloading.
|
||||
gDormantNodeManager->PutAddOnDelayed(reply.addon_id);
|
||||
gDormantNodeManager->PutAddOnDelayed(reply.add_on_id);
|
||||
|
||||
status = MediaRosterEx(this)->DecrementAddonFlavorInstancesCount(
|
||||
reply.addon_id, reply.flavor_id);
|
||||
reply.add_on_id, reply.flavor_id);
|
||||
if (status != B_OK) {
|
||||
ERROR("BMediaRoster::UnregisterNode: "
|
||||
"DecrementAddonFlavorInstancesCount() failed\n");
|
||||
@@ -2545,13 +2527,13 @@ BMediaRoster::InstantiateDormantNode(const dormant_node_info& info,
|
||||
TRACE("BMediaRoster::InstantiateDormantNode: creating global object "
|
||||
"in media_addon_server\n");
|
||||
|
||||
addonserver_instantiate_dormant_node_request request;
|
||||
addonserver_instantiate_dormant_node_reply reply;
|
||||
request.addon_id = info.addon;
|
||||
add_on_server_instantiate_dormant_node_request request;
|
||||
add_on_server_instantiate_dormant_node_reply reply;
|
||||
request.add_on_id = info.addon;
|
||||
request.flavor_id = info.flavor_id;
|
||||
request.creator_team = BPrivate::current_team();
|
||||
// creator team is allowed to also release global nodes
|
||||
rv = QueryAddonServer(ADDONSERVER_INSTANTIATE_DORMANT_NODE, &request,
|
||||
rv = QueryAddOnServer(ADD_ON_SERVER_INSTANTIATE_DORMANT_NODE, &request,
|
||||
sizeof(request), &reply, sizeof(reply));
|
||||
if (rv == B_OK)
|
||||
*_node = reply.node;
|
||||
@@ -3045,9 +3027,9 @@ BMediaRoster::GetInstancesFor(media_addon_id addon, int32 flavor,
|
||||
server_get_instances_for_reply reply;
|
||||
status_t rv;
|
||||
|
||||
request.maxcount = (_count ? *_count : 1);
|
||||
request.addon_id = addon;
|
||||
request.addon_flavor_id = flavor;
|
||||
request.max_count = (_count ? *_count : 1);
|
||||
request.add_on_id = addon;
|
||||
request.flavor_id = flavor;
|
||||
|
||||
rv = QueryServer(SERVER_GET_INSTANCES_FOR, &request, sizeof(request),
|
||||
&reply, sizeof(reply));
|
||||
|
||||
@@ -109,7 +109,7 @@ AppManager::UnregisterTeam(team_id team)
|
||||
|
||||
|
||||
team_id
|
||||
AppManager::AddonServerTeam()
|
||||
AppManager::AddOnServerTeam()
|
||||
{
|
||||
team_id id = be_roster->TeamFor(B_MEDIA_ADDON_SERVER_SIGNATURE);
|
||||
if (id < 0) {
|
||||
|
||||
@@ -22,7 +22,7 @@ public:
|
||||
status_t UnregisterTeam(team_id team);
|
||||
bool HasTeam(team_id team);
|
||||
|
||||
team_id AddonServerTeam();
|
||||
team_id AddOnServerTeam();
|
||||
|
||||
status_t SendMessage(team_id team, BMessage* message);
|
||||
|
||||
|
||||
@@ -136,13 +136,12 @@ DefaultManager::SaveState(NodeManager *node_manager)
|
||||
dormant_node_info info;
|
||||
media_node node;
|
||||
entry_ref ref;
|
||||
if (node_manager->GetCloneForID(&node, media_node_ids[i], be_app->Team()) != B_OK)
|
||||
continue;
|
||||
if (node_manager->GetDormantNodeInfo(&info, node) != B_OK)
|
||||
continue;
|
||||
if (node_manager->DecrementGlobalRefCount(media_node_ids[i], be_app->Team()) != B_OK)
|
||||
continue;
|
||||
if (node_manager->GetAddonRef(&ref, info.addon)!=B_OK)
|
||||
if (node_manager->GetCloneForID(media_node_ids[i], be_app->Team(),
|
||||
&node) != B_OK
|
||||
|| node_manager->GetDormantNodeInfo(node, &info) != B_OK
|
||||
|| node_manager->ReleaseNodeReference(media_node_ids[i],
|
||||
be_app->Team()) != B_OK
|
||||
|| node_manager->GetAddOnRef(info.addon, &ref) != B_OK)
|
||||
continue;
|
||||
|
||||
BPath path(&ref);
|
||||
@@ -337,15 +336,16 @@ DefaultManager::RescanThread()
|
||||
ERROR("DefaultManager: Did not try to connect mixer and soundcard\n");
|
||||
}
|
||||
|
||||
addonserver_rescan_finished_notify_command cmd;
|
||||
SendToAddonServer(ADDONSERVER_RESCAN_FINISHED_NOTIFY, &cmd, sizeof(cmd));
|
||||
add_on_server_rescan_finished_notify_command cmd;
|
||||
SendToAddOnServer(ADD_ON_SERVER_RESCAN_FINISHED_NOTIFY, &cmd, sizeof(cmd));
|
||||
|
||||
printf("DefaultManager::RescanThread() leave\n");
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
DefaultManager::FindPhysical(volatile media_node_id *id, uint32 default_type, bool isInput, media_type type)
|
||||
DefaultManager::FindPhysical(volatile media_node_id *id, uint32 default_type,
|
||||
bool isInput, media_type type)
|
||||
{
|
||||
live_node_info info[MAX_NODE_INFOS];
|
||||
media_format format;
|
||||
|
||||
+948
-721
File diff suppressed because it is too large
Load Diff
+140
-89
@@ -2,116 +2,167 @@
|
||||
* Copyright 2002, Marcus Overhagen. All rights reserved.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef NODE_MANAGER_H
|
||||
#define NODE_MANAGER_H
|
||||
|
||||
|
||||
#include <map>
|
||||
#include <vector>
|
||||
|
||||
#include <Locker.h>
|
||||
|
||||
#include "TList.h"
|
||||
#include "TMap.h"
|
||||
#include "TStack.h"
|
||||
#include "DataExchange.h"
|
||||
|
||||
|
||||
struct registered_node {
|
||||
media_node_id node_id;
|
||||
media_addon_id addon_id;
|
||||
int32 addon_flavor_id;
|
||||
char name[B_MEDIA_NAME_LENGTH];
|
||||
uint64 kinds;
|
||||
port_id port;
|
||||
team_id creator; // team that created the node
|
||||
team_id team; // team that contains the node object
|
||||
int32 globalrefcount;
|
||||
Map<team_id, int32> teamrefcount;
|
||||
List<media_input> inputlist;
|
||||
List<media_output> outputlist;
|
||||
};
|
||||
|
||||
struct dormant_addon_flavor_info {
|
||||
media_addon_id AddonID;
|
||||
int32 AddonFlavorID;
|
||||
|
||||
int32 MaxInstancesCount;
|
||||
int32 GlobalInstancesCount;
|
||||
|
||||
Map<team_id, int32> TeamInstancesCount;
|
||||
|
||||
bool InfoValid;
|
||||
dormant_flavor_info Info;
|
||||
};
|
||||
|
||||
class DefaultManager;
|
||||
class BufferManager;
|
||||
|
||||
class NodeManager {
|
||||
|
||||
typedef std::map<team_id, int32> TeamCountMap;
|
||||
typedef std::vector<media_input> InputList;
|
||||
typedef std::vector<media_output> OutputList;
|
||||
typedef std::vector<live_node_info> LiveNodeList;
|
||||
|
||||
|
||||
struct registered_node {
|
||||
media_node_id node_id;
|
||||
media_addon_id add_on_id;
|
||||
int32 flavor_id;
|
||||
char name[B_MEDIA_NAME_LENGTH];
|
||||
uint64 kinds;
|
||||
port_id port;
|
||||
team_id creator; // team that created the node
|
||||
team_id containing_team;
|
||||
int32 ref_count;
|
||||
TeamCountMap team_ref_count;
|
||||
InputList input_list;
|
||||
OutputList output_list;
|
||||
};
|
||||
|
||||
struct dormant_add_on_flavor_info {
|
||||
media_addon_id add_on_id;
|
||||
int32 flavor_id;
|
||||
|
||||
int32 max_instances_count;
|
||||
int32 instances_count;
|
||||
|
||||
TeamCountMap team_instances_count;
|
||||
|
||||
bool info_valid;
|
||||
dormant_flavor_info info;
|
||||
};
|
||||
|
||||
|
||||
class NodeManager : BLocker {
|
||||
public:
|
||||
NodeManager();
|
||||
~NodeManager();
|
||||
NodeManager();
|
||||
~NodeManager();
|
||||
|
||||
status_t LoadState();
|
||||
status_t SaveState();
|
||||
// Management of system wide default nodes
|
||||
status_t SetDefaultNode(node_type type,
|
||||
const media_node* node,
|
||||
const dormant_node_info* info,
|
||||
const media_input* input);
|
||||
status_t GetDefaultNode(node_type type,
|
||||
media_node_id* _nodeID, char* inputName,
|
||||
int32* _inputID);
|
||||
status_t RescanDefaultNodes();
|
||||
|
||||
void Dump();
|
||||
// Management of live nodes
|
||||
status_t RegisterNode(media_addon_id addOnID,
|
||||
int32 flavorID, const char* name,
|
||||
uint64 kinds, port_id port, team_id team,
|
||||
media_node_id* _nodeID);
|
||||
status_t UnregisterNode(media_node_id nodeID,
|
||||
team_id team, media_addon_id* addOnID,
|
||||
int32* _flavorID);
|
||||
status_t ReleaseNodeReference(media_node_id id,
|
||||
team_id team);
|
||||
status_t GetCloneForID(media_node_id id, team_id team,
|
||||
media_node* node);
|
||||
status_t GetClone(node_type type, team_id team,
|
||||
media_node* node, char* inputName,
|
||||
int32* _id);
|
||||
status_t ReleaseNode(const media_node& node,
|
||||
team_id team);
|
||||
status_t PublishInputs(const media_node& node,
|
||||
const media_input* inputs, int32 count);
|
||||
status_t PublishOutputs(const media_node& node,
|
||||
const media_output* outputs, int32 count);
|
||||
status_t FindNodeID(port_id port, media_node_id* _id);
|
||||
status_t GetLiveNodeInfo(const media_node& node,
|
||||
live_node_info* liveInfo);
|
||||
status_t GetInstances(media_addon_id addOnID,
|
||||
int32 flavorID, media_node_id* ids,
|
||||
int32* _count, int32 maxCount);
|
||||
status_t GetLiveNodes(LiveNodeList& liveNodes,
|
||||
int32 maxCount,
|
||||
const media_format* inputFormat = NULL,
|
||||
const media_format* outputFormat = NULL,
|
||||
const char* name = NULL,
|
||||
uint64 requireKinds = 0);
|
||||
status_t GetDormantNodeInfo(const media_node& node,
|
||||
dormant_node_info* nodeInfo);
|
||||
status_t SetNodeCreator(media_node_id id,
|
||||
team_id creator);
|
||||
|
||||
/* Management of system wide default nodes */
|
||||
status_t SetDefaultNode(node_type type, const media_node *node, const dormant_node_info *info, const media_input *input);
|
||||
status_t GetDefaultNode(media_node_id* nodeID, char* name, int32* id,
|
||||
node_type type);
|
||||
status_t RescanDefaultNodes();
|
||||
// Add media_node_id of all live nodes to the message
|
||||
// int32 "media_node_id" (multiple items)
|
||||
status_t GetLiveNodes(BMessage* message);
|
||||
|
||||
/* Management of live nodes */
|
||||
status_t RegisterNode(media_node_id *nodeid, media_addon_id addon_id, int32 addon_flavor_id, const char *name, uint64 kinds, port_id port, team_id team);
|
||||
status_t UnregisterNode(media_addon_id *addonid, int32 *flavorid, media_node_id nodeid, team_id team);
|
||||
status_t GetCloneForID(media_node* node, media_node_id nodeID, team_id team);
|
||||
status_t GetClone(media_node *node, char *input_name, int32 *input_id, node_type type, team_id team);
|
||||
status_t ReleaseNode(const media_node &node, team_id team);
|
||||
status_t PublishInputs(const media_node &node, const media_input *inputs, int32 count);
|
||||
status_t PublishOutputs(const media_node &node, const media_output *outputs, int32 count);
|
||||
status_t FindNodeID(media_node_id* nodeID, port_id port);
|
||||
status_t GetLiveNodeInfo(live_node_info *live_info, const media_node &node);
|
||||
status_t GetInstances(media_node_id *node_ids, int32* count, int32 maxcount, media_addon_id addon_id, int32 addon_flavor_id);
|
||||
status_t GetLiveNodes(Stack<live_node_info> *livenodes, int32 maxcount, const media_format *inputformat = NULL, const media_format *outputformat = NULL, const char* name = NULL, uint64 require_kinds = 0);
|
||||
status_t GetDormantNodeInfo(dormant_node_info *node_info, const media_node &node);
|
||||
status_t IncrementGlobalRefCount(media_node_id nodeid, team_id team);
|
||||
status_t DecrementGlobalRefCount(media_node_id nodeid, team_id team);
|
||||
status_t SetNodeCreator(media_node_id nodeid, team_id creator);
|
||||
void FinalReleaseNode(media_node_id nodeid);
|
||||
void RegisterAddOn(const entry_ref& ref,
|
||||
media_addon_id* _newID);
|
||||
void UnregisterAddOn(media_addon_id id);
|
||||
|
||||
/* Add media_node_id of all live nodes to the message
|
||||
* int32 "media_node_id" (multiple items)
|
||||
*/
|
||||
status_t GetLiveNodes(BMessage *msg);
|
||||
status_t AddDormantFlavorInfo(
|
||||
const dormant_flavor_info& flavorInfo);
|
||||
void InvalidateDormantFlavorInfo(media_addon_id id);
|
||||
void RemoveDormantFlavorInfo(media_addon_id id);
|
||||
void CleanupDormantFlavorInfos();
|
||||
|
||||
void RegisterAddon(const entry_ref &ref, media_addon_id *newid);
|
||||
void UnregisterAddon(media_addon_id id);
|
||||
status_t IncrementFlavorInstancesCount(
|
||||
media_addon_id addOnID, int32 flavorID,
|
||||
team_id team);
|
||||
status_t DecrementFlavorInstancesCount(
|
||||
media_addon_id addOnID, int32 flavorID,
|
||||
team_id team);
|
||||
|
||||
void AddDormantFlavorInfo(const dormant_flavor_info &dfi);
|
||||
void InvalidateDormantFlavorInfo(media_addon_id id);
|
||||
void RemoveDormantFlavorInfo(media_addon_id id);
|
||||
void CleanupDormantFlavorInfos();
|
||||
status_t GetAddOnRef(media_addon_id addOnID,
|
||||
entry_ref* ref);
|
||||
status_t GetDormantNodes(dormant_node_info* infos,
|
||||
int32* _count, const media_format* hasInput,
|
||||
const media_format* hasOutput,
|
||||
const char* name, uint64 requireKinds,
|
||||
uint64 denyKinds);
|
||||
|
||||
status_t IncrementAddonFlavorInstancesCount(media_addon_id addonid, int32 flavorid, team_id team);
|
||||
status_t DecrementAddonFlavorInstancesCount(media_addon_id addonid, int32 flavorid, team_id team);
|
||||
status_t GetDormantFlavorInfoFor(media_addon_id addOnID,
|
||||
int32 flavorID,
|
||||
dormant_flavor_info* flavorInfo);
|
||||
|
||||
status_t GetAddonRef(entry_ref *ref, media_addon_id id);
|
||||
status_t GetDormantNodes(dormant_node_info * out_info,
|
||||
int32 * io_count,
|
||||
const media_format * has_input /* = NULL */,
|
||||
const media_format * has_output /* = NULL */,
|
||||
const char * name /* = NULL */,
|
||||
uint64 require_kinds /* = NULL */,
|
||||
uint64 deny_kinds /* = NULL */);
|
||||
void CleanupTeam(team_id team);
|
||||
|
||||
status_t GetDormantFlavorInfoFor(media_addon_id addon,
|
||||
int32 flavor_id,
|
||||
dormant_flavor_info *outFlavor);
|
||||
status_t LoadState();
|
||||
status_t SaveState();
|
||||
|
||||
void CleanupTeam(team_id team);
|
||||
void Dump();
|
||||
|
||||
private:
|
||||
media_addon_id fNextAddOnID;
|
||||
media_node_id fNextNodeID;
|
||||
status_t _AcquireNodeReference(media_node_id id,
|
||||
team_id team);
|
||||
|
||||
BLocker *fLocker;
|
||||
List<dormant_addon_flavor_info> *fDormantAddonFlavorList;
|
||||
Map<media_addon_id,entry_ref> *fAddonPathMap;
|
||||
Map<media_node_id,registered_node> *fRegisteredNodeMap;
|
||||
DefaultManager *fDefaultManager;
|
||||
private:
|
||||
typedef std::map<media_addon_id, registered_node> NodeMap;
|
||||
typedef std::vector<dormant_add_on_flavor_info> DormantFlavorList;
|
||||
typedef std::map<media_addon_id, entry_ref> PathMap;
|
||||
|
||||
media_addon_id fNextAddOnID;
|
||||
media_node_id fNextNodeID;
|
||||
|
||||
DormantFlavorList fDormantFlavors;
|
||||
PathMap fPathMap;
|
||||
NodeMap fNodeMap;
|
||||
DefaultManager* fDefaultManager;
|
||||
};
|
||||
|
||||
#endif // NODE_MANAGER_H
|
||||
|
||||
+184
-174
@@ -85,7 +85,7 @@ protected:
|
||||
virtual void MessageReceived(BMessage* message);
|
||||
|
||||
private:
|
||||
void _HandleMessage(int32 code, void* data,
|
||||
void _HandleMessage(int32 code, const void* data,
|
||||
size_t size);
|
||||
void _LaunchAddOnServer();
|
||||
void _QuitAddOnServer();
|
||||
@@ -271,27 +271,27 @@ ServerApp::_QuitAddOnServer()
|
||||
|
||||
|
||||
void
|
||||
ServerApp::_HandleMessage(int32 code, void* data, size_t size)
|
||||
ServerApp::_HandleMessage(int32 code, const void* data, size_t size)
|
||||
{
|
||||
status_t rv;
|
||||
TRACE("ServerApp::HandleMessage %#lx enter\n", code);
|
||||
switch (code) {
|
||||
case SERVER_CHANGE_ADDON_FLAVOR_INSTANCES_COUNT:
|
||||
case SERVER_CHANGE_FLAVOR_INSTANCES_COUNT:
|
||||
{
|
||||
const server_change_addon_flavor_instances_count_request *request
|
||||
= reinterpret_cast<
|
||||
const server_change_addon_flavor_instances_count_request *>(
|
||||
data);
|
||||
server_change_addon_flavor_instances_count_reply reply;
|
||||
ASSERT(request->delta == 1 || request->delta == -1);
|
||||
if (request->delta == 1) {
|
||||
rv = gNodeManager->IncrementAddonFlavorInstancesCount(
|
||||
request->addon_id, request->flavor_id, request->team);
|
||||
} else {
|
||||
rv = gNodeManager->DecrementAddonFlavorInstancesCount(
|
||||
request->addon_id, request->flavor_id, request->team);
|
||||
const server_change_flavor_instances_count_request& request
|
||||
= *static_cast<
|
||||
const server_change_flavor_instances_count_request*>(data);
|
||||
server_change_flavor_instances_count_reply reply;
|
||||
status_t status = B_BAD_VALUE;
|
||||
|
||||
if (request.delta == 1) {
|
||||
status = gNodeManager->IncrementFlavorInstancesCount(
|
||||
request.add_on_id, request.flavor_id, request.team);
|
||||
} else if (request.delta == -1) {
|
||||
status = gNodeManager->DecrementFlavorInstancesCount(
|
||||
request.add_on_id, request.flavor_id, request.team);
|
||||
}
|
||||
request->SendReply(rv, &reply, sizeof(reply));
|
||||
request.SendReply(status, &reply, sizeof(reply));
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -303,100 +303,112 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size)
|
||||
|
||||
case SERVER_REGISTER_APP:
|
||||
{
|
||||
const server_register_app_request *request
|
||||
= reinterpret_cast<const server_register_app_request *>(data);
|
||||
const server_register_app_request& request = *static_cast<
|
||||
const server_register_app_request*>(data);
|
||||
server_register_app_reply reply;
|
||||
rv = gAppManager->RegisterTeam(request->team, request->messenger);
|
||||
request->SendReply(rv, &reply, sizeof(reply));
|
||||
|
||||
status_t status = gAppManager->RegisterTeam(request.team,
|
||||
request.messenger);
|
||||
request.SendReply(status, &reply, sizeof(reply));
|
||||
break;
|
||||
}
|
||||
|
||||
case SERVER_UNREGISTER_APP:
|
||||
{
|
||||
const server_unregister_app_request *request
|
||||
= reinterpret_cast<const server_unregister_app_request *>(
|
||||
data);
|
||||
const server_unregister_app_request& request = *static_cast<
|
||||
const server_unregister_app_request*>(data);
|
||||
server_unregister_app_reply reply;
|
||||
rv = gAppManager->UnregisterTeam(request->team);
|
||||
request->SendReply(rv, &reply, sizeof(reply));
|
||||
|
||||
status_t status = gAppManager->UnregisterTeam(request.team);
|
||||
request.SendReply(status, &reply, sizeof(reply));
|
||||
break;
|
||||
}
|
||||
|
||||
case SERVER_GET_MEDIAADDON_REF:
|
||||
case SERVER_GET_ADD_ON_REF:
|
||||
{
|
||||
server_get_mediaaddon_ref_request *msg
|
||||
= (server_get_mediaaddon_ref_request *)data;
|
||||
server_get_mediaaddon_ref_reply reply;
|
||||
entry_ref tempref;
|
||||
reply.result = gNodeManager->GetAddonRef(&tempref, msg->addon_id);
|
||||
reply.ref = tempref;
|
||||
write_port(msg->reply_port, 0, &reply, sizeof(reply));
|
||||
const server_get_add_on_ref_request& request = *static_cast<
|
||||
const server_get_add_on_ref_request*>(data);
|
||||
server_get_add_on_ref_reply reply;
|
||||
|
||||
entry_ref ref;
|
||||
reply.result = gNodeManager->GetAddOnRef(request.add_on_id, &ref);
|
||||
reply.ref = ref;
|
||||
|
||||
request.SendReply(reply.result, &reply, sizeof(reply));
|
||||
break;
|
||||
}
|
||||
|
||||
case SERVER_NODE_ID_FOR:
|
||||
{
|
||||
const server_node_id_for_request *request
|
||||
= reinterpret_cast<const server_node_id_for_request *>(data);
|
||||
const server_node_id_for_request& request
|
||||
= *static_cast<const server_node_id_for_request*>(data);
|
||||
server_node_id_for_reply reply;
|
||||
rv = gNodeManager->FindNodeID(&reply.node_id, request->port);
|
||||
request->SendReply(rv, &reply, sizeof(reply));
|
||||
|
||||
status_t status = gNodeManager->FindNodeID(request.port,
|
||||
&reply.node_id);
|
||||
request.SendReply(status, &reply, sizeof(reply));
|
||||
break;
|
||||
}
|
||||
|
||||
case SERVER_GET_LIVE_NODE_INFO:
|
||||
{
|
||||
const server_get_live_node_info_request *request
|
||||
= reinterpret_cast<const server_get_live_node_info_request *>(
|
||||
data);
|
||||
const server_get_live_node_info_request& request = *static_cast<
|
||||
const server_get_live_node_info_request*>(data);
|
||||
server_get_live_node_info_reply reply;
|
||||
rv = gNodeManager->GetLiveNodeInfo(&reply.live_info,
|
||||
request->node);
|
||||
request->SendReply(rv, &reply, sizeof(reply));
|
||||
|
||||
status_t status = gNodeManager->GetLiveNodeInfo(request.node,
|
||||
&reply.live_info);
|
||||
request.SendReply(status, &reply, sizeof(reply));
|
||||
break;
|
||||
}
|
||||
|
||||
case SERVER_GET_LIVE_NODES:
|
||||
{
|
||||
const server_get_live_nodes_request *request
|
||||
= reinterpret_cast<const server_get_live_nodes_request *>(
|
||||
data);
|
||||
const server_get_live_nodes_request& request
|
||||
= *static_cast<const server_get_live_nodes_request*>(data);
|
||||
server_get_live_nodes_reply reply;
|
||||
Stack<live_node_info> livenodes;
|
||||
rv = gNodeManager->GetLiveNodes(
|
||||
&livenodes,
|
||||
request->maxcount,
|
||||
request->has_input ? &request->inputformat : NULL,
|
||||
request->has_output ? &request->outputformat : NULL,
|
||||
request->has_name ? request->name : NULL,
|
||||
request->require_kinds);
|
||||
reply.count = livenodes.CountItems();
|
||||
if (reply.count <= MAX_LIVE_INFO) {
|
||||
for (int32 index = 0; index < reply.count; index++)
|
||||
livenodes.Pop(&reply.live_info[index]);
|
||||
reply.area = -1;
|
||||
} else {
|
||||
// we create an area here, and pass it to the library,
|
||||
// where it will be deleted.
|
||||
live_node_info *start_addr;
|
||||
size_t size;
|
||||
size = ((reply.count * sizeof(live_node_info)) + B_PAGE_SIZE
|
||||
- 1) & ~(B_PAGE_SIZE - 1);
|
||||
reply.area = create_area("get live nodes",
|
||||
reinterpret_cast<void **>(&start_addr), B_ANY_ADDRESS,
|
||||
size, B_NO_LOCK, B_READ_AREA | B_WRITE_AREA);
|
||||
if (reply.area < B_OK) {
|
||||
ERROR("SERVER_GET_LIVE_NODES: failed to create area, "
|
||||
"error %#lx\n", reply.area);
|
||||
LiveNodeList nodes;
|
||||
|
||||
status_t status = gNodeManager->GetLiveNodes(nodes,
|
||||
request.max_count,
|
||||
request.has_input ? &request.input_format : NULL,
|
||||
request.has_output ? &request.output_format : NULL,
|
||||
request.has_name ? request.name : NULL, request.require_kinds);
|
||||
|
||||
reply.count = nodes.size();
|
||||
reply.area = -1;
|
||||
|
||||
live_node_info* infos = reply.live_info;
|
||||
area_id area = -1;
|
||||
|
||||
if (reply.count > MAX_LIVE_INFO) {
|
||||
// We create an area here, and transfer it to the client
|
||||
size_t size = (reply.count * sizeof(live_node_info)
|
||||
+ B_PAGE_SIZE - 1) & ~(B_PAGE_SIZE - 1);
|
||||
|
||||
area = create_area("get live nodes", (void**)&infos,
|
||||
B_ANY_ADDRESS, size, B_NO_LOCK, B_READ_AREA | B_WRITE_AREA);
|
||||
if (area < 0) {
|
||||
reply.area = area;
|
||||
reply.count = 0;
|
||||
rv = B_ERROR;
|
||||
} else {
|
||||
for (int32 index = 0; index < reply.count; index++)
|
||||
livenodes.Pop(&start_addr[index]);
|
||||
}
|
||||
}
|
||||
rv = request->SendReply(rv, &reply, sizeof(reply));
|
||||
if (rv != B_OK) {
|
||||
|
||||
for (int32 index = 0; index < reply.count; index++)
|
||||
infos[index] = nodes[index];
|
||||
|
||||
if (area >= 0) {
|
||||
// transfer the area to the target team
|
||||
reply.area = _kern_transfer_area(area, &reply.address,
|
||||
B_ANY_ADDRESS, request.team);
|
||||
if (reply.area < 0) {
|
||||
delete_area(area);
|
||||
reply.count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
status = request.SendReply(status, &reply, sizeof(reply));
|
||||
if (status != B_OK && reply.area >= 0) {
|
||||
// if we couldn't send the message, delete the area
|
||||
delete_area(reply.area);
|
||||
}
|
||||
@@ -405,54 +417,57 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size)
|
||||
|
||||
case SERVER_GET_NODE_FOR:
|
||||
{
|
||||
const server_get_node_for_request *request
|
||||
= reinterpret_cast<const server_get_node_for_request *>(data);
|
||||
const server_get_node_for_request& request
|
||||
= *static_cast<const server_get_node_for_request*>(data);
|
||||
server_get_node_for_reply reply;
|
||||
rv = gNodeManager->GetCloneForID(&reply.clone, request->node_id,
|
||||
request->team);
|
||||
request->SendReply(rv, &reply, sizeof(reply));
|
||||
|
||||
status_t status = gNodeManager->GetCloneForID(request.node_id,
|
||||
request.team, &reply.clone);
|
||||
request.SendReply(status, &reply, sizeof(reply));
|
||||
break;
|
||||
}
|
||||
|
||||
case SERVER_RELEASE_NODE:
|
||||
{
|
||||
const server_release_node_request *request
|
||||
= reinterpret_cast<const server_release_node_request *>(data);
|
||||
const server_release_node_request& request
|
||||
= *static_cast<const server_release_node_request*>(data);
|
||||
server_release_node_reply reply;
|
||||
rv = gNodeManager->ReleaseNode(request->node, request->team);
|
||||
request->SendReply(rv, &reply, sizeof(reply));
|
||||
|
||||
status_t status = gNodeManager->ReleaseNode(request.node,
|
||||
request.team);
|
||||
request.SendReply(status, &reply, sizeof(reply));
|
||||
break;
|
||||
}
|
||||
|
||||
case SERVER_REGISTER_NODE:
|
||||
{
|
||||
const server_register_node_request *request
|
||||
= reinterpret_cast<const server_register_node_request *>(data);
|
||||
const server_register_node_request& request
|
||||
= *static_cast<const server_register_node_request*>(data);
|
||||
server_register_node_reply reply;
|
||||
rv = gNodeManager->RegisterNode(&reply.node_id, request->addon_id,
|
||||
request->addon_flavor_id, request->name, request->kinds,
|
||||
request->port, request->team);
|
||||
request->SendReply(rv, &reply, sizeof(reply));
|
||||
|
||||
status_t status = gNodeManager->RegisterNode(request.add_on_id,
|
||||
request.flavor_id, request.name, request.kinds, request.port,
|
||||
request.team, &reply.node_id);
|
||||
request.SendReply(status, &reply, sizeof(reply));
|
||||
break;
|
||||
}
|
||||
|
||||
case SERVER_UNREGISTER_NODE:
|
||||
{
|
||||
const server_unregister_node_request *request
|
||||
= reinterpret_cast<const server_unregister_node_request *>(
|
||||
data);
|
||||
const server_unregister_node_request& request
|
||||
= *static_cast<const server_unregister_node_request*>(data);
|
||||
server_unregister_node_reply reply;
|
||||
rv = gNodeManager->UnregisterNode(&reply.addon_id, &reply.flavor_id,
|
||||
request->node_id, request->team);
|
||||
request->SendReply(rv, &reply, sizeof(reply));
|
||||
|
||||
status_t status = gNodeManager->UnregisterNode(request.node_id,
|
||||
request.team, &reply.add_on_id, &reply.flavor_id);
|
||||
request.SendReply(status, &reply, sizeof(reply));
|
||||
break;
|
||||
}
|
||||
|
||||
case SERVER_PUBLISH_INPUTS:
|
||||
{
|
||||
const server_publish_inputs_request *request
|
||||
= reinterpret_cast<const server_publish_inputs_request *>(
|
||||
data);
|
||||
= static_cast<const server_publish_inputs_request *>(data);
|
||||
server_publish_inputs_reply reply;
|
||||
if (request->count <= MAX_INPUTS) {
|
||||
rv = gNodeManager->PublishInputs(request->node,
|
||||
@@ -460,9 +475,8 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size)
|
||||
} else {
|
||||
media_input *inputs;
|
||||
area_id clone;
|
||||
clone = clone_area("media_inputs clone",
|
||||
reinterpret_cast<void **>(&inputs), B_ANY_ADDRESS,
|
||||
B_READ_AREA | B_WRITE_AREA, request->area);
|
||||
clone = clone_area("media_inputs clone", (void**)&inputs,
|
||||
B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA, request->area);
|
||||
if (clone < B_OK) {
|
||||
ERROR("SERVER_PUBLISH_INPUTS: failed to clone area, "
|
||||
"error %#lx\n", clone);
|
||||
@@ -480,8 +494,7 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size)
|
||||
case SERVER_PUBLISH_OUTPUTS:
|
||||
{
|
||||
const server_publish_outputs_request *request
|
||||
= reinterpret_cast<const server_publish_outputs_request *>(
|
||||
data);
|
||||
= static_cast<const server_publish_outputs_request *>(data);
|
||||
server_publish_outputs_reply reply;
|
||||
if (request->count <= MAX_OUTPUTS) {
|
||||
rv = gNodeManager->PublishOutputs(request->node,
|
||||
@@ -489,7 +502,8 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size)
|
||||
} else {
|
||||
media_output *outputs;
|
||||
area_id clone;
|
||||
clone = clone_area("media_outputs clone", reinterpret_cast<void **>(&outputs), B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA, request->area);
|
||||
clone = clone_area("media_outputs clone", (void**)&outputs,
|
||||
B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA, request->area);
|
||||
if (clone < B_OK) {
|
||||
ERROR("SERVER_PUBLISH_OUTPUTS: failed to clone area, "
|
||||
"error %#lx\n", clone);
|
||||
@@ -506,74 +520,78 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size)
|
||||
|
||||
case SERVER_GET_NODE:
|
||||
{
|
||||
const server_get_node_request *request
|
||||
= reinterpret_cast<const server_get_node_request *>(data);
|
||||
const server_get_node_request& request
|
||||
= *static_cast<const server_get_node_request*>(data);
|
||||
server_get_node_reply reply;
|
||||
rv = gNodeManager->GetClone(&reply.node, reply.input_name,
|
||||
&reply.input_id, request->type, request->team);
|
||||
request->SendReply(rv, &reply, sizeof(reply));
|
||||
|
||||
status_t status = gNodeManager->GetClone(request.type, request.team,
|
||||
&reply.node, reply.input_name, &reply.input_id);
|
||||
request.SendReply(status, &reply, sizeof(reply));
|
||||
break;
|
||||
}
|
||||
|
||||
case SERVER_SET_NODE:
|
||||
{
|
||||
const server_set_node_request *request
|
||||
= reinterpret_cast<const server_set_node_request *>(data);
|
||||
const server_set_node_request& request
|
||||
= *static_cast<const server_set_node_request*>(data);
|
||||
server_set_node_reply reply;
|
||||
rv = gNodeManager->SetDefaultNode(request->type,
|
||||
request->use_node ? &request->node : NULL,
|
||||
request->use_dni ? &request->dni : NULL,
|
||||
request->use_input ? &request->input : NULL);
|
||||
request->SendReply(rv, &reply, sizeof(reply));
|
||||
|
||||
status_t status = gNodeManager->SetDefaultNode(request.type,
|
||||
request.use_node ? &request.node : NULL,
|
||||
request.use_dni ? &request.dni : NULL,
|
||||
request.use_input ? &request.input : NULL);
|
||||
request.SendReply(status, &reply, sizeof(reply));
|
||||
break;
|
||||
}
|
||||
|
||||
case SERVER_GET_DORMANT_NODE_FOR:
|
||||
{
|
||||
const server_get_dormant_node_for_request *request
|
||||
= reinterpret_cast<
|
||||
const server_get_dormant_node_for_request *>(data);
|
||||
const server_get_dormant_node_for_request& request
|
||||
= *static_cast<const server_get_dormant_node_for_request*>(
|
||||
data);
|
||||
server_get_dormant_node_for_reply reply;
|
||||
rv = gNodeManager->GetDormantNodeInfo(&reply.node_info,
|
||||
request->node);
|
||||
request->SendReply(rv, &reply, sizeof(reply));
|
||||
|
||||
status_t status = gNodeManager->GetDormantNodeInfo(request.node,
|
||||
&reply.node_info);
|
||||
request.SendReply(status, &reply, sizeof(reply));
|
||||
break;
|
||||
}
|
||||
|
||||
case SERVER_GET_INSTANCES_FOR:
|
||||
{
|
||||
const server_get_instances_for_request *request
|
||||
= reinterpret_cast<const server_get_instances_for_request *>(
|
||||
data);
|
||||
const server_get_instances_for_request& request
|
||||
= *static_cast<const server_get_instances_for_request*>(data);
|
||||
server_get_instances_for_reply reply;
|
||||
rv = gNodeManager->GetInstances(reply.node_id, &reply.count,
|
||||
min_c(request->maxcount, MAX_NODE_ID), request->addon_id,
|
||||
request->addon_flavor_id);
|
||||
|
||||
status_t status = gNodeManager->GetInstances(request.add_on_id,
|
||||
request.flavor_id, reply.node_id, &reply.count,
|
||||
min_c(request.max_count, MAX_NODE_ID));
|
||||
if (reply.count == MAX_NODE_ID
|
||||
&& request->maxcount > MAX_NODE_ID) {
|
||||
// XXX might be fixed by using an area
|
||||
&& request.max_count > MAX_NODE_ID) {
|
||||
// TODO: might be fixed by using an area
|
||||
PRINT(1, "Warning: SERVER_GET_INSTANCES_FOR: returning "
|
||||
"possibly truncated list of node id's\n");
|
||||
}
|
||||
request->SendReply(rv, &reply, sizeof(reply));
|
||||
request.SendReply(status, &reply, sizeof(reply));
|
||||
break;
|
||||
}
|
||||
|
||||
case SERVER_REGISTER_MEDIAADDON:
|
||||
case SERVER_REGISTER_ADD_ON:
|
||||
{
|
||||
server_register_mediaaddon_request *msg
|
||||
= (server_register_mediaaddon_request *)data;
|
||||
server_register_mediaaddon_reply reply;
|
||||
gNodeManager->RegisterAddon(msg->ref, &reply.addon_id);
|
||||
write_port(msg->reply_port, 0, &reply, sizeof(reply));
|
||||
const server_register_add_on_request& request = *static_cast<
|
||||
const server_register_add_on_request*>(data);
|
||||
server_register_add_on_reply reply;
|
||||
|
||||
gNodeManager->RegisterAddOn(request.ref, &reply.add_on_id);
|
||||
request.SendReply(B_OK, &reply, sizeof(reply));
|
||||
break;
|
||||
}
|
||||
|
||||
case SERVER_UNREGISTER_MEDIAADDON:
|
||||
case SERVER_UNREGISTER_ADD_ON:
|
||||
{
|
||||
server_unregister_mediaaddon_command *msg
|
||||
= (server_unregister_mediaaddon_command *)data;
|
||||
gNodeManager->UnregisterAddon(msg->addon_id);
|
||||
const server_unregister_add_on_command& request = *static_cast<
|
||||
const server_unregister_add_on_command*>(data);
|
||||
gNodeManager->UnregisterAddOn(request.add_on_id);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -662,8 +680,7 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size)
|
||||
case SERVER_SET_NODE_CREATOR:
|
||||
{
|
||||
const server_set_node_creator_request* request
|
||||
= reinterpret_cast<const server_set_node_creator_request*>(
|
||||
data);
|
||||
= static_cast<const server_set_node_creator_request*>(data);
|
||||
server_set_node_creator_reply reply;
|
||||
status_t status = gNodeManager->SetNodeCreator(request->node,
|
||||
request->creator);
|
||||
@@ -673,21 +690,21 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size)
|
||||
|
||||
case SERVER_GET_SHARED_BUFFER_AREA:
|
||||
{
|
||||
const server_get_shared_buffer_area_request *request
|
||||
= reinterpret_cast<
|
||||
const server_get_shared_buffer_area_request *>(data);
|
||||
const server_get_shared_buffer_area_request& request
|
||||
= *static_cast<const server_get_shared_buffer_area_request*>(
|
||||
data);
|
||||
server_get_shared_buffer_area_reply reply;
|
||||
|
||||
reply.area = gBufferManager->SharedBufferListArea();
|
||||
request->SendReply(B_OK, &reply, sizeof(reply));
|
||||
request.SendReply(reply.area >= 0 ? B_OK : reply.area, &reply,
|
||||
sizeof(reply));
|
||||
break;
|
||||
}
|
||||
|
||||
case SERVER_REGISTER_BUFFER:
|
||||
{
|
||||
const server_register_buffer_request *request
|
||||
= reinterpret_cast<const server_register_buffer_request *>(
|
||||
data);
|
||||
= static_cast<const server_register_buffer_request *>(data);
|
||||
server_register_buffer_reply reply;
|
||||
status_t status;
|
||||
if (request->info.buffer == 0) {
|
||||
@@ -710,7 +727,7 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size)
|
||||
|
||||
case SERVER_UNREGISTER_BUFFER:
|
||||
{
|
||||
const server_unregister_buffer_command *cmd = reinterpret_cast<
|
||||
const server_unregister_buffer_command *cmd = static_cast<
|
||||
const server_unregister_buffer_command *>(data);
|
||||
|
||||
gBufferManager->UnregisterBuffer(cmd->team, cmd->buffer_id);
|
||||
@@ -720,8 +737,7 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size)
|
||||
case SERVER_GET_MEDIA_FILE_TYPES:
|
||||
{
|
||||
const server_get_media_types_request& request
|
||||
= *reinterpret_cast<const server_get_media_types_request*>(
|
||||
data);
|
||||
= *static_cast<const server_get_media_types_request*>(data);
|
||||
|
||||
server_get_media_types_reply reply;
|
||||
area_id area = gMediaFilesManager->GetTypesArea(reply.count);
|
||||
@@ -748,8 +764,7 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size)
|
||||
case SERVER_GET_MEDIA_FILE_ITEMS:
|
||||
{
|
||||
const server_get_media_items_request& request
|
||||
= *reinterpret_cast<const server_get_media_items_request*>(
|
||||
data);
|
||||
= *static_cast<const server_get_media_items_request*>(data);
|
||||
|
||||
server_get_media_items_reply reply;
|
||||
area_id area = gMediaFilesManager->GetItemsArea(request.type,
|
||||
@@ -778,7 +793,7 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size)
|
||||
case SERVER_GET_REF_FOR:
|
||||
{
|
||||
const server_get_ref_for_request* request
|
||||
= reinterpret_cast<const server_get_ref_for_request*>(data);
|
||||
= static_cast<const server_get_ref_for_request*>(data);
|
||||
server_get_ref_for_reply reply;
|
||||
entry_ref* ref;
|
||||
|
||||
@@ -794,7 +809,7 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size)
|
||||
case SERVER_SET_REF_FOR:
|
||||
{
|
||||
const server_set_ref_for_request* request
|
||||
= reinterpret_cast<const server_set_ref_for_request*>(data);
|
||||
= static_cast<const server_set_ref_for_request*>(data);
|
||||
server_set_ref_for_reply reply;
|
||||
entry_ref ref = request->ref;
|
||||
|
||||
@@ -807,7 +822,7 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size)
|
||||
case SERVER_INVALIDATE_MEDIA_ITEM:
|
||||
{
|
||||
const server_invalidate_item_request* request
|
||||
= reinterpret_cast<const server_invalidate_item_request*>(data);
|
||||
= static_cast<const server_invalidate_item_request*>(data);
|
||||
server_invalidate_item_reply reply;
|
||||
|
||||
status_t status = gMediaFilesManager->InvalidateItem(
|
||||
@@ -819,8 +834,7 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size)
|
||||
case SERVER_REMOVE_MEDIA_ITEM:
|
||||
{
|
||||
const server_remove_media_item_request* request
|
||||
= reinterpret_cast<const server_remove_media_item_request*>(
|
||||
data);
|
||||
= static_cast<const server_remove_media_item_request*>(data);
|
||||
server_remove_media_item_reply reply;
|
||||
|
||||
status_t status = gMediaFilesManager->RemoveItem(request->type,
|
||||
@@ -832,8 +846,7 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size)
|
||||
case SERVER_GET_ITEM_AUDIO_GAIN:
|
||||
{
|
||||
const server_get_item_audio_gain_request& request
|
||||
= *reinterpret_cast<const server_get_item_audio_gain_request*>(
|
||||
data);
|
||||
= *static_cast<const server_get_item_audio_gain_request*>(data);
|
||||
server_get_item_audio_gain_reply reply;
|
||||
|
||||
status_t status = gMediaFilesManager->GetAudioGainFor(request.type,
|
||||
@@ -845,8 +858,7 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size)
|
||||
case SERVER_SET_ITEM_AUDIO_GAIN:
|
||||
{
|
||||
const server_set_item_audio_gain_request& request
|
||||
= *reinterpret_cast<const server_set_item_audio_gain_request*>(
|
||||
data);
|
||||
= *static_cast<const server_set_item_audio_gain_request*>(data);
|
||||
server_set_ref_for_reply reply;
|
||||
|
||||
status_t status = gMediaFilesManager->SetAudioGainFor(request.type,
|
||||
@@ -858,7 +870,7 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size)
|
||||
case SERVER_GET_READERS:
|
||||
{
|
||||
const server_get_readers_request *request
|
||||
= reinterpret_cast<const server_get_readers_request *>(data);
|
||||
= static_cast<const server_get_readers_request *>(data);
|
||||
server_get_readers_reply reply;
|
||||
rv = gAddOnManager->GetReaders(reply.ref, &reply.count,
|
||||
MAX_READERS);
|
||||
@@ -869,7 +881,7 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size)
|
||||
case SERVER_GET_DECODER_FOR_FORMAT:
|
||||
{
|
||||
const server_get_decoder_for_format_request *request
|
||||
= reinterpret_cast<
|
||||
= static_cast<
|
||||
const server_get_decoder_for_format_request *>(data);
|
||||
server_get_decoder_for_format_reply reply;
|
||||
rv = gAddOnManager->GetDecoderForFormat(&reply.ref,
|
||||
@@ -881,7 +893,7 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size)
|
||||
case SERVER_GET_WRITER_FOR_FORMAT_FAMILY:
|
||||
{
|
||||
const server_get_writer_request *request
|
||||
= reinterpret_cast<const server_get_writer_request *>(data);
|
||||
= static_cast<const server_get_writer_request *>(data);
|
||||
server_get_writer_reply reply;
|
||||
rv = gAddOnManager->GetWriter(&reply.ref, request->internal_id);
|
||||
request->SendReply(rv, &reply, sizeof(reply));
|
||||
@@ -891,8 +903,7 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size)
|
||||
case SERVER_GET_FILE_FORMAT_FOR_COOKIE:
|
||||
{
|
||||
const server_get_file_format_request *request
|
||||
= reinterpret_cast<
|
||||
const server_get_file_format_request *>(data);
|
||||
= static_cast<const server_get_file_format_request *>(data);
|
||||
server_get_file_format_reply reply;
|
||||
rv = gAddOnManager->GetFileFormat(&reply.file_format,
|
||||
request->cookie);
|
||||
@@ -903,8 +914,7 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size)
|
||||
case SERVER_GET_CODEC_INFO_FOR_COOKIE:
|
||||
{
|
||||
const server_get_codec_info_request *request
|
||||
= reinterpret_cast<
|
||||
const server_get_codec_info_request *>(data);
|
||||
= static_cast<const server_get_codec_info_request *>(data);
|
||||
server_get_codec_info_reply reply;
|
||||
rv = gAddOnManager->GetCodecInfo(&reply.codec_info,
|
||||
&reply.format_family, &reply.input_format,
|
||||
@@ -916,7 +926,7 @@ ServerApp::_HandleMessage(int32 code, void* data, size_t size)
|
||||
case SERVER_GET_ENCODER_FOR_CODEC_INFO:
|
||||
{
|
||||
const server_get_encoder_for_codec_info_request *request
|
||||
= reinterpret_cast<
|
||||
= static_cast<
|
||||
const server_get_encoder_for_codec_info_request *>(data);
|
||||
server_get_encoder_for_codec_info_reply reply;
|
||||
rv = gAddOnManager->GetEncoder(&reply.ref, request->id);
|
||||
|
||||
@@ -354,7 +354,7 @@ void
|
||||
MediaAddonServer::MessageReceived(BMessage* message)
|
||||
{
|
||||
switch (message->what) {
|
||||
case MEDIA_ADDON_SERVER_PLAY_MEDIA:
|
||||
case MEDIA_ADD_ON_SERVER_PLAY_MEDIA:
|
||||
{
|
||||
const char* name;
|
||||
const char* type;
|
||||
@@ -381,39 +381,39 @@ void
|
||||
MediaAddonServer::_HandleMessage(int32 code, const void* data, size_t size)
|
||||
{
|
||||
switch (code) {
|
||||
case ADDONSERVER_INSTANTIATE_DORMANT_NODE:
|
||||
case ADD_ON_SERVER_INSTANTIATE_DORMANT_NODE:
|
||||
{
|
||||
const addonserver_instantiate_dormant_node_request* request
|
||||
const add_on_server_instantiate_dormant_node_request* request
|
||||
= static_cast<
|
||||
const addonserver_instantiate_dormant_node_request*>(data);
|
||||
addonserver_instantiate_dormant_node_reply reply;
|
||||
const add_on_server_instantiate_dormant_node_request*>(
|
||||
data);
|
||||
add_on_server_instantiate_dormant_node_reply reply;
|
||||
|
||||
status_t status
|
||||
= MediaRosterEx(fMediaRoster)->InstantiateDormantNode(
|
||||
request->addon_id, request->flavor_id,
|
||||
request->add_on_id, request->flavor_id,
|
||||
request->creator_team, &reply.node);
|
||||
request->SendReply(status, &reply, sizeof(reply));
|
||||
break;
|
||||
}
|
||||
|
||||
case ADDONSERVER_RESCAN_MEDIAADDON_FLAVORS:
|
||||
case ADD_ON_SERVER_RESCAN_ADD_ON_FLAVORS:
|
||||
{
|
||||
const addonserver_rescan_mediaaddon_flavors_command* command
|
||||
= static_cast<
|
||||
const addonserver_rescan_mediaaddon_flavors_command*>(data);
|
||||
BMediaAddOn* addon
|
||||
= gDormantNodeManager->GetAddOn(command->addon_id);
|
||||
if (addon == NULL) {
|
||||
const add_on_server_rescan_flavors_command* command = static_cast<
|
||||
const add_on_server_rescan_flavors_command*>(data);
|
||||
BMediaAddOn* addOn
|
||||
= gDormantNodeManager->GetAddOn(command->add_on_id);
|
||||
if (addOn == NULL) {
|
||||
ERROR("rescan flavors: Can't find a addon object for id %d\n",
|
||||
(int)command->addon_id);
|
||||
(int)command->add_on_id);
|
||||
break;
|
||||
}
|
||||
_ScanAddOnFlavors(addon);
|
||||
gDormantNodeManager->PutAddOn(command->addon_id);
|
||||
_ScanAddOnFlavors(addOn);
|
||||
gDormantNodeManager->PutAddOn(command->add_on_id);
|
||||
break;
|
||||
}
|
||||
|
||||
case ADDONSERVER_RESCAN_FINISHED_NOTIFY:
|
||||
case ADD_ON_SERVER_RESCAN_FINISHED_NOTIFY:
|
||||
if (fStartupSound) {
|
||||
system_beep(MEDIA_SOUNDS_STARTUP);
|
||||
fStartupSound = false;
|
||||
|
||||
Reference in New Issue
Block a user