Merge "audio_hal: Change stream write size for ac3 test [1/1]"
diff --git a/Makefile b/Makefile
index 9a432ab..788258f 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,3 @@
-COMMON_OBJS=src/CircularBuffer.o
-
 PROTO_SRCS=src/audio_service.grpc.pb.cc src/audio_service.pb.cc
 PROTO_OBJS+=$(PROTO_SRCS:.cc=.o)
 
@@ -29,7 +27,7 @@
 
 CFLAGS+=-fPIC -O2 -I$(PROTOC_INC) -I./include -I. -I./src
 CXXFLAGS+=-std=c++14
-SC_LDFLAGS+=-Wl,--no-as-needed -lgrpc++_unsecure -lprotobuf -lboost_system -llog -ldl -lrt -lpthread -lstdc++ -pthread
+SC_LDFLAGS+=-Wl,--no-as-needed -lgrpc++_unsecure -lprotobuf -lboost_system -lamaudioutils -llog -ldl -lrt -lpthread -lstdc++ -pthread
 LDFLAGS+= -Wl,--no-as-needed -llog -ldl -lrt -lpthread -lstdc++ -pthread
 
 %.grpc.pb.cc: %.proto
diff --git a/src/CircularBuffer.cpp b/src/CircularBuffer.cpp
deleted file mode 100644
index fea21e4..0000000
--- a/src/CircularBuffer.cpp
+++ /dev/null
@@ -1,84 +0,0 @@
-#include <algorithm> // for std::min
-#include <iostream>
-#include <cstring>
-
-#include <boost/interprocess/managed_shared_memory.hpp>
-
-#include "CircularBuffer.h"
-
-using namespace boost::interprocess;
-
-CircularBuffer::CircularBuffer(managed_shared_memory &segment, size_t capacity)
-  : begin_index_(0)
-  , end_index_(0)
-  , size_(0)
-  , capacity_(capacity)
-  , segment_(segment)
-{
-  void *shptr = segment_.allocate(capacity);
-  handle_ = segment_.get_handle_from_address(shptr);
-}
-
-CircularBuffer::~CircularBuffer()
-{
-  void *shptr = segment_.get_address_from_handle(handle_);
-  segment_.deallocate(shptr);
-}
-
-size_t CircularBuffer::write(managed_shared_memory &segment, const uint8_t *data, size_t bytes)
-{
-  if (bytes == 0) return 0;
-
-  uint8_t *ptr = static_cast<uint8_t *>(segment.get_address_from_handle(handle_));
-  size_t capacity = capacity_;
-  size_t bytes_to_write = std::min(bytes, capacity - size_);
-
-  if (bytes_to_write <= capacity - end_index_) {
-    memcpy(ptr + end_index_, data, bytes_to_write);
-    end_index_ += bytes_to_write;
-    if (end_index_ == capacity) end_index_ = 0;
-  } else {
-    size_t size_1 = capacity - end_index_;
-    memcpy(ptr + end_index_, data, size_1);
-    size_t size_2 = bytes_to_write - size_1;
-    memcpy(ptr, data + size_1, size_2);
-    end_index_ = size_2;
-  }
-
-  size_ += bytes_to_write;
-  return bytes_to_write;
-}
-
-size_t CircularBuffer::read(managed_shared_memory &segment, uint8_t *data, size_t bytes)
-{
-  if (bytes == 0) return 0;
-
-  uint8_t *ptr = static_cast<uint8_t *>(segment.get_address_from_handle(handle_));
-  size_t capacity = capacity_;
-  size_t bytes_to_read = std::min(bytes, size_);
-
-  if (bytes_to_read <= capacity - begin_index_) {
-    memcpy(data, ptr + begin_index_, bytes_to_read);
-    begin_index_ += bytes_to_read;
-    if (begin_index_ == capacity) begin_index_ = 0;
-  } else {
-    size_t size_1 = capacity - begin_index_;
-    memcpy(data, ptr + begin_index_, size_1);
-    size_t size_2 = bytes_to_read - size_1;
-    memcpy(data + size_1, ptr, size_2);
-    begin_index_ = size_2;
-  }
-
-  size_ -= bytes_to_read;
-  return bytes_to_read;
-}
-
-uint8_t* CircularBuffer::start_ptr(managed_shared_memory &segment)
-{
-  return static_cast<uint8_t *>(segment.get_address_from_handle(handle_));
-}
-
-void CircularBuffer::reset()
-{
-  begin_index_ = end_index_ = size_ = 0;
-}
\ No newline at end of file
diff --git a/src/CircularBuffer.h b/src/CircularBuffer.h
deleted file mode 100644
index 7024e4e..0000000
--- a/src/CircularBuffer.h
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef __CIRCULARBUFFER_H
-#define __CIRCULARBUFFER_H
-
-#include <boost/interprocess/managed_shared_memory.hpp>
-
-using namespace boost::interprocess;
-
-class CircularBuffer
-{
-public:
-  CircularBuffer(managed_shared_memory &segment, size_t capacity);
-  ~CircularBuffer();
-
-  size_t size() const { return size_; }
-  size_t capacity() const { return capacity_; }
-  size_t write(managed_shared_memory &segment, const uint8_t *data, size_t bytes);
-  size_t read(managed_shared_memory &segment, uint8_t *data, size_t bytes);
-  void reset();
-  uint8_t *start_ptr(managed_shared_memory &segment);
-
-private:
-  size_t begin_index_, end_index_, size_, capacity_;
-  managed_shared_memory &segment_;
-  managed_shared_memory::handle_t handle_;
-};
-
-#endif
\ No newline at end of file
diff --git a/src/audio_client.cpp b/src/audio_client.cpp
index 4707dcf..e4980ad 100644
--- a/src/audio_client.cpp
+++ b/src/audio_client.cpp
@@ -3,7 +3,8 @@
 #include <hardware/hardware.h>
 #include <hardware/audio.h>
 
-#include "CircularBuffer.h"
+#include <IpcBuffer/audio_server_shmem.h>
+#include <IpcBuffer/IpcBuffer.h>
 #include "audio_client.h"
 
 #define LOG_TAG "audio_client"
@@ -489,9 +490,9 @@
   char *name = (audio_stream_in_to_client(stream))->name;
   Status status = stub_->StreamIn_read(&context, MakeStreamReadWrite(name, bytes), &r);
   if (r.ret() > 0) {
-    CircularBuffer *cb = shm_->find<CircularBuffer>(name).first;
+    IpcBuffer *cb = audio_server_shmem::getInstance()->find<IpcBuffer>(name).first;
     if (cb) {
-      memcpy(buffer, cb->start_ptr(*shm_), r.ret());
+      memcpy(buffer, cb->start_ptr(), r.ret());
     }
   }
   return r.ret();
@@ -547,9 +548,9 @@
   ClientContext context;
   StatusReturn r;
   char *name = (audio_stream_out_to_client(stream))->name;
-  CircularBuffer *cb = shm_->find<CircularBuffer>(name).first;
+  IpcBuffer *cb = audio_server_shmem::getInstance()->find<IpcBuffer>(name).first;
   if (cb) {
-    memcpy(cb->start_ptr(*shm_), buffer, std::min(bytes, cb->capacity()));
+    memcpy(cb->start_ptr(), buffer, std::min(bytes, cb->capacity()));
   }
   Status status = stub_->StreamOut_write(&context, MakeStreamReadWrite(name, bytes), &r);
   return r.ret();
diff --git a/src/audio_client.h b/src/audio_client.h
index 0eb3152..e9f5d53 100644
--- a/src/audio_client.h
+++ b/src/audio_client.h
@@ -8,7 +8,7 @@
 
 #include <hardware/hardware.h>
 #include <hardware/audio.h>
-#include "CircularBuffer.h"
+#include <IpcBuffer/IpcBuffer.h>
 
 #include <grpc/grpc.h>
 #include <grpcpp/channel.h>
@@ -71,9 +71,7 @@
 class AudioClient {
   public:
     AudioClient(std::shared_ptr<Channel> channel)
-      : stub_(AudioService::NewStub(channel)) {
-        shm_ = std::make_unique<managed_shared_memory>(open_only, "AudioServiceShmem");
-      }
+      : stub_(AudioService::NewStub(channel)) {}
 
     // Device methods
     int Device_common_close(struct hw_device_t* device);
@@ -171,7 +169,6 @@
     }
 
     std::unique_ptr<AudioService::Stub> stub_;
-    std::unique_ptr<managed_shared_memory> shm_;
     static std::atomic_int stream_seq_;
 };
 
diff --git a/src/audio_server.cpp b/src/audio_server.cpp
index fc070a9..f41fff8 100644
--- a/src/audio_server.cpp
+++ b/src/audio_server.cpp
@@ -22,9 +22,10 @@
 #include <grpcpp/server_builder.h>
 #include <grpcpp/server_context.h>
 #include <grpcpp/security/server_credentials.h>
+#include <IpcBuffer/audio_server_shmem.h>
+#include <IpcBuffer/IpcBuffer.h>
 #include "audio_if.h"
 #include "audio_service.grpc.pb.h"
-#include "CircularBuffer.h"
 #include "audio_effect_if.h"
 
 using grpc::Server;
@@ -73,16 +74,14 @@
 #define TRACE_EXIT()
 #endif
 
-const int AudioServerShmemSize = 16 * 1024 * 1024;
-
-typedef std::pair<CircularBuffer *, struct audio_stream_out *> streamout_map_t;
-typedef std::pair<CircularBuffer *, struct audio_stream_in *> streamin_map_t;
+typedef std::pair<IpcBuffer *, struct audio_stream_out *> streamout_map_t;
+typedef std::pair<IpcBuffer *, struct audio_stream_in *> streamin_map_t;
 
 class AudioServiceImpl final : public AudioService::Service
 {
   public:
-    explicit AudioServiceImpl(managed_shared_memory &shm)
-      : shm_(shm),
+    explicit AudioServiceImpl()
+      : shm_(audio_server_shmem::getInstance(true)),
         gc_runner_(std::thread([this] {
           while (!gc_runner_stop_) {
             streamout_gc_();
@@ -242,9 +241,10 @@
                           request->address().c_str()));
 
       if (stream) {
-        CircularBuffer * cb = shm_.find<CircularBuffer>(request->name().c_str()).first;
-        if (cb == nullptr)
-          cb = shm_.construct<CircularBuffer>(request->name().c_str())(shm_, request->size());
+        IpcBuffer * cb = shm_->find<IpcBuffer>(request->name().c_str()).first;
+        if (cb == nullptr) {
+          cb = shm_->construct<IpcBuffer>(request->name().c_str())(request->name().c_str(), request->size());
+        }
 
         std::lock_guard<std::mutex> lock(map_out_mutex_);
         streamout_map_.insert(
@@ -264,7 +264,7 @@
       dev_->close_output_stream(dev_, it->second.second);
 
       if (it->second.first) {
-        shm_.destroy<CircularBuffer>(request->name().c_str());
+        shm_->destroy<IpcBuffer>(request->name().c_str());
       }
 
       std::lock_guard<std::mutex> lock(map_out_mutex_);
@@ -298,9 +298,9 @@
                           (audio_source_t)(request->source())));
 
       if (stream) {
-        CircularBuffer * cb = shm_.find<CircularBuffer>(request->name().c_str()).first;
+        IpcBuffer * cb = shm_->find<IpcBuffer>(request->name().c_str()).first;
         if (cb == nullptr)
-          cb = shm_.construct<CircularBuffer>(request->name().c_str())(shm_, request->size());
+          cb = shm_->construct<IpcBuffer>(request->name().c_str())(request->name().c_str(), request->size());
 
         std::lock_guard<std::mutex> lock(map_in_mutex_);
         streamin_map_.insert(
@@ -320,7 +320,7 @@
       dev_->close_input_stream(dev_, it->second.second);
 
       if (it->second.first) {
-        shm_.destroy<CircularBuffer>(request->name().c_str());
+        shm_->destroy<IpcBuffer>(request->name().c_str());
       }
 
       std::lock_guard<std::mutex> lock(map_in_mutex_);
@@ -593,8 +593,8 @@
       struct audio_stream_out *stream = find_streamout(request->name(), streamout_map_);
       if (stream == nullptr) return Status::CANCELLED;
 
-      CircularBuffer *cb = shm_.find<CircularBuffer>(request->name().c_str()).first;
-      response->set_ret(stream->write(stream, cb->start_ptr(shm_), request->size()));
+      IpcBuffer *cb = shm_->find<IpcBuffer>(request->name().c_str()).first;
+      response->set_ret(stream->write(stream, cb->start_ptr(), request->size()));
       return Status::OK;
     }
 
@@ -691,8 +691,8 @@
       struct audio_stream_in *stream = find_streamin(request->name(), streamin_map_);
       if (stream == nullptr) return Status::CANCELLED;
 
-      CircularBuffer *cb = shm_.find<CircularBuffer>(request->name().c_str()).first;
-      response->set_ret(stream->read(stream, cb->start_ptr(shm_), std::min(request->size(), cb->capacity())));
+      IpcBuffer *cb = shm_->find<IpcBuffer>(request->name().c_str()).first;
+      response->set_ret(stream->read(stream, cb->start_ptr(), std::min(request->size(), cb->capacity())));
       return Status::OK;
     }
 
@@ -781,7 +781,7 @@
             ALOGI("Close disconnected output stream from PID %d", pid);
             dev_->close_output_stream(dev_, it->second.second);
             if (it->second.first) {
-              shm_.destroy<CircularBuffer>(it->first.c_str());
+              shm_->destroy<IpcBuffer>(it->first.c_str());
             }
             streamout_map_.erase(it++);
           } else {
@@ -857,7 +857,7 @@
       return nullptr;
     }
 
-    managed_shared_memory &shm_;
+    managed_shared_memory *shm_;
 
     /* audio hal interface */
     struct audio_hw_device *dev_;
@@ -877,11 +877,11 @@
 std::mutex AudioServiceImpl::map_out_mutex_;
 std::mutex AudioServiceImpl::map_in_mutex_;
 
-void RunServer(managed_shared_memory& shm)
+void RunServer()
 {
   const char *url = std::getenv("AUDIO_SERVER_SOCKET");
   std::string server_address("unix:///opt/audio_socket");
-  AudioServiceImpl service(shm);
+  AudioServiceImpl service;
   if (url) {
       server_address = url;
   }
@@ -941,8 +941,7 @@
   signal(SIGFPE, handler);
 
   shared_memory_object::remove("AudioServiceShmem");
-  managed_shared_memory shm{open_or_create, "AudioServiceShmem", AudioServerShmemSize};
 
-  RunServer(shm);
+  RunServer();
   return 0;
 }