(function ( w, d, PKAE ) { 'use strict'; var db; var db_name = 'audiomass'; var db_version = 1; var db_ready = false; var compressors = { 'l4z' : { ready: false, loading: false, compress: null, decompress: null, init : function ( callback ) { var q = this; q.loading = true; var lz4BlockWASM; lz4BlockCodec.createInstance('wasm').then(instance => { lz4BlockWASM = instance; q.ready = true; q.loading = false; q.compress = function( input, offset ) { if (!lz4BlockWASM) { if (input instanceof ArrayBuffer) return new Uint8Array(input); else return input; } return lz4BlockWASM.encodeBlock(input, 0); }; q.decompress = function( input, offset, size ) { if (!lz4BlockWASM) { if (input instanceof ArrayBuffer) return new Uint8Array(input); else return input; } return lz4BlockWASM.decodeBlock(input, 0, size); }; callback && callback (); }); // --- } } }; var compression = 'l4z'; function SaveLocal ( app ) { var q = this; q.on = false; this.Init = function ( callback ) { if (q.on) { callback && callback (); return ; } if (!window.indexedDB) { callback && callback ('err'); return ; } var request = indexedDB.open (db_name, db_version); request.onerror = function(e) { callback && callback ('err'); // console.error('Unable to open database.'); }; request.onupgradeneeded = function(e) { var db = e.target.result; db.createObjectStore('sessions', {keyPath:'id'}); }; request.onsuccess = function(e) { db = e.target.result; db.onerror = function( e ) { console.log( e ); }; setTimeout(function() { db_ready = true; q.on = true; callback && callback (); app.fireEvent ('DidOpenDB', q); },120); }; }; this.SaveSession = function ( buffer, id, name ) { var q = this; var comp = compressors[ compression ]; if (!comp.loading && !comp.ready) { comp.init (function() { q.SaveSession (buffer, id, name); }); return ; } var chans = buffer.numberOfChannels; var arr_buffs = []; var arr_buffs2 = []; var arr; var tmp; var sample_rate = buffer.sampleRate; for (var i = 0; i < chans; ++i) { arr = buffer.getChannelData ( i ); arr_buffs2.push (arr.buffer.byteLength); tmp = comp.compress ( arr.buffer, 0); arr_buffs.push ( tmp.buffer.slice (tmp.byteOffset, tmp.byteLength + tmp.byteOffset)); } tmp = null; var ob = { id : id, name: name, created: new Date().getTime(), data: arr_buffs, data2: arr_buffs2, durr: buffer.duration.toFixed(3)/1, chans: chans, comp: compression, thumb: PKAudioEditor.engine.GetWave (buffer), samplerate: sample_rate }; var trans = db.transaction(['sessions'], 'readwrite'); var addReq = trans.objectStore('sessions').add(ob); addReq.onerror = function(e) { app.fireEvent ('ErrorDB', e); console.log('error storing data'); console.error(e); }; trans.oncomplete = function ( e ) { app.fireEvent ('DidStoreDB', ob, e ); // console.log( 'data stored', id, e ); }; }; this.GetSession = function ( id, callback ) { var trans = db.transaction(['sessions'], 'readonly'); //hard coded id var req = trans.objectStore('sessions').get(id); req.onsuccess = function(e) { // console.log( e.target.result ); var record = e.target.result; if (record && record.comp) { var comp = compressors[ compression ]; if (!comp.loading && !comp.ready) { comp.init (function() { var data_arr = []; var tmp = null; for (var i = 0; i < record.data.length; ++i) { tmp = comp.decompress (record.data[i], 0, record.data2[i]); data_arr.push ( tmp.buffer.slice (tmp.byteOffset, tmp.byteLength + tmp.byteOffset) ); } tmp = null; record.data = data_arr; callback && callback ( record ); }); return ; } var data_arr = []; var tmp = null; for (var i = 0; i < record.data.length; ++i) { tmp = comp.decompress (record.data[i], 0, record.data2[i]); data_arr.push ( tmp.buffer.slice (tmp.byteOffset, tmp.byteLength + tmp.byteOffset) ); } tmp = null; record.data = data_arr; } callback && callback ( record ); }; }; this.DelSession = function ( id, callback ) { var trans = db.transaction(['sessions'], 'readwrite'); var req = trans.objectStore('sessions').delete (id); req.onsuccess = function (e) { callback && callback ( id ); }; }; this.ListSessions = function ( callback ) { var trans = db.transaction(['sessions'], 'readonly'); var object_store = trans.objectStore('sessions'); var req = object_store.openCursor(); var ret = []; req.onerror = function(event) { console.err("error fetching data"); }; req.onsuccess = function(event) { var cursor = event.target.result; if (cursor) { var key = cursor.primaryKey; var value = cursor.value; ret.push (value); cursor.continue(); } else { var rr = ret.sort(function compare( a, b ) { if ( a.created > b.created ){ return -1; } if ( a.created < b.created ){ return 1; } return 0; }); callback && callback (rr); // no more results } }; }; // --- }; PKAudioEditor._deps.fls = SaveLocal; })( window, document, PKAudioEditor );