sbBaseMediacoreMultibandEqualizer.cpp
Go to the documentation of this file.
1 /*
2 //
3 // BEGIN SONGBIRD GPL
4 //
5 // This file is part of the Songbird web player.
6 //
7 // Copyright(c) 2005-2009 POTI, Inc.
8 // http://songbirdnest.com
9 //
10 // This file may be licensed under the terms of of the
11 // GNU General Public License Version 2 (the "GPL").
12 //
13 // Software distributed under the License is distributed
14 // on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
15 // express or implied. See the GPL for the specific language
16 // governing rights and limitations.
17 //
18 // You should have received a copy of the GPL along with this
19 // program. If not, go to http://www.gnu.org/licenses/gpl.html
20 // or write to the Free Software Foundation, Inc.,
21 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22 //
23 // END SONGBIRD GPL
24 //
25 */
26 
32 
33 #include <nsIMutableArray.h>
34 #include <nsISimpleEnumerator.h>
35 #include <nsIPrefBranch.h>
36 #include <nsISupportsPrimitives.h>
37 #include <nsIPrefLocalizedString.h>
38 
39 #include <nsComponentManagerUtils.h>
40 #include <nsAutoPtr.h>
41 
42 #include <prlog.h>
43 #include <prprf.h>
44 
47 #include <ngIEqualizerPresetProvider.h>
48 #include <ngIEqualizerPreset.h>
49 
54 #ifdef PR_LOGGING
55 static PRLogModuleInfo * BaseMediacoreMultibandEqualizer() {
56  static PRLogModuleInfo* gBaseMediacoreMultibandEqualizer =
57  PR_NewLogModule("sbBaseMediacoreMultibandEqualizer");
58  return gBaseMediacoreMultibandEqualizer;
59 }
60 
61 #define TRACE(args) PR_LOG(BaseMediacoreMultibandEqualizer() , PR_LOG_DEBUG, args)
62 #define LOG(args) PR_LOG(BaseMediacoreMultibandEqualizer() , PR_LOG_WARN, args)
63 #else
64 #define TRACE(args) /* nothing */
65 #define LOG(args) /* nothing */
66 #endif
67 
68 double
69 SB_ClampDouble(double aGain, double aMin, double aMax)
70 {
71  double gain = aGain;
72 
73  if(aGain > aMax) {
74  gain = aMax;
75  }
76  else if(aGain < aMin) {
77  gain = aMin;
78  }
79 
80  return gain;
81 }
82 
83 void
84 SB_ConvertFloatEqGainToJSStringValue(double aGain, nsCString &aGainStr)
85 {
86  char gain[64] = {0};
87  PR_snprintf(gain, 64, "%lg", SB_ClampDouble(aGain, -1.0, 1.0));
88 
89  // We have to replace the decimal point character with '.' so that
90  // parseFloat in JS still understands that this number is a floating point
91  // number. The JS Standard dictates that parseFloat _ONLY_ supports '.' as
92  // it's decimal point character.
93  // Fix for issue 329: Account for the minus sign
94  if(aGain >= 0)
95  gain[1] = '.';
96  else
97  gain[2] = '.';
98 
99  aGainStr.Assign(gain);
100 
101  return;
102 }
103 
104 #define SB_EQ_PRESET_PREF "songbird.eq.currentPreset"
105 
106 /*static*/ const nsEmbedString
107 sbBaseMediacoreMultibandEqualizer::NO_PRESET = NS_LITERAL_STRING("");
108 
109 /*static*/ const PRUint32
111 
112 /*static*/ const PRUint32
114  {32, 64, 125, 250, 500, 1000, 2000, 4000, 8000, 16000};
115 
118 
120 : mMonitor(nsnull)
121 , mEqEnabled(PR_FALSE)
122 , mCurrentPresetName(NO_PRESET)
123 , mSettingPreset(false)
124 , mPrefs(nsnull)
125 , mPresets(nsnull)
126 {
127  TRACE(("sbBaseMediacoreMultibandEqualizer[0x%x] - Created", this));
128 }
129 
131 {
132  TRACE(("sbBaseMediacoreMultibandEqualizer[0x%x] - Destroyed", this));
133 
134  if(mMonitor) {
135  nsAutoMonitor::DestroyMonitor(mMonitor);
136  }
137 
138  if (mBands.IsInitialized()) {
139  mBands.Clear();
140  }
141 }
142 
143 nsresult
145 {
146  TRACE(("sbBaseMediacoreMultibandEqualizer[0x%x] - EnsureBandIsCached", this));
147 
148  NS_ENSURE_TRUE(mMonitor, NS_ERROR_NOT_INITIALIZED);
149  NS_ENSURE_TRUE(mBands.IsInitialized(), NS_ERROR_NOT_INITIALIZED);
150 
151  PRUint32 bandIndex = 0;
152  nsresult rv = aBand->GetIndex(&bandIndex);
153  NS_ENSURE_SUCCESS(rv, rv);
154 
155  PRBool success = mBands.Get(bandIndex, nsnull);
156  if(!success) {
157  success = mBands.Put(bandIndex, aBand);
158  NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
159  }
160  else {
161  PRUint32 bandFrequency = 0;
162  rv = aBand->GetFrequency(&bandFrequency);
163  NS_ENSURE_SUCCESS(rv, rv);
164 
165  PRFloat64 bandGain = 0;
166  rv = aBand->GetGain(&bandGain);
167  NS_ENSURE_SUCCESS(rv, rv);
168 
169  nsCOMPtr<sbIMediacoreEqualizerBand> band;
170  mBands.Get(bandIndex, getter_AddRefs(band));
171 
172  rv = band->SetFrequency(bandFrequency);
173  NS_ENSURE_SUCCESS(rv, rv);
174 
175  rv = band->SetGain(bandGain);
176  NS_ENSURE_SUCCESS(rv, rv);
177  }
178 
179  return NS_OK;
180 }
181 
182 nsresult
184 {
185  TRACE(("sbBaseMediacoreMultibandEqualizer[0x%x] - InitBaseMediacoreMultibandEqualizer", this));
186 
187  mMonitor = nsAutoMonitor::NewMonitor("sbBaseMediacoreMultibandEqualizer::mMonitor");
188  NS_ENSURE_TRUE(mMonitor, NS_ERROR_OUT_OF_MEMORY);
189 
190  PRBool success = mBands.Init(10);
191  NS_ENSURE_TRUE(success, NS_ERROR_OUT_OF_MEMORY);
192 
194  NS_ENSURE_SUCCESS(rv, rv);
195 
196  mPrefs = do_ProxiedGetService("@mozilla.org/preferences-service;1", &rv);
197  NS_ENSURE_SUCCESS (rv, rv);
198  nsCOMPtr<nsIPrefLocalizedString> data;
199  rv = mPrefs->GetComplexValue(SB_EQ_PRESET_PREF, NS_GET_IID(nsIPrefLocalizedString), getter_AddRefs(data));
200  NS_ENSURE_SUCCESS(rv, rv);
201  rv = data->GetData(getter_Copies(mCurrentPresetName));
202  NS_ENSURE_SUCCESS(rv, rv);
203 
204  mPresets = do_ProxiedGetService("@getnightingale.com/equalizer-presets/manager;1", &rv);
205  NS_ENSURE_SUCCESS(rv, rv);
206 
207  PRBool hasPreset;
208  rv = mPresets->HasPresetNamed(mCurrentPresetName, &hasPreset);
209  NS_ENSURE_SUCCESS(rv, rv);
210  if(!hasPreset) {
211  rv = this->SetCurrentPresetName(NO_PRESET);
212  NS_ENSURE_SUCCESS(rv, rv);
213  }
214 
215  return rv;
216 }
217 
218 /*virtual*/ nsresult
220 {
221  /*
222  * Here is where you would initialize any elements
223  * that are required for your multiband equalizer.
224  */
225 
226  return NS_ERROR_NOT_IMPLEMENTED;
227 }
228 
229 /*virtual*/ nsresult
231 {
232  /*
233  * Here is where you would enable / disable the equalizer
234  * based on the value of aEqEnabled.
235  */
236 
237  return NS_ERROR_NOT_IMPLEMENTED;
238 }
239 
240 /*virtual*/ nsresult
242 {
243  /*
244  * Here is where you would return the number of bands supported
245  * by your equalizer.
246  */
247 
248  return NS_ERROR_NOT_IMPLEMENTED;
249 }
250 
251 /*virtual*/ nsresult
254 {
255  /*
256  * Here is where you would fill out the current values for a band.
257  * The aBand object just needs to be initialized in this case
258  * by calling Init() with the correct frequency band and gain values.
259  */
260 
261  return NS_ERROR_NOT_IMPLEMENTED;
262 }
263 
264 /*virtual*/ nsresult
266 {
267  /*
268  * Here is where you would apply new values for a band.
269  * The aBand object will contain the frequency band and gain value
270  */
271 
272  return NS_ERROR_NOT_IMPLEMENTED;
273 }
274 
275 //
276 // sbIMediacoreMultibandEqualizer
277 //
278 /* attribute boolean eqEnabled; */
279 NS_IMETHODIMP
280 sbBaseMediacoreMultibandEqualizer::GetEqEnabled(PRBool *aEqEnabled)
281 {
282  TRACE(("sbBaseMediacoreMultibandEqualizer[0x%x] - GetEqEnabled", this));
283 
284  NS_ENSURE_TRUE(mMonitor, NS_ERROR_NOT_INITIALIZED);
285  NS_ENSURE_ARG_POINTER(aEqEnabled);
286 
287  nsAutoMonitor mon(mMonitor);
288  *aEqEnabled = mEqEnabled;
289 
290  return NS_OK;
291 }
292 
293 NS_IMETHODIMP
294 sbBaseMediacoreMultibandEqualizer::SetEqEnabled(PRBool aEqEnabled)
295 {
296  TRACE(("sbBaseMediacoreMultibandEqualizer[0x%x] - SetEqEnabled", this));
297 
298  NS_ENSURE_TRUE(mMonitor, NS_ERROR_NOT_INITIALIZED);
299 
300  nsAutoMonitor mon(mMonitor);
301 
302  nsresult rv = OnSetEqEnabled(aEqEnabled);
303  NS_ENSURE_SUCCESS(rv, rv);
304 
305  mEqEnabled = aEqEnabled;
306 
307  return NS_OK;
308 }
309 
310 template<class T>
311 PLDHashOperator AppendElementToArray(T* aData, void* aArray)
312 {
313  nsIMutableArray *array = (nsIMutableArray*)aArray;
314  nsresult rv;
315  nsCOMPtr<nsISupports> supports = do_QueryInterface(aData, &rv);
316  NS_ENSURE_SUCCESS(rv, PL_DHASH_STOP);
317 
318  rv = array->AppendElement(aData, false);
319  NS_ENSURE_SUCCESS(rv, PL_DHASH_STOP);
320 
321  return PL_DHASH_NEXT;
322 }
323 
324 template<class T>
325 PLDHashOperator
326 sbBaseMediacoreMultibandEqualizer::EnumerateIntoArrayUint32Key(
327  const PRUint32 &aKey,
328  T* aData,
329  void* aArray)
330 {
331  TRACE(("sbBaseMediacoreMultibandEqualizer[0x%x] - EnumerateIntoArray (PRUint32)"));
332  return AppendElementToArray(aData, aArray);
333 }
334 
335 /* attribute nsISimpleEnumerator bands; */
336 NS_IMETHODIMP
337 sbBaseMediacoreMultibandEqualizer::GetBands(nsISimpleEnumerator * *aBands)
338 {
339  TRACE(("sbBaseMediacoreMultibandEqualizer[0x%x] - GetBands", this));
340 
341  NS_ENSURE_TRUE(mBands.IsInitialized(), NS_ERROR_NOT_INITIALIZED);
342 
343  nsresult rv = NS_ERROR_UNEXPECTED;
344 
345  nsAutoMonitor mon(mMonitor);
346 
347  nsCOMPtr<nsIMutableArray> mutableArray =
348  do_CreateInstance("@songbirdnest.com/moz/xpcom/threadsafe-array;1", &rv);
349  NS_ENSURE_SUCCESS(rv, rv);
350 
351  mBands.EnumerateRead(
352  sbBaseMediacoreMultibandEqualizer::EnumerateIntoArrayUint32Key,
353  mutableArray.get());
354 
355  mon.Exit();
356 
357  rv = mutableArray->Enumerate(aBands);
358  NS_ENSURE_SUCCESS(rv, rv);
359 
360  return NS_OK;
361 }
362 
363 NS_IMETHODIMP
364 sbBaseMediacoreMultibandEqualizer::SetBands(nsISimpleEnumerator *aBands)
365 {
366  NS_ENSURE_ARG_POINTER(aBands);
367 
368  nsresult rv = NS_ERROR_UNEXPECTED;
369  PRBool hasMore = PR_FALSE;
370 
371  nsCOMPtr<nsISupports> element;
372  while(NS_SUCCEEDED(aBands->HasMoreElements(&hasMore)) &&
373  hasMore &&
374  NS_SUCCEEDED(aBands->GetNext(getter_AddRefs(element)))) {
375 
376  nsCOMPtr<sbIMediacoreEqualizerBand> band =
377  do_QueryInterface(element, &rv);
378  NS_ENSURE_SUCCESS(rv, rv);
379 
380  rv = SetBand(band);
381  NS_ENSURE_SUCCESS(rv, rv);
382  }
383 
384  if(!mSettingPreset) {
385  rv = this->SetCurrentPresetName(NO_PRESET);
386  NS_ENSURE_SUCCESS(rv, rv);
387  }
388 
389  return NS_OK;
390 }
391 
392 /* readonly attribute unsigned long bandCount; */
393 NS_IMETHODIMP
394 sbBaseMediacoreMultibandEqualizer::GetBandCount(PRUint32 *aBandCount)
395 {
396  TRACE(("sbBaseMediacoreMultibandEqualizer[0x%x] - GetBandCount", this));
397 
398  NS_ENSURE_TRUE(mMonitor, NS_ERROR_NOT_INITIALIZED);
399  NS_ENSURE_ARG_POINTER(aBandCount);
400 
401  nsAutoMonitor mon(mMonitor);
402 
403  nsresult rv = OnGetBandCount(aBandCount);
404  NS_ENSURE_SUCCESS(rv, rv);
405 
406  return NS_OK;
407 }
408 
409 /* attribute AString currentPresetName; */
410 NS_IMETHODIMP
411 sbBaseMediacoreMultibandEqualizer::GetCurrentPresetName(nsAString& aCurrentPresetName)
412 {
413  TRACE(("sbBaseMediacoreMultibandEqualizer[0x%x] - GetCurrentPresetName", this));
414 
415  NS_ENSURE_TRUE(mMonitor, NS_ERROR_NOT_INITIALIZED);
416 
417  nsAutoMonitor mon(mMonitor);
418 
419  aCurrentPresetName = mCurrentPresetName;
420  return NS_OK;
421 }
422 
423 NS_IMETHODIMP
424 sbBaseMediacoreMultibandEqualizer::SetCurrentPresetName(const nsAString& aCurrentPresetName)
425 {
426  TRACE(("sbBaseMediacoreMultibandEqualizer[0x%x] - SetCurrentPresetName", this));
427 
428  nsresult rv = NS_OK;
429 
430  NS_ENSURE_TRUE(mPrefs, NS_ERROR_NOT_INITIALIZED);
431  NS_ENSURE_TRUE(mPresets, NS_ERROR_NOT_INITIALIZED);
432 
433  mSettingPreset = true;
434 
435  /* Not sure if this is needed and even works (->GetBands instatiates its own mon)
436  NS_ENSURE_TRUE(mMonitor, NS_ERROR_NOT_INITIALIZED);
437 
438  nsAutoMonitor mon(mMonitor);*/
439 
440  if(mCurrentPresetName != aCurrentPresetName)
441  {
442  mCurrentPresetName = aCurrentPresetName;
443 
444  LOG(("Updating currentPreset pref"));
445  nsCOMPtr<nsIPrefLocalizedString> data (do_CreateInstance("@mozilla.org/pref-localizedstring;1", &rv));
446  NS_ENSURE_SUCCESS(rv, rv);
447  rv = data->SetDataWithLength(aCurrentPresetName.Length(), aCurrentPresetName.BeginReading());
448  NS_ENSURE_SUCCESS(rv, rv);
449  rv = mPrefs->SetComplexValue(SB_EQ_PRESET_PREF, NS_GET_IID(nsIPrefLocalizedString), data);
450  NS_ENSURE_SUCCESS(rv, rv);
451  }
452 
453  if(aCurrentPresetName != NO_PRESET) {
454  // Apply the preset
455  PRBool presetExists;
456  rv = mPresets->HasPresetNamed(aCurrentPresetName, &presetExists);
457  NS_ENSURE_SUCCESS(rv, rv);
458  LOG(("Preset exists: %i", presetExists));
459 
460  if(presetExists)
461  {
462  nsCOMPtr<nsISimpleEnumerator> bands = nsnull;
463  rv = this->GetBands(getter_AddRefs(bands));
464  NS_ENSURE_SUCCESS(rv, rv);
465  NS_ENSURE_TRUE(bands, NS_ERROR_UNEXPECTED);
466 
467  nsCOMPtr<ngIEqualizerPreset> preset = nsnull;
468  rv = mPresets->GetPresetByName(aCurrentPresetName, getter_AddRefs(preset));
469  NS_ENSURE_SUCCESS(rv, rv);
470  NS_ENSURE_TRUE(preset, NS_ERROR_UNEXPECTED);
471  nsCOMPtr<nsIArray> valuesArray = nsnull;
472  rv = preset->GetValues(getter_AddRefs(valuesArray));
473  NS_ENSURE_SUCCESS(rv, rv);
474  NS_ENSURE_TRUE(valuesArray, NS_ERROR_UNEXPECTED);
475  LOG(("Got the two enumerators"));
476  PRBool hasMoreBands = PR_FALSE;
477 
478  nsCOMPtr<nsISupports> element = nsnull;
479  nsCOMPtr<nsISupports> value = nsnull;
480 
481  while(NS_SUCCEEDED(bands->HasMoreElements(&hasMoreBands)) &&
482  hasMoreBands &&
483  NS_SUCCEEDED(bands->GetNext(getter_AddRefs(element)))) {
484  LOG(("Getting the info for a band"));
485  nsCOMPtr<sbIMediacoreEqualizerBand> band(do_QueryInterface(element, &rv));
486  NS_ENSURE_SUCCESS(rv, rv);
487 
488  PRUint32 index;
489  rv = band->GetIndex(&index);
490  NS_ENSURE_SUCCESS(rv, rv);
491 
492  nsCOMPtr<nsISupportsDouble> gain;
493  rv = valuesArray->QueryElementAt(index, NS_GET_IID(nsISupportsDouble), getter_AddRefs(gain));
494  NS_ENSURE_SUCCESS(rv, rv);
495  LOG(("Extracting the GAIN value"));
496  PRFloat64 gainValue;
497  rv = gain->GetData(&gainValue);
498  NS_ENSURE_SUCCESS(rv, rv);
499  LOG(("Applying the GAIN value"));
500  rv = band->SetGain(gainValue);
501  NS_ENSURE_SUCCESS(rv, rv);
502 
503  LOG(("Applying the band"));
504  rv = this->SetBand(band);
505  NS_ENSURE_SUCCESS(rv, rv);
506 
507  // This should possibly be done in front-end code for the separation.
508  LOG(("Applying new GAIN value to the band slider"));
509  nsEmbedCString gainString;
510  SB_ConvertFloatEqGainToJSStringValue(gainValue, gainString);
511  nsCOMPtr<nsISupportsString> supportsGainString(do_CreateInstance("@mozilla.org/supports-string;1", &rv));
512  NS_ENSURE_SUCCESS(rv, rv);
513  rv = supportsGainString->SetData(NS_ConvertUTF8toUTF16(gainString));
514  NS_ENSURE_SUCCESS(rv, rv);
515 
516  nsEmbedCString bandPrefName(NS_LITERAL_CSTRING("songbird.eq.band."));
517  bandPrefName.AppendInt(index);
518 
519  LOG(("Band: %i, Gain: %s", index, gainString.get()));
520  rv = mPrefs->SetComplexValue(bandPrefName.get(), NS_GET_IID(nsISupportsString), supportsGainString);
521  NS_ENSURE_SUCCESS(rv, rv);
522  }
523  }
524  else {
525  // Preset doesn't exist, set to no preset.
526  return this->SetCurrentPresetName(NO_PRESET);
527  }
528  }
529 
530  mSettingPreset = false;
531 
532  return rv;
533 }
534 
535 /* sbIMediacoreEqualizerBand getBand (in unsigned long aBandIndex); */
536 NS_IMETHODIMP
537 sbBaseMediacoreMultibandEqualizer::GetBand(PRUint32 aBandIndex, sbIMediacoreEqualizerBand **_retval)
538 {
539  TRACE(("sbBaseMediacoreMultibandEqualizer[0x%x] - GetBand", this));
540 
541  NS_ENSURE_TRUE(mMonitor, NS_ERROR_NOT_INITIALIZED);
542  NS_ENSURE_TRUE(mBands.IsInitialized(), NS_ERROR_NOT_INITIALIZED);
543  NS_ENSURE_ARG_POINTER(_retval);
544  nsresult rv = NS_ERROR_UNEXPECTED;
545 
546  nsCOMPtr<sbIMediacoreEqualizerBand> band;
547 
548  nsAutoMonitor mon(mMonitor);
549 
550  if(!mBands.Get(aBandIndex, getter_AddRefs(band))) {
551  nsRefPtr<sbMediacoreEqualizerBand> newBand;
552  NS_NEWXPCOM(newBand, sbMediacoreEqualizerBand);
553  NS_ENSURE_TRUE(newBand, NS_ERROR_OUT_OF_MEMORY);
554 
555  rv = OnGetBand(aBandIndex, newBand);
556  NS_ENSURE_SUCCESS(rv, rv);
557 
558  rv = EnsureBandIsCached(newBand);
559  NS_ENSURE_SUCCESS(rv, rv);
560 
561  NS_ADDREF(*_retval = newBand);
562 
563  return NS_OK;
564  }
565 
566  band.forget(_retval);
567 
568  return NS_OK;
569 }
570 
571 /* void setBand (in sbIMediacoreEqualizerBand aBand); */
572 NS_IMETHODIMP
573 sbBaseMediacoreMultibandEqualizer::SetBand(sbIMediacoreEqualizerBand *aBand)
574 {
575  TRACE(("sbBaseMediacoreMultibandEqualizer[0x%x] - SetBand", this));
576 
577  NS_ENSURE_TRUE(mMonitor, NS_ERROR_NOT_INITIALIZED);
578  nsresult rv = NS_ERROR_UNEXPECTED;
579 
580  nsAutoMonitor mon(mMonitor);
581 
582  if(mEqEnabled) {
583  rv = OnSetBand(aBand);
584  NS_ENSURE_SUCCESS(rv, rv);
585  }
586 
587  if(!mSettingPreset) {
588  rv = this->SetCurrentPresetName(NO_PRESET);
589  NS_ENSURE_SUCCESS(rv, rv);
590  }
591 
592  rv = EnsureBandIsCached(aBand);
593  NS_ENSURE_SUCCESS(rv, rv);
594 
595  return NS_OK;
596 }
virtual nsresult OnSetBand(sbIMediacoreEqualizerBand *aBand)
static const PRUint32 EQUALIZER_BANDS_10[10]
Suggested bands for a 10 band equalizer.
return NS_OK
Songbird Mediacore Base Multiband Equalizer Definition.
#define LOG(args)
inArray array
const nsIPrefLocalizedString
NS_IMPL_THREADSAFE_ISUPPORTS1(sbBaseMediacoreMultibandEqualizer, sbIMediacoreMultibandEqualizer) sbBaseMediacoreMultibandEqualizer
void SB_ConvertFloatEqGainToJSStringValue(double aGain, nsCString &aGainStr)
static const nsEmbedString NO_PRESET
Value of currentPResetName if the equalizer is not set by a preset. This value is set as empty string...
static const PRUint32 EQUALIZER_BAND_COUNT_DEFAULT
Suggested default band count for the equalizer. This value is defined as 10.
Songbird Mediacore Equalizer Band Definition.
#define TRACE(args)
const sbCreateProxiedComponent do_ProxiedGetService(const nsCID &aCID, nsresult *error=0)
virtual nsresult OnGetBandCount(PRUint32 *aBandCount)
this _document false
Definition: FeedWriter.js:1085
attribute nsISimpleEnumerator bands
Enumerator containing all available bands.
double SB_ClampDouble(double aGain, double aMin, double aMax)
virtual nsresult OnGetBand(PRUint32 aBandIndex, sbIMediacoreEqualizerBand *aBand)
PLDHashOperator AppendElementToArray(T *aData, void *aArray)
StringArrayEnumerator prototype hasMore
countRef value
Definition: FeedWriter.js:1423
virtual nsresult OnSetEqEnabled(PRBool aEqEnabled)
const nsISupportsString
observe data
Definition: FeedWriter.js:1329
_updateTextAndScrollDataForFrame aData
nsresult EnsureBandIsCached(sbIMediacoreEqualizerBand *aBand)