Source Code (Use browser search to find items of interest.)

Class Index

kdelibs'AudioPort (./kdelibs/arts/flow/synthschedule.h:94)

class AudioPort : public Port {
protected:
	AudioPort *source;

public:
	StdScheduleNode *sourcemodule;
	SynthBuffer *buffer, *lbuffer;
	unsigned long destcount, position;

	AudioPort(std::string name, void *ptr, long flags,StdScheduleNode *parent);
	~AudioPort();

	virtual class AudioPort *audioPort();

	void setFloatValue(float f);
	void connect(Port *psource);
	void disconnect(Port *psource);

//------------- I/O ---------------------------------------------------------

	inline unsigned long haveIn()
	{
        if(sourcemodule)
			return(buffer->position - position);
		else
			return(buffer->size);// constant value; no read limitation          
	}

    inline unsigned long outRoom()
    {
        long room;
 
        room = buffer->size - buffer->needread;
        if(room < 0) return 0;
        return (unsigned long)room;
    }                                                                           

	inline unsigned long readSegment(unsigned long offset, unsigned long len)
	{
		unsigned long rbsize = buffer->size;
		unsigned long rbmask = buffer->size - 1;
		unsigned long rbpos = (position+offset) & rbmask;

		*((float **)_ptr) = &buffer->data[rbpos];

		if(len > (rbsize-rbpos)) len = rbsize - rbpos;
		return len;
	}

	inline unsigned long writeSegment(unsigned long offset, unsigned long len)
	{
		unsigned long rbsize = buffer->size;
		unsigned long rbmask = buffer->size - 1;
		unsigned long rbpos = (buffer->position+offset) & rbmask;

		*((float **)_ptr) = &buffer->data[rbpos];

		if(len > (rbsize-rbpos)) len = rbsize - rbpos;
		return len;
	}

	inline void read(unsigned long cycles)
	{
		position += cycles;
		buffer->needread -= cycles;
	}

	inline void write(unsigned long cycles)
	{
		buffer->position += cycles;
		buffer->needread += cycles * destcount;
	}
};


kdelibs'AudioPort::AudioPort() (./kdelibs/arts/flow/synthschedule.cc:146)

AudioPort::AudioPort(string name, void *ptr, long flags,StdScheduleNode *parent)
		: Port(name,ptr,flags,parent)
{
	position = 0;
	destcount = 0;
	sourcemodule = 0;
	source = 0;
	lbuffer = buffer = new SynthBuffer(0.0, requestSize());
}


kdelibs'AudioPort::~AudioPort() (./kdelibs/arts/flow/synthschedule.cc:156)

AudioPort::~AudioPort()
{
	delete lbuffer;
}


kdelibs'AudioPort::audioPort() (./kdelibs/arts/flow/synthschedule.cc:161)

AudioPort *AudioPort::audioPort()
{
	return this;
}


kdelibs'AudioPort::setFloatValue() (./kdelibs/arts/flow/synthschedule.cc:166)

void AudioPort::setFloatValue(float f)
{
	buffer->setValue(f);
}


kdelibs'AudioPort::connect() (./kdelibs/arts/flow/synthschedule.cc:171)

void AudioPort::connect(Port *psource)
{
	source = psource->audioPort();
	assert(source);
	addAutoDisconnect(psource);

	buffer = source->buffer;
	position = buffer->position;
	source->destcount++;
	sourcemodule = source->parent;
}


kdelibs'AudioPort::disconnect() (./kdelibs/arts/flow/synthschedule.cc:183)

void AudioPort::disconnect(Port *psource)
{
	assert(source);
	assert(source == psource->audioPort());
	removeAutoDisconnect(psource);

	assert(sourcemodule == source->parent);
	sourcemodule = 0;

	// skip the remaining stuff in the buffer
	read(buffer->position - position);
	source->destcount--;
	source = 0;

	position = lbuffer->position;
	buffer = lbuffer;
}

// --------- MultiPort ----------


kdelibs'AudioPort::write() (./kdelibs/arts/flow/synthschedule.h:161)

	inline void write(unsigned long cycles)
	{
		buffer->position += cycles;
		buffer->needread += cycles * destcount;
	}
};