mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-05-29 20:12:08 +02:00
Merge pull request #5019 from howard-stearns/pitch-shifted-collision-sounds
Pitch shifted collision sounds
This commit is contained in:
commit
faf9120b10
2 changed files with 32 additions and 1 deletions
|
@ -17,4 +17,10 @@ find_package(PolyVox REQUIRED)
|
||||||
target_include_directories(${TARGET_NAME} SYSTEM PUBLIC ${POLYVOX_INCLUDE_DIRS})
|
target_include_directories(${TARGET_NAME} SYSTEM PUBLIC ${POLYVOX_INCLUDE_DIRS})
|
||||||
target_link_libraries(${TARGET_NAME} ${POLYVOX_LIBRARIES})
|
target_link_libraries(${TARGET_NAME} ${POLYVOX_LIBRARIES})
|
||||||
|
|
||||||
|
# for changing the pitch of collision sounds
|
||||||
|
add_dependency_external_projects(soxr)
|
||||||
|
find_package(Soxr REQUIRED)
|
||||||
|
target_link_libraries(${TARGET_NAME} ${SOXR_LIBRARIES})
|
||||||
|
target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${SOXR_INCLUDE_DIRS})
|
||||||
|
|
||||||
link_hifi_libraries(shared gpu script-engine render-utils)
|
link_hifi_libraries(shared gpu script-engine render-utils)
|
||||||
|
|
|
@ -27,6 +27,8 @@
|
||||||
#include <ScriptEngine.h>
|
#include <ScriptEngine.h>
|
||||||
#include <TextureCache.h>
|
#include <TextureCache.h>
|
||||||
#include <SoundCache.h>
|
#include <SoundCache.h>
|
||||||
|
#include <soxr.h>
|
||||||
|
#include <AudioConstants.h>
|
||||||
|
|
||||||
#include "EntityTreeRenderer.h"
|
#include "EntityTreeRenderer.h"
|
||||||
|
|
||||||
|
@ -1158,7 +1160,30 @@ void EntityTreeRenderer::playEntityCollisionSound(const QUuid& myNodeID, EntityT
|
||||||
options.stereo = sound->isStereo();
|
options.stereo = sound->isStereo();
|
||||||
options.position = position;
|
options.position = position;
|
||||||
options.volume = volume;
|
options.volume = volume;
|
||||||
AudioInjector* injector = new AudioInjector(sound.data(), options);
|
|
||||||
|
// Shift the pitch down by ln(1 + (size / COLLISION_SIZE_FOR_STANDARD_PITCH)) / ln(2)
|
||||||
|
const float COLLISION_SIZE_FOR_STANDARD_PITCH = 0.2f;
|
||||||
|
QByteArray samples = sound->getByteArray();
|
||||||
|
soxr_io_spec_t spec = soxr_io_spec(SOXR_INT16_I, SOXR_INT16_I);
|
||||||
|
soxr_quality_spec_t qualitySpec = soxr_quality_spec(SOXR_MQ, 0);
|
||||||
|
const int channelCount = sound->isStereo() ? 2 : 1;
|
||||||
|
const float factor = log(1.0f + (entity->getMaximumAACube().getLargestDimension() / COLLISION_SIZE_FOR_STANDARD_PITCH)) / log(2);
|
||||||
|
const int standardRate = AudioConstants::SAMPLE_RATE;
|
||||||
|
const int resampledRate = standardRate * factor;
|
||||||
|
const int nInputSamples = samples.size() / sizeof(int16_t);
|
||||||
|
const int nOutputSamples = nInputSamples * factor;
|
||||||
|
QByteArray resampled(nOutputSamples * sizeof(int16_t), '\0');
|
||||||
|
const int16_t* receivedSamples = reinterpret_cast<const int16_t*>(samples.data());
|
||||||
|
soxr_error_t soxError = soxr_oneshot(standardRate, resampledRate, channelCount,
|
||||||
|
receivedSamples, nInputSamples, NULL,
|
||||||
|
reinterpret_cast<int16_t*>(resampled.data()), nOutputSamples, NULL,
|
||||||
|
&spec, &qualitySpec, 0);
|
||||||
|
if (soxError) {
|
||||||
|
qCDebug(entitiesrenderer) << "Unable to resample" << collisionSoundURL << "from" << nInputSamples << "@" << standardRate << "to" << nOutputSamples << "@" << resampledRate;
|
||||||
|
resampled = samples;
|
||||||
|
}
|
||||||
|
|
||||||
|
AudioInjector* injector = new AudioInjector(resampled, options);
|
||||||
injector->setLocalAudioInterface(_localAudioInterface);
|
injector->setLocalAudioInterface(_localAudioInterface);
|
||||||
injector->triggerDeleteAfterFinish();
|
injector->triggerDeleteAfterFinish();
|
||||||
QThread* injectorThread = new QThread();
|
QThread* injectorThread = new QThread();
|
||||||
|
|
Loading…
Reference in a new issue