drop usage of threads in sound system
This commit is contained in:
		
							parent
							
								
									525feaf7fb
								
							
						
					
					
						commit
						ae67c6adbc
					
				| 
						 | 
					@ -22,7 +22,7 @@ ENDIF()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SET(Boost_USE_MULTITHREADED ON)
 | 
					SET(Boost_USE_MULTITHREADED ON)
 | 
				
			||||||
SET(Boost_USE_STATIC_LIBS ON)
 | 
					SET(Boost_USE_STATIC_LIBS ON)
 | 
				
			||||||
FIND_PACKAGE(Boost COMPONENTS system thread REQUIRED)
 | 
					FIND_PACKAGE(Boost COMPONENTS system REQUIRED)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
IF(USE_OPENGL_ES2)
 | 
					IF(USE_OPENGL_ES2)
 | 
				
			||||||
    FIND_PACKAGE(OpenGLES2 REQUIRED)
 | 
					    FIND_PACKAGE(OpenGLES2 REQUIRED)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -209,6 +209,8 @@ void Application::exit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Application::poll()
 | 
					void Application::poll()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    g_sounds.poll();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // poll input events
 | 
					    // poll input events
 | 
				
			||||||
    g_window.poll();
 | 
					    g_window.poll();
 | 
				
			||||||
    //g_particleManager.update();
 | 
					    //g_particleManager.update();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,8 +33,6 @@ SoundManager g_sounds;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SoundManager::init()
 | 
					void SoundManager::init()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    m_run = false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    m_device = alcOpenDevice(NULL);
 | 
					    m_device = alcOpenDevice(NULL);
 | 
				
			||||||
    if(!m_device) {
 | 
					    if(!m_device) {
 | 
				
			||||||
        logError("unable to open audio device");
 | 
					        logError("unable to open audio device");
 | 
				
			||||||
| 
						 | 
					@ -46,27 +44,20 @@ void SoundManager::init()
 | 
				
			||||||
        logError("unable to create audio context: ", alcGetString(m_device, alcGetError(m_device)));
 | 
					        logError("unable to create audio context: ", alcGetString(m_device, alcGetError(m_device)));
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    alcMakeContextCurrent(m_context);
 | 
					    alcMakeContextCurrent(m_context);
 | 
				
			||||||
    m_thread = std::thread(std::bind(&SoundManager::audioThread, &g_sounds));
 | 
					 | 
				
			||||||
    while(!m_run)
 | 
					 | 
				
			||||||
        g_clock.sleep(1);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    m_musicEnabled = true;
 | 
					    m_musicEnabled = true;
 | 
				
			||||||
    m_soundEnabled = true;
 | 
					    m_soundEnabled = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /*
 | 
					    /*
 | 
				
			||||||
    g_eventDispatcher.scheduleEvent([this] {
 | 
					    g_eventDispatcher.scheduleEvent([this] {
 | 
				
			||||||
        play("/test.ogg");
 | 
					        play("/1.ogg");
 | 
				
			||||||
    }, 10);
 | 
					    }, 10);
 | 
				
			||||||
    */
 | 
					    */
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SoundManager::terminate()
 | 
					void SoundManager::terminate()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    m_run = false;
 | 
					 | 
				
			||||||
    m_thread.join();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    m_sources.clear();
 | 
					    m_sources.clear();
 | 
				
			||||||
    m_buffers.clear();
 | 
					    m_buffers.clear();
 | 
				
			||||||
    m_musicSource = nullptr;
 | 
					    m_musicSource = nullptr;
 | 
				
			||||||
| 
						 | 
					@ -88,25 +79,14 @@ void SoundManager::terminate()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SoundManager::audioThread()
 | 
					void SoundManager::poll()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    m_run = true;
 | 
					 | 
				
			||||||
    while(m_run) {
 | 
					 | 
				
			||||||
        //TODO: use condition variable
 | 
					 | 
				
			||||||
        g_clock.sleep(30);
 | 
					 | 
				
			||||||
        update();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void SoundManager::update()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    std::lock_guard<std::recursive_mutex> lock(m_mutex);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    static ticks_t lastUpdate = 0;
 | 
					    static ticks_t lastUpdate = 0;
 | 
				
			||||||
    ticks_t now = g_clock.asyncTicks();
 | 
					    ticks_t now = g_clock.ticks();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(now - lastUpdate < 300)
 | 
					    if(now - lastUpdate < POLL_DELAY)
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lastUpdate = now;
 | 
					    lastUpdate = now;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for(auto it = m_sources.begin(); it != m_sources.end();) {
 | 
					    for(auto it = m_sources.begin(); it != m_sources.end();) {
 | 
				
			||||||
| 
						 | 
					@ -133,8 +113,6 @@ void SoundManager::update()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SoundManager::preload(const std::string& filename)
 | 
					void SoundManager::preload(const std::string& filename)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    std::lock_guard<std::recursive_mutex> lock(m_mutex);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    auto it = m_buffers.find(filename);
 | 
					    auto it = m_buffers.find(filename);
 | 
				
			||||||
    if(it != m_buffers.end())
 | 
					    if(it != m_buffers.end())
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
| 
						 | 
					@ -152,16 +130,12 @@ void SoundManager::preload(const std::string& filename)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SoundManager::enableSound(bool enable)
 | 
					void SoundManager::enableSound(bool enable)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    std::lock_guard<std::recursive_mutex> lock(m_mutex);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if(!isAudioEnabled())
 | 
					    if(!isAudioEnabled())
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SoundManager::play(const std::string& filename)
 | 
					void SoundManager::play(const std::string& filename)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    std::lock_guard<std::recursive_mutex> lock(m_mutex);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if(!m_soundEnabled)
 | 
					    if(!m_soundEnabled)
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -179,8 +153,6 @@ void SoundManager::play(const std::string& filename)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SoundManager::enableMusic(bool enable)
 | 
					void SoundManager::enableMusic(bool enable)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    std::lock_guard<std::recursive_mutex> lock(m_mutex);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if(!isAudioEnabled())
 | 
					    if(!isAudioEnabled())
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -194,8 +166,6 @@ void SoundManager::enableMusic(bool enable)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SoundManager::playMusic(const std::string& filename, bool fade)
 | 
					void SoundManager::playMusic(const std::string& filename, bool fade)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    std::lock_guard<std::recursive_mutex> lock(m_mutex);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if(m_currentMusic == filename && m_musicSource)
 | 
					    if(m_currentMusic == filename && m_musicSource)
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    m_currentMusic = filename;
 | 
					    m_currentMusic = filename;
 | 
				
			||||||
| 
						 | 
					@ -211,7 +181,7 @@ void SoundManager::playMusic(const std::string& filename, bool fade)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SoundManager::stopMusic(float fadetime)
 | 
					void SoundManager::stopMusic(float fadetime)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    std::lock_guard<std::recursive_mutex> lock(m_mutex);
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SoundSourcePtr SoundManager::createSoundSource(const std::string& filename)
 | 
					SoundSourcePtr SoundManager::createSoundSource(const std::string& filename)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,16 +28,15 @@
 | 
				
			||||||
class SoundManager
 | 
					class SoundManager
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    enum {
 | 
					    enum {
 | 
				
			||||||
        MAX_CACHE_SIZE = 10000000
 | 
					        MAX_CACHE_SIZE = 100000,
 | 
				
			||||||
 | 
					        POLL_DELAY = 300
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    void init();
 | 
					    void init();
 | 
				
			||||||
    void terminate();
 | 
					    void terminate();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void audioThread();
 | 
					    void poll();
 | 
				
			||||||
 | 
					 | 
				
			||||||
    void update();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void preload(const std::string& filename);
 | 
					    void preload(const std::string& filename);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -62,9 +61,6 @@ private:
 | 
				
			||||||
    StreamSoundSourcePtr m_musicSource;
 | 
					    StreamSoundSourcePtr m_musicSource;
 | 
				
			||||||
    ALCdevice *m_device;
 | 
					    ALCdevice *m_device;
 | 
				
			||||||
    ALCcontext *m_context;
 | 
					    ALCcontext *m_context;
 | 
				
			||||||
    std::thread m_thread;
 | 
					 | 
				
			||||||
    std::atomic<bool> m_run;
 | 
					 | 
				
			||||||
    std::recursive_mutex m_mutex;
 | 
					 | 
				
			||||||
    Boolean<false> m_musicEnabled;
 | 
					    Boolean<false> m_musicEnabled;
 | 
				
			||||||
    Boolean<false> m_soundEnabled;
 | 
					    Boolean<false> m_soundEnabled;
 | 
				
			||||||
    std::string m_currentMusic;
 | 
					    std::string m_currentMusic;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,12 +1,23 @@
 | 
				
			||||||
#!/bin/bash
 | 
					#!/bin/bash
 | 
				
			||||||
# generates a otclient zip package for win32
 | 
					# generates otclient zip package for win32
 | 
				
			||||||
# by edubart :)
 | 
					# by edubart :)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
protocol=860
 | 
					# TODO: the following options
 | 
				
			||||||
 | 
					# --gitroot <giturl>             - clone a different url, the default is git://github.com/edubart/otclient.git
 | 
				
			||||||
 | 
					# --platform <platform>          - compile for i486-mingw32, i586-msvc-mingw32 or linux
 | 
				
			||||||
 | 
					# --branch <branch>              - use sources from a specific branch, the default is master
 | 
				
			||||||
 | 
					# --name <name>                  - change .exe and folder name, the default is otclient
 | 
				
			||||||
 | 
					# --protocol <proto>             - game protocol, the default is 860
 | 
				
			||||||
 | 
					# --suffix <suffix>              - override suffix, the default is the date
 | 
				
			||||||
 | 
					# --copy-tibiafiles <folder>     - copy Tibia.spr and Tibia.dat from folder
 | 
				
			||||||
 | 
					# --github-upload <url>          - upload the zip to github
 | 
				
			||||||
 | 
					# --scp-upload <url>             - upload the zip to a shell via scp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gitroot="git://github.com/edubart/otclient.git"
 | 
					gitroot="git://github.com/edubart/otclient.git"
 | 
				
			||||||
gitname="otclient"
 | 
					name="otclient"
 | 
				
			||||||
mingw32="i486-mingw32"
 | 
					protocol=860
 | 
				
			||||||
spr_folder="$HOME/projects/otclient/modules/game_tibiafiles"
 | 
					platform="i486-mingw32"
 | 
				
			||||||
 | 
					tibiafiles_folder="$HOME/projects/otclient/modules/game_tibiafiles"
 | 
				
			||||||
upload_to="root@myserver.com:/var/www/downloads/"
 | 
					upload_to="root@myserver.com:/var/www/downloads/"
 | 
				
			||||||
pkg_suffix="-snapshot-`date +%Y%m%d`-protocol${protocol}-win32"
 | 
					pkg_suffix="-snapshot-`date +%Y%m%d`-protocol${protocol}-win32"
 | 
				
			||||||
use_spr=false
 | 
					use_spr=false
 | 
				
			||||||
| 
						 | 
					@ -14,12 +25,12 @@ upload=false
 | 
				
			||||||
make_jobs=8
 | 
					make_jobs=8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
srcdir=`pwd`
 | 
					srcdir=`pwd`
 | 
				
			||||||
if [ -d $gitname ]; then
 | 
					if [ -d $name ]; then
 | 
				
			||||||
    cd $gitname
 | 
					    cd $name
 | 
				
			||||||
    git pull || exit
 | 
					    git pull || exit
 | 
				
			||||||
else
 | 
					else
 | 
				
			||||||
    git clone $gitroot || exit
 | 
					    git clone $gitroot $name || exit
 | 
				
			||||||
    cd $gitname
 | 
					    cd $name
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gitdir=`pwd`
 | 
					gitdir=`pwd`
 | 
				
			||||||
| 
						 | 
					@ -32,17 +43,17 @@ else
 | 
				
			||||||
    mkdir -p build
 | 
					    mkdir -p build
 | 
				
			||||||
    cd build
 | 
					    cd build
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cmake -DCMAKE_TOOLCHAIN_FILE=$gitdir/src/framework/cmake/${mingw32}_toolchain.cmake \
 | 
					    cmake -DCMAKE_TOOLCHAIN_FILE=$gitdir/src/framework/cmake/${platform}_toolchain.cmake \
 | 
				
			||||||
          -DCMAKE_BUILD_TYPE=Release \
 | 
					          -DCMAKE_BUILD_TYPE=Release \
 | 
				
			||||||
          -DBUILD_REVISION=$revision \
 | 
					          -DBUILD_REVISION=$revision \
 | 
				
			||||||
          -DPROTOCOL=$protocol \
 | 
					          -DPROTOCOL=$protocol \
 | 
				
			||||||
          .. || exit
 | 
					          .. || exit
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
make -j${make_jobs} || exit
 | 
					make "-j${make_jobs}" || exit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pkgdir="$gitname$pkg_suffix"
 | 
					pkgdir="$name$pkg_suffix"
 | 
				
			||||||
pkgzip="$pkgdir.zip"
 | 
					pkgzip="$pkgdir.zip"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cd $srcdir
 | 
					cd $srcdir
 | 
				
			||||||
| 
						 | 
					@ -51,8 +62,8 @@ mkdir $pkgdir
 | 
				
			||||||
cd $pkgdir
 | 
					cd $pkgdir
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cp -R $gitdir/modules .
 | 
					cp -R $gitdir/modules .
 | 
				
			||||||
cp $gitdir/build/$gitname.exe $gitname.exe
 | 
					cp $gitdir/build/*.exe .
 | 
				
			||||||
cp $gitdir/build/$gitname.map $gitname.map
 | 
					cp $gitdir/build/*.map .
 | 
				
			||||||
cp $gitdir/LICENSE .
 | 
					cp $gitdir/LICENSE .
 | 
				
			||||||
cp $gitdir/README.rdoc .
 | 
					cp $gitdir/README.rdoc .
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue