mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 08:21:24 +02:00
add a sound when moving so we aren't ninjas
This commit is contained in:
parent
f97932353b
commit
4552140f61
9 changed files with 93 additions and 35 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
interface/resources/audio/walking.raw
Normal file
BIN
interface/resources/audio/walking.raw
Normal file
Binary file not shown.
|
@ -49,7 +49,7 @@ const float MAX_FLANGE_SAMPLE_WEIGHT = 0.50;
|
||||||
const float MIN_FLANGE_INTENSITY = 0.25;
|
const float MIN_FLANGE_INTENSITY = 0.25;
|
||||||
|
|
||||||
const int SAMPLE_RATE = 22050;
|
const int SAMPLE_RATE = 22050;
|
||||||
const float JITTER_BUFFER_LENGTH_MSECS = 4;
|
const float JITTER_BUFFER_LENGTH_MSECS = 12;
|
||||||
const short JITTER_BUFFER_SAMPLES = JITTER_BUFFER_LENGTH_MSECS *
|
const short JITTER_BUFFER_SAMPLES = JITTER_BUFFER_LENGTH_MSECS *
|
||||||
NUM_AUDIO_CHANNELS * (SAMPLE_RATE / 1000.0);
|
NUM_AUDIO_CHANNELS * (SAMPLE_RATE / 1000.0);
|
||||||
|
|
||||||
|
@ -67,12 +67,18 @@ const int AUDIO_UDP_LISTEN_PORT = 55444;
|
||||||
int starve_counter = 0;
|
int starve_counter = 0;
|
||||||
StDev stdev;
|
StDev stdev;
|
||||||
bool stopAudioReceiveThread = false;
|
bool stopAudioReceiveThread = false;
|
||||||
|
|
||||||
int samplesLeftForFlange = 0;
|
int samplesLeftForFlange = 0;
|
||||||
int lastYawMeasuredMaximum = 0;
|
int lastYawMeasuredMaximum = 0;
|
||||||
float flangeIntensity = 0;
|
float flangeIntensity = 0;
|
||||||
float flangeRate = 0;
|
float flangeRate = 0;
|
||||||
float flangeWeight = 0;
|
float flangeWeight = 0;
|
||||||
|
|
||||||
|
int16_t *walkingSoundArray;
|
||||||
|
int walkingSoundSamples;
|
||||||
|
int samplesLeftForWalk = 0;
|
||||||
|
int16_t *sampleWalkPointer;
|
||||||
|
|
||||||
timeval firstPlaybackTimer;
|
timeval firstPlaybackTimer;
|
||||||
int packetsReceivedThisPlayback = 0;
|
int packetsReceivedThisPlayback = 0;
|
||||||
float usecsAtStartup = 0;
|
float usecsAtStartup = 0;
|
||||||
|
@ -117,6 +123,26 @@ int audioCallback (const void *inputBuffer,
|
||||||
|
|
||||||
if (inputLeft != NULL) {
|
if (inputLeft != NULL) {
|
||||||
|
|
||||||
|
//
|
||||||
|
// Measure the loudness of the signal from the microphone and store in audio object
|
||||||
|
//
|
||||||
|
float loudness = 0;
|
||||||
|
for (int i = 0; i < BUFFER_LENGTH_SAMPLES; i++) {
|
||||||
|
loudness += abs(inputLeft[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
loudness /= BUFFER_LENGTH_SAMPLES;
|
||||||
|
data->lastInputLoudness = loudness;
|
||||||
|
data->averagedInputLoudness = 0.66*data->averagedInputLoudness + 0.33*loudness;
|
||||||
|
//
|
||||||
|
// If scope is turned on, copy input buffer to scope
|
||||||
|
//
|
||||||
|
if (scope->getState()) {
|
||||||
|
for (int i = 0; i < BUFFER_LENGTH_SAMPLES; i++) {
|
||||||
|
scope->addData((float)inputLeft[i]/32767.0, 1, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (data->mixerAddress != 0) {
|
if (data->mixerAddress != 0) {
|
||||||
sockaddr_in audioMixerSocket;
|
sockaddr_in audioMixerSocket;
|
||||||
audioMixerSocket.sin_family = AF_INET;
|
audioMixerSocket.sin_family = AF_INET;
|
||||||
|
@ -153,31 +179,42 @@ int audioCallback (const void *inputBuffer,
|
||||||
memcpy(currentPacketPtr, &correctedYaw, sizeof(float));
|
memcpy(currentPacketPtr, &correctedYaw, sizeof(float));
|
||||||
currentPacketPtr += sizeof(float);
|
currentPacketPtr += sizeof(float);
|
||||||
|
|
||||||
|
if (samplesLeftForWalk == 0) {
|
||||||
|
sampleWalkPointer = walkingSoundArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data->playWalkSound) {
|
||||||
|
// if this boolean is true and we aren't currently playing the walk sound
|
||||||
|
// set the number of samples left for walk
|
||||||
|
samplesLeftForWalk = walkingSoundSamples;
|
||||||
|
data->playWalkSound = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (samplesLeftForWalk > 0) {
|
||||||
|
// we need to play part of the walking sound
|
||||||
|
// so add it in
|
||||||
|
int affectedSamples = std::min(samplesLeftForWalk, BUFFER_LENGTH_SAMPLES);
|
||||||
|
for (int i = 0; i < affectedSamples; i++) {
|
||||||
|
inputLeft[i] += *sampleWalkPointer;
|
||||||
|
inputLeft[i] = std::max(inputLeft[i], std::numeric_limits<int16_t>::min());
|
||||||
|
inputLeft[i] = std::min(inputLeft[i], std::numeric_limits<int16_t>::max());
|
||||||
|
|
||||||
|
sampleWalkPointer++;
|
||||||
|
samplesLeftForWalk--;
|
||||||
|
|
||||||
|
if (sampleWalkPointer - walkingSoundArray > walkingSoundSamples) {
|
||||||
|
sampleWalkPointer = walkingSoundArray;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// copy the audio data to the last BUFFER_LENGTH_BYTES bytes of the data packet
|
// copy the audio data to the last BUFFER_LENGTH_BYTES bytes of the data packet
|
||||||
memcpy(currentPacketPtr, inputLeft, BUFFER_LENGTH_BYTES);
|
memcpy(currentPacketPtr, inputLeft, BUFFER_LENGTH_BYTES);
|
||||||
|
|
||||||
data->audioSocket->send((sockaddr *)&audioMixerSocket, dataPacket, BUFFER_LENGTH_BYTES + leadingBytes);
|
data->audioSocket->send((sockaddr *)&audioMixerSocket, dataPacket, BUFFER_LENGTH_BYTES + leadingBytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Measure the loudness of the signal from the microphone and store in audio object
|
|
||||||
//
|
|
||||||
float loudness = 0;
|
|
||||||
for (int i = 0; i < BUFFER_LENGTH_SAMPLES; i++) {
|
|
||||||
loudness += abs(inputLeft[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
loudness /= BUFFER_LENGTH_SAMPLES;
|
|
||||||
data->lastInputLoudness = loudness;
|
|
||||||
data->averagedInputLoudness = 0.66*data->averagedInputLoudness + 0.33*loudness;
|
|
||||||
//
|
|
||||||
// If scope is turned on, copy input buffer to scope
|
|
||||||
//
|
|
||||||
if (scope->getState()) {
|
|
||||||
for (int i = 0; i < BUFFER_LENGTH_SAMPLES; i++) {
|
|
||||||
scope->addData((float)inputLeft[i]/32767.0, 1, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t *outputLeft = ((int16_t **) outputBuffer)[0];
|
int16_t *outputLeft = ((int16_t **) outputBuffer)[0];
|
||||||
|
@ -391,6 +428,10 @@ bool Audio::getMixerLoopbackFlag() {
|
||||||
return audioData->mixerLoopbackFlag;
|
return audioData->mixerLoopbackFlag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Audio::setWalkingState(bool newWalkState) {
|
||||||
|
audioData->playWalkSound = newWalkState;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize portaudio and start an audio stream.
|
* Initialize portaudio and start an audio stream.
|
||||||
* Should be called at the beginning of program exection.
|
* Should be called at the beginning of program exection.
|
||||||
|
@ -400,6 +441,19 @@ Use Audio::getError() to retrieve the error code.
|
||||||
*/
|
*/
|
||||||
Audio::Audio(Oscilloscope *s, Head *linkedHead)
|
Audio::Audio(Oscilloscope *s, Head *linkedHead)
|
||||||
{
|
{
|
||||||
|
// read the walking sound from the raw file and store it
|
||||||
|
// in the in memory array
|
||||||
|
FILE *soundFile = fopen("interface.app/Contents/Resources/audio/walking.raw", "r");
|
||||||
|
|
||||||
|
// get length of file:
|
||||||
|
std::fseek(soundFile, 0, SEEK_END);
|
||||||
|
walkingSoundSamples = std::ftell(soundFile) / sizeof(int16_t);
|
||||||
|
walkingSoundArray = new int16_t[walkingSoundSamples];
|
||||||
|
std::rewind(soundFile);
|
||||||
|
|
||||||
|
std::fread(walkingSoundArray, sizeof(int16_t), walkingSoundSamples, soundFile);
|
||||||
|
std::fclose(soundFile);
|
||||||
|
|
||||||
paError = Pa_Initialize();
|
paError = Pa_Initialize();
|
||||||
if (paError != paNoError) goto error;
|
if (paError != paNoError) goto error;
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,8 @@ public:
|
||||||
void getInputLoudness(float * lastLoudness, float * averageLoudness);
|
void getInputLoudness(float * lastLoudness, float * averageLoudness);
|
||||||
void updateMixerParams(in_addr_t mixerAddress, in_port_t mixerPort);
|
void updateMixerParams(in_addr_t mixerAddress, in_port_t mixerPort);
|
||||||
|
|
||||||
|
void setWalkingState(bool newWalkState);
|
||||||
|
|
||||||
// terminates audio I/O
|
// terminates audio I/O
|
||||||
bool terminate();
|
bool terminate();
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -40,6 +40,7 @@ class AudioData {
|
||||||
float averagedInputLoudness;
|
float averagedInputLoudness;
|
||||||
|
|
||||||
bool mixerLoopbackFlag;
|
bool mixerLoopbackFlag;
|
||||||
|
bool playWalkSound;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* defined(__interface__AudioData__) */
|
#endif /* defined(__interface__AudioData__) */
|
||||||
|
|
|
@ -193,8 +193,6 @@ unsigned int texture_height = 256;
|
||||||
float particle_attenuation_quadratic[] = { 0.0f, 0.0f, 2.0f }; // larger Z = smaller particles
|
float particle_attenuation_quadratic[] = { 0.0f, 0.0f, 2.0f }; // larger Z = smaller particles
|
||||||
float pointer_attenuation_quadratic[] = { 1.0f, 0.0f, 0.0f }; // for 2D view
|
float pointer_attenuation_quadratic[] = { 1.0f, 0.0f, 0.0f }; // for 2D view
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef MARKER_CAPTURE
|
#ifdef MARKER_CAPTURE
|
||||||
|
|
||||||
/*** Marker Capture ***/
|
/*** Marker Capture ***/
|
||||||
|
@ -690,6 +688,7 @@ const float KEYBOARD_FLY_RATE = 0.08;
|
||||||
|
|
||||||
void specialkey(int k, int x, int y)
|
void specialkey(int k, int x, int y)
|
||||||
{
|
{
|
||||||
|
if (k == GLUT_KEY_UP || k == GLUT_KEY_DOWN || k == GLUT_KEY_LEFT || k == GLUT_KEY_RIGHT) {
|
||||||
if (k == GLUT_KEY_UP) fwd_vel += KEYBOARD_FLY_RATE;
|
if (k == GLUT_KEY_UP) fwd_vel += KEYBOARD_FLY_RATE;
|
||||||
if (k == GLUT_KEY_DOWN) fwd_vel -= KEYBOARD_FLY_RATE;
|
if (k == GLUT_KEY_DOWN) fwd_vel -= KEYBOARD_FLY_RATE;
|
||||||
if (k == GLUT_KEY_LEFT) {
|
if (k == GLUT_KEY_LEFT) {
|
||||||
|
@ -701,6 +700,8 @@ void specialkey(int k, int x, int y)
|
||||||
else render_yaw_rate += KEYBOARD_YAW_RATE;
|
else render_yaw_rate += KEYBOARD_YAW_RATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
audio.setWalkingState(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void key(unsigned char k, int x, int y)
|
void key(unsigned char k, int x, int y)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue