1 /*
2  * Adplug - Replayer for many OPL2/OPL3 audio file formats.
3  * Copyright (C) 1999 - 2008 Simon Peter <dn.tlp@gmx.net>, et al.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  *
19  * adplug.cpp - CAdPlug utility class, by Simon Peter <dn.tlp@gmx.net>
20  */
21 
22 #include <string.h>
23 #include <binfile.h>
24 
25 #include "adplug.h"
26 #include "debug.h"
27 
28 /***** Replayer includes *****/
29 
30 #include "hsc.h"
31 #include "amd.h"
32 #include "a2m.h"
33 #include "imf.h"
34 #include "sng.h"
35 #include "adtrack.h"
36 #include "bam.h"
37 //#include "cmf.h"
38 #include "d00.h"
39 #include "dfm.h"
40 #include "hsp.h"
41 #include "ksm.h"
42 #include "mad.h"
43 #include "mid.h"
44 #include "mkj.h"
45 #include "cff.h"
46 #include "dmo.h"
47 #include "s3m.h"
48 #include "dtm.h"
49 #include "fmc.h"
50 #include "mtk.h"
51 #include "rad.h"
52 #include "raw.h"
53 #include "sa2.h"
54 #include "bmf.h"
55 #include "flash.h"
56 #include "hybrid.h"
57 #include "hyp.h"
58 #include "psi.h"
59 #include "rat.h"
60 #include "lds.h"
61 #include "u6m.h"
62 #include "rol.h"
63 #include "xsm.h"
64 #include "dro.h"
65 #include "dro2.h"
66 #include "msc.h"
67 #include "rix.h"
68 #include "adl.h"
69 #include "jbm.h"
70 
71 /***** CAdPlug *****/
72 
73 // List of all players that come with the standard AdPlug distribution
74 CPlayerDesc CAdPlug::allplayers[] = {
75   CPlayerDesc(ChscPlayer::factory, "HSC-Tracker", ".hsc\0"),
76   CPlayerDesc(CsngPlayer::factory, "SNGPlay", ".sng\0"),
77   CPlayerDesc(CimfPlayer::factory, "Apogee IMF", ".imf\0.wlf\0.adlib\0"),
78   CPlayerDesc(Ca2mLoader::factory, "Adlib Tracker 2", ".a2m\0"),
79   CPlayerDesc(CadtrackLoader::factory, "Adlib Tracker", ".sng\0"),
80   CPlayerDesc(CamdLoader::factory, "AMUSIC", ".amd\0"),
81   CPlayerDesc(CbamPlayer::factory, "Bob's Adlib Music", ".bam\0"),
82 //  CPlayerDesc(CcmfPlayer::factory, "Creative Music File", ".cmf\0"),
83   CPlayerDesc(Cd00Player::factory, "Packed EdLib", ".d00\0"),
84   CPlayerDesc(CdfmLoader::factory, "Digital-FM", ".dfm\0"),
85   CPlayerDesc(ChspLoader::factory, "HSC Packed", ".hsp\0"),
86   CPlayerDesc(CksmPlayer::factory, "Ken Silverman Music", ".ksm\0"),
87   CPlayerDesc(CmadLoader::factory, "Mlat Adlib Tracker", ".mad\0"),
88   CPlayerDesc(CmidPlayer::factory, "MIDI", ".mid\0.sci\0.laa\0.cmf\0"),
89   CPlayerDesc(CmkjPlayer::factory, "MKJamz", ".mkj\0"),
90   CPlayerDesc(CcffLoader::factory, "Boomtracker", ".cff\0"),
91   CPlayerDesc(CdmoLoader::factory, "TwinTeam", ".dmo\0"),
92   CPlayerDesc(Cs3mPlayer::factory, "Scream Tracker 3", ".s3m\0"),
93   CPlayerDesc(CdtmLoader::factory, "DeFy Adlib Tracker", ".dtm\0"),
94   CPlayerDesc(CfmcLoader::factory, "Faust Music Creator", ".sng\0"),
95   CPlayerDesc(CmtkLoader::factory, "MPU-401 Trakker", ".mtk\0"),
96   CPlayerDesc(CradLoader::factory, "Reality Adlib Tracker", ".rad\0"),
97   CPlayerDesc(CrawPlayer::factory, "RdosPlay RAW", ".raw\0"),
98   CPlayerDesc(Csa2Loader::factory, "Surprise! Adlib Tracker", ".sat\0.sa2\0"),
99   CPlayerDesc(CxadbmfPlayer::factory, "BMF Adlib Tracker", ".xad\0"),
100   CPlayerDesc(CxadflashPlayer::factory, "Flash", ".xad\0"),
101   CPlayerDesc(CxadhybridPlayer::factory, "Hybrid", ".xad\0"),
102   CPlayerDesc(CxadhypPlayer::factory, "Hypnosis", ".xad\0"),
103   CPlayerDesc(CxadpsiPlayer::factory, "PSI", ".xad\0"),
104   CPlayerDesc(CxadratPlayer::factory, "rat", ".xad\0"),
105   CPlayerDesc(CldsPlayer::factory, "LOUDNESS Sound System", ".lds\0"),
106   CPlayerDesc(Cu6mPlayer::factory, "Ultima 6 Music", ".m\0"),
107   CPlayerDesc(CrolPlayer::factory, "Adlib Visual Composer", ".rol\0"),
108   CPlayerDesc(CxsmPlayer::factory, "eXtra Simple Music", ".xsm\0"),
109   CPlayerDesc(CdroPlayer::factory, "DOSBox Raw OPL v0.1", ".dro\0"),
110   CPlayerDesc(Cdro2Player::factory, "DOSBox Raw OPL v2.0", ".dro\0"),
111   CPlayerDesc(CmscPlayer::factory, "Adlib MSC Player", ".msc\0"),
112   CPlayerDesc(CrixPlayer::factory, "Softstar RIX OPL Music", ".rix\0"),
113   CPlayerDesc(CadlPlayer::factory, "Westwood ADL", ".adl\0"),
114   CPlayerDesc(CjbmPlayer::factory, "JBM Adlib Music", ".jbm\0"),
115   CPlayerDesc()
116 };
117 
init_players(CPlayerDesc pd[])118 const CPlayers &CAdPlug::init_players(CPlayerDesc pd[])
119 {
120   static CPlayers	initplayers;
121   unsigned int		i;
122 
123   for(i = 0; pd[i].factory; i++)
124     initplayers.push_back(&pd[i]);
125 
126   return initplayers;
127 }
128 
129 const CPlayers CAdPlug::players = CAdPlug::init_players(CAdPlug::allplayers);
130 //CAdPlugDatabase *CAdPlug::database = 0;
131 
factory(const char * fn,Copl * opl,const CPlayers & pl,const CFileProvider & fp)132 CPlayer *CAdPlug::factory(const char *fn, Copl *opl, const CPlayers &pl,
133 			  const CFileProvider &fp)
134 {
135   CPlayer			*p;
136   CPlayerDesc *i;
137   unsigned int			j;
138 
139   AdPlug_LogWrite("*** CAdPlug::factory(\"%s\",opl,fp) ***\n", fn);
140 
141   // Try a direct hit by file extension
142   for(i = pl.head; i; i = i->next)
143     for(j = 0; i->get_extension(j); j++)
144       if(fp.extension(fn, i->get_extension(j))) {
145 	AdPlug_LogWrite("Trying direct hit: %s\n", i->filetype);
146 	if((p = i->factory(opl))) {
147 	  if(p->load(fn, fp)) {
148 	    AdPlug_LogWrite("got it!\n");
149 	    AdPlug_LogWrite("--- CAdPlug::factory ---\n");
150 	    return p;
151 	  } else
152 	    delete p;
153 	}
154       }
155 
156   // Try all players, one by one
157   for(i = pl.head; i; i = i->next) {
158     AdPlug_LogWrite("Trying: %s\n", i->filetype);
159     if((p = i->factory(opl))) {
160       if(p->load(fn, fp)) {
161         AdPlug_LogWrite("got it!\n");
162         AdPlug_LogWrite("--- CAdPlug::factory ---\n");
163 	return p;
164       } else
165 	delete p;
166     }
167   }
168 
169   // Unknown file
170   AdPlug_LogWrite("End of list!\n");
171   AdPlug_LogWrite("--- CAdPlug::factory ---\n");
172   return 0;
173 }
174 
175 #if 0
176 void CAdPlug::set_database(CAdPlugDatabase *db)
177 {
178   database = db;
179 }
180 #endif
181 
get_version()182 const char * CAdPlug::get_version()
183 {
184   return VERSION;
185 }
186 
debug_output(const char * filename)187 void CAdPlug::debug_output(const char *filename)
188 {
189   AdPlug_LogFile(filename);
190   AdPlug_LogWrite("CAdPlug::debug_output(\"%s\"): Redirected.\n",filename);
191 }
192