tizen 2.3.1 release accepted/tizen_2.4_mobile tizen_2.3.1 tizen_2.4 accepted/tizen/2.4/mobile/20151029.035942 submit/tizen_2.3.1/20150915.074732 submit/tizen_2.4/20151028.063136 tizen_2.3.1_release tizen_2.4_mobile_release
authorjk7744.park <jk7744.park@samsung.com>
Tue, 8 Sep 2015 12:58:43 +0000 (21:58 +0900)
committerjk7744.park <jk7744.park@samsung.com>
Tue, 8 Sep 2015 12:58:43 +0000 (21:58 +0900)
20 files changed:
include/remix/remix.h
include/remix/remix_plugin.h
libremix.manifest [new file with mode: 0644]
packaging/libremix.spec
src/ctxdata/cd_list.c
src/libremix/remix_base.c
src/libremix/remix_context.c
src/libremix/remix_deck.c
src/libremix/remix_envelope.c
src/libremix/remix_layer.c
src/libremix/remix_monitor.c
src/libremix/remix_plugin.c
src/libremix/remix_private.h
src/libremix/remix_sndfile.c
src/libremix/remix_sound.c
src/libremix/remix_squaretone.c
src/libremix/remix_stream.c
src/libremix/remix_track.c
src/plugins/ladspa/remix_ladspa.c
src/plugins/noise/remix_noise.c

index 4ec3427..29f7a98 100644 (file)
@@ -215,6 +215,7 @@ RemixCount remix_length (RemixEnv * env, RemixBase * base);
 RemixCount remix_seek (RemixEnv * env, RemixBase * base, RemixCount offset, int whence);
 RemixCount remix_tell (RemixEnv * env, RemixBase * base);
 int remix_flush (RemixEnv * env, RemixBase * base);
+int remix_reset (RemixEnv * env, RemixBase * base);
 
 RemixCount remix_set_mixlength (RemixEnv * env, RemixCount mixlength);
 RemixCount remix_get_mixlength (RemixEnv * env);
index 73fd5e3..55a6739 100644 (file)
@@ -103,6 +103,7 @@ typedef RemixCount (*RemixProcessFunc) (RemixEnv * env, RemixBase * base,
                                        RemixStream * input,
                                        RemixStream * output);
 typedef int (*RemixFlushFunc) (RemixEnv * env, RemixBase * base);
+typedef int (*RemixResetFunc) (RemixEnv * env, RemixBase * base);
 
 #define REMIX_FLAGS_NONE (0)
 
@@ -200,6 +201,7 @@ struct _RemixMethods {
   RemixLengthFunc length;
   RemixSeekFunc seek;
   RemixFlushFunc flush;
+  RemixResetFunc reset;
 };
 
 
diff --git a/libremix.manifest b/libremix.manifest
new file mode 100644 (file)
index 0000000..97e8c31
--- /dev/null
@@ -0,0 +1,5 @@
+<manifest>
+       <request>
+               <domain name="_"/>
+       </request>
+</manifest>
index c36f113..4f13731 100644 (file)
@@ -2,7 +2,7 @@
 
 Name:       libremix
 Summary:    An audio sequencing and mixing library.
-Version:    0.2.4+slp2+build02
+Version:    0.2.4+build14
 Release:    1
 Group:      Libraries/Sound
 License:    LGPLv2.1
@@ -34,6 +34,8 @@ make %{?jobs:-j%jobs}
 %install
 if [ -d %{buildroot} ]; then rm -rf %{buildroot}; fi
 make install DESTDIR=%{buildroot}
+mkdir -p %{buildroot}/usr/share/license
+cp %{_builddir}/%{buildsubdir}/COPYING %{buildroot}/usr/share/license/%{name}
 
 %clean
 if [ -d %{buildroot} ]; then rm -rf %{buildroot}; fi
@@ -46,6 +48,9 @@ if [ -d %{buildroot} ]; then rm -rf %{buildroot}; fi
 %defattr(-,root,root,-)
 %doc AUTHORS COPYING ChangeLog INSTALL NEWS README TODO doc
 %{_libdir}/libremix.so.*
+%{_libdir}/libctxdata.so*
+%manifest %{name}.manifest
+/usr/share/license/%{name}
 
 %files devel
 %defattr(-,root,root,-)
index 2bd38aa..8c39637 100644 (file)
@@ -372,15 +372,19 @@ cd_list_insert (void * ctx, CDList * list, CDScalarType type, CDScalar data,
 CDList *
 cd_list_remove (void * ctx, CDList * list, CDScalarType type, CDScalar data)
 {
-  CDList * l = cd_list_find (ctx, list, type, data);
+  CDList *ret_node, * l = cd_list_find (ctx, list, type, data);
 
   if (l == NULL) return list;
 
   if (l->prev) l->prev->next = l->next;
   if (l->next) l->next->prev = l->prev;
 
-  if (l == list) return list->next;
-  else return list;
+  ret_node = (l != list) ? list : list->next;
+  //free the element here to avoid memory leak, otherwise reference is lost
+  //and a dangling pointer.
+  cd_free (l);
+
+  return ret_node;
 }
 
 CDList *
@@ -443,6 +447,24 @@ cd_list_destroy_with (void * ctx, CDList * list, CDDestroyFunc destroy)
 }
 
 /*
+ * cd_list_call_destroy (ctx, list, destroy)
+ *
+ * Step through list 'list', calling AxDestroyFunc destroy function on each.
+ */
+CDList *
+cd_list_call_destroy (void * ctx, CDList * list, CDDestroyFunc destroy)
+{
+  CDList * l, * ln;
+
+  for (l = list; l; l = ln) {
+    ln = l->next;
+    destroy (ctx, l->data.s_pointer);
+  }
+
+  return NULL;
+}
+
+/*
  * cd_list_free_all (ctx, list)
  *
  * Step through list 'list', freeing each item using cd_free(), and
index bb51fee..8df9bef 100644 (file)
@@ -194,7 +194,8 @@ remix_base_new_subclass (RemixEnv * env, size_t size)
 {
   RemixBase * base = remix_malloc (size);
   _remix_context_copy (env, &base->context_limit);
-  _remix_register_base (env, base);
+  //Don't register/unregister base unncessarily
+  //_remix_register_base (env, base);
   return base;
 }
 
@@ -370,12 +371,19 @@ remix_destroy (RemixEnv * env, RemixBase * base)
     return -1;
   }
 
-  _remix_unregister_base (env, base);
+  //Don't register/unregister base unncessarily
+  //_remix_unregister_base (env, base);
 
   if (!base->methods || !base->methods->destroy) {
     remix_set_error (env, REMIX_ERROR_INVALID);
     return -1;
   }
+
+  if (base && base->context_limit.channels) {
+    //free the cloned copy of channels to avoid memory leak.
+    cd_set_free(env, base->context_limit.channels);
+  }
+
   return _remix_destroy (env, base);
 }
 
@@ -553,6 +561,20 @@ remix_flush (RemixEnv * env, RemixBase * base)
   return _remix_flush (env, base);
 }
 
+int
+remix_reset (RemixEnv * env, RemixBase * base)
+{
+  if (!base) {
+    remix_set_error (env, REMIX_ERROR_NOENTITY);
+    return -1;
+  }
+  if (!base->methods || !base->methods->reset) {
+    remix_set_error (env, REMIX_ERROR_INVALID);
+    return -1;
+  }
+  return _remix_reset (env, base);
+}
+
 RemixMetaText *
 remix_get_meta_text (RemixEnv * env, RemixBase * base)
 {
index 02cb97e..1a04ad4 100644 (file)
@@ -134,7 +134,8 @@ remix_init (void)
 
   world->refcount = 0;
   world->plugins = cd_list_new (ctx);
-  world->bases = cd_list_new (ctx);
+  //No need to record bases, as individual destroy will take care. Commenting to Fix Memory leak.
+  //world->bases = cd_list_new (ctx);
   world->purging = FALSE;
 
   ctx->mixlength = REMIX_DEFAULT_MIXLENGTH;
@@ -273,8 +274,9 @@ _remix_unregister_plugin (RemixEnv * env, RemixPlugin * plugin)
 RemixEnv *
 _remix_register_base (RemixEnv * env, RemixBase * base)
 {
-  RemixWorld * world = env->world;
-  world->bases = cd_list_append (env, world->bases, CD_POINTER(base));
+  //As world->bases is not initialized and used, so should not add it to env
+  //RemixWorld * world = env->world;
+  //world->bases = cd_list_append (env, world->bases, CD_POINTER(base));
   return env;
 }
 
@@ -284,8 +286,9 @@ _remix_unregister_base (RemixEnv * env, RemixBase * base)
   RemixWorld * world = env->world;
   if (world->purging) return env;
 
-  world->bases = cd_list_remove (env, world->bases, CD_TYPE_POINTER,
-                                CD_POINTER(base));
+  //As world->bases is not initialized and used, so should not remove it from env
+  //world->bases = cd_list_remove (env, world->bases, CD_TYPE_POINTER,
+  //                            CD_POINTER(base));
   return env;
 }
 
index c0206f7..2d44a0b 100644 (file)
@@ -92,6 +92,7 @@ static int
 remix_deck_destroy (RemixEnv * env, RemixBase * base)
 {
   RemixDeck * deck = (RemixDeck *)base;
+
   remix_destroy_list (env, deck->tracks);
   remix_destroy (env, (RemixBase *)deck->_mixstream);
   remix_free (deck);
@@ -364,6 +365,7 @@ static struct _RemixMethods _remix_deck_empty_methods = {
   remix_null_length,  /* length */
   NULL,            /* seek */
   NULL,            /* flush */
+  NULL,            /* reset */
 };
 
 static struct _RemixMethods _remix_deck_methods = {
@@ -375,6 +377,7 @@ static struct _RemixMethods _remix_deck_methods = {
   remix_deck_length,  /* length */
   remix_deck_seek,    /* seek */
   remix_deck_flush,   /* flush */
+  NULL,            /* reset */
 };
 
 static struct _RemixMethods _remix_deck_onetrack_methods = {
@@ -386,6 +389,7 @@ static struct _RemixMethods _remix_deck_onetrack_methods = {
   remix_deck_length,           /* length */
   remix_deck_seek,             /* seek */
   remix_deck_flush,   /* flush */
+  NULL,            /* reset */
 };
 
 static struct _RemixMethods _remix_deck_twotrack_methods = {
@@ -397,6 +401,7 @@ static struct _RemixMethods _remix_deck_twotrack_methods = {
   remix_deck_length,           /* length */
   remix_deck_seek,             /* seek */
   remix_deck_flush,   /* flush */
+  NULL,            /* reset */
 };
 
 static RemixDeck *
index b30c125..333c48c 100644 (file)
@@ -473,6 +473,7 @@ static struct _RemixMethods _remix_envelope_empty_methods = {
   remix_null_length,
   remix_envelope_seek,
   NULL, /* flush */
+  NULL, /* reset */
 };
 
 static struct _RemixMethods _remix_envelope_constant_methods = {
@@ -484,6 +485,7 @@ static struct _RemixMethods _remix_envelope_constant_methods = {
   remix_envelope_length,
   remix_envelope_seek,
   NULL, /* flush */
+  NULL, /* reset */
 };
 
 static struct _RemixMethods _remix_envelope_linear_methods = {
@@ -495,6 +497,7 @@ static struct _RemixMethods _remix_envelope_linear_methods = {
   remix_envelope_length,
   remix_envelope_seek,
   NULL, /* flush */
+  NULL, /* reset */
 };
 
 static struct _RemixMethods _remix_envelope_spline_methods = {
@@ -506,6 +509,7 @@ static struct _RemixMethods _remix_envelope_spline_methods = {
   remix_envelope_length,
   remix_envelope_seek,
   NULL, /* flush */
+  NULL, /* reset */
 };
 
 static struct _RemixMethods _remix_envelope_methods = {
@@ -517,6 +521,7 @@ static struct _RemixMethods _remix_envelope_methods = {
   remix_envelope_length,
   remix_envelope_seek,
   NULL, /* flush */
+  NULL, /* reset */
 };
 
 static RemixEnvelope *
index 158fe09..b00f548 100644 (file)
@@ -114,9 +114,12 @@ static int
 remix_layer_destroy (RemixEnv * env, RemixBase * base)
 {
   RemixLayer * layer = (RemixLayer *)base;
+
   if (layer->track)
     _remix_track_remove_layer (env, layer->track, layer);
-  remix_destroy_list (env, layer->sounds);
+  //Just call destructor but dont delete item which is removed already.
+  //remix_destroy_list (env, layer->sounds);
+  cd_list_call_destroy(env, layer->sounds, (CDDestroyFunc)remix_destroy);
   remix_free (layer);
   return 0;
 }
@@ -642,6 +645,7 @@ static struct _RemixMethods _remix_layer_methods = {
   remix_layer_length,  /* length */
   remix_layer_seek,    /* seek */
   remix_layer_flush,   /* flush */
+  NULL,             /* reset */
 };
 
 static RemixLayer *
index fa9990f..721aad6 100644 (file)
@@ -149,7 +149,7 @@ remix_monitor_init (RemixEnv * env, RemixBase * base)
 
   monitor->dev_dsp_fd = open (FILENAME, O_WRONLY, 0);
   if (monitor->dev_dsp_fd == -1) {
-    printf ("Couldn't open any output device.\n");
+    //printf ("Couldn't open any output device.\n");
     remix_set_error (env, REMIX_ERROR_SYSTEM);
     return RemixNone;
   }
@@ -374,6 +374,7 @@ static struct _RemixMethods _remix_monitor_methods = {
   remix_monitor_length,
   remix_monitor_seek,
   remix_monitor_flush,
+  NULL, /* reset */
 };
 
 static RemixMonitor *
index 8d234f1..ebe0dd6 100644 (file)
@@ -64,7 +64,7 @@ remix_plugin_init (RemixEnv * env, const char * path)
   CDList * l;
   RemixPluginInitFunc init;
 
-  module = dlopen (path, RTLD_NOW);
+  module = dlopen (path, RTLD_LAZY);
 
   if (!module) {
     remix_dprintf ("[remix_plugin_init] Unable to open %s: %s\n", path,
index f10c3f9..51eac64 100644 (file)
@@ -263,6 +263,7 @@ struct _RemixMonitor {
         (((RemixBase*)b)->methods->process ((a),((RemixBase*)b),(c),(i),(o)))
 #define _remix_length(a,b) (((RemixBase*)b)->methods->length ((a), ((RemixBase*)b)))
 #define _remix_flush(a,b) (((RemixBase*)b)->methods->flush ((a), ((RemixBase*)b)))
+#define _remix_reset(a,b) (((RemixBase*)b)->methods->reset ((a), ((RemixBase*)b)))
 
 
 /* util */
index 912f197..601cfbc 100644 (file)
@@ -273,6 +273,20 @@ remix_sndfile_seek (RemixEnv * env, RemixBase * base, RemixCount offset)
   return sf_seek (si->file, offset, SEEK_SET);
 }
 
+static int
+remix_sndfile_reader_destroy (RemixEnv * env, RemixPlugin * plugin)
+{
+  cd_set_free (env, plugin->init_scheme);
+  return 0;
+}
+
+static int
+remix_sndfile_writer_destroy (RemixEnv * env, RemixPlugin * plugin)
+{
+  cd_set_free (env, plugin->init_scheme);
+  return 0;
+}
+
 static struct _RemixMethods _remix_sndfile_reader_methods = {
   remix_sndfile_clone,
   remix_sndfile_destroy,
@@ -282,6 +296,7 @@ static struct _RemixMethods _remix_sndfile_reader_methods = {
   remix_sndfile_length,
   remix_sndfile_seek,
   NULL, /* flush */
+  NULL, /* reset */
 };
 
 static struct _RemixMethods _remix_sndfile_writer_methods = {
@@ -293,6 +308,7 @@ static struct _RemixMethods _remix_sndfile_writer_methods = {
   remix_sndfile_length,
   remix_sndfile_seek,
   NULL, /* flush */
+  NULL, /* reset */
 };
 
 static RemixBase *
@@ -386,7 +402,7 @@ static struct _RemixPlugin sndfile_reader_plugin = {
   CD_EMPTY_SET, /* process scheme */
   NULL, /* suggests */
   NULL, /* plugin data */
-  NULL  /* destroy */
+  remix_sndfile_reader_destroy  /* destroy */
 };
 
 static struct _RemixPlugin sndfile_writer_plugin = {
@@ -397,7 +413,7 @@ static struct _RemixPlugin sndfile_writer_plugin = {
   CD_EMPTY_SET, /* process scheme */
   NULL, /* suggests */
   NULL, /* plugin data */
-  NULL  /* destroy */
+  remix_sndfile_writer_destroy  /* destroy */
 };
 
 /* module init function */
index a36cb8f..628f42f 100644 (file)
@@ -566,6 +566,7 @@ static struct _RemixMethods _remix_sound_methods = {
   remix_sound_length,        /* length */
   remix_sound_seek,          /* seek */
   remix_sound_flush,         /* flush */
+  NULL,         /* reset */
 };
 
 static RemixSound *
index 5a79cf1..679ec3a 100644 (file)
@@ -244,6 +244,7 @@ static struct _RemixMethods _remix_squaretone_methods = {
   remix_squaretone_length,
   remix_squaretone_seek,
   NULL, /* flush */
+  NULL, /* reset */
 };
 
 static RemixSquareTone *
index eab7b82..ea493e8 100644 (file)
@@ -155,7 +155,8 @@ remix_stream_destroy (RemixEnv * env, RemixBase * base)
     return -1;
   }
 
-  cd_set_destroy_with (env, stream->channels, (CDDestroyFunc)remix_destroy);
+  // RemixChannel doesnot inherit RemixBase, so register its own destructor explicitly.
+  cd_set_destroy_with (env, stream->channels, (CDDestroyFunc)remix_channel_destroy);
 
   remix_free (stream);
   return 0;
@@ -305,6 +306,8 @@ static struct _RemixMethods _remix_stream_methods = {
   remix_stream_process,
   remix_stream_length,
   remix_stream_seek,
+  NULL, /* flush */
+  NULL, /* reset */
 };
 
 static RemixStream *
index 0cf2eb2..2eb0ea0 100644 (file)
@@ -94,7 +94,14 @@ static int
 remix_track_destroy (RemixEnv * env, RemixBase * base)
 {
   RemixTrack * track = (RemixTrack *)base;
-  remix_destroy_list (env, track->layers);
+  //Just call destructor but dont delete item which is removed already.
+  //remix_destroy_list (env, track->layers);
+  cd_list_call_destroy(env, track->layers, (CDDestroyFunc)remix_destroy);
+
+  if (track->_mixstream_a != RemixNone)
+    remix_destroy (env, (RemixBase *)track->_mixstream_a);
+  if (track->_mixstream_b != RemixNone)
+    remix_destroy (env, (RemixBase *)track->_mixstream_b);
   remix_free (track);
   return 0;
 }
@@ -423,6 +430,7 @@ static struct _RemixMethods _remix_track_empty_methods = {
   remix_null_length,   /* length */
   remix_null_seek,     /* seek */
   NULL,             /* flush */
+  NULL,            /* reset */
 };
 
 static struct _RemixMethods _remix_track_methods = {
@@ -434,6 +442,7 @@ static struct _RemixMethods _remix_track_methods = {
   remix_track_length,  /* length */
   remix_track_seek,    /* seek */
   remix_track_flush,            /* flush */
+  NULL,            /* reset */
 };
 
 static struct _RemixMethods _remix_track_onelayer_methods = {
@@ -445,6 +454,7 @@ static struct _RemixMethods _remix_track_onelayer_methods = {
   remix_track_length,           /* length */
   remix_track_seek,             /* seek */
   remix_track_flush,            /* flush */
+  NULL,            /* reset */
 };
 
 static struct _RemixMethods _remix_track_twolayer_methods = {
@@ -456,6 +466,7 @@ static struct _RemixMethods _remix_track_twolayer_methods = {
   remix_track_length,           /* length */
   remix_track_seek,             /* seek */
   remix_track_flush,            /* flush */
+  NULL,            /* reset */
 };
 
 static RemixTrack *
index cdb6984..74fe409 100644 (file)
@@ -762,6 +762,7 @@ static struct _RemixMethods _remix_ladspa_1_0_methods = {
   remix_ladspa_length,
   NULL, /* seek */
   NULL, /* flush */
+  NULL, /* reset */
 };
 
 static struct _RemixMethods _remix_ladspa_0_1_methods = {
@@ -773,6 +774,7 @@ static struct _RemixMethods _remix_ladspa_0_1_methods = {
   remix_ladspa_length,
   NULL, /* seek */
   NULL, /* flush */
+  NULL, /* reset */
 };
 
 static struct _RemixMethods _remix_ladspa_1_1_methods = {
@@ -784,6 +786,7 @@ static struct _RemixMethods _remix_ladspa_1_1_methods = {
   remix_ladspa_length,
   NULL, /* seek */
   NULL, /* flush */
+  NULL, /* reset */
 };
 
 
@@ -796,6 +799,7 @@ static struct _RemixMethods _remix_ladspa_methods = {
   remix_ladspa_length,
   NULL, /* seek */
   NULL, /* flush */
+  NULL, /* reset */
 };
 
 static RemixBase *
index 65337db..41dcefe 100644 (file)
@@ -102,6 +102,7 @@ static struct _RemixMethods _remix_noise_methods = {
   remix_noise_length,
   NULL, /* seek */
   NULL, /* flush */
+  NULL, /* reset */
 };
 
 static RemixBase *