Refactor WebRtc_CreateBuffer to return the instance.

Review URL: https://webrtc-codereview.appspot.com/1140005

git-svn-id: http://webrtc.googlecode.com/svn/trunk@3574 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/modules/audio_processing/aec/aec_core.c b/webrtc/modules/audio_processing/aec/aec_core.c
index 1b747b8..d638b72 100644
--- a/webrtc/modules/audio_processing/aec/aec_core.c
+++ b/webrtc/modules/audio_processing/aec/aec_core.c
@@ -164,54 +164,57 @@
         return -1;
     }
 
-    if (WebRtc_CreateBuffer(&aec->nearFrBuf,
-                            FRAME_LEN + PART_LEN,
-                            sizeof(int16_t)) == -1) {
+    aec->nearFrBuf = WebRtc_CreateBuffer(FRAME_LEN + PART_LEN,
+                                         sizeof(int16_t));
+    if (!aec->nearFrBuf) {
         WebRtcAec_FreeAec(aec);
         aec = NULL;
         return -1;
     }
 
-    if (WebRtc_CreateBuffer(&aec->outFrBuf,
-                            FRAME_LEN + PART_LEN,
-                            sizeof(int16_t)) == -1) {
+    aec->outFrBuf = WebRtc_CreateBuffer(FRAME_LEN + PART_LEN,
+                                        sizeof(int16_t));
+    if (!aec->outFrBuf) {
         WebRtcAec_FreeAec(aec);
         aec = NULL;
         return -1;
     }
 
-    if (WebRtc_CreateBuffer(&aec->nearFrBufH,
-                            FRAME_LEN + PART_LEN,
-                            sizeof(int16_t)) == -1) {
+    aec->nearFrBufH = WebRtc_CreateBuffer(FRAME_LEN + PART_LEN,
+                                          sizeof(int16_t));
+    if (!aec->nearFrBufH) {
         WebRtcAec_FreeAec(aec);
         aec = NULL;
         return -1;
     }
 
-    if (WebRtc_CreateBuffer(&aec->outFrBufH,
-                            FRAME_LEN + PART_LEN,
-                            sizeof(int16_t)) == -1) {
+    aec->outFrBufH = WebRtc_CreateBuffer(FRAME_LEN + PART_LEN,
+                                         sizeof(int16_t));
+    if (!aec->outFrBufH) {
         WebRtcAec_FreeAec(aec);
         aec = NULL;
         return -1;
     }
 
     // Create far-end buffers.
-    if (WebRtc_CreateBuffer(&aec->far_buf, kBufSizePartitions,
-                            sizeof(float) * 2 * PART_LEN1) == -1) {
+    aec->far_buf = WebRtc_CreateBuffer(kBufSizePartitions,
+                                       sizeof(float) * 2 * PART_LEN1);
+    if (!aec->far_buf) {
         WebRtcAec_FreeAec(aec);
         aec = NULL;
         return -1;
     }
-    if (WebRtc_CreateBuffer(&aec->far_buf_windowed, kBufSizePartitions,
-                            sizeof(float) * 2 * PART_LEN1) == -1) {
+    aec->far_buf_windowed = WebRtc_CreateBuffer(kBufSizePartitions,
+                                                sizeof(float) * 2 * PART_LEN1);
+    if (!aec->far_buf_windowed) {
         WebRtcAec_FreeAec(aec);
         aec = NULL;
         return -1;
     }
 #ifdef WEBRTC_AEC_DEBUG_DUMP
-    if (WebRtc_CreateBuffer(&aec->far_time_buf, kBufSizePartitions,
-                            sizeof(int16_t) * PART_LEN) == -1) {
+    aec->far_time_buf = WebRtc_CreateBuffer(kBufSizePartitions,
+                                            sizeof(int16_t) * PART_LEN);
+    if (!aec->far_time_buf) {
         WebRtcAec_FreeAec(aec);
         aec = NULL;
         return -1;
diff --git a/webrtc/modules/audio_processing/aec/echo_cancellation.c b/webrtc/modules/audio_processing/aec/echo_cancellation.c
index 4066281..8fd9fe9 100644
--- a/webrtc/modules/audio_processing/aec/echo_cancellation.c
+++ b/webrtc/modules/audio_processing/aec/echo_cancellation.c
@@ -72,9 +72,9 @@
     // Create far-end pre-buffer. The buffer size has to be large enough for
     // largest possible drift compensation (kResamplerBufferSize) + "almost" an
     // FFT buffer (PART_LEN2 - 1).
-    if (WebRtc_CreateBuffer(&aecpc->far_pre_buf,
-                            PART_LEN2 + kResamplerBufferSize,
-                            sizeof(float)) == -1) {
+    aecpc->far_pre_buf = WebRtc_CreateBuffer(PART_LEN2 + kResamplerBufferSize,
+                                             sizeof(float));
+    if (!aecpc->far_pre_buf) {
         WebRtcAec_Free(aecpc);
         aecpc = NULL;
         return -1;
@@ -84,9 +84,9 @@
     aecpc->lastError = 0;
 
 #ifdef WEBRTC_AEC_DEBUG_DUMP
-    if (WebRtc_CreateBuffer(&aecpc->far_pre_buf_s16,
-                            PART_LEN2 + kResamplerBufferSize,
-                            sizeof(int16_t)) == -1) {
+    aecpc->far_pre_buf_s16 = WebRtc_CreateBuffer(
+        PART_LEN2 + kResamplerBufferSize, sizeof(float));
+    if (!aecpc->far_pre_buf_s16) {
         WebRtcAec_Free(aecpc);
         aecpc = NULL;
         return -1;
diff --git a/webrtc/modules/audio_processing/aecm/aecm_core.c b/webrtc/modules/audio_processing/aecm/aecm_core.c
index a81912e..1368263 100644
--- a/webrtc/modules/audio_processing/aecm/aecm_core.c
+++ b/webrtc/modules/audio_processing/aecm/aecm_core.c
@@ -256,32 +256,36 @@
         return -1;
     }
 
-    if (WebRtc_CreateBuffer(&aecm->farFrameBuf, FRAME_LEN + PART_LEN,
-                            sizeof(int16_t)) == -1)
+    aecm->farFrameBuf = WebRtc_CreateBuffer(FRAME_LEN + PART_LEN,
+                                            sizeof(int16_t));
+    if (!aecm->farFrameBuf)
     {
         WebRtcAecm_FreeCore(aecm);
         aecm = NULL;
         return -1;
     }
 
-    if (WebRtc_CreateBuffer(&aecm->nearNoisyFrameBuf, FRAME_LEN + PART_LEN,
-                            sizeof(int16_t)) == -1)
+    aecm->nearNoisyFrameBuf = WebRtc_CreateBuffer(FRAME_LEN + PART_LEN,
+                                                  sizeof(int16_t));
+    if (!aecm->nearNoisyFrameBuf)
     {
         WebRtcAecm_FreeCore(aecm);
         aecm = NULL;
         return -1;
     }
 
-    if (WebRtc_CreateBuffer(&aecm->nearCleanFrameBuf, FRAME_LEN + PART_LEN,
-                            sizeof(int16_t)) == -1)
+    aecm->nearCleanFrameBuf = WebRtc_CreateBuffer(FRAME_LEN + PART_LEN,
+                                                  sizeof(int16_t));
+    if (!aecm->nearCleanFrameBuf)
     {
         WebRtcAecm_FreeCore(aecm);
         aecm = NULL;
         return -1;
     }
 
-    if (WebRtc_CreateBuffer(&aecm->outFrameBuf, FRAME_LEN + PART_LEN,
-                            sizeof(int16_t)) == -1)
+    aecm->outFrameBuf = WebRtc_CreateBuffer(FRAME_LEN + PART_LEN,
+                                            sizeof(int16_t));
+    if (!aecm->outFrameBuf)
     {
         WebRtcAecm_FreeCore(aecm);
         aecm = NULL;
diff --git a/webrtc/modules/audio_processing/aecm/echo_control_mobile.c b/webrtc/modules/audio_processing/aecm/echo_control_mobile.c
index 85bbcd4..881f7a5 100644
--- a/webrtc/modules/audio_processing/aecm/echo_control_mobile.c
+++ b/webrtc/modules/audio_processing/aecm/echo_control_mobile.c
@@ -102,8 +102,9 @@
         return -1;
     }
 
-    if (WebRtc_CreateBuffer(&aecm->farendBuf, kBufSizeSamp,
-                            sizeof(int16_t)) == -1)
+    aecm->farendBuf = WebRtc_CreateBuffer(kBufSizeSamp,
+                                          sizeof(int16_t));
+    if (!aecm->farendBuf)
     {
         WebRtcAecm_Free(aecm);
         aecm = NULL;
diff --git a/webrtc/modules/audio_processing/utility/ring_buffer.c b/webrtc/modules/audio_processing/utility/ring_buffer.c
index bc21f85..617c30f 100644
--- a/webrtc/modules/audio_processing/utility/ring_buffer.c
+++ b/webrtc/modules/audio_processing/utility/ring_buffer.c
@@ -65,34 +65,28 @@
   return read_elements;
 }
 
-int WebRtc_CreateBuffer(RingBuffer** handle,
-                        size_t element_count,
-                        size_t element_size) {
+RingBuffer* WebRtc_CreateBuffer(size_t element_count, size_t element_size) {
   RingBuffer* self = NULL;
-  if (!handle) {
-    return -1;
-  }
   if (element_count == 0 || element_size == 0) {
-    return -1;
+    return NULL;
   }
 
   self = malloc(sizeof(RingBuffer));
   if (!self) {
-    return -1;
+    return NULL;
   }
-  *handle = self;
 
   self->data = malloc(element_count * element_size);
   if (!self->data) {
     free(self);
     self = NULL;
-    return -1;
+    return NULL;
   }
 
   self->element_count = element_count;
   self->element_size = element_size;
 
-  return 0;
+  return self;
 }
 
 int WebRtc_InitBuffer(RingBuffer* self) {
diff --git a/webrtc/modules/audio_processing/utility/ring_buffer.h b/webrtc/modules/audio_processing/utility/ring_buffer.h
index ee9a0c6..61d25ba 100644
--- a/webrtc/modules/audio_processing/utility/ring_buffer.h
+++ b/webrtc/modules/audio_processing/utility/ring_buffer.h
@@ -18,9 +18,8 @@
 
 typedef struct RingBuffer RingBuffer;
 
-int WebRtc_CreateBuffer(RingBuffer** handle,
-                        size_t element_count,
-                        size_t element_size);
+// Returns NULL on failure.
+RingBuffer* WebRtc_CreateBuffer(size_t element_count, size_t element_size);
 int WebRtc_InitBuffer(RingBuffer* handle);
 void WebRtc_FreeBuffer(void* handle);
 
diff --git a/webrtc/modules/audio_processing/utility/ring_buffer_unittest.cc b/webrtc/modules/audio_processing/utility/ring_buffer_unittest.cc
index eef8b5f..365eb2d 100644
--- a/webrtc/modules/audio_processing/utility/ring_buffer_unittest.cc
+++ b/webrtc/modules/audio_processing/utility/ring_buffer_unittest.cc
@@ -58,9 +58,8 @@
     const int buffer_size = std::max(rand() % kMaxBufferSize, 1);
     scoped_array<int> write_data(new int[buffer_size]);
     scoped_array<int> read_data(new int[buffer_size]);
-    scoped_ring_buffer buffer;
-    ASSERT_EQ(0, WebRtc_CreateBuffer(buffer.accept(), buffer_size,
-                                     sizeof(int)));
+    scoped_ring_buffer buffer(WebRtc_CreateBuffer(buffer_size, sizeof(int)));
+    ASSERT_TRUE(buffer.get() != NULL);
     ASSERT_EQ(0, WebRtc_InitBuffer(buffer.get()));
     int buffer_consumed = 0;
     int write_element = 0;
@@ -112,13 +111,13 @@
 }
 
 TEST(RingBufferTest, PassingNulltoReadBufferForcesMemcpy) {
-  scoped_ring_buffer buffer;
   const size_t kDataSize = 2;
   int write_data[kDataSize];
   int read_data[kDataSize];
   int* data_ptr;
 
-  ASSERT_EQ(0, WebRtc_CreateBuffer(buffer.accept(), kDataSize, sizeof(int)));
+  scoped_ring_buffer buffer(WebRtc_CreateBuffer(kDataSize, sizeof(int)));
+  ASSERT_TRUE(buffer.get() != NULL);
   ASSERT_EQ(0, WebRtc_InitBuffer(buffer.get()));
 
   SetIncrementingData(write_data, kDataSize, 0);
@@ -137,4 +136,12 @@
   CheckIncrementingData(read_data, kDataSize, 0);
 }
 
+TEST(RingBufferTest, CreateHandlesErrors) {
+  EXPECT_TRUE(WebRtc_CreateBuffer(0, 1) == NULL);
+  EXPECT_TRUE(WebRtc_CreateBuffer(1, 0) == NULL);
+  RingBuffer* buffer = WebRtc_CreateBuffer(1, 1);
+  EXPECT_TRUE(buffer != NULL);
+  WebRtc_FreeBuffer(buffer);
+}
+
 }  // namespace webrtc