Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/audaspace/intern/AUD_SequencerHandle.cpp')
-rw-r--r--intern/audaspace/intern/AUD_SequencerHandle.cpp166
1 files changed, 166 insertions, 0 deletions
diff --git a/intern/audaspace/intern/AUD_SequencerHandle.cpp b/intern/audaspace/intern/AUD_SequencerHandle.cpp
new file mode 100644
index 00000000000..c9cf46ccdc3
--- /dev/null
+++ b/intern/audaspace/intern/AUD_SequencerHandle.cpp
@@ -0,0 +1,166 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * Copyright 2009-2011 Jörg Hermann Müller
+ *
+ * This file is part of AudaSpace.
+ *
+ * Audaspace is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * AudaSpace is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Audaspace; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file audaspace/intern/AUD_SequencerHandle.cpp
+ * \ingroup audaspaceintern
+ */
+
+
+#include "AUD_SequencerHandle.h"
+#include "AUD_ReadDevice.h"
+
+AUD_SequencerHandle::AUD_SequencerHandle(AUD_Reference<AUD_SequencerEntry> entry, AUD_ReadDevice& device) :
+ m_entry(entry),
+ m_status(0),
+ m_pos_status(0),
+ m_sound_status(0),
+ m_device(device)
+{
+ if(!entry->m_sound.isNull())
+ {
+ m_handle = device.play(entry->m_sound, true);
+ m_3dhandle = AUD_Reference<AUD_I3DHandle>(m_handle);
+ }
+}
+
+AUD_SequencerHandle::~AUD_SequencerHandle()
+{
+ stop();
+}
+
+int AUD_SequencerHandle::compare(AUD_Reference<AUD_SequencerEntry> entry) const
+{
+ if(m_entry->getID() < entry->getID())
+ return -1;
+ else if(m_entry->getID() == entry->getID())
+ return 0;
+ return 1;
+}
+
+void AUD_SequencerHandle::stop()
+{
+ if(!m_handle.isNull())
+ m_handle->stop();
+}
+
+void AUD_SequencerHandle::update(float position, float frame)
+{
+ if(!m_handle.isNull())
+ {
+ m_entry->lock();
+ if(position >= m_entry->m_end && m_entry->m_end >= 0)
+ m_handle->pause();
+ else if(position >= m_entry->m_begin)
+ m_handle->resume();
+
+ if(m_sound_status != m_entry->m_sound_status)
+ {
+ if(!m_handle.isNull())
+ m_handle->stop();
+
+ if(!m_entry->m_sound.isNull())
+ {
+ m_handle = m_device.play(m_entry->m_sound, true);
+ m_3dhandle = AUD_Reference<AUD_I3DHandle>(m_handle);
+ }
+
+ m_sound_status = m_entry->m_sound_status;
+ m_pos_status--;
+ m_status--;
+ }
+
+ if(m_pos_status != m_entry->m_pos_status)
+ {
+ seek(position);
+
+ m_pos_status = m_entry->m_pos_status;
+ }
+
+ if(m_status != m_entry->m_status)
+ {
+ m_3dhandle->setRelative(m_entry->m_relative);
+ m_3dhandle->setVolumeMaximum(m_entry->m_volume_max);
+ m_3dhandle->setVolumeMinimum(m_entry->m_volume_min);
+ m_3dhandle->setDistanceMaximum(m_entry->m_distance_max);
+ m_3dhandle->setDistanceReference(m_entry->m_distance_reference);
+ m_3dhandle->setAttenuation(m_entry->m_attenuation);
+ m_3dhandle->setConeAngleOuter(m_entry->m_cone_angle_outer);
+ m_3dhandle->setConeAngleInner(m_entry->m_cone_angle_inner);
+ m_3dhandle->setConeVolumeOuter(m_entry->m_cone_volume_outer);
+
+ m_status = m_entry->m_status;
+ }
+
+ float value;
+
+ m_entry->m_volume.read(frame, &value);
+ m_handle->setVolume(value);
+ m_entry->m_pitch.read(frame, &value);
+ m_handle->setPitch(value);
+ m_entry->m_panning.read(frame, &value);
+ AUD_SoftwareDevice::setPanning(m_handle.get(), value);
+
+ AUD_Vector3 v, v2;
+ AUD_Quaternion q;
+
+ m_entry->m_orientation.read(frame, q.get());
+ m_3dhandle->setSourceOrientation(q);
+ m_entry->m_location.read(frame, v.get());
+ m_3dhandle->setSourceLocation(v);
+ m_entry->m_location.read(frame + 1, v2.get());
+ v2 -= v;
+ m_3dhandle->setSourceVelocity(v2);
+
+ if(m_entry->m_muted)
+ m_handle->setVolume(0);
+ m_entry->unlock();
+ }
+}
+
+void AUD_SequencerHandle::seek(float position)
+{
+ if(!m_handle.isNull())
+ {
+ m_entry->lock();
+ if(position >= m_entry->m_end && m_entry->m_end >= 0)
+ {
+ m_handle->pause();
+ m_entry->unlock();
+ return;
+ }
+
+ float seekpos = position - m_entry->m_begin;
+ if(seekpos < 0)
+ seekpos = 0;
+ seekpos += m_entry->m_skip;
+ m_handle->seek(seekpos);
+ if(position < m_entry->m_begin)
+ m_handle->pause();
+ else
+ m_handle->resume();
+ m_entry->unlock();
+ }
+}