Mercurial > hg > xmms-sid
diff src/xs_length.c @ 4:4bb09e405eab
Added new files for 0.8
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 03 Jun 2003 11:03:04 +0000 |
parents | |
children | f5d82424b0ed |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/xs_length.c Tue Jun 03 11:03:04 2003 +0000 @@ -0,0 +1,262 @@ +/* + XMMS-SID - SIDPlay input plugin for X MultiMedia System (XMMS) + + Get song length (from database or by other means) + + Written by Matti "ccr" Hamalainen <ccr@tnsp.org> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "xmms-sid.h" +#include "xs_length.h" +#include <stdlib.h> +#include <stdio.h> +#include <ctype.h> +#include <string.h> + +/* + * Pointer to database in memory + */ +static t_xs_dbentry *xs_database = NULL; + + +/* + * Parses a time-entry in SLDB format + */ +long int xs_gettime(char *pcStr, int *piPos) +{ + long int iResult; + int iTemp; + char chTempBuf[16]; + + /* Check if it starts with a digit */ + if (isdigit(pcStr[*piPos])) + { + /* Get minutes-field */ + iTemp = *piPos; + xs_findnum(pcStr, piPos); + + strncpy(chTempBuf, &pcStr[iTemp], (*piPos - iTemp)); + chTempBuf[*piPos - iTemp] = 0; + + iResult = (atol(chTempBuf) * 60); + + /* Check the field separator char */ + if (pcStr[*piPos] == ':') + { + /* Get seconds-field */ + (*piPos)++; + iTemp = *piPos; + xs_findnum(pcStr, piPos); + + strncpy(chTempBuf, &pcStr[iTemp], (*piPos - iTemp)); + chTempBuf[*piPos - iTemp] = 0; + + iResult += atol(chTempBuf); + + } else + iResult = -2; + } else + iResult = -1; + + /* Ignore and skip the possible attributes */ + while (!isspace(pcStr[*piPos])) (*piPos)++; + + return iResult; +} + + +/* + * Initialize, read database to memory + */ +gint xs_db_initialize(gchar *pcFilename) +{ + FILE *inFile; + char inLine[256]; + int lineNum, linePos, i, j, k; + t_xs_hash tmpHash; + + + /* Try to open the file */ + if ((inFile = fopen(pcFilename, "r")) == NULL) + { + fprintf(stderr, "hv!\n"); + return -1; + } + + + /* Read and parse the data */ + lineNum = 0; + + while (!feof(inFile)) + { + fgets(inLine, sizeof(inLine), inFile); + linePos = 0; + + if (strlen(inLine) > 1) + { + /* Find first character */ + xs_findnext(inLine, &linePos); + + /* Check if it is a hash-line */ + if (isxdigit(inLine[linePos])) + { + i = linePos; + while (isxdigit(inLine[linePos])) linePos++; + + if ((linePos - i) != XS_HASH_LENGTH_CH) + { + XSERR("Invalid hash/syntax error in SongLengthDB file '%s' line #%d!\n", + pcFilename, lineNum); + } else { + /* Get hashcode value */ + for (j = 0; j < XS_HASH_LENGTH; j++) + { + + } + + /* Get playtimes */ + xs_findnext(line, &linePos); + + if (line[linePos] != '=') + { + XSERR("Warning: '=' expected in line #%d in SongLengthDB file '%s'\n", + lineNum, pcFilename); + } else { + linePos++; + + while (linePos < strlen(inLine)) + { + xs_findnext(line, &linePos); + printf("[%lis]", xs_gettime(inLine, &linePos)); + } + + + /* Add an entry to db in memory */ + } + } + } + else + if ((line[linePos] != ';') && (line[linePos] != '[')) + { + XSERR("Invalid line #%d in SongLengthDB file '%s'\n", lineNum, pcFilename); + } + + } /* strlen(line) > 1 */ + + lineNum++; + } + + fclose(inFile); + + return 0; +} + + +/* + * + */ +gint xs_db_delete(void) +{ + /* Free the memory allocated for database */ + + return 0; +} + + +/* + * + */ +int xs_comparehashes(t_xs_hash *testHash1, t_xs_hash *testHash2) +{ + int iIndex, iOK; + + iOK = 1; + iIndex = 0; + while ((iIndex < 16) && (iOK)) + { + if (testHash1[iIndex] != testHash2[iIndex]) + iOK = 0; + else + iIndex++; + } + + return iOK; +} + + + + +/* + * Get song length from database + */ +t_xs_dbentry * xs_db_get(gchar *pcFilename) +{ + + return NULL; +} + + +gint32 xs_get_length(gchar *pcFilename, gint iSubTune) +{ + gint32 iResult; + t_xs_dbentry *dbEntry; + t_xs_hash dbHash; + + iResult = -1; + + switch (xs_cfg.playMethod) { + + case XMMS_SID_PMETHOD_DATABASE: + + iResult = xs_db_get(pcFilename, &dbHash); + if (iResult >= 0) + { + } + + if (dbEntry) + { + if ((iSubTune >= 0) && (iSubTune < dbEntry->nlengths)) + iResult = dbEntry->lengths[iSubTune]; + else + iResult = -1; + } + break; + + case XMMS_SID_PMETHOD_MAXSILENCE: + case XMMS_SID_PMETHOD_NONE: + iResult = -1; + break; + + default: + XSERR("Invalid play-method! (%d, unknown)\n", xs_cfg.playMethod); + break; + } + + /* Check for max playtime */ + if (iResult == -1) + { + if (xs_cfg.playUseMaxTime) + iResult = xs_cfg.playMaxTime; + else + iResult = -1; + } + + XSDEBUG("fname='%s', sub=%i, res=%li\n", pcFilename, iSubTune, iResult); + + return iResult; +} +