[haiku-commits] haiku: hrev49397 - src/kits/media src/tests/kits/media/nodetest headers/private/media

  • From: b.vitruvio@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Mon, 13 Jul 2015 18:18:02 +0200 (CEST)

hrev49397 adds 2 changesets to branch 'master'
old head: 76e7f5688dcd7dd36cad23f75701a8b2299580b3
new head: fb6c8a04795cf23e26ccd168de8b34ef864b4679
overview:
http://cgit.haiku-os.org/haiku/log/?qt=range&q=fb6c8a04795c+%5E76e7f5688dcd

----------------------------------------------------------------------------

c079d8d6d904: Implement BMediaRoster::GetNodeAttributesFor

fb6c8a04795c: NodeTest: Add GetNodeAttributesFor test

[ Dario Casalinuovo <b.vitruvio@xxxxxxxxx> ]

----------------------------------------------------------------------------

8 files changed, 127 insertions(+), 9 deletions(-)
headers/private/media/ServerInterface.h | 10 ++++++
src/kits/media/MediaNode.cpp | 39 +++++++++++++++++++++-
src/kits/media/MediaRoster.cpp | 37 ++++++++++++++++++--
src/tests/kits/media/nodetest/ProducerNode.cpp | 14 ++++++++
src/tests/kits/media/nodetest/ProducerNode.h | 11 ++++--
src/tests/kits/media/nodetest/main.cpp | 14 ++++++--
src/tests/kits/media/nodetest/misc.cpp | 10 +++++-
src/tests/kits/media/nodetest/misc.h | 1 +

############################################################################

Commit: c079d8d6d9048763ce2daab04f7d9474711775c8
URL: http://cgit.haiku-os.org/haiku/commit/?id=c079d8d6d904
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Sun Jul 12 16:17:25 2015 UTC

Implement BMediaRoster::GetNodeAttributesFor

----------------------------------------------------------------------------

diff --git a/headers/private/media/ServerInterface.h
b/headers/private/media/ServerInterface.h
index 6c126db..116de33 100644
--- a/headers/private/media/ServerInterface.h
+++ b/headers/private/media/ServerInterface.h
@@ -93,6 +93,7 @@ enum {
NODE_SYNC_TO,
NODE_SET_TIMESOURCE,
NODE_GET_TIMESOURCE,
+ NODE_GET_ATTRIBUTES_FOR,
NODE_REQUEST_COMPLETED,
NODE_FINAL_RELEASE,
NODE_MESSAGE_END,
@@ -946,6 +947,15 @@ struct node_get_timesource_reply : reply_data {
media_node_id timesource_id;
};

+struct node_get_attributes_for_request : request_data {
+ size_t count;
+ area_id area;
+};
+
+struct node_get_attributes_for_reply : reply_data {
+ size_t filled_count;
+};
+
struct node_final_release_command : command_data {
};

diff --git a/src/kits/media/MediaNode.cpp b/src/kits/media/MediaNode.cpp
index f146d04..bece94a 100644
--- a/src/kits/media/MediaNode.cpp
+++ b/src/kits/media/MediaNode.cpp
@@ -35,6 +35,7 @@
#include <FileInterface.h>
#include <MediaRoster.h>
#include <MediaNode.h>
+#include <SupportDefs.h>
#include <TimeSource.h>

#include <string.h>
@@ -707,6 +708,42 @@ BMediaNode::HandleMessage(int32 message, const void* data,
size_t size)
return B_OK;
}

+ case NODE_GET_ATTRIBUTES_FOR:
+ {
+ const node_get_attributes_for_request *request =
+ (const node_get_attributes_for_request*) data;
+
+ TRACE("BMediaNode::HandleMessage
NODE_GET_ATTRIBUTES_FOR,"
+ "node %ld\n", fNodeID);
+
+ node_get_attributes_for_reply reply;
+
+ media_node_attribute* addr;
+ area_id dataArea = clone_area("client attributes area",
+ (void**)&addr, B_ANY_ADDRESS, B_WRITE_AREA,
+ request->area);
+
+ if (dataArea < 0) {
+ ERROR("NODE_GET_ATTRIBUTES_FOR can't clone
area\n");
+ return B_NO_MEMORY;
+ }
+
+ status_t status = GetNodeAttributes(addr,
request->count);
+ if (status == B_OK) {
+ // NOTE: we do it because there's not an easy
way
+ // to guess the number of attributes filled.
+ size_t i;
+ for (i = 0; i < request->count; i++) {
+ if (addr[i].what <= 0)
+ break;
+ }
+ reply.filled_count = i;
+ }
+ request->SendReply(status, &reply, sizeof(reply));
+ delete_area(dataArea);
+ return B_OK;
+ }
+
case NODE_REQUEST_COMPLETED:
{
const node_request_completed_command* command
@@ -831,7 +868,7 @@ BMediaNode::GetNodeAttributes(media_node_attribute*
outAttributes,
{
CALLED();
// This is implemented by derived classes that fills
- // it's own attributes to a max of inMaxCount size.
+ // it's own attributes to a max of inMaxCount elements.
return B_ERROR;
}

diff --git a/src/kits/media/MediaRoster.cpp b/src/kits/media/MediaRoster.cpp
index 52bc59a..e0e65db 100644
--- a/src/kits/media/MediaRoster.cpp
+++ b/src/kits/media/MediaRoster.cpp
@@ -3123,8 +3123,41 @@ ssize_t
BMediaRoster::GetNodeAttributesFor(const media_node& node,
media_node_attribute* _array, size_t maxCount)
{
- UNIMPLEMENTED();
- return B_ERROR;
+ CALLED();
+
+ if (IS_INVALID_NODE(node))
+ return B_MEDIA_BAD_NODE;
+
+ node_get_attributes_for_request request;
+ node_get_attributes_for_reply reply;
+ status_t status;
+
+ media_node_attribute* addr = NULL;
+ size_t totalSize = maxCount*sizeof(media_node_attribute);
+ size_t size = (totalSize + (B_PAGE_SIZE - 1)) & ~(B_PAGE_SIZE - 1);
+
+ area_id dataArea = create_area("attributes area", (void**)&addr,
+ B_ANY_ADDRESS, size, B_NO_LOCK,
+ B_READ_AREA | B_WRITE_AREA);
+ // No need to memset the padding
+ memset(addr, 0, totalSize);
+
+ if (dataArea < 0)
+ return B_NO_MEMORY;
+
+ request.count = maxCount;
+ request.area = dataArea;
+
+ status = QueryPort(node.port, NODE_GET_ATTRIBUTES_FOR, &request,
+ sizeof(request), &reply, sizeof(reply));
+ if (status != B_OK)
+ return status;
+
+ memcpy(_array, addr, reply.filled_count
+ * sizeof(media_node_attribute));
+
+ delete_area(dataArea);
+ return reply.filled_count;
}



############################################################################

Revision: hrev49397
Commit: fb6c8a04795cf23e26ccd168de8b34ef864b4679
URL: http://cgit.haiku-os.org/haiku/commit/?id=fb6c8a04795c
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Mon Jul 13 13:37:23 2015 UTC

NodeTest: Add GetNodeAttributesFor test

----------------------------------------------------------------------------

diff --git a/src/tests/kits/media/nodetest/ProducerNode.cpp
b/src/tests/kits/media/nodetest/ProducerNode.cpp
index 13e47b4..a686984 100644
--- a/src/tests/kits/media/nodetest/ProducerNode.cpp
+++ b/src/tests/kits/media/nodetest/ProducerNode.cpp
@@ -4,6 +4,7 @@

#include <Buffer.h>
#include <BufferGroup.h>
+#include <MediaNode.h>
#include <TimeSource.h>

#include "misc.h"
@@ -46,6 +47,19 @@ ProducerNode::NodeRegistered()


status_t
+ProducerNode::GetNodeAttributes(
+ media_node_attribute* attributes, size_t count)
+{
+ uint32 what = media_node_attribute::B_FIRST_USER_ATTRIBUTE;
+ for (size_t i = 0; i < count; i++) {
+ attributes[i].what = what;
+ what++;
+ }
+ return B_OK;
+}
+
+
+status_t
ProducerNode::FormatSuggestionRequested(media_type type, int32 quality,
media_format* format)
{
diff --git a/src/tests/kits/media/nodetest/ProducerNode.h
b/src/tests/kits/media/nodetest/ProducerNode.h
index deeca06..c1b82e9 100644
--- a/src/tests/kits/media/nodetest/ProducerNode.h
+++ b/src/tests/kits/media/nodetest/ProducerNode.h
@@ -15,6 +15,10 @@ virtual BMediaAddOn* AddOn(

virtual void NodeRegistered();

+virtual status_t GetNodeAttributes(
+ media_node_attribute* attributes,
+ size_t count);
+
/* functionality of BBufferProducer */
virtual status_t FormatSuggestionRequested(
media_type type,
@@ -84,9 +88,10 @@ virtual void LatencyChanged(
uint32 flags);

/* functionality of BMediaEventLooper */
-virtual void HandleEvent(const media_timed_event *event,
- bigtime_t lateness,
- bool realTimeEvent = false);
+virtual void HandleEvent(
+ const media_timed_event *event,
+ bigtime_t lateness,
+ bool realTimeEvent = false);

/* our own functionality */
void InitializeOutput();
diff --git a/src/tests/kits/media/nodetest/main.cpp
b/src/tests/kits/media/nodetest/main.cpp
index 481277e..33a6446 100644
--- a/src/tests/kits/media/nodetest/main.cpp
+++ b/src/tests/kits/media/nodetest/main.cpp
@@ -1,10 +1,14 @@
-#include <string.h>
#include <Application.h>
+#include <MediaDefs.h>
#include <MediaRoster.h>
#include <TimeSource.h>
+
+#include <string.h>
+
#include "ConsumerNode.h"
-#include "ProducerNode.h"
#include "misc.h"
+#include "ProducerNode.h"
+

BMediaRoster *roster;
ProducerNode *producer;
@@ -172,6 +176,12 @@ int main()
val(rv);
out("Found %ld\n",count);

+ out("Calling GetAttNodeAttributesFor(source)\n");
+ media_node_attribute attr[10];
+ ssize_t size = roster->GetNodeAttributesFor(sourceNode, attr, 10);
+ val_size(size);
+ out("Found %" B_PRIdSSIZE "\n", size);
+
media_format format;
format.type = B_MEDIA_RAW_AUDIO;
format.u.raw_audio = media_raw_audio_format::wildcard;
diff --git a/src/tests/kits/media/nodetest/misc.cpp
b/src/tests/kits/media/nodetest/misc.cpp
index aaaa0fc..72ec290 100644
--- a/src/tests/kits/media/nodetest/misc.cpp
+++ b/src/tests/kits/media/nodetest/misc.cpp
@@ -13,10 +13,18 @@ void val(status_t status)
{
if (status == B_OK)
out("OK\n");
- else
+ else
out("failed, 0x%08x, %s\n",status,strerror(status));
}

+void val_size(ssize_t size)
+{
+ if (size >= 0)
+ out("OK\n");
+ else
+ out("failed, size %" B_PRIdSSIZE ", error %s\n", size,
strerror(size));
+}
+
void wait()
{
out("press enter to continue\n");
diff --git a/src/tests/kits/media/nodetest/misc.h
b/src/tests/kits/media/nodetest/misc.h
index 57deb08..83d2263 100644
--- a/src/tests/kits/media/nodetest/misc.h
+++ b/src/tests/kits/media/nodetest/misc.h
@@ -3,6 +3,7 @@

void val(void *p);
void val(status_t status);
+void val_size(ssize_t size);

void wait();
void out(const char *format,...);


Other related posts:

  • » [haiku-commits] haiku: hrev49397 - src/kits/media src/tests/kits/media/nodetest headers/private/media - b . vitruvio