approx::approx(double start, double end, double step, QString formula) { this->start = start; this->end = end; this->step = step; this->formula = formula; this->formula = convstr(formula); }
static void read_metadata_internal (DB_playItem_t *it, DUMB_IT_SIGDATA *itsd) { char temp[2048]; if (itsd->name[0]) { int tl = sizeof(itsd->name); int i; for (i = 0; i < tl && itsd->name[i] && itsd->name[i] == ' '; i++); if (i == tl || !itsd->name[i]) { deadbeef->pl_add_meta (it, "title", NULL); } else { deadbeef->pl_add_meta (it, "title", convstr ((char*)&itsd->name, sizeof(itsd->name), temp, sizeof (temp))); } } else { deadbeef->pl_add_meta (it, "title", NULL); } int i; for (i = 0; i < itsd->n_instruments; i++) { char key[100]; snprintf (key, sizeof (key), "INST%03d", i); deadbeef->pl_add_meta (it, key, convstr ((char *)&itsd->instrument[i].name, sizeof (itsd->instrument[i].name), temp, sizeof (temp))); } for (i = 0; i < itsd->n_samples; i++) { char key[100]; snprintf (key, sizeof (key), "SAMP%03d", i); deadbeef->pl_add_meta (it, key, convstr ((char *)&itsd->sample[i].name, sizeof (itsd->sample[i].name), temp, sizeof (temp))); } char s[100]; snprintf (s, sizeof (s), "%d", itsd->n_orders); deadbeef->pl_add_meta (it, ":MOD_ORDERS", s); snprintf (s, sizeof (s), "%d", itsd->n_instruments); deadbeef->pl_add_meta (it, ":MOD_INSTRUMENTS", s); snprintf (s, sizeof (s), "%d", itsd->n_samples); deadbeef->pl_add_meta (it, ":MOD_SAMPLES", s); snprintf (s, sizeof (s), "%d", itsd->n_patterns); deadbeef->pl_add_meta (it, ":MOD_PATTERNS", s); snprintf (s, sizeof (s), "%d", itsd->n_pchannels); deadbeef->pl_add_meta (it, ":MOD_CHANNELS", s); }
extern "C" DB_playItem_t * csid_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) { trace ("inserting %s\n", fname); sldb_load (); SidTune *tune; trace ("new SidTune\n"); tune = new SidTune (fname); int tunes = tune->getInfo ().songs; trace ("subtunes: %d\n", tunes); uint8_t sig[16]; unsigned char tmp[2]; #if 1 trace ("calculating md5\n"); DB_md5_t md5; deadbeef->md5_init (&md5); deadbeef->md5_append (&md5, (const uint8_t *)tune->cache.get () + tune->fileOffset, tune->getInfo ().c64dataLen); le_int16 (tune->getInfo ().initAddr, tmp); deadbeef->md5_append (&md5, tmp, 2); le_int16 (tune->getInfo ().playAddr, tmp); deadbeef->md5_append (&md5, tmp, 2); le_int16 (tune->getInfo ().songs, tmp); deadbeef->md5_append (&md5, tmp, 2); for (int s = 1; s <= tunes; s++) { tune->selectSong (s); // songspeed is uint8_t, so no need for byteswap deadbeef->md5_append (&md5, &tune->getInfo ().songSpeed, 1); } if (tune->getInfo ().clockSpeed == SIDTUNE_CLOCK_NTSC) { deadbeef->md5_append (&md5, &tune->getInfo ().clockSpeed, sizeof (tune->getInfo ().clockSpeed)); } deadbeef->md5_finish (&md5, sig); #else // md5 calc from libsidplay2 MD5 myMD5; myMD5.append ((const char *)tune->cache.get() + tune->fileOffset, tune->getInfo ().c64dataLen); // Include INIT and PLAY address. endian_little16 (tmp,tune->getInfo ().initAddr); myMD5.append (tmp,sizeof(tmp)); endian_little16 (tmp,tune->getInfo ().playAddr); myMD5.append (tmp,sizeof(tmp)); // Include number of songs. endian_little16 (tmp,tune->getInfo ().songs); myMD5.append (tmp,sizeof(tmp)); { // Include song speed for each song. for (uint_least16_t s = 1; s <= tune->getInfo ().songs; s++) { tune->selectSong (s); myMD5.append (&tune->getInfo ().songSpeed,1); } } // Deal with PSID v2NG clock speed flags: Let only NTSC // clock speed change the MD5 fingerprint. That way the // fingerprint of a PAL-speed sidtune in PSID v1, v2, and // PSID v2NG format is the same. if (tune->getInfo ().clockSpeed == SIDTUNE_CLOCK_NTSC) { myMD5.append (&tune->getInfo ().clockSpeed,sizeof(tune->getInfo ().clockSpeed)); } myMD5.finish (); memcpy (sig, myMD5.getDigest (), 16); #endif int song = -1; if (sldb_loaded) { song = sldb_find (sig); } trace ("inserting tunes...\n"); for (int s = 0; s < tunes; s++) { trace ("select %d...\n", s); if (tune->selectSong (s+1)) { DB_playItem_t *it = deadbeef->pl_item_alloc_init (fname, sid_plugin.plugin.id); deadbeef->pl_set_meta_int (it, ":TRACKNUM", s); SidTuneInfo sidinfo; tune->getInfo (sidinfo); int i = sidinfo.numberOfInfoStrings; int title_added = 0; trace ("set %d metainfo...\n", s); char temp[2048]; if (i >= 1 && sidinfo.infoString[0] && sidinfo.infoString[0][0]) { const char *meta; if (sidinfo.songs > 1) { meta = "album"; } else { meta = "title"; title_added = 1; } deadbeef->pl_add_meta (it, meta, convstr (sidinfo.infoString[0], strlen (sidinfo.infoString[0]), temp, sizeof (temp))); } if (i >= 2 && sidinfo.infoString[1] && sidinfo.infoString[1][0]) { deadbeef->pl_add_meta (it, "artist", convstr (sidinfo.infoString[1], strlen (sidinfo.infoString[1]), temp, sizeof (temp))); } if (i >= 3 && sidinfo.infoString[2] && sidinfo.infoString[2][0]) { deadbeef->pl_add_meta (it, "copyright", convstr (sidinfo.infoString[2], strlen (sidinfo.infoString[2]), temp, sizeof (temp))); } for (int j = 3; j < i; j++) { if (sidinfo.infoString[j] && sidinfo.infoString[j][0]) { deadbeef->pl_add_meta (it, "info", convstr (sidinfo.infoString[j], strlen (sidinfo.infoString[j]), temp, sizeof (temp))); } } char trk[10]; snprintf (trk, 10, "%d", s+1); deadbeef->pl_add_meta (it, "track", trk); if (!title_added) { deadbeef->pl_add_meta (it, "title", NULL); } float length = deadbeef->conf_get_float ("sid.defaultlength", 180); if (sldb_loaded) { if (song >= 0 && sldb->sldb_lengths[song][s] >= 0) { length = sldb->sldb_lengths[song][s]; } // if (song < 0) { // trace ("song %s not found in db, md5: ", fname); // for (int j = 0; j < 16; j++) { // trace ("%02x", (int)sig[j]); // } // trace ("\n"); // } } deadbeef->plt_set_item_duration (plt, it, length); deadbeef->pl_add_meta (it, ":FILETYPE", "SID"); after = deadbeef->plt_insert_item (plt, after, it); deadbeef->pl_item_unref (it); } } trace ("delete sidtune\n"); delete tune; return after; }
inline void convstr(std::stringstream &ss, First arg, Rest...args) { ss << arg; convstr(ss, args...); }
inline std::string str(First arg, Rest...args) { std::stringstream ss; convstr(ss, arg, args...); return ss.str(); }
extern "C" DB_playItem_t * csid_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) { trace ("inserting %s\n", fname); find_hvsc_path_from_fname (fname); sldb_load (); SidTune *tune; trace ("new SidTune\n"); tune = new SidTune (fname); int tunes = tune->getInfo ().songs; trace ("subtunes: %d\n", tunes); uint8_t sig[16]; unsigned char tmp[2]; trace ("calculating md5\n"); DB_md5_t md5; deadbeef->md5_init (&md5); if (sldb_legacy) { deadbeef->md5_append (&md5, (const uint8_t *)tune->cache.get () + tune->fileOffset, tune->getInfo ().c64dataLen); le_int16 (tune->getInfo ().initAddr, tmp); deadbeef->md5_append (&md5, tmp, 2); le_int16 (tune->getInfo ().playAddr, tmp); deadbeef->md5_append (&md5, tmp, 2); le_int16 (tune->getInfo ().songs, tmp); deadbeef->md5_append (&md5, tmp, 2); for (int s = 1; s <= tunes; s++) { tune->selectSong (s); // songspeed is uint8_t, so no need for byteswap deadbeef->md5_append (&md5, &tune->getInfo ().songSpeed, 1); } if (tune->getInfo ().clockSpeed == SIDTUNE_CLOCK_NTSC) { deadbeef->md5_append (&md5, &tune->getInfo ().clockSpeed, sizeof (tune->getInfo ().clockSpeed)); } } else { deadbeef->md5_append (&md5, (const uint8_t *)tune->cache.get (), tune->getInfo ().dataFileLen); } deadbeef->md5_finish (&md5, sig); int song = -1; if (sldb_loaded) { song = sldb_find (sig); } trace ("inserting tunes...\n"); for (int s = 0; s < tunes; s++) { trace ("select %d...\n", s); if (tune->selectSong (s+1)) { DB_playItem_t *it = deadbeef->pl_item_alloc_init (fname, sid_plugin.plugin.id); deadbeef->pl_set_meta_int (it, ":TRACKNUM", s); SidTuneInfo sidinfo; tune->getInfo (sidinfo); int i = sidinfo.numberOfInfoStrings; int title_added = 0; trace ("set %d metainfo...\n", s); char temp[2048]; if (i >= 1 && sidinfo.infoString[0] && sidinfo.infoString[0][0]) { const char *meta; if (sidinfo.songs > 1) { meta = "album"; } else { meta = "title"; title_added = 1; } deadbeef->pl_add_meta (it, meta, convstr (sidinfo.infoString[0], strlen (sidinfo.infoString[0]), temp, sizeof (temp))); } if (i >= 2 && sidinfo.infoString[1] && sidinfo.infoString[1][0]) { deadbeef->pl_add_meta (it, "artist", convstr (sidinfo.infoString[1], strlen (sidinfo.infoString[1]), temp, sizeof (temp))); } if (i >= 3 && sidinfo.infoString[2] && sidinfo.infoString[2][0]) { deadbeef->pl_add_meta (it, "copyright", convstr (sidinfo.infoString[2], strlen (sidinfo.infoString[2]), temp, sizeof (temp))); } for (int j = 3; j < i; j++) { if (sidinfo.infoString[j] && sidinfo.infoString[j][0]) { deadbeef->pl_add_meta (it, "info", convstr (sidinfo.infoString[j], strlen (sidinfo.infoString[j]), temp, sizeof (temp))); } } char trk[10]; snprintf (trk, 10, "%d", s+1); deadbeef->pl_add_meta (it, "track", trk); if (!title_added) { deadbeef->pl_add_meta (it, "title", NULL); } float length = deadbeef->conf_get_float ("sid.defaultlength", 180); if (sldb_loaded && song >= 0 && s < sldb[song].subsongs) { uint16_t l = sldb_lengths[sldb[song].lengths_offset+s]; if (l >= 0) { length = l; } } deadbeef->plt_set_item_duration (plt, it, length); deadbeef->pl_add_meta (it, ":FILETYPE", "SID"); after = deadbeef->plt_insert_item (plt, after, it); deadbeef->pl_item_unref (it); } } trace ("delete sidtune\n"); delete tune; return after; }
/*----------------------------------------------------------------------------*/ int sci_convstr(char *fname,unsigned long fname_len) { char **Input_Matrix = NULL; char **Output_Matrix = NULL; char typ = LOW; int numRow = 0; int numCol = 0; int Row_Num_One = 0; int Col_Num_One = 0; int mn = 0; /* Row_Num_One * Col_Num_One */ int i = 0; int Type_One = 0; CheckRhs(1,2); CheckLhs(1,1); Type_One = VarType(1); if (Rhs == 2) { int Type_Two = VarType(2); if (Type_Two == sci_strings) { int Row_Num_Two = 0,Col_Num_Two = 0,Stack_Pos=0; GetRhsVar(2,STRING_DATATYPE,&Row_Num_Two,&Col_Num_Two,&Stack_Pos); if ( (Row_Num_Two*Col_Num_Two) == 1 ) { /* To put "flag" into typ; whether "u" or "l" */ typ = cstk(Stack_Pos)[0]; if ( (typ != UPPER) && (typ != LOW) && (typ != UPPER_B) && (typ != LOW_B) ) { Scierror(999,_("%s: Wrong value for input argument #%d: 'u' (Upper) or 'l' (Lower) expected.\n"),fname,2); return 0; } } else { Scierror(999,_("%s: Wrong size for input argument #%d: A string expected.\n"),fname,2); return 0; } } else { Scierror(999,_("%s: Wrong type for input argument #%d: A string expected.\n"),fname,2); return 0; } } switch (Type_One) { case sci_strings : { GetRhsVar(1,MATRIX_OF_STRING_DATATYPE,&Row_Num_One,&Col_Num_One,&Input_Matrix); /* To input the string matrix */ mn = Row_Num_One * Col_Num_One; } break; case sci_matrix : { GetRhsVar(1,MATRIX_OF_DOUBLE_DATATYPE,&Row_Num_One,&Col_Num_One,&Input_Matrix); if ( (Row_Num_One == 0) && (Col_Num_One == 0) ) { int l =0; CreateVar(Rhs+1,MATRIX_OF_DOUBLE_DATATYPE,&Row_Num_One,&Col_Num_One,&l); LhsVar(1) = Rhs+1 ; PutLhsVar(); return 0; } else { Scierror(999,_("%s: Wrong type for input argument #%d: Matrix of strings expected.\n"),fname,1); return 0; } } break; default : Scierror(999,_("%s: Wrong type for input argument #%d: Matrix of strings expected.\n"),fname,1); return 0; break; } Output_Matrix = (char**)MALLOC(sizeof(char*)*(mn)); if (Output_Matrix == NULL) { Scierror(999,_("%s: No more memory.\n"),fname); return 0; } for (i = 0;i < mn;i++) { Output_Matrix[i] = (char*)MALLOC( sizeof(char*) * (strlen(Input_Matrix[i])+1) ); if (Output_Matrix[i] == NULL) { freeArrayOfString(Output_Matrix,i); Scierror(999,("%s: No more memory.\n"),fname); return 0; } } /* convstr algorithm */ convstr(Input_Matrix,Output_Matrix,typ,mn); freeArrayOfString(Input_Matrix,mn); /* put on scilab stack */ numRow = Row_Num_One; numCol = Col_Num_One ; CreateVarFromPtr( Rhs+1,MATRIX_OF_STRING_DATATYPE, &numRow, &numCol, Output_Matrix ); /* free pointers used */ freeArrayOfString(Output_Matrix,mn); LhsVar(1) = Rhs+1 ; PutLhsVar(); return 0; }