This repository has been archived on 2023-10-09. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
blender-archive/extern/audaspace/src/fx/PlaybackCategory.cpp
Sergey Sharybin e5a74f3ad3 Audaspace: Fix -Wreorder warning
Makes building less noisy, helps catching real introduced warnings/errors.

@xeXyon, mind having a look here and possibly apply to upstream? :)
2017-11-28 14:24:56 +01:00

145 lines
3.2 KiB
C++

/*******************************************************************************
* Copyright 2015-2016 Juan Francisco Crespo Galán
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
#include "fx/PlaybackCategory.h"
#include "fx/VolumeSound.h"
AUD_NAMESPACE_BEGIN
struct HandleData {
unsigned int id;
PlaybackCategory* category;
};
PlaybackCategory::PlaybackCategory(std::shared_ptr<IDevice> device) :
m_currentID(0), m_device(device), m_status(STATUS_PLAYING), m_volumeStorage(std::make_shared<VolumeStorage>(1.0f))
{
}
PlaybackCategory::~PlaybackCategory()
{
stop();
}
std::shared_ptr<IHandle> PlaybackCategory::play(std::shared_ptr<ISound> sound)
{
std::shared_ptr<ISound> vs(std::make_shared<VolumeSound>(sound, m_volumeStorage));
m_device->lock();
auto handle = m_device->play(vs);
if(handle == nullptr)
return nullptr;
switch (m_status)
{
case STATUS_PAUSED:
handle->pause();
break;
default:
m_status = STATUS_PLAYING;
};
m_handles[m_currentID] = handle;
HandleData* data = new HandleData;
data->category = this;
data->id = m_currentID;
handle->setStopCallback(cleanHandleCallback, data);
m_device->unlock();
m_currentID++;
return handle;
}
void PlaybackCategory::resume()
{
m_device->lock();
for(auto i = m_handles.begin(); i != m_handles.end();)
{
if(i->second->getStatus() == STATUS_INVALID)
i = m_handles.erase(i);
else
{
i->second->resume();
i++;
}
}
m_device->unlock();
m_status = STATUS_PLAYING;
}
void PlaybackCategory::pause()
{
m_device->lock();
for(auto i = m_handles.begin(); i != m_handles.end();)
{
if(i->second->getStatus() == STATUS_INVALID)
i = m_handles.erase(i);
else
{
i->second->pause();
i++;
}
}
m_device->unlock();
m_status = STATUS_PAUSED;
}
float PlaybackCategory::getVolume()
{
return m_volumeStorage->getVolume();
}
void PlaybackCategory::setVolume(float volume)
{
m_volumeStorage->setVolume(volume);
}
void PlaybackCategory::stop()
{
m_device->lock();
for(auto i = m_handles.begin(); i != m_handles.end();)
{
i->second->stop();
if(i->second->getStatus() == STATUS_INVALID)
i = m_handles.erase(i);
else
i++;
}
m_device->unlock();
m_status = STATUS_STOPPED;
}
std::shared_ptr<VolumeStorage> PlaybackCategory::getSharedVolume()
{
return m_volumeStorage;
}
void PlaybackCategory::cleanHandles()
{
for(auto i = m_handles.begin(); i != m_handles.end();)
{
if(i->second->getStatus() == STATUS_INVALID)
i = m_handles.erase(i);
else
i++;
}
}
void PlaybackCategory::cleanHandleCallback(void* data)
{
auto dat = reinterpret_cast<HandleData*>(data);
dat->category->m_handles.erase(dat->id);
delete dat;
}
AUD_NAMESPACE_END