diff --git a/src/media/audio/opensl/audio_player.h b/src/media/audio/opensl/audio_player.h index 8f50bb262355ef90dd2f60a67e043fccb0a4f44a..8a2b69ae21cb9920cf8d3c8ef98a971088118ba6 100644 --- a/src/media/audio/opensl/audio_player.h +++ b/src/media/audio/opensl/audio_player.h @@ -19,6 +19,7 @@ #include "audio_common.h" #include "buf_manager.h" +#include "noncopyable.h" #include <sys/types.h> #include <SLES/OpenSLES_Android.h> @@ -45,6 +46,8 @@ class AudioPlayer { public: explicit AudioPlayer(ring::AudioFormat sampleFormat, SLEngineItf engine, SLint32 streamType); ~AudioPlayer(); + NON_COPYABLE(AudioPlayer); + bool start(); void stop(); bool started() const; diff --git a/src/media/audio/opensl/audio_recorder.h b/src/media/audio/opensl/audio_recorder.h index b528b8f20b2177f734571922a53d0a37e16ca7d9..a091d210fbc38bf4a80fdd8a03239228403b5125 100644 --- a/src/media/audio/opensl/audio_recorder.h +++ b/src/media/audio/opensl/audio_recorder.h @@ -23,6 +23,7 @@ #include "audio_common.h" #include "buf_manager.h" +#include "noncopyable.h" namespace ring { namespace opensl { @@ -43,6 +44,8 @@ class AudioRecorder { public: explicit AudioRecorder(ring::AudioFormat, SLEngineItf engineEngine); ~AudioRecorder(); + NON_COPYABLE(AudioRecorder); + bool start(); bool stop(); void setBufQueues(AudioQueue *freeQ, AudioQueue *recQ); diff --git a/src/media/audio/opensl/buf_manager.h b/src/media/audio/opensl/buf_manager.h index 497402e648d8645857962df52314c52813f7944e..0260bf0d6e3b3cf231b0e0bd8ca5503aeec3dd07 100644 --- a/src/media/audio/opensl/buf_manager.h +++ b/src/media/audio/opensl/buf_manager.h @@ -149,13 +149,8 @@ public: private: NON_COPYABLE(ProducerConsumerQueue); std::vector<T> buffer_; - - // forcing cache line alignment to eliminate false sharing of the - // frequently-updated read and write pointers. The object is to never - // let these get into the "shared" state where they'd cause a cache miss - // for every write. - alignas(CACHE_ALIGN) std::atomic<int> read_ { 0 }; - alignas(CACHE_ALIGN) std::atomic<int> write_ { 0 }; + std::atomic<int> read_ { 0 }; + std::atomic<int> write_ { 0 }; }; struct sample_buf { @@ -169,6 +164,15 @@ struct sample_buf { o.cap_ = 0; o.size_ = 0; } + sample_buf& operator=(sample_buf&& o) { + buf_ = o.buf_; + cap_ = o.cap_; + size_ = o.size_; + o.buf_ = nullptr; + o.cap_ = 0; + o.size_ = 0; + return *this; + } ~sample_buf() { if (buf_) delete[] buf_; @@ -177,16 +181,3 @@ struct sample_buf { }; using AudioQueue = ProducerConsumerQueue<sample_buf*>; - -__inline__ std::vector<sample_buf> -allocateSampleBufs(unsigned count, size_t sizeInByte) -{ - std::vector<sample_buf> bufs; - if (!count || !sizeInByte) - return bufs; - bufs.reserve(count); - size_t allocSize = (sizeInByte + 3) & ~3; // padding to 4 bytes aligned - for(unsigned i =0; i < count; i++) - bufs.emplace_back(allocSize, sizeInByte); - return bufs; -} diff --git a/src/media/audio/opensl/opensllayer.cpp b/src/media/audio/opensl/opensllayer.cpp index d02e010e19f16f4b6ed1eb104ff913981c34bd2a..51e0283c579e29bbd0b6d60e2be9ff5e0acd6ac9 100644 --- a/src/media/audio/opensl/opensllayer.cpp +++ b/src/media/audio/opensl/opensllayer.cpp @@ -136,6 +136,19 @@ OpenSLLayer::stopStream() bufs_.clear(); } +std::vector<sample_buf> +allocateSampleBufs(unsigned count, size_t sizeInByte) +{ + std::vector<sample_buf> bufs; + if (!count || !sizeInByte) + return bufs; + bufs.reserve(count); + size_t allocSize = (sizeInByte + 3) & ~3; // padding to 4 bytes aligned + for(unsigned i =0; i < count; i++) + bufs.emplace_back(allocSize, sizeInByte); + return bufs; +} + void OpenSLLayer::initAudioEngine() { diff --git a/src/media/audio/opensl/opensllayer.h b/src/media/audio/opensl/opensllayer.h index f3785b8fc3a888898ae1d89669242e8d335a30da..03da9ca85dc2129faffe89a119f53a732fb0ca95 100644 --- a/src/media/audio/opensl/opensllayer.h +++ b/src/media/audio/opensl/opensllayer.h @@ -175,18 +175,18 @@ class OpenSLLayer : public AudioLayer { AudioQueue freeRingBufQueue_ {BUF_COUNT}; AudioQueue ringBufQueue_ {BUF_COUNT}; - std::thread playThread; - std::mutex playMtx; - std::condition_variable playCv; + std::mutex playMtx {}; + std::condition_variable playCv {}; + std::thread playThread {}; AudioQueue freeRecBufQueue_ {BUF_COUNT}; //Owner of the queue AudioQueue recBufQueue_ {BUF_COUNT}; //Owner of the queue - std::thread recThread; - std::mutex recMtx; - std::condition_variable recCv; + std::mutex recMtx {}; + std::condition_variable recCv {}; + std::thread recThread {}; - std::vector<sample_buf> bufs_; + std::vector<sample_buf> bufs_ {}; AudioFormat hardwareFormat_ {AudioFormat::MONO()}; size_t hardwareBuffSize_ {BUFFER_SIZE};