]> git.sesse.net Git - vlc/blobdiff - src/audio_output/aout_internal.h
aout: do not block thread changing volume/mute/device (fixes #8240)
[vlc] / src / audio_output / aout_internal.h
index b241ca2e083ea351f1b4e831eb3d76fac038d756..5c1c9dd93532f34596b90c3bec853ab08108df0a 100644 (file)
@@ -52,6 +52,14 @@ typedef struct
     module_t *module; /**< Output plugin (or NULL if inactive) */
     aout_volume_t *volume;
 
+    struct
+    {
+        vlc_mutex_t lock;
+        char *device;
+        float volume;
+        char mute;
+    } req;
+
     struct
     {
         mtime_t end; /**< Last seen PTS */
@@ -75,7 +83,7 @@ typedef struct
     bool recycle_vout;
 
     atomic_uint buffers_lost;
-    vlc_atomic_t restart;
+    atomic_uchar restart;
 } aout_owner_t;
 
 typedef struct
@@ -120,6 +128,8 @@ void aout_OutputPlay(audio_output_t *, block_t *);
 void aout_OutputPause( audio_output_t * p_aout, bool, mtime_t );
 void aout_OutputFlush( audio_output_t * p_aout, bool );
 void aout_OutputDelete( audio_output_t * p_aout );
+void aout_OutputLock(audio_output_t *);
+void aout_OutputUnlock(audio_output_t *);
 
 
 /* From common.c : */
@@ -142,21 +152,11 @@ int aout_DecGetResetLost(audio_output_t *);
 void aout_DecChangePause(audio_output_t *, bool b_paused, mtime_t i_date);
 void aout_DecFlush(audio_output_t *);
 bool aout_DecIsEmpty(audio_output_t *);
+void aout_RequestRestart (audio_output_t *, unsigned);
 
-void aout_InputRequestRestart(audio_output_t *);
-
-/* Audio output locking */
-static inline void aout_lock( audio_output_t *p_aout )
+static inline void aout_InputRequestRestart(audio_output_t *aout)
 {
-    vlc_mutex_lock( &aout_owner(p_aout)->lock );
+    aout_RequestRestart(aout, AOUT_RESTART_FILTERS);
 }
 
-static inline void aout_unlock( audio_output_t *p_aout )
-{
-    vlc_mutex_unlock( &aout_owner(p_aout)->lock );
-}
-
-#define aout_assert_locked( aout ) \
-        vlc_assert_locked( &aout_owner(aout)->lock )
-
 #endif /* !LIBVLC_AOUT_INTERNAL_H */