WaveSwissKnife 0.0.1.20101110-x86-cygwin

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. data/AUTHORS +1 -0
  2. data/ChangeLog +5 -0
  3. data/Credits +3 -0
  4. data/LICENSE +31 -0
  5. data/README +18 -0
  6. data/ReleaseInfo +8 -0
  7. data/TODO +2 -0
  8. data/bin/WSK.rb +14 -0
  9. data/ext/WSK/AnalyzeUtils/AnalyzeUtils.c +272 -0
  10. data/ext/WSK/AnalyzeUtils/AnalyzeUtils.o +0 -0
  11. data/ext/WSK/AnalyzeUtils/AnalyzeUtils.so +0 -0
  12. data/ext/WSK/AnalyzeUtils/Makefile +149 -0
  13. data/ext/WSK/AnalyzeUtils/build.rb +18 -0
  14. data/ext/WSK/ArithmUtils/ArithmUtils.c +862 -0
  15. data/ext/WSK/ArithmUtils/ArithmUtils.o +0 -0
  16. data/ext/WSK/ArithmUtils/ArithmUtils.so +0 -0
  17. data/ext/WSK/ArithmUtils/Makefile +149 -0
  18. data/ext/WSK/ArithmUtils/build.rb +20 -0
  19. data/ext/WSK/FFTUtils/FFTUtils.c +662 -0
  20. data/ext/WSK/FFTUtils/FFTUtils.o +0 -0
  21. data/ext/WSK/FFTUtils/FFTUtils.so +0 -0
  22. data/ext/WSK/FFTUtils/Makefile +149 -0
  23. data/ext/WSK/FFTUtils/build.rb +20 -0
  24. data/ext/WSK/FunctionUtils/FunctionUtils.c +182 -0
  25. data/ext/WSK/FunctionUtils/FunctionUtils.o +0 -0
  26. data/ext/WSK/FunctionUtils/FunctionUtils.so +0 -0
  27. data/ext/WSK/FunctionUtils/Makefile +149 -0
  28. data/ext/WSK/FunctionUtils/build.rb +20 -0
  29. data/ext/WSK/SilentUtils/Makefile +149 -0
  30. data/ext/WSK/SilentUtils/SilentUtils.c +431 -0
  31. data/ext/WSK/SilentUtils/SilentUtils.o +0 -0
  32. data/ext/WSK/SilentUtils/SilentUtils.so +0 -0
  33. data/ext/WSK/SilentUtils/build.rb +18 -0
  34. data/ext/WSK/VolumeUtils/Makefile +149 -0
  35. data/ext/WSK/VolumeUtils/VolumeUtils.c +494 -0
  36. data/ext/WSK/VolumeUtils/VolumeUtils.o +0 -0
  37. data/ext/WSK/VolumeUtils/VolumeUtils.so +0 -0
  38. data/ext/WSK/VolumeUtils/build.rb +20 -0
  39. data/lib/WSK/Actions/Analyze.rb +176 -0
  40. data/lib/WSK/Actions/ApplyMap.desc.rb +15 -0
  41. data/lib/WSK/Actions/ApplyMap.rb +57 -0
  42. data/lib/WSK/Actions/ApplyVolumeFct.desc.rb +30 -0
  43. data/lib/WSK/Actions/ApplyVolumeFct.rb +72 -0
  44. data/lib/WSK/Actions/Compare.desc.rb +25 -0
  45. data/lib/WSK/Actions/Compare.rb +238 -0
  46. data/lib/WSK/Actions/ConstantCompare.desc.rb +20 -0
  47. data/lib/WSK/Actions/ConstantCompare.rb +61 -0
  48. data/lib/WSK/Actions/Cut.desc.rb +20 -0
  49. data/lib/WSK/Actions/Cut.rb +60 -0
  50. data/lib/WSK/Actions/CutFirstSignal.desc.rb +25 -0
  51. data/lib/WSK/Actions/CutFirstSignal.rb +72 -0
  52. data/lib/WSK/Actions/DCShifter.desc.rb +15 -0
  53. data/lib/WSK/Actions/DCShifter.rb +67 -0
  54. data/lib/WSK/Actions/DrawFct.desc.rb +20 -0
  55. data/lib/WSK/Actions/DrawFct.rb +59 -0
  56. data/lib/WSK/Actions/FFT.rb +104 -0
  57. data/lib/WSK/Actions/GenAllValues.rb +67 -0
  58. data/lib/WSK/Actions/GenConstant.desc.rb +20 -0
  59. data/lib/WSK/Actions/GenConstant.rb +56 -0
  60. data/lib/WSK/Actions/GenSawtooth.rb +57 -0
  61. data/lib/WSK/Actions/GenSine.desc.rb +20 -0
  62. data/lib/WSK/Actions/GenSine.rb +73 -0
  63. data/lib/WSK/Actions/Identity.rb +43 -0
  64. data/lib/WSK/Actions/Mix.desc.rb +15 -0
  65. data/lib/WSK/Actions/Mix.rb +149 -0
  66. data/lib/WSK/Actions/Multiply.desc.rb +15 -0
  67. data/lib/WSK/Actions/Multiply.rb +73 -0
  68. data/lib/WSK/Actions/NoiseGate.desc.rb +35 -0
  69. data/lib/WSK/Actions/NoiseGate.rb +129 -0
  70. data/lib/WSK/Actions/SilenceInserter.desc.rb +20 -0
  71. data/lib/WSK/Actions/SilenceInserter.rb +87 -0
  72. data/lib/WSK/Actions/SilenceRemover.desc.rb +30 -0
  73. data/lib/WSK/Actions/SilenceRemover.rb +74 -0
  74. data/lib/WSK/Actions/VolumeProfile.desc.rb +35 -0
  75. data/lib/WSK/Actions/VolumeProfile.rb +63 -0
  76. data/lib/WSK/Common.rb +292 -0
  77. data/lib/WSK/FFT.rb +527 -0
  78. data/lib/WSK/Functions.rb +770 -0
  79. data/lib/WSK/Launcher.rb +216 -0
  80. data/lib/WSK/Maps.rb +29 -0
  81. data/lib/WSK/Model/CachedBufferReader.rb +151 -0
  82. data/lib/WSK/Model/Header.rb +133 -0
  83. data/lib/WSK/Model/InputData.rb +193 -0
  84. data/lib/WSK/Model/RawReader.rb +78 -0
  85. data/lib/WSK/Model/WaveReader.rb +91 -0
  86. data/lib/WSK/OutputInterfaces/DirectStream.rb +146 -0
  87. data/lib/WSK/RIFFReader.rb +60 -0
  88. metadata +151 -0
@@ -0,0 +1,431 @@
1
+ /**
2
+ * Copyright (c) 2009-2010 Muriel Salvan (murielsalvan@users.sourceforge.net)
3
+ * Licensed under the terms specified in LICENSE file. No warranty is provided.
4
+ **/
5
+
6
+ #include "ruby.h"
7
+ #include <CommonUtils.h>
8
+
9
+ // Struct used to convey data among iterators in the getNextSilentSample method
10
+ typedef struct {
11
+ tSampleIndex* ptrIdxFirstSilentSample;
12
+ tThresholdInfo* ptrSilenceThresholds;
13
+ tSampleIndex* ptrIdxSilenceSample_Result;
14
+ tSampleIndex minSilenceSamples;
15
+ int nbrChannels;
16
+ } tFindSilentStruct;
17
+
18
+ // Struct used to convey data among iterators in the getFirstSampleBeyondThreshold method
19
+ typedef struct {
20
+ tSampleIndex* ptrIdxSample_Result;
21
+ tThresholdInfo* ptrThresholds;
22
+ int nbrChannels;
23
+ } tFirstSampleBeyondThresholdStruct;
24
+
25
+ /**
26
+ * Process a value read from an input buffer for the NextSilentSample function.
27
+ *
28
+ * Parameters:
29
+ * * *iValue* (<em>const tSampleValue</em>): The value being read
30
+ * * *iIdxSample* (<em>const tSampleIndex</em>): Index of this sample
31
+ * * *iIdxChannel* (<em>const int</em>): Channel corresponding to the value being read
32
+ * * *iPtrArgs* (<em>void*</em>): additional arguments. In fact a <em>tFindSilentStruct*</em>.
33
+ * Return:
34
+ * * _int_: The return code:
35
+ * ** 0: Continue iteration
36
+ * ** 1: Break all iterations
37
+ * ** 2: Skip directly to the next sample (don't call us for other channels of this sample)
38
+ */
39
+ int silentutils_processValue(
40
+ const tSampleValue iValue,
41
+ const tSampleIndex iIdxSample,
42
+ const int iIdxChannel,
43
+ void* iPtrArgs) {
44
+ int rResult = 0;
45
+
46
+ // Interpret parameters
47
+ tFindSilentStruct* lPtrVariables = (tFindSilentStruct*)iPtrArgs;
48
+
49
+ if ((iValue < (lPtrVariables->ptrSilenceThresholds)[iIdxChannel].min) ||
50
+ (iValue > (lPtrVariables->ptrSilenceThresholds)[iIdxChannel].max)) {
51
+ // This value is not silent
52
+ // If we were in silence that has not yet reached its minimal duration, cancel this last silence
53
+ *(lPtrVariables->ptrIdxFirstSilentSample) = -1;
54
+ // Don't even read other channels
55
+ rResult = 2;
56
+ } else {
57
+ // This value is silent
58
+ if ((*(lPtrVariables->ptrIdxFirstSilentSample)) == -1) {
59
+ // This is the first silent value we have
60
+ *(lPtrVariables->ptrIdxFirstSilentSample) = iIdxSample;
61
+ }
62
+ // Check if the minimal duration has been reached
63
+ if (iIdxSample - (*(lPtrVariables->ptrIdxFirstSilentSample)) + 1 >= lPtrVariables->minSilenceSamples) {
64
+ // We have found a silence according to thresholds.
65
+ *(lPtrVariables->ptrIdxSilenceSample_Result) = *(lPtrVariables->ptrIdxFirstSilentSample);
66
+ // Stop iterations
67
+ rResult = 1;
68
+ }
69
+ }
70
+
71
+ return rResult;
72
+ }
73
+
74
+ /**
75
+ * Process a value read from an input buffer for the NextSilentSample function.
76
+ * Do it in backwards search.
77
+ *
78
+ * Parameters:
79
+ * * *iValue* (<em>const tSampleValue</em>): The value being read
80
+ * * *iIdxSample* (<em>const tSampleIndex</em>): Index of this sample
81
+ * * *iIdxChannel* (<em>const int</em>): Channel corresponding to the value being read
82
+ * * *iPtrArgs* (<em>void*</em>): additional arguments. In fact a <em>tFindSilentStruct*</em>.
83
+ * Return:
84
+ * * _int_: The return code:
85
+ * ** 0: Continue iteration
86
+ * ** 1: Break all iterations
87
+ * ** 2: Skip directly to the next sample (don't call us for other channels of this sample)
88
+ */
89
+ int silentutils_Reverse_processValue(
90
+ const tSampleValue iValue,
91
+ const tSampleIndex iIdxSample,
92
+ const int iIdxChannel,
93
+ void* iPtrArgs) {
94
+ int rResult = 0;
95
+
96
+ // Interpret parameters
97
+ tFindSilentStruct* lPtrVariables = (tFindSilentStruct*)iPtrArgs;
98
+
99
+ if ((iValue < (lPtrVariables->ptrSilenceThresholds)[iIdxChannel].min) ||
100
+ (iValue > (lPtrVariables->ptrSilenceThresholds)[iIdxChannel].max)) {
101
+ // This value is not silent
102
+ // If we were in silence that has not yet reached its minimal duration, cancel this last silence
103
+ *(lPtrVariables->ptrIdxFirstSilentSample) = -1;
104
+ // Don't even read other channels
105
+ rResult = 2;
106
+ } else {
107
+ // This value is silent
108
+ if ((*(lPtrVariables->ptrIdxFirstSilentSample)) == -1) {
109
+ // This is the first silent value we have
110
+ *(lPtrVariables->ptrIdxFirstSilentSample) = iIdxSample;
111
+ }
112
+ // Check if the minimal duration has been reached
113
+ if ((*(lPtrVariables->ptrIdxFirstSilentSample)) - iIdxSample + 1 >= lPtrVariables->minSilenceSamples) {
114
+ // We have found a silence according to thresholds.
115
+ *(lPtrVariables->ptrIdxSilenceSample_Result) = *(lPtrVariables->ptrIdxFirstSilentSample);
116
+ // Stop iterations
117
+ rResult = 1;
118
+ }
119
+ }
120
+
121
+ return rResult;
122
+ }
123
+
124
+ /**
125
+ * Code block called by getNextSilentSample in the eachRawBuffer loop.
126
+ * This is meant to be used with rb_iterate.
127
+ *
128
+ * Parameters:
129
+ * * *iValYieldArgs* (<em>list<Object></em>): The yield arguments:
130
+ * ** *iValInputRawBuffer* (_String_): The raw buffer
131
+ * ** *iValNbrSamples* (_Integer_): The number of samples in this buffer
132
+ * ** *iValNbrChannels* (_Integer_): The number of channels in this buffer
133
+ * * *iValIterateArgs* (<em>list<Object></em>): The iterate arguments:
134
+ * ** *iValNbrBitsPerSample* (_Integer_): Number of bits per sample
135
+ * ** *iValPtrIdxSample* (_Integer_): Address of the IdxSample variable
136
+ * ** *iValPtrIdxFirstSilentSample* (_Integer_): Address of the IdxFirstSilentSample variable
137
+ * ** *iValPtrSilenceThresholds* (_Integer_): Address of the SilenceThresholds variable
138
+ * ** *iValMinSilenceSamples* (_Integer_): Minimal silence samples
139
+ * ** *iValPtrIdxSilenceSample_Result* (_Integer_): Address of the IdxSilenceSample_Result variable
140
+ * ** *iValBackwardsSearch* (_Boolean_): Do we search backwards ?
141
+ */
142
+ static VALUE silentutils_blockEachRawBuffer(
143
+ VALUE iValYieldArgs,
144
+ VALUE iValIterateArgs) {
145
+ // Read arguments
146
+ VALUE iValInputRawBuffer = rb_ary_entry(iValYieldArgs, 0);
147
+ VALUE iValNbrSamples = rb_ary_entry(iValYieldArgs, 1);
148
+ VALUE iValNbrChannels = rb_ary_entry(iValYieldArgs, 2);
149
+ VALUE iValNbrBitsPerSample = rb_ary_entry(iValIterateArgs, 0);
150
+ VALUE iValPtrIdxSample = rb_ary_entry(iValIterateArgs, 1);
151
+ VALUE iValPtrIdxFirstSilentSample = rb_ary_entry(iValIterateArgs, 2);
152
+ VALUE iValPtrSilenceThresholds = rb_ary_entry(iValIterateArgs, 3);
153
+ VALUE iValMinSilenceSamples = rb_ary_entry(iValIterateArgs, 4);
154
+ VALUE iValPtrIdxSilenceSample_Result = rb_ary_entry(iValIterateArgs, 5);
155
+ VALUE iValBackwardsSearch = rb_ary_entry(iValIterateArgs, 6);
156
+ // Translate parameters in C types
157
+ int iNbrBitsPerSample = FIX2INT(iValNbrBitsPerSample);
158
+ tSampleIndex iNbrSamples = FIX2LONG(iValNbrSamples);
159
+ int iNbrChannels = FIX2INT(iValNbrChannels);
160
+ tSampleIndex* lPtrIdxSample = (tSampleIndex*)FIX2INT(iValPtrIdxSample);
161
+ tSampleIndex* lPtrIdxFirstSilentSample = (tSampleIndex*)FIX2INT(iValPtrIdxFirstSilentSample);
162
+ tThresholdInfo* lPtrSilenceThresholds = (tThresholdInfo*)FIX2INT(iValPtrSilenceThresholds);
163
+ tSampleIndex iMinSilenceSamples = FIX2LONG(iValMinSilenceSamples);
164
+ tSampleIndex* lPtrIdxSilenceSample_Result = (tSampleIndex*)FIX2INT(iValPtrIdxSilenceSample_Result);
165
+
166
+ // Get the real underlying raw buffer
167
+ char* lPtrRawBuffer = RSTRING(iValInputRawBuffer)->ptr;
168
+
169
+ // Set variables to give to the process
170
+ tFindSilentStruct lProcessVariables;
171
+ lProcessVariables.ptrIdxFirstSilentSample = lPtrIdxFirstSilentSample;
172
+ lProcessVariables.ptrSilenceThresholds = lPtrSilenceThresholds;
173
+ lProcessVariables.ptrIdxSilenceSample_Result = lPtrIdxSilenceSample_Result;
174
+ lProcessVariables.minSilenceSamples = iMinSilenceSamples;
175
+ lProcessVariables.nbrChannels = iNbrChannels;
176
+
177
+ // Iterate through the raw buffer
178
+ if (iValBackwardsSearch == Qtrue) {
179
+ commonutils_iterateReverseThroughRawBuffer(
180
+ lPtrRawBuffer,
181
+ iNbrBitsPerSample,
182
+ iNbrChannels,
183
+ iNbrSamples,
184
+ *lPtrIdxSample,
185
+ &silentutils_Reverse_processValue,
186
+ &lProcessVariables
187
+ );
188
+ } else {
189
+ commonutils_iterateThroughRawBuffer(
190
+ lPtrRawBuffer,
191
+ iNbrBitsPerSample,
192
+ iNbrChannels,
193
+ iNbrSamples,
194
+ *lPtrIdxSample,
195
+ &silentutils_processValue,
196
+ &lProcessVariables
197
+ );
198
+ }
199
+
200
+ // If the result was found in this raw buffer, stop parsing everything
201
+ if (*lPtrIdxSilenceSample_Result != -1) {
202
+ rb_iter_break();
203
+ }
204
+
205
+ // Modify the sample index
206
+ if (iValBackwardsSearch == Qtrue) {
207
+ (*lPtrIdxSample) -= iNbrSamples;
208
+ } else {
209
+ (*lPtrIdxSample) += iNbrSamples;
210
+ }
211
+
212
+ return Qnil;
213
+ }
214
+
215
+ /**
216
+ * Get the next silent sample from an input buffer
217
+ *
218
+ * Parameters:
219
+ * * *iSelf* (_FFTUtils_): Self
220
+ * * *iValInputData* (<em>WSK::Model::InputData</em>): The input data
221
+ * * *iValIdxStartSample* (_Integer_): Index of the first sample to search from
222
+ * * *iValSilenceThresholds* (<em>list<[Integer,Integer]></em>): The silence thresholds specifications
223
+ * * *iValMinSilenceSamples* (_Integer_): Number of samples minimum to identify a silence
224
+ * * *iValBackwardsSearch* (_Boolean_): Do we search backwards ?
225
+ * Return:
226
+ * * _Integer_: Index of the next silent sample, or nil if none
227
+ **/
228
+ static VALUE silentutils_getNextSilentInThresholds(
229
+ VALUE iSelf,
230
+ VALUE iValInputData,
231
+ VALUE iValIdxStartSample,
232
+ VALUE iValSilenceThresholds,
233
+ VALUE iValMinSilenceSamples,
234
+ VALUE iValBackwardsSearch) {
235
+ VALUE rValNextSilentSample = Qnil;
236
+
237
+ // Translate parameters in C types
238
+ tSampleIndex iIdxStartSample = FIX2LONG(iValIdxStartSample);
239
+
240
+ // The cursor of samples. Set it to the first sample we start from searching.
241
+ tSampleIndex lIdxSample = iIdxStartSample;
242
+ // Read some info from the Header
243
+ VALUE lValHeader = rb_funcall(iValInputData, rb_intern("Header"), 0);
244
+ VALUE lValNbrBitsPerSample = rb_funcall(lValHeader, rb_intern("NbrBitsPerSample"), 0);
245
+ VALUE lValNbrChannels = rb_funcall(lValHeader, rb_intern("NbrChannels"), 0);
246
+ // Decode the thresholds
247
+ int lNbrChannels = FIX2INT(lValNbrChannels);
248
+ tThresholdInfo lSilenceThresholds[lNbrChannels];
249
+ VALUE lTmpThresholds;
250
+ int lIdxChannel;
251
+ for(lIdxChannel = 0; lIdxChannel < lNbrChannels; ++lIdxChannel) {
252
+ lTmpThresholds = rb_ary_entry(iValSilenceThresholds, lIdxChannel);
253
+ lSilenceThresholds[lIdxChannel].min = FIX2INT(rb_ary_entry(lTmpThresholds, 0));
254
+ lSilenceThresholds[lIdxChannel].max = FIX2INT(rb_ary_entry(lTmpThresholds, 1));
255
+ }
256
+
257
+ // Index of the first silent sample encountered while parsing.
258
+ // Used to assert the minimal duration of the silence. -1 means we don't have one yet.
259
+ tSampleIndex lIdxFirstSilentSample;
260
+ // The result
261
+ tSampleIndex lIdxSilenceSample_Result;
262
+
263
+ // Encapsulate pointers to the data that will be used and modified by the iteration block
264
+ VALUE lValPtrIdxSample = INT2FIX(&lIdxSample);
265
+ VALUE lValPtrIdxFirstSilentSample = INT2FIX(&lIdxFirstSilentSample);
266
+ VALUE lValPtrSilenceThresholds = INT2FIX(&lSilenceThresholds);
267
+ VALUE lValPtrIdxSilenceSample_Result = INT2FIX(&lIdxSilenceSample_Result);
268
+
269
+ lIdxFirstSilentSample = -1;
270
+ lIdxSilenceSample_Result = -1;
271
+
272
+ // Parse the data, using thresholds matching only
273
+ if (iValBackwardsSearch == Qtrue) {
274
+ rb_iterate(
275
+ commonutils_callEachReverseRawBuffer,
276
+ rb_ary_new3(2,
277
+ iValInputData,
278
+ LONG2FIX(lIdxSample)),
279
+ silentutils_blockEachRawBuffer,
280
+ rb_ary_new3(7,
281
+ lValNbrBitsPerSample,
282
+ lValPtrIdxSample,
283
+ lValPtrIdxFirstSilentSample,
284
+ lValPtrSilenceThresholds,
285
+ iValMinSilenceSamples,
286
+ lValPtrIdxSilenceSample_Result,
287
+ iValBackwardsSearch)
288
+ );
289
+ } else {
290
+ rb_iterate(
291
+ commonutils_callEachRawBuffer,
292
+ rb_ary_new3(2,
293
+ iValInputData,
294
+ LONG2FIX(lIdxSample)),
295
+ silentutils_blockEachRawBuffer,
296
+ rb_ary_new3(7,
297
+ lValNbrBitsPerSample,
298
+ lValPtrIdxSample,
299
+ lValPtrIdxFirstSilentSample,
300
+ lValPtrSilenceThresholds,
301
+ iValMinSilenceSamples,
302
+ lValPtrIdxSilenceSample_Result,
303
+ iValBackwardsSearch)
304
+ );
305
+ }
306
+
307
+ if (lIdxSilenceSample_Result != -1) {
308
+ rValNextSilentSample = LONG2FIX(lIdxSilenceSample_Result);
309
+ }
310
+
311
+ return rValNextSilentSample;
312
+ }
313
+
314
+ /**
315
+ * Process a value read from an input buffer for the NextSilentSample function.
316
+ *
317
+ * Parameters:
318
+ * * *iValue* (<em>const tSampleValue</em>): The value being read
319
+ * * *iIdxSample* (<em>const tSampleIndex</em>): Index of this sample
320
+ * * *iIdxChannel* (<em>const int</em>): Channel corresponding to the value being read
321
+ * * *iPtrArgs* (<em>void*</em>): additional arguments. In fact an <em>tFirstSampleBeyondThresholdStruct*</em>.
322
+ * Return:
323
+ * * _int_: The return code:
324
+ * ** 0: Continue iteration
325
+ * ** 1: Break all iterations
326
+ * ** 2: Skip directly to the next sample (don't call us for other channels of this sample)
327
+ */
328
+ int silentutils_sbt_processValue(
329
+ const tSampleValue iValue,
330
+ const tSampleIndex iIdxSample,
331
+ const int iIdxChannel,
332
+ void* iPtrArgs) {
333
+ int rResult = 0;
334
+
335
+ // Interpret parameters
336
+ tFirstSampleBeyondThresholdStruct* lPtrVariables = (tFirstSampleBeyondThresholdStruct*)iPtrArgs;
337
+
338
+ if ((iValue < (lPtrVariables->ptrThresholds)[iIdxChannel].min) ||
339
+ (iValue > (lPtrVariables->ptrThresholds)[iIdxChannel].max)) {
340
+ // This value is not silent
341
+ rResult = 1;
342
+ *(lPtrVariables->ptrIdxSample_Result) = iIdxSample;
343
+ }
344
+
345
+ return rResult;
346
+ }
347
+
348
+ /**
349
+ * Get the sample index that exceeds a threshold in a raw buffer.
350
+ *
351
+ * Parameters:
352
+ * * *iSelf* (_FFTUtils_): Self
353
+ * * *iValRawBuffer* (_String_): The raw buffer
354
+ * * *iValThresholds* (<em>list<[Integer,Integer]></em>): The thresholds
355
+ * * *iValNbrBitsPerSample* (_Integer_): Number of bits per sample
356
+ * * *iValNbrChannels* (_Integer_): Number of channels
357
+ * * *iValNbrSamples* (_Integer_): Number of samples
358
+ * * *iValLastSample* (_Boolean_): Are we looking for the last sample beyond threshold ?
359
+ * Return:
360
+ * * _Integer_: Index of the first sample exceeding thresholds, or nil if none
361
+ */
362
+ static VALUE silentutils_getSampleBeyondThresholds(
363
+ VALUE iSelf,
364
+ VALUE iValRawBuffer,
365
+ VALUE iValThresholds,
366
+ VALUE iValNbrBitsPerSample,
367
+ VALUE iValNbrChannels,
368
+ VALUE iValNbrSamples,
369
+ VALUE iValLastSample) {
370
+ VALUE rValIdxFirstSample = Qnil;
371
+
372
+ // Translate parameters in C types
373
+ tSampleIndex iNbrSamples = FIX2LONG(iValNbrSamples);
374
+ int iNbrChannels = FIX2INT(iValNbrChannels);
375
+ int iNbrBitsPerSample = FIX2INT(iValNbrBitsPerSample);
376
+ // Get the underlying char*
377
+ char* lPtrRawBuffer = RSTRING(iValRawBuffer)->ptr;
378
+ // Decode the thresholds
379
+ tThresholdInfo lThresholds[iNbrChannels];
380
+ VALUE lTmpThresholds;
381
+ int lIdxChannel;
382
+ for(lIdxChannel = 0; lIdxChannel < iNbrChannels; ++lIdxChannel) {
383
+ lTmpThresholds = rb_ary_entry(iValThresholds, lIdxChannel);
384
+ lThresholds[lIdxChannel].min = FIX2INT(rb_ary_entry(lTmpThresholds, 0));
385
+ lThresholds[lIdxChannel].max = FIX2INT(rb_ary_entry(lTmpThresholds, 1));
386
+ }
387
+ // Set variables to give to the process
388
+ tSampleIndex lIdxSampleOut = -1;
389
+ tFirstSampleBeyondThresholdStruct lProcessVariables;
390
+ lProcessVariables.ptrThresholds = &lThresholds[0];
391
+ lProcessVariables.ptrIdxSample_Result = &lIdxSampleOut;
392
+ lProcessVariables.nbrChannels = iNbrChannels;
393
+
394
+ // Parse the buffer
395
+ if (iValLastSample == Qtrue) {
396
+ commonutils_iterateReverseThroughRawBuffer(
397
+ lPtrRawBuffer,
398
+ iNbrBitsPerSample,
399
+ iNbrChannels,
400
+ iNbrSamples,
401
+ iNbrSamples-1,
402
+ &silentutils_sbt_processValue,
403
+ &lProcessVariables
404
+ );
405
+ } else {
406
+ commonutils_iterateThroughRawBuffer(
407
+ lPtrRawBuffer,
408
+ iNbrBitsPerSample,
409
+ iNbrChannels,
410
+ iNbrSamples,
411
+ 0,
412
+ &silentutils_sbt_processValue,
413
+ &lProcessVariables
414
+ );
415
+ }
416
+ if (lIdxSampleOut != -1) {
417
+ rValIdxFirstSample = LONG2FIX(lIdxSampleOut);
418
+ }
419
+
420
+ return rValIdxFirstSample;
421
+ }
422
+
423
+ // Initialize the module
424
+ void Init_SilentUtils() {
425
+ VALUE lWSKModule = rb_define_module("WSK");
426
+ VALUE lSilentUtilsModule = rb_define_module_under(lWSKModule, "SilentUtils");
427
+ VALUE lSilentUtilsClass = rb_define_class_under(lSilentUtilsModule, "SilentUtils", rb_cObject);
428
+
429
+ rb_define_method(lSilentUtilsClass, "getNextSilentInThresholds", silentutils_getNextSilentInThresholds, 5);
430
+ rb_define_method(lSilentUtilsClass, "getSampleBeyondThresholds", silentutils_getSampleBeyondThresholds, 6);
431
+ }
Binary file
Binary file
@@ -0,0 +1,18 @@
1
+ #--
2
+ # Copyright (c) 2009-2010 Muriel Salvan (murielsalvan@users.sourceforge.net)
3
+ # Licensed under the terms specified in LICENSE file. No warranty is provided.
4
+ #++
5
+
6
+ lAdditionalLocalLibs = [
7
+ 'CommonUtils'
8
+ ]
9
+
10
+ require 'mkmf'
11
+ $CFLAGS += ' -Wall '
12
+ lAdditionalLocalLibs.each do |iLibName|
13
+ lLibDir = File.expand_path("#{File.dirname(__FILE__)}/../../../external/#{iLibName}")
14
+ $CFLAGS += " -I#{lLibDir}/include "
15
+ $LDFLAGS += " -L#{lLibDir}/lib -l#{iLibName} "
16
+ end
17
+ create_makefile('SilentUtils')
18
+ system('make')
@@ -0,0 +1,149 @@
1
+
2
+ SHELL = /bin/sh
3
+
4
+ #### Start of system configuration section. ####
5
+
6
+ srcdir = .
7
+ topdir = /usr/lib/ruby/1.8/i386-cygwin
8
+ hdrdir = $(topdir)
9
+ VPATH = $(srcdir):$(topdir):$(hdrdir)
10
+ prefix = $(DESTDIR)/usr
11
+ exec_prefix = $(prefix)
12
+ sitedir = $(prefix)/lib/ruby/site_ruby
13
+ rubylibdir = $(libdir)/ruby/$(ruby_version)
14
+ docdir = $(datarootdir)/doc/$(PACKAGE)
15
+ dvidir = $(docdir)
16
+ datarootdir = $(prefix)/share
17
+ archdir = $(rubylibdir)/$(arch)
18
+ sbindir = $(exec_prefix)/sbin
19
+ psdir = $(docdir)
20
+ localedir = $(datarootdir)/locale
21
+ htmldir = $(docdir)
22
+ datadir = $(prefix)/share
23
+ includedir = $(prefix)/include
24
+ infodir = $(prefix)/share/info
25
+ sysconfdir = $(DESTDIR)/etc
26
+ mandir = $(prefix)/share/man
27
+ libdir = $(exec_prefix)/lib
28
+ sharedstatedir = $(prefix)/com
29
+ oldincludedir = $(DESTDIR)/usr/include
30
+ pdfdir = $(docdir)
31
+ sitearchdir = $(sitelibdir)/$(sitearch)
32
+ bindir = $(exec_prefix)/bin
33
+ localstatedir = $(DESTDIR)/var
34
+ sitelibdir = $(sitedir)/$(ruby_version)
35
+ libexecdir = $(prefix)/sbin
36
+
37
+ CC = gcc
38
+ LIBRUBY = lib$(RUBY_SO_NAME).dll.a
39
+ LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
40
+ LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME)
41
+ LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static
42
+
43
+ RUBY_EXTCONF_H =
44
+ CFLAGS = -g -O2 -Wall -I/cygdrive/f/RR/Source/waveswissknife/svn/waveswissknife/external/CommonUtils/include
45
+ INCFLAGS = -I. -I$(topdir) -I$(hdrdir) -I$(srcdir)
46
+ CPPFLAGS =
47
+ CXXFLAGS = $(CFLAGS)
48
+ DLDFLAGS = -L. -L/usr/local/lib -lgmp -L/cygdrive/f/RR/Source/waveswissknife/svn/waveswissknife/external/CommonUtils/lib -lCommonUtils -Wl,--enable-auto-image-base,--enable-auto-import,--export-all
49
+ LDSHARED = gcc -shared -s
50
+ AR = ar
51
+ EXEEXT = .exe
52
+
53
+ RUBY_INSTALL_NAME = ruby
54
+ RUBY_SO_NAME = ruby
55
+ arch = i386-cygwin
56
+ sitearch = i386-cygwin
57
+ ruby_version = 1.8
58
+ ruby = /usr/bin/ruby
59
+ RUBY = $(ruby)
60
+ RM = rm -f
61
+ MAKEDIRS = mkdir -p
62
+ INSTALL = /usr/bin/install -c
63
+ INSTALL_PROG = $(INSTALL) -m 0755
64
+ INSTALL_DATA = $(INSTALL) -m 644
65
+ COPY = cp
66
+
67
+ #### End of system configuration section. ####
68
+
69
+ preload =
70
+
71
+ libpath = . $(libdir)
72
+ LIBPATH = -L"." -L"$(libdir)"
73
+ DEFFILE =
74
+
75
+ CLEANFILES = mkmf.log
76
+ DISTCLEANFILES =
77
+
78
+ extout =
79
+ extout_prefix =
80
+ target_prefix =
81
+ LOCAL_LIBS =
82
+ LIBS = $(LIBRUBYARG_SHARED) -ldl -lcrypt
83
+ SRCS = VolumeUtils.c
84
+ OBJS = VolumeUtils.o
85
+ TARGET = VolumeUtils
86
+ DLLIB = $(TARGET).so
87
+ EXTSTATIC =
88
+ STATIC_LIB =
89
+
90
+ RUBYCOMMONDIR = $(sitedir)$(target_prefix)
91
+ RUBYLIBDIR = $(sitelibdir)$(target_prefix)
92
+ RUBYARCHDIR = $(sitearchdir)$(target_prefix)
93
+
94
+ TARGET_SO = $(DLLIB)
95
+ CLEANLIBS = $(TARGET).so $(TARGET).il? $(TARGET).tds $(TARGET).map
96
+ CLEANOBJS = *.o *.a *.s[ol] *.pdb *.exp *.bak
97
+
98
+ all: $(DLLIB)
99
+ static: $(STATIC_LIB)
100
+
101
+ clean:
102
+ @-$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES)
103
+
104
+ distclean: clean
105
+ @-$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log
106
+ @-$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES)
107
+
108
+ realclean: distclean
109
+ install: install-so install-rb
110
+
111
+ install-so: $(RUBYARCHDIR)
112
+ install-so: $(RUBYARCHDIR)/$(DLLIB)
113
+ $(RUBYARCHDIR)/$(DLLIB): $(DLLIB)
114
+ $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR)
115
+ install-rb: pre-install-rb install-rb-default
116
+ install-rb-default: pre-install-rb-default
117
+ pre-install-rb: Makefile
118
+ pre-install-rb-default: Makefile
119
+ $(RUBYARCHDIR):
120
+ $(MAKEDIRS) $@
121
+
122
+ site-install: site-install-so site-install-rb
123
+ site-install-so: install-so
124
+ site-install-rb: install-rb
125
+
126
+ .SUFFIXES: .c .m .cc .cxx .cpp .C .o
127
+
128
+ .cc.o:
129
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
130
+
131
+ .cxx.o:
132
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
133
+
134
+ .cpp.o:
135
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
136
+
137
+ .C.o:
138
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
139
+
140
+ .c.o:
141
+ $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) -c $<
142
+
143
+ $(DLLIB): $(OBJS)
144
+ @-$(RM) $@
145
+ $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS)
146
+
147
+
148
+
149
+ $(OBJS): ruby.h defines.h