--- linuxsampler/trunk/src/engines/gig/DiskThread.h 2006/05/14 07:15:52 865 +++ linuxsampler/trunk/src/engines/gig/DiskThread.h 2007/10/14 22:00:17 1424 @@ -3,7 +3,7 @@ * LinuxSampler - modular, streaming capable sampler * * * * Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck * - * Copyright (C) 2005 Christian Schoenebeck * + * Copyright (C) 2005 - 2007 Christian Schoenebeck * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -24,7 +24,7 @@ #ifndef __LS_GIG_DISKTHREAD_H__ #define __LS_GIG_DISKTHREAD_H__ -#include "../../common/global.h" +#include "../../common/global_private.h" #include @@ -41,18 +41,24 @@ * * The disk reader thread is responsible for periodically refilling * disk streams in parallel to the audio thread's rendering process. + * + * There is also a function for releasing parts of instruments not + * in use anymore (as this is not real time safe, the audio thread + * cannot do it directly). */ class DiskThread : public Thread { public: // Methods - DiskThread(uint BufferWrapElements); + DiskThread(uint BufferWrapElements, InstrumentResourceManager* pInstruments); virtual ~DiskThread(); void Reset(); String GetBufferFillBytes(); String GetBufferFillPercentage(); int OrderNewStream(Stream::reference_t* pStreamRef, ::gig::DimensionRegion* pDimRgn, unsigned long SampleOffset, bool DoLoop); - int OrderDeletionOfStream(Stream::reference_t* pStreamRef); + int OrderDeletionOfStream(Stream::reference_t* pStreamRef, bool bRequestNotification = false); + int OrderDeletionOfDimreg(::gig::DimensionRegion* dimreg); Stream* AskForCreatedStream(Stream::OrderID_t StreamOrderID); + Stream::Handle AskForDeletedStream(); // the number of streams currently in usage // printed on the console the main thread (along with the active voice count) @@ -79,18 +85,22 @@ Stream* pStream; Stream::Handle hStream; Stream::OrderID_t OrderID; + bool bNotify; }; // Attributes bool IsIdle; uint Streams; - RingBuffer* CreationQueue; ///< Contains commands to create streams - RingBuffer* DeletionQueue; ///< Contains commands to delete streams - RingBuffer* GhostQueue; ///< Contains handles to streams that are not used anymore and weren't deletable immediately + RingBuffer* CreationQueue; ///< Contains commands to create streams + RingBuffer* DeletionQueue; ///< Contains commands to delete streams + RingBuffer* GhostQueue; ///< Contains handles to streams that are not used anymore and weren't deletable immediately + RingBuffer DeletionNotificationQueue; ///< In case the original sender requested a notification for its stream deletion order, this queue will receive the handle of the respective stream once actually be deleted by the disk thread. + RingBuffer< ::gig::DimensionRegion*,false>* DeleteDimregQueue; ///< Contains dimension regions that are not used anymore and should be handed back to the instrument resource manager unsigned int RefillStreamsPerRun; ///< How many streams should be refilled in each loop run Stream* pStreams[CONFIG_MAX_STREAMS]; ///< Contains all disk streams (whether used or unused) Stream* pCreatedStreams[CONFIG_MAX_STREAMS + 1]; ///< This is where the voice (audio thread) picks up it's meanwhile hopefully created disk stream. static Stream* SLOT_RESERVED; ///< This value is used to mark an entry in pCreatedStreams[] as reserved. + InstrumentResourceManager* pInstruments; ///< The instrument resource manager of the engine that is using this disk thread. Used by the dimension region deletion feature. // Methods void CreateStream(create_command_t& Command);