From 0341eac71b9b939a8053c2fb5925c63814114965 Mon Sep 17 00:00:00 2001 From: Dario Casalinuovo Date: Tue, 14 Apr 2015 19:25:13 +0200 Subject: [PATCH] BufferConsumer: rework SetOutputBuffersFor * Use MemoryDeleter. * Avoid use of dynamic allocation. --- src/kits/media/BufferConsumer.cpp | 51 ++++++++++++++----------------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/src/kits/media/BufferConsumer.cpp b/src/kits/media/BufferConsumer.cpp index edd5b573d1..49ae38419c 100644 --- a/src/kits/media/BufferConsumer.cpp +++ b/src/kits/media/BufferConsumer.cpp @@ -33,6 +33,7 @@ #include #include +#include #include #include #include @@ -266,53 +267,47 @@ BBufferConsumer::SetOutputBuffersFor(const media_source &source, if (IS_INVALID_DESTINATION(destination)) return B_MEDIA_BAD_DESTINATION; - producer_set_buffer_group_command *command; - BBuffer **buffers; - int32 buffer_count; - size_t size; - status_t rv; + int32 buffer_count = 0; - if (group == 0) { - buffer_count = 0; - } else { - if (B_OK != group->CountBuffers(&buffer_count)) + if (group > 0) { + if (group->CountBuffers(&buffer_count) != B_OK) return B_ERROR; } - if (buffer_count != 0) { - buffers = new BBuffer * [buffer_count]; - if (B_OK != group->GetBufferList(buffer_count, buffers)) { - delete [] buffers; - return B_ERROR; - } - } else { - buffers = NULL; - } + size_t size = sizeof(producer_set_buffer_group_command) + + buffer_count * sizeof(media_buffer_id); + + producer_set_buffer_group_command *command + = static_cast(malloc(size)); + MemoryDeleter deleter(command); - size = sizeof(producer_set_buffer_group_command) + buffer_count * sizeof(media_buffer_id); - command = static_cast(malloc(size)); command->source = source; command->destination = destination; command->user_data = user_data; command->change_tag = NewChangeTag(); - command->buffer_count = buffer_count; - for (int32 i = 0; i < buffer_count; i++) - command->buffers[i] = buffers[i]->ID(); - delete [] buffers; + BBuffer *buffers[buffer_count]; + if (buffer_count != 0) { + if (group->GetBufferList(buffer_count, buffers) != B_OK) + return B_ERROR; + for (int32 i = 0; i < buffer_count; i++) + command->buffers[i] = buffers[i]->ID(); + } + + command->buffer_count = buffer_count; if (change_tag != NULL) *change_tag = command->change_tag; - rv = SendToPort(source.port, PRODUCER_SET_BUFFER_GROUP, command, size); - free(command); + status_t status = SendToPort(source.port, PRODUCER_SET_BUFFER_GROUP, + command, size); - if (rv == B_OK) { + if (status == B_OK) { // XXX will leak memory if port write failed delete fDeleteBufferGroup; fDeleteBufferGroup = will_reclaim ? NULL : group; } - return rv; + return status; }