fix segv in ogg playback, add db tx test
authorGood Guy <good1.2guy@gmail.com>
Mon, 7 Nov 2016 16:05:19 +0000 (09:05 -0700)
committerGood Guy <good1.2guy@gmail.com>
Mon, 7 Nov 2016 16:05:19 +0000 (09:05 -0700)
cinelerra-5.1/cinelerra/fileogg.C
cinelerra-5.1/db/tx.C [new file with mode: 0644]

index 747fa399948617866f79ee3daecd96a825f075b5..6c789b39100fd14c3e21c03708157b894c575588 100644 (file)
@@ -1577,9 +1577,12 @@ int FileOGG::set_audio_position(int64_t x)
 
 int FileOGG::move_history(int from, int to, int len)
 {
-       for(int i = 0; i < asset->channels; i++)
-               memmove(pcm_history[i] + to, pcm_history[i] + from, sizeof(float) * len);
+       if( len > 0 ) {
+               for(int i = 0; i < asset->channels; i++)
+                       memmove(pcm_history[i] + to, pcm_history[i] + from, sizeof(float) * len);
+       }
        history_start = history_start + from - to;
+       if( history_start < 0 ) history_start = 0;
        return 0;
 }
 
diff --git a/cinelerra-5.1/db/tx.C b/cinelerra-5.1/db/tx.C
new file mode 100644 (file)
index 0000000..f7a8141
--- /dev/null
@@ -0,0 +1,110 @@
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#include "txs.h"
+
+// create, modify, list db as set of text lines
+//  ./a.out new /tmp/x.db
+//  ./a.out add /tmp/x.db < /data/add.txt
+//  ./a.out del /tmp/x.db < /data/del.txt
+//  ./a.out get /tmp/x.db < /data/get.txt
+//  ./a.out lst /tmp/x.db > /data/dat.txt
+
+/* first, paste this
+./xsch theDb txs <<eof
+CREATE TABLE item (
+  item_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+  data varchar(255) binary NOT NULL
+);
+
+CREATE UNIQUE INDEX item_data ON item (data);
+eof
+*/
+// then, compile using:
+// c++ -ggdb -O2 tx.C txs.C tdb.C
+
+theDb *db;
+typedef ItemLoc::ikey_Item_data ItemData;
+typedef ItemLoc::rkey_Item_data DataItem;
+class ItemKey : public ItemObj::t_Data {
+public:
+  ItemKey(char *key, int len) : ItemObj::t_Data((unsigned char *)key,len) {}
+};
+
+char line[4096];
+
+int main(int ac, char **av)
+{
+  if( !strcmp(av[1],"new") ) {
+    remove(av[2]);
+    db = new theDb();
+    db->create(av[2]);
+    delete db;
+    return 0;
+  }
+
+  db = new theDb();
+  if( db->open(av[2]) < 0 ) exit(1);
+
+  int64_t n =  0;
+
+  if( !strcmp(av[1],"add") ) {
+    while( fgets(line,sizeof(line),stdin) ) {
+      if( !line[0] ) continue;
+      int l = strlen(line);
+      line[l-1] = 0;
+      int ret = ItemData(db->item,ItemKey(line,l)).Find();
+      if( !ret ) continue; // duplicate
+      db->item.Allocate();
+      db->item.Data((unsigned char *)line, l);
+      db->item.Construct();
+      ++n;
+    }
+    db->commit();
+  }
+  else if( !strcmp(av[1],"del") ) {
+    while( fgets(line,sizeof(line),stdin) ) {
+      if( !line[0] ) continue;
+      int l = strlen(line);
+      line[l-1] = 0;
+      int ret = ItemData(db->item,ItemKey(line,l)).Find();
+      if( ret ) continue; // not found
+      db->item.Destruct();
+      db->item.Deallocate();
+      ++n;
+    }
+    db->commit();
+  }
+  else if( !strcmp(av[1],"get") ) {
+    while( fgets(line,sizeof(line),stdin) ) {
+      if( !line[0] ) continue;
+      int l = strlen(line);
+      line[l-1] = 0;
+      int ret = ItemData(db->item,ItemKey(line,l)).Find();
+      if( ret ) continue;
+      printf("%s\n", (char*)db->item.Data());
+      ++n;
+    }
+  }
+  else if( !strcmp(av[1],"lst") ) {
+    if( !DataItem(db->item).First() ) do {
+      printf("%s\n", (char*)db->item.Data());
+      ++n;
+    } while( !DataItem(db->item).Next() );
+  }
+  else {
+    fprintf(stderr, "unknown cmd %s\n  must be new,add,del,get,lst\n", av[1]);
+    exit(1);
+  }
+
+  fprintf(stderr, "%jd items input\n", n);
+  fprintf(stderr, "%d items in db\n", db->Item.Count());
+  db->close();
+  delete db;
+  return 0;
+}
+