Mercurial > audlegacy-plugins
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 } |