/[svn]/linuxsampler/trunk/src/network/lscpinstrumentloader.cpp
ViewVC logotype

Contents of /linuxsampler/trunk/src/network/lscpinstrumentloader.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 411 - (show annotations) (download)
Sat Feb 26 02:01:14 2005 UTC (19 years, 2 months ago) by schoenebeck
File size: 3273 byte(s)
* design change: using now one sampler engine instance and one disk thread
  instance for all sampler channels that are connected to the same audio
  output device (and are using the same engine type of course)
* added EngineFactory / EngineChannelFactory to remove the annoying build
  dependencies e.g. of the lscpserver to the actual sampler engine
  implementations
* bumped version to 0.3.0 (current CVS state is still quite broken,
  previous, stable CVS version was tagged as "v0_2_0" and is also available
  as source tarball)

1 /***************************************************************************
2 * *
3 * Copyright (C) 2005 Christian Schoenebeck *
4 * *
5 * 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 *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This library is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this library; if not, write to the Free Software *
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
18 * MA 02111-1307 USA *
19 ***************************************************************************/
20
21 #include "lscpinstrumentloader.h"
22
23 LSCPInstrumentLoader::LSCPInstrumentLoader() : Thread(true, false, 0, -4) {
24 pQueue = new RingBuffer<command_t>(INSTRUMENT_LOADER_QUEUE_SIZE);
25 }
26
27 LSCPInstrumentLoader::~LSCPInstrumentLoader() {
28 if (pQueue) delete pQueue;
29 }
30
31 /**
32 * @brief Order loading of a new instrument.
33 * The request will go into a queue waiting to be processed by the loader
34 * thread. This method will immediately return and the instrument will be
35 * loaded in the background.
36 *
37 * @param Filename - file name of the instrument
38 * @param uiInstrumentIndex - index of the instrument within the file
39 * @param pEngineChannel - engine channel on which the instrument should be loaded
40 */
41 void LSCPInstrumentLoader::StartNewLoad(String Filename, uint uiInstrumentIndex, EngineChannel* pEngineChannel) {
42 // already tell the engine which instrument to load
43 pEngineChannel->PrepareLoadInstrument(Filename.c_str(), uiInstrumentIndex);
44
45 command_t cmd;
46 cmd.pEngineChannel = pEngineChannel;
47 pQueue->push(&cmd);
48 StartThread(); // ensure thread is running
49 conditionJobsLeft.Set(true); // wake up thread
50 }
51
52 // Entry point for the InstrumentLoader Thread.
53 int LSCPInstrumentLoader::Main() {
54 while (true) {
55 while (pQueue->read_space()) {
56 command_t cmd;
57 pQueue->pop(&cmd);
58 try {
59 cmd.pEngineChannel->LoadInstrument();
60 }
61 catch (LinuxSamplerException e) {
62 e.PrintMessage();
63 }
64 }
65
66 // nothing left to do, sleep until new jobs arrive
67 conditionJobsLeft.WaitIf(false);
68 // reset flag
69 conditionJobsLeft.Set(false);
70 // unlock condition object so it can be turned again by other thread
71 conditionJobsLeft.Unlock();
72 }
73 }

  ViewVC Help
Powered by ViewVC