audio_hal: Move CircularBuffer to aml_amaudioutils IpcBuffer. [2/1]
PD#TV-25733
Problem:
To implement Roku low level audio capture feature,
need enhance IPC circular buffer functions.
Solution:
Move CircularBuffer to more generic IpcBuffer
API in aml_amaudioutils lib.
Verify:
Verified with Roku build on T5D.
Change-Id: I5e41800a491d6096616f391bce5bd6d522068e73
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;
}