comparison src/modplug/modplug.cxx @ 136:6b5a52635b3b trunk

[svn] - like with so many other things, modplug is now maintained by us.
author nenolod
date Sun, 29 Oct 2006 01:04:52 -0700
parents
children 0f2f68b9c98c
comparison
equal deleted inserted replaced
135:33d24bd94ccc 136:6b5a52635b3b
1 /*
2 * This source code is public domain.
3 *
4 * Authors: Kenton Varda <temporal@gauge3d.org> (C interface wrapper)
5 */
6
7 #include "modplug.h"
8 #include "stdafx.h"
9 #include "sndfile.h"
10
11 struct _ModPlugFile
12 {
13 CSoundFile mSoundFile;
14 };
15
16 namespace ModPlug
17 {
18 ModPlug_Settings gSettings =
19 {
20 MODPLUG_ENABLE_OVERSAMPLING | MODPLUG_ENABLE_NOISE_REDUCTION,
21
22 2,
23 16,
24 44100,
25 MODPLUG_RESAMPLE_LINEAR,
26
27 0,
28 0,
29 0,
30 0,
31 0,
32 0,
33 0
34 };
35
36 int gSampleSize;
37
38 void UpdateSettings(bool updateBasicConfig)
39 {
40 if(gSettings.mFlags & MODPLUG_ENABLE_REVERB)
41 {
42 CSoundFile::SetReverbParameters(gSettings.mReverbDepth,
43 gSettings.mReverbDelay);
44 }
45
46 if(gSettings.mFlags & MODPLUG_ENABLE_MEGABASS)
47 {
48 CSoundFile::SetXBassParameters(gSettings.mBassAmount,
49 gSettings.mBassRange);
50 }
51 else // modplug seems to ignore the SetWaveConfigEx() setting for bass boost
52 CSoundFile::SetXBassParameters(0, 0);
53
54 if(gSettings.mFlags & MODPLUG_ENABLE_SURROUND)
55 {
56 CSoundFile::SetSurroundParameters(gSettings.mSurroundDepth,
57 gSettings.mSurroundDelay);
58 }
59
60 if(updateBasicConfig)
61 {
62 CSoundFile::SetWaveConfig(gSettings.mFrequency,
63 gSettings.mBits,
64 gSettings.mChannels);
65
66 gSampleSize = gSettings.mBits / 8 * gSettings.mChannels;
67 }
68
69 CSoundFile::SetWaveConfigEx(gSettings.mFlags & MODPLUG_ENABLE_SURROUND,
70 !(gSettings.mFlags & MODPLUG_ENABLE_OVERSAMPLING),
71 gSettings.mFlags & MODPLUG_ENABLE_REVERB,
72 true,
73 gSettings.mFlags & MODPLUG_ENABLE_MEGABASS,
74 gSettings.mFlags & MODPLUG_ENABLE_NOISE_REDUCTION,
75 false);
76 CSoundFile::SetResamplingMode(gSettings.mResamplingMode);
77 }
78 }
79
80 ModPlugFile* ModPlug_Load(const void* data, int size)
81 {
82 ModPlugFile* result = new ModPlugFile;
83 ModPlug::UpdateSettings(true);
84 if(result->mSoundFile.Create((const BYTE*)data, size))
85 {
86 result->mSoundFile.SetRepeatCount(ModPlug::gSettings.mLoopCount);
87 return result;
88 }
89 else
90 {
91 delete result;
92 return NULL;
93 }
94 }
95
96 void ModPlug_Unload(ModPlugFile* file)
97 {
98 file->mSoundFile.Destroy();
99 delete file;
100 }
101
102 int ModPlug_Read(ModPlugFile* file, void* buffer, int size)
103 {
104 return file->mSoundFile.Read(buffer, size) * ModPlug::gSampleSize;
105 }
106
107 const char* ModPlug_GetName(ModPlugFile* file)
108 {
109 return file->mSoundFile.GetTitle();
110 }
111
112 int ModPlug_GetLength(ModPlugFile* file)
113 {
114 return file->mSoundFile.GetSongTime() * 1000;
115 }
116
117 void ModPlug_InitMixerCallback(ModPlugFile* file,ModPlugMixerProc proc)
118 {
119 file->mSoundFile.gpSndMixHook = (LPSNDMIXHOOKPROC)proc ;
120 return;
121 }
122
123 void ModPlug_UnloadMixerCallback(ModPlugFile* file)
124 {
125 file->mSoundFile.gpSndMixHook = NULL;
126 return ;
127 }
128
129 unsigned int ModPlug_GetMasterVolume(ModPlugFile* file)
130 {
131 return (unsigned int)file->mSoundFile.m_nMasterVolume;
132 }
133
134 void ModPlug_SetMasterVolume(ModPlugFile* file,unsigned int cvol)
135 {
136 (void)file->mSoundFile.SetMasterVolume( (UINT)cvol,
137 FALSE );
138 return ;
139 }
140
141 int ModPlug_GetCurrentSpeed(ModPlugFile* file)
142 {
143 return file->mSoundFile.m_nMusicSpeed;
144 }
145
146 int ModPlug_GetCurrentTempo(ModPlugFile* file)
147 {
148 return file->mSoundFile.m_nMusicTempo;
149 }
150
151 int ModPlug_GetCurrentOrder(ModPlugFile* file)
152 {
153 return file->mSoundFile.GetCurrentOrder();
154 }
155
156 int ModPlug_GetCurrentPattern(ModPlugFile* file)
157 {
158 return file->mSoundFile.GetCurrentPattern();
159 }
160
161 int ModPlug_GetCurrentRow(ModPlugFile* file)
162 {
163 return file->mSoundFile.m_nRow;
164 }
165
166 int ModPlug_GetPlayingChannels(ModPlugFile* file)
167 {
168 return ( file->mSoundFile.m_nMixChannels < file->mSoundFile.m_nMaxMixChannels ? file->mSoundFile.m_nMixChannels : file->mSoundFile.m_nMaxMixChannels );
169 }
170
171 void ModPlug_SeekOrder(ModPlugFile* file,int order)
172 {
173 file->mSoundFile.SetCurrentOrder(order);
174 }
175
176 int ModPlug_GetModuleType(ModPlugFile* file)
177 {
178 return file->mSoundFile.m_nType;
179 }
180
181 char* ModPlug_GetMessage(ModPlugFile* file)
182 {
183 return file->mSoundFile.m_lpszSongComments;
184 }
185
186 #ifndef MODPLUG_NO_FILESAVE
187 char ModPlug_ExportS3M(ModPlugFile* file,const char* filepath)
188 {
189 return (char)file->mSoundFile.SaveS3M(filepath,0);
190 }
191
192 char ModPlug_ExportXM(ModPlugFile* file,const char* filepath)
193 {
194 return (char)file->mSoundFile.SaveXM(filepath,0);
195 }
196
197 char ModPlug_ExportMOD(ModPlugFile* file,const char* filepath)
198 {
199 return (char)file->mSoundFile.SaveMod(filepath,0);
200 }
201
202 char ModPlug_ExportIT(ModPlugFile* file,const char* filepath)
203 {
204 return (char)file->mSoundFile.SaveIT(filepath,0);
205 }
206 #endif // MODPLUG_NO_FILESAVE
207
208 unsigned int ModPlug_NumInstruments(ModPlugFile* file)
209 {
210 return file->mSoundFile.m_nInstruments;
211 }
212
213 unsigned int ModPlug_NumSamples(ModPlugFile* file)
214 {
215 return file->mSoundFile.m_nSamples;
216 }
217
218 unsigned int ModPlug_NumPatterns(ModPlugFile* file)
219 {
220 return file->mSoundFile.GetNumPatterns();
221 }
222
223 unsigned int ModPlug_NumChannels(ModPlugFile* file)
224 {
225 return file->mSoundFile.GetNumChannels();
226 }
227
228 unsigned int ModPlug_SampleName(ModPlugFile* file,unsigned int qual,char* buff)
229 {
230 return file->mSoundFile.GetSampleName(qual,buff);
231 }
232
233 unsigned int ModPlug_InstrumentName(ModPlugFile* file,unsigned int qual,char* buff)
234 {
235 return file->mSoundFile.GetInstrumentName(qual,buff);
236 }
237
238 ModPlugNote* ModPlug_GetPattern(ModPlugFile* file,int pattern,unsigned int* numrows) {
239 if ( pattern<MAX_PATTERNS ) {
240 if (file->mSoundFile.Patterns[pattern]) {
241 if (numrows) *numrows=(unsigned int)file->mSoundFile.PatternSize[pattern];
242 return (ModPlugNote*)file->mSoundFile.Patterns[pattern];
243 }
244 }
245 return NULL;
246 }
247
248 void ModPlug_Seek(ModPlugFile* file, int millisecond)
249 {
250 int maxpos;
251 int maxtime = file->mSoundFile.GetSongTime() * 1000;
252 float postime;
253
254 if(millisecond > maxtime)
255 millisecond = maxtime;
256 maxpos = file->mSoundFile.GetMaxPosition();
257 postime = (float)maxpos / (float)maxtime;
258
259 file->mSoundFile.SetCurrentPos((int)(millisecond * postime));
260 }
261
262 void ModPlug_GetSettings(ModPlug_Settings* settings)
263 {
264 memcpy(settings, &ModPlug::gSettings, sizeof(ModPlug_Settings));
265 }
266
267 void ModPlug_SetSettings(const ModPlug_Settings* settings)
268 {
269 memcpy(&ModPlug::gSettings, settings, sizeof(ModPlug_Settings));
270 ModPlug::UpdateSettings(false); // do not update basic config.
271 }