]> git.ipfire.org Git - thirdparty/shairport-sync.git/commitdiff
De-globalise fix_volume and the vol_mutex
authorMike Brady <mikebrady@eircom.net>
Fri, 10 Mar 2017 19:20:49 +0000 (19:20 +0000)
committerMike Brady <mikebrady@eircom.net>
Fri, 10 Mar 2017 19:20:49 +0000 (19:20 +0000)
player.c
player.h

index 24e394c2e49fd80333d06b561d93d66d70dd166d..da664d273b0df17bcd63ffa9fc7a59cec483022f 100644 (file)
--- a/player.c
+++ b/player.c
 #include "apple_alac.h"
 #endif
 
-                               
-// interthread variables
-static int fix_volume = 0x10000;
-static pthread_mutex_t vol_mutex = PTHREAD_MUTEX_INITIALIZER;
-
 // default buffer size
 // needs to be a power of 2 because of the way BUFIDX(seqno) works
 //#define BUFFER_FRAMES 512
@@ -1118,17 +1113,17 @@ static int stuff_buffer_basic_32(int32_t *inptr, int length, enum sps_format_t l
     stuffsamp =
         (rand() % (length - 2)) + 1; // ensure there's always a sample before and after the item
 
-  pthread_mutex_lock(&vol_mutex);
+  pthread_mutex_lock(&conn->vol_mutex);
   for (i = 0; i < stuffsamp; i++) { // the whole frame, if no stuffing
-    process_sample(*inptr++, &l_outptr, l_output_format, fix_volume, dither,conn);
-    process_sample(*inptr++, &l_outptr, l_output_format, fix_volume, dither,conn);
+    process_sample(*inptr++, &l_outptr, l_output_format, conn->fix_volume, dither,conn);
+    process_sample(*inptr++, &l_outptr, l_output_format, conn->fix_volume, dither,conn);
   };
   if (tstuff) {
     if (tstuff == 1) {
       // debug(3, "+++++++++");
       // interpolate one sample
-      process_sample(mean_32(inptr[-2], inptr[0]), &l_outptr, l_output_format, fix_volume, dither,conn);
-      process_sample(mean_32(inptr[-1], inptr[1]), &l_outptr, l_output_format, fix_volume, dither,conn);
+      process_sample(mean_32(inptr[-2], inptr[0]), &l_outptr, l_output_format, conn->fix_volume, dither,conn);
+      process_sample(mean_32(inptr[-1], inptr[1]), &l_outptr, l_output_format, conn->fix_volume, dither,conn);
     } else if (stuff == -1) {
       // debug(3, "---------");
       inptr++;
@@ -1142,11 +1137,11 @@ static int stuff_buffer_basic_32(int32_t *inptr, int length, enum sps_format_t l
       remainder = remainder + tstuff; // don't run over the correct end of the output buffer
 
     for (i = stuffsamp; i < remainder; i++) {
-      process_sample(*inptr++, &l_outptr, l_output_format, fix_volume, dither,conn);
-      process_sample(*inptr++, &l_outptr, l_output_format, fix_volume, dither,conn);
+      process_sample(*inptr++, &l_outptr, l_output_format, conn->fix_volume, dither,conn);
+      process_sample(*inptr++, &l_outptr, l_output_format, conn->fix_volume, dither,conn);
     }
   }
-  pthread_mutex_unlock(&vol_mutex);
+  pthread_mutex_unlock(&conn->vol_mutex);
 
   return length + tstuff;
 }
@@ -1221,8 +1216,8 @@ static int stuff_buffer_soxr_32(int32_t *inptr, int32_t *scratchBuffer, int leng
     ip = scratchBuffer;
     char *l_outptr = outptr;
     for (i = 0; i < length + tstuff; i++) {
-      process_sample(*ip++, &l_outptr, l_output_format, fix_volume, dither,conn);
-      process_sample(*ip++, &l_outptr, l_output_format, fix_volume, dither,conn);
+      process_sample(*ip++, &l_outptr, l_output_format, conn->fix_volume, dither,conn);
+      process_sample(*ip++, &l_outptr, l_output_format, conn->fix_volume, dither,conn);
     };
 
   } else { // the whole frame, if no stuffing
@@ -1233,8 +1228,8 @@ static int stuff_buffer_soxr_32(int32_t *inptr, int32_t *scratchBuffer, int leng
     int i;
 
     for (i = 0; i < length; i++) {
-      process_sample(*ip++, &l_outptr, l_output_format, fix_volume, dither,conn);
-      process_sample(*ip++, &l_outptr, l_output_format, fix_volume, dither,conn);
+      process_sample(*ip++, &l_outptr, l_output_format, conn->fix_volume, dither,conn);
+      process_sample(*ip++, &l_outptr, l_output_format, conn->fix_volume, dither,conn);
     };
   }
   return length + tstuff;
@@ -1260,6 +1255,7 @@ static void *player_thread_func(void *arg) {
   conn->ab_synced = 0;
   conn->first_packet_timestamp = 0;
   conn->flush_requested = 0;
+  conn->fix_volume = 0x10000;
   
   
   int rc = pthread_mutex_init(&conn->ab_mutex, NULL);
@@ -1268,6 +1264,9 @@ static void *player_thread_func(void *arg) {
        rc = pthread_mutex_init(&conn->flush_mutex, NULL);
   if (rc)
     debug(1, "Error initialising flush_mutex.");
+       rc = pthread_mutex_init(&conn->vol_mutex, NULL);
+  if (rc)
+    debug(1, "Error initialising vol_mutex.");
 // set the flowcontrol condition variable to wait on a monotonic clock
 #ifdef COMPILE_FOR_LINUX_AND_FREEBSD_AND_CYGWIN
   pthread_condattr_t attr;
@@ -1412,7 +1411,7 @@ static void *player_thread_func(void *arg) {
     debug(1, "Dithering will be enabled because the input bit depth is greater than the output bit "
              "depth");
   }
-  if (fix_volume != 0x10000) {
+  if (conn->fix_volume != 0x10000) {
     debug(1, "Dithering will be enabled the output volume is being altered in software");
   }
 
@@ -1504,7 +1503,7 @@ static void *player_thread_func(void *arg) {
         } else {
 
           int enable_dither = 0;
-          if ((fix_volume != 0x10000) || (conn->input_bit_depth > output_bit_depth))
+          if ((conn->fix_volume != 0x10000) || (conn->input_bit_depth > output_bit_depth))
             enable_dither = 1;
 
           // here, let's transform the frame of data, if necessary
@@ -1817,7 +1816,7 @@ static void *player_thread_func(void *arg) {
             // if there is no delay procedure, or it's not working or not allowed, there can be no
             // synchronising
 
-            if (fix_volume == 0x10000)
+            if (conn->fix_volume == 0x10000)
 
               if (inbuf == NULL)
                 debug(1, "NULL inbuf to play -- skipping it.");
@@ -2014,6 +2013,9 @@ static void *player_thread_func(void *arg) {
   rc = pthread_mutex_destroy(&conn->ab_mutex);
   if (rc)
     debug(1, "Error destroying ab_mutex variable.");
+  rc = pthread_mutex_destroy(&conn->vol_mutex);
+  if (rc)
+    debug(1, "Error destroying vol_mutex variable.");
   debug(1, "Player thread exit");
   return 0;
 }
@@ -2196,9 +2198,9 @@ void player_volume(double airplay_volume, rtsp_conn_info* conn) {
   // debug(1,"Software attenuation set to %f, i.e %f out of 65,536, for airplay volume of
   // %f",software_attenuation,temp_fix_volume,airplay_volume);
 
-  pthread_mutex_lock(&vol_mutex);
-  fix_volume = temp_fix_volume;
-  pthread_mutex_unlock(&vol_mutex);
+  pthread_mutex_lock(&conn->vol_mutex);
+  conn->fix_volume = temp_fix_volume;
+  pthread_mutex_unlock(&conn->vol_mutex);
 
 #ifdef CONFIG_METADATA
   char *dv = malloc(128); // will be freed in the metadata thread
index 0f760362812f901eb29ba4721548cc59929cf9eb..c8b39877dffb60863366364aa762e28ed0b07230 100644 (file)
--- a/player.h
+++ b/player.h
@@ -70,6 +70,8 @@ typedef struct {
 // mutexes and condition variables
        pthread_cond_t flowcontrol;
        pthread_mutex_t ab_mutex,flush_mutex;
+       pthread_mutex_t vol_mutex;
+       int fix_volume;
        uint32_t timestamp_epoch, last_timestamp, maximum_timestamp_interval; // timestamp_epoch of zero means not initialised, could start at 2
                                 // or 1.
   int ab_buffering,ab_synced;