diff --git a/src/plugins/opensles/qopenslesaudiooutput.cpp b/src/plugins/opensles/qopenslesaudiooutput.cpp
index 49bea0b3691815443f7b9fa83874acfd6f43b00d..9c62852de9ccffc9e66af873f616f0eb9b973f91 100644
--- a/src/plugins/opensles/qopenslesaudiooutput.cpp
+++ b/src/plugins/opensles/qopenslesaudiooutput.cpp
@@ -78,7 +78,8 @@ QOpenSLESAudioOutput::QOpenSLESAudioOutput(const QByteArray &device)
       m_periodSize(0),
       m_elapsedTime(0),
       m_processedBytes(0),
-      m_availableBuffers(BUFFER_COUNT)
+      m_availableBuffers(BUFFER_COUNT),
+      m_eventMask(SL_PLAYEVENT_HEADATEND)
 {
 #ifndef ANDROID
       m_streamType = -1;
@@ -198,7 +199,33 @@ int QOpenSLESAudioOutput::bufferSize() const
 
 void QOpenSLESAudioOutput::setNotifyInterval(int ms)
 {
-    m_notifyInterval = ms > 0 ? ms : 0;
+    const int newInterval = ms > 0 ? ms : 0;
+
+    if (newInterval == m_notifyInterval)
+        return;
+
+    const SLuint32 newEvenMask = newInterval == 0 ? m_eventMask & ~SL_PLAYEVENT_HEADATNEWPOS
+                                                  : m_eventMask & SL_PLAYEVENT_HEADATNEWPOS;
+
+    if (m_state == QAudio::StoppedState) {
+        m_eventMask = newEvenMask;
+        m_notifyInterval = newInterval;
+        return;
+    }
+
+    if (newEvenMask != m_eventMask
+        && SL_RESULT_SUCCESS != (*m_playItf)->SetCallbackEventsMask(m_playItf, newEvenMask)) {
+        return;
+    }
+
+    m_eventMask = newEvenMask;
+
+    if (newInterval && SL_RESULT_SUCCESS != (*m_playItf)->SetPositionUpdatePeriod(m_playItf,
+                                                                                  newInterval)) {
+        return;
+    }
+
+    m_notifyInterval = newInterval;
 }
 
 int QOpenSLESAudioOutput::notifyInterval() const
@@ -488,13 +515,12 @@ bool QOpenSLESAudioOutput::preparePlayer()
         return false;
     }
 
-    SLuint32 mask = SL_PLAYEVENT_HEADATEND;
     if (m_notifyInterval && SL_RESULT_SUCCESS == (*m_playItf)->SetPositionUpdatePeriod(m_playItf,
                                                                                        m_notifyInterval)) {
-        mask |= SL_PLAYEVENT_HEADATNEWPOS;
+        m_eventMask |= SL_PLAYEVENT_HEADATNEWPOS;
     }
 
-    if (SL_RESULT_SUCCESS != (*m_playItf)->SetCallbackEventsMask(m_playItf, mask)) {
+    if (SL_RESULT_SUCCESS != (*m_playItf)->SetCallbackEventsMask(m_playItf, m_eventMask)) {
         setError(QAudio::FatalError);
         return false;
     }
diff --git a/src/plugins/opensles/qopenslesaudiooutput.h b/src/plugins/opensles/qopenslesaudiooutput.h
index b0f01fa228e1392bbcd853ee1488bdd7e9511c93..16cbc50d01275e5891f5b77f8c314ec303435de3 100644
--- a/src/plugins/opensles/qopenslesaudiooutput.h
+++ b/src/plugins/opensles/qopenslesaudiooutput.h
@@ -120,6 +120,7 @@ private:
     qint64 m_elapsedTime;
     qint64 m_processedBytes;
     QAtomicInt m_availableBuffers;
+    SLuint32 m_eventMask;
 
     qint32 m_streamType;
     QTime m_clockStamp;