From 14896b937ac8d8934f52425da50a8dbbee884599 Mon Sep 17 00:00:00 2001 From: Dario Casalinuovo Date: Wed, 7 Jan 2015 16:35:07 +0100 Subject: [PATCH] Implement BMediaRoster::RollNode(). Fixes #9083. Signed-off-by: Adrien Destugues --- headers/private/media/ServerInterface.h | 7 +++++++ src/kits/media/MediaNode.cpp | 17 +++++++++++++++++ src/kits/media/MediaRoster.cpp | 17 +++++++++++++++-- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/headers/private/media/ServerInterface.h b/headers/private/media/ServerInterface.h index 8042ebf44e..13249ebae8 100644 --- a/headers/private/media/ServerInterface.h +++ b/headers/private/media/ServerInterface.h @@ -88,6 +88,7 @@ enum { NODE_SET_RUN_MODE, NODE_TIME_WARP, NODE_PREROLL, + NODE_ROLL, NODE_SET_TIMESOURCE, NODE_GET_TIMESOURCE, NODE_REQUEST_COMPLETED, @@ -899,6 +900,12 @@ struct node_seek_command : command_data { bigtime_t performance_time; }; +struct node_roll_command : command_data { + bigtime_t start_performance_time; + bigtime_t stop_performance_time; + bigtime_t seek_media_time; +}; + struct node_set_run_mode_command : command_data { BMediaNode::run_mode mode; }; diff --git a/src/kits/media/MediaNode.cpp b/src/kits/media/MediaNode.cpp index 5f7c00521d..77319aefe6 100644 --- a/src/kits/media/MediaNode.cpp +++ b/src/kits/media/MediaNode.cpp @@ -632,6 +632,23 @@ BMediaNode::HandleMessage(int32 message, return B_OK; } + case NODE_ROLL: + { + const node_roll_command *command + = static_cast(data); + + TRACE("BMediaNode::HandleMessage NODE_ROLL, node %ld\n", + fNodeID); + + if (command->seek_media_time != B_INFINITE_TIMEOUT) + Seek(command->seek_media_time, + command->start_performance_time); + + Start(command->start_performance_time); + Stop(command->stop_performance_time, false); + return B_OK; + } + case NODE_SET_TIMESOURCE: { const node_set_timesource_command *command = static_cast(data); diff --git a/src/kits/media/MediaRoster.cpp b/src/kits/media/MediaRoster.cpp index b7d2853dd2..8201be0b75 100644 --- a/src/kits/media/MediaRoster.cpp +++ b/src/kits/media/MediaRoster.cpp @@ -1400,8 +1400,21 @@ status_t BMediaRoster::RollNode(const media_node& node, bigtime_t startPerformance, bigtime_t stopPerformance, bigtime_t atMediaTime) { - UNIMPLEMENTED(); - return B_ERROR; + CALLED(); + if (IS_INVALID_NODE(node)) + return B_MEDIA_BAD_NODE; + + TRACE("BMediaRoster::RollNode, node %" B_PRId32 ", at start perf %" + B_PRId64 ", at stop perf %" B_PRId64 ", at media time %" + B_PRId64 "\n", node.node, startPerformance, + stopPerformance, atMediaTime); + + node_roll_command command; + command.start_performance_time = startPerformance; + command.stop_performance_time = stopPerformance; + command.seek_media_time = atMediaTime; + + return write_port(node.port, NODE_ROLL, &command, sizeof(command)); }