mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 07:17:43 +02:00
Merge pull request #4413 from birarda/master
fix stereo to stereo resampling via soxr
This commit is contained in:
commit
2e85cf7459
3 changed files with 28 additions and 14 deletions
|
@ -20,11 +20,11 @@ var trailingLoudness = 0.0;
|
||||||
var soundClip = SoundCache.getSound("https://s3.amazonaws.com/hifi-public/sounds/Tabla+Loops/Tabla1.wav");
|
var soundClip = SoundCache.getSound("https://s3.amazonaws.com/hifi-public/sounds/Tabla+Loops/Tabla1.wav");
|
||||||
|
|
||||||
var properties = {
|
var properties = {
|
||||||
type: "Box",
|
type: "Box",
|
||||||
position: orbitCenter,
|
position: orbitCenter,
|
||||||
dimensions: { x: 0.25, y: 0.25, z: 0.25 },
|
dimensions: { x: 0.25, y: 0.25, z: 0.25 },
|
||||||
color: { red: 100, green: 0, blue : 0 }
|
color: { red: 100, green: 0, blue : 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
var objectId = Entities.addEntity(properties);
|
var objectId = Entities.addEntity(properties);
|
||||||
var sound = Audio.playSound(soundClip, { position: orbitCenter, loop: true, volume: 0.5 });
|
var sound = Audio.playSound(soundClip, { position: orbitCenter, loop: true, volume: 0.5 });
|
||||||
|
@ -34,7 +34,7 @@ function update(deltaTime) {
|
||||||
currentPosition = { x: orbitCenter.x + Math.cos(time * SPEED) * RADIUS, y: orbitCenter.y, z: orbitCenter.z + Math.sin(time * SPEED) * RADIUS };
|
currentPosition = { x: orbitCenter.x + Math.cos(time * SPEED) * RADIUS, y: orbitCenter.y, z: orbitCenter.z + Math.sin(time * SPEED) * RADIUS };
|
||||||
trailingLoudness = 0.9 * trailingLoudness + 0.1 * sound.loudness;
|
trailingLoudness = 0.9 * trailingLoudness + 0.1 * sound.loudness;
|
||||||
Entities.editEntity( objectId, { position: currentPosition, color: { red: Math.min(trailingLoudness * 2000, 255), green: 0, blue: 0 } } );
|
Entities.editEntity( objectId, { position: currentPosition, color: { red: Math.min(trailingLoudness * 2000, 255), green: 0, blue: 0 } } );
|
||||||
sound.setOptions({ position: currentPosition });
|
sound.options = { position: currentPosition };
|
||||||
}
|
}
|
||||||
|
|
||||||
Script.scriptEnding.connect(function() {
|
Script.scriptEnding.connect(function() {
|
||||||
|
|
|
@ -320,6 +320,7 @@ bool adjustedFormatForAudioDevice(const QAudioDeviceInfo& audioDevice,
|
||||||
#ifdef Q_OS_ANDROID
|
#ifdef Q_OS_ANDROID
|
||||||
adjustedAudioFormat.setSampleRate(FORTY_FOUR);
|
adjustedAudioFormat.setSampleRate(FORTY_FOUR);
|
||||||
#else
|
#else
|
||||||
|
|
||||||
const int HALF_FORTY_FOUR = FORTY_FOUR / 2;
|
const int HALF_FORTY_FOUR = FORTY_FOUR / 2;
|
||||||
|
|
||||||
if (audioDevice.supportedSampleRates().contains(AudioConstants::SAMPLE_RATE * 2)) {
|
if (audioDevice.supportedSampleRates().contains(AudioConstants::SAMPLE_RATE * 2)) {
|
||||||
|
@ -397,18 +398,24 @@ soxr_error_t possibleResampling(soxr_t resampler,
|
||||||
numSourceSamples,
|
numSourceSamples,
|
||||||
sourceAudioFormat, destinationAudioFormat);
|
sourceAudioFormat, destinationAudioFormat);
|
||||||
|
|
||||||
qDebug() << "resample from" << sourceAudioFormat << "to" << destinationAudioFormat
|
|
||||||
<< "from" << numChannelCoversionSamples << "to" << numDestinationSamples;
|
|
||||||
|
|
||||||
resampleError = soxr_process(resampler,
|
resampleError = soxr_process(resampler,
|
||||||
channelConversionSamples, numChannelCoversionSamples, NULL,
|
channelConversionSamples, numChannelCoversionSamples, NULL,
|
||||||
destinationSamples, numDestinationSamples, NULL);
|
destinationSamples, numDestinationSamples, NULL);
|
||||||
|
|
||||||
delete[] channelConversionSamples;
|
delete[] channelConversionSamples;
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
unsigned int numAdjustedSourceSamples = numSourceSamples;
|
||||||
|
unsigned int numAdjustedDestinationSamples = numDestinationSamples;
|
||||||
|
|
||||||
|
if (sourceAudioFormat.channelCount() == 2 && destinationAudioFormat.channelCount() == 2) {
|
||||||
|
numAdjustedSourceSamples /= 2;
|
||||||
|
numAdjustedDestinationSamples /= 2;
|
||||||
|
}
|
||||||
|
|
||||||
resampleError = soxr_process(resampler,
|
resampleError = soxr_process(resampler,
|
||||||
sourceSamples, numSourceSamples, NULL,
|
sourceSamples, numAdjustedSourceSamples, NULL,
|
||||||
destinationSamples, numDestinationSamples, NULL);
|
destinationSamples, numAdjustedDestinationSamples, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return resampleError;
|
return resampleError;
|
||||||
|
@ -429,9 +436,12 @@ soxr_t soxrResamplerFromInputFormatToOutputFormat(const QAudioFormat& sourceAudi
|
||||||
// setup soxr_quality_spec_t for quality options
|
// setup soxr_quality_spec_t for quality options
|
||||||
soxr_quality_spec_t qualitySpec = soxr_quality_spec(SOXR_MQ, 0);
|
soxr_quality_spec_t qualitySpec = soxr_quality_spec(SOXR_MQ, 0);
|
||||||
|
|
||||||
|
int channelCount = (sourceAudioFormat.channelCount() == 2 && destinationAudioFormat.channelCount() == 2)
|
||||||
|
? 2 : 1;
|
||||||
|
|
||||||
soxr_t newResampler = soxr_create(sourceAudioFormat.sampleRate(),
|
soxr_t newResampler = soxr_create(sourceAudioFormat.sampleRate(),
|
||||||
destinationAudioFormat.sampleRate(),
|
destinationAudioFormat.sampleRate(),
|
||||||
1,
|
channelCount,
|
||||||
&soxrError, &inputToNetworkSpec, &qualitySpec, 0);
|
&soxrError, &inputToNetworkSpec, &qualitySpec, 0);
|
||||||
|
|
||||||
if (soxrError) {
|
if (soxrError) {
|
||||||
|
@ -1136,7 +1146,7 @@ bool AudioClient::switchOutputToAudioDevice(const QAudioDeviceInfo& outputDevice
|
||||||
if (!outputDeviceInfo.isNull()) {
|
if (!outputDeviceInfo.isNull()) {
|
||||||
qDebug() << "The audio output device " << outputDeviceInfo.deviceName() << "is available.";
|
qDebug() << "The audio output device " << outputDeviceInfo.deviceName() << "is available.";
|
||||||
_outputAudioDeviceName = outputDeviceInfo.deviceName().trimmed();
|
_outputAudioDeviceName = outputDeviceInfo.deviceName().trimmed();
|
||||||
|
|
||||||
if (adjustedFormatForAudioDevice(outputDeviceInfo, _desiredOutputFormat, _outputFormat)) {
|
if (adjustedFormatForAudioDevice(outputDeviceInfo, _desiredOutputFormat, _outputFormat)) {
|
||||||
qDebug() << "The format to be used for audio output is" << _outputFormat;
|
qDebug() << "The format to be used for audio output is" << _outputFormat;
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,8 @@ class AbstractAudioInterface;
|
||||||
|
|
||||||
class AudioInjector : public QObject {
|
class AudioInjector : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
|
Q_PROPERTY(AudioInjectorOptions options WRITE setOptions READ getOptions)
|
||||||
public:
|
public:
|
||||||
AudioInjector(QObject* parent);
|
AudioInjector(QObject* parent);
|
||||||
AudioInjector(Sound* sound, const AudioInjectorOptions& injectorOptions);
|
AudioInjector(Sound* sound, const AudioInjectorOptions& injectorOptions);
|
||||||
|
@ -51,7 +53,9 @@ public slots:
|
||||||
void triggerDeleteAfterFinish() { _shouldDeleteAfterFinish = true; }
|
void triggerDeleteAfterFinish() { _shouldDeleteAfterFinish = true; }
|
||||||
void stopAndDeleteLater();
|
void stopAndDeleteLater();
|
||||||
|
|
||||||
void setOptions(AudioInjectorOptions& options) { _options = options; }
|
const AudioInjectorOptions& getOptions() const { return _options; }
|
||||||
|
void setOptions(const AudioInjectorOptions& options) { _options = options; }
|
||||||
|
|
||||||
void setCurrentSendPosition(int currentSendPosition) { _currentSendPosition = currentSendPosition; }
|
void setCurrentSendPosition(int currentSendPosition) { _currentSendPosition = currentSendPosition; }
|
||||||
float getLoudness() const { return _loudness; }
|
float getLoudness() const { return _loudness; }
|
||||||
bool isPlaying() const { return !_isFinished; }
|
bool isPlaying() const { return !_isFinished; }
|
||||||
|
|
Loading…
Reference in a new issue