]> git.0d.be Git - jack_mixer.git/commitdiff
many memleak errors
authorAthanasios Silis <athanasios.silis@gmail.com>
Thu, 18 Jun 2020 12:38:56 +0000 (15:38 +0300)
committerAthanasios Silis <athanasios.silis@gmail.com>
Thu, 18 Jun 2020 12:38:56 +0000 (15:38 +0300)
jack_mix_box.c
jack_mixer.c
jack_mixer.h
scale.c
scale.h

index 196b05b92a654f1d4bff10c3593b17a0e17b1371..27c68a37d39003a4d5b83bd18e18105c9c6286a1 100644 (file)
@@ -37,6 +37,7 @@
 #include "jack_mixer.h"
 
 jack_mixer_t mixer;
+bool keepRunning = true;
 
 void
 usage()
@@ -54,6 +55,13 @@ reportVolume(int sig)
        channels_volumes_read(mixer);
 }
 
+void
+triggerShutDown(int sig)
+{
+       (void)sig;
+       keepRunning = false;
+}
+
 int
 main(int argc, char *argv[])
 {
@@ -127,6 +135,7 @@ main(int argc, char *argv[])
                channel_index += 1;
                channel_name = malloc(15);
                if (snprintf(channel_name, 15, "Channel %d", channel_index) >= 15) {
+                       free(channel_name);
                        abort();
                }
                channel = add_channel(mixer, channel_name, bStereo);
@@ -137,13 +146,22 @@ main(int argc, char *argv[])
                channel_set_volume_midi_cc(channel, atoi(argv[optind++]));
                channel_set_midi_scale(channel, scale);
                channel_volume_write(channel, initialVolume);
+               free(channel_name);
        }
 
        signal(SIGUSR1, reportVolume);
+       signal(SIGTERM, triggerShutDown);
+       signal(SIGHUP, triggerShutDown);
+       signal(SIGINT, triggerShutDown);
 
-       while (true) {
-               sleep(1);
+       while (keepRunning) {
+               usleep(500u * 1000u); //500msec
        }
 
+       remove_channels(mixer);
+       remove_output_channel(main_mix_channel);
+       destroy(mixer);
+       scale_destroy(scale);
+       free(jack_cli_name);
        return 0;
 }
index 2f6652b5a00a1263865721aec68a854b01269b0f..0bbc7c74a94ebe25e19941d9733a624fd357e7da 100644 (file)
@@ -461,6 +461,12 @@ remove_channel(
     assert(channel_ptr->mixer_ptr->midi_cc_map[channel_ptr->midi_cc_solo_index] == channel_ptr);
     channel_ptr->mixer_ptr->midi_cc_map[channel_ptr->midi_cc_solo_index] = NULL;
   }
+  
+  free(channel_ptr->frames_left);
+  free(channel_ptr->frames_right);
+  free(channel_ptr->prefader_frames_left);
+  free(channel_ptr->prefader_frames_right);
+  
   free(channel_ptr);
 }
 
@@ -1307,7 +1313,7 @@ add_channel(
   bool stereo)
 {
   struct channel * channel_ptr;
-  char * port_name;
+  char * port_name = NULL;
   size_t channel_name_size;
 
   channel_ptr = malloc(sizeof(struct channel));
@@ -1402,6 +1408,7 @@ add_channel(
   channel_ptr->mixer_ptr->input_channels_list = g_slist_prepend(
                   channel_ptr->mixer_ptr->input_channels_list, channel_ptr);
 
+  free(port_name);
   return channel_ptr;
 
 fail_unregister_left_channel:
@@ -1430,7 +1437,7 @@ create_output_channel(
 {
   struct channel * channel_ptr;
   struct output_channel * output_channel_ptr;
-  char * port_name;
+  char * port_name = NULL;
   size_t channel_name_size;
 
   output_channel_ptr = malloc(sizeof(struct output_channel));
@@ -1529,6 +1536,7 @@ create_output_channel(
   output_channel_ptr->system = system;
   output_channel_ptr->prefader = false;
 
+  free(port_name);
   return output_channel_ptr;
 
 fail_unregister_left_channel:
@@ -1570,6 +1578,18 @@ add_output_channel(
   return output_channel_ptr;
 }
 
+void
+remove_channels(
+  jack_mixer_t mixer)
+{
+  GSList *list_ptr;
+  for (list_ptr = mixer_ctx_ptr->input_channels_list; list_ptr; list_ptr = g_slist_next(list_ptr))
+  {
+    struct channel *input_channel_ptr = list_ptr->data;
+    remove_channel((jack_mixer_channel_t)input_channel_ptr);
+  }
+}
+
 void
 remove_output_channel(
   jack_mixer_output_channel_t output_channel)
@@ -1614,6 +1634,13 @@ remove_output_channel(
   g_slist_free(output_channel_ptr->soloed_channels);
   g_slist_free(output_channel_ptr->muted_channels);
 
+  free(channel_ptr->tmp_mixed_frames_left);
+  free(channel_ptr->tmp_mixed_frames_right);
+  free(channel_ptr->frames_left);
+  free(channel_ptr->frames_right);
+  free(channel_ptr->prefader_frames_left);
+  free(channel_ptr->prefader_frames_right);
+
   free(channel_ptr);
 }
 
index e38c28818348db3fe626ee1956c87251820f42c1..6c64b17616cbb35bbc749059b4c84e27c88f7ccb 100644 (file)
@@ -166,6 +166,10 @@ void
 remove_channel(
   jack_mixer_channel_t channel);
 
+void
+remove_channels(
+  jack_mixer_t mixer);
+
 /* returned value is in dBFS */
 double
 channel_abspeak_read(
diff --git a/scale.c b/scale.c
index 97dd701d17e30a1fd1e98e08ed9170bdbcb194c4..f5dcb570452163f9988fe96bca853138019c63bc 100644 (file)
--- a/scale.c
+++ b/scale.c
@@ -71,9 +71,26 @@ void
 scale_destroy(
   jack_mixer_scale_t scale)
 {
+  scale_remove_thresholds(scale);
   free(scale_ptr);
 }
 
+void 
+scale_remove_thresholds(
+  jack_mixer_scale_t scale)
+{
+  
+  struct threshold * threshold_ptr;
+  struct threshold * node_ptr;
+
+  list_for_each_entry_safe(threshold_ptr, node_ptr, &scale_ptr->thresholds, scale_siblings)
+  {
+    list_del(&(threshold_ptr->scale_siblings));
+    free(threshold_ptr);
+    threshold_ptr = NULL;
+  }
+}
+
 bool
 scale_add_threshold(
   jack_mixer_scale_t scale,
diff --git a/scale.h b/scale.h
index b5813f429c4318fe06752f01774d0e5941fa71f3..4beaa74afa86cf3d4059641e6029e741f633ade9 100644 (file)
--- a/scale.h
+++ b/scale.h
@@ -34,6 +34,10 @@ scale_add_threshold(
   float db,
   float scale_value);
 
+void
+scale_remove_thresholds(
+  jack_mixer_scale_t scale);
+
 void
 scale_calculate_coefficients(
   jack_mixer_scale_t scale);