blender/intern/audaspace/intern/AUD_SequencerHandle.cpp
Joerg Mueller 0f5e1f2ff0 Fixes for
* [#31285] VSE: audio pitch change delays audio
* [#31260] VSE Trimmed audio plays when overlaped
2012-05-04 23:28:27 +00:00

166 lines
4.1 KiB
C++

/*
* ***** 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, float fps)
{
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 * fps);
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->setPitch(1.0f);
m_handle->seek(seekpos);
if(position < m_entry->m_begin)
m_handle->pause();
else
m_handle->resume();
m_entry->unlock();
}
}