From 63df9fb959b78bf1a34d5b7bb5f042acfaa5b2de Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 22 Oct 2015 22:37:18 -0700 Subject: [PATCH] Fixing raw sound playback and air guitar --- examples/controllers/hydra/airGuitar.js | 37 +++++++++++++-------- libraries/audio/src/Sound.cpp | 43 ++++++++++--------------- 2 files changed, 41 insertions(+), 39 deletions(-) diff --git a/examples/controllers/hydra/airGuitar.js b/examples/controllers/hydra/airGuitar.js index b286cc6084..f8606808c1 100644 --- a/examples/controllers/hydra/airGuitar.js +++ b/examples/controllers/hydra/airGuitar.js @@ -90,7 +90,7 @@ var audioInjector = null; var selectorPressed = false; var position; -MyAvatar.attach(guitarModel, "Hips", {x: -0.2, y: 0.0, z: 0.1}, Quat.fromPitchYawRollDegrees(90, 00, 90), 1.0); +MyAvatar.attach(guitarModel, "Hips", {x: leftHanded ? -0.2 : 0.2, y: 0.0, z: 0.1}, Quat.fromPitchYawRollDegrees(90, 00, leftHanded ? 75 : -75), 1.0); function checkHands(deltaTime) { var strumVelocity = Controller.getPoseValue(strumHand).velocity; @@ -114,27 +114,32 @@ function checkHands(deltaTime) { // Change guitars if button FWD (5) pressed if (Controller.getValue(changeGuitar)) { - print("changeGuitar:" + changeGuitar); if (!selectorPressed) { + print("changeGuitar:" + changeGuitar); guitarSelector += NUM_CHORDS; if (guitarSelector >= NUM_CHORDS * NUM_GUITARS) { guitarSelector = 0; } + print("new guitarBase: " + guitarSelector); + stopAudio(true); selectorPressed = true; } } else { selectorPressed = false; } - //print("selectorPressed:" + selectorPressed); if (Controller.getValue(chord1)) { whichChord = 1; + stopAudio(true); } else if (Controller.getValue(chord2)) { whichChord = 2; + stopAudio(true); } else if (Controller.getValue(chord3)) { whichChord = 3; + stopAudio(true); } else if (Controller.getValue(chord4)) { whichChord = 4; + stopAudio(true); } var STRUM_HEIGHT_ABOVE_PELVIS = 0.10; @@ -154,26 +159,27 @@ function checkHands(deltaTime) { lastPosition = strumHandPosition; } -function playChord(position, volume) { +function stopAudio(killInjector) { if (audioInjector && audioInjector.isPlaying) { print("stopped sound"); audioInjector.stop(); } - + if (killInjector) { + audioInjector = null; + } +} + + +function playChord(position, volume) { + stopAudio(); print("Played sound: " + whichChord + " at volume " + volume); if (!audioInjector) { - - // FIXME - we apparenlty broke RAW file playback, so we need WAV files for all these chords. In the mean - // time, we will just play the heyMan wave file for all chords - var chord = heyManWave; // chords[guitarSelector + whichChord]; - + var index = guitarSelector + whichChord; + var chord = chords[guitarSelector + whichChord]; audioInjector = Audio.playSound(chord, { position: position, volume: volume }); - print("audioInjector: " + JSON.stringify(audioInjector)); } else { - print("audioInjector: " + JSON.stringify(audioInjector)); audioInjector.restart(); } - } function keyPressEvent(event) { @@ -181,15 +187,19 @@ function keyPressEvent(event) { keyVolume = 0.4; if (event.text == "1") { whichChord = 1; + stopAudio(true); playChord(MyAvatar.position, keyVolume); } else if (event.text == "2") { whichChord = 2; + stopAudio(true); playChord(MyAvatar.position, keyVolume); } else if (event.text == "3") { whichChord = 3; + stopAudio(true); playChord(MyAvatar.position, keyVolume); } else if (event.text == "4") { whichChord = 4; + stopAudio(true); playChord(MyAvatar.position, keyVolume); } } @@ -197,6 +207,7 @@ function keyPressEvent(event) { function scriptEnding() { MyAvatar.detachOne(guitarModel); } + // Connect a call back that happens every frame Script.update.connect(checkHands); Script.scriptEnding.connect(scriptEnding); diff --git a/libraries/audio/src/Sound.cpp b/libraries/audio/src/Sound.cpp index 2457bda74a..2ce2c47fef 100644 --- a/libraries/audio/src/Sound.cpp +++ b/libraries/audio/src/Sound.cpp @@ -59,39 +59,30 @@ Sound::Sound(const QUrl& url, bool isStereo) : void Sound::downloadFinished(const QByteArray& data) { // replace our byte array with the downloaded data QByteArray rawAudioByteArray = QByteArray(data); - QString fileName = getURL().fileName(); - - const QString WAV_EXTENSION = ".wav"; + QString fileName = getURL().fileName().toLower(); + static const QString WAV_EXTENSION = ".wav"; + static const QString RAW_EXTENSION = ".raw"; if (fileName.endsWith(WAV_EXTENSION)) { - QString headerContentType = "audio/x-wav"; - //QByteArray headerContentType = reply->rawHeader("Content-Type"); + QByteArray outputAudioByteArray; - // WAV audio file encountered - if (headerContentType == "audio/x-wav" - || headerContentType == "audio/wav" - || headerContentType == "audio/wave" - || fileName.endsWith(WAV_EXTENSION)) { - - QByteArray outputAudioByteArray; - - interpretAsWav(rawAudioByteArray, outputAudioByteArray); - downSample(outputAudioByteArray); - } else { - // check if this was a stereo raw file - // since it's raw the only way for us to know that is if the file was called .stereo.raw - if (fileName.toLower().endsWith("stereo.raw")) { - _isStereo = true; - qCDebug(audio) << "Processing sound of" << rawAudioByteArray.size() << "bytes from" << getURL() << "as stereo audio file."; - } - - // Process as RAW file - downSample(rawAudioByteArray); + interpretAsWav(rawAudioByteArray, outputAudioByteArray); + downSample(outputAudioByteArray); + trimFrames(); + } else if (fileName.endsWith(RAW_EXTENSION)) { + // check if this was a stereo raw file + // since it's raw the only way for us to know that is if the file was called .stereo.raw + if (fileName.toLower().endsWith("stereo.raw")) { + _isStereo = true; + qCDebug(audio) << "Processing sound of" << rawAudioByteArray.size() << "bytes from" << getURL() << "as stereo audio file."; } + + // Process as RAW file + downSample(rawAudioByteArray); trimFrames(); } else { - qCDebug(audio) << "Network reply without 'Content-Type'."; + qCDebug(audio) << "Unknown sound file type"; } _isReady = true;