new files added

git-svn-id: svn://localhost/ardour2/trunk@2580 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2007-10-31 18:28:52 +00:00
parent 8ab17e9631
commit 1059b3f48e
4 changed files with 327 additions and 0 deletions

View file

@ -0,0 +1,106 @@
/*
Copyright (C) 2002 Paul Davis
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
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: port.h 712 2006-07-28 01:08:57Z drobilla $
*/
#ifndef __ardour_base_audio_port_h__
#define __ardour_base_audio_port_h__
#include <string>
#include <sigc++/signal.h>
#include <pbd/failed_constructor.h>
#include <ardour/ardour.h>
#include <ardour/port.h>
#include <ardour/audio_buffer.h>
namespace ARDOUR {
class AudioEngine;
class BaseAudioPort : public virtual Port {
public:
virtual ~BaseAudioPort();
DataType type() const { return DataType::AUDIO; }
virtual Buffer& get_buffer () {
assert (_buffer);
return *_buffer;
}
virtual AudioBuffer& get_audio_buffer() {
assert (_buffer);
return *_buffer;
}
void reset ();
void reset_overs () {
/* XXX NOT THREAD SAFE */
_short_overs = 0;
_long_overs = 0;
_overlen = 0;
}
void reset_peak_meter () {
/* XXX NOT THREAD SAFE */
_peak = 0;
}
void reset_meters () {
/* XXX NOT THREAD SAFE */
reset_peak_meter ();
reset_overs ();
}
float peak_db() const { return _peak_db; }
Sample peak() const { return _peak; }
uint32_t short_overs () const { return _short_overs; }
uint32_t long_overs () const { return _long_overs; }
static void set_short_over_length (nframes_t);
static void set_long_over_length (nframes_t);
void set_mixdown_function (void (*func)(const std::set<Port*>&, AudioBuffer*, nframes_t, nframes_t, bool));
protected:
BaseAudioPort (const std::string& name, Flags flags);
AudioBuffer* _buffer;
nframes_t _overlen;
Sample _peak;
float _peak_db;
uint32_t _short_overs;
uint32_t _long_overs;
bool _own_buffer;
void (*_mixdown)(const std::set<Port*>&, AudioBuffer*, nframes_t, nframes_t, bool);
static void default_mixdown (const std::set<Port*>&, AudioBuffer*, nframes_t, nframes_t, bool);
static nframes_t _long_over_length;
static nframes_t _short_over_length;
};
} // namespace ARDOUR
#endif /* __ardour_base_audio_port_h__ */

View file

@ -0,0 +1,67 @@
/*
Copyright (C) 2002 Paul Davis
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
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: port.h 712 2006-07-28 01:08:57Z drobilla $
*/
#ifndef __ardour_base_midi_port_h__
#define __ardour_base_midi_port_h__
#include <sigc++/signal.h>
#include <pbd/failed_constructor.h>
#include <ardour/ardour.h>
#include <ardour/port.h>
#include <ardour/midi_buffer.h>
namespace ARDOUR {
class MidiEngine;
class BaseMidiPort : public virtual Port {
public:
virtual ~BaseMidiPort();
DataType type() const { return DataType::MIDI; }
Buffer& get_buffer() {
assert (_buffer);
return *_buffer;
}
MidiBuffer& get_midi_buffer() {
assert (_buffer);
return *_buffer;
}
size_t capacity() { return _buffer->capacity(); }
size_t size() { return _buffer->size(); }
void set_mixdown_function (void (*func)(const std::set<Port*>&, MidiBuffer*, nframes_t, nframes_t, bool));
protected:
BaseMidiPort (const std::string& name, Flags);
MidiBuffer* _buffer;
bool _own_buffer;
void (*_mixdown)(const std::set<Port*>&, MidiBuffer*, nframes_t, nframes_t, bool);
static void default_mixdown (const std::set<Port*>&, MidiBuffer*, nframes_t, nframes_t, bool);
};
} // namespace ARDOUR
#endif /* __ardour_base_midi_port_h__ */

View file

@ -0,0 +1,85 @@
/*
Copyright (C) 2006 Paul Davis
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
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <cassert>
#include <ardour/base_audio_port.h>
#include <ardour/audioengine.h>
#include <ardour/data_type.h>
using namespace ARDOUR;
using namespace std;
nframes_t BaseAudioPort::_short_over_length = 2;
nframes_t BaseAudioPort::_long_over_length = 10;
BaseAudioPort::BaseAudioPort (const std::string& name, Flags flgs)
: Port (name, flgs)
, _buffer (0)
, _own_buffer (false)
{
_type = DataType::AUDIO;
_mixdown = default_mixdown;
}
BaseAudioPort::~BaseAudioPort ()
{
if (_own_buffer && _buffer) {
delete _buffer;
}
}
void
BaseAudioPort::reset()
{
Port::reset();
if (_own_buffer && _buffer) {
_buffer->resize (engine->frames_per_cycle());
_buffer->clear ();
}
_metering = 0;
reset_meters ();
}
void
BaseAudioPort::default_mixdown (const set<Port*>& ports, AudioBuffer* dest, nframes_t cnt, nframes_t offset, bool first_overwrite)
{
set<Port*>::const_iterator p = ports.begin();
if (first_overwrite) {
dest->read_from ((dynamic_cast<BaseAudioPort*>(*p))->get_audio_buffer(), cnt, offset);
p++;
}
for (; p != ports.end(); ++p) {
dest->accumulate_from ((dynamic_cast<BaseAudioPort*>(*p))->get_audio_buffer(), cnt, offset);
}
}
void
BaseAudioPort::set_mixdown_function (void (*func)(const set<Port*>&, AudioBuffer*, nframes_t, nframes_t, bool))
{
/* caller should (but not must) hold process lock since this is an atomic operation on most platforms
and even if its not, it doesn't really matter.
*/
_mixdown = func;
}

View file

@ -0,0 +1,69 @@
/*
Copyright (C) 2006 Paul Davis
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
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <cassert>
#include <iostream>
#include <ardour/base_midi_port.h>
#include <ardour/data_type.h>
using namespace ARDOUR;
using namespace std;
BaseMidiPort::BaseMidiPort (const std::string& name, Flags flags)
: Port (name, flags)
, _buffer (0)
, _own_buffer (false)
{
_type = DataType::MIDI;
reset();
}
BaseMidiPort::~BaseMidiPort()
{
if (_own_buffer && _buffer) {
delete _buffer;
}
}
void
BaseMidiPort::default_mixdown (const set<Port*>& ports, MidiBuffer* dest, nframes_t cnt, nframes_t offset, bool first_overwrite)
{
set<Port*>::const_iterator p = ports.begin();
if (first_overwrite) {
dest->read_from ((dynamic_cast<BaseMidiPort*>(*p))->get_midi_buffer(), cnt, offset);
p++;
}
// XXX DAVE: this is just a guess
for (; p != ports.end(); ++p) {
dest->merge (*dest, (dynamic_cast<BaseMidiPort*>(*p))->get_midi_buffer());
}
}
void
BaseMidiPort::set_mixdown_function (void (*func)(const set<Port*>&, MidiBuffer*, nframes_t, nframes_t, bool))
{
/* caller should (but not must) hold process lock since this is an atomic operation on most platforms
and even if its not, it doesn't really matter.
*/
_mixdown = func;
}