mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-06 09:05:45 +00:00
6578a0d181
Also change WebAudioUtils from a class to a namespace, so that constant variables can be defined inline with internal linkage. static class variables cannot be defined inline because this violates the one definition rule, even though some compilers may not notice. --HG-- extra : transplant_source : %9F4%2Ct%BA%D2%BD%8A1Xev%92%C0%A1%AD%88IH%BF
111 lines
3.9 KiB
C++
111 lines
3.9 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "WebAudioUtils.h"
|
|
#include "AudioNodeStream.h"
|
|
#include "AudioParamTimeline.h"
|
|
#include "blink/HRTFDatabaseLoader.h"
|
|
#include "speex/speex_resampler.h"
|
|
|
|
namespace mozilla {
|
|
|
|
namespace dom {
|
|
|
|
struct ConvertTimeToTickHelper
|
|
{
|
|
AudioNodeStream* mSourceStream;
|
|
AudioNodeStream* mDestinationStream;
|
|
|
|
static int64_t Convert(double aTime, void* aClosure)
|
|
{
|
|
ConvertTimeToTickHelper* This = static_cast<ConvertTimeToTickHelper*> (aClosure);
|
|
MOZ_ASSERT(This->mSourceStream->SampleRate() == This->mDestinationStream->SampleRate());
|
|
return This->mSourceStream->
|
|
TicksFromDestinationTime(This->mDestinationStream, aTime);
|
|
}
|
|
};
|
|
|
|
void
|
|
WebAudioUtils::ConvertAudioParamToTicks(AudioParamTimeline& aParam,
|
|
AudioNodeStream* aSource,
|
|
AudioNodeStream* aDest)
|
|
{
|
|
MOZ_ASSERT(!aSource || aSource->SampleRate() == aDest->SampleRate());
|
|
ConvertTimeToTickHelper ctth;
|
|
ctth.mSourceStream = aSource;
|
|
ctth.mDestinationStream = aDest;
|
|
aParam.ConvertEventTimesToTicks(ConvertTimeToTickHelper::Convert, &ctth, aDest->SampleRate());
|
|
}
|
|
|
|
void
|
|
WebAudioUtils::Shutdown()
|
|
{
|
|
WebCore::HRTFDatabaseLoader::shutdown();
|
|
}
|
|
|
|
int
|
|
WebAudioUtils::SpeexResamplerProcess(SpeexResamplerState* aResampler,
|
|
uint32_t aChannel,
|
|
const float* aIn, uint32_t* aInLen,
|
|
float* aOut, uint32_t* aOutLen)
|
|
{
|
|
#ifdef MOZ_SAMPLE_TYPE_S16
|
|
nsAutoTArray<AudioDataValue, WEBAUDIO_BLOCK_SIZE*4> tmp1;
|
|
nsAutoTArray<AudioDataValue, WEBAUDIO_BLOCK_SIZE*4> tmp2;
|
|
tmp1.SetLength(*aInLen);
|
|
tmp2.SetLength(*aOutLen);
|
|
ConvertAudioSamples(aIn, tmp1.Elements(), *aInLen);
|
|
int result = speex_resampler_process_int(aResampler, aChannel, tmp1.Elements(), aInLen, tmp2.Elements(), aOutLen);
|
|
ConvertAudioSamples(tmp2.Elements(), aOut, *aOutLen);
|
|
return result;
|
|
#else
|
|
return speex_resampler_process_float(aResampler, aChannel, aIn, aInLen, aOut, aOutLen);
|
|
#endif
|
|
}
|
|
|
|
int
|
|
WebAudioUtils::SpeexResamplerProcess(SpeexResamplerState* aResampler,
|
|
uint32_t aChannel,
|
|
const int16_t* aIn, uint32_t* aInLen,
|
|
float* aOut, uint32_t* aOutLen)
|
|
{
|
|
nsAutoTArray<AudioDataValue, WEBAUDIO_BLOCK_SIZE*4> tmp;
|
|
#ifdef MOZ_SAMPLE_TYPE_S16
|
|
tmp.SetLength(*aOutLen);
|
|
int result = speex_resampler_process_int(aResampler, aChannel, aIn, aInLen, tmp.Elements(), aOutLen);
|
|
ConvertAudioSamples(tmp.Elements(), aOut, *aOutLen);
|
|
return result;
|
|
#else
|
|
tmp.SetLength(*aInLen);
|
|
ConvertAudioSamples(aIn, tmp.Elements(), *aInLen);
|
|
int result = speex_resampler_process_float(aResampler, aChannel, tmp.Elements(), aInLen, aOut, aOutLen);
|
|
return result;
|
|
#endif
|
|
}
|
|
|
|
int
|
|
WebAudioUtils::SpeexResamplerProcess(SpeexResamplerState* aResampler,
|
|
uint32_t aChannel,
|
|
const int16_t* aIn, uint32_t* aInLen,
|
|
int16_t* aOut, uint32_t* aOutLen)
|
|
{
|
|
#ifdef MOZ_SAMPLE_TYPE_S16
|
|
return speex_resampler_process_int(aResampler, aChannel, aIn, aInLen, aOut, aOutLen);
|
|
#else
|
|
nsAutoTArray<AudioDataValue, WEBAUDIO_BLOCK_SIZE*4> tmp1;
|
|
nsAutoTArray<AudioDataValue, WEBAUDIO_BLOCK_SIZE*4> tmp2;
|
|
tmp1.SetLength(*aInLen);
|
|
tmp2.SetLength(*aOutLen);
|
|
ConvertAudioSamples(aIn, tmp1.Elements(), *aInLen);
|
|
int result = speex_resampler_process_float(aResampler, aChannel, tmp1.Elements(), aInLen, tmp2.Elements(), aOutLen);
|
|
ConvertAudioSamples(tmp2.Elements(), aOut, *aOutLen);
|
|
return result;
|
|
#endif
|
|
}
|
|
|
|
}
|
|
}
|