diff options
author | Juan Linietsky <reduzio@gmail.com> | 2014-09-15 11:33:30 -0300 |
---|---|---|
committer | Dana Olson <dana@shineuponthee.com> | 2014-09-15 17:43:29 -0400 |
commit | 0c7b75d8d82d7a0c2b9347c7a2096a86a349fe7f (patch) | |
tree | 3494364413f220ea66da75cd6be4ea14ca1ce672 /drivers/theoraplayer/src/TheoraAudioPacketQueue.cpp | |
parent | 247e7ed716a4c0bd5140c2b2a938f7118e84fb14 (diff) |
3D Physics Rework, Other Stuff
-=-=-=-=-=-=-=-=-=-=-=-=-=-
3D Physics:
-Fixed "Bounce" parameter in 3D
-Fixed bug affecting Area (sometims it would not detect properly)
-Vehicle Body has seen heavy work
-Added Query API for doing space queries in 3D. Needs some docs though.
-Added JOINTS! Adapted Bullet Joints: and created easy gizmos for setting them up:
-PinJoint
-HingeJoint (with motor)
-SliderJoint
-ConeTwistJoint
-Generic6DOFJoint
-Added OBJECT PICKING! based on the new query API. Any physics object now (Area or Body) has the following signals and virtual functions:
-input_event (mouse or multitouch input over the body)
-mouse_enter (mouse entered the body area)
-mouse_exit (mouse exited body area)
For Area it needs to be activated manually, as it isn't by default (ray goes thru).
Other:
-Begun working on Windows 8 (RT) port. Compiles but does not work yet.
-Added TheoraPlayer library for improved to-texture and portable video support.
-Fixed a few bugs in the renderer, collada importer, collada exporter, etc.
Diffstat (limited to 'drivers/theoraplayer/src/TheoraAudioPacketQueue.cpp')
-rw-r--r-- | drivers/theoraplayer/src/TheoraAudioPacketQueue.cpp | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/drivers/theoraplayer/src/TheoraAudioPacketQueue.cpp b/drivers/theoraplayer/src/TheoraAudioPacketQueue.cpp new file mode 100644 index 0000000000..be5e1018f9 --- /dev/null +++ b/drivers/theoraplayer/src/TheoraAudioPacketQueue.cpp @@ -0,0 +1,126 @@ +/************************************************************************************ +This source file is part of the Theora Video Playback Library +For latest info, see http://libtheoraplayer.googlecode.com +************************************************************************************* +Copyright (c) 2008-2014 Kresimir Spes (kspes@cateia.com) +This program is free software; you can redistribute it and/or modify it under +the terms of the BSD license: http://opensource.org/licenses/BSD-3-Clause +*************************************************************************************/ +#include <stdlib.h> +#include "TheoraAudioPacketQueue.h" +#include "TheoraAudioInterface.h" + +TheoraAudioPacketQueue::TheoraAudioPacketQueue() +{ + mTheoraAudioPacketQueue = NULL; +} + +TheoraAudioPacketQueue::~TheoraAudioPacketQueue() +{ + destroyAllAudioPackets(); +} + +float TheoraAudioPacketQueue::getAudioPacketQueueLength() +{ + float len = 0; + for (TheoraAudioPacket* p = mTheoraAudioPacketQueue; p != NULL; p = p->next) + len += p->numSamples; + + return len / (mAudioFrequency * mNumAudioChannels); +} + +void TheoraAudioPacketQueue::_addAudioPacket(float* data, int numSamples) +{ + TheoraAudioPacket* packet = new TheoraAudioPacket; + packet->pcm = data; + packet->numSamples = numSamples; + packet->next = NULL; + + + if (mTheoraAudioPacketQueue == NULL) mTheoraAudioPacketQueue = packet; + else + { + TheoraAudioPacket* last = mTheoraAudioPacketQueue; + for (TheoraAudioPacket* p = last; p != NULL; p = p->next) + last = p; + last->next = packet; + } +} + +void TheoraAudioPacketQueue::addAudioPacket(float** buffer, int numSamples, float gain) +{ + float* data = new float[numSamples * mNumAudioChannels]; + float* dataptr = data; + int i; + unsigned int j; + + if (gain < 1.0f) + { + // apply gain, let's attenuate the samples + for (i = 0; i < numSamples; ++i) + for (j = 0; j < mNumAudioChannels; j++, ++dataptr) + *dataptr = buffer[i][j] * gain; + } + else + { + // do a simple copy, faster then the above method, when gain is 1.0f + for (i = 0; i < numSamples; ++i) + for (j = 0; j < mNumAudioChannels; j++, ++dataptr) + *dataptr = buffer[j][i]; + } + + _addAudioPacket(data, numSamples * mNumAudioChannels); +} + +void TheoraAudioPacketQueue::addAudioPacket(float* buffer, int numSamples, float gain) +{ + float* data = new float[numSamples * mNumAudioChannels]; + float* dataptr = data; + int i, numFloats = numSamples * mNumAudioChannels; + + if (gain < 1.0f) + { + // apply gain, let's attenuate the samples + for (i = 0; i < numFloats; ++i, dataptr++) + *dataptr = buffer[i] * gain; + } + else + { + // do a simple copy, faster then the above method, when gain is 1.0f + for (i = 0; i < numFloats; ++i, dataptr++) + *dataptr = buffer[i]; + } + + _addAudioPacket(data, numFloats); +} + +TheoraAudioPacket* TheoraAudioPacketQueue::popAudioPacket() +{ + if (mTheoraAudioPacketQueue == NULL) return NULL; + TheoraAudioPacket* p = mTheoraAudioPacketQueue; + mTheoraAudioPacketQueue = mTheoraAudioPacketQueue->next; + return p; +} + +void TheoraAudioPacketQueue::destroyAudioPacket(TheoraAudioPacket* p) +{ + if (p == NULL) return; + delete [] p->pcm; + delete p; +} + +void TheoraAudioPacketQueue::destroyAllAudioPackets() +{ + for (TheoraAudioPacket* p = popAudioPacket(); p != NULL; p = popAudioPacket()) + destroyAudioPacket(p); +} + +void TheoraAudioPacketQueue::flushAudioPackets(TheoraAudioInterface* audioInterface) +{ + + for (TheoraAudioPacket* p = popAudioPacket(); p != NULL; p = popAudioPacket()) + { + audioInterface->insertData(p->pcm, p->numSamples); + destroyAudioPacket(p); + } +}
\ No newline at end of file |