Bug 1173016 - Properly refcount the inner PeriodicWave object. r=karlt

This commit is contained in:
Paul Adenot 2015-07-06 13:58:33 +02:00
parent 5484d0c363
commit b1cd8acc4d
2 changed files with 42 additions and 33 deletions

View File

@ -40,48 +40,58 @@ using mozilla::dom::OscillatorType;
namespace WebCore {
PeriodicWave* PeriodicWave::create(float sampleRate,
const float* real,
const float* imag,
size_t numberOfComponents)
already_AddRefed<PeriodicWave>
PeriodicWave::create(float sampleRate,
const float* real,
const float* imag,
size_t numberOfComponents)
{
bool isGood = real && imag && numberOfComponents > 0 &&
numberOfComponents <= PeriodicWaveSize;
MOZ_ASSERT(isGood);
if (isGood) {
PeriodicWave* periodicWave = new PeriodicWave(sampleRate);
nsRefPtr<PeriodicWave> periodicWave =
new PeriodicWave(sampleRate);
periodicWave->createBandLimitedTables(real, imag, numberOfComponents);
return periodicWave;
return periodicWave.forget();
}
return 0;
return nullptr;
}
PeriodicWave* PeriodicWave::createSine(float sampleRate)
already_AddRefed<PeriodicWave>
PeriodicWave::createSine(float sampleRate)
{
PeriodicWave* periodicWave = new PeriodicWave(sampleRate);
periodicWave->generateBasicWaveform(OscillatorType::Sine);
return periodicWave;
nsRefPtr<PeriodicWave> periodicWave =
new PeriodicWave(sampleRate);
periodicWave->generateBasicWaveform(OscillatorType::Sine);
return periodicWave.forget();
}
PeriodicWave* PeriodicWave::createSquare(float sampleRate)
already_AddRefed<PeriodicWave>
PeriodicWave::createSquare(float sampleRate)
{
PeriodicWave* periodicWave = new PeriodicWave(sampleRate);
periodicWave->generateBasicWaveform(OscillatorType::Square);
return periodicWave;
nsRefPtr<PeriodicWave> periodicWave =
new PeriodicWave(sampleRate);
periodicWave->generateBasicWaveform(OscillatorType::Square);
return periodicWave.forget();
}
PeriodicWave* PeriodicWave::createSawtooth(float sampleRate)
already_AddRefed<PeriodicWave>
PeriodicWave::createSawtooth(float sampleRate)
{
PeriodicWave* periodicWave = new PeriodicWave(sampleRate);
periodicWave->generateBasicWaveform(OscillatorType::Sawtooth);
return periodicWave;
nsRefPtr<PeriodicWave> periodicWave =
new PeriodicWave(sampleRate);
periodicWave->generateBasicWaveform(OscillatorType::Sawtooth);
return periodicWave.forget();
}
PeriodicWave* PeriodicWave::createTriangle(float sampleRate)
already_AddRefed<PeriodicWave>
PeriodicWave::createTriangle(float sampleRate)
{
PeriodicWave* periodicWave = new PeriodicWave(sampleRate);
periodicWave->generateBasicWaveform(OscillatorType::Triangle);
return periodicWave;
nsRefPtr<PeriodicWave> periodicWave =
new PeriodicWave(sampleRate);
periodicWave->generateBasicWaveform(OscillatorType::Triangle);
return periodicWave.forget();
}
PeriodicWave::PeriodicWave(float sampleRate)

View File

@ -42,20 +42,19 @@ typedef nsTArray<float> AudioFloatArray;
class PeriodicWave {
public:
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(WebCore::PeriodicWave);
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(PeriodicWave);
static PeriodicWave* createSine(float sampleRate);
static PeriodicWave* createSquare(float sampleRate);
static PeriodicWave* createSawtooth(float sampleRate);
static PeriodicWave* createTriangle(float sampleRate);
static already_AddRefed<PeriodicWave> createSine(float sampleRate);
static already_AddRefed<PeriodicWave> createSquare(float sampleRate);
static already_AddRefed<PeriodicWave> createSawtooth(float sampleRate);
static already_AddRefed<PeriodicWave> createTriangle(float sampleRate);
// Creates an arbitrary periodic wave given the frequency components
// (Fourier coefficients).
static PeriodicWave* create(float sampleRate,
const float* real,
const float* imag,
size_t numberOfComponents);
static already_AddRefed<PeriodicWave> create(float sampleRate,
const float* real,
const float* imag,
size_t numberOfComponents);
// Returns pointers to the lower and higher wave data for the pitch range
// containing the given fundamental frequency. These two tables are in