269
|
1 /*
|
|
2 XMMS-SID - SIDPlay input plugin for X MultiMedia System (XMMS)
|
|
3
|
|
4 Titlestring handling
|
|
5
|
|
6 Programmed and designed by Matti 'ccr' Hamalainen <ccr@tnsp.org>
|
|
7 (C) Copyright 1999-2005 Tecnic Software productions (TNSP)
|
|
8
|
|
9 This program is free software; you can redistribute it and/or modify
|
|
10 it under the terms of the GNU General Public License as published by
|
|
11 the Free Software Foundation; either version 2 of the License, or
|
|
12 (at your option) any later version.
|
|
13
|
|
14 This program is distributed in the hope that it will be useful,
|
|
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
17 GNU General Public License for more details.
|
|
18
|
|
19 You should have received a copy of the GNU General Public License
|
|
20 along with this program; if not, write to the Free Software
|
|
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
22 */
|
|
23 #include "xs_title.h"
|
|
24 #include "xs_support.h"
|
|
25 #include "xs_config.h"
|
|
26 #include "libaudacious/titlestring.h"
|
|
27
|
|
28
|
|
29 /*
|
|
30 * Create a title string based on given information and settings.
|
|
31 */
|
|
32 #define VPUTCH(MCH) \
|
|
33 if (iIndex < XS_BUF_SIZE) tmpBuf[iIndex++] = MCH;
|
|
34 #define VPUTSTR(MSTR) { \
|
|
35 if (MSTR) { \
|
|
36 if ((iIndex + strlen(MSTR) + 1) < XS_BUF_SIZE) { \
|
|
37 strcpy(&tmpBuf[iIndex], MSTR); \
|
|
38 iIndex += strlen(MSTR); \
|
|
39 } else \
|
|
40 iIndex = XS_BUF_SIZE; \
|
|
41 } \
|
|
42 }
|
|
43
|
|
44
|
|
45 gchar *xs_make_titlestring(gchar * pcFilename, gint iSubTune, gint nSubTunes, gint iSidModel,
|
|
46 const gchar * formatString, const gchar * infoString0,
|
|
47 const gchar * infoString1, const gchar * infoString2)
|
|
48 {
|
|
49 gchar *tmpFilename, *tmpFilePath, *tmpFileExt, *pcStr, *pcResult, tmpStr[XS_BUF_SIZE], tmpBuf[XS_BUF_SIZE];
|
|
50 gint iIndex;
|
|
51 #ifdef HAVE_XMMSEXTRA
|
|
52 TitleInput *ptInput;
|
|
53 #endif
|
|
54
|
|
55 /* Split the filename into path */
|
|
56 tmpFilePath = g_strdup(pcFilename);
|
|
57 tmpFilename = xs_strrchr(tmpFilePath, '/');
|
|
58 if (tmpFilename)
|
|
59 tmpFilename[1] = 0;
|
|
60
|
|
61 /* Filename */
|
|
62 tmpFilename = xs_strrchr(pcFilename, '/');
|
|
63 if (tmpFilename)
|
|
64 tmpFilename = g_strdup(tmpFilename + 1);
|
|
65 else
|
|
66 tmpFilename = g_strdup(pcFilename);
|
|
67
|
|
68 tmpFileExt = xs_strrchr(tmpFilename, '.');
|
|
69 tmpFileExt[0] = 0;
|
|
70
|
|
71 /* Extension */
|
|
72 tmpFileExt = xs_strrchr(pcFilename, '.');
|
|
73
|
|
74
|
|
75 #ifdef HAVE_XMMSEXTRA
|
|
76 /* Check if the titles are overridden or not */
|
|
77 if (!xs_cfg.titleOverride) {
|
|
78 /* Use generic XMMS titles */
|
|
79 /* XMMS_NEW_TITLEINPUT(ptInput);
|
|
80 * We duplicate and add typecast to the code here due to XMMS's braindead headers
|
|
81 */
|
|
82 ptInput = (TitleInput *) g_malloc0(sizeof(TitleInput));
|
|
83 ptInput->__size = XMMS_TITLEINPUT_SIZE;
|
|
84 ptInput->__version = XMMS_TITLEINPUT_VERSION;
|
|
85
|
|
86 /* Create the input fields */
|
|
87 ptInput->file_name = tmpFilename;
|
|
88 ptInput->file_ext = tmpFileExt;
|
|
89 ptInput->file_path = tmpFilePath;
|
|
90
|
|
91 ptInput->track_name = g_strdup(infoString0);
|
|
92 ptInput->track_number = iSubTune;
|
|
93 ptInput->album_name = NULL;
|
|
94 ptInput->performer = g_strdup(infoString1);
|
|
95 ptInput->date = g_strdup((iSidModel == XS_SIDMODEL_6581) ? "SID6581" : "SID8580");
|
|
96
|
|
97 ptInput->year = 0;
|
|
98 ptInput->genre = g_strdup("SID-tune");
|
|
99 ptInput->comment = g_strdup(infoString2);
|
|
100
|
|
101 /* Create the string */
|
|
102 pcResult = xmms_get_titlestring(xmms_get_gentitle_format(), ptInput);
|
|
103
|
|
104 /* Dispose all allocated memory */
|
|
105 g_free(ptInput->track_name);
|
|
106 g_free(ptInput->performer);
|
|
107 g_free(ptInput->comment);
|
|
108 g_free(ptInput->date);
|
|
109 g_free(ptInput->genre);
|
|
110 g_free(ptInput);
|
|
111 } else
|
|
112 #endif
|
|
113 {
|
|
114 /* Create the string */
|
|
115 pcStr = xs_cfg.titleFormat;
|
|
116 iIndex = 0;
|
|
117 while (*pcStr && (iIndex < XS_BUF_SIZE)) {
|
|
118 if (*pcStr == '%') {
|
|
119 pcStr++;
|
|
120 switch (*pcStr) {
|
|
121 case '%':
|
|
122 VPUTCH('%');
|
|
123 break;
|
|
124 case 'f':
|
|
125 VPUTSTR(tmpFilename);
|
|
126 break;
|
|
127 case 'F':
|
|
128 VPUTSTR(tmpFilePath);
|
|
129 break;
|
|
130 case 'e':
|
|
131 VPUTSTR(tmpFileExt);
|
|
132 break;
|
|
133 case 'p':
|
|
134 VPUTSTR(infoString1);
|
|
135 break;
|
|
136 case 't':
|
|
137 VPUTSTR(infoString0);
|
|
138 break;
|
|
139 case 'c':
|
|
140 VPUTSTR(infoString2);
|
|
141 break;
|
|
142 case 's':
|
|
143 VPUTSTR(formatString);
|
|
144 break;
|
|
145 case 'm':
|
|
146 switch (iSidModel) {
|
|
147 case XS_SIDMODEL_6581:
|
|
148 VPUTSTR("6581");
|
|
149 break;
|
|
150 case XS_SIDMODEL_8580:
|
|
151 VPUTSTR("8580");
|
|
152 break;
|
|
153 default:
|
|
154 VPUTSTR("Unknown");
|
|
155 break;
|
|
156 }
|
|
157 break;
|
|
158 case 'n':
|
|
159 snprintf(tmpStr, XS_BUF_SIZE, "%i", iSubTune);
|
|
160 VPUTSTR(tmpStr);
|
|
161 break;
|
|
162 case 'N':
|
|
163 snprintf(tmpStr, XS_BUF_SIZE, "%i", nSubTunes);
|
|
164 VPUTSTR(tmpStr);
|
|
165 break;
|
|
166 }
|
|
167 } else {
|
|
168 VPUTCH(*pcStr);
|
|
169 }
|
|
170 pcStr++;
|
|
171 }
|
|
172
|
|
173 tmpBuf[iIndex] = 0;
|
|
174
|
|
175 /* Make resulting string */
|
|
176 pcResult = g_strdup(tmpBuf);
|
|
177 }
|
|
178
|
|
179 /* Free temporary strings */
|
|
180 g_free(tmpFilename);
|
|
181 g_free(tmpFilePath);
|
|
182
|
|
183 return pcResult;
|
|
184 }
|