Skip to content

Commit

Permalink
Add ThreadedDevice.
Browse files Browse the repository at this point in the history
  • Loading branch information
neXyon committed Mar 29, 2021
1 parent e68b355 commit 749c974
Show file tree
Hide file tree
Showing 4 changed files with 163 additions and 0 deletions.
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ set(SRC
src/devices/NULLDevice.cpp
src/devices/ReadDevice.cpp
src/devices/SoftwareDevice.cpp
src/devices/ThreadedDevice.cpp
src/Exception.cpp
src/file/File.cpp
src/file/FileManager.cpp
Expand Down Expand Up @@ -140,6 +141,7 @@ set(PUBLIC_HDR
include/devices/NULLDevice.h
include/devices/ReadDevice.h
include/devices/SoftwareDevice.h
include/devices/ThreadedDevice.h
include/Exception.h
include/file/File.h
include/file/FileManager.h
Expand Down
1 change: 1 addition & 0 deletions include/devices/SoftwareDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,7 @@ class AUD_API SoftwareDevice : public IDevice, public I3DDevice
/**
* This function tells the device, to start or pause playback.
* \param playing True if device should playback.
* \note This method is only called when the device is locked.
*/
virtual void playing(bool playing)=0;

Expand Down
95 changes: 95 additions & 0 deletions include/devices/ThreadedDevice.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
/*******************************************************************************
* Copyright 2009-2016 Jörg Müller
*
* 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.
******************************************************************************/

#pragma once

/**
* @file ThreadedDevice.h
* @ingroup plugin
* The ThreadedDevice class.
*/

#include "devices/SoftwareDevice.h"

#include <thread>

AUD_NAMESPACE_BEGIN

/**
* This device extends the SoftwareDevice with code for running mixing in a separate thread.
*/
class AUD_PLUGIN_API ThreadedDevice : public SoftwareDevice
{
private:
/**
* Whether there is currently playback.
*/
bool m_playing;

/**
* Whether the current playback should stop.
*/
bool m_stop;

/**
* The streaming thread.
*/
std::thread m_thread;

/**
* Starts the streaming thread.
*/
AUD_LOCAL void start();

/**
* Streaming thread main function.
*/
AUD_LOCAL virtual void runMixingThread()=0;

// delete copy constructor and operator=
ThreadedDevice(const ThreadedDevice&) = delete;
ThreadedDevice& operator=(const ThreadedDevice&) = delete;

protected:
virtual void playing(bool playing);

/**
* Empty default constructor. To setup the device call the function create()
* and to uninitialize call destroy().
*/
ThreadedDevice();

/**
* Indicates that the mixing thread should be stopped.
* \return Whether the mixing thread should be stopping.
* \warning For thread safety, the device needs to be locked, when this method is called.
*/
inline bool shouldStop() { return m_stop; }

/**
* This method needs to be called when the mixing thread is stopping.
* \warning For thread safety, the device needs to be locked, when this method is called.
*/
inline void doStop() { m_stop = m_playing = false; }

/**
* Stops all playback and notifies the mixing thread to stop.
* \warning The device has to be unlocked to not run into a deadlock.
*/
void stopMixingThread();
};

AUD_NAMESPACE_END
65 changes: 65 additions & 0 deletions src/devices/ThreadedDevice.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*******************************************************************************
* Copyright 2009-2016 Jörg Müller
*
* 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 "devices/ThreadedDevice.h"

#include <mutex>

AUD_NAMESPACE_BEGIN

void ThreadedDevice::start()
{
std::lock_guard<ILockable> lock(*this);

// thread is still running, we can abort stopping it
if(m_stop)
m_stop = false;

// thread is not running, let's start it
else if(!m_playing)
{
if(m_thread.joinable())
m_thread.join();

m_playing = true;

m_thread = std::thread(&ThreadedDevice::runMixingThread, this);
}
}

void ThreadedDevice::playing(bool playing)
{
if((!m_playing || m_stop) && playing)
start();
else
m_stop = true;
}

ThreadedDevice::ThreadedDevice() :
m_playing(false),
m_stop(false)
{
}

void aud::ThreadedDevice::stopMixingThread()
{
stopAll();

if(m_thread.joinable())
m_thread.join();
}

AUD_NAMESPACE_END

0 comments on commit 749c974

Please sign in to comment.