diff --git a/src/media/audio/opensl/audio_player.cpp b/src/media/audio/opensl/audio_player.cpp
index 5fc9b50a5fd671b0ab2be93ecdde36ebb70645d9..7760c803f35a65c28f2c3c34ff322e64ebdb0071 100644
--- a/src/media/audio/opensl/audio_player.cpp
+++ b/src/media/audio/opensl/audio_player.cpp
@@ -197,6 +197,7 @@ bool
 AudioPlayer::start()
 {
     JAMI_DBG("OpenSL playback start");
+    std::unique_lock<std::mutex> lk(m_);
     SLuint32 state;
     SLresult result = (*playItf_)->GetPlayState(playItf_, &state);
     if (result != SL_RESULT_SUCCESS)
@@ -211,6 +212,7 @@ AudioPlayer::start()
         (*playBufferQueueItf_)->Enqueue(playBufferQueueItf_, silentBuf_.buf_, silentBuf_.size_));
     devShadowQueue_.push(&silentBuf_);
 
+    lk.unlock();
     result = (*playItf_)->SetPlayState(playItf_, SL_PLAYSTATE_PLAYING);
     SLASSERT(result);
 
@@ -233,13 +235,13 @@ AudioPlayer::stop()
     JAMI_DBG("OpenSL playback stop");
     SLuint32 state;
 
+    std::lock_guard<std::mutex> lk(m_);
     SLresult result = (*playItf_)->GetPlayState(playItf_, &state);
     SLASSERT(result);
 
     if (state == SL_PLAYSTATE_STOPPED)
         return;
 
-    std::lock_guard<std::mutex> lk(m_);
     callback_ = {};
     result = (*playItf_)->SetPlayState(playItf_, SL_PLAYSTATE_STOPPED);
     SLASSERT(result);
diff --git a/src/media/audio/opensl/opensllayer.cpp b/src/media/audio/opensl/opensllayer.cpp
index 2558cff64a645b0595b039e767cf92270fbaabc7..9766ff94699496e6cc3be9ebac03e438064a7c8a 100644
--- a/src/media/audio/opensl/opensllayer.cpp
+++ b/src/media/audio/opensl/opensllayer.cpp
@@ -112,7 +112,7 @@ OpenSLLayer::startStream(AudioDeviceType stream)
 void
 OpenSLLayer::stopStream(AudioDeviceType stream)
 {
-    std::unique_lock<std::mutex> lock(mutex_);
+    std::lock_guard<std::mutex> lock(mutex_);
     JAMI_WARN("Stopping OpenSL audio layer for type %u", (unsigned) stream);
 
     if (stream == AudioDeviceType::PLAYBACK) {
@@ -152,6 +152,7 @@ allocateSampleBufs(unsigned count, size_t sizeInByte)
 void
 OpenSLLayer::initAudioEngine()
 {
+    JAMI_WARN("OpenSL init started");
     std::vector<int32_t> hw_infos;
     hw_infos.reserve(4);
     emitSignal<DRing::ConfigurationSignal::GetHardwareAudioFormat>(&hw_infos);
@@ -159,6 +160,7 @@ OpenSLLayer::initAudioEngine()
     hardwareBuffSize_ = hw_infos[1];
     hardwareFormatAvailable(hardwareFormat_, hardwareBuffSize_);
 
+    std::lock_guard<std::mutex> lock(mutex_);
     SLASSERT(slCreateEngine(&engineObject_, 0, nullptr, 0, nullptr, nullptr));
     SLASSERT((*engineObject_)->Realize(engineObject_, SL_BOOLEAN_FALSE));
     SLASSERT((*engineObject_)->GetInterface(engineObject_, SL_IID_ENGINE, &engineInterface_));
@@ -171,11 +173,13 @@ OpenSLLayer::initAudioEngine()
         freeRingBufQueue_.push(&bufs_[i]);
     for (int i = 2 * BUF_COUNT; i < 3 * BUF_COUNT; i++)
         freeRecBufQueue_.push(&bufs_[i]);
+    JAMI_WARN("OpenSL init ended");
 }
 
 void
 OpenSLLayer::shutdownAudioEngine()
 {
+    JAMI_DBG("Stopping OpenSL");
     stopAudioCapture();
     freeRecBufQueue_.clear();
     recBufQueue_.clear();
@@ -241,6 +245,15 @@ OpenSLLayer::engineServicePlay()
         if (auto dat = getToPlay(hardwareFormat_, hardwareBuffSize_)) {
             buf->size_ = dat->pointer()->nb_samples * dat->pointer()->channels
                          * sizeof(AudioSample);
+            if (buf->size_ > buf->cap_) {
+                JAMI_ERR("buf->size_(%zu) > buf->cap_(%zu)", buf->size_, buf->cap_);
+                break;
+            }
+            if (not dat->pointer()->data[0] or not buf->buf_) {
+                JAMI_ERR("null bufer %p -> %p %d", dat->pointer()->data[0], buf->buf_, dat->pointer()->nb_samples);
+                break;
+            }
+            //JAMI_ERR("std::copy_n %p -> %p %zu", dat->pointer()->data[0], buf->buf_, dat->pointer()->nb_samples);
             std::copy_n((const AudioSample*) dat->pointer()->data[0],
                         dat->pointer()->nb_samples,
                         (AudioSample*) buf->buf_);
@@ -264,6 +277,14 @@ OpenSLLayer::engineServiceRing()
         if (auto dat = getToRing(hardwareFormat_, hardwareBuffSize_)) {
             buf->size_ = dat->pointer()->nb_samples * dat->pointer()->channels
                          * sizeof(AudioSample);
+            if (buf->size_ > buf->cap_) {
+                JAMI_ERR("buf->size_(%zu) > buf->cap_(%zu)", buf->size_, buf->cap_);
+                break;
+            }
+            if (not dat->pointer()->data[0] or not buf->buf_) {
+                JAMI_ERR("null bufer %p -> %p %d", dat->pointer()->data[0], buf->buf_, dat->pointer()->nb_samples);
+                break;
+            }
             std::copy_n((const AudioSample*) dat->pointer()->data[0],
                         dat->pointer()->nb_samples,
                         (AudioSample*) buf->buf_);
diff --git a/src/media/audio/opensl/opensllayer.h b/src/media/audio/opensl/opensllayer.h
index a3ab566e848228ac8aab770a8f15edcaea3cf74e..2f3e56216043b7c81ba40455e9110ec4a2536796 100644
--- a/src/media/audio/opensl/opensllayer.h
+++ b/src/media/audio/opensl/opensllayer.h
@@ -150,6 +150,8 @@ private:
     AudioFormat hardwareFormat_ {AudioFormat::MONO()};
     size_t hardwareBuffSize_ {BUFFER_SIZE};
 
+    std::vector<sample_buf> bufs_ {};
+
     AudioQueue freePlayBufQueue_ {BUF_COUNT};
     AudioQueue playBufQueue_ {BUF_COUNT};
 
@@ -159,8 +161,6 @@ private:
     AudioQueue freeRecBufQueue_ {BUF_COUNT}; // Owner of the queue
     AudioQueue recBufQueue_ {BUF_COUNT};     // Owner of the queue
 
-    std::vector<sample_buf> bufs_ {};
-
     std::unique_ptr<opensl::AudioPlayer> player_ {};
     std::unique_ptr<opensl::AudioPlayer> ringtone_ {};
     std::unique_ptr<opensl::AudioRecorder> recorder_ {};