/[svn]/linuxsampler/trunk/src/engines/InstrumentManagerThread.cpp
ViewVC logotype

Diff of /linuxsampler/trunk/src/engines/InstrumentManagerThread.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2277 by persson, Sat Oct 1 08:23:02 2011 UTC revision 2351 by persson, Sat Jun 23 11:02:48 2012 UTC
# Line 1  Line 1 
1  /***************************************************************************  /***************************************************************************
2   *                                                                         *   *                                                                         *
3   *   Copyright (C) 2005 - 2011 Christian Schoenebeck                       *   *   Copyright (C) 2005 - 2012 Christian Schoenebeck                       *
4   *                                                                         *   *                                                                         *
5   *   This library is free software; you can redistribute it and/or modify  *   *   This library is free software; you can redistribute it and/or modify  *
6   *   it under the terms of the GNU General Public License as published by  *   *   it under the terms of the GNU General Public License as published by  *
# Line 46  namespace LinuxSampler { Line 46  namespace LinuxSampler {
46      void InstrumentManagerThread::StartNewLoad(String Filename, uint uiInstrumentIndex, EngineChannel* pEngineChannel) {      void InstrumentManagerThread::StartNewLoad(String Filename, uint uiInstrumentIndex, EngineChannel* pEngineChannel) {
47          dmsg(1,("Scheduling '%s' (Index=%d) to be loaded in background (if not loaded yet).\n",Filename.c_str(),uiInstrumentIndex));          dmsg(1,("Scheduling '%s' (Index=%d) to be loaded in background (if not loaded yet).\n",Filename.c_str(),uiInstrumentIndex));
48    
49          static bool listenerRegistered = false;          // the listener only needs to be registered once in the
50          if (!listenerRegistered) {          // Sampler, but as we don't know if Sampler has been
51              pEngineChannel->GetSampler()->AddChannelCountListener(&eventHandler);          // recreated, we simply remove and add every time
52              listenerRegistered = true;          pEngineChannel->GetSampler()->RemoveChannelCountListener(&eventHandler);
53          }          pEngineChannel->GetSampler()->AddChannelCountListener(&eventHandler);
           
54                    
55          command_t cmd;          command_t cmd;
56          cmd.type           = command_t::DIRECT_LOAD;          cmd.type           = command_t::DIRECT_LOAD;
# Line 102  namespace LinuxSampler { Line 101  namespace LinuxSampler {
101              TestCancel();              TestCancel();
102              #endif              #endif
103    
104              while (!queue.empty()) {              while (true) {
105                  command_t cmd;                  command_t cmd;
106    
107                  // grab a new command from the queue                  // grab a new command from the queue
108                  mutex.Lock();                  mutex.Lock();
109                  cmd = queue.front();                  bool empty = queue.empty();
110                  queue.pop_front();                  if (!empty) {
111                        cmd = queue.front();
112                        queue.pop_front();
113    
114                        if (cmd.type == command_t::DIRECT_LOAD) {
115                            EngineChannelFactory::SetDeleteEnabled(cmd.pEngineChannel, false);
116                        }
117                    }
118                  mutex.Unlock();                  mutex.Unlock();
119                    if (empty) break;
120    
121                  try {                  try {
122                      switch (cmd.type) {                      switch (cmd.type) {
123                          case command_t::DIRECT_LOAD:                          case command_t::DIRECT_LOAD:
                             EngineChannelFactory::SetDeleteEnabled(cmd.pEngineChannel, false);  
124                              cmd.pEngineChannel->PrepareLoadInstrument(cmd.instrumentId.FileName.c_str(), cmd.instrumentId.Index);                              cmd.pEngineChannel->PrepareLoadInstrument(cmd.instrumentId.FileName.c_str(), cmd.instrumentId.Index);
125                              cmd.pEngineChannel->LoadInstrument();                              cmd.pEngineChannel->LoadInstrument();
126                              EngineChannelFactory::SetDeleteEnabled(cmd.pEngineChannel, true);                              EngineChannelFactory::SetDeleteEnabled(cmd.pEngineChannel, true);
# Line 168  namespace LinuxSampler { Line 174  namespace LinuxSampler {
174          pThread->mutex.Unlock();          pThread->mutex.Unlock();
175      }      }
176    
177  #ifdef __APPLE__  #if defined(__APPLE__) && !defined(__x86_64__)
178      int InstrumentManagerThread::StopThread() {      int InstrumentManagerThread::StopThread() {
179          // This is a fix for Mac OS X, where SignalStopThread doesn't          // This is a fix for Mac OS X 32 bit, where SignalStopThread
180          // wake up a thread waiting for a condition variable.          // doesn't wake up a thread waiting for a condition variable.
181          SignalStopThread(); // send stop signal, but don't wait          SignalStopThread(); // send stop signal, but don't wait
182          conditionJobsLeft.Set(true); // wake thread          conditionJobsLeft.Set(true); // wake thread
183          return Thread::StopThread(); // then wait for it to cancel          return Thread::StopThread(); // then wait for it to cancel
184      }      }
185  #endif  #endif
186    
187    #ifdef WIN32
188        int InstrumentManagerThread::StopThread() {
189            int res = Thread::StopThread();
190            conditionJobsLeft.Reset();
191            return res;
192        }
193    #endif
194    
195  } // namespace LinuxSampler  } // namespace LinuxSampler

Legend:
Removed from v.2277  
changed lines
  Added in v.2351

  ViewVC Help
Powered by ViewVC